diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 501aa6784a..8fbc5602fe 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -5,6 +5,6 @@ - [ ] Changes has been tested on an Android device or Android emulator with API 21 - [ ] UI change has been tested on both light and dark themes - [ ] Pull request is based on the develop branch -- [ ] Pull request includes a new file under ./newsfragment. See https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#changelog +- [ ] Pull request includes a new file under ./changelog.d. See https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#changelog - [ ] Pull request includes screenshots or videos if containing UI changes - [ ] Pull request includes a [sign off](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.md#sign-off) diff --git a/.gitignore b/.gitignore index 4a264a28d8..04d1b6fe06 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,7 @@ .externalNativeBuild /tmp +/fastlane/private +/fastlane/report.xml ktlint diff --git a/CHANGES.md b/CHANGES.md index 4dd4fd0cfd..9947146a9e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,42 @@ +Changes in Element v1.1.11 (2021-06-22) +======================================= + +Bugfixes 🐛 +---------- + - Send button does not show up half of the time ([#3535](https://github.com/vector-im/element-android/issues/3535)) + - Fix crash on signout: release session at the end of clean up. ([#3538](https://github.com/vector-im/element-android/issues/3538)) + + +Changes in Element v1.1.10 (2021-06-18) +======================================= + +Features ✨ +---------- + - Migrate DefaultTypingService, KeysImporter and KeysExporter to coroutines ([#2449](https://github.com/vector-im/element-android/issues/2449)) + - Update Message Composer design ([#3182](https://github.com/vector-im/element-android/issues/3182)) + - Cleanup Epoxy items, and debounce all the clicks ([#3435](https://github.com/vector-im/element-android/issues/3435)) + - Adds support for receiving MSC3086 Asserted Identity events. ([#3451](https://github.com/vector-im/element-android/issues/3451)) + - Migrate to new colors and cleanup the style and theme. Now exported in module :library:ui-styles + Ref: https://material.io/blog/migrate-android-material-components ([#3459](https://github.com/vector-im/element-android/issues/3459)) + - Add option to set aliases for public spaces ([#3483](https://github.com/vector-im/element-android/issues/3483)) + - Add beta warning to private space creation flow ([#3485](https://github.com/vector-im/element-android/issues/3485)) + - User defined top level spaces ordering ([#3501](https://github.com/vector-im/element-android/issues/3501)) + +Bugfixes 🐛 +---------- + - Fix new DMs not always marked as such ([#3333](https://github.com/vector-im/element-android/issues/3333)) + +SDK API changes ⚠️ +------------------ + - Splits SessionAccountDataService and RoomAccountDataService and offers to query RoomAccountDataEvent at the session level. ([#3479](https://github.com/vector-im/element-android/issues/3479)) + +Other changes +------------- + - Move the ability to start a call from dialpad directly to a dedicated tab in the home screen. ([#3457](https://github.com/vector-im/element-android/issues/3457)) + - VoIP: Change hold direction to send-only. ([#3467](https://github.com/vector-im/element-android/issues/3467)) + - Some improvements on DialPad (cursor edition, paste number, small fixes). ([#3516](https://github.com/vector-im/element-android/issues/3516)) + + Changes in Element v1.1.9 (2021-06-02) ====================================== diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7e1758077b..5151a618f6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,7 +53,7 @@ This project is full Kotlin. Please do not write Java classes. ### Changelog -Please create at least one file under ./newsfragment containing details about your change. Towncrier will be used when preparing the release. +Please create at least one file under ./changelog.d containing details about your change. Towncrier will be used when preparing the release. Towncrier says to use the PR number for the filename, but the issue number is also fine. @@ -63,7 +63,7 @@ Supported filename extensions are: - ``.bugfix``: Signifying a bug fix. - ``.doc``: Signifying a documentation improvement. - ``.removal``: Signifying a deprecation or removal of public API. Can be used to notifying about API change in the Matrix SDK -- ``.misc``: A ticket has been closed, but it is not of interest to users. Note that in this case, the content of the file will not be output, but just the issue/PR number. +- ``.misc``: Any other changes. See https://github.com/twisted/towncrier#news-fragments if you need more details. diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..7a118b49be --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..6045f55496 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,205 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.3) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + artifactory (3.0.15) + atomos (0.1.3) + aws-eventstream (1.1.1) + aws-partitions (1.462.0) + aws-sdk-core (3.114.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.239.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-kms (1.43.0) + aws-sdk-core (~> 3, >= 3.112.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.95.1) + aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.2.3) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + claide (1.0.3) + colored (1.2) + colored2 (3.1.2) + commander (4.6.0) + highline (~> 2.0.0) + declarative (0.0.20) + digest-crc (0.6.3) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.7.6) + emoji_regex (3.2.2) + excon (0.81.0) + faraday (1.4.2) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) + multipart-post (>= 1.2, < 3) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) + http-cookie (~> 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.1.0) + faraday_middleware (1.0.0) + faraday (~> 1.0) + fastimage (2.2.3) + fastlane (2.184.0) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.3, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.3, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander (~> 4.6) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.1) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + json (< 3.0.0) + jwt (>= 2.1.0, < 3) + mini_magick (>= 4.9.4, < 5.0.0) + multipart-post (~> 2.0.0) + naturally (~> 2.2) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.4.0) + google-apis-core (~> 0.1) + google-apis-core (0.3.0) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.14) + httpclient (>= 2.8.1, < 3.0) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + rexml + signet (~> 0.14) + webrick + google-apis-iamcredentials_v1 (0.4.0) + google-apis-core (~> 0.1) + google-apis-playcustomapp_v1 (0.3.0) + google-apis-core (~> 0.1) + google-apis-storage_v1 (0.4.0) + google-apis-core (~> 0.1) + google-cloud-core (1.6.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.5.0) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.1.0) + google-cloud-storage (1.31.1) + addressable (~> 2.5) + digest-crc (~> 0.4) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.1) + google-cloud-core (~> 1.2) + googleauth (~> 0.9) + mini_mime (~> 1.0) + googleauth (0.16.2) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (~> 0.14) + highline (2.0.3) + http-cookie (1.0.3) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.4.0) + json (2.5.1) + jwt (2.2.3) + memoist (0.16.2) + mini_magick (4.11.0) + mini_mime (1.1.0) + multi_json (1.15.0) + multipart-post (2.0.0) + nanaimo (0.3.0) + naturally (2.2.1) + os (1.1.1) + plist (3.6.0) + public_suffix (4.0.6) + rake (13.0.3) + representable (3.1.1) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rexml (3.2.5) + rouge (2.0.7) + ruby2_keywords (0.0.4) + rubyzip (2.3.0) + security (0.1.3) + signet (0.15.0) + addressable (~> 2.3) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.8) + CFPropertyList + naturally + terminal-notifier (2.0.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + trailblazer-option (0.1.1) + tty-cursor (0.7.1) + tty-screen (0.8.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + unicode-display_width (1.7.0) + webrick (1.7.0) + word_wrap (1.0.0) + xcodeproj (1.19.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + x86_64-darwin-20 + +DEPENDENCIES + fastlane + +BUNDLED WITH + 2.2.15 diff --git a/attachment-viewer/build.gradle b/attachment-viewer/build.gradle index c9814171d9..4b95b20029 100644 --- a/attachment-viewer/build.gradle +++ b/attachment-viewer/build.gradle @@ -47,6 +47,8 @@ android { } dependencies { + implementation project(":library:ui-styles") + implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0' diff --git a/attachment-viewer/src/main/res/layout/item_image_attachment.xml b/attachment-viewer/src/main/res/layout/item_image_attachment.xml index 91a009df2a..0f9a90e91c 100644 --- a/attachment-viewer/src/main/res/layout/item_image_attachment.xml +++ b/attachment-viewer/src/main/res/layout/item_image_attachment.xml @@ -1,22 +1,18 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent" - xmlns:tools="http://schemas.android.com/tools"> + android:layout_height="match_parent"> <com.github.chrisbanes.photoview.PhotoView android:id="@+id/touchImageView" - android:visibility="visible" android:layout_width="match_parent" - android:layout_height="match_parent"/> + android:layout_height="match_parent" /> <ProgressBar - android:layout_centerInParent="true" android:id="@+id/imageLoaderProgress" style="?android:attr/progressBarStyle" android:layout_width="40dp" android:layout_height="40dp" - android:visibility="visible" - tools:visibility="gone" /> + android:layout_centerInParent="true" /> </RelativeLayout> \ No newline at end of file diff --git a/attachment-viewer/src/main/res/layout/item_video_attachment.xml b/attachment-viewer/src/main/res/layout/item_video_attachment.xml index 29f01650fd..7dd13ea460 100644 --- a/attachment-viewer/src/main/res/layout/item_video_attachment.xml +++ b/attachment-viewer/src/main/res/layout/item_video_attachment.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent" - xmlns:tools="http://schemas.android.com/tools"> + android:layout_height="match_parent"> <ImageView android:id="@+id/videoThumbnailImage" @@ -19,29 +19,29 @@ <ImageView android:id="@+id/videoControlIcon" - android:layout_centerInParent="true" - android:visibility="gone" - tools:visibility="visible" android:layout_width="44dp" android:layout_height="44dp" - /> + android:layout_centerInParent="true" + android:visibility="gone" + tools:visibility="visible" /> <ProgressBar - android:layout_centerInParent="true" android:id="@+id/videoLoaderProgress" style="?android:attr/progressBarStyle" android:layout_width="40dp" android:layout_height="40dp" + android:layout_centerInParent="true" android:visibility="invisible" tools:visibility="visible" /> <TextView android:id="@+id/videoMediaViewerErrorView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_margin="16dp" - android:textSize="16sp" + android:textColor="?colorError" android:visibility="gone" tools:text="Error" tools:visibility="visible" /> diff --git a/attachment-viewer/src/main/res/values/colors.xml b/attachment-viewer/src/main/res/values/colors.xml deleted file mode 100644 index 7ceef40881..0000000000 --- a/attachment-viewer/src/main/res/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<resources> - - <color name="half_transparent_status_bar">#80000000</color> - -</resources> \ No newline at end of file diff --git a/build.gradle b/build.gradle index df412d3fe8..c07c0201e8 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { // Ref: https://kotlinlang.org/releases.html - ext.kotlin_version = '1.5.10' + ext.kotlin_version = '1.5.20' ext.kotlin_coroutines_version = "1.5.0" repositories { google() @@ -15,7 +15,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.2.1' classpath 'com.google.gms:google-services:4.3.8' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.2.0' + classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3' classpath 'com.google.android.gms:oss-licenses-plugin:0.10.4' classpath "com.likethesalad.android:string-reference:1.2.2" diff --git a/changelog.d/.gitignore b/changelog.d/.gitignore new file mode 100644 index 0000000000..b722e9e13e --- /dev/null +++ b/changelog.d/.gitignore @@ -0,0 +1 @@ +!.gitignore \ No newline at end of file diff --git a/changelog.d/3545.feature b/changelog.d/3545.feature new file mode 100644 index 0000000000..f582affbf2 --- /dev/null +++ b/changelog.d/3545.feature @@ -0,0 +1 @@ +Reveal password: use facility from com.google.android.material.textfield.TextInputLayout instead of manual handling. \ No newline at end of file diff --git a/changelog.d/3547.feature b/changelog.d/3547.feature new file mode 100644 index 0000000000..8921932067 --- /dev/null +++ b/changelog.d/3547.feature @@ -0,0 +1 @@ +Implements new design for Jump to unread and quick fix visibility issues. \ No newline at end of file diff --git a/changelog.d/3564.bugfix b/changelog.d/3564.bugfix new file mode 100644 index 0000000000..74f71ccded --- /dev/null +++ b/changelog.d/3564.bugfix @@ -0,0 +1 @@ +Fix call invite processed after call is ended because of fastlane mode. \ No newline at end of file diff --git a/changelog.d/3577.bugfix b/changelog.d/3577.bugfix new file mode 100644 index 0000000000..6b3917292f --- /dev/null +++ b/changelog.d/3577.bugfix @@ -0,0 +1 @@ +Fix crash after video call. \ No newline at end of file diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 0000000000..25273b0b09 --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,2 @@ +json_key_file("./fastlane/private/api-8525453667099313774-565354-aca0e6153603.json") +package_name("im.vector.app") diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 0000000000..85e3d777ac --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,60 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:android) + +platform :android do + desc "Runs all the tests" + lane :test do + gradle(task: "test") + end + + desc "Submit a new Beta Build to Crashlytics Beta" + lane :beta do + gradle(task: "clean assembleRelease") + crashlytics + + # sh "your_script.sh" + # You can also use other beta testing services here + end + + desc "Deploy a new version to the Google Play" + lane :deploy do + gradle(task: "clean assembleRelease") + upload_to_play_store + end + + desc "Deploy Google Play metadata" + lane :deployMeta do + # Doc: https://docs.fastlane.tools/actions/upload_to_play_store/ + upload_to_play_store( + skip_upload_apk: true, + skip_upload_aab: true, + skip_upload_images: true, + skip_upload_screenshots: true, + skip_upload_changelogs: true, + # Set to true to not update the PlayStore + validate_only: false + ) + end + + desc "Get version code" + lane :getVersionCode do + versions = google_play_track_version_codes(track: "production") + puts(versions) + version_code = versions[0] + puts(version_code) + end +end diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 0000000000..54d3a005a6 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,49 @@ +fastlane documentation +================ +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +``` +xcode-select --install +``` + +Install _fastlane_ using +``` +[sudo] gem install fastlane -NV +``` +or alternatively using `brew install fastlane` + +# Available Actions +## Android +### android test +``` +fastlane android test +``` +Runs all the tests +### android beta +``` +fastlane android beta +``` +Submit a new Beta Build to Crashlytics Beta +### android deploy +``` +fastlane android deploy +``` +Deploy a new version to the Google Play +### android deployMeta +``` +fastlane android deployMeta +``` +Deploy Google Play metadata +### android getVersionCode +``` +fastlane android getVersionCode +``` +Get version code + +---- + +This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. +More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). +The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/fastlane/metadata/android/cs/changelogs/40100100.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40100100.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40100100.txt diff --git a/fastlane/metadata/android/cs/changelogs/40100110.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40100110.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40100110.txt diff --git a/fastlane/metadata/android/cs/changelogs/40100120.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40100120.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40100120.txt diff --git a/fastlane/metadata/android/cs/changelogs/40100130.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40100130.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40100130.txt diff --git a/fastlane/metadata/android/cs/changelogs/40100140.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40100140.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40100140.txt diff --git a/fastlane/metadata/android/cs/changelogs/40100150.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40100150.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40100150.txt diff --git a/fastlane/metadata/android/cs/changelogs/40100160.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40100160.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40100160.txt diff --git a/fastlane/metadata/android/cs/changelogs/40100170.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40100170.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40100170.txt diff --git a/fastlane/metadata/android/cs/changelogs/40101000.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40101000.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40101000.txt diff --git a/fastlane/metadata/android/cs/changelogs/40101010.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40101010.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40101010.txt diff --git a/fastlane/metadata/android/cs/changelogs/40101020.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40101020.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40101020.txt diff --git a/fastlane/metadata/android/cs/changelogs/40101030.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40101030.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40101030.txt diff --git a/fastlane/metadata/android/cs/changelogs/40101040.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101040.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40101040.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40101040.txt diff --git a/fastlane/metadata/android/cs/changelogs/40101050.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101050.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40101050.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40101050.txt diff --git a/fastlane/metadata/android/cs/changelogs/40101060.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101060.txt similarity index 100% rename from fastlane/metadata/android/cs/changelogs/40101060.txt rename to fastlane/metadata/android/cs-CZ/changelogs/40101060.txt diff --git a/fastlane/metadata/android/cs-CZ/full_description.txt b/fastlane/metadata/android/cs-CZ/full_description.txt new file mode 100644 index 0000000000..d169c077e1 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/full_description.txt @@ -0,0 +1,39 @@ +Element je zabezpečený komunikátor a zároveň aplikace pro týmovou spolupráci, která je ideální pro skupinové chaty při práci na dálku. Tato chatovací aplikace využívá end-to-end šifrování a poskytuje výkonné videokonference, sdílení souborů a hlasové hovory. + +<b>Mezi funkce aplikace Element patří:</b> +- Pokročilé nástroje pro online komunikaci +- Plně šifrované zprávy umožňující bezpečnější firemní komunikaci i pro pracovníky na dálku +- Decentralizovaný chat založený na open source frameworku Matrix +- Bezpečné sdílení souborů se šifrovanými daty při správě projektů +- Videochaty s funkcí Voice over IP a sdílením obrazovky +- Snadná integrace s oblíbenými nástroji pro online spolupráci, nástroji pro správu projektů, službami VoIP a dalšími aplikacemi pro týmovou komunikaci + +Element se zcela liší od ostatních aplikací pro zasílání zpráv a spolupráci. Funguje na platformě Matrix, otevřené síti pro bezpečné zasílání zpráv a decentralizovanou komunikaci. Umožňuje vlastní hostování, aby uživatelé měli maximální vlastnictví a kontrolu nad svými daty a zprávami. + +<b>Soukromí a šifrované zprávy</b> +Element vás chrání před nežádoucími reklamami, vytěžováním dat a tzv. walled gardens. Zabezpečuje také všechna vaše data, video a hlasovou komunikaci jeden na jednoho prostřednictvím šifrování end-to-end a křížového ověřování zařízení. + +Element vám dává kontrolu nad vaším soukromím a zároveň vám umožňuje bezpečně komunikovat s kýmkoli v síti Matrix nebo s dalšími nástroji pro firemní spolupráci díky integraci s aplikacemi, jako je Slack. + +<b>Element lze hostovat samostatně</b> +Abyste měli větší kontrolu nad svými citlivými daty a konverzacemi, může být Element hostován na vlastním hardwaru nebo si můžete vybrat libovolného hostitele založeného na systému Matrix - standardu pro decentralizovanou komunikaci s otevřeným zdrojovým kódem. Element vám poskytuje soukromí, soulad se zásadami bezpečnosti a flexibilitu integrace. + +<b>Vlastněte svá data</b> +Sami rozhodujete, kde budou vaše data a zprávy uloženy. Bez rizika vytěžování dat nebo přístupu třetích stran. + +Element vám dává kontrolu různými způsoby: +1. Získejte bezplatný účet na veřejném serveru matrix.org, který hostují vývojáři Matrixu, nebo si vyberte z tisíců veřejných serverů hostovaných dobrovolníky. +2. Vlastní hostování účtu spuštěním serveru na vlastní IT infrastruktuře. +3. Zaregistrujte si účet na vlastním serveru tak, že si jednoduše předplatíte hostingovou platformu Element Matrix Services. + +<b>Otevřené zasílání zpráv a spolupráce</b> +Můžete chatovat s kýmkoli v síti Matrix, ať už používá aplikaci Element, jinou aplikaci podporující protokol Matrix nebo dokonce i když používá jinou aplikaci pro zasílání zpráv. + +<b>Superbezpečné</b> +Skutečné end-to-end šifrování (zprávy mohou dešifrovat pouze účastníci konverzace) a křížové ověřování zařízení. + +<b>Kompletní komunikace a integrace</b> +Zprávy, hlasové a videohovory, sdílení souborů, sdílení obrazovky a celá řada integrací, botů a widgetů. Vytvářejte místnosti, komunity, zůstaňte v kontaktu a spolupracujte. + +<b>Navažte tam, kde jste skončili</b> +Zůstaňte v kontaktu, ať jste kdekoli, díky plně synchronizované historii zpráv ve všech zařízeních a na webu https://app.element.io diff --git a/fastlane/metadata/android/cs/short_description.txt b/fastlane/metadata/android/cs-CZ/short_description.txt similarity index 100% rename from fastlane/metadata/android/cs/short_description.txt rename to fastlane/metadata/android/cs-CZ/short_description.txt diff --git a/fastlane/metadata/android/cs/title.txt b/fastlane/metadata/android/cs-CZ/title.txt similarity index 100% rename from fastlane/metadata/android/cs/title.txt rename to fastlane/metadata/android/cs-CZ/title.txt diff --git a/fastlane/metadata/android/cs/full_description.txt b/fastlane/metadata/android/cs/full_description.txt deleted file mode 100644 index f9c1f2ad0c..0000000000 --- a/fastlane/metadata/android/cs/full_description.txt +++ /dev/null @@ -1,30 +0,0 @@ -Element je nový typ aplikace pro výměnu zpráv a spolupráci, která: - -1. Vám dá kontrolu nad ochranou vašeho soukromí -2. Umožní vám komunikovat s kýmkoli v síti Matrix a dokonce i mimo ni pomocí integrací s aplikacemi, jako je Slack -3. Ochrání vás před inzercí, dataminingem a uzavřenými zahradami -4. Zabezpečí vás end-to-end šifrováním s křížovým podpisem pro ověření ostatních - -Element je zcela odlišný od ostatních aplikací pro zasílání zpráv a spolupráci, protože je decentralizovaný a otevřený. - -Element vám umožňuje použít vlastní domovský server - nebo si vybrat hostitele - abyste měli soukromí, vlastnictví a kontrolu nad svými daty a konverzacemi. Poskytuje vám přístup k otevřené síti; takže nejste zaseknuti jen při konverzaci s ostatními uživateli Elementu. A je velmi bezpečný. - -Element je toho všeho schopen, protože pracuje na Matrixu - standardu otevřené, decentralizované komunikace. - -Element vám dává kontrolu nad tím, že si můžete vybrat, kdo bude hostovat vaše konverzace. Z aplikace Element si můžete vybrat hostování různými způsoby: - -1. Získejte zdarma účet na veřejném serveru matrix.org hostovaném vývojáři Matrixu, nebo si vyberte z tisíců veřejných serverů hostovaných dobrovolníky -2. Hostujte svůj účet spuštěním serveru na svém vlastním hardwaru -3. Zaregistrujte si účet na vlastním serveru jednoduchým přihlášením k hostitelské platformě Element Matrix Services - -<b>Proč zvolit Element?</b> - -<b>VLASTNĚTE SVÁ DATA</b>: Vy rozhodnete, kde svá data a zprávy ponecháte. Vlastníte je a jsou pod vaší kontrolou, ne nějaký MEGACORP, který těží vaše data nebo poskytuje přístup třetím stranám. - -<b>ZPRÁVY A SPOLUPRÁCE</b>: Můžete chatovat s kýmkoli v síti Matrix, ať už používá Element nebo jinou aplikaci, a to i v případě, že používají jiný systém zasílání zpráv, jako je Slack, IRC nebo XMPP. - -<b>MAXIMÁLNĚ BEZPEČNÉ</b>: Skutečné šifrování typu end-to-end (pouze ti v konverzaci mohou dešifrovat zprávy) a křížové podepisování k ověření zařízení účastníků konverzace. - -<b>KOMPLETNÍ KOMUNIKACE</b>: Zprávy, hlasové hovory a videohovory, sdílení souborů, sdílení obrazovky a celá řada integrací, robotů a widgetů. Budujte místnosti, komunity, zůstaňte v kontaktu a spolupracujte. - -<b>KDEKOLIV JSTE</b>: Zůstaňte v kontaktu, ať jste kdekoli, s plně synchronizovanou historií zpráv na všech vašich zařízeních a na webu na adrese https://app.element.io. diff --git a/fastlane/metadata/android/de/changelogs/40100100.txt b/fastlane/metadata/android/de-DE/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40100100.txt rename to fastlane/metadata/android/de-DE/changelogs/40100100.txt diff --git a/fastlane/metadata/android/de/changelogs/40100110.txt b/fastlane/metadata/android/de-DE/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40100110.txt rename to fastlane/metadata/android/de-DE/changelogs/40100110.txt diff --git a/fastlane/metadata/android/de/changelogs/40100120.txt b/fastlane/metadata/android/de-DE/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40100120.txt rename to fastlane/metadata/android/de-DE/changelogs/40100120.txt diff --git a/fastlane/metadata/android/de/changelogs/40100130.txt b/fastlane/metadata/android/de-DE/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40100130.txt rename to fastlane/metadata/android/de-DE/changelogs/40100130.txt diff --git a/fastlane/metadata/android/de/changelogs/40100140.txt b/fastlane/metadata/android/de-DE/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40100140.txt rename to fastlane/metadata/android/de-DE/changelogs/40100140.txt diff --git a/fastlane/metadata/android/de/changelogs/40100150.txt b/fastlane/metadata/android/de-DE/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40100150.txt rename to fastlane/metadata/android/de-DE/changelogs/40100150.txt diff --git a/fastlane/metadata/android/de/changelogs/40100160.txt b/fastlane/metadata/android/de-DE/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40100160.txt rename to fastlane/metadata/android/de-DE/changelogs/40100160.txt diff --git a/fastlane/metadata/android/de/changelogs/40100170.txt b/fastlane/metadata/android/de-DE/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40100170.txt rename to fastlane/metadata/android/de-DE/changelogs/40100170.txt diff --git a/fastlane/metadata/android/de/changelogs/40101000.txt b/fastlane/metadata/android/de-DE/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40101000.txt rename to fastlane/metadata/android/de-DE/changelogs/40101000.txt diff --git a/fastlane/metadata/android/de/changelogs/40101010.txt b/fastlane/metadata/android/de-DE/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40101010.txt rename to fastlane/metadata/android/de-DE/changelogs/40101010.txt diff --git a/fastlane/metadata/android/de/changelogs/40101020.txt b/fastlane/metadata/android/de-DE/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40101020.txt rename to fastlane/metadata/android/de-DE/changelogs/40101020.txt diff --git a/fastlane/metadata/android/de/changelogs/40101030.txt b/fastlane/metadata/android/de-DE/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40101030.txt rename to fastlane/metadata/android/de-DE/changelogs/40101030.txt diff --git a/fastlane/metadata/android/de/changelogs/40101040.txt b/fastlane/metadata/android/de-DE/changelogs/40101040.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40101040.txt rename to fastlane/metadata/android/de-DE/changelogs/40101040.txt diff --git a/fastlane/metadata/android/de/changelogs/40101050.txt b/fastlane/metadata/android/de-DE/changelogs/40101050.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40101050.txt rename to fastlane/metadata/android/de-DE/changelogs/40101050.txt diff --git a/fastlane/metadata/android/de/changelogs/40101060.txt b/fastlane/metadata/android/de-DE/changelogs/40101060.txt similarity index 100% rename from fastlane/metadata/android/de/changelogs/40101060.txt rename to fastlane/metadata/android/de-DE/changelogs/40101060.txt diff --git a/fastlane/metadata/android/de-DE/changelogs/40101070.txt b/fastlane/metadata/android/de-DE/changelogs/40101070.txt new file mode 100644 index 0000000000..757475a44d --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Hauptänderungen in dieser Version: Mit Spaces kannst du deine Räume gruppieren (Beta). Videos können vor dem Senden komprimiert werden. +Die vollständige Änderungsliste gibt es hier: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/de-DE/changelogs/40101080.txt b/fastlane/metadata/android/de-DE/changelogs/40101080.txt new file mode 100644 index 0000000000..3609fb7078 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/40101080.txt @@ -0,0 +1,2 @@ +Hauptänderung: Verbesserung für Spaces. +Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/de-DE/changelogs/40101090.txt b/fastlane/metadata/android/de-DE/changelogs/40101090.txt new file mode 100644 index 0000000000..1a957862ab --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/40101090.txt @@ -0,0 +1,2 @@ +Hauptänderung in dieser Version: Füge Unterstützung für gitter.im-Netzwerk hinzu +Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt similarity index 52% rename from fastlane/metadata/android/de/full_description.txt rename to fastlane/metadata/android/de-DE/full_description.txt index 1334adf554..30eb153ee9 100644 --- a/fastlane/metadata/android/de/full_description.txt +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -1,9 +1,9 @@ -Element ist einerseits ein sicherer Messenger, andererseits ideal geeignet für die produktive Zusammenarbeit mit dem Team im Homeoffice. Mit eingebauter Ende-zu-Ende-Verschlüsselung ermöglicht Element umfangreiche und sichere Videokonferenzen, das Teilen von Dateien sowie Sprachanrufe. +Element ist ein sicherer Messenger und ideal für die produktive Zusammenarbeit mit Ihrem Team im Homeoffice. Mit eingebauter Ende-zu-Ende-Verschlüsselung ermöglicht Element auch umfangreiche und sichere Videokonferenzen, das Teilen von Dateien, Sprachanrufe und vieles mehr. <b>Element bietet folgende Funktionen:</b> - Fortschrittliche Werkzeuge für die Online-Kommunikation - Vollständig verschlüsselte Nachrichten, um eine sichere Kommunikation innerhalb und außerhalb von Unternehmen zu ermöglichen -- Dezentralisierte Chats, basierend auf dem quelloffenen Matrix-Framework +- Dezentralisierte Chats, basierend auf dem quelloffenen Matrix-Protokoll - Sichere und kontrollierte Dateifreigabe durch verschlüsselte Daten beim Verwalten von Projekten - Videochats mit VoIP und Bildschirmübertragung - Einfache Einbindung in Ihre bevorzugten Online-Kollaborations- und Projektverwaltungswerkzeuge, VoIP-Dienste und andere Kommunikationsapps für Ihr Team @@ -11,29 +11,29 @@ Element ist einerseits ein sicherer Messenger, andererseits ideal geeignet für Element unterscheidet sich grundlegend von anderen Kommunikations- und Kollaborationsapps. Es läuft auf Matrix, einem offenen Netzwerk für sichere und dezentralisierte Kommunikation. Es erlaubt Nutzern ihre eigene Infrastruktur zu betreiben und gibt ihnen damit vollständige Kontrolle und Besitz über ihre eigenen Daten und Nachrichten. <b>Privatsphäre/Datenschutz und verschlüsselte Kommunikation</b> -Element schützt Sie vor unerwünschter Werbung, dem Datenschürfen und abgeschlossenen Plattformen. Auch schützt es all Ihre Daten, Ihre Video- und Sprachkommunikation unter vier Augen, durch Ende-zu-Ende-Verschlüsselung und durch das Quersignieren von Geräten zur Verifizierung. +Element schützt Sie vor unerwünschter Werbung, dem Datensammeln und geschlossenen Plattformen. Auch schützt es all Ihre Daten, Ihre Video- und Sprachkommunikation mittels Ende-zu-Ende-Verschlüsselung und durch das Quersignieren von Geräten zur Verifizierung. -Element gibt Ihnen die Kontrolle über Ihre Privatsphäre und ermöglicht es Ihnen zugleich, mit jedem im Matrix-Netzwerk sicher zu kommunizieren - oder auch auf anderen geschäftlichen Kollaborationswerkzeugen, zum Beispiel durch das Einbinden von Apps wie Slack. +Element gibt Ihnen volle Kontrolle über Ihre Privatsphäre und ermöglicht es Ihnen zugleich, mit jedem im Matrix-Netzwerk sicher zu kommunizieren - oder auch auf anderen geschäftlichen Kollaborationswerkzeugen, zum Beispiel durch das Einbinden von Apps wie Slack. <b>Element kann man selber betreiben</b> Um mehr Kontrolle über Ihre sensiblen Daten und Konversationen zu ermöglichen, kann man Element selbst betreiben, oder Sie wählen irgendeinen Matrix-basierten Dienst - der Standard für quelloffene, dezentralisierte Kommunikation. Element gibt Ihnen Privatsphäre, Sicherheitskonformität und Flexibilität für Integrationen. <b>Besitzen Sie Ihre Daten</b> -Sie entscheiden, wo Sie Ihre Daten und Nachrichten aufbewahren - ohne das Datenschürfen oder den Zugriff Dritter zu riskieren. +Sie entscheiden, wo Sie Ihre Daten und Nachrichten aufbewahren - ohne das Datensammeln oder den Zugriff Dritter zu riskieren. -Element gibt Ihnen auf verschiedene Arten die Kontrolle: -1. Kostenlos auf dem öffentlichen matrix.org-Server registrieren, der von den Matrix-Entwicklern gehostet wird, oder wählen Sie aus Tausenden von öffentlichen Servern, die von Freiwilligen betrieben werden -2. Ein Konto auf einem eigenen Server in der eigenen IT-Infrastruktur betreiben -3. Einen Konto auf einem maßgeschneiderten Server erstellen, zum Beispiel durch ein Abonnement der Element Matrix Services (kurz EMS) +Element gibt Ihnen auf verschiedene Arten Kontrolle: +1. Sie können sich kostenlos auf dem öffentlichen matrix.org-Server registrieren, der von den Matrix-Entwicklern gehostet wird, oder einen von Tausenden öffentlichen Servern, die von Freiwilligen betrieben werden, auswählen +2. Sie haben die Möglichkeit, ein Konto auf einem eigenen Server in der eigenen IT-Infrastruktur betreiben +3. Außerdem können Sie durch ein Abonnement der Element Matrix Services ein Konto auf einem für Sie maßgeschneiderten Server erstellen <b>Offene Kommunikation und Zusammenarbeit</b> Sie können mit jedem im Matrix-Netzwerk chatten, egal ob ihr Kontakt Element, eine andere Matrix-App oder sogar eine völlig andere Anwendung nutzt. <b>Super sicher</b> -Echte Ende-zu-Ende-Verschlüsselung (nur die Personen in der Unterhaltung können die Nachrichten entschüsseln), sowie die Quersignierung von Geräten zur Verifizierung. +Durch Ende-zu-Ende-Verschlüsselung können nur die Personen, die in der Unterhaltung sind, die Nachrichten lesen. Außerdem stellt die Verifizierung mittels Quersignierung sicher, dass Sie wirklich mit dem Chatten, mit dem Sie glauben - und niemand Anderem. <b>Vollständige Kommunikation und Integration</b> -Kurznachrichten, Sprach- und Videoanrufe, Dateifreigaben, Bildschirmübertragungen und eine ganze Reihe an Integrationen, Bots and Widgets. Schaffen Sie Räume, Communities, bleiben Sie auf dem Laufenden und erledigen Sie Sachen. +Kurznachrichten, Sprach- und Videoanrufe, Dateifreigaben, Bildschirmübertragungen und einer Menge an Integrationen, Bots und Widgets. Schaffen Sie Räume und Communities, bleiben Sie auf dem Laufenden und erledigen Sie Sachen. <b>Da Weitermachen, wo Sie aufgehört haben</b> Bleiben Sie in Kontakt, egal wo Sie sind, mit vollständig synchronisiertem Nachrichtenverlauf quer über all Ihre Geräte und im Netz auf https://app.element.io diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de-DE/short_description.txt similarity index 100% rename from fastlane/metadata/android/de/short_description.txt rename to fastlane/metadata/android/de-DE/short_description.txt diff --git a/fastlane/metadata/android/de/title.txt b/fastlane/metadata/android/de-DE/title.txt similarity index 100% rename from fastlane/metadata/android/de/title.txt rename to fastlane/metadata/android/de-DE/title.txt diff --git a/fastlane/metadata/android/en-US/changelogs/40101100.txt b/fastlane/metadata/android/en-US/changelogs/40101100.txt new file mode 100644 index 0000000000..30543cb102 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40101100.txt @@ -0,0 +1,2 @@ +Main changes in this version: theme and style update and new features for spaces. +Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.10 \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40101110.txt b/fastlane/metadata/android/en-US/changelogs/40101110.txt new file mode 100644 index 0000000000..cb3e85d6c0 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40101110.txt @@ -0,0 +1,2 @@ +Main changes in this version: theme and style update and new features for spaces (bugfix for 1.1.10) +Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.11 \ No newline at end of file diff --git a/fastlane/metadata/android/es/changelogs/40100100.txt b/fastlane/metadata/android/es-ES/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/es/changelogs/40100100.txt rename to fastlane/metadata/android/es-ES/changelogs/40100100.txt diff --git a/fastlane/metadata/android/es/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt similarity index 100% rename from fastlane/metadata/android/es/full_description.txt rename to fastlane/metadata/android/es-ES/full_description.txt diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es-ES/short_description.txt similarity index 100% rename from fastlane/metadata/android/es/short_description.txt rename to fastlane/metadata/android/es-ES/short_description.txt diff --git a/fastlane/metadata/android/es/title.txt b/fastlane/metadata/android/es-ES/title.txt similarity index 100% rename from fastlane/metadata/android/es/title.txt rename to fastlane/metadata/android/es-ES/title.txt diff --git a/fastlane/metadata/android/et/changelogs/40101070.txt b/fastlane/metadata/android/et/changelogs/40101070.txt new file mode 100644 index 0000000000..8ef65a7396 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Põhilised muudatused selles versioonis: beeta-versioon kogukonnakeskustest ja videofailide pakkimine enne üleslaadimist. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/et/changelogs/40101080.txt b/fastlane/metadata/android/et/changelogs/40101080.txt new file mode 100644 index 0000000000..6fa09b30a7 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40101080.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: kogukonnakeskuste täiendused +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/et/changelogs/40101090.txt b/fastlane/metadata/android/et/changelogs/40101090.txt new file mode 100644 index 0000000000..f354f7f320 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40101090.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: liidestus gitter.im võrguga. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/fa/full_description.txt b/fastlane/metadata/android/fa/full_description.txt index 0a93676bbf..3051f491ba 100644 --- a/fastlane/metadata/android/fa/full_description.txt +++ b/fastlane/metadata/android/fa/full_description.txt @@ -23,7 +23,7 @@ <b>پیامرسانی و همکاری باز</b>: میتوانید با هرکسی در شبکهٔ ماتریکس گپ بزنید، چه از المنت استفاده کنند و چه از هر کارهٔ ماتریکس دیگری؛ و حتا اگر از سامانهٔ پیامرسانی متفاوتی مثل اسلک، آیآرسی یا جبر استفاده کنند. -<b>فوق امن</b>: رمزنگاری سرتاسری واقعی (فقط کسانی که در گفتوگو هستند،میتوانند پیامها را رمزگشایی کنند) و ورود چندگانه برای تأیید هویت افزارههای شرکتکنندگان در گفتوگو. +b>فوق امن</b>: رمزنگاری سرتاسری واقعی (فقط کسانی که در گفتوگو هستند،میتوانند پیامها را رمزگشایی کنند) و ورود چندگانه برای تأیید هویت افزارههای شرکتکنندگان در گفتوگو. <b>ارتباط کامل</b>: پیامرسانی، تماسهای صوتی و تصویری،همرسانی پرونده، همرسانی صفحه و یه عالمه یکپارچگی، بات و ابزارک. اتاق و اجتماع ساخته، در دسترس بوده و کارها را انجام دهید. diff --git a/fastlane/metadata/android/fa/title.txt b/fastlane/metadata/android/fa/title.txt index fb4ea4125e..96f2f9a9df 100644 --- a/fastlane/metadata/android/fa/title.txt +++ b/fastlane/metadata/android/fa/title.txt @@ -1 +1 @@ -المنت (ریوت سابق) +المنت - پیامرسان امن diff --git a/fastlane/metadata/android/fi/changelogs/40100100.txt b/fastlane/metadata/android/fi-FI/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40100100.txt rename to fastlane/metadata/android/fi-FI/changelogs/40100100.txt diff --git a/fastlane/metadata/android/fi/changelogs/40100110.txt b/fastlane/metadata/android/fi-FI/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40100110.txt rename to fastlane/metadata/android/fi-FI/changelogs/40100110.txt diff --git a/fastlane/metadata/android/fi/changelogs/40100120.txt b/fastlane/metadata/android/fi-FI/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40100120.txt rename to fastlane/metadata/android/fi-FI/changelogs/40100120.txt diff --git a/fastlane/metadata/android/fi/changelogs/40100130.txt b/fastlane/metadata/android/fi-FI/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40100130.txt rename to fastlane/metadata/android/fi-FI/changelogs/40100130.txt diff --git a/fastlane/metadata/android/fi/changelogs/40100140.txt b/fastlane/metadata/android/fi-FI/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40100140.txt rename to fastlane/metadata/android/fi-FI/changelogs/40100140.txt diff --git a/fastlane/metadata/android/fi/changelogs/40100150.txt b/fastlane/metadata/android/fi-FI/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40100150.txt rename to fastlane/metadata/android/fi-FI/changelogs/40100150.txt diff --git a/fastlane/metadata/android/fi/changelogs/40100160.txt b/fastlane/metadata/android/fi-FI/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40100160.txt rename to fastlane/metadata/android/fi-FI/changelogs/40100160.txt diff --git a/fastlane/metadata/android/fi/changelogs/40100170.txt b/fastlane/metadata/android/fi-FI/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40100170.txt rename to fastlane/metadata/android/fi-FI/changelogs/40100170.txt diff --git a/fastlane/metadata/android/fi/changelogs/40101000.txt b/fastlane/metadata/android/fi-FI/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40101000.txt rename to fastlane/metadata/android/fi-FI/changelogs/40101000.txt diff --git a/fastlane/metadata/android/fi/changelogs/40101010.txt b/fastlane/metadata/android/fi-FI/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/fi/changelogs/40101010.txt rename to fastlane/metadata/android/fi-FI/changelogs/40101010.txt diff --git a/fastlane/metadata/android/fi/full_description.txt b/fastlane/metadata/android/fi-FI/full_description.txt similarity index 100% rename from fastlane/metadata/android/fi/full_description.txt rename to fastlane/metadata/android/fi-FI/full_description.txt diff --git a/fastlane/metadata/android/fi/short_description.txt b/fastlane/metadata/android/fi-FI/short_description.txt similarity index 100% rename from fastlane/metadata/android/fi/short_description.txt rename to fastlane/metadata/android/fi-FI/short_description.txt diff --git a/fastlane/metadata/android/fi/title.txt b/fastlane/metadata/android/fi-FI/title.txt similarity index 100% rename from fastlane/metadata/android/fi/title.txt rename to fastlane/metadata/android/fi-FI/title.txt diff --git a/fastlane/metadata/android/fr/changelogs/40100100.txt b/fastlane/metadata/android/fr-FR/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40100100.txt rename to fastlane/metadata/android/fr-FR/changelogs/40100100.txt diff --git a/fastlane/metadata/android/fr/changelogs/40100110.txt b/fastlane/metadata/android/fr-FR/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40100110.txt rename to fastlane/metadata/android/fr-FR/changelogs/40100110.txt diff --git a/fastlane/metadata/android/fr/changelogs/40100120.txt b/fastlane/metadata/android/fr-FR/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40100120.txt rename to fastlane/metadata/android/fr-FR/changelogs/40100120.txt diff --git a/fastlane/metadata/android/fr/changelogs/40100130.txt b/fastlane/metadata/android/fr-FR/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40100130.txt rename to fastlane/metadata/android/fr-FR/changelogs/40100130.txt diff --git a/fastlane/metadata/android/fr/changelogs/40100140.txt b/fastlane/metadata/android/fr-FR/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40100140.txt rename to fastlane/metadata/android/fr-FR/changelogs/40100140.txt diff --git a/fastlane/metadata/android/fr/changelogs/40100150.txt b/fastlane/metadata/android/fr-FR/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40100150.txt rename to fastlane/metadata/android/fr-FR/changelogs/40100150.txt diff --git a/fastlane/metadata/android/fr/changelogs/40100160.txt b/fastlane/metadata/android/fr-FR/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40100160.txt rename to fastlane/metadata/android/fr-FR/changelogs/40100160.txt diff --git a/fastlane/metadata/android/fr/changelogs/40100170.txt b/fastlane/metadata/android/fr-FR/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40100170.txt rename to fastlane/metadata/android/fr-FR/changelogs/40100170.txt diff --git a/fastlane/metadata/android/fr/changelogs/40101000.txt b/fastlane/metadata/android/fr-FR/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40101000.txt rename to fastlane/metadata/android/fr-FR/changelogs/40101000.txt diff --git a/fastlane/metadata/android/fr/changelogs/40101010.txt b/fastlane/metadata/android/fr-FR/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40101010.txt rename to fastlane/metadata/android/fr-FR/changelogs/40101010.txt diff --git a/fastlane/metadata/android/fr/changelogs/40101020.txt b/fastlane/metadata/android/fr-FR/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40101020.txt rename to fastlane/metadata/android/fr-FR/changelogs/40101020.txt diff --git a/fastlane/metadata/android/fr/changelogs/40101030.txt b/fastlane/metadata/android/fr-FR/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40101030.txt rename to fastlane/metadata/android/fr-FR/changelogs/40101030.txt diff --git a/fastlane/metadata/android/fr/changelogs/40101040.txt b/fastlane/metadata/android/fr-FR/changelogs/40101040.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40101040.txt rename to fastlane/metadata/android/fr-FR/changelogs/40101040.txt diff --git a/fastlane/metadata/android/fr/changelogs/40101050.txt b/fastlane/metadata/android/fr-FR/changelogs/40101050.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40101050.txt rename to fastlane/metadata/android/fr-FR/changelogs/40101050.txt diff --git a/fastlane/metadata/android/fr/changelogs/40101060.txt b/fastlane/metadata/android/fr-FR/changelogs/40101060.txt similarity index 100% rename from fastlane/metadata/android/fr/changelogs/40101060.txt rename to fastlane/metadata/android/fr-FR/changelogs/40101060.txt diff --git a/fastlane/metadata/android/fr/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt similarity index 100% rename from fastlane/metadata/android/fr/full_description.txt rename to fastlane/metadata/android/fr-FR/full_description.txt diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt similarity index 100% rename from fastlane/metadata/android/fr/short_description.txt rename to fastlane/metadata/android/fr-FR/short_description.txt diff --git a/fastlane/metadata/android/fr/title.txt b/fastlane/metadata/android/fr-FR/title.txt similarity index 100% rename from fastlane/metadata/android/fr/title.txt rename to fastlane/metadata/android/fr-FR/title.txt diff --git a/fastlane/metadata/android/hu/changelogs/40100100.txt b/fastlane/metadata/android/hu-HU/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/hu/changelogs/40100100.txt rename to fastlane/metadata/android/hu-HU/changelogs/40100100.txt diff --git a/fastlane/metadata/android/hu/changelogs/40100110.txt b/fastlane/metadata/android/hu-HU/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/hu/changelogs/40100110.txt rename to fastlane/metadata/android/hu-HU/changelogs/40100110.txt diff --git a/fastlane/metadata/android/hu/changelogs/40100120.txt b/fastlane/metadata/android/hu-HU/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/hu/changelogs/40100120.txt rename to fastlane/metadata/android/hu-HU/changelogs/40100120.txt diff --git a/fastlane/metadata/android/hu/changelogs/40100130.txt b/fastlane/metadata/android/hu-HU/changelogs/40100130.txt similarity index 88% rename from fastlane/metadata/android/hu/changelogs/40100130.txt rename to fastlane/metadata/android/hu-HU/changelogs/40100130.txt index e1b044f4e5..47ce2690f4 100644 --- a/fastlane/metadata/android/hu/changelogs/40100130.txt +++ b/fastlane/metadata/android/hu-HU/changelogs/40100130.txt @@ -1,2 +1,2 @@ Főbb változtatások ebben a verzióban: URL előnézet, új emoji billentyűzet, új szoba beállitási lehetőségek, és hó karácsonyra! -Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.12 +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.13 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100140.txt b/fastlane/metadata/android/hu-HU/changelogs/40100140.txt new file mode 100644 index 0000000000..1b86da9ab1 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40100140.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Szoba jogosultságok szerkesztése, automatikus sötét/világos téma és sok hibajavítás. +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.14 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100150.txt b/fastlane/metadata/android/hu-HU/changelogs/40100150.txt new file mode 100644 index 0000000000..b48fd6a0d7 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40100150.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Közösségi hálózatos bejelentkezés támogatása +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.15 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100160.txt b/fastlane/metadata/android/hu-HU/changelogs/40100160.txt new file mode 100644 index 0000000000..bb983ed5e8 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40100160.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Közösségi hálózatos bejelentkezés +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100170.txt b/fastlane/metadata/android/hu-HU/changelogs/40100170.txt new file mode 100644 index 0000000000..806470d74e --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40100170.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Hibajavítás! +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101000.txt b/fastlane/metadata/android/hu-HU/changelogs/40101000.txt new file mode 100644 index 0000000000..0bc4f5d49f --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: VoIP (hang és videóhívás közvetlen beszélgetésekben) fejlesztés és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101010.txt b/fastlane/metadata/android/hu-HU/changelogs/40101010.txt new file mode 100644 index 0000000000..503fc0ab2f --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101010.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: sebesség javítás és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.1 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101020.txt b/fastlane/metadata/android/hu-HU/changelogs/40101020.txt new file mode 100644 index 0000000000..04d67ac5ae --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101020.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: sebesség javítás és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.2 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101030.txt b/fastlane/metadata/android/hu-HU/changelogs/40101030.txt new file mode 100644 index 0000000000..4d0e46739e --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101030.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: sebesség javítás és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.3 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101040.txt b/fastlane/metadata/android/hu-HU/changelogs/40101040.txt new file mode 100644 index 0000000000..1c6921f0d5 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101040.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: sebesség javítás és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.4 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101050.txt b/fastlane/metadata/android/hu-HU/changelogs/40101050.txt new file mode 100644 index 0000000000..c937bb9215 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101050.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: javítás az 1.1.4 verzióhoz +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.5 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101060.txt b/fastlane/metadata/android/hu-HU/changelogs/40101060.txt new file mode 100644 index 0000000000..a9b37e66a9 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101060.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: javítás az 1.1.5 verzióhoz +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.6 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101070.txt b/fastlane/metadata/android/hu-HU/changelogs/40101070.txt new file mode 100644 index 0000000000..4acfbea1ea --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: béta állapotú Tér támogatás. Videó tömörítés küldés előtt. +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101080.txt b/fastlane/metadata/android/hu-HU/changelogs/40101080.txt new file mode 100644 index 0000000000..e0f45f09b5 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101080.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: javítások a Terekhez +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101090.txt b/fastlane/metadata/android/hu-HU/changelogs/40101090.txt new file mode 100644 index 0000000000..b3f3369ed7 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40101090.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: támogatás a gitter.im hálózathoz +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/hu-HU/full_description.txt b/fastlane/metadata/android/hu-HU/full_description.txt new file mode 100644 index 0000000000..032346ccb8 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/full_description.txt @@ -0,0 +1,40 @@ +Element egy biztonságos üzenetküldő és csapatmunka támogató alkalmazás ami ideális távoli munkavégzés közben csoportos csevegéshez. Az alkalmazás végpontok közötti titkosítást használ videó konferenciához, fájl megosztáshoz és videó hivásokhoz. + +<b>Element tulajdonságai:</b> +- Fejlett online kommunikációs eszköz +- Teljesen titkosított üzenetküldés biztonságos céges kommunikációt kínál még a távdolgozóknak is +- Elosztott csevegés a Matrix nyílt forráskódú keretrendszer felhasználásával +- Bizontságos fájl megosztás titkosítottan projektek kezeléséhez +- Videó hívás VoIP-pal és képernyőmegosztással +- Könnyen integrálható a kedvenc online kollaborációs eszközöddel, projekt menedzsment eszközzel, VoIP szolgáltatással vagy más csoport üzenetküldő alkalmazással + +Element teljesen más mint a többi üzenetküldő alkalmazás. Matrixot használ, egy nyílt hálózatot a decentralizált biztonságos kommunikációhoz. Lehetőséget ad saját szerver üzemeltetésére ami maximális tulajdont és kontrollt biztosít az adatok fölött. + +<b>Magánélet védelme és titkosított üzenetküldés</b> +Element megóv a kéretlen hirdetésektől, adatbányászattól és a különböző szigetszerű megoldásoktól. Minden adatot biztonságba helyez, egy az egybe videó és hang kommunikáció végpontok között titkosítva ahol az eszközök hitelesítve vannak. + +Element a kezedbe adja az adatvédelmi irányítást miközben bárkivel kommunikálhatsz a Matrix hálózatban vagy más üzleti kollaborációs eszközzel ami integrálva van, mint amilyen a Slack. + +<b>Element futtatható saját szerveren</b> + +Azért, hogy az érzékeny adatok és beszélgetések minnél inkább az irányításod alatt lehessen az Elementet saját magadnak üzemeltetheted vagy választhatsz bármely Matrixon alapuló - szabványos nyílt forráskódú és decentralizált kommunikáció - szoláltató közül. Element adatvédelmet, biztonságot és rugalmas integrációkat biztosít. + +<b>A te adatod a tiéd</b> +Te döntöd el, hogy hol tárolod az adataidat és üzeneteidet. Adatbányászat vagy harmadik fél hozzáférésének kockázata nélkül. + +Element többféle képpen adja vissza az irányítást: +1. Szerezz egy ingyenes hozzáférést a matrix.org nyilvános szerverre amit a Matrix fejlesztők üzemeltetnek vagy válassz a több ezer önkéntesek által üzemeltetett nyilvános szerverből +2. Üzemeltess szerver magadnak a saját infrastruktúrádon +3. Iratkozz fel egy egyedi szerverre az Element Matrix Services platformon + +<b>Nyílt üzenetküldés és kollaboráció</b> +Bárkivel beszélgethetsz a Matrix hálózaton, akár az Elementet használja akár egy másik Matrix alkalmazást használ vagy akár egy eltérő üzenetküldőt. + +<b>Fantasztikusan biztonságos</b> +Igazi végpontok között titkosítás (csak a beszélgetésben résztvevők tudják visszafejteni) és hitelesítés eszközök közötti aláírásokkal. + +<b>Teljes kommunikáció és integráció</b> +Üzenetküldés, hang és videóhívás, fájl megosztás, képernyő megosztás és egy csomó integráció, botok és kisalkalmazások. Építs szobákat, közösségeket, maradj kapcsolatban és végezz el dolgokat. + +<b>Vedd fel a fonalat</b> +Maradj kapcsolatban bárhol minden eszközödön a szinkronizált üzenetekkel és a weben a https://app.element.io oldallal diff --git a/fastlane/metadata/android/hu-HU/short_description.txt b/fastlane/metadata/android/hu-HU/short_description.txt new file mode 100644 index 0000000000..2dfe14c516 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/short_description.txt @@ -0,0 +1 @@ +Csoportos üzenetküldő - titkosított üzenetek, videó hívások diff --git a/fastlane/metadata/android/hu-HU/title.txt b/fastlane/metadata/android/hu-HU/title.txt new file mode 100644 index 0000000000..c463dea393 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/title.txt @@ -0,0 +1 @@ +Element - Biztonságos üzenetküldő diff --git a/fastlane/metadata/android/hu/full_description.txt b/fastlane/metadata/android/hu/full_description.txt deleted file mode 100644 index b75f259d02..0000000000 --- a/fastlane/metadata/android/hu/full_description.txt +++ /dev/null @@ -1,30 +0,0 @@ -Az Element egy új üzenetküldő, és csapatmunka alkalmazás, amivel - -1. A te kezedben van az irányítás a saját adataid fölött, hogy megőrizhesd a magánszférádat -2. Akárkivel beszélgethetsz a Matrix hálózatban, sőt még azon kívül is, például olyan alkalmazások integrálásával, mint a Slack -3. Megvédheted magad a hirdetésektől, adatbányászattól, és a nagy cégek megoldásaiba való bezártságtól -4. Biztonságosan beszélgethetsz, a végpontok közötti titkosításnak köszönhetően, az eszközök megbízhatóságát az eszköz-közti hitelesítéssel garantálva - -Az Element teljesen más, mint a többi üzenetküldő és csapatmunka alkalmazás, mert nyílt forráskódú, és decentralizált (nem központilag irányított). - -Az Element lehetővé teszi, hogy saját szervert futtass - vagy válassz egy szolgáltatót - így te birtoklod az adataidat, ezáltal megőrizve a magánszférád és a biztonságod. Egy nyitott hálózathoz ad hozzáférést, így nem csak a többi Element felhasználóval tudsz beszélgetni, hanem másokkal is. Ráadásul nagyon biztonságos. - -Az Element-tel azért válik mindez lehetővé, mert a Matrix hálózatra épül - egy nyílt, decentralizált kommunikációs szabványra. - -Az Element a te kezedbe adja az irányítást azáltal, hogy eldöntheted, ki tárolja a beszélgetéseidet. Az Element alkalmazásból több féle szolgáltatót is választhatsz: - -1. Regisztrálhatsz ingyen egy fiókot a matrix.org nyilvános szerveren, amit a Matrix fejlesztői üzemeltetnek, vagy választhatsz a több ezer, ingyenes szerver közül, amit önkéntesek üzemeltetnek -2. A saját számítógépeden is futtathatsz szervert -3. Előfizethetsz egy saját szerverre az Element Matrix Szolgáltatások platformon - -<b>Miért jó az Element-et választani?</b> - -<b>ADATAID MEGVÉDÉSE</b>: Eldöntheted, hol tárold az adataid és üzeneteid. A te tulajdonodban van, nem valami megacégnél, ami bányássza az adataid, vagy továbbadja másoknak. - -<b>NYÍLT BESZÉLGETÉS, ÉS CSAPATMUNKA</b>: Akárkivel cseveghetsz a Matrix hálózatban, akár az Element-et használják, akár valamilyen másik Matrix alkalmazást, de még akkor is, ha egy másik csevegő hálózatot használnak, olyat, mint például a Slack, IRC, vagy az XMPP. - -<b>SZUPER-BIZTONSÁGOS</b>: Valódi, végpontok közötti titkosítás (csak a beszélgetés résztvevői tudják elolvasni az üzeneteket), és eszköz-közti hitelesítés, hogy ellenőrizhesd a résztvevők eszközeit. - -<b>TELJES KOMMUNIKÁCIÓ</b>: Üzenetküldés, hang- és videóhívások, fájlmegosztás, képernyőmegosztás, és egy rakás integráció, bot, és widget. Hozz létre szobákat, közösségeket, maradj elérhető, és végezzétek el a feladatokat. - -<b>AKÁRHOL, AHOL CSAK SZÜKSÉG VAN RÁ</b>: Akárhol is vagy, maradj elérhető, a teljes mértékben szinkronizált beszélgetésekkel az összes eszközödön, és a weben a https://app.element.io oldalon. diff --git a/fastlane/metadata/android/hu/short_description.txt b/fastlane/metadata/android/hu/short_description.txt deleted file mode 100644 index 89f7c13f54..0000000000 --- a/fastlane/metadata/android/hu/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Biztonságos, decentralizált chat és VoIP. Tartsd az adataid biztonságban. diff --git a/fastlane/metadata/android/hu/title.txt b/fastlane/metadata/android/hu/title.txt deleted file mode 100644 index 8e493d2d08..0000000000 --- a/fastlane/metadata/android/hu/title.txt +++ /dev/null @@ -1 +0,0 @@ -Element (régebben Riot.im) diff --git a/fastlane/metadata/android/it/changelogs/40100100.txt b/fastlane/metadata/android/it-IT/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40100100.txt rename to fastlane/metadata/android/it-IT/changelogs/40100100.txt diff --git a/fastlane/metadata/android/it/changelogs/40100110.txt b/fastlane/metadata/android/it-IT/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40100110.txt rename to fastlane/metadata/android/it-IT/changelogs/40100110.txt diff --git a/fastlane/metadata/android/it/changelogs/40100120.txt b/fastlane/metadata/android/it-IT/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40100120.txt rename to fastlane/metadata/android/it-IT/changelogs/40100120.txt diff --git a/fastlane/metadata/android/it/changelogs/40100130.txt b/fastlane/metadata/android/it-IT/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40100130.txt rename to fastlane/metadata/android/it-IT/changelogs/40100130.txt diff --git a/fastlane/metadata/android/it/changelogs/40100140.txt b/fastlane/metadata/android/it-IT/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40100140.txt rename to fastlane/metadata/android/it-IT/changelogs/40100140.txt diff --git a/fastlane/metadata/android/it/changelogs/40100150.txt b/fastlane/metadata/android/it-IT/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40100150.txt rename to fastlane/metadata/android/it-IT/changelogs/40100150.txt diff --git a/fastlane/metadata/android/it/changelogs/40100160.txt b/fastlane/metadata/android/it-IT/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40100160.txt rename to fastlane/metadata/android/it-IT/changelogs/40100160.txt diff --git a/fastlane/metadata/android/it/changelogs/40100170.txt b/fastlane/metadata/android/it-IT/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40100170.txt rename to fastlane/metadata/android/it-IT/changelogs/40100170.txt diff --git a/fastlane/metadata/android/it/changelogs/40101000.txt b/fastlane/metadata/android/it-IT/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40101000.txt rename to fastlane/metadata/android/it-IT/changelogs/40101000.txt diff --git a/fastlane/metadata/android/it/changelogs/40101010.txt b/fastlane/metadata/android/it-IT/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40101010.txt rename to fastlane/metadata/android/it-IT/changelogs/40101010.txt diff --git a/fastlane/metadata/android/it/changelogs/40101020.txt b/fastlane/metadata/android/it-IT/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40101020.txt rename to fastlane/metadata/android/it-IT/changelogs/40101020.txt diff --git a/fastlane/metadata/android/it/changelogs/40101030.txt b/fastlane/metadata/android/it-IT/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40101030.txt rename to fastlane/metadata/android/it-IT/changelogs/40101030.txt diff --git a/fastlane/metadata/android/it/changelogs/40101040.txt b/fastlane/metadata/android/it-IT/changelogs/40101040.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40101040.txt rename to fastlane/metadata/android/it-IT/changelogs/40101040.txt diff --git a/fastlane/metadata/android/it/changelogs/40101050.txt b/fastlane/metadata/android/it-IT/changelogs/40101050.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40101050.txt rename to fastlane/metadata/android/it-IT/changelogs/40101050.txt diff --git a/fastlane/metadata/android/it/changelogs/40101060.txt b/fastlane/metadata/android/it-IT/changelogs/40101060.txt similarity index 100% rename from fastlane/metadata/android/it/changelogs/40101060.txt rename to fastlane/metadata/android/it-IT/changelogs/40101060.txt diff --git a/fastlane/metadata/android/it-IT/changelogs/40101070.txt b/fastlane/metadata/android/it-IT/changelogs/40101070.txt new file mode 100644 index 0000000000..6f7ffcd958 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: supporto beta per gli Spazi. Compressione video prima dell'invio. +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/it-IT/changelogs/40101080.txt b/fastlane/metadata/android/it-IT/changelogs/40101080.txt new file mode 100644 index 0000000000..9964245d4d --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40101080.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: miglioramenti per gli Spazi. +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/it-IT/changelogs/40101090.txt b/fastlane/metadata/android/it-IT/changelogs/40101090.txt new file mode 100644 index 0000000000..d1d89c8f41 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40101090.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: aggiunto supporto per la rete gitter.im . +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/it/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt similarity index 100% rename from fastlane/metadata/android/it/full_description.txt rename to fastlane/metadata/android/it-IT/full_description.txt diff --git a/fastlane/metadata/android/it/short_description.txt b/fastlane/metadata/android/it-IT/short_description.txt similarity index 100% rename from fastlane/metadata/android/it/short_description.txt rename to fastlane/metadata/android/it-IT/short_description.txt diff --git a/fastlane/metadata/android/it/title.txt b/fastlane/metadata/android/it-IT/title.txt similarity index 100% rename from fastlane/metadata/android/it/title.txt rename to fastlane/metadata/android/it-IT/title.txt diff --git a/fastlane/metadata/android/he/changelogs/40100100.txt b/fastlane/metadata/android/iw-IL/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/he/changelogs/40100100.txt rename to fastlane/metadata/android/iw-IL/changelogs/40100100.txt diff --git a/fastlane/metadata/android/he/changelogs/40100110.txt b/fastlane/metadata/android/iw-IL/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/he/changelogs/40100110.txt rename to fastlane/metadata/android/iw-IL/changelogs/40100110.txt diff --git a/fastlane/metadata/android/he/changelogs/40100120.txt b/fastlane/metadata/android/iw-IL/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/he/changelogs/40100120.txt rename to fastlane/metadata/android/iw-IL/changelogs/40100120.txt diff --git a/fastlane/metadata/android/he/changelogs/40100130.txt b/fastlane/metadata/android/iw-IL/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/he/changelogs/40100130.txt rename to fastlane/metadata/android/iw-IL/changelogs/40100130.txt diff --git a/fastlane/metadata/android/he/full_description.txt b/fastlane/metadata/android/iw-IL/full_description.txt similarity index 100% rename from fastlane/metadata/android/he/full_description.txt rename to fastlane/metadata/android/iw-IL/full_description.txt diff --git a/fastlane/metadata/android/he/short_description.txt b/fastlane/metadata/android/iw-IL/short_description.txt similarity index 100% rename from fastlane/metadata/android/he/short_description.txt rename to fastlane/metadata/android/iw-IL/short_description.txt diff --git a/fastlane/metadata/android/he/title.txt b/fastlane/metadata/android/iw-IL/title.txt similarity index 100% rename from fastlane/metadata/android/he/title.txt rename to fastlane/metadata/android/iw-IL/title.txt diff --git a/fastlane/metadata/android/ja/changelogs/40100100.txt b/fastlane/metadata/android/ja-JP/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40100100.txt rename to fastlane/metadata/android/ja-JP/changelogs/40100100.txt diff --git a/fastlane/metadata/android/ja/changelogs/40100110.txt b/fastlane/metadata/android/ja-JP/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40100110.txt rename to fastlane/metadata/android/ja-JP/changelogs/40100110.txt diff --git a/fastlane/metadata/android/ja/changelogs/40100120.txt b/fastlane/metadata/android/ja-JP/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40100120.txt rename to fastlane/metadata/android/ja-JP/changelogs/40100120.txt diff --git a/fastlane/metadata/android/ja/changelogs/40100130.txt b/fastlane/metadata/android/ja-JP/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40100130.txt rename to fastlane/metadata/android/ja-JP/changelogs/40100130.txt diff --git a/fastlane/metadata/android/ja/changelogs/40100140.txt b/fastlane/metadata/android/ja-JP/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40100140.txt rename to fastlane/metadata/android/ja-JP/changelogs/40100140.txt diff --git a/fastlane/metadata/android/ja/changelogs/40100150.txt b/fastlane/metadata/android/ja-JP/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40100150.txt rename to fastlane/metadata/android/ja-JP/changelogs/40100150.txt diff --git a/fastlane/metadata/android/ja/changelogs/40100160.txt b/fastlane/metadata/android/ja-JP/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40100160.txt rename to fastlane/metadata/android/ja-JP/changelogs/40100160.txt diff --git a/fastlane/metadata/android/ja/changelogs/40100170.txt b/fastlane/metadata/android/ja-JP/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40100170.txt rename to fastlane/metadata/android/ja-JP/changelogs/40100170.txt diff --git a/fastlane/metadata/android/ja/changelogs/40101000.txt b/fastlane/metadata/android/ja-JP/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40101000.txt rename to fastlane/metadata/android/ja-JP/changelogs/40101000.txt diff --git a/fastlane/metadata/android/ja/changelogs/40101010.txt b/fastlane/metadata/android/ja-JP/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40101010.txt rename to fastlane/metadata/android/ja-JP/changelogs/40101010.txt diff --git a/fastlane/metadata/android/ja/changelogs/40101020.txt b/fastlane/metadata/android/ja-JP/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40101020.txt rename to fastlane/metadata/android/ja-JP/changelogs/40101020.txt diff --git a/fastlane/metadata/android/ja/changelogs/40101030.txt b/fastlane/metadata/android/ja-JP/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/ja/changelogs/40101030.txt rename to fastlane/metadata/android/ja-JP/changelogs/40101030.txt diff --git a/fastlane/metadata/android/ja/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt similarity index 100% rename from fastlane/metadata/android/ja/full_description.txt rename to fastlane/metadata/android/ja-JP/full_description.txt diff --git a/fastlane/metadata/android/ja/short_description.txt b/fastlane/metadata/android/ja-JP/short_description.txt similarity index 100% rename from fastlane/metadata/android/ja/short_description.txt rename to fastlane/metadata/android/ja-JP/short_description.txt diff --git a/fastlane/metadata/android/ja/title.txt b/fastlane/metadata/android/ja-JP/title.txt similarity index 100% rename from fastlane/metadata/android/ja/title.txt rename to fastlane/metadata/android/ja-JP/title.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40100100.txt b/fastlane/metadata/android/no-NO/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40100100.txt rename to fastlane/metadata/android/no-NO/changelogs/40100100.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40100110.txt b/fastlane/metadata/android/no-NO/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40100110.txt rename to fastlane/metadata/android/no-NO/changelogs/40100110.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40100120.txt b/fastlane/metadata/android/no-NO/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40100120.txt rename to fastlane/metadata/android/no-NO/changelogs/40100120.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40100130.txt b/fastlane/metadata/android/no-NO/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40100130.txt rename to fastlane/metadata/android/no-NO/changelogs/40100130.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40100140.txt b/fastlane/metadata/android/no-NO/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40100140.txt rename to fastlane/metadata/android/no-NO/changelogs/40100140.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40100150.txt b/fastlane/metadata/android/no-NO/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40100150.txt rename to fastlane/metadata/android/no-NO/changelogs/40100150.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40100160.txt b/fastlane/metadata/android/no-NO/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40100160.txt rename to fastlane/metadata/android/no-NO/changelogs/40100160.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40100170.txt b/fastlane/metadata/android/no-NO/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40100170.txt rename to fastlane/metadata/android/no-NO/changelogs/40100170.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40101000.txt b/fastlane/metadata/android/no-NO/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40101000.txt rename to fastlane/metadata/android/no-NO/changelogs/40101000.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40101010.txt b/fastlane/metadata/android/no-NO/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40101010.txt rename to fastlane/metadata/android/no-NO/changelogs/40101010.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40101020.txt b/fastlane/metadata/android/no-NO/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40101020.txt rename to fastlane/metadata/android/no-NO/changelogs/40101020.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/40101030.txt b/fastlane/metadata/android/no-NO/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/changelogs/40101030.txt rename to fastlane/metadata/android/no-NO/changelogs/40101030.txt diff --git a/fastlane/metadata/android/nb-NO/full_description.txt b/fastlane/metadata/android/no-NO/full_description.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/full_description.txt rename to fastlane/metadata/android/no-NO/full_description.txt diff --git a/fastlane/metadata/android/nb-NO/short_description.txt b/fastlane/metadata/android/no-NO/short_description.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/short_description.txt rename to fastlane/metadata/android/no-NO/short_description.txt diff --git a/fastlane/metadata/android/nb-NO/title.txt b/fastlane/metadata/android/no-NO/title.txt similarity index 100% rename from fastlane/metadata/android/nb-NO/title.txt rename to fastlane/metadata/android/no-NO/title.txt diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101070.txt b/fastlane/metadata/android/pt-BR/changelogs/40101070.txt new file mode 100644 index 0000000000..ab403ea4cc --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta version: suporte beta para Espaços. Comprimir vídeo antes de enviar. +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101080.txt b/fastlane/metadata/android/pt-BR/changelogs/40101080.txt new file mode 100644 index 0000000000..25047345ef --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40101080.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta version: melhoramento para Espaços. +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101090.txt b/fastlane/metadata/android/pt-BR/changelogs/40101090.txt new file mode 100644 index 0000000000..cc5e71cf7f --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40101090.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta version: adicionar supporte a rede gitter.im. +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt index b4fee53b4d..7bb3d0981d 100644 --- a/fastlane/metadata/android/pt-BR/full_description.txt +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -11,7 +11,7 @@ Element é tanto um mensageiro seguro como um app de colaboração de time de pr Element é completamente diferente de outros apps de mensageria e colaboração. Ele opera em Matrix, uma rede aberta para mensageria segura e comunicação descentralizada. Ele permite auto-hospedagem para dar a usuárias(os) máxima propriedade e controle de seus dados e suas mensagens. <b>Privacidade e mensageria encriptada</b> -Element protege você de ads não-desejados, minagem de dados e jardins murados. Ele também assegura todos os seus dados, vídeo um-a-um e comunicação de voz através de encriptação ponta-a-ponta e verificação de dispositivo assinada cruzado. +Element protege você de ads indesejados, datamining e jardins murados. Ele também assegura todos os seus dados, vídeo um-a-um e comunicação de voz através de encriptação ponta-a-ponta e verificação de dispositivo assinada cruzado. Element dá a você controle sobre sua privacidade enquanto permite a você se comunicar seguramente com qualquer pessoa na rede Matrix, ou outras ferramentas de colaboração ao se integrar com apps tais como Slack. @@ -19,21 +19,21 @@ Element dá a você controle sobre sua privacidade enquanto permite a você se c Para permitir mais controle de seus dados e conversas sensíveis, Element pode ser auto-hospedado ou você pode escolher qualquer host baseado em Matrix - o standard para comunicação open source e descentralizada. Element dá a você privacidade, conformidade de segurança e flexibilidade de integração. <b>Tenha posse de seus dados</b> -Você decidade onde mannter seus dados e mensagens. Sem o risco de minagem de dados ou acesso de terceiros. +Você decide onde manter seus dados e mensagens. Sem o risco de data mining ou acesso de terceiros. Element põe você em controle de diferentes maneiras: -1. Tenha uma conta grátis no servidor público matrix.org hospedado pelos desenvolvedores Matrix, ou escolha de milhares de servidores públicos hospedados por pessoas se voluntariando -2. Auto-hospede sua conta ao rodar um servidor em sua própria infraestrutura de TI -3. Registre-se para uma conta num servidor personalizado ao simplesmente assinar a plataforma de hospedagem Element Matrix Services +1. Pegar uma conta grátis no servidor público matrix.org hospedado pelos desenvolvedores Matrix, ou escolha de milhares de servidores públicos hospedados por pessoas se voluntariando +2. Auto-hospedar sua conta ao rodar um servidor em sua própria infraestrutura de TI +3. Fazer signup para uma conta num servidor personalizado ao simplesmente assinar a plataforma de hospedagem Element Matrix Services <b>Mensageria e colaboração abertos</b> -Você pode fazer chat com qualquer pessoa na rede Matrix, caso ela esteja usando Element, um outro app de Matrix ou mesmo se ela estiver usando um app de mensagem diferente. +Você pode fazer chat com qualquer pessoa na rede Matrix, caso ela esteja usando Element, um outro app de Matrix ou mesmo se ela estiver usando um app de mensageria diferente. <b>Super seguro</b> Encriptação ponta-a-ponta real (somente aquelas/es na conversa podem decriptar mensagens), e verificação de dispositivo assinada cuzado. <b>Comunicação e integração completas</b> -Messageria, chamas de voz e vídeo, compartilhamento de arquivo, compartilhamento de tela e um monte de integrações, bots e widgets. Construa salas, comunidades, fique em contato e tenha as coisas feitas. +Messageria, chamadas de voz e vídeo, compartilhamento de arquivo, compartilhamento de tela e um monte de integrações, bots e widgets. Construa salas, comunidades, fique em contato e tenha as coisas feitas. <b>Continue de onde você parou</b> Fique em contato onde quer que você esteja com histórico de mensagem completamente sincronizado por todos os seus dispositivos e na web em https://app.element.io diff --git a/fastlane/metadata/android/pt-BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt index f03b5347b9..d5f82d8623 100644 --- a/fastlane/metadata/android/pt-BR/short_description.txt +++ b/fastlane/metadata/android/pt-BR/short_description.txt @@ -1 +1 @@ -Mensageiro de grupo - mensagens encriptadas, chat de grupo e chamadas de vídeo +Mensageiro de grupo - mensageria, chat de grupo e chamadas de vídeo encriptados diff --git a/fastlane/metadata/android/ru/changelogs/40100100.txt b/fastlane/metadata/android/ru-RU/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40100100.txt rename to fastlane/metadata/android/ru-RU/changelogs/40100100.txt diff --git a/fastlane/metadata/android/ru/changelogs/40100110.txt b/fastlane/metadata/android/ru-RU/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40100110.txt rename to fastlane/metadata/android/ru-RU/changelogs/40100110.txt diff --git a/fastlane/metadata/android/ru/changelogs/40100120.txt b/fastlane/metadata/android/ru-RU/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40100120.txt rename to fastlane/metadata/android/ru-RU/changelogs/40100120.txt diff --git a/fastlane/metadata/android/ru/changelogs/40100130.txt b/fastlane/metadata/android/ru-RU/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40100130.txt rename to fastlane/metadata/android/ru-RU/changelogs/40100130.txt diff --git a/fastlane/metadata/android/ru/changelogs/40100140.txt b/fastlane/metadata/android/ru-RU/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40100140.txt rename to fastlane/metadata/android/ru-RU/changelogs/40100140.txt diff --git a/fastlane/metadata/android/ru/changelogs/40100150.txt b/fastlane/metadata/android/ru-RU/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40100150.txt rename to fastlane/metadata/android/ru-RU/changelogs/40100150.txt diff --git a/fastlane/metadata/android/ru/changelogs/40100160.txt b/fastlane/metadata/android/ru-RU/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40100160.txt rename to fastlane/metadata/android/ru-RU/changelogs/40100160.txt diff --git a/fastlane/metadata/android/ru/changelogs/40100170.txt b/fastlane/metadata/android/ru-RU/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40100170.txt rename to fastlane/metadata/android/ru-RU/changelogs/40100170.txt diff --git a/fastlane/metadata/android/ru/changelogs/40101000.txt b/fastlane/metadata/android/ru-RU/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40101000.txt rename to fastlane/metadata/android/ru-RU/changelogs/40101000.txt diff --git a/fastlane/metadata/android/ru/changelogs/40101010.txt b/fastlane/metadata/android/ru-RU/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40101010.txt rename to fastlane/metadata/android/ru-RU/changelogs/40101010.txt diff --git a/fastlane/metadata/android/ru/changelogs/40101020.txt b/fastlane/metadata/android/ru-RU/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40101020.txt rename to fastlane/metadata/android/ru-RU/changelogs/40101020.txt diff --git a/fastlane/metadata/android/ru/changelogs/40101030.txt b/fastlane/metadata/android/ru-RU/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/ru/changelogs/40101030.txt rename to fastlane/metadata/android/ru-RU/changelogs/40101030.txt diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt similarity index 100% rename from fastlane/metadata/android/ru/full_description.txt rename to fastlane/metadata/android/ru-RU/full_description.txt diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru-RU/short_description.txt similarity index 100% rename from fastlane/metadata/android/ru/short_description.txt rename to fastlane/metadata/android/ru-RU/short_description.txt diff --git a/fastlane/metadata/android/ru/title.txt b/fastlane/metadata/android/ru-RU/title.txt similarity index 100% rename from fastlane/metadata/android/ru/title.txt rename to fastlane/metadata/android/ru-RU/title.txt diff --git a/fastlane/metadata/android/si/title.txt b/fastlane/metadata/android/si-LK/title.txt similarity index 100% rename from fastlane/metadata/android/si/title.txt rename to fastlane/metadata/android/si-LK/title.txt diff --git a/fastlane/metadata/android/sv/changelogs/40100100.txt b/fastlane/metadata/android/sv-SE/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40100100.txt rename to fastlane/metadata/android/sv-SE/changelogs/40100100.txt diff --git a/fastlane/metadata/android/sv/changelogs/40100110.txt b/fastlane/metadata/android/sv-SE/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40100110.txt rename to fastlane/metadata/android/sv-SE/changelogs/40100110.txt diff --git a/fastlane/metadata/android/sv/changelogs/40100120.txt b/fastlane/metadata/android/sv-SE/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40100120.txt rename to fastlane/metadata/android/sv-SE/changelogs/40100120.txt diff --git a/fastlane/metadata/android/sv/changelogs/40100130.txt b/fastlane/metadata/android/sv-SE/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40100130.txt rename to fastlane/metadata/android/sv-SE/changelogs/40100130.txt diff --git a/fastlane/metadata/android/sv/changelogs/40100140.txt b/fastlane/metadata/android/sv-SE/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40100140.txt rename to fastlane/metadata/android/sv-SE/changelogs/40100140.txt diff --git a/fastlane/metadata/android/sv/changelogs/40100150.txt b/fastlane/metadata/android/sv-SE/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40100150.txt rename to fastlane/metadata/android/sv-SE/changelogs/40100150.txt diff --git a/fastlane/metadata/android/sv/changelogs/40100160.txt b/fastlane/metadata/android/sv-SE/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40100160.txt rename to fastlane/metadata/android/sv-SE/changelogs/40100160.txt diff --git a/fastlane/metadata/android/sv/changelogs/40100170.txt b/fastlane/metadata/android/sv-SE/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40100170.txt rename to fastlane/metadata/android/sv-SE/changelogs/40100170.txt diff --git a/fastlane/metadata/android/sv/changelogs/40101000.txt b/fastlane/metadata/android/sv-SE/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40101000.txt rename to fastlane/metadata/android/sv-SE/changelogs/40101000.txt diff --git a/fastlane/metadata/android/sv/changelogs/40101010.txt b/fastlane/metadata/android/sv-SE/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40101010.txt rename to fastlane/metadata/android/sv-SE/changelogs/40101010.txt diff --git a/fastlane/metadata/android/sv/changelogs/40101020.txt b/fastlane/metadata/android/sv-SE/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40101020.txt rename to fastlane/metadata/android/sv-SE/changelogs/40101020.txt diff --git a/fastlane/metadata/android/sv/changelogs/40101030.txt b/fastlane/metadata/android/sv-SE/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40101030.txt rename to fastlane/metadata/android/sv-SE/changelogs/40101030.txt diff --git a/fastlane/metadata/android/sv/changelogs/40101040.txt b/fastlane/metadata/android/sv-SE/changelogs/40101040.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40101040.txt rename to fastlane/metadata/android/sv-SE/changelogs/40101040.txt diff --git a/fastlane/metadata/android/sv/changelogs/40101050.txt b/fastlane/metadata/android/sv-SE/changelogs/40101050.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40101050.txt rename to fastlane/metadata/android/sv-SE/changelogs/40101050.txt diff --git a/fastlane/metadata/android/sv/changelogs/40101060.txt b/fastlane/metadata/android/sv-SE/changelogs/40101060.txt similarity index 100% rename from fastlane/metadata/android/sv/changelogs/40101060.txt rename to fastlane/metadata/android/sv-SE/changelogs/40101060.txt diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101070.txt b/fastlane/metadata/android/sv-SE/changelogs/40101070.txt new file mode 100644 index 0000000000..4756a2d028 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: betastöd för utrymmen. Komprimera video innan den skickas. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101080.txt b/fastlane/metadata/android/sv-SE/changelogs/40101080.txt new file mode 100644 index 0000000000..38d704f995 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40101080.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: förbättringar för utrymmen. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101090.txt b/fastlane/metadata/android/sv-SE/changelogs/40101090.txt new file mode 100644 index 0000000000..e1b5900a30 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40101090.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: lägg till stöd för gitter.im-nätverket. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/sv/full_description.txt b/fastlane/metadata/android/sv-SE/full_description.txt similarity index 100% rename from fastlane/metadata/android/sv/full_description.txt rename to fastlane/metadata/android/sv-SE/full_description.txt diff --git a/fastlane/metadata/android/sv/short_description.txt b/fastlane/metadata/android/sv-SE/short_description.txt similarity index 100% rename from fastlane/metadata/android/sv/short_description.txt rename to fastlane/metadata/android/sv-SE/short_description.txt diff --git a/fastlane/metadata/android/sv/title.txt b/fastlane/metadata/android/sv-SE/title.txt similarity index 100% rename from fastlane/metadata/android/sv/title.txt rename to fastlane/metadata/android/sv-SE/title.txt diff --git a/fastlane/metadata/android/tr/changelogs/40100100.txt b/fastlane/metadata/android/tr-TR/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/tr/changelogs/40100100.txt rename to fastlane/metadata/android/tr-TR/changelogs/40100100.txt diff --git a/fastlane/metadata/android/tr/changelogs/40100110.txt b/fastlane/metadata/android/tr-TR/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/tr/changelogs/40100110.txt rename to fastlane/metadata/android/tr-TR/changelogs/40100110.txt diff --git a/fastlane/metadata/android/tr/changelogs/40100120.txt b/fastlane/metadata/android/tr-TR/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/tr/changelogs/40100120.txt rename to fastlane/metadata/android/tr-TR/changelogs/40100120.txt diff --git a/fastlane/metadata/android/tr/changelogs/40100130.txt b/fastlane/metadata/android/tr-TR/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/tr/changelogs/40100130.txt rename to fastlane/metadata/android/tr-TR/changelogs/40100130.txt diff --git a/fastlane/metadata/android/tr/changelogs/40100140.txt b/fastlane/metadata/android/tr-TR/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/tr/changelogs/40100140.txt rename to fastlane/metadata/android/tr-TR/changelogs/40100140.txt diff --git a/fastlane/metadata/android/tr/changelogs/40100170.txt b/fastlane/metadata/android/tr-TR/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/tr/changelogs/40100170.txt rename to fastlane/metadata/android/tr-TR/changelogs/40100170.txt diff --git a/fastlane/metadata/android/tr/changelogs/40101000.txt b/fastlane/metadata/android/tr-TR/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/tr/changelogs/40101000.txt rename to fastlane/metadata/android/tr-TR/changelogs/40101000.txt diff --git a/fastlane/metadata/android/tr/changelogs/40101010.txt b/fastlane/metadata/android/tr-TR/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/tr/changelogs/40101010.txt rename to fastlane/metadata/android/tr-TR/changelogs/40101010.txt diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr-TR/full_description.txt similarity index 100% rename from fastlane/metadata/android/tr/full_description.txt rename to fastlane/metadata/android/tr-TR/full_description.txt diff --git a/fastlane/metadata/android/tr/short_description.txt b/fastlane/metadata/android/tr-TR/short_description.txt similarity index 100% rename from fastlane/metadata/android/tr/short_description.txt rename to fastlane/metadata/android/tr-TR/short_description.txt diff --git a/fastlane/metadata/android/tr/title.txt b/fastlane/metadata/android/tr-TR/title.txt similarity index 100% rename from fastlane/metadata/android/tr/title.txt rename to fastlane/metadata/android/tr-TR/title.txt diff --git a/fastlane/metadata/android/uk/changelogs/40101070.txt b/fastlane/metadata/android/uk/changelogs/40101070.txt new file mode 100644 index 0000000000..4d60bb1704 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Основні зміни в цій версії: бета-підтримка Spaces. Стиснення відео перед надсиланням. +Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/uk/changelogs/40101080.txt b/fastlane/metadata/android/uk/changelogs/40101080.txt new file mode 100644 index 0000000000..c174603258 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40101080.txt @@ -0,0 +1,2 @@ +Основні зміни у цій версії: Вдосконалено Простори! +Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/uk/changelogs/40101090.txt b/fastlane/metadata/android/uk/changelogs/40101090.txt new file mode 100644 index 0000000000..af822ad291 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40101090.txt @@ -0,0 +1,2 @@ +Основні зміни цієї версії: підтримка мережі gitter.im. +Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/uk/full_description.txt b/fastlane/metadata/android/uk/full_description.txt index 026ae4162a..df06315754 100644 --- a/fastlane/metadata/android/uk/full_description.txt +++ b/fastlane/metadata/android/uk/full_description.txt @@ -1,30 +1,39 @@ -Element — це застосунок для спілкування та співпраці нового типу, який: +Element — це і безпечний месенджер, і застосунок для співпраці команди, який ідеально підходить для групових бесід під час віддаленої роботи. Цей застосунок для спілкування застосовує наскрізне шифрування для забезпечення відеоконференцій, обміну файлами та голосових викликів. -1. Надає вам повний контроль за своєю конфіденційністю -2. Дозволяє спілкування з будь-ким у мережі Matrix та поза нею, інтегруючись із такими застосунками, як Slack -3. Убезпечує вас від реклами, збору даних та штучних обмежень -4. Захищає ваше спілкування наскрізним шифруванням із перехресним підписуванням для звірення інших осіб +<b>Можливості Element включають:</b> +- Розширені засоби спілкування в Інтернеті +- Повністю зашифровані повідомлення для надання можливості безпечнішого корпоративного спілкування, навіть для віддалених працівників +- Децентралізований чат на основі відкритого коду Matrix +- Безпечний обмін файлами із зашифрованими даними для керування проєктами +- Відеочати з передачею голосу через IP та показом екрану іншим +- Проста інтеграція з вашими улюбленими інструментами для онлайн-співпраці, інструментами керування проєктами, послугами VoIP та іншими застосунками обміну повідомленнями для команд -Element ґрунтовно відрізняється від інших застосунків для спілкування та співпраці тому що він є децентралізованим та відкритоджерельним. +Element цілковито відрізняється від інших застосунків обміну повідомленнями та спільної роботи. Він працює на Matrix, відкритій мережі для безпечного обміну повідомленнями та децентралізованого зв'язку. Це дозволяє самостійне розгортання, щоб надати користувачам якнайбільше володіння та контролю над їх даними та повідомленнями. -Element дозволяє вам розміщувати сервер в себе або обирати будь-якого з надавачів послуг, таким чином забезпечуючи вам конфіденційність і можливість володіти власними даними й бесідами та контролювати їх. Він надає вам доступ до відкритої мережі, тож ви не є обмеженими спілкуванням виключно з користувачами Element. І він є дуже надійним та безпечним. +<b>Приватність та обмін зашифрованими повідомленнями</b> +Element захищає вас від небажаної реклами, збору даних та обмежень. Він також захищає всі ваші дані, відео та голосовий зв'язок віч-на-віч за допомогою наскрізного шифрування та взаємного підписування пристроїв. -Element здатен забезпечити усе це завдяки тому, що він заснований на протоколі Matrix — стандарті для відкритого та децентралізованого спілкування. +Element дає вам можливість контролювати вашу приватність, одночасно дозволяючи вам безпечно спілкуватися з будь-ким у мережі Matrix або через інші інструменти ділової співпраці, інтегрувавшись із такими програмами, як Slack. -Element надає вам повний контроль, дозволяючи обирати з-поміж надавачів послуг, що обслуговують сервери з вашими бесідами. Ви вільні обрати будь-який спосіб розміщення прямо з застосунку Element: +<b>Element можна розгортати самостійно</b> +Щоб забезпечити більше контролю над вашими приватними даними та розмовами, Element можна самостійно розміщувати або ви можете вибрати будь-який вузол на основі Matrix — стандарт для децентралізованого спілкування з відкритим кодом. Element надає вам приватність, відповідність безпеці та гнучкість інтеграції. -1. Отримати безкоштовний обліковий запис на загальнодоступному сервері matrix.org, який обслуговують розробники Matrix, чи на одному з тисяч публічних серверів, які обслуговують волонтери -2. Розмістити свій обліковий запис на власному сервері -3. Зареєструватись на індивідуальному сервері, просто підписавшись на послуги платформи Element Matrix Services +<b>Ваші дані</b> +Ви вирішуєте, де зберігати свої дані та повідомлення. Без ризику видобутку даних або стороннього доступу. -<b>Чому я маю обрати Element?</b> +Element надає такі можливості на вибір: +1. Отримайте безплатний обліковий запис на загальнодоступному сервері matrix.org, розміщеному розробниками Matrix, або виберіть серед тисяч загальнодоступних серверів, розміщених волонтерами +2. Самостійно розмістіть свій обліковий запис, запустивши сервер на власній ІТ-інфраструктурі +3. Зареєструйте обліковий запис на власному сервері, просто підписавшись на хостинг-платформу Element Matrix Services -<b>ВОЛОДІЙТЕ ВАШИМИ ДАНИМИ</b>: Ви вирішуєте де тримати ваші дані та повідомлення. Саме ви володієте ними та контролюєте їх, а не якась Мегакорпорація, що збирає ваші дані та надає стороннім особам доступ до них. +<b>Відкриті обмін повідомленнями та співпраця</b> +Ви можете спілкуватися з усіма у мережі Matrix, незалежно від того, чи користуються вони Element, іншим застосунком Matrix або навіть якщо іншим застосунком для обміну повідомленнями. -<b>ВІДКРИТІ ОБМІН ПОВІДОМЛЕННЯМИ ТА СПІВПРАЦЯ</b>: Ви можете балакати з будь-ким у мережі Matrix, хоч вони користуються Element, хоч іншим застосунком для Matrix, і навіть якщо вони користуються іншою системою обміну повідомленнями на кшталт Slack, IRC чи XMPP. +<b>Надбезпечний</b> +Справжнє наскрізне шифрування (лише учасники бесіди можуть розшифровувати повідомлення) та взаємне підписування пристроїв. -<b>НАДБЕЗПЕЧНІСТЬ</b>: Справжнє наскрізне шифрування (лише ваші співрозмовники здатні дешифровувати повідомлення) та перехресне підписування для звірення пристроїв інших учасників бесіди. +<b>Повноцінні спілкування та інтеграція</b> +Обмін повідомленнями, голосові та відеовиклики, обмін файлами, спільний доступ до екрана та ціла купа інтеграцій, ботів та віджетів. Створюйте кімнати, спільноти, залишайтеся на зв’язку та виконуйте завдання. -<b>ДОВЕРШЕНИЙ ЗВʼЯЗОК</b>: Повідомлення, голосові та відеодзвінки, обмін файлами, розподіл екрану та ціла купа інтеграцій, ботів та знадобів. Створюйте кімнати й спільноти, залишайтесь на зв'язку та завершуйте свої справи. - -<b>ДЕ Б ВИ НЕ БУЛИ</b>: Залишайтесь на зв'язку де б ви не були, разом з синхронізовною історією листувань на усіх ваших пристроях та в Інтернеті на https://app.element.io. +<b>Продовжуйте, де зупинилися</b> +Залишайтеся на зв'язку, де б ви не знаходились, з повністю синхронізованою історією повідомлень на всіх своїх пристроях та в Інтернеті за адресою https://app.element.io diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40100100.txt b/fastlane/metadata/android/zh-CN/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40100100.txt rename to fastlane/metadata/android/zh-CN/changelogs/40100100.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40100110.txt b/fastlane/metadata/android/zh-CN/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40100110.txt rename to fastlane/metadata/android/zh-CN/changelogs/40100110.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40100120.txt b/fastlane/metadata/android/zh-CN/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40100120.txt rename to fastlane/metadata/android/zh-CN/changelogs/40100120.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40100130.txt b/fastlane/metadata/android/zh-CN/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40100130.txt rename to fastlane/metadata/android/zh-CN/changelogs/40100130.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40100140.txt b/fastlane/metadata/android/zh-CN/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40100140.txt rename to fastlane/metadata/android/zh-CN/changelogs/40100140.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40100150.txt b/fastlane/metadata/android/zh-CN/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40100150.txt rename to fastlane/metadata/android/zh-CN/changelogs/40100150.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40100160.txt b/fastlane/metadata/android/zh-CN/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40100160.txt rename to fastlane/metadata/android/zh-CN/changelogs/40100160.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40100170.txt b/fastlane/metadata/android/zh-CN/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40100170.txt rename to fastlane/metadata/android/zh-CN/changelogs/40100170.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40101000.txt b/fastlane/metadata/android/zh-CN/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40101000.txt rename to fastlane/metadata/android/zh-CN/changelogs/40101000.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40101010.txt b/fastlane/metadata/android/zh-CN/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/changelogs/40101010.txt rename to fastlane/metadata/android/zh-CN/changelogs/40101010.txt diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101020.txt b/fastlane/metadata/android/zh-CN/changelogs/40101020.txt new file mode 100644 index 0000000000..0de3f2aed0 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40101020.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:改进性能和错误修复! +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.2 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101030.txt b/fastlane/metadata/android/zh-CN/changelogs/40101030.txt new file mode 100644 index 0000000000..5a7fae92d5 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40101030.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:改进性能和修复错误! +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.3 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101040.txt b/fastlane/metadata/android/zh-CN/changelogs/40101040.txt new file mode 100644 index 0000000000..44a3547b3e --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40101040.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:改进性能和修复错误! +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.4 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101050.txt b/fastlane/metadata/android/zh-CN/changelogs/40101050.txt new file mode 100644 index 0000000000..c320815a00 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40101050.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:1.1.4 的热修复 +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.5 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101060.txt b/fastlane/metadata/android/zh-CN/changelogs/40101060.txt new file mode 100644 index 0000000000..193ef8f48e --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40101060.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:1.1.5 的热修复 +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.6 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101070.txt b/fastlane/metadata/android/zh-CN/changelogs/40101070.txt new file mode 100644 index 0000000000..ba8e92be9b --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40101070.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:对「空间」的测试版支持。发送前压缩视频。 +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101080.txt b/fastlane/metadata/android/zh-CN/changelogs/40101080.txt new file mode 100644 index 0000000000..64b6462ad2 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40101080.txt @@ -0,0 +1,2 @@ +此版本的主要变化:对空间进行改进。 +完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101090.txt b/fastlane/metadata/android/zh-CN/changelogs/40101090.txt new file mode 100644 index 0000000000..c4c6b349c8 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40101090.txt @@ -0,0 +1,2 @@ +此版本的主要变化:为 gitter.im 网络提供支持。 +完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt new file mode 100644 index 0000000000..fa6b00f1e4 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -0,0 +1,39 @@ +Element 不仅是安全的通讯软件,同时也是生产力团队协作应用,非常适合在远端工作时进行群组聊天。此聊天应用使用了端到端加密来提供强大的视频会议、文件分享与语音通话功能。 + +<b>Element 的功能包含了:</b> +- 进阶的线上通讯工具 +- 完全加密的信息,即使对于远端工作者来说,也可以有更安全的公司通讯 +- 以 Matrix 开放源码框架为基础的去中心化的聊天 +- 在管理项目时通过加密资料安全地分享文件 +- 包含了 VoIP 与画面分享的视频聊天 +- 与你最喜欢的协作工具、项目管理工具、VoIP 服务与其他团队信息应用轻松整合 + +Element 与其他信息传递与协作应用完全不同。它在 Matrix(一个用于安全传递讯息与去中心化通讯的开放网络)上运行。其可以自建,让使用者对他们的资料和信息拥有最大的所有权与控制权。 + +<b>隐私与加密信息传递</b> +Element 保护你不受不想要的广告、信息泄露与围城侵扰。其也通过端到端加密与交叉签章装置验证保护了你所有的资料,并提供一对一视频以及语音通讯。 + +Element 通过与其他商业协作工具,如 Slack 等应用整合,让你可以在控制你的隐私的同时,也可以与 Matrix 网络上的任何人安全地通讯。 + +<b>Element 可以自建</b> +为了可以完整控制你的敏感资料与对话,Element 可以自建,你也可以选择任何以 Matrix 为基础的服务提供商,开放源码、去中心化的通讯标准。Element 为你提供隐私、安全合规与整合灵活性。 + +<b>拥有你的资料</b> +你可以决定将你的资料与信息储存在何处。没有信息泄露或被第三方爬取的风险。 + +Element 透过不同的方式让你掌控一切: +1. 在 Matrix 开发者架设的 matrix.org 公开服务器上取得免费帐号,或是从数千个由志愿者架设的公开服务器中选择 +2. 在你自己的 IT 基础架构上的服务器自行托管你的帐号 +3. 只要订阅 Element Matrix Services 托管平台就可以在自定义的服务器上注册帐号 + +<b>开放信息传递与协作</b> +你可以与 Matrix 网络上的任何人聊天,不论他们是使用 Element、其他 Matrix 应用或其他通讯应用。 + +<b>超级安全</b> +真正的端到端加密(仅有那些在对话中的可以解密讯息)以及交叉签章装置验证。 + +<b>完整的通讯与整合</b> +信息传递、语音与视频通话、文件分享、画面分享与超多的整合、机器人与挂件。建构聊天室、社群、保持联络并完成工作。 + +<b>从上次离开的地方开始</b> +无论你身在何处,都可以透过在你所有设备与网页 https://app.element.io 间完全同步的信息历史保持联络 diff --git a/fastlane/metadata/android/zh-Hans/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/short_description.txt rename to fastlane/metadata/android/zh-CN/short_description.txt diff --git a/fastlane/metadata/android/zh-Hans/title.txt b/fastlane/metadata/android/zh-CN/title.txt similarity index 100% rename from fastlane/metadata/android/zh-Hans/title.txt rename to fastlane/metadata/android/zh-CN/title.txt diff --git a/fastlane/metadata/android/zh-Hans/full_description.txt b/fastlane/metadata/android/zh-Hans/full_description.txt deleted file mode 100644 index 4791c9652b..0000000000 --- a/fastlane/metadata/android/zh-Hans/full_description.txt +++ /dev/null @@ -1,30 +0,0 @@ -Element 是一种新型的通讯与协作应用: - -1. 使您可以掌控您的隐私 -2. 使您与 Matrix 网络中的任何人交流,甚至可以通过集成功能与如 Slack 之类的其他应用通讯 -3. 保护您免受广告,大数据挖掘和封闭服务的侵害 -4. 通过端到端加密保证安全,通过交叉签名验证其他人 - -Element 与其他通讯与协作应用完全不同,因为它是去中心化且开源的。 - -Element 允许您自托管——或者选择托管商——因此,您能拥有数据和会话的隐私权,所有权和控制权。它允许您访问开放网络;因此,您可以与 Element 用户以外的人交流。并且它非常安全。 - -Element 之所以可以做到这些,是因为它在 Matrix 上运行——开放,去中心化通讯的标准。 - -通过让您选择由谁来托管您的会话,Element 让您掌控一切。在 Element 应用中,您可以选择不同的托管方式: - -1. 在由 Matrix 开发者托管的 matrix.org 公共服务器上获取免费帐户,或从志愿者托管的上千个公共服务器中选择 -2. 在您自己的硬件上运行服务器,自托管您的会话 -3. 通过订阅 Element Matrix Services 托管平台,简单地在自定义服务器上注册账户 - -<b>为什么选择 Element?</b> - -<b>掌控您的数据</b>:您来决定存放您的数据和消息的位置。拥有并控制它的是您,而不是挖掘您的数据或与第三方分享的巨型企业。 - -<b>开放通讯与协作</b>:您可以与 Matrix 网络中的任何人聊天,不论他们使用 Element 还是其他 Matrix 应用,甚至/即使他们在使用不同的通讯系统,例如 Slack,IRC 或 XMPP。 - -<b>超级安全</b>:支持真正的端到端加密(仅有会话中的人可以解密消息),还有能够验证会话参与方的设备的交叉签名。 - -<b>完善的通讯方式</b>:消息,语音和视频通话,文件共享,屏幕共享和大量集成功能,机器人和小挂件。建立房间与社区,保持联系并完成工作。 - -<b>随时随地</b>:消息历史可在您的全部设备和 https://app.element.io 网页端之间完全同步,无论您在哪里,都可以保持联系。 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100100.txt b/fastlane/metadata/android/zh-TW/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40100100.txt rename to fastlane/metadata/android/zh-TW/changelogs/40100100.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100110.txt b/fastlane/metadata/android/zh-TW/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40100110.txt rename to fastlane/metadata/android/zh-TW/changelogs/40100110.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100120.txt b/fastlane/metadata/android/zh-TW/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40100120.txt rename to fastlane/metadata/android/zh-TW/changelogs/40100120.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100130.txt b/fastlane/metadata/android/zh-TW/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40100130.txt rename to fastlane/metadata/android/zh-TW/changelogs/40100130.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100140.txt b/fastlane/metadata/android/zh-TW/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40100140.txt rename to fastlane/metadata/android/zh-TW/changelogs/40100140.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100150.txt b/fastlane/metadata/android/zh-TW/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40100150.txt rename to fastlane/metadata/android/zh-TW/changelogs/40100150.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100160.txt b/fastlane/metadata/android/zh-TW/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40100160.txt rename to fastlane/metadata/android/zh-TW/changelogs/40100160.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100170.txt b/fastlane/metadata/android/zh-TW/changelogs/40100170.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40100170.txt rename to fastlane/metadata/android/zh-TW/changelogs/40100170.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101000.txt b/fastlane/metadata/android/zh-TW/changelogs/40101000.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40101000.txt rename to fastlane/metadata/android/zh-TW/changelogs/40101000.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101010.txt b/fastlane/metadata/android/zh-TW/changelogs/40101010.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40101010.txt rename to fastlane/metadata/android/zh-TW/changelogs/40101010.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101020.txt b/fastlane/metadata/android/zh-TW/changelogs/40101020.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40101020.txt rename to fastlane/metadata/android/zh-TW/changelogs/40101020.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101030.txt b/fastlane/metadata/android/zh-TW/changelogs/40101030.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40101030.txt rename to fastlane/metadata/android/zh-TW/changelogs/40101030.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101040.txt b/fastlane/metadata/android/zh-TW/changelogs/40101040.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40101040.txt rename to fastlane/metadata/android/zh-TW/changelogs/40101040.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101050.txt b/fastlane/metadata/android/zh-TW/changelogs/40101050.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40101050.txt rename to fastlane/metadata/android/zh-TW/changelogs/40101050.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101060.txt b/fastlane/metadata/android/zh-TW/changelogs/40101060.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/changelogs/40101060.txt rename to fastlane/metadata/android/zh-TW/changelogs/40101060.txt diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101070.txt b/fastlane/metadata/android/zh-TW/changelogs/40101070.txt new file mode 100644 index 0000000000..c62c7d5224 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40101070.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:對「空間」的測試版支援。傳送前壓縮影片。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101080.txt b/fastlane/metadata/android/zh-TW/changelogs/40101080.txt new file mode 100644 index 0000000000..4ed232fe70 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40101080.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:改善「空間」的功能。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101090.txt b/fastlane/metadata/android/zh-TW/changelogs/40101090.txt new file mode 100644 index 0000000000..84e46bdd76 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40101090.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:新增對 gitter.im 網路的支援。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/zh-Hant/full_description.txt b/fastlane/metadata/android/zh-TW/full_description.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/full_description.txt rename to fastlane/metadata/android/zh-TW/full_description.txt diff --git a/fastlane/metadata/android/zh-Hant/short_description.txt b/fastlane/metadata/android/zh-TW/short_description.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/short_description.txt rename to fastlane/metadata/android/zh-TW/short_description.txt diff --git a/fastlane/metadata/android/zh-Hant/title.txt b/fastlane/metadata/android/zh-TW/title.txt similarity index 100% rename from fastlane/metadata/android/zh-Hant/title.txt rename to fastlane/metadata/android/zh-TW/title.txt diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023..7454180f2a 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e1e2fd2c75..283500479a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=13bf8d3cf8eeeb5770d19741a59bde9bd966dd78d17f1bbad787a05ef19d1c2d -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip +distributionSha256Sum=a9e356a21595348b6f04b024ed0b08ac8aea6b2ac37e6c0ef58e51549cd7b9cb +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0c81..744e882ed5 100755 --- a/gradlew +++ b/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) diff --git a/library/ui-styles/.gitignore b/library/ui-styles/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/library/ui-styles/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/library/ui-styles/build.gradle b/library/ui-styles/build.gradle new file mode 100644 index 0000000000..47c4664636 --- /dev/null +++ b/library/ui-styles/build.gradle @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id 'com.android.library' + id 'kotlin-android' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + buildFeatures { + viewBinding true + } +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.3.0' + // Pref theme + implementation 'androidx.preference:preference-ktx:1.1.1' + // PFLockScreen attrs + implementation 'com.github.vector-im:PFLockScreen-Android:1.0.0-beta12' + // dialpad dimen + implementation 'im.dlg:android-dialer:1.2.5' +} \ No newline at end of file diff --git a/library/ui-styles/src/debug/AndroidManifest.xml b/library/ui-styles/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..e32676136d --- /dev/null +++ b/library/ui-styles/src/debug/AndroidManifest.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="im.vector.lib.ui.styles"> + + <application android:theme="@style/Theme.Vector.Light"> + <activity + android:name=".debug.DebugMaterialThemeLightDefaultActivity" + android:theme="@style/Theme.Debug.Light" /> + <activity + android:name=".debug.DebugMaterialThemeLightTestActivity" + android:theme="@style/Theme.Debug.Light.Test" /> + <activity + android:name=".debug.DebugMaterialThemeLightVectorActivity" + android:theme="@style/Theme.Vector.Light" /> + <activity + android:name=".debug.DebugMaterialThemeDarkDefaultActivity" + android:theme="@style/Theme.Debug.Dark" /> + <activity + android:name=".debug.DebugMaterialThemeDarkTestActivity" + android:theme="@style/Theme.Debug.Dark.Test" /> + <activity + android:name=".debug.DebugMaterialThemeDarkVectorActivity" + android:theme="@style/Theme.Vector.Dark" /> + + <activity + android:name=".debug.DebugVectorButtonStylesLightActivity" + android:theme="@style/Theme.Vector.Light" /> + <activity + android:name=".debug.DebugVectorButtonStylesDarkActivity" + android:theme="@style/Theme.Vector.Dark" /> + + <activity + android:name=".debug.DebugVectorTextViewLightActivity" + android:theme="@style/Theme.Vector.Light" /> + <activity + android:name=".debug.DebugVectorTextViewDarkActivity" + android:theme="@style/Theme.Vector.Dark" /> + </application> + +</manifest> diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugBottomSheet.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugBottomSheet.kt similarity index 83% rename from vector/src/debug/java/im/vector/app/features/debug/DebugBottomSheet.kt rename to library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugBottomSheet.kt index 0ac9a894ae..9998fd661f 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugBottomSheet.kt +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugBottomSheet.kt @@ -14,19 +14,19 @@ * limitations under the License. */ -package im.vector.app.features.debug +package im.vector.lib.ui.styles.debug import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import im.vector.app.databinding.ActivityTestMaterialThemeBinding +import im.vector.lib.ui.styles.databinding.ActivityDebugMaterialThemeBinding class DebugBottomSheet : BottomSheetDialogFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { // Reuse tha Activity layout - val binding = ActivityTestMaterialThemeBinding.inflate(inflater, container, false) + val binding = ActivityDebugMaterialThemeBinding.inflate(inflater, container, false) return binding.root } } diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt new file mode 100644 index 0000000000..553d495e22 --- /dev/null +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.debug + +import android.os.Bundle +import android.view.Menu +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar +import im.vector.lib.ui.styles.R +import im.vector.lib.ui.styles.databinding.ActivityDebugMaterialThemeBinding +import im.vector.lib.ui.styles.dialogs.MaterialProgressDialog + +// Rendering is not the same with VectorBaseActivity +abstract class DebugMaterialThemeActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val views = ActivityDebugMaterialThemeBinding.inflate(layoutInflater) + setContentView(views.root) + + setSupportActionBar(views.debugToolbar) + supportActionBar?.let { + it.setDisplayShowHomeEnabled(true) + it.setDisplayHomeAsUpEnabled(true) + } + + views.debugShowSnackbar.setOnClickListener { + Snackbar.make(views.coordinatorLayout, "Snackbar!", Snackbar.LENGTH_SHORT) + .setAction("Action") { } + .show() + } + + views.debugShowToast.setOnClickListener { + Toast.makeText(this, "Toast", Toast.LENGTH_SHORT).show() + } + + views.debugShowDialog.setOnClickListener { + showTestDialog(0) + } + + views.debugShowDialogDestructive.setOnClickListener { + showTestDialog(R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) + } + + views.debugShowDialogNegativeDestructive.setOnClickListener { + showTestDialog(R.style.ThemeOverlay_Vector_MaterialAlertDialog_NegativeDestructive) + } + + views.debugShowProgressDialog.setOnClickListener { + MaterialProgressDialog(this) + .show(message = "Progress Dialog\nLine 2", cancellable = true) + } + + views.debugShowBottomSheet.setOnClickListener { + DebugBottomSheet().show(supportFragmentManager, "TAG") + } + } + + private fun showTestDialog(theme: Int) { + MaterialAlertDialogBuilder(this, theme) + .setTitle("Dialog title") + .setMessage("Dialog content\nLine 2") + .setIcon(R.drawable.ic_debug_icon) + .setPositiveButton("Positive", null) + .setNegativeButton("Negative", null) + .setNeutralButton("Neutral", null) + .show() + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_debug, menu) + return true + } +} diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkDefaultActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkDefaultActivity.kt similarity index 89% rename from vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkDefaultActivity.kt rename to library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkDefaultActivity.kt index 7e014577de..d24ceb6ede 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkDefaultActivity.kt +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkDefaultActivity.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019 New Vector Ltd + * Copyright (c) 2021 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,6 @@ * limitations under the License. */ -package im.vector.app.features.debug +package im.vector.lib.ui.styles.debug class DebugMaterialThemeDarkDefaultActivity : DebugMaterialThemeActivity() diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkTestActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkTestActivity.kt similarity index 89% rename from vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkTestActivity.kt rename to library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkTestActivity.kt index 4a1ed04f6a..fea1f27dae 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkTestActivity.kt +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkTestActivity.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019 New Vector Ltd + * Copyright (c) 2021 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,6 @@ * limitations under the License. */ -package im.vector.app.features.debug +package im.vector.lib.ui.styles.debug class DebugMaterialThemeDarkTestActivity : DebugMaterialThemeActivity() diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkVectorActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkVectorActivity.kt similarity index 89% rename from vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkVectorActivity.kt rename to library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkVectorActivity.kt index 6ac27aed45..379d55d006 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeDarkVectorActivity.kt +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkVectorActivity.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019 New Vector Ltd + * Copyright (c) 2021 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,6 @@ * limitations under the License. */ -package im.vector.app.features.debug +package im.vector.lib.ui.styles.debug class DebugMaterialThemeDarkVectorActivity : DebugMaterialThemeActivity() diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightDefaultActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightDefaultActivity.kt similarity index 89% rename from vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightDefaultActivity.kt rename to library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightDefaultActivity.kt index f6327e363b..57f172bdc3 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightDefaultActivity.kt +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightDefaultActivity.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019 New Vector Ltd + * Copyright (c) 2021 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,6 @@ * limitations under the License. */ -package im.vector.app.features.debug +package im.vector.lib.ui.styles.debug class DebugMaterialThemeLightDefaultActivity : DebugMaterialThemeActivity() diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightTestActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightTestActivity.kt similarity index 89% rename from vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightTestActivity.kt rename to library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightTestActivity.kt index ae6c1dd68c..d3a6c757fb 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightTestActivity.kt +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightTestActivity.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019 New Vector Ltd + * Copyright (c) 2021 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,6 @@ * limitations under the License. */ -package im.vector.app.features.debug +package im.vector.lib.ui.styles.debug class DebugMaterialThemeLightTestActivity : DebugMaterialThemeActivity() diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightVectorActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightVectorActivity.kt similarity index 89% rename from vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightVectorActivity.kt rename to library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightVectorActivity.kt index b4fb3c1cc8..3fafa61421 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeLightVectorActivity.kt +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightVectorActivity.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019 New Vector Ltd + * Copyright (c) 2021 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,6 @@ * limitations under the License. */ -package im.vector.app.features.debug +package im.vector.lib.ui.styles.debug class DebugMaterialThemeLightVectorActivity : DebugMaterialThemeActivity() diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesActivity.kt new file mode 100644 index 0000000000..50d1e344e9 --- /dev/null +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesActivity.kt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.debug + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import im.vector.lib.ui.styles.databinding.ActivityDebugButtonStylesBinding + +abstract class DebugVectorButtonStylesActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val views = ActivityDebugButtonStylesBinding.inflate(layoutInflater) + setContentView(views.root) + } +} diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesDarkActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesDarkActivity.kt new file mode 100644 index 0000000000..102ca53f3c --- /dev/null +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesDarkActivity.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.debug + +class DebugVectorButtonStylesDarkActivity : DebugVectorButtonStylesActivity() diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesLightActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesLightActivity.kt new file mode 100644 index 0000000000..c1b01dc6a3 --- /dev/null +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesLightActivity.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.debug + +class DebugVectorButtonStylesLightActivity : DebugVectorButtonStylesActivity() diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt new file mode 100644 index 0000000000..db50500195 --- /dev/null +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.debug + +import android.os.Bundle +import android.text.InputType +import android.widget.EditText +import androidx.appcompat.app.AppCompatActivity +import im.vector.lib.ui.styles.databinding.ActivityDebugTextViewBinding + +// Rendering is not the same with VectorBaseActivity +abstract class DebugVectorTextViewActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val views = ActivityDebugTextViewBinding.inflate(layoutInflater) + setContentView(views.root) + + views.debugShowPassword.setOnClickListener { + views.debugTextInputEditText.showPassword(true) + } + views.debugHidePassword.setOnClickListener { + views.debugTextInputEditText.showPassword(false) + } + } + + private fun EditText.showPassword(visible: Boolean) { + if (visible) { + inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + } else { + inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + } + } +} diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewDarkActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewDarkActivity.kt new file mode 100644 index 0000000000..2d95056fef --- /dev/null +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewDarkActivity.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.debug + +class DebugVectorTextViewDarkActivity : DebugVectorTextViewActivity() diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewLightActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewLightActivity.kt new file mode 100644 index 0000000000..33e4a0f075 --- /dev/null +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewLightActivity.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.debug + +class DebugVectorTextViewLightActivity : DebugVectorTextViewActivity() diff --git a/library/ui-styles/src/debug/res/drawable/ic_debug_icon.xml b/library/ui-styles/src/debug/res/drawable/ic_debug_icon.xml new file mode 100644 index 0000000000..08af7d6539 --- /dev/null +++ b/library/ui-styles/src/debug/res/drawable/ic_debug_icon.xml @@ -0,0 +1,22 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> + <path + android:pathData="M10,10m-2.455,0a2.455,2.455 0,1 1,4.91 0a2.455,2.455 0,1 1,-4.91 0" + android:strokeLineJoin="round" + android:strokeWidth="1.2" + android:fillColor="#00000000" + android:fillType="evenOdd" + android:strokeColor="#454545" + android:strokeLineCap="round"/> + <path + android:pathData="M16.055,12.455a1.35,1.35 0,0 0,0.27 1.489l0.049,0.049a1.636,1.636 0,1 1,-2.316 2.315l-0.049,-0.049a1.35,1.35 0,0 0,-1.489 -0.27,1.35 1.35,0 0,0 -0.818,1.236v0.139a1.636,1.636 0,0 1,-3.273 0v-0.074a1.35,1.35 0,0 0,-0.884 -1.235,1.35 1.35,0 0,0 -1.489,0.27l-0.049,0.049a1.636,1.636 0,1 1,-2.315 -2.316l0.049,-0.049a1.35,1.35 0,0 0,0.27 -1.489,1.35 1.35,0 0,0 -1.236,-0.818h-0.139a1.636,1.636 0,0 1,0 -3.273h0.074a1.35,1.35 0,0 0,1.235 -0.884,1.35 1.35,0 0,0 -0.27,-1.489l-0.049,-0.049a1.636,1.636 0,1 1,2.316 -2.315l0.049,0.049a1.35,1.35 0,0 0,1.489 0.27h0.065a1.35,1.35 0,0 0,0.819 -1.236v-0.139a1.636,1.636 0,0 1,3.272 0v0.074a1.35,1.35 0,0 0,0.819 1.235,1.35 1.35,0 0,0 1.489,-0.27l0.049,-0.049a1.636,1.636 0,1 1,2.315 2.316l-0.049,0.049a1.35,1.35 0,0 0,-0.27 1.489v0.065a1.35,1.35 0,0 0,1.236 0.819h0.139a1.636,1.636 0,0 1,0 3.272h-0.074a1.35,1.35 0,0 0,-1.235 0.819z" + android:strokeLineJoin="round" + android:strokeWidth="1.2" + android:fillColor="#00000000" + android:fillType="evenOdd" + android:strokeColor="#454545" + android:strokeLineCap="round"/> +</vector> diff --git a/vector/src/debug/res/drawable/linear_divider.xml b/library/ui-styles/src/debug/res/drawable/linear_divider.xml similarity index 100% rename from vector/src/debug/res/drawable/linear_divider.xml rename to library/ui-styles/src/debug/res/drawable/linear_divider.xml diff --git a/vector/src/debug/res/layout/activity_debug_button_styles.xml b/library/ui-styles/src/debug/res/layout/activity_debug_button_styles.xml similarity index 74% rename from vector/src/debug/res/layout/activity_debug_button_styles.xml rename to library/ui-styles/src/debug/res/layout/activity_debug_button_styles.xml index 3973f7cbb6..0f129fb406 100644 --- a/vector/src/debug/res/layout/activity_debug_button_styles.xml +++ b/library/ui-styles/src/debug/res/layout/activity_debug_button_styles.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".features.debug.DebugVectorButtonStylesActivity" + tools:context=".debug.DebugVectorButtonStylesActivity" tools:ignore="HardcodedText"> <LinearLayout @@ -12,93 +12,100 @@ android:orientation="vertical" android:padding="16dp"> + <!-- Note: Default style is @style/Widget.Vector.Button in the theme --> <Button - style="@style/VectorButtonStyle" + style="@style/Widget.Vector.Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Default" /> <Button - style="@style/VectorButtonStyle" + style="@style/Widget.Vector.Button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Line1\nLine 2" /> + + <Button + style="@style/Widget.Vector.Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="Default disabled" /> <Button - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Text" /> <Button - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="Text disabled" /> <Button - style="@style/VectorButtonStyle.Positive" + style="@style/Widget.Vector.Button.Positive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Positive" /> <Button - style="@style/VectorButtonStyle.Positive" + style="@style/Widget.Vector.Button.Positive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="Positive disabled" /> <Button - style="@style/VectorButtonStyle.Destructive" + style="@style/Widget.Vector.Button.Destructive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Destructive" /> <Button - style="@style/VectorButtonStyle.Destructive" + style="@style/Widget.Vector.Button.Destructive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="Destructive disabled" /> <Button - style="@style/VectorButtonStyleUnelevated.Bot" + style="@style/Widget.Vector.Button.Unelevated.Bot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Bot" /> <Button - style="@style/VectorButtonStyleUnelevated.Bot" + style="@style/Widget.Vector.Button.Unelevated.Bot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="Bot disabled" /> <Button - style="@style/VectorButtonStyleOutlined" + style="@style/Widget.Vector.Button.Outlined" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="Outline" /> <Button - style="@style/VectorButtonStyleOutlined" + style="@style/Widget.Vector.Button.Outlined" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="Outline disabled" /> <Button - style="@style/VectorButtonStyleOutlined.Poll" + style="@style/Widget.Vector.Button.Outlined.Poll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Poll " /> <Button - style="@style/VectorButtonStyleOutlined.Poll" + style="@style/Widget.Vector.Button.Outlined.Poll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" @@ -112,14 +119,14 @@ android:padding="8dp"> <Button - style="@style/AlerterButton" + style="@style/Widget.Vector.Button.Text.Alerter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="Alerter" /> <Button - style="@style/AlerterButton" + style="@style/Widget.Vector.Button.Text.Alerter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" diff --git a/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml b/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml new file mode 100644 index 0000000000..4828810e34 --- /dev/null +++ b/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml @@ -0,0 +1,525 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/coordinatorLayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".debug.DebugMaterialThemeActivity" + tools:ignore="HardcodedText,MissingPrefix"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/debug_toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + app:subtitle="Toolbar Subtitle" + app:title="Toolbar Title" /> + + </com.google.android.material.appbar.AppBarLayout> + + <androidx.core.widget.NestedScrollView + android:layout_width="match_parent" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:divider="@drawable/linear_divider" + android:orientation="vertical" + android:padding="16dp" + android:showDividers="middle"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:baselineAligned="false" + android:divider="@drawable/linear_divider" + android:showDividers="middle"> + + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="#FFFFFF" + android:divider="@drawable/linear_divider" + android:orientation="vertical" + android:padding="8dp" + android:showDividers="middle"> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorPrimary" + android:text="colorPrimary" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorPrimaryVariant" + android:text="colorPrimaryVariant" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorOnPrimary" + android:text="colorOnPrimary" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorSecondary" + android:text="colorSecondary" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorSecondaryVariant" + android:text="colorSecondaryVariant" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorOnSecondary" + android:text="colorOnSecondary" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorError" + android:text="colorError" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorOnError" + android:text="colorOnError" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorSurface" + android:text="colorSurface" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorOnSurface" + android:text="colorOnSurface" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?android:colorBackground" + android:text="android:colorBackground" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorOnBackground" + android:text="colorOnBackground" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?colorAccent" + android:text="colorAccent" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?android:statusBarColor" + android:text="android:statusBarColor" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?android:navigationBarColor" + android:text="android:navigationBarColor" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?android:textColorPrimary" + android:text="android:textColorPrimary" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?android:textColorSecondary" + android:text="android:textColorSecondary" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?android:textColorTertiary" + android:text="android:textColorTertiary" /> + + <TextView + style="@style/DebugTextColorDemo.White" + android:background="?android:textColorLink" + android:text="android:textColorLink" /> + + </LinearLayout> + + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="#000000" + android:divider="@drawable/linear_divider" + android:dividerPadding="8dp" + android:orientation="vertical" + android:padding="8dp" + android:showDividers="middle"> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorPrimary" + android:text="colorPrimary" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorPrimaryVariant" + android:text="colorPrimaryVariant" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorOnPrimary" + android:text="colorOnPrimary" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorSecondary" + android:text="colorSecondary" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorSecondaryVariant" + android:text="colorSecondaryVariant" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorOnSecondary" + android:text="colorOnSecondary" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorError" + android:text="colorError" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorOnError" + android:text="colorOnError" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorSurface" + android:text="colorSurface" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorOnSurface" + android:text="colorOnSurface" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?android:colorBackground" + android:text="android:colorBackground" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorOnBackground" + android:text="colorOnBackground" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?colorAccent" + android:text="colorAccent" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?android:statusBarColor" + android:text="android:statusBarColor" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?android:navigationBarColor" + android:text="android:navigationBarColor" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?android:textColorPrimary" + android:text="android:textColorPrimary" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?android:textColorSecondary" + android:text="android:textColorSecondary" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?android:textColorTertiary" + android:text="android:textColorTertiary" /> + + <TextView + style="@style/DebugTextColorDemo.Black" + android:background="?android:textColorLink" + android:text="android:textColorLink" /> + + </LinearLayout> + + </LinearLayout> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?android:colorBackground" + android:padding="8dp" + android:text="Background" + android:textColor="?colorOnBackground" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?colorPrimary" + android:padding="8dp" + android:text="Primary" + android:textColor="?colorOnPrimary" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?colorSecondary" + android:padding="8dp" + android:text="Secondary" + android:textColor="?colorOnSecondary" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?colorError" + android:padding="8dp" + android:text="Error" + android:textColor="?colorOnError" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?colorSurface" + android:padding="8dp" + android:text="Surface" + android:textColor="?colorOnSurface" /> + + <com.google.android.material.textfield.TextInputLayout + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="OutlinedBox"> + + <com.google.android.material.textfield.TextInputEditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:maxLines="1" /> + + </com.google.android.material.textfield.TextInputLayout> + + <com.google.android.material.textfield.TextInputLayout + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="OutlinedBox.Dense"> + + <com.google.android.material.textfield.TextInputEditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:maxLines="1" /> + + </com.google.android.material.textfield.TextInputLayout> + + + <com.google.android.material.textfield.TextInputLayout + style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="FilledBox"> + + <com.google.android.material.textfield.TextInputEditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:maxLines="1" /> + + </com.google.android.material.textfield.TextInputLayout> + + <com.google.android.material.textfield.TextInputLayout + style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="FilledBox.Dense"> + + <com.google.android.material.textfield.TextInputEditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:maxLines="1" /> + + </com.google.android.material.textfield.TextInputLayout> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Buttons" /> + + <Button + style="@style/Widget.MaterialComponents.Button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Classic" + app:icon="@drawable/ic_debug_icon" /> + + <Button + style="@style/Widget.MaterialComponents.Button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:enabled="false" + android:text="Classic Disabled" + app:icon="@drawable/ic_debug_icon" /> + + <Button + style="@style/Widget.MaterialComponents.Button.OutlinedButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="OutlinedButton" + app:icon="@drawable/ic_debug_icon" /> + + <Button + style="@style/Widget.MaterialComponents.Button.OutlinedButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:enabled="false" + android:text="OutlinedButton Disabled" + app:icon="@drawable/ic_debug_icon" /> + + <Button + style="@style/Widget.MaterialComponents.Button.TextButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextButton" + app:icon="@drawable/ic_debug_icon" /> + + <Button + style="@style/Widget.MaterialComponents.Button.TextButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:enabled="false" + android:text="TextButton Disabled" + app:icon="@drawable/ic_debug_icon" /> + + <Button + style="@style/Widget.MaterialComponents.Button.UnelevatedButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="UnelevatedButton" + app:icon="@drawable/ic_debug_icon" /> + + <Button + style="@style/Widget.MaterialComponents.Button.UnelevatedButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:enabled="false" + android:text="UnelevatedButton Disabled" + app:icon="@drawable/ic_debug_icon" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Actions" /> + + <Button + android:id="@+id/debugShowSnackbar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="Show Snackbar" /> + + <Button + android:id="@+id/debugShowToast" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="Show Toast" /> + + <Button + android:id="@+id/debugShowDialog" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="Show Dialog" /> + + <Button + android:id="@+id/debugShowDialogDestructive" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="Show Dialog Destructive" /> + + <Button + android:id="@+id/debugShowDialogNegativeDestructive" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="Show Dialog Neg Destructive" /> + + <Button + android:id="@+id/debugShowProgressDialog" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="Show Progress Dialog" /> + + <Button + android:id="@+id/debugShowBottomSheet" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="Show Bottom Sheet" /> + + <CheckBox + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Material CheckBox" /> + + <com.google.android.material.switchmaterial.SwitchMaterial + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Material Switch" /> + + <com.google.android.material.card.MaterialCardView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="48dp" + android:text="TextView in MaterialCardView" /> + + </com.google.android.material.card.MaterialCardView> + + <com.google.android.material.floatingactionbutton.FloatingActionButton + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_margin="16dp" + android:importantForAccessibility="no" + android:src="@drawable/ic_debug_icon" /> + + <com.google.android.material.bottomnavigation.BottomNavigationView + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:menu="@menu/menu_debug" /> + + </LinearLayout> + + </androidx.core.widget.NestedScrollView> + + </androidx.constraintlayout.widget.ConstraintLayout> + +</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml b/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml new file mode 100644 index 0000000000..1b38f04b97 --- /dev/null +++ b/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:padding="16dp" + tools:ignore="HardcodedText"> + + <TextView + style="@style/Widget.Vector.TextView.Title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Title\nline 2" /> + + <TextView + style="@style/Widget.Vector.TextView.Title.Medium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Title.Medium\nline 2" /> + + <TextView + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Headline.Medium\nline 2" /> + + <TextView + style="@style/Widget.Vector.TextView.Subtitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Subtitle\nline 2" /> + + <TextView + style="@style/Widget.Vector.TextView.Subtitle.Medium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Subtitle.Medium\nline 2" /> + + <TextView + style="@style/Widget.Vector.TextView.Body" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Body\nline 2" /> + + <TextView + style="@style/Widget.Vector.TextView.Body.Medium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Body.Medium\nline 2" /> + + <TextView + style="@style/Widget.Vector.TextView.Caption" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Caption\nline 2" /> + + <TextView + style="@style/Widget.Vector.TextView.Micro" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextAppearance.Vector.Micro\nline 2" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Default (TextAppearance.Vector.Body)\nline 2" /> + + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/debugTextInputLayout" + style="@style/Widget.Vector.TextInputLayout.Password" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:hint="Password" + app:errorEnabled="true"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/debugTextInputEditText" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="textPassword" + android:maxLines="1" /> + + </com.google.android.material.textfield.TextInputLayout> + + <Button + android:id="@+id/debugShowPassword" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Show password" /> + + <Button + android:id="@+id/debugHidePassword" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Hide password" /> + +</LinearLayout> \ No newline at end of file diff --git a/library/ui-styles/src/debug/res/menu/menu_debug.xml b/library/ui-styles/src/debug/res/menu/menu_debug.xml new file mode 100644 index 0000000000..c58a29db8f --- /dev/null +++ b/library/ui-styles/src/debug/res/menu/menu_debug.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:ignore="HardcodedText"> + + <item + android:id="@+id/menuDebug1" + android:icon="@drawable/ic_debug_icon" + android:title="Edit" + app:showAsAction="never" /> + + <item + android:id="@+id/menuDebug2" + android:icon="@drawable/ic_debug_icon" + android:title="Send" + app:showAsAction="always" /> + +</menu> \ No newline at end of file diff --git a/vector/src/debug/res/values/styles.xml b/library/ui-styles/src/debug/res/values/debug_styles.xml similarity index 89% rename from vector/src/debug/res/values/styles.xml rename to library/ui-styles/src/debug/res/values/debug_styles.xml index 090de4dd4b..d025ba1784 100644 --- a/vector/src/debug/res/values/styles.xml +++ b/library/ui-styles/src/debug/res/values/debug_styles.xml @@ -6,11 +6,11 @@ </style> - <style name="VectorMaterialThemeDebugLight" parent="Theme.MaterialComponents.Light.NoActionBar"> + <style name="Theme.Debug.Light" parent="Theme.MaterialComponents.Light.NoActionBar"> <!-- Keep all default value --> </style> - <style name="VectorMaterialThemeDebugLight.Test"> + <style name="Theme.Debug.Light.Test"> <item name="colorPrimary">#7F7F00</item> <item name="colorPrimaryVariant">#00FF00</item> <item name="colorOnPrimary">#0000FF</item> @@ -34,11 +34,11 @@ <item name="android:textColorLink">#000FFF</item> </style> - <style name="VectorMaterialThemeDebugDark" parent="Theme.MaterialComponents.NoActionBar"> + <style name="Theme.Debug.Dark" parent="Theme.MaterialComponents.NoActionBar"> <!-- Keep all default value --> </style> - <style name="VectorMaterialThemeDebugDark.Test"> + <style name="Theme.Debug.Dark.Test"> <item name="colorPrimary">#7F7F00</item> <item name="colorPrimaryVariant">#00FF00</item> <item name="colorOnPrimary">#0000FF</item> diff --git a/library/ui-styles/src/main/AndroidManifest.xml b/library/ui-styles/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..19aa89e2e7 --- /dev/null +++ b/library/ui-styles/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest package="im.vector.lib.ui.styles"/> \ No newline at end of file diff --git a/library/ui-styles/src/main/java/MaterialProgressDialog.kt b/library/ui-styles/src/main/java/MaterialProgressDialog.kt new file mode 100644 index 0000000000..9523c5c19c --- /dev/null +++ b/library/ui-styles/src/main/java/MaterialProgressDialog.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.dialogs + +import android.content.Context +import android.view.LayoutInflater +import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import im.vector.lib.ui.styles.R +import im.vector.lib.ui.styles.databinding.DialogProgressMaterialBinding + +class MaterialProgressDialog(val context: Context) { + fun show(message: CharSequence, cancellable: Boolean = false): AlertDialog { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_progress_material, null) + val views = DialogProgressMaterialBinding.bind(view) + views.message.text = message + + return MaterialAlertDialogBuilder(context) + .setCancelable(cancellable) + .setView(view) + .show() + } +} diff --git a/vector/src/main/res/color/bottom_navigation_icon_tint_selector.xml b/library/ui-styles/src/main/res/color/bottom_navigation_icon_tint_selector.xml similarity index 78% rename from vector/src/main/res/color/bottom_navigation_icon_tint_selector.xml rename to library/ui-styles/src/main/res/color/bottom_navigation_icon_tint_selector.xml index a6cf578295..403ed865e7 100644 --- a/vector/src/main/res/color/bottom_navigation_icon_tint_selector.xml +++ b/library/ui-styles/src/main/res/color/bottom_navigation_icon_tint_selector.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="?colorPrimary" android:state_checked="true" /> - <item android:color="?vctr_content_secondary" /> + <item android:color="?vctr_content_tertiary" /> </selector> \ No newline at end of file diff --git a/vector/src/main/res/color/button_background_tint_selector.xml b/library/ui-styles/src/main/res/color/button_background_tint_selector.xml similarity index 100% rename from vector/src/main/res/color/button_background_tint_selector.xml rename to library/ui-styles/src/main/res/color/button_background_tint_selector.xml diff --git a/vector/src/main/res/color/button_social_google_background_selector_dark.xml b/library/ui-styles/src/main/res/color/button_social_google_background_selector_dark.xml similarity index 100% rename from vector/src/main/res/color/button_social_google_background_selector_dark.xml rename to library/ui-styles/src/main/res/color/button_social_google_background_selector_dark.xml diff --git a/vector/src/main/res/color/button_social_google_background_selector_light.xml b/library/ui-styles/src/main/res/color/button_social_google_background_selector_light.xml similarity index 100% rename from vector/src/main/res/color/button_social_google_background_selector_light.xml rename to library/ui-styles/src/main/res/color/button_social_google_background_selector_light.xml diff --git a/vector/src/main/res/color/color_primary_alpha25.xml b/library/ui-styles/src/main/res/color/color_primary_alpha25.xml similarity index 100% rename from vector/src/main/res/color/color_primary_alpha25.xml rename to library/ui-styles/src/main/res/color/color_primary_alpha25.xml diff --git a/vector/src/main/res/drawable-hdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-hdpi/element_splash_white.png similarity index 100% rename from vector/src/main/res/drawable-hdpi/riot_splash_white.png rename to library/ui-styles/src/main/res/drawable-hdpi/element_splash_white.png diff --git a/vector/src/main/res/drawable-mdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-mdpi/element_splash_white.png similarity index 100% rename from vector/src/main/res/drawable-mdpi/riot_splash_white.png rename to library/ui-styles/src/main/res/drawable-mdpi/element_splash_white.png diff --git a/vector/src/main/res/drawable-xhdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-xhdpi/element_splash_white.png similarity index 100% rename from vector/src/main/res/drawable-xhdpi/riot_splash_white.png rename to library/ui-styles/src/main/res/drawable-xhdpi/element_splash_white.png diff --git a/vector/src/main/res/drawable-xxhdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-xxhdpi/element_splash_white.png similarity index 100% rename from vector/src/main/res/drawable-xxhdpi/riot_splash_white.png rename to library/ui-styles/src/main/res/drawable-xxhdpi/element_splash_white.png diff --git a/vector/src/main/res/drawable-xxxhdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-xxxhdpi/element_splash_white.png similarity index 100% rename from vector/src/main/res/drawable-xxxhdpi/riot_splash_white.png rename to library/ui-styles/src/main/res/drawable-xxxhdpi/element_splash_white.png diff --git a/library/ui-styles/src/main/res/drawable/bg_bottom_navigation.xml b/library/ui-styles/src/main/res/drawable/bg_bottom_navigation.xml new file mode 100644 index 0000000000..3011da0026 --- /dev/null +++ b/library/ui-styles/src/main/res/drawable/bg_bottom_navigation.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + + <solid android:color="?vctr_toolbar_background"/> + +</shape> \ No newline at end of file diff --git a/vector/src/main/res/drawable/bg_pin_key.xml b/library/ui-styles/src/main/res/drawable/bg_pin_key.xml similarity index 100% rename from vector/src/main/res/drawable/bg_pin_key.xml rename to library/ui-styles/src/main/res/drawable/bg_pin_key.xml diff --git a/vector/src/main/res/drawable/element_logo_green.xml b/library/ui-styles/src/main/res/drawable/element_logo_green.xml similarity index 100% rename from vector/src/main/res/drawable/element_logo_green.xml rename to library/ui-styles/src/main/res/drawable/element_logo_green.xml diff --git a/vector/src/main/res/drawable/file_progress_bar.xml b/library/ui-styles/src/main/res/drawable/file_progress_bar.xml similarity index 100% rename from vector/src/main/res/drawable/file_progress_bar.xml rename to library/ui-styles/src/main/res/drawable/file_progress_bar.xml diff --git a/vector/src/main/res/drawable/ic_search.xml b/library/ui-styles/src/main/res/drawable/ic_search.xml similarity index 100% rename from vector/src/main/res/drawable/ic_search.xml rename to library/ui-styles/src/main/res/drawable/ic_search.xml diff --git a/vector/src/main/res/drawable/ic_social_apple.xml b/library/ui-styles/src/main/res/drawable/ic_social_apple.xml similarity index 100% rename from vector/src/main/res/drawable/ic_social_apple.xml rename to library/ui-styles/src/main/res/drawable/ic_social_apple.xml diff --git a/vector/src/main/res/drawable/ic_social_facebook.xml b/library/ui-styles/src/main/res/drawable/ic_social_facebook.xml similarity index 100% rename from vector/src/main/res/drawable/ic_social_facebook.xml rename to library/ui-styles/src/main/res/drawable/ic_social_facebook.xml diff --git a/vector/src/main/res/drawable/ic_social_github.xml b/library/ui-styles/src/main/res/drawable/ic_social_github.xml similarity index 100% rename from vector/src/main/res/drawable/ic_social_github.xml rename to library/ui-styles/src/main/res/drawable/ic_social_github.xml diff --git a/vector/src/main/res/drawable/ic_social_gitlab.xml b/library/ui-styles/src/main/res/drawable/ic_social_gitlab.xml similarity index 100% rename from vector/src/main/res/drawable/ic_social_gitlab.xml rename to library/ui-styles/src/main/res/drawable/ic_social_gitlab.xml diff --git a/vector/src/main/res/drawable/ic_social_google.xml b/library/ui-styles/src/main/res/drawable/ic_social_google.xml similarity index 100% rename from vector/src/main/res/drawable/ic_social_google.xml rename to library/ui-styles/src/main/res/drawable/ic_social_google.xml diff --git a/vector/src/main/res/drawable/ic_social_twitter.xml b/library/ui-styles/src/main/res/drawable/ic_social_twitter.xml similarity index 100% rename from vector/src/main/res/drawable/ic_social_twitter.xml rename to library/ui-styles/src/main/res/drawable/ic_social_twitter.xml diff --git a/vector/src/main/res/drawable/ic_x_gray.xml b/library/ui-styles/src/main/res/drawable/ic_x_gray.xml similarity index 100% rename from vector/src/main/res/drawable/ic_x_gray.xml rename to library/ui-styles/src/main/res/drawable/ic_x_gray.xml diff --git a/vector/src/main/res/drawable/pin_code_dot_empty.xml b/library/ui-styles/src/main/res/drawable/pin_code_dot_empty.xml similarity index 100% rename from vector/src/main/res/drawable/pin_code_dot_empty.xml rename to library/ui-styles/src/main/res/drawable/pin_code_dot_empty.xml diff --git a/vector/src/main/res/drawable/pin_code_dot_fill.xml b/library/ui-styles/src/main/res/drawable/pin_code_dot_fill.xml similarity index 100% rename from vector/src/main/res/drawable/pin_code_dot_fill.xml rename to library/ui-styles/src/main/res/drawable/pin_code_dot_fill.xml diff --git a/vector/src/main/res/drawable/pin_code_dots.xml b/library/ui-styles/src/main/res/drawable/pin_code_dots.xml similarity index 100% rename from vector/src/main/res/drawable/pin_code_dots.xml rename to library/ui-styles/src/main/res/drawable/pin_code_dots.xml diff --git a/vector/src/main/res/drawable/splash.xml b/library/ui-styles/src/main/res/drawable/splash.xml similarity index 88% rename from vector/src/main/res/drawable/splash.xml rename to library/ui-styles/src/main/res/drawable/splash.xml index d711ca3440..067688fd79 100644 --- a/vector/src/main/res/drawable/splash.xml +++ b/library/ui-styles/src/main/res/drawable/splash.xml @@ -10,7 +10,7 @@ <item> <bitmap android:gravity="center" - android:src="@drawable/riot_splash_white" /> + android:src="@drawable/element_splash_white" /> </item> </layer-list> \ No newline at end of file diff --git a/vector/src/main/res/drawable/vector_label_background.xml b/library/ui-styles/src/main/res/drawable/vector_label_background.xml similarity index 100% rename from vector/src/main/res/drawable/vector_label_background.xml rename to library/ui-styles/src/main/res/drawable/vector_label_background.xml diff --git a/library/ui-styles/src/main/res/layout/dialog_progress_material.xml b/library/ui-styles/src/main/res/layout/dialog_progress_material.xml new file mode 100644 index 0000000000..09c88cc50b --- /dev/null +++ b/library/ui-styles/src/main/res/layout/dialog_progress_material.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <!-- Inspired from https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/layout/progress_dialog.xml --> + <LinearLayout + android:id="@+id/body" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:baselineAligned="false" + android:orientation="horizontal" + android:paddingStart="8dp" + android:paddingTop="10dp" + android:paddingEnd="8dp" + android:paddingBottom="10dp"> + + <ProgressBar + android:id="@android:id/progress" + style="?android:attr/progressBarStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="12dp" + android:max="10000" /> + + <TextView + android:id="@+id/message" + style="@style/Widget.Vector.TextView.Body" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + tools:text="Content\nLine 2" /> + + </LinearLayout> + +</FrameLayout> \ No newline at end of file diff --git a/vector/src/main/res/transition/image_preview_transition.xml b/library/ui-styles/src/main/res/transition/image_preview_transition.xml similarity index 100% rename from vector/src/main/res/transition/image_preview_transition.xml rename to library/ui-styles/src/main/res/transition/image_preview_transition.xml diff --git a/vector/src/main/res/values-land/dimens.xml b/library/ui-styles/src/main/res/values-land/dimens.xml similarity index 100% rename from vector/src/main/res/values-land/dimens.xml rename to library/ui-styles/src/main/res/values-land/dimens.xml diff --git a/vector/src/main/res/values-land/styles.xml b/library/ui-styles/src/main/res/values-land/styles.xml similarity index 100% rename from vector/src/main/res/values-land/styles.xml rename to library/ui-styles/src/main/res/values-land/styles.xml diff --git a/library/ui-styles/src/main/res/values-land/styles_dial_pad.xml b/library/ui-styles/src/main/res/values-land/styles_dial_pad.xml new file mode 100644 index 0000000000..39c5bf9aa6 --- /dev/null +++ b/library/ui-styles/src/main/res/values-land/styles_dial_pad.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <style name="DialpadKeyNumberStyle"> + <item name="android:textColor">?attr/vctr_content_primary</item> + <item name="android:textSize">@dimen/dialpad_key_numbers_default_size</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginBottom">@dimen/dialpad_key_number_default_margin_bottom</item> + <item name="android:gravity">center</item> + </style> + + <style name="DialpadKeyLettersStyle"> + <item name="android:textColor">?attr/vctr_content_secondary</item> + <item name="android:textSize">@dimen/dialpad_key_letters_size</item> + <item name="android:fontFamily">sans-serif-regular</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:gravity">center_horizontal</item> + </style> + + <style name="DialpadKeyPoundStyle" parent="DialpadKeyNumberStyle"> + <item name="android:textSize">@dimen/dialpad_key_pound_size</item> + <item name="android:layout_marginBottom">@dimen/dialpad_symbol_margin_bottom</item> + </style> + + <style name="DialpadKeyStarStyle" parent="DialpadKeyNumberStyle"> + <item name="android:textSize">@dimen/dialpad_key_star_size</item> + <item name="android:layout_marginBottom">@dimen/dialpad_symbol_margin_bottom</item> + </style> + +</resources> \ No newline at end of file diff --git a/vector/src/main/res/values-ldrtl/integers.xml b/library/ui-styles/src/main/res/values-ldrtl/integers.xml similarity index 100% rename from vector/src/main/res/values-ldrtl/integers.xml rename to library/ui-styles/src/main/res/values-ldrtl/integers.xml diff --git a/vector/src/main/res/values-sw600dp/dimens.xml b/library/ui-styles/src/main/res/values-sw600dp/dimens.xml similarity index 100% rename from vector/src/main/res/values-sw600dp/dimens.xml rename to library/ui-styles/src/main/res/values-sw600dp/dimens.xml diff --git a/library/ui-styles/src/main/res/values-v23/theme_black.xml b/library/ui-styles/src/main/res/values-v23/theme_black.xml new file mode 100644 index 0000000000..e0399f6449 --- /dev/null +++ b/library/ui-styles/src/main/res/values-v23/theme_black.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="Theme.Vector.Black.v23" parent="Base.Theme.Vector.Black"> + <item name="android:windowLightStatusBar">false</item> + </style> + + <style name="Theme.Vector.Black" parent="Theme.Vector.Black.v23"/> + +</resources> \ No newline at end of file diff --git a/vector/src/main/res/values-v23/theme_dark.xml b/library/ui-styles/src/main/res/values-v23/theme_dark.xml similarity index 50% rename from vector/src/main/res/values-v23/theme_dark.xml rename to library/ui-styles/src/main/res/values-v23/theme_dark.xml index c9fb7dab28..45b340eaad 100644 --- a/vector/src/main/res/values-v23/theme_dark.xml +++ b/library/ui-styles/src/main/res/values-v23/theme_dark.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="AppTheme.Dark.v23" parent="AppTheme.Base.Dark"> + <style name="Theme.Vector.Dark.v23" parent="Base.Theme.Vector.Dark"> <item name="android:windowLightStatusBar">false</item> </style> - <style name="AppTheme.Dark" parent="AppTheme.Dark.v23"/> + <style name="Theme.Vector.Dark" parent="Theme.Vector.Dark.v23"/> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-v23/theme_light.xml b/library/ui-styles/src/main/res/values-v23/theme_light.xml similarity index 61% rename from vector/src/main/res/values-v23/theme_light.xml rename to library/ui-styles/src/main/res/values-v23/theme_light.xml index 43d0027e17..28a78b98bf 100644 --- a/vector/src/main/res/values-v23/theme_light.xml +++ b/library/ui-styles/src/main/res/values-v23/theme_light.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="AppTheme.Light.v23" parent="AppTheme.Base.Light"> + <style name="Theme.Vector.Light.v23" parent="Base.Theme.Vector.Light"> <item name="android:statusBarColor">@color/android_status_bar_background_light</item> <item name="android:windowLightStatusBar">true</item> </style> - <style name="AppTheme.Light" parent="AppTheme.Light.v23"/> + <style name="Theme.Vector.Light" parent="Theme.Vector.Light.v23"/> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-v27/theme_black.xml b/library/ui-styles/src/main/res/values-v27/theme_black.xml similarity index 50% rename from vector/src/main/res/values-v27/theme_black.xml rename to library/ui-styles/src/main/res/values-v27/theme_black.xml index f8650c7e8b..2a18b021e3 100644 --- a/vector/src/main/res/values-v27/theme_black.xml +++ b/library/ui-styles/src/main/res/values-v27/theme_black.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="AppTheme.Black.v27" parent="AppTheme.Black.v23"> + <style name="Theme.Vector.Black.v27" parent="Theme.Vector.Black.v23"> <item name="android:windowLightNavigationBar">false</item> </style> - <style name="AppTheme.Black" parent="AppTheme.Black.v27" /> + <style name="Theme.Vector.Black" parent="Theme.Vector.Black.v27" /> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-v27/theme_dark.xml b/library/ui-styles/src/main/res/values-v27/theme_dark.xml similarity index 50% rename from vector/src/main/res/values-v27/theme_dark.xml rename to library/ui-styles/src/main/res/values-v27/theme_dark.xml index ef0a39902a..ee654bbaab 100644 --- a/vector/src/main/res/values-v27/theme_dark.xml +++ b/library/ui-styles/src/main/res/values-v27/theme_dark.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="AppTheme.Dark.v27" parent="AppTheme.Dark.v23"> + <style name="Theme.Vector.Dark.v27" parent="Theme.Vector.Dark.v23"> <item name="android:windowLightNavigationBar">false</item> </style> - <style name="AppTheme.Dark" parent="AppTheme.Dark.v27" /> + <style name="Theme.Vector.Dark" parent="Theme.Vector.Dark.v27" /> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-v27/theme_light.xml b/library/ui-styles/src/main/res/values-v27/theme_light.xml similarity index 62% rename from vector/src/main/res/values-v27/theme_light.xml rename to library/ui-styles/src/main/res/values-v27/theme_light.xml index 4755516267..0151130f5a 100644 --- a/vector/src/main/res/values-v27/theme_light.xml +++ b/library/ui-styles/src/main/res/values-v27/theme_light.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="AppTheme.Light.v27" parent="AppTheme.Light.v23"> + <style name="Theme.Vector.Light.v27" parent="Theme.Vector.Light.v23"> <item name="android:navigationBarColor">@color/android_navigation_bar_background_light</item> <item name="android:windowLightNavigationBar">true</item> </style> - <style name="AppTheme.Light" parent="AppTheme.Light.v27" /> + <style name="Theme.Vector.Light" parent="Theme.Vector.Light.v27" /> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-w820dp/dimens.xml b/library/ui-styles/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from vector/src/main/res/values-w820dp/dimens.xml rename to library/ui-styles/src/main/res/values-w820dp/dimens.xml diff --git a/vector/src/main/res/values/attrs_room_message_colors.xml b/library/ui-styles/src/main/res/values/attrs_room_message_colors.xml similarity index 100% rename from vector/src/main/res/values/attrs_room_message_colors.xml rename to library/ui-styles/src/main/res/values/attrs_room_message_colors.xml diff --git a/vector/src/main/res/values/attrs_social_login_button.xml b/library/ui-styles/src/main/res/values/attrs_social_login_button.xml similarity index 100% rename from vector/src/main/res/values/attrs_social_login_button.xml rename to library/ui-styles/src/main/res/values/attrs_social_login_button.xml diff --git a/vector/src/main/res/values/bools.xml b/library/ui-styles/src/main/res/values/bools.xml similarity index 100% rename from vector/src/main/res/values/bools.xml rename to library/ui-styles/src/main/res/values/bools.xml diff --git a/vector/src/main/res/values/colors.xml b/library/ui-styles/src/main/res/values/colors.xml similarity index 87% rename from vector/src/main/res/values/colors.xml rename to library/ui-styles/src/main/res/values/colors.xml index f756b4f243..bfe9a9a59c 100644 --- a/vector/src/main/res/values/colors.xml +++ b/library/ui-styles/src/main/res/values/colors.xml @@ -19,7 +19,8 @@ <!-- Source: https://zpl.io/aBKw9Mk --> - <color name="bg_call_screen">#99000000</color> + <color name="bg_call_screen_blur">#99000000</color> + <color name="bg_call_screen">#27303A</color> <color name="vctr_notice_secondary">#FF61708B</color> <color name="vctr_notice_secondary_alpha12">#1E61708B</color> @@ -28,19 +29,19 @@ <!-- Emoji text has to use a black text color --> <color name="emoji_color">@android:color/black</color> + <color name="half_transparent_status_bar">#80000000</color> + <color name="black_alpha">#55000000</color> <color name="black_54">#8A000000</color> - <attr name="vctr_home_drawer_header_background" format="color" /> - <color name="vctr_home_drawer_header_background_light">#FFF5F7FA</color> - <color name="vctr_home_drawer_header_background_dark">#FF22282F</color> - <color name="vctr_home_drawer_header_background_black">#FF000000</color> - <!-- For Android status bar and navigation bar --> - <color name="android_status_bar_background_light">#FFF3F8FD</color> - <color name="android_navigation_bar_background_light">#FFF3F8FD</color> - <color name="android_status_bar_background_dark">#FF22262E</color> - <color name="android_navigation_bar_background_dark">#FF22262E</color> + <color name="android_status_bar_background_light">@color/element_system_light</color> + <color name="android_navigation_bar_background_light">@color/element_system_light</color> + <color name="android_status_bar_background_dark">@color/element_background_dark</color> + <color name="android_navigation_bar_background_dark">@color/element_system_dark</color> + + <!-- Used for toolbar background --> + <attr name="vctr_toolbar_background" format="color" /> <!-- Used for header background --> <attr name="vctr_header_background" format="color" /> @@ -100,11 +101,6 @@ <color name="vctr_room_active_widgets_banner_text_dark">#E3E8F0</color> <color name="vctr_room_active_widgets_banner_text_black">#E3E8F0</color> - <attr name="vctr_bottom_nav_icon_color" format="color" /> - <color name="vctr_bottom_nav_icon_color_light">#C1C6CD</color> - <color name="vctr_bottom_nav_icon_color_dark">#8E99A4</color> - <color name="vctr_bottom_nav_icon_color_black">#8E99A4</color> - <attr name="vctr_waiting_background_color" format="color" /> <color name="vctr_waiting_background_color_light">#AAAAAAAA</color> <color name="vctr_waiting_background_color_dark">#55555555</color> diff --git a/vector/src/main/res/values/colors_password_strength.xml b/library/ui-styles/src/main/res/values/colors_password_strength.xml similarity index 100% rename from vector/src/main/res/values/colors_password_strength.xml rename to library/ui-styles/src/main/res/values/colors_password_strength.xml diff --git a/vector/src/main/res/values/dimens.xml b/library/ui-styles/src/main/res/values/dimens.xml similarity index 100% rename from vector/src/main/res/values/dimens.xml rename to library/ui-styles/src/main/res/values/dimens.xml diff --git a/library/ui-styles/src/main/res/values/dimens_font.xml b/library/ui-styles/src/main/res/values/dimens_font.xml new file mode 100644 index 0000000000..1b5a826acb --- /dev/null +++ b/library/ui-styles/src/main/res/values/dimens_font.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <dimen name="text_size_title">24sp</dimen> + <dimen name="text_size_headline">18sp</dimen> + <dimen name="text_size_subtitle">16sp</dimen> + <dimen name="text_size_body">14sp</dimen> + <dimen name="text_size_caption">12sp</dimen> + <dimen name="text_size_micro">10sp</dimen> + + <dimen name="text_size_button">14sp</dimen> + +</resources> \ No newline at end of file diff --git a/vector/src/main/res/values/integers.xml b/library/ui-styles/src/main/res/values/integers.xml similarity index 100% rename from vector/src/main/res/values/integers.xml rename to library/ui-styles/src/main/res/values/integers.xml diff --git a/vector/src/main/res/values/palette.xml b/library/ui-styles/src/main/res/values/palette.xml similarity index 100% rename from vector/src/main/res/values/palette.xml rename to library/ui-styles/src/main/res/values/palette.xml diff --git a/vector/src/main/res/values/palette_mobile.xml b/library/ui-styles/src/main/res/values/palette_mobile.xml similarity index 100% rename from vector/src/main/res/values/palette_mobile.xml rename to library/ui-styles/src/main/res/values/palette_mobile.xml diff --git a/vector/src/main/res/values/stylable_badge_floating_action_button.xml b/library/ui-styles/src/main/res/values/stylable_badge_floating_action_button.xml similarity index 100% rename from vector/src/main/res/values/stylable_badge_floating_action_button.xml rename to library/ui-styles/src/main/res/values/stylable_badge_floating_action_button.xml diff --git a/vector/src/main/res/values/stylable_bottom_sheet_action.xml b/library/ui-styles/src/main/res/values/stylable_bottom_sheet_action.xml similarity index 100% rename from vector/src/main/res/values/stylable_bottom_sheet_action.xml rename to library/ui-styles/src/main/res/values/stylable_bottom_sheet_action.xml diff --git a/vector/src/main/res/values/stylable_button_state_view.xml b/library/ui-styles/src/main/res/values/stylable_button_state_view.xml similarity index 100% rename from vector/src/main/res/values/stylable_button_state_view.xml rename to library/ui-styles/src/main/res/values/stylable_button_state_view.xml diff --git a/vector/src/main/res/values/stylable_max_height_scroll_view.xml b/library/ui-styles/src/main/res/values/stylable_max_height_scroll_view.xml similarity index 100% rename from vector/src/main/res/values/stylable_max_height_scroll_view.xml rename to library/ui-styles/src/main/res/values/stylable_max_height_scroll_view.xml diff --git a/vector/src/main/res/values/stylable_pool_result_line.xml b/library/ui-styles/src/main/res/values/stylable_pool_result_line.xml similarity index 100% rename from vector/src/main/res/values/stylable_pool_result_line.xml rename to library/ui-styles/src/main/res/values/stylable_pool_result_line.xml diff --git a/vector/src/main/res/values/stylable_reaction_button.xml b/library/ui-styles/src/main/res/values/stylable_reaction_button.xml similarity index 100% rename from vector/src/main/res/values/stylable_reaction_button.xml rename to library/ui-styles/src/main/res/values/stylable_reaction_button.xml diff --git a/vector/src/main/res/values/stylable_sign_out_bottom_sheet_action_button.xml b/library/ui-styles/src/main/res/values/stylable_sign_out_bottom_sheet_action_button.xml similarity index 100% rename from vector/src/main/res/values/stylable_sign_out_bottom_sheet_action_button.xml rename to library/ui-styles/src/main/res/values/stylable_sign_out_bottom_sheet_action_button.xml diff --git a/vector/src/main/res/values/stylable_social_login_button_view.xml b/library/ui-styles/src/main/res/values/stylable_social_login_button_view.xml similarity index 100% rename from vector/src/main/res/values/stylable_social_login_button_view.xml rename to library/ui-styles/src/main/res/values/stylable_social_login_button_view.xml diff --git a/vector/src/main/res/values/stylable_wizard_button_view.xml b/library/ui-styles/src/main/res/values/stylable_wizard_button_view.xml similarity index 100% rename from vector/src/main/res/values/stylable_wizard_button_view.xml rename to library/ui-styles/src/main/res/values/stylable_wizard_button_view.xml diff --git a/vector/src/main/res/values/style_snackbar.xml b/library/ui-styles/src/main/res/values/style_snackbar.xml similarity index 51% rename from vector/src/main/res/values/style_snackbar.xml rename to library/ui-styles/src/main/res/values/style_snackbar.xml index 60c78c0e65..d15f846d8f 100644 --- a/vector/src/main/res/values/style_snackbar.xml +++ b/library/ui-styles/src/main/res/values/style_snackbar.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="VectorSnackBarStyle" parent="@style/Widget.MaterialComponents.Snackbar"> + <style name="Widget.Vector.SnackBar" parent="@style/Widget.MaterialComponents.Snackbar"> <!-- <item name="android:background">@color/notification_accent_color</item>--> </style> - <style name="VectorSnackBarButton" parent="@style/VectorButtonStyleText.OnPrimary"> + <style name="Widget.Vector.SnackBar.Button" parent="@style/Widget.Vector.Button.Text.OnPrimary"> <!-- <item name="android:textColor">@color/white</item>--> </style> - <style name="VectorSnackBarText" parent="@style/Widget.MaterialComponents.Snackbar.TextView"> + <style name="Widget.Vector.SnackBar.TextView" parent="@style/Widget.MaterialComponents.Snackbar.TextView"> <!-- <item name="android:textColor">@color/white</item>--> </style> diff --git a/vector/src/main/res/values/styles.xml b/library/ui-styles/src/main/res/values/styles.xml similarity index 71% rename from vector/src/main/res/values/styles.xml rename to library/ui-styles/src/main/res/values/styles.xml index 8cc1fe70d8..b028d2e219 100644 --- a/vector/src/main/res/values/styles.xml +++ b/library/ui-styles/src/main/res/values/styles.xml @@ -1,8 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="Vector.PopupMenu" parent="Vector.PopupMenuBase" /> - <style name="VectorEmptyImageView"> <item name="android:visibility">visible</item> </style> diff --git a/library/ui-styles/src/main/res/values/styles_action_mode.xml b/library/ui-styles/src/main/res/values/styles_action_mode.xml new file mode 100644 index 0000000000..f6e6079633 --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_action_mode.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <!-- Action mode style --> + <style name="Widget.Vector.ActionMode" parent="Widget.AppCompat.ActionMode"> + <item name="background">?android:colorBackground</item> + <item name="titleTextStyle">@style/Widget.Vector.TextView.Title</item> + <item name="subtitleTextStyle">@style/Widget.Vector.TextView.Subtitle</item> + <item name="actionMenuTextColor">?colorOnPrimary</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_alert_dialog.xml b/library/ui-styles/src/main/res/values/styles_alert_dialog.xml new file mode 100644 index 0000000000..69abc85c39 --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_alert_dialog.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="ThemeOverlay.Vector.MaterialAlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog"> + <item name="materialAlertDialogTitleTextStyle">@style/MaterialAlertDialog.Vector.Title.Text</item> + <item name="materialAlertDialogBodyTextStyle">@style/MaterialAlertDialog.Vector.Body.Text</item> + <item name="buttonBarPositiveButtonStyle">@style/Widget.Vector.Button.TextButton.Dialog</item> + <item name="buttonBarNegativeButtonStyle">@style/Widget.Vector.Button.TextButton.Dialog</item> + <item name="buttonBarNeutralButtonStyle">@style/Widget.Vector.Button.TextButton.Dialog</item> + </style> + + <style name="ThemeOverlay.Vector.MaterialAlertDialog.Destructive"> + <item name="buttonBarPositiveButtonStyle">@style/Widget.Vector.Button.TextButton.Dialog.Destructive</item> + </style> + + <style name="ThemeOverlay.Vector.MaterialAlertDialog.NegativeDestructive"> + <item name="buttonBarNegativeButtonStyle">@style/Widget.Vector.Button.TextButton.Dialog.Destructive</item> + </style> + + <!-- Title --> + <style name="MaterialAlertDialog.Vector.Title.Text" parent="MaterialAlertDialog.MaterialComponents.Title.Text"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Subtitle</item> + </style> + + <!-- Body --> + <style name="MaterialAlertDialog.Vector.Body.Text" parent="MaterialAlertDialog.MaterialComponents.Body.Text"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Body</item> + <item name="lineHeight">20sp</item> + </style> + + <!-- Buttons --> + <style name="Widget.Vector.Button.TextButton.Dialog" parent="Widget.MaterialComponents.Button.TextButton.Dialog"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Button</item> + </style> + + <style name="Widget.Vector.Button.TextButton.Dialog.Destructive"> + <item name="materialThemeOverlay">@style/VectorMaterialThemeOverlayDestructive</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_app_bar_layout.xml b/library/ui-styles/src/main/res/values/styles_app_bar_layout.xml new file mode 100644 index 0000000000..973a2c5e4a --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_app_bar_layout.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="Widget.Vector.AppBarLayout" parent="Widget.MaterialComponents.AppBarLayout.Primary"> + <item name="android:background">?vctr_toolbar_background</item> + <item name="elevation">4dp</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_attachments.xml b/library/ui-styles/src/main/res/values/styles_attachments.xml new file mode 100644 index 0000000000..18c2e3f95f --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_attachments.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="AttachmentTypeSelectorButton"> + <item name="android:layout_width">56dp</item> + <item name="android:layout_height">56dp</item> + <item name="android:scaleType">center</item> + </style> + + <style name="AttachmentTypeSelectorLabel"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:textColor">?vctr_content_primary</item> + <item name="android:textSize">14sp</item> + <item name="android:layout_marginTop">8dp</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_bottom_navigation.xml b/library/ui-styles/src/main/res/values/styles_bottom_navigation.xml new file mode 100644 index 0000000000..8925d6a74f --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_bottom_navigation.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="BottomNavigation.Vector" parent="Widget.MaterialComponents.BottomNavigationView"> + <item name="android:background">@drawable/bg_bottom_navigation</item> + <item name="itemBackground">@drawable/bg_bottom_navigation</item> + <item name="itemIconSize">20dp</item> + <item name="itemIconTint">@color/bottom_navigation_icon_tint_selector</item> + <item name="labelVisibilityMode">unlabeled</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_bottom_sheet.xml b/library/ui-styles/src/main/res/values/styles_bottom_sheet.xml new file mode 100644 index 0000000000..9f17342ede --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_bottom_sheet.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <!-- BottomSheet theming --> + <style name="Theme.Vector.BottomSheetDialog.Light" parent="Theme.MaterialComponents.Light.BottomSheetDialog"> + <item name="colorPrimary">@color/element_accent_light</item> + <item name="colorSecondary">@color/palette_element_green</item> + <item name="colorSurface">@color/element_background_light</item> + <item name="colorOnSurface">@color/element_content_primary_light</item> + <item name="colorError">@color/element_alert_light</item> + <!-- Default color for text View --> + <item name="android:textColorTertiary">@color/element_content_primary_light</item> + <item name="android:textColorLink">@color/element_link_light</item> + </style> + + <style name="Theme.Vector.BottomSheetDialog.Dark" parent="Theme.MaterialComponents.BottomSheetDialog"> + <item name="colorPrimary">@color/element_accent_dark</item> + <item name="colorSecondary">@color/palette_element_green</item> + <item name="colorSurface">@color/element_background_dark</item> + <item name="colorOnSurface">@color/element_content_primary_dark</item> + <item name="colorError">@color/element_alert_dark</item> + <!-- Default color for text View --> + <item name="android:textColorTertiary">@color/element_content_primary_dark</item> + <item name="android:textColorLink">@color/element_link_dark</item> + </style> + + <style name="Theme.Vector.BottomSheetDialog.Black" parent="Theme.Vector.BottomSheetDialog.Dark"> + <item name="colorSurface">@color/element_background_black</item> + </style> + + <!-- BottomSheet style --> + <style name="BottomSheetItemTextMain"> + <item name="android:fontFamily">sans-serif-medium</item> + <item name="android:layout_width">0dp</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_weight">1</item> + <item name="android:ellipsize">end</item> + <item name="android:lines">1</item> + <item name="android:textColor">?vctr_content_primary</item> + <item name="android:textSize">16sp</item> + </style> + + <style name="BottomSheetItemTextSecondary"> + <item name="android:fontFamily">sans-serif</item> + <item name="android:layout_width">0dp</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_weight">1</item> + <item name="android:ellipsize">end</item> + <item name="android:maxLines">2</item> + <item name="android:textColor">?vctr_content_secondary</item> + <item name="android:textSize">14sp</item> + </style> + + <style name="BottomSheetItemTime"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:lines">1</item> + <item name="android:textColor">?vctr_content_secondary</item> + <item name="android:textSize">12sp</item> + </style> + +</resources> \ No newline at end of file diff --git a/vector/src/main/res/values/styles_buttons.xml b/library/ui-styles/src/main/res/values/styles_buttons.xml similarity index 61% rename from vector/src/main/res/values/styles_buttons.xml rename to library/ui-styles/src/main/res/values/styles_buttons.xml index 71f23d71da..ad90469a52 100644 --- a/vector/src/main/res/values/styles_buttons.xml +++ b/library/ui-styles/src/main/res/values/styles_buttons.xml @@ -1,15 +1,16 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="VectorButtonStyle" parent="Widget.MaterialComponents.Button"> + <style name="Widget.Vector.Button" parent="Widget.MaterialComponents.Button"> <item name="android:paddingLeft">16dp</item> <item name="android:paddingRight">16dp</item> <item name="android:minWidth">94dp</item> - <item name="android:fontFamily">sans-serif-medium</item> - <item name="android:textSize">14sp</item> + <item name="android:textAppearance">@style/TextAppearance.Vector.Button</item> + <item name="cornerRadius">8dp</item> + <item name="lineHeight">24sp</item> </style> - <style name="VectorButtonStyle.Destructive"> + <style name="Widget.Vector.Button.Destructive"> <item name="android:minWidth">94dp</item> <item name="materialThemeOverlay">@style/VectorMaterialThemeOverlayDestructive</item> </style> @@ -18,7 +19,7 @@ <item name="colorPrimary">?colorError</item> </style> - <style name="VectorButtonStyle.Positive"> + <style name="Widget.Vector.Button.Positive"> <item name="android:minWidth">94dp</item> <item name="materialThemeOverlay">@style/VectorMaterialThemeOverlayPositive</item> </style> @@ -27,15 +28,16 @@ <!-- Keep default colors from the theme --> </style> - <style name="VectorButtonStyleUnelevated" parent="Widget.MaterialComponents.Button.UnelevatedButton"> + <style name="Widget.Vector.Button.Unelevated" parent="Widget.MaterialComponents.Button.UnelevatedButton"> <item name="android:paddingLeft">16dp</item> <item name="android:paddingRight">16dp</item> <item name="android:minWidth">94dp</item> - <item name="android:fontFamily">sans-serif-medium</item> - <item name="android:textSize">14sp</item> + <item name="android:textAppearance">@style/TextAppearance.Vector.Button</item> + <item name="cornerRadius">8dp</item> + <item name="lineHeight">24sp</item> </style> - <style name="VectorButtonStyleUnelevated.Bot"> + <style name="Widget.Vector.Button.Unelevated.Bot"> <item name="materialThemeOverlay">@style/VectorMaterialThemeOverlayBot</item> </style> @@ -44,23 +46,29 @@ <item name="colorOnPrimary">@color/button_bot_enabled_text_color</item> </style> - <style name="VectorButtonStyleText" parent="Widget.MaterialComponents.Button.TextButton"> + <style name="Widget.Vector.Button.Text" parent="Widget.MaterialComponents.Button.TextButton"> <item name="colorControlHighlight">?colorSecondary</item> <item name="materialThemeOverlay">@style/VectorMaterialThemeOverlayPositive</item> + <item name="android:textAppearance">@style/TextAppearance.Vector.Button</item> + <item name="cornerRadius">8dp</item> + <item name="lineHeight">24sp</item> </style> - <style name="VectorButtonStyleText.OnPrimary"> + <style name="Widget.Vector.Button.Text.OnPrimary"> <item name="colorControlHighlight">?colorOnPrimary</item> <item name="materialThemeOverlay">@style/VectorMaterialThemeOverlayOnPrimary</item> </style> - <style name="VectorButtonStyleOutlined" parent="Widget.MaterialComponents.Button.OutlinedButton"> + <style name="Widget.Vector.Button.Outlined" parent="Widget.MaterialComponents.Button.OutlinedButton"> <item name="android:textAllCaps">false</item> <item name="strokeColor">@color/button_background_tint_selector</item> <item name="strokeWidth">1dp</item> + <item name="android:textAppearance">@style/TextAppearance.Vector.Button</item> + <item name="cornerRadius">8dp</item> + <item name="lineHeight">24sp</item> </style> - <style name="AlerterButton" parent="VectorButtonStyleText"> + <style name="Widget.Vector.Button.Text.Alerter"> <item name="android:textStyle">bold</item> <item name="android:textAllCaps">false</item> <item name="materialThemeOverlay">@style/VectorMaterialThemeOverlayOnPrimary</item> @@ -70,7 +78,7 @@ <item name="colorPrimary">?colorOnPrimary</item> </style> - <style name="VectorButtonStyleOutlined.Poll"> + <style name="Widget.Vector.Button.Outlined.Poll"> <item name="android:minHeight">44dp</item> <item name="cornerRadius">10dp</item> </style> diff --git a/library/ui-styles/src/main/res/values/styles_dial_pad.xml b/library/ui-styles/src/main/res/values/styles_dial_pad.xml new file mode 100644 index 0000000000..34e128c56d --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_dial_pad.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="DialpadKeyNumberStyle"> + <item name="android:textColor">?vctr_content_primary</item> + <item name="android:textSize">@dimen/dialpad_key_numbers_default_size</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginBottom">@dimen/dialpad_key_number_default_margin_bottom</item> + <item name="android:gravity">center</item> + </style> + + <style name="DialpadKeyLettersStyle"> + <item name="android:textColor">?attr/vctr_content_secondary</item> + <item name="android:textSize">@dimen/dialpad_key_letters_size</item> + <item name="android:fontFamily">sans-serif-regular</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:gravity">center_horizontal</item> + </style> + + <style name="DialpadKeyPoundStyle" parent="DialpadKeyNumberStyle"> + <item name="android:textSize">@dimen/dialpad_key_pound_size</item> + <item name="android:layout_marginBottom">@dimen/dialpad_symbol_margin_bottom</item> + </style> + + <style name="DialpadKeyStarStyle" parent="DialpadKeyNumberStyle"> + <item name="android:textSize">@dimen/dialpad_key_star_size</item> + <item name="android:layout_marginBottom">@dimen/dialpad_symbol_margin_bottom</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_edit_text.xml b/library/ui-styles/src/main/res/values/styles_edit_text.xml new file mode 100644 index 0000000000..cc1041a2ce --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_edit_text.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <!-- Default style for TextInputLayout --> + <style name="Widget.Vector.TextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox" /> + + <style name="Widget.Vector.TextInputLayout.Password"> + <item name="endIconMode">password_toggle</item> + <item name="endIconTint">?vctr_content_secondary</item> + </style> + + <style name="Widget.Vector.EditText.Composer" parent="Widget.AppCompat.EditText"> + <item name="android:background">@android:color/transparent</item> + <item name="android:inputType">textCapSentences|textMultiLine</item> + <item name="android:maxLines">12</item> + <item name="android:minHeight">48dp</item> + <item name="android:padding">8dp</item> + <item name="android:textSize">15sp</item> + <item name="android:textColor">?vctr_message_text_color</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_jump_to_unread.xml b/library/ui-styles/src/main/res/values/styles_jump_to_unread.xml new file mode 100644 index 0000000000..21f0ebd5d4 --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_jump_to_unread.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <attr name="vctr_jump_to_unread_style" format="reference" /> + + <style name="Widget.Vector.JumpToUnread.Base" parent="Widget.MaterialComponents.Chip.Action"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Body.Medium</item> + <item name="chipEndPadding">12dp</item> + <item name="chipIconSize">24dp</item> + <item name="chipMinHeight">44dp</item> + <item name="chipStartPadding">12dp</item> + <item name="closeIconVisible">true</item> + <item name="android:elevation">6dp</item> + <item name="closeIconSize">24dp</item> + </style> + + <style name="Widget.Vector.JumpToUnread.Light" parent="Widget.Vector.JumpToUnread.Base"> + <item name="chipBackgroundColor">@color/element_background_light</item> + <item name="closeIconTint">?vctr_content_secondary</item> + </style> + + <style name="Widget.Vector.JumpToUnread.Dark" parent="Widget.Vector.JumpToUnread.Base"> + <item name="chipBackgroundColor">@color/element_system_dark</item> + <item name="closeIconTint">?vctr_content_quaternary</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_label.xml b/library/ui-styles/src/main/res/values/styles_label.xml new file mode 100644 index 0000000000..3f38855430 --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_label.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="VectorLabel"> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:paddingLeft">12dp</item> + <item name="android:paddingRight">12dp</item> + <item name="android:paddingTop">4dp</item> + <item name="android:paddingBottom">4dp</item> + <item name="android:textSize">15sp</item> + <item name="android:textColor">?vctr_fab_label_color</item> + <item name="android:background">@drawable/vector_label_background</item> + </style> + +</resources> \ No newline at end of file diff --git a/vector/src/main/res/values/styles_login.xml b/library/ui-styles/src/main/res/values/styles_login.xml similarity index 89% rename from vector/src/main/res/values/styles_login.xml rename to library/ui-styles/src/main/res/values/styles_login.xml index 8cba34daf3..ab2cb44c5a 100644 --- a/vector/src/main/res/values/styles_login.xml +++ b/library/ui-styles/src/main/res/values/styles_login.xml @@ -35,17 +35,17 @@ <item name="android:paddingBottom">32dp</item> </style> - <style name="Style.Vector.Login.Button" parent="VectorButtonStyle"> + <style name="Widget.Vector.Button.Login"> <item name="android:minHeight">52dp</item> <item name="android:textAllCaps">false</item> </style> - <style name="Style.Vector.Login.Button.Outlined" parent="VectorButtonStyleOutlined"> + <style name="Widget.Vector.Button.Outlined.Login"> <item name="android:minHeight">52dp</item> <item name="android:textAllCaps">false</item> </style> - <style name="Style.Vector.Login.Button.Text" parent="VectorButtonStyleText"> + <style name="Widget.Vector.Button.Text.Login"> <item name="android:minHeight">52dp</item> <item name="android:textAllCaps">false</item> </style> diff --git a/vector/src/main/res/values/styles_pin_code.xml b/library/ui-styles/src/main/res/values/styles_pin_code.xml similarity index 95% rename from vector/src/main/res/values/styles_pin_code.xml rename to library/ui-styles/src/main/res/values/styles_pin_code.xml index 61f53ab522..2b6c113359 100644 --- a/vector/src/main/res/values/styles_pin_code.xml +++ b/library/ui-styles/src/main/res/values/styles_pin_code.xml @@ -15,7 +15,7 @@ <item name="android:button">@drawable/pin_code_dots</item> </style> - <style name="PinCodeNextButtonStyle" parent="VectorButtonStyle"> + <style name="PinCodeNextButtonStyle" parent="Widget.Vector.Button"> <item name="android:textSize">18sp</item> <item name="android:backgroundTint">@android:color/transparent</item> <item name="android:layout_marginBottom">24dp</item> diff --git a/library/ui-styles/src/main/res/values/styles_popup.xml b/library/ui-styles/src/main/res/values/styles_popup.xml new file mode 100644 index 0000000000..2aad848989 --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_popup.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="Widget.Vector.PopupMenu" parent="Widget.AppCompat.PopupMenu"> + <item name="android:textColor">?vctr_content_primary</item> + <item name="android:textSize">16sp</item> + <item name="android:dropDownHorizontalOffset">0dp</item> + <item name="android:dropDownVerticalOffset">0dp</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_progress.xml b/library/ui-styles/src/main/res/values/styles_progress.xml new file mode 100644 index 0000000000..712e7e98b6 --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_progress.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="Widget.Vector.ProgressBar.Horizontal" parent="Widget.AppCompat.ProgressBar.Horizontal" /> + + <style name="Widget.Vector.ProgressBar.Horizontal.File"> + <item name="android:indeterminateOnly">false</item> + <item name="android:progressDrawable">@drawable/file_progress_bar</item> + <item name="android:minHeight">10dp</item> + <item name="android:maxHeight">40dp</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_search_view.xml b/library/ui-styles/src/main/res/values/styles_search_view.xml new file mode 100644 index 0000000000..e1439697c9 --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_search_view.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="Widget.Vector.SearchView" parent="Widget.AppCompat.SearchView"> + <item name="searchIcon">@drawable/ic_search</item> + <item name="closeIcon">@drawable/ic_x_gray</item> + <item name="iconifiedByDefault">false</item> + </style> + +</resources> \ No newline at end of file diff --git a/vector/src/main/res/values/styles_social_login.xml b/library/ui-styles/src/main/res/values/styles_social_login.xml similarity index 73% rename from vector/src/main/res/values/styles_social_login.xml rename to library/ui-styles/src/main/res/values/styles_social_login.xml index 04a15566de..b527d5bfdc 100644 --- a/vector/src/main/res/values/styles_social_login.xml +++ b/library/ui-styles/src/main/res/values/styles_social_login.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="WidgetButtonSocialLogin" parent="Widget.MaterialComponents.Button.OutlinedButton"> + <style name="Widget.Vector.Button.Outlined.SocialLogin"> <item name="android:textAllCaps">false</item> <item name="fontFamily">sans-serif-medium</item> <item name="android:layout_width">wrap_content</item> @@ -17,44 +17,44 @@ <item name="strokeColor">@color/black_54</item> </style> - <style name="WidgetButtonSocialLogin.Google"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Google"> <item name="icon">@drawable/ic_social_google</item> <item name="iconTint">@android:color/transparent</item> <item name="iconTintMode">add</item> </style> - <style name="WidgetButtonSocialLogin.Google.Light"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Google.Light"> <item name="android:backgroundTint">@color/button_social_google_background_selector_light</item> <item name="android:textColor">@color/black_54</item> </style> - <style name="WidgetButtonSocialLogin.Google.Dark"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Google.Dark"> <item name="android:backgroundTint">@color/button_social_google_background_selector_dark</item> <item name="android:textColor">@android:color/white</item> </style> - <style name="WidgetButtonSocialLogin.Github" parent="WidgetButtonSocialLogin"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Github"> <item name="icon">@drawable/ic_social_github</item> </style> - <style name="WidgetButtonSocialLogin.Github.Light"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Github.Light"> <item name="iconTint">@android:color/black</item> <item name="android:textColor">@android:color/black</item> <item name="android:backgroundTint">@android:color/white</item> </style> - <style name="WidgetButtonSocialLogin.Github.Dark"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Github.Dark"> <item name="iconTint">@android:color/white</item> <item name="android:textColor">@android:color/white</item> <item name="android:backgroundTint">@android:color/black</item> </style> - <style name="WidgetButtonSocialLogin.Facebook" parent="WidgetButtonSocialLogin"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Facebook"> <item name="icon">@drawable/ic_social_facebook</item> </style> - <style name="WidgetButtonSocialLogin.Facebook.Light"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Facebook.Light"> <item name="strokeColor">#3877EA</item> <item name="strokeWidth">1dp</item> <item name="iconTint">#3877EA</item> @@ -62,58 +62,58 @@ <item name="android:backgroundTint">@android:color/white</item> </style> - <style name="WidgetButtonSocialLogin.Facebook.Dark"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Facebook.Dark"> <item name="iconTint">@android:color/white</item> <item name="android:textColor">@android:color/white</item> <item name="android:backgroundTint">#3877EA</item> </style> - <style name="WidgetButtonSocialLogin.Twitter" parent="WidgetButtonSocialLogin"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Twitter"> <item name="icon">@drawable/ic_social_twitter</item> </style> - <style name="WidgetButtonSocialLogin.Twitter.Light"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Twitter.Light"> <item name="iconTint">#5D9EC9</item> <item name="android:textColor">#5D9EC9</item> <item name="android:backgroundTint">@android:color/white</item> </style> - <style name="WidgetButtonSocialLogin.Twitter.Dark"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Twitter.Dark"> <item name="iconTint">@android:color/white</item> <item name="android:textColor">@android:color/white</item> <item name="android:backgroundTint">#5D9EC9</item> </style> - <style name="WidgetButtonSocialLogin.Apple" parent="WidgetButtonSocialLogin"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Apple"> <item name="icon">@drawable/ic_social_apple</item> </style> - <style name="WidgetButtonSocialLogin.Apple.Light"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Apple.Light"> <item name="iconTint">@android:color/white</item> <item name="android:textColor">@android:color/white</item> <item name="android:backgroundTint">@android:color/black</item> </style> - <style name="WidgetButtonSocialLogin.Apple.Dark"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Apple.Dark"> <item name="iconTint">@android:color/black</item> <item name="android:textColor">@android:color/black</item> <item name="android:backgroundTint">@android:color/white</item> </style> - <style name="WidgetButtonSocialLogin.Gitlab" parent="WidgetButtonSocialLogin"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Gitlab"> <item name="icon">@drawable/ic_social_gitlab</item> <item name="iconTint">@android:color/transparent</item> <item name="iconTintMode">add</item> </style> - <style name="WidgetButtonSocialLogin.Gitlab.Light"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Gitlab.Light"> <item name="android:textColor">@android:color/black</item> <item name="android:backgroundTint">@android:color/white</item> </style> - <style name="WidgetButtonSocialLogin.Gitlab.Dark"> + <style name="Widget.Vector.Button.Outlined.SocialLogin.Gitlab.Dark"> <item name="android:textColor">@android:color/white</item> <item name="android:backgroundTint">@android:color/black</item> </style> diff --git a/library/ui-styles/src/main/res/values/styles_text_view.xml b/library/ui-styles/src/main/res/values/styles_text_view.xml new file mode 100644 index 0000000000..77e32da345 --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_text_view.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <!-- + Source: https://www.figma.com/file/X4XTH9iS2KGJ2wFKDqkyed/Compound?node-id=1336%3A17796 + --> + + <style name="Widget.Vector.TextView" parent="Widget.MaterialComponents.TextView" /> + + <!-- Note: lineHeight attribute cannot be added in textAppearance style --> + <style name="Widget.Vector.TextView.Title"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Title</item> + <item name="lineHeight">32sp</item> + </style> + + <style name="Widget.Vector.TextView.Title.Medium"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Title.Medium</item> + </style> + + <style name="Widget.Vector.TextView.HeadlineMedium"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Headline.Medium</item> + </style> + + <style name="Widget.Vector.TextView.Subtitle"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Subtitle</item> + </style> + + <style name="Widget.Vector.TextView.Subtitle.Medium"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Subtitle.Medium</item> + </style> + + <style name="Widget.Vector.TextView.Body"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Body</item> + <item name="lineHeight">20sp</item> + </style> + + <style name="Widget.Vector.TextView.Body.Medium"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Body.Medium</item> + </style> + + <style name="Widget.Vector.TextView.Caption"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Caption</item> + <item name="lineHeight">16sp</item> + </style> + + <style name="Widget.Vector.TextView.Micro"> + <item name="android:textAppearance">@style/TextAppearance.Vector.Micro</item> + <item name="lineHeight">16sp</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_timeline.xml b/library/ui-styles/src/main/res/values/styles_timeline.xml new file mode 100644 index 0000000000..7fd7eac0ec --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_timeline.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="TimelineContentStubBaseParams"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginStart">8dp</item> + <item name="android:layout_marginLeft">8dp</item> + <item name="android:layout_marginEnd">8dp</item> + <item name="android:layout_marginRight">8dp</item> + <item name="android:layout_marginBottom">4dp</item> + <item name="android:layout_marginTop">4dp</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_toolbar.xml b/library/ui-styles/src/main/res/values/styles_toolbar.xml new file mode 100644 index 0000000000..9f6ba102ed --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_toolbar.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="Widget.Vector.Toolbar.Base" parent="Widget.MaterialComponents.Toolbar"> + <item name="android:background">?vctr_toolbar_background</item> + <item name="elevation">0dp</item> + + <!-- main text --> + <item name="titleTextStyle">@style/Widget.Vector.TextView.ActionBarTitle</item> + + <!-- sub text --> + <item name="subtitleTextStyle">@style/Widget.Vector.TextView.ActionBarSubTitle</item> + </style> + + <!-- Default toolbar style --> + <style name="Widget.Vector.Toolbar" parent="Widget.Vector.Toolbar.Base"> + <item name="contentInsetStartWithNavigation">0dp</item> + </style> + + <!-- Toolbar for settings Activity (so we keep the default contentInsetStartWithNavigation here) --> + <style name="Widget.Vector.Toolbar.Settings" parent="Widget.Vector.Toolbar.Base" /> + + <!-- Toolbar text style --> + <!-- main text --> + <style name="Widget.Vector.TextView.ActionBarTitle" parent="TextAppearance.AppCompat.Widget.ActionBar.Title"> + <item name="android:textColor">?vctr_content_primary</item> + <item name="android:fontFamily">"sans-serif-medium"</item> + <item name="android:textSize">20sp</item> + </style> + + <!-- sub text --> + <style name="Widget.Vector.TextView.ActionBarSubTitle" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle"> + <item name="android:textColor">?vctr_content_primary</item> + <item name="android:fontFamily">"sans-serif-medium"</item> + <item name="android:textSize">12sp</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/styles_voice_message.xml b/library/ui-styles/src/main/res/values/styles_voice_message.xml new file mode 100644 index 0000000000..00260f225c --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_voice_message.xml @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <attr name="vctr_voice_message_lock_background_style" format="reference" /> + <attr name="vctr_voice_message_playback_background_style" format="reference" /> + <attr name="vctr_voice_message_play_pause_button_background_style" format="reference" /> + <attr name="vctr_voice_message_recording_playback_background_style" format="reference" /> + + <style name="VoiceMessageLockBackground"> + <item name="android:layout_width">52dp</item> + <item name="android:layout_height">160dp</item> + <item name="android:background">@drawable/bg_voice_message_lock</item> + <item name="android:backgroundTint">?vctr_voice_message_lock_background</item> + </style> + + <style name="VoiceMessageMicButton"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:background">?android:attr/selectableItemBackground</item> + <item name="android:layout_marginBottom">12dp</item> + <item name="android:layout_marginEnd">12dp</item> + <item name="android:src">@drawable/ic_voice_mic</item> + </style> + + <style name="VoiceMessageSendButton"> + <item name="android:layout_width">56dp</item> + <item name="android:layout_height">56dp</item> + <item name="android:background">@drawable/bg_send</item> + <item name="android:scaleType">center</item> + <item name="android:src">@drawable/ic_send</item> + </style> + + <style name="VoiceMessageTimerIndicator"> + <item name="android:layout_width">10dp</item> + <item name="android:layout_height">10dp</item> + <item name="android:layout_marginStart">20dp</item> + <item name="android:src">@drawable/circle</item> + <item name="tint">@color/palette_vermilion</item> + </style> + + <style name="VoiceMessageTimer"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginStart">4dp</item> + <item name="android:lineSpacingExtra">4dp</item> + <item name="android:textSize">14sp</item> + <item name="android:textColor">@color/palette_gray_200</item> + </style> + + <style name="VoiceMessageSlideToCancel"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:gravity">center</item> + <item name="android:textColor">@color/palette_gray_300</item> + <item name="android:textSize">14sp</item> + <item name="drawableStartCompat">@drawable/ic_voice_slide_to_cancel_arrow</item> + </style> + + <style name="VoiceMessageLockImage"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginTop">16dp</item> + <item name="android:src">@drawable/ic_voice_message_unlocked</item> + </style> + + <style name="VoiceMessageLockArrow"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:src">@drawable/ic_voice_lock_arrow</item> + </style> + + <style name="VoiceMessageRecordingPlaybackLayout"> + <item name="android:layout_width">0dp</item> + <item name="android:layout_height">0dp</item> + <item name="android:background">@drawable/bg_voice_playback</item> + <item name="android:layout_marginStart">16dp</item> + <item name="android:backgroundTint">?vctr_voice_message_recording_playback_background</item> + </style> + + <style name="VoiceMessageDeletePlayback"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:background">?android:attr/selectableItemBackground</item> + <item name="android:src">@drawable/ic_recycle_bin</item> + <item name="tint">@color/palette_gray_200</item> + </style> + + <style name="VoiceMessagePlaybackTimerIndicator"> + <item name="android:layout_width">10dp</item> + <item name="android:layout_height">10dp</item> + <item name="android:layout_marginStart">8dp</item> + <item name="android:src">@drawable/circle</item> + <item name="layout_goneMarginStart">24dp</item> + <item name="tint">@color/palette_vermilion</item> + </style> + + <style name="VoicePlaybackControlButton"> + <item name="android:layout_width">32dp</item> + <item name="android:layout_height">32dp</item> + <item name="android:background">@drawable/bg_voice_play_pause_button</item> + <item name="android:paddingStart">3dp</item> + <item name="android:paddingEnd">0dp</item> + <item name="android:layout_marginStart">8dp</item> + <item name="android:src">@drawable/ic_voice_play</item> + <item name="android:backgroundTint">?vctr_voice_message_play_pause_button_background</item> + </style> + + <style name="VoicePlaybackTime" parent="VoiceMessageTimer"> + <item name="android:layout_marginStart">6dp</item> + <item name="layout_goneMarginStart">24dp</item> + </style> + + <style name="VoicePlaybackWaveform"> + <item name="android:layout_width">0dp</item> + <item name="android:layout_height">0dp</item> + <item name="android:layout_marginStart">8dp</item> + <item name="android:layout_marginEnd">8dp</item> + <item name="chunkColor">@color/palette_gray_300</item> + <item name="chunkAlignTo">center</item> + <item name="chunkMinHeight">1dp</item> + <item name="chunkRoundedCorners">true</item> + <item name="chunkSoftTransition">true</item> + <item name="chunkSpace">2dp</item> + <item name="chunkWidth">2dp</item> + <item name="direction">leftToRight</item> + </style> + + <style name="VoiceTimelinePlaybackLayout"> + <item name="android:layout_width">0dp</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:background">@drawable/bg_voice_playback</item> + <item name="android:minHeight">48dp</item> + <item name="android:paddingStart">8dp</item> + <item name="android:paddingTop">6dp</item> + <item name="android:paddingEnd">8dp</item> + <item name="android:paddingBottom">6dp</item> + <item name="android:backgroundTint">?vctr_voice_message_playback_background</item> + </style> + + <style name="VoiceTimelinePlaybackControlButton"> + <item name="android:layout_width">32dp</item> + <item name="android:layout_height">32dp</item> + <item name="android:background">@drawable/bg_voice_play_pause_button</item> + <item name="android:paddingStart">3dp</item> + <item name="android:paddingEnd">0dp</item> + <item name="android:src">@drawable/ic_voice_play</item> + <item name="android:backgroundTint">?vctr_voice_message_play_pause_button_background</item> + </style> + + <style name="VoiceTimelinePlaybackTime" parent="VoiceMessageTimer"> + <item name="android:layout_marginStart">6dp</item> + </style> + +</resources> \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/text_appearances.xml b/library/ui-styles/src/main/res/values/text_appearances.xml new file mode 100644 index 0000000000..4ad3fd493e --- /dev/null +++ b/library/ui-styles/src/main/res/values/text_appearances.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + + <!-- + Source: https://www.figma.com/file/X4XTH9iS2KGJ2wFKDqkyed/Compound?node-id=1336%3A17796 + + Doc: https://medium.com/androiddevelopers/whats-your-text-s-appearance-f3a1729192d + List of supported attributes for a TextAppearance: + https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/attrs.xml#4723 + + Do not use TextAppearance directly, use Widget.Vector.TextView style instead + --> + + <style name="TextAppearance.Vector.Title" parent="TextAppearance.MaterialComponents.Headline3"> + <item name="fontFamily">sans-serif</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:textSize">@dimen/text_size_title</item> + <item name="android:letterSpacing">0</item> + <item name="android:textColor">?vctr_content_primary</item> + </style> + + <style name="TextAppearance.Vector.Title.Medium"> + <item name="fontFamily">sans-serif-medium</item> + <item name="android:fontFamily">sans-serif-medium</item> + </style> + + <style name="TextAppearance.Vector.Headline.Medium" parent="TextAppearance.MaterialComponents.Headline1"> + <item name="fontFamily">sans-serif-medium</item> + <item name="android:fontFamily">sans-serif-medium</item> + <item name="android:textSize">@dimen/text_size_headline</item> + <item name="android:letterSpacing">0</item> + <item name="android:textColor">?vctr_content_primary</item> + </style> + + <style name="TextAppearance.Vector.Subtitle" parent="TextAppearance.MaterialComponents.Subtitle1"> + <item name="fontFamily">sans-serif</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:textSize">@dimen/text_size_subtitle</item> + <item name="android:letterSpacing">0</item> + <item name="android:textColor">?vctr_content_secondary</item> + </style> + + <style name="TextAppearance.Vector.Subtitle.Medium"> + <item name="fontFamily">sans-serif-medium</item> + <item name="android:fontFamily">sans-serif-medium</item> + </style> + + <!-- Note: this is the default text appearance for all the TextViews --> + <style name="TextAppearance.Vector.Body" parent="TextAppearance.MaterialComponents.Body1"> + <item name="fontFamily">sans-serif</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:textSize">@dimen/text_size_body</item> + <item name="android:letterSpacing">0</item> + <item name="android:textColor">?vctr_content_primary</item> + </style> + + <style name="TextAppearance.Vector.Body.Medium"> + <item name="fontFamily">sans-serif-medium</item> + <item name="android:fontFamily">sans-serif-medium</item> + </style> + + <style name="TextAppearance.Vector.Caption" parent="TextAppearance.MaterialComponents.Caption"> + <item name="fontFamily">sans-serif</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:textSize">@dimen/text_size_caption</item> + <item name="android:letterSpacing">0</item> + <item name="android:textColor">?vctr_content_secondary</item> + </style> + + <style name="TextAppearance.Vector.Micro" parent="TextAppearance.MaterialComponents.Caption"> + <item name="fontFamily">sans-serif</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:textSize">@dimen/text_size_micro</item> + <item name="android:letterSpacing">0</item> + </style> + + <style name="TextAppearance.Vector.Button" parent="TextAppearance.MaterialComponents.Button"> + <item name="fontFamily">sans-serif-medium</item> + <item name="android:fontFamily">sans-serif-medium</item> + <item name="android:textSize">@dimen/text_size_button</item> + <item name="android:letterSpacing">0.02</item> + </style> + +</resources> \ No newline at end of file diff --git a/vector/src/main/res/values/theme_black.xml b/library/ui-styles/src/main/res/values/theme_black.xml similarity index 82% rename from vector/src/main/res/values/theme_black.xml rename to library/ui-styles/src/main/res/values/theme_black.xml index cb7381843f..c472a4fae5 100644 --- a/vector/src/main/res/values/theme_black.xml +++ b/library/ui-styles/src/main/res/values/theme_black.xml @@ -3,11 +3,10 @@ <!-- BLACK THEME COLORS --> - <style name="AppTheme.Base.Black" parent="AppTheme.Base.Dark"> + <style name="Base.Theme.Vector.Black" parent="Base.Theme.Vector.Dark"> <!-- Only setting the items we need to override to get the background to be pure black, otherwise inheriting --> <!-- other colors --> - <item name="vctr_home_drawer_header_background">@color/vctr_home_drawer_header_background_black</item> <item name="vctr_unread_room_badge">@color/vctr_unread_room_badge_black</item> <item name="vctr_fab_label_bg">@color/vctr_fab_label_bg_black</item> <item name="vctr_fab_label_stroke">@color/vctr_fab_label_stroke_black</item> @@ -20,17 +19,19 @@ <item name="vctr_reaction_background_off">@color/vctr_reaction_background_off_black</item> <item name="vctr_reaction_background_on">@color/vctr_reaction_background_on_black</item> <item name="vctr_markdown_block_background_color">#FF4D4D4D</item> + <item name="vctr_toolbar_background">@color/element_background_black</item> <!-- Material color --> <item name="colorSurface">@android:color/black</item> <item name="android:colorBackground">@color/element_background_black</item> - <item name="bottomSheetDialogTheme">@style/Vector.BottomSheet.Black</item> + <!-- Default theme --> + <item name="bottomSheetDialogTheme">@style/Theme.Vector.BottomSheetDialog.Black</item> <item name="android:statusBarColor">@android:color/black</item> <item name="android:navigationBarColor">@android:color/black</item> </style> - <style name="AppTheme.Black" parent="AppTheme.Base.Black" /> + <style name="Theme.Vector.Black" parent="Base.Theme.Vector.Black" /> </resources> diff --git a/vector/src/main/res/values/theme_common.xml b/library/ui-styles/src/main/res/values/theme_common.xml similarity index 79% rename from vector/src/main/res/values/theme_common.xml rename to library/ui-styles/src/main/res/values/theme_common.xml index 2fcbd36bdf..2e9c2c5123 100644 --- a/vector/src/main/res/values/theme_common.xml +++ b/library/ui-styles/src/main/res/values/theme_common.xml @@ -2,21 +2,19 @@ <resources> <!-- Launcher Theme, only used for VectorLauncherActivity (will be use even before the Activity is started) --> - <style name="AppTheme.Launcher" parent="AppTheme.Launcher.Base"/> - - <style name="AppTheme.Launcher.Base" parent="Theme.MaterialComponents.Light.NoActionBar"> + <style name="Theme.Vector.Launcher" parent="Theme.MaterialComponents.Light.NoActionBar"> <item name="android:windowBackground">@drawable/splash</item> <item name="colorPrimary">@color/element_accent_light</item> <item name="android:statusBarColor">@color/element_accent_light</item> <item name="android:navigationBarColor">@color/element_accent_light</item> </style> - <style name="AppTheme.AttachmentsPreview" parent="AppTheme.Base.Black"> + <style name="Theme.Vector.Black.AttachmentsPreview"> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:navigationBarColor">@android:color/transparent</item> </style> - <style name="AppTheme.Transparent" parent="AppTheme.Base.Black"> + <style name="Theme.Vector.Black.Transparent"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:windowIsTranslucent">true</item> diff --git a/vector/src/main/res/values/theme_dark.xml b/library/ui-styles/src/main/res/values/theme_dark.xml similarity index 72% rename from vector/src/main/res/values/theme_dark.xml rename to library/ui-styles/src/main/res/values/theme_dark.xml index 385388d3d4..6dcf02139a 100644 --- a/vector/src/main/res/values/theme_dark.xml +++ b/library/ui-styles/src/main/res/values/theme_dark.xml @@ -3,7 +3,7 @@ <!-- DARK THEME COLORS --> - <style name="AppTheme.Base.Dark" parent="Theme.MaterialComponents.NoActionBar"> + <style name="Base.Theme.Vector.Dark" parent="Theme.MaterialComponents.NoActionBar"> <!-- Element attribute for palette --> <!-- content colors --> <item name="vctr_content_primary">@color/element_content_primary_dark</item> @@ -16,7 +16,6 @@ <item name="vctr_system">@color/element_system_dark</item> <!-- other colors --> - <item name="vctr_home_drawer_header_background">@color/vctr_home_drawer_header_background_dark</item> <item name="vctr_unread_room_badge">@color/vctr_unread_room_badge_dark</item> <item name="vctr_fab_label_bg">@color/vctr_fab_label_bg_dark</item> <item name="vctr_fab_label_stroke">@color/vctr_fab_label_stroke_dark</item> @@ -29,9 +28,9 @@ <item name="vctr_room_active_widgets_banner_text">@color/vctr_room_active_widgets_banner_text_dark</item> <item name="vctr_reaction_background_off">@color/vctr_reaction_background_off_dark</item> <item name="vctr_reaction_background_on">@color/vctr_reaction_background_on_dark</item> - <item name="vctr_bottom_nav_icon_color">@color/vctr_bottom_nav_icon_color_dark</item> <item name="vctr_waiting_background_color">@color/vctr_waiting_background_color_dark</item> <item name="vctr_chat_effect_snow_background">@color/vctr_chat_effect_snow_background_dark</item> + <item name="vctr_toolbar_background">@color/element_system_dark</item> <!-- room message colors --> <item name="vctr_notice_secondary">#61708B</item> @@ -44,7 +43,7 @@ <item name="vctr_spoiler_background_color">#FFFFFFFF</item> <!-- Some alias --> - <item name="vctr_header_background">?vctr_content_quinary</item> + <item name="vctr_header_background">?vctr_system</item> <item name="vctr_list_separator">?vctr_content_quinary</item> <item name="vctr_list_separator_system">?vctr_system</item> <item name="vctr_list_separator_on_surface">?vctr_system</item> @@ -63,16 +62,33 @@ <item name="android:colorBackground">@color/element_background_dark</item> <item name="colorOnBackground">?vctr_content_primary</item> + <!--Material type attributes--> + <item name="textAppearanceButton">@style/TextAppearance.Vector.Button</item> + <item name="textAppearanceCaption">@style/TextAppearance.Vector.Caption</item> + <!-- Default Text appearance for TextViews --> + <item name="android:textAppearanceSmall">@style/TextAppearance.Vector.Body</item> + <!-- Text appearance for List item --> + <item name="textAppearanceListItem">@style/TextAppearance.Vector.Subtitle</item> + <item name="textAppearanceListItemSecondary">@style/TextAppearance.Vector.Body</item> + <item name="textAppearanceListItemSmall">@style/TextAppearance.Vector.Body</item> + <!-- Default styles --> - <item name="materialButtonStyle">@style/VectorButtonStyle</item> - <item name="toolbarStyle">@style/VectorToolbarStyle</item> - <item name="materialAlertDialogTheme">@style/VectorAlertDialogStyleDark</item> + <item name="android:textViewStyle">@style/Widget.Vector.TextView.Body</item> + <item name="materialButtonStyle">@style/Widget.Vector.Button</item> + <item name="toolbarStyle">@style/Widget.Vector.Toolbar</item> + <item name="bottomNavigationStyle">@style/BottomNavigation.Vector</item> + <item name="searchViewStyle">@style/Widget.Vector.SearchView</item> + <item name="textInputStyle">@style/Widget.Vector.TextInputLayout</item> + <item name="appBarLayoutStyle">@style/Widget.Vector.AppBarLayout</item> + <item name="popupMenuStyle">@style/Widget.Vector.PopupMenu</item> + <item name="snackbarStyle">@style/Widget.Vector.SnackBar</item> + <item name="snackbarButtonStyle">@style/Widget.Vector.SnackBar.Button</item> + <item name="snackbarTextViewStyle">@style/Widget.Vector.SnackBar.TextView</item> + <item name="actionModeStyle">@style/Widget.Vector.ActionMode</item> - <!-- Default style for text input --> - <item name="textInputStyle">@style/VectorTextInputLayout</item> - - <!-- Default style for AppBarLayout --> - <item name="appBarLayoutStyle">@style/VectorAppBarLayoutStyle</item> + <!-- Default theme --> + <item name="bottomSheetDialogTheme">@style/Theme.Vector.BottomSheetDialog.Dark</item> + <item name="materialAlertDialogTheme">@style/ThemeOverlay.Vector.MaterialAlertDialog</item> <item name="android:textColorLink">@color/element_link_dark</item> @@ -89,34 +105,8 @@ <!-- fonts --> <item name="android:typeface">sans</item> - <!-- custom action bar --> - <item name="android:actionBarStyle">@style/Vector.Styled.ActionBar</item> - <item name="actionBarStyle">@style/Vector.Styled.ActionBar</item> - - <!-- actionbar icons color --> - <item name="actionBarTheme">@style/Vector.ActionBarTheme</item> - - <!-- remove the shadow under the actionbar --> - <item name="android:windowContentOverlay">@null</item> - - <item name="popupMenuStyle">@style/Vector.PopupMenu</item> - - <!-- no divider --> - <item name="android:actionBarDivider">@null</item> - - <!-- Preference --> <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> - <item name="bottomSheetDialogTheme">@style/Vector.BottomSheet.Dark</item> - - <!-- SnackBar --> - <!-- Style to use for SnackBars in this theme. --> - <item name="snackbarStyle">@style/VectorSnackBarStyle</item> - <!-- Style to use for action button within a SnackBar in this theme. --> - <item name="snackbarButtonStyle">@style/VectorSnackBarButton</item> - <!-- Style to use for message text within a SnackBar in this theme. --> - <item name="snackbarTextViewStyle">@style/VectorSnackBarText</item> - <item name="pf_lock_screen">@style/PinCodeScreenStyle</item> <item name="pf_key_button">@style/PinCodeKeyButtonStyle</item> <item name="pf_title">@style/PinCodeTitleStyle</item> @@ -136,14 +126,14 @@ <item name="android:windowSharedElementEnterTransition">@transition/image_preview_transition</item> <item name="android:windowSharedElementExitTransition">@transition/image_preview_transition</item> - <item name="vctr_social_login_button_google_style">@style/WidgetButtonSocialLogin.Google.Dark</item> - <item name="vctr_social_login_button_github_style">@style/WidgetButtonSocialLogin.Github.Dark</item> - <item name="vctr_social_login_button_facebook_style">@style/WidgetButtonSocialLogin.Facebook.Dark</item> - <item name="vctr_social_login_button_twitter_style">@style/WidgetButtonSocialLogin.Twitter.Dark</item> - <item name="vctr_social_login_button_apple_style">@style/WidgetButtonSocialLogin.Apple.Dark</item> - <item name="vctr_social_login_button_gitlab_style">@style/WidgetButtonSocialLogin.Gitlab.Dark</item> + <item name="vctr_social_login_button_google_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Google.Dark</item> + <item name="vctr_social_login_button_github_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Github.Dark</item> + <item name="vctr_social_login_button_facebook_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Facebook.Dark</item> + <item name="vctr_social_login_button_twitter_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Twitter.Dark</item> + <item name="vctr_social_login_button_apple_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Apple.Dark</item> + <item name="vctr_social_login_button_gitlab_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Gitlab.Dark</item> - <item name="actionModeStyle">@style/ActionModeTheme</item> + <item name="vctr_jump_to_unread_style">@style/Widget.Vector.JumpToUnread.Dark</item> <!-- Voice Message --> <item name="vctr_voice_message_lock_background">@color/vctr_voice_message_lock_background_dark</item> @@ -152,6 +142,6 @@ <item name="vctr_voice_message_recording_playback_background">@color/vctr_voice_message_recording_playback_background_dark</item> </style> - <style name="AppTheme.Dark" parent="AppTheme.Base.Dark" /> + <style name="Theme.Vector.Dark" parent="Base.Theme.Vector.Dark" /> </resources> diff --git a/vector/src/main/res/values/theme_light.xml b/library/ui-styles/src/main/res/values/theme_light.xml similarity index 72% rename from vector/src/main/res/values/theme_light.xml rename to library/ui-styles/src/main/res/values/theme_light.xml index 360eea0532..a669c2cb79 100644 --- a/vector/src/main/res/values/theme_light.xml +++ b/library/ui-styles/src/main/res/values/theme_light.xml @@ -3,7 +3,7 @@ <!-- LIGHT THEME COLORS --> - <style name="AppTheme.Base.Light" parent="Theme.MaterialComponents.Light.NoActionBar"> + <style name="Base.Theme.Vector.Light" parent="Theme.MaterialComponents.Light.NoActionBar"> <!-- Element attribute for palette --> <!-- content colors --> <item name="vctr_content_primary">@color/element_content_primary_light</item> @@ -16,7 +16,6 @@ <item name="vctr_system">@color/element_system_light</item> <!-- other colors --> - <item name="vctr_home_drawer_header_background">@color/vctr_home_drawer_header_background_light</item> <item name="vctr_unread_room_badge">@color/vctr_unread_room_badge_light</item> <item name="vctr_fab_label_bg">@color/vctr_fab_label_bg_light</item> <item name="vctr_fab_label_stroke">@color/vctr_fab_label_stroke_light</item> @@ -29,9 +28,9 @@ <item name="vctr_room_active_widgets_banner_text">@color/vctr_room_active_widgets_banner_text_light</item> <item name="vctr_reaction_background_off">@color/vctr_reaction_background_off_light</item> <item name="vctr_reaction_background_on">@color/vctr_reaction_background_on_light</item> - <item name="vctr_bottom_nav_icon_color">@color/vctr_bottom_nav_icon_color_light</item> <item name="vctr_waiting_background_color">@color/vctr_waiting_background_color_light</item> <item name="vctr_chat_effect_snow_background">@color/vctr_chat_effect_snow_background_light</item> + <item name="vctr_toolbar_background">@color/element_background_light</item> <!-- room message colors --> <item name="vctr_notice_secondary">#61708B</item> @@ -44,7 +43,7 @@ <item name="vctr_spoiler_background_color">#FF000000</item> <!-- Some alias --> - <item name="vctr_header_background">?vctr_content_quinary</item> + <item name="vctr_header_background">?vctr_system</item> <item name="vctr_list_separator">?vctr_content_quinary</item> <item name="vctr_list_separator_system">?vctr_system</item> <item name="vctr_list_separator_on_surface">?vctr_system</item> @@ -63,16 +62,33 @@ <item name="android:colorBackground">@color/element_background_light</item> <item name="colorOnBackground">?vctr_content_primary</item> + <!--Material type attributes--> + <item name="textAppearanceButton">@style/TextAppearance.Vector.Button</item> + <item name="textAppearanceCaption">@style/TextAppearance.Vector.Caption</item> + <!-- Default Text appearance for TextViews --> + <item name="android:textAppearanceSmall">@style/TextAppearance.Vector.Body</item> + <!-- Text appearance for List item --> + <item name="textAppearanceListItem">@style/TextAppearance.Vector.Subtitle</item> + <item name="textAppearanceListItemSecondary">@style/TextAppearance.Vector.Body</item> + <item name="textAppearanceListItemSmall">@style/TextAppearance.Vector.Body</item> + <!-- Default styles --> - <item name="materialButtonStyle">@style/VectorButtonStyle</item> - <item name="toolbarStyle">@style/VectorToolbarStyle</item> - <item name="materialAlertDialogTheme">@style/VectorAlertDialogStyleLight</item> + <item name="android:textViewStyle">@style/Widget.Vector.TextView.Body</item> + <item name="materialButtonStyle">@style/Widget.Vector.Button</item> + <item name="toolbarStyle">@style/Widget.Vector.Toolbar</item> + <item name="bottomNavigationStyle">@style/BottomNavigation.Vector</item> + <item name="searchViewStyle">@style/Widget.Vector.SearchView</item> + <item name="textInputStyle">@style/Widget.Vector.TextInputLayout</item> + <item name="appBarLayoutStyle">@style/Widget.Vector.AppBarLayout</item> + <item name="popupMenuStyle">@style/Widget.Vector.PopupMenu</item> + <item name="snackbarStyle">@style/Widget.Vector.SnackBar</item> + <item name="snackbarButtonStyle">@style/Widget.Vector.SnackBar.Button</item> + <item name="snackbarTextViewStyle">@style/Widget.Vector.SnackBar.TextView</item> + <item name="actionModeStyle">@style/Widget.Vector.ActionMode</item> - <!-- Default style for text input --> - <item name="textInputStyle">@style/VectorTextInputLayout</item> - - <!-- Default style for AppBarLayout --> - <item name="appBarLayoutStyle">@style/VectorAppBarLayoutStyle</item> + <!-- Default theme --> + <item name="bottomSheetDialogTheme">@style/Theme.Vector.BottomSheetDialog.Light</item> + <item name="materialAlertDialogTheme">@style/ThemeOverlay.Vector.MaterialAlertDialog</item> <item name="android:textColorLink">@color/element_link_light</item> @@ -89,34 +105,8 @@ <!-- fonts --> <item name="android:typeface">sans</item> - <!-- custom action bar --> - <item name="android:actionBarStyle">@style/Vector.Styled.ActionBar</item> - <item name="actionBarStyle">@style/Vector.Styled.ActionBar</item> - - <!-- actionbar icons color --> - <item name="actionBarTheme">@style/Vector.ActionBarTheme</item> - - <!-- remove the shadow under the actionbar --> - <item name="android:windowContentOverlay">@null</item> - - <item name="popupMenuStyle">@style/Vector.PopupMenu</item> - - <!-- no divider --> - <item name="android:actionBarDivider">@null</item> - - <!-- Preference --> <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> - <item name="bottomSheetDialogTheme">@style/Vector.BottomSheet.Light</item> - - <!-- SnackBar --> - <!-- Style to use for SnackBars in this theme. --> - <item name="snackbarStyle">@style/VectorSnackBarStyle</item> - <!-- Style to use for action button within a SnackBar in this theme. --> - <item name="snackbarButtonStyle">@style/VectorSnackBarButton</item> - <!-- Style to use for message text within a SnackBar in this theme. --> - <item name="snackbarTextViewStyle">@style/VectorSnackBarText</item> - <item name="pf_lock_screen">@style/PinCodeScreenStyle</item> <item name="pf_key_button">@style/PinCodeKeyButtonStyle</item> <item name="pf_title">@style/PinCodeTitleStyle</item> @@ -138,14 +128,14 @@ <item name="android:windowSharedElementEnterTransition">@transition/image_preview_transition</item> <item name="android:windowSharedElementExitTransition">@transition/image_preview_transition</item> - <item name="vctr_social_login_button_google_style">@style/WidgetButtonSocialLogin.Google.Light</item> - <item name="vctr_social_login_button_github_style">@style/WidgetButtonSocialLogin.Github.Light</item> - <item name="vctr_social_login_button_facebook_style">@style/WidgetButtonSocialLogin.Facebook.Light</item> - <item name="vctr_social_login_button_twitter_style">@style/WidgetButtonSocialLogin.Twitter.Light</item> - <item name="vctr_social_login_button_apple_style">@style/WidgetButtonSocialLogin.Apple.Light</item> - <item name="vctr_social_login_button_gitlab_style">@style/WidgetButtonSocialLogin.Gitlab.Light</item> + <item name="vctr_social_login_button_google_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Google.Light</item> + <item name="vctr_social_login_button_github_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Github.Light</item> + <item name="vctr_social_login_button_facebook_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Facebook.Light</item> + <item name="vctr_social_login_button_twitter_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Twitter.Light</item> + <item name="vctr_social_login_button_apple_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Apple.Light</item> + <item name="vctr_social_login_button_gitlab_style">@style/Widget.Vector.Button.Outlined.SocialLogin.Gitlab.Light</item> - <item name="actionModeStyle">@style/ActionModeTheme</item> + <item name="vctr_jump_to_unread_style">@style/Widget.Vector.JumpToUnread.Light</item> <!-- Voice Message --> <item name="vctr_voice_message_lock_background">@color/vctr_voice_message_lock_background_light</item> @@ -154,6 +144,6 @@ <item name="vctr_voice_message_recording_playback_background">@color/vctr_voice_message_recording_playback_background_light</item> </style> - <style name="AppTheme.Light" parent="AppTheme.Base.Light" /> + <style name="Theme.Vector.Light" parent="Base.Theme.Vector.Light" /> </resources> diff --git a/vector/src/release/res/values/styles.xml b/library/ui-styles/src/release/res/values/styles.xml similarity index 100% rename from vector/src/release/res/values/styles.xml rename to library/ui-styles/src/release/res/values/styles.xml diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index 875662759a..cb00b0fd56 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -9,7 +9,7 @@ buildscript { mavenCentral() } dependencies { - classpath "io.realm:realm-gradle-plugin:10.5.0" + classpath "io.realm:realm-gradle-plugin:10.6.0" } } @@ -112,7 +112,7 @@ dependencies { def lifecycle_version = '2.2.0' def arch_version = '2.1.0' def markwon_version = '3.1.0' - def daggerVersion = '2.36' + def daggerVersion = '2.37' def work_version = '2.5.0' def retrofit_version = '2.9.0' @@ -169,14 +169,14 @@ dependencies { implementation 'com.otaliastudios:transcoder:0.10.3' // Phone number https://github.com/google/libphonenumber - implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.24' + implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.26' testImplementation 'junit:junit:4.13.2' testImplementation 'org.robolectric:robolectric:4.5.1' //testImplementation 'org.robolectric:shadows-support-v4:3.0' // Note: version sticks to 1.9.2 due to https://github.com/mockk/mockk/issues/281 testImplementation 'io.mockk:mockk:1.11.0' - testImplementation 'org.amshove.kluent:kluent-android:1.65' + testImplementation 'org.amshove.kluent:kluent-android:1.67' testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" // Plant Timber tree for test testImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1' diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/SpaceOrderTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/SpaceOrderTest.kt new file mode 100644 index 0000000000..3270dfb757 --- /dev/null +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/SpaceOrderTest.kt @@ -0,0 +1,260 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk + +import org.amshove.kluent.internal.assertEquals +import org.junit.Assert +import org.junit.Test +import org.matrix.android.sdk.api.session.space.SpaceOrderUtils + +class SpaceOrderTest { + + @Test + fun testOrderBetweenNodesWithOrder() { + val orderedSpaces = listOf( + "roomId1" to "a", + "roomId2" to "m", + "roomId3" to "z" + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 1) + + Assert.assertTrue("Only one order should be changed", orderCommand.size == 1) + Assert.assertTrue("Moved space order should change", orderCommand.first().spaceId == "roomId1") + + Assert.assertTrue("m" < orderCommand[0].order) + Assert.assertTrue(orderCommand[0].order < "z") + } + + @Test + fun testMoveLastBetweenNodesWithOrder() { + val orderedSpaces = listOf( + "roomId1" to "a", + "roomId2" to "m", + "roomId3" to "z" + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 2) + + Assert.assertTrue("Only one order should be changed", orderCommand.size == 1) + Assert.assertTrue("Moved space order should change", orderCommand.first().spaceId == "roomId1") + + Assert.assertTrue("z" < orderCommand[0].order) + } + + @Test + fun testMoveUpNoOrder() { + val orderedSpaces = listOf( + "roomId1" to null, + "roomId2" to null, + "roomId3" to null + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 1) + + Assert.assertTrue("2 orders change should be needed", orderCommand.size == 2) + + val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand) + + Assert.assertEquals("roomId2", reOrdered[0].first) + Assert.assertEquals("roomId1", reOrdered[1].first) + Assert.assertEquals("roomId3", reOrdered[2].first) + } + + @Test + fun testMoveUpNotEnoughSpace() { + val orderedSpaces = listOf( + "roomId1" to "a", + "roomId2" to "j", + "roomId3" to "k" + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 1) + + Assert.assertTrue("more orders change should be needed", orderCommand.size > 1) + + val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand) + + Assert.assertEquals("roomId2", reOrdered[0].first) + Assert.assertEquals("roomId1", reOrdered[1].first) + Assert.assertEquals("roomId3", reOrdered[2].first) + } + + @Test + fun testMoveEndNoOrder() { + val orderedSpaces = listOf( + "roomId1" to null, + "roomId2" to null, + "roomId3" to null + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 2) + + // Actually 2 could be enough... as it's last it can stays with null + Assert.assertEquals("3 orders change should be needed", 3, orderCommand.size) + + val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand) + + Assert.assertEquals("roomId2", reOrdered[0].first) + Assert.assertEquals("roomId3", reOrdered[1].first) + Assert.assertEquals("roomId1", reOrdered[2].first) + } + + @Test + fun testMoveUpBiggerOrder() { + val orderedSpaces = listOf( + "roomId1" to "aaaa", + "roomId2" to "ffff", + "roomId3" to "pppp", + "roomId4" to null, + "roomId5" to null, + "roomId6" to null + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId2", 3) + + // Actually 2 could be enough... as it's last it can stays with null + Assert.assertEquals("3 orders change should be needed", 3, orderCommand.size) + + val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand) + + Assert.assertEquals("roomId1", reOrdered[0].first) + Assert.assertEquals("roomId3", reOrdered[1].first) + Assert.assertEquals("roomId4", reOrdered[2].first) + Assert.assertEquals("roomId5", reOrdered[3].first) + Assert.assertEquals("roomId2", reOrdered[4].first) + Assert.assertEquals("roomId6", reOrdered[5].first) + } + + @Test + fun testMoveDownBetweenNodesWithOrder() { + val orderedSpaces = listOf( + "roomId1" to "a", + "roomId2" to "m", + "roomId3" to "z" + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId3", -1) + + Assert.assertTrue("Only one order should be changed", orderCommand.size == 1) + Assert.assertTrue("Moved space order should change", orderCommand.first().spaceId == "roomId3") + + val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand) + + Assert.assertEquals("roomId1", reOrdered[0].first) + Assert.assertEquals("roomId3", reOrdered[1].first) + Assert.assertEquals("roomId2", reOrdered[2].first) + } + + @Test + fun testMoveDownNoOrder() { + val orderedSpaces = listOf( + "roomId1" to null, + "roomId2" to null, + "roomId3" to null + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId3", -1) + + Assert.assertTrue("2 orders change should be needed", orderCommand.size == 2) + + val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand) + + Assert.assertEquals("roomId1", reOrdered[0].first) + Assert.assertEquals("roomId3", reOrdered[1].first) + Assert.assertEquals("roomId2", reOrdered[2].first) + } + + @Test + fun testMoveDownBiggerOrder() { + val orderedSpaces = listOf( + "roomId1" to "aaaa", + "roomId2" to "ffff", + "roomId3" to "pppp", + "roomId4" to null, + "roomId5" to null, + "roomId6" to null + ).assertSpaceOrdered() + + val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId5", -4) + + Assert.assertEquals("1 order change should be needed", 1, orderCommand.size) + + val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand) + + Assert.assertEquals("roomId5", reOrdered[0].first) + Assert.assertEquals("roomId1", reOrdered[1].first) + Assert.assertEquals("roomId2", reOrdered[2].first) + Assert.assertEquals("roomId3", reOrdered[3].first) + Assert.assertEquals("roomId4", reOrdered[4].first) + Assert.assertEquals("roomId6", reOrdered[5].first) + } + + @Test + fun testMultipleMoveOrder() { + val orderedSpaces = listOf( + "roomId1" to null, + "roomId2" to null, + "roomId3" to null, + "roomId4" to null, + "roomId5" to null, + "roomId6" to null + ).assertSpaceOrdered() + + // move 5 to Top + val fiveToTop = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId5", -4) + + val fiveTopReOrder = reOrderWithCommands(orderedSpaces, fiveToTop) + + // now move 4 to second + val orderCommand = SpaceOrderUtils.orderCommandsForMove(fiveTopReOrder, "roomId4", -3) + + val reOrdered = reOrderWithCommands(fiveTopReOrder, orderCommand) + // second order should cost 1 re-order + Assert.assertEquals(1, orderCommand.size) + + Assert.assertEquals("roomId5", reOrdered[0].first) + Assert.assertEquals("roomId4", reOrdered[1].first) + Assert.assertEquals("roomId1", reOrdered[2].first) + Assert.assertEquals("roomId2", reOrdered[3].first) + Assert.assertEquals("roomId3", reOrdered[4].first) + Assert.assertEquals("roomId6", reOrdered[5].first) + } + + @Test + fun testComparator() { + listOf( + "roomId2" to "a", + "roomId1" to "b", + "roomId3" to null, + "roomId4" to null + ).assertSpaceOrdered() + } + + private fun reOrderWithCommands(orderedSpaces: List<Pair<String, String?>>, orderCommand: List<SpaceOrderUtils.SpaceReOrderCommand>) = + orderedSpaces.map { orderInfo -> + orderInfo.first to (orderCommand.find { it.spaceId == orderInfo.first }?.order ?: orderInfo.second) + } + .sortedWith(testSpaceComparator) + + private fun List<Pair<String, String?>>.assertSpaceOrdered(): List<Pair<String, String?>> { + assertEquals(this, this.sortedWith(testSpaceComparator)) + return this + } + + private val testSpaceComparator = compareBy<Pair<String, String?>, String?>(nullsLast()) { it.second }.thenBy { it.first } +} diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/StringOrderTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/StringOrderTest.kt new file mode 100644 index 0000000000..a625362c04 --- /dev/null +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/StringOrderTest.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk + +import org.amshove.kluent.internal.assertEquals +import org.junit.Assert +import org.junit.Test +import org.matrix.android.sdk.api.MatrixPatterns +import org.matrix.android.sdk.api.util.StringOrderUtils + +class StringOrderTest { + + @Test + fun testbasing() { + assertEquals("a", StringOrderUtils.baseToString(StringOrderUtils.stringToBase("a", StringOrderUtils.DEFAULT_ALPHABET), StringOrderUtils.DEFAULT_ALPHABET)) + assertEquals("element", StringOrderUtils.baseToString(StringOrderUtils.stringToBase("element", StringOrderUtils.DEFAULT_ALPHABET), StringOrderUtils.DEFAULT_ALPHABET)) + assertEquals("matrix", StringOrderUtils.baseToString(StringOrderUtils.stringToBase("matrix", StringOrderUtils.DEFAULT_ALPHABET), StringOrderUtils.DEFAULT_ALPHABET)) + } + + @Test + fun testValid() { + println(StringOrderUtils.DEFAULT_ALPHABET.joinToString(",")) + + assert(MatrixPatterns.isValidOrderString("a")) + assert(MatrixPatterns.isValidOrderString(" ")) + assert(MatrixPatterns.isValidOrderString("abc")) + assert(!MatrixPatterns.isValidOrderString("abcê")) + assert(!MatrixPatterns.isValidOrderString("")) + assert(MatrixPatterns.isValidOrderString("!")) + assert(MatrixPatterns.isValidOrderString("!\"#\$%&'()*+,012")) + assert(!MatrixPatterns.isValidOrderString(Char(' '.code - 1).toString())) + + assert(!MatrixPatterns.isValidOrderString( + buildString { + for (i in 0..49) { + append(StringOrderUtils.DEFAULT_ALPHABET.random()) + } + } + )) + + assert(MatrixPatterns.isValidOrderString( + buildString { + for (i in 0..48) { + append(StringOrderUtils.DEFAULT_ALPHABET.random()) + } + } + )) + } + + @Test + fun testAverage() { + assertAverage("${StringOrderUtils.DEFAULT_ALPHABET.first()}", "m") + assertAverage("aa", "aab") + assertAverage("matrix", "element") + assertAverage("mmm", "mmmmm") + assertAverage("aab", "aa") + assertAverage("", "aa") + assertAverage("a", "z") + assertAverage("ground", "sky") + } + + @Test + fun testMidPoints() { + val orders = StringOrderUtils.midPoints("element", "matrix", 4) + assertEquals(4, orders!!.size) + assert("element" < orders[0]) + assert(orders[0] < orders[1]) + assert(orders[1] < orders[2]) + assert(orders[2] < orders[3]) + assert(orders[3] < "matrix") + + println("element < ${orders.joinToString(" < ") { "[$it]" }} < matrix") + + val orders2 = StringOrderUtils.midPoints("a", "d", 4) + assertEquals(null, orders2) + } + + @Test + fun testRenumberNeeded() { + assertEquals(null, StringOrderUtils.average("a", "a")) + assertEquals(null, StringOrderUtils.average("", "")) + assertEquals(null, StringOrderUtils.average("a", "b")) + assertEquals(null, StringOrderUtils.average("b", "a")) + assertEquals(null, StringOrderUtils.average("mmmm", "mmmm")) + assertEquals(null, StringOrderUtils.average("a${Char(0)}", "a")) + } + + private fun assertAverage(first: String, second: String) { + val left = first.takeIf { first < second } ?: second + val right = first.takeIf { first > second } ?: second + val av1 = StringOrderUtils.average(left, right)!! + println("[$left] < [$av1] < [$right]") + Assert.assertTrue(left < av1) + Assert.assertTrue(av1 < right) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt index d8532c77c8..7f5f3f54ef 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt @@ -71,6 +71,9 @@ object MatrixPatterns { private const val LINK_TO_APP_ROOM_ALIAS_REGEXP = APP_BASE_REGEX + MATRIX_ROOM_ALIAS_REGEX + SEP_REGEX + MATRIX_EVENT_IDENTIFIER_REGEX private val PATTERN_CONTAIN_APP_LINK_PERMALINK_ROOM_ALIAS = LINK_TO_APP_ROOM_ALIAS_REGEXP.toRegex(RegexOption.IGNORE_CASE) + // ascii characters in the range \x20 (space) to \x7E (~) + val ORDER_STRING_REGEX = "[ -~]+".toRegex() + // list of patterns to find some matrix item. val MATRIX_PATTERNS = listOf( PATTERN_CONTAIN_MATRIX_TO_PERMALINK_ROOM_ID, @@ -146,4 +149,18 @@ object MatrixPatterns { fun extractServerNameFromId(matrixId: String?): String? { return matrixId?.substringAfter(":", missingDelimiterValue = "")?.takeIf { it.isNotEmpty() } } + + /** + * Orders which are not strings, or do not consist solely of ascii characters in the range \x20 (space) to \x7E (~), + * or consist of more than 50 characters, are forbidden and the field should be ignored if received. + */ + fun isValidOrderString(order: String?) : Boolean { + return order != null && order.length < 50 && order matches ORDER_STRING_REGEX + } + + fun candidateAliasFromRoomName(name: String): String { + return Regex("\\s").replace(name.lowercase(), "_").let { + "[^a-z0-9._%#@=+-]".toRegex().replace(it, "") + } + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt index 303add747f..d17be59cd4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt @@ -17,6 +17,7 @@ package org.matrix.android.sdk.api.session.call import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -61,4 +62,9 @@ interface CallListener { * Called when the call has been managed by an other session */ fun onCallManagedByOtherSession(callId: String) + + /** + * Called when an asserted identity event is received + */ + fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt index 229a53fa9d..9c3fdd57da 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt @@ -76,6 +76,8 @@ object EventType { const val CALL_NEGOTIATE = "m.call.negotiate" const val CALL_REJECT = "m.call.reject" const val CALL_HANGUP = "m.call.hangup" + const val CALL_ASSERTED_IDENTITY = "m.call.asserted_identity" + const val CALL_ASSERTED_IDENTITY_PREFIX = "org.matrix.call.asserted_identity" // This type is not processed by the client, just sent to the server const val CALL_REPLACES = "m.call.replaces" diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugVectorButtonStylesActivity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/AliasAvailabilityResult.kt similarity index 60% rename from vector/src/debug/java/im/vector/app/features/debug/DebugVectorButtonStylesActivity.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/AliasAvailabilityResult.kt index 783a2a3eb5..6f607569c0 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugVectorButtonStylesActivity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/AliasAvailabilityResult.kt @@ -1,5 +1,5 @@ /* - * Copyright 2021 New Vector Ltd + * Copyright 2021 The Matrix.org Foundation C.I.C. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,11 +14,11 @@ * limitations under the License. */ -package im.vector.app.features.debug +package org.matrix.android.sdk.api.session.room -import im.vector.app.core.platform.VectorBaseActivity -import im.vector.app.databinding.ActivityDebugButtonStylesBinding +import org.matrix.android.sdk.api.session.room.alias.RoomAliasError -class DebugVectorButtonStylesActivity : VectorBaseActivity<ActivityDebugButtonStylesBinding>() { - override fun getBinding() = ActivityDebugButtonStylesBinding.inflate(layoutInflater) +sealed class AliasAvailabilityResult { + object Available: AliasAvailabilityResult() + data class NotAvailable(val roomAliasError: RoomAliasError) : AliasAvailabilityResult() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomDirectoryService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomDirectoryService.kt index 176de8e408..f3e3913bc1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomDirectoryService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomDirectoryService.kt @@ -40,4 +40,6 @@ interface RoomDirectoryService { * Set the visibility of a room in the directory */ suspend fun setRoomDirectoryVisibility(roomId: String, roomDirectoryVisibility: RoomDirectoryVisibility) + + suspend fun checkAliasAvailability(aliasLocalPart: String?) : AliasAvailabilityResult } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt index 871c5378a6..b7377df1b3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt @@ -125,6 +125,12 @@ interface RoomService { */ suspend fun deleteRoomAlias(roomAlias: String) + /** + * Return the current local changes membership for the given room. + * see [getChangeMembershipsLive] for more details. + */ + fun getChangeMemberships(roomIdOrAlias: String): ChangeMembershipState + /** * Return a live data of all local changes membership that happened since the session has been opened. * It allows you to track this in your client to known what is currently being processed by the SDK. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt index 0e80c307b4..96eb86c0d6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt @@ -20,4 +20,5 @@ object RoomAccountDataTypes { const val EVENT_TYPE_VIRTUAL_ROOM = "im.vector.is_virtual_room" const val EVENT_TYPE_TAG = "m.tag" const val EVENT_TYPE_FULLY_READ = "m.fully_read" + const val EVENT_TYPE_SPACE_ORDER = "org.matrix.msc3230.space_order" // m.space_order } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAssertedIdentityContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAssertedIdentityContent.kt new file mode 100644 index 0000000000..4c5413425f --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAssertedIdentityContent.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api.session.room.model.call + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * This event is sent by the callee when they wish to answer the call. + */ +@JsonClass(generateAdapter = true) +data class CallAssertedIdentityContent( + /** + * Required. The ID of the call this event relates to. + */ + @Json(name = "call_id") override val callId: String, + /** + * Required. ID to let user identify remote echo of their own events + */ + @Json(name = "party_id") override val partyId: String? = null, + /** + * Required. The version of the VoIP specification this messages adheres to. + */ + @Json(name = "version") override val version: String?, + + /** + * Optional. Used to inform the transferee who they're now speaking to. + */ + @Json(name = "asserted_identity") val assertedIdentity: AssertedIdentity? = null +) : CallSignalingContent { + + /** + * A user ID may be included if relevant, but unlike target_user, it is purely informational. + * The asserted identity may not represent a matrix user at all, + * in which case just a display_name may be given, or a perhaps a display_name and avatar_url. + */ + @JsonClass(generateAdapter = true) + data class AssertedIdentity( + @Json(name = "id") val id: String? = null, + @Json(name = "display_name") val displayName: String? = null, + @Json(name = "avatar_url") val avatarUrl: String? = null + ) +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceOrderUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceOrderUtils.kt new file mode 100644 index 0000000000..844a5adcb4 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceOrderUtils.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api.session.space + +import org.matrix.android.sdk.api.util.StringOrderUtils + +/** + * Adds some utilities to compute correct string orders when ordering spaces. + * After moving a space (e.g via DnD), client should limit the number of room account data update. + * For example if the space is moved between two other spaces with orders, just update the moved space order by computing + * a mid point between the surrounding orders. + * If the space is moved after a space with no order, all the previous spaces should be then ordered, + * and the computed orders should be chosen so that there is enough gaps in between them to facilitate future re-order. + * Re numbering (i.e change all spaces m.space.order account data) should be avoided as much as possible, + * as the updates might not be atomic for other clients and would makes spaces jump around. + */ +object SpaceOrderUtils { + + data class SpaceReOrderCommand( + val spaceId: String, + val order: String + ) + + /** + * Returns a minimal list of order change in order to re order the space list as per given move. + */ + fun orderCommandsForMove(orderedSpacesToOrderMap: List<Pair<String, String?>>, movedSpaceId: String, delta: Int): List<SpaceReOrderCommand> { + val movedIndex = orderedSpacesToOrderMap.indexOfFirst { it.first == movedSpaceId } + if (movedIndex == -1) return emptyList() + if (delta == 0) return emptyList() + + val targetIndex = if (delta > 0) movedIndex + delta else (movedIndex + delta - 1) + + val nodesToReNumber = mutableListOf<String>() + var lowerBondOrder: String? = null + var index = targetIndex + while (index >= 0 && lowerBondOrder == null) { + val node = orderedSpacesToOrderMap.getOrNull(index) + if (node != null /*null when adding at the end*/) { + val nodeOrder = node.second + if (node.first == movedSpaceId) break + if (nodeOrder == null) { + nodesToReNumber.add(0, node.first) + } else { + lowerBondOrder = nodeOrder + } + } + index-- + } + nodesToReNumber.add(movedSpaceId) + val afterSpace: Pair<String, String?>? = if (orderedSpacesToOrderMap.indices.contains(targetIndex + 1)) { + orderedSpacesToOrderMap[targetIndex + 1] + } else null + + val defaultMaxOrder = CharArray(4) { StringOrderUtils.DEFAULT_ALPHABET.last() } + .joinToString("") + + val defaultMinOrder = CharArray(4) { StringOrderUtils.DEFAULT_ALPHABET.first() } + .joinToString("") + + val afterOrder = afterSpace?.second ?: defaultMaxOrder + + val beforeOrder = lowerBondOrder ?: defaultMinOrder + + val newOrder = StringOrderUtils.midPoints(beforeOrder, afterOrder, nodesToReNumber.size) + + if (newOrder.isNullOrEmpty()) { + // re order all? + val expectedList = orderedSpacesToOrderMap.toMutableList() + expectedList.removeAt(movedIndex).let { + expectedList.add(movedIndex + delta, it) + } + + return StringOrderUtils.midPoints(defaultMinOrder, defaultMaxOrder, orderedSpacesToOrderMap.size)?.let { orders -> + expectedList.mapIndexed { index, pair -> + SpaceReOrderCommand( + pair.first, + orders[index] + ) + } + } ?: emptyList() + } else { + return nodesToReNumber.mapIndexed { i, s -> + SpaceReOrderCommand( + s, + newOrder[i] + ) + } + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt index fedf38fe06..e5288e4045 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt @@ -36,7 +36,11 @@ interface SpaceService { /** * Just a shortcut for space creation for ease of use */ - suspend fun createSpace(name: String, topic: String?, avatarUri: Uri?, isPublic: Boolean): String + suspend fun createSpace(name: String, + topic: String?, + avatarUri: Uri?, + isPublic: Boolean, + roomAliasLocalPart: String? = null): String /** * Get a space from a roomId diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/SpaceOrderContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/SpaceOrderContent.kt new file mode 100644 index 0000000000..a8578347c8 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/SpaceOrderContent.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api.session.space.model + +import com.squareup.moshi.JsonClass +import org.matrix.android.sdk.api.MatrixPatterns + +/** + * { + * "type": "m.space_order", + * "content": { + * "order": "..." + * } + * } + */ +@JsonClass(generateAdapter = true) +data class SpaceOrderContent( + val order: String? = null +) { + fun safeOrder(): String? { + return order?.takeIf { MatrixPatterns.isValidOrderString(it) } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/TopLevelSpaceComparator.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/TopLevelSpaceComparator.kt new file mode 100644 index 0000000000..8af4f3a149 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/TopLevelSpaceComparator.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api.session.space.model + +import org.matrix.android.sdk.api.session.room.model.RoomSummary + +// Can't use regular compare by because Null is considered less than any value, and for space order it's the opposite +class TopLevelSpaceComparator(val orders: Map<String, String?>) : Comparator<RoomSummary> { + + override fun compare(left: RoomSummary?, right: RoomSummary?): Int { + val leftOrder = left?.roomId?.let { orders[it] } + val rightOrder = right?.roomId?.let { orders[it] } + return if (leftOrder != null && rightOrder != null) { + leftOrder.compareTo(rightOrder) + } else { + if (leftOrder == null) { + if (rightOrder == null) { + compareValues(left?.roomId, right?.roomId) + } else { + 1 + } + } else { + -1 + } + } +// .also { +// Timber.w("VAL: compare(${left?.displayName} | $leftOrder ,${right?.displayName} | $rightOrder) = $it") +// } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/StringOrderUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/StringOrderUtils.kt new file mode 100644 index 0000000000..83c8585941 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/StringOrderUtils.kt @@ -0,0 +1,87 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api.util + +import java.math.BigInteger + +object StringOrderUtils { + + val DEFAULT_ALPHABET = buildString { + for (i in 0x20..0x7E) { + append(Char(i)) + } + }.toCharArray() + + // /=Range(0x20, 0x7E) + + fun average(left: String, right: String, alphabet: CharArray = DEFAULT_ALPHABET): String? { + return midPoints(left, right, 1, alphabet)?.firstOrNull() + } + + fun midPoints(left: String, right: String, count: Int, alphabet: CharArray = DEFAULT_ALPHABET): List<String>? { + if (left == right) return null // no space in between.. + if (left > right) return midPoints(right, left, count, alphabet) + val size = maxOf(left.length, right.length) + val leftPadded = pad(left, size, alphabet.first()) + val rightPadded = pad(right, size, alphabet.first()) + val b1 = stringToBase(leftPadded, alphabet) + val b2 = stringToBase(rightPadded, alphabet) + val step = (b2.minus(b1)).div(BigInteger("${count + 1}")) + val orders = mutableListOf<String>() + var previous = left + for (i in 0 until count) { + val newOrder = baseToString(b1.add(step.multiply(BigInteger("${i + 1}"))), alphabet) + orders.add(newOrder) + // ensure there was enought precision + if (previous >= newOrder) return null + previous = newOrder + } + return orders.takeIf { orders.last() < right } + } + + private fun pad(string: String, size: Int, padding: Char): String { + val raw = string.toCharArray() + return CharArray(size).also { + for (index in it.indices) { + if (index < raw.size) { + it[index] = raw[index] + } else { + it[index] = padding + } + } + }.joinToString("") + } + + fun baseToString(x: BigInteger, alphabet: CharArray): String { + val len = alphabet.size.toBigInteger() + if (x < len) { + return alphabet[x.toInt()].toString() + } else { + return baseToString(x.div(len), alphabet) + alphabet[x.rem(len).toInt()].toString() + } + } + + fun stringToBase(x: String, alphabet: CharArray): BigInteger { + if (x.isEmpty()) throw IllegalArgumentException() + val len = alphabet.size.toBigInteger() + var result = BigInteger("0") + x.reversed().forEachIndexed { index, c -> + result += (alphabet.indexOf(c).toBigInteger() * len.pow(index)) + } + return result + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/SessionManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/SessionManager.kt index 441232f57f..c746ad863a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/SessionManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/SessionManager.kt @@ -51,7 +51,7 @@ internal class SessionManager @Inject constructor(private val matrixComponent: M } } - private fun getOrCreateSessionComponent(sessionParams: SessionParams): SessionComponent { + fun getOrCreateSessionComponent(sessionParams: SessionParams): SessionComponent { return sessionComponents.getOrPut(sessionParams.credentials.sessionId()) { DaggerSessionComponent .factory() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt index a190ff62ac..473adeb8d2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt @@ -37,7 +37,9 @@ internal class CallEventProcessor @Inject constructor(private val callSignalingH EventType.CALL_CANDIDATES, EventType.CALL_INVITE, EventType.CALL_HANGUP, - EventType.ENCRYPTED + EventType.ENCRYPTED, + EventType.CALL_ASSERTED_IDENTITY, + EventType.CALL_ASSERTED_IDENTITY_PREFIX ) private val eventsToPostProcess = mutableListOf<Event>() @@ -57,9 +59,8 @@ internal class CallEventProcessor @Inject constructor(private val callSignalingH return eventType == EventType.CALL_INVITE } - suspend fun processFastLane(event: Event) { - eventsToPostProcess.add(event) - onPostProcess() + fun processFastLane(event: Event) { + dispatchToCallSignalingHandlerIfNeeded(event) } override suspend fun onPostProcess() { @@ -71,13 +72,12 @@ internal class CallEventProcessor @Inject constructor(private val callSignalingH private fun dispatchToCallSignalingHandlerIfNeeded(event: Event) { val now = System.currentTimeMillis() - // TODO might check if an invite is not closed (hangup/answered) in the same event batch? event.roomId ?: return Unit.also { Timber.w("Event with no room id ${event.eventId}") } val age = now - (event.ageLocalTs ?: now) if (age > 40_000) { - // To old to ring? + // Too old to ring? return } callSignalingHandler.onCallEvent(event) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallListenersDispatcher.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallListenersDispatcher.kt index 1de2d8a106..dad17f4ac9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallListenersDispatcher.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallListenersDispatcher.kt @@ -20,6 +20,7 @@ import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.call.CallListener import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -64,6 +65,10 @@ internal class CallListenersDispatcher(private val listeners: Set<CallListener>) it.onCallNegotiateReceived(callNegotiateContent) } + override fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) = dispatch { + it.onCallAssertedIdentityReceived(callAssertedIdentityContent) + } + private fun dispatch(lambda: (CallListener) -> Unit) { listeners.toList().forEach { tryOrNull { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallSignalingHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallSignalingHandler.kt index 61ea660b60..b0901af719 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallSignalingHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallSignalingHandler.kt @@ -23,6 +23,7 @@ import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -40,6 +41,7 @@ internal class CallSignalingHandler @Inject constructor(private val activeCallHa private val mxCallFactory: MxCallFactory, @UserId private val userId: String) { + private val invitedCallIds = mutableSetOf<String>() private val callListeners = mutableSetOf<CallListener>() private val callListenersDispatcher = CallListenersDispatcher(callListeners) @@ -53,30 +55,44 @@ internal class CallSignalingHandler @Inject constructor(private val activeCallHa fun onCallEvent(event: Event) { when (event.getClearType()) { - EventType.CALL_ANSWER -> { + EventType.CALL_ANSWER -> { handleCallAnswerEvent(event) } - EventType.CALL_INVITE -> { + EventType.CALL_INVITE -> { handleCallInviteEvent(event) } - EventType.CALL_HANGUP -> { + EventType.CALL_HANGUP -> { handleCallHangupEvent(event) } - EventType.CALL_REJECT -> { + EventType.CALL_REJECT -> { handleCallRejectEvent(event) } - EventType.CALL_CANDIDATES -> { + EventType.CALL_CANDIDATES -> { handleCallCandidatesEvent(event) } - EventType.CALL_SELECT_ANSWER -> { + EventType.CALL_SELECT_ANSWER -> { handleCallSelectAnswerEvent(event) } - EventType.CALL_NEGOTIATE -> { + EventType.CALL_NEGOTIATE -> { handleCallNegotiateEvent(event) } + EventType.CALL_ASSERTED_IDENTITY, + EventType.CALL_ASSERTED_IDENTITY_PREFIX -> { + handleCallAssertedIdentityEvent(event) + } } } + private fun handleCallAssertedIdentityEvent(event: Event) { + val content = event.getClearContent().toModel<CallAssertedIdentityContent>() ?: return + val call = content.getCall() ?: return + if (call.ourPartyId == content.partyId) { + // Ignore remote echo (not that we send asserted identity, but still...) + return + } + callListenersDispatcher.onCallAssertedIdentityReceived(content) + } + private fun handleCallNegotiateEvent(event: Event) { val content = event.getClearContent().toModel<CallNegotiateContent>() ?: return val call = content.getCall() ?: return @@ -167,17 +183,17 @@ internal class CallSignalingHandler @Inject constructor(private val activeCallHa val content = event.getClearContent().toModel<CallInviteContent>() ?: return content.callId ?: return - if (activeCallHandler.getCallWithId(content.callId) != null) { + if (invitedCallIds.contains(content.callId)) { // Call is already known, maybe due to fast lane. Ignore Timber.d("Ignoring already known call invite") return } - val incomingCall = mxCallFactory.createIncomingCall( roomId = event.roomId, opponentUserId = event.senderId, content = content ) ?: return + invitedCallIds.add(content.callId) activeCallHandler.addCall(incomingCall) callListenersDispatcher.onCallInviteReceived(incomingCall, content) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/cleanup/CleanupSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/cleanup/CleanupSession.kt index b5c1e6a282..8870d92a35 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/cleanup/CleanupSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/cleanup/CleanupSession.kt @@ -51,15 +51,12 @@ internal class CleanupSession @Inject constructor( @UserMd5 private val userMd5: String ) { suspend fun handle() { - Timber.d("Cleanup: release session...") - sessionManager.releaseSession(sessionId) + Timber.d("Cleanup: delete session params...") + sessionParamsStore.delete(sessionId) Timber.d("Cleanup: cancel pending works...") workManagerProvider.cancelAllWorks() - Timber.d("Cleanup: delete session params...") - sessionParamsStore.delete(sessionId) - Timber.d("Cleanup: clear session data...") clearSessionDataTask.execute(Unit) @@ -74,6 +71,9 @@ internal class CleanupSession @Inject constructor( realmKeysUtils.clear(SessionModule.getKeyAlias(userMd5)) realmKeysUtils.clear(CryptoModule.getKeyAlias(userMd5)) + Timber.d("Cleanup: release session...") + sessionManager.releaseSession(sessionId) + // Sanity check if (BuildConfig.DEBUG) { Realm.getGlobalInstanceCount(realmSessionConfiguration) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/events/DefaultEventService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/events/DefaultEventService.kt index d7e9ef2ee0..9d80f27e01 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/events/DefaultEventService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/events/DefaultEventService.kt @@ -29,7 +29,7 @@ internal class DefaultEventService @Inject constructor( override suspend fun getEvent(roomId: String, eventId: String): Event { val event = getEventTask.execute(GetEventTask.Params(roomId, eventId)) - + event.ageLocalTs = event.unsignedData?.age?.let { System.currentTimeMillis() - it } // Fast lane to the call event processors: try to make the incoming call ring faster if (callEventProcessor.shouldProcessFastLane(event.getClearType())) { callEventProcessor.processFastLane(event) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomDirectoryService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomDirectoryService.kt index 218d846afb..7330c91c20 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomDirectoryService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomDirectoryService.kt @@ -16,10 +16,13 @@ package org.matrix.android.sdk.internal.session.room +import org.matrix.android.sdk.api.session.room.AliasAvailabilityResult import org.matrix.android.sdk.api.session.room.RoomDirectoryService +import org.matrix.android.sdk.api.session.room.alias.RoomAliasError import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse +import org.matrix.android.sdk.internal.session.room.alias.RoomAliasAvailabilityChecker import org.matrix.android.sdk.internal.session.room.directory.GetPublicRoomTask import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask import org.matrix.android.sdk.internal.session.room.directory.SetRoomDirectoryVisibilityTask @@ -28,7 +31,8 @@ import javax.inject.Inject internal class DefaultRoomDirectoryService @Inject constructor( private val getPublicRoomTask: GetPublicRoomTask, private val getRoomDirectoryVisibilityTask: GetRoomDirectoryVisibilityTask, - private val setRoomDirectoryVisibilityTask: SetRoomDirectoryVisibilityTask + private val setRoomDirectoryVisibilityTask: SetRoomDirectoryVisibilityTask, + private val roomAliasAvailabilityChecker: RoomAliasAvailabilityChecker ) : RoomDirectoryService { override suspend fun getPublicRooms(server: String?, @@ -43,4 +47,13 @@ internal class DefaultRoomDirectoryService @Inject constructor( override suspend fun setRoomDirectoryVisibility(roomId: String, roomDirectoryVisibility: RoomDirectoryVisibility) { setRoomDirectoryVisibilityTask.execute(SetRoomDirectoryVisibilityTask.Params(roomId, roomDirectoryVisibility)) } + + override suspend fun checkAliasAvailability(aliasLocalPart: String?): AliasAvailabilityResult { + return try { + roomAliasAvailabilityChecker.check(aliasLocalPart) + AliasAvailabilityResult.Available + } catch (failure: RoomAliasError) { + AliasAvailabilityResult.NotAvailable(failure) + } + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt index d9fe1288e2..632ea4c450 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt @@ -134,6 +134,10 @@ internal class DefaultRoomService @Inject constructor( deleteRoomAliasTask.execute(DeleteRoomAliasTask.Params(roomAlias)) } + override fun getChangeMemberships(roomIdOrAlias: String): ChangeMembershipState { + return roomChangeMembershipStateDataSource.getState(roomIdOrAlias) + } + override fun getChangeMembershipsLive(): LiveData<Map<String, ChangeMembershipState>> { return roomChangeMembershipStateDataSource.getLiveStates() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/accountdata/DefaultRoomAccountDataService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/accountdata/DefaultRoomAccountDataService.kt index d43c1d3217..caeeb3bf53 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/accountdata/DefaultRoomAccountDataService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/accountdata/DefaultRoomAccountDataService.kt @@ -26,8 +26,8 @@ import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataServic import org.matrix.android.sdk.api.util.Optional internal class DefaultRoomAccountDataService @AssistedInject constructor(@Assisted private val roomId: String, - private val dataSource: RoomAccountDataDataSource, - private val updateRoomAccountDataTask: UpdateRoomAccountDataTask + private val dataSource: RoomAccountDataDataSource, + private val updateRoomAccountDataTask: UpdateRoomAccountDataTask ) : RoomAccountDataService { @AssistedFactory diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/RoomAliasAvailabilityChecker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/RoomAliasAvailabilityChecker.kt index b39cbaa582..66164c5280 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/RoomAliasAvailabilityChecker.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/RoomAliasAvailabilityChecker.kt @@ -51,13 +51,13 @@ internal class RoomAliasAvailabilityChecker @Inject constructor( } catch (throwable: Throwable) { if (throwable is Failure.ServerError && throwable.httpCode == 404) { // This is a 404, so the alias is available: nominal case - null + return } else { // Other error, propagate it throw throwable } } - ?.let { + .let { // Alias already exists: error case throw RoomAliasError.AliasNotAvailable } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomChangeMembershipStateDataSource.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomChangeMembershipStateDataSource.kt index b9c547d4fb..35d8cb08af 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomChangeMembershipStateDataSource.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomChangeMembershipStateDataSource.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.MutableLiveData import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.internal.session.SessionScope +import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject /** @@ -30,7 +31,7 @@ import javax.inject.Inject internal class RoomChangeMembershipStateDataSource @Inject constructor() { private val mutableLiveStates = MutableLiveData<Map<String, ChangeMembershipState>>(emptyMap()) - private val states = HashMap<String, ChangeMembershipState>() + private val states = ConcurrentHashMap<String, ChangeMembershipState>() /** * This will update local states to be synced with the server. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/joining/JoinRoomTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/joining/JoinRoomTask.kt index 33776e4f6e..562b25683b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/joining/JoinRoomTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/joining/JoinRoomTask.kt @@ -54,6 +54,10 @@ internal class DefaultJoinRoomTask @Inject constructor( ) : JoinRoomTask { override suspend fun execute(params: JoinRoomTask.Params) { + val currentState = roomChangeMembershipStateDataSource.getState(params.roomIdOrAlias) + if (currentState.isInProgress() || currentState == ChangeMembershipState.Joined) { + return + } roomChangeMembershipStateDataSource.updateState(params.roomIdOrAlias, ChangeMembershipState.Joining) val joinRoomResponse = try { executeRequest(globalErrorReceiver) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt index 9c6153b349..0c5c0416f9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt @@ -66,12 +66,13 @@ internal class DefaultSpaceService @Inject constructor( return createRoomTask.executeRetry(params, 3) } - override suspend fun createSpace(name: String, topic: String?, avatarUri: Uri?, isPublic: Boolean): String { + override suspend fun createSpace(name: String, topic: String?, avatarUri: Uri?, isPublic: Boolean, roomAliasLocalPart: String?): String { return createSpace(CreateSpaceParams().apply { this.name = name this.topic = topic this.avatarUri = avatarUri if (isPublic) { + this.roomAliasName = roomAliasLocalPart this.powerLevelContentOverride = (powerLevelContentOverride ?: PowerLevelsContent()).copy( invite = 0 ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DirectChatsHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DirectChatsHelper.kt index e297f59b96..a9e5089774 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DirectChatsHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DirectChatsHelper.kt @@ -31,9 +31,11 @@ internal class DirectChatsHelper @Inject constructor(@SessionDatabase */ fun getLocalUserAccount(filterRoomId: String? = null): MutableMap<String, MutableList<String>> { return Realm.getInstance(realmConfiguration).use { realm -> + // Makes sure we have the latest realm updates, this is important as we sent this information to the server. + realm.refresh() RoomSummaryEntity.getDirectRooms(realm) .asSequence() - .filter { it.roomId != filterRoomId && it.directUserId != null } + .filter { it.roomId != filterRoomId && it.directUserId != null && it.membership.isActive() } .groupByTo(mutableMapOf(), { it.directUserId!! }, { it.roomId }) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/WorkerParamsFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/WorkerParamsFactory.kt index 7aed74d2ca..7a47270efd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/WorkerParamsFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/WorkerParamsFactory.kt @@ -46,7 +46,7 @@ internal object WorkerParamsFactory { inline fun <reified T> fromData(data: Data) = fromData(T::class.java, data) - fun <T> fromData(clazz: Class<T>, data: Data): T? = tryOrNull("Unable to parse work parameters") { + fun <T> fromData(clazz: Class<T>, data: Data): T? = tryOrNull<T?>("Unable to parse work parameters") { val json = data.getString(KEY) return if (json == null) { null diff --git a/matrix-sdk-android/src/main/res/values-fr/strings_sas.xml b/matrix-sdk-android/src/main/res/values-fr/strings_sas.xml index af9d797542..e7d6ef8058 100644 --- a/matrix-sdk-android/src/main/res/values-fr/strings_sas.xml +++ b/matrix-sdk-android/src/main/res/values-fr/strings_sas.xml @@ -33,11 +33,11 @@ <string name="verification_emoji_heart">Cœur</string> <string name="verification_emoji_smiley">Sourire</string> <string name="verification_emoji_robot">Robot</string> - <string name="verification_emoji_hat">Châpeau</string> + <string name="verification_emoji_hat">Chapeau</string> <string name="verification_emoji_glasses">Lunettes</string> <string name="verification_emoji_spanner">Clé à molette</string> <string name="verification_emoji_santa">Père Noël</string> - <string name="verification_emoji_thumbs_up">Pouce en l\'air</string> + <string name="verification_emoji_thumbs_up">Pouce en l’air</string> <string name="verification_emoji_umbrella">Parapluie</string> <string name="verification_emoji_hourglass">Sablier</string> <string name="verification_emoji_clock">Réveil</string> diff --git a/matrix-sdk-android/src/main/res/values-hu/strings_sas.xml b/matrix-sdk-android/src/main/res/values-hu/strings_sas.xml new file mode 100644 index 0000000000..5b5e0e0205 --- /dev/null +++ b/matrix-sdk-android/src/main/res/values-hu/strings_sas.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Generated file, do not edit --> + <string name="verification_emoji_dog">Kutya</string> + <string name="verification_emoji_cat">Macska</string> + <string name="verification_emoji_lion">Oroszlán</string> + <string name="verification_emoji_horse">Ló</string> + <string name="verification_emoji_unicorn">Egyszarvú</string> + <string name="verification_emoji_pig">Malac</string> + <string name="verification_emoji_elephant">Elefánt</string> + <string name="verification_emoji_rabbit">Nyúl</string> + <string name="verification_emoji_panda">Panda</string> + <string name="verification_emoji_rooster">Kakas</string> + <string name="verification_emoji_penguin">Pingvin</string> + <string name="verification_emoji_turtle">Teknős</string> + <string name="verification_emoji_fish">Hal</string> + <string name="verification_emoji_octopus">Polip</string> + <string name="verification_emoji_butterfly">Pillangó</string> + <string name="verification_emoji_flower">Virág</string> + <string name="verification_emoji_tree">Fa</string> + <string name="verification_emoji_cactus">Kaktusz</string> + <string name="verification_emoji_mushroom">Gomba</string> + <string name="verification_emoji_globe">Földgömb</string> + <string name="verification_emoji_moon">Hold</string> + <string name="verification_emoji_cloud">Felhő</string> + <string name="verification_emoji_fire">Tűz</string> + <string name="verification_emoji_banana">Banán</string> + <string name="verification_emoji_apple">Alma</string> + <string name="verification_emoji_strawberry">Eper</string> + <string name="verification_emoji_corn">Kukorica</string> + <string name="verification_emoji_pizza">Pizza</string> + <string name="verification_emoji_cake">Süti</string> + <string name="verification_emoji_heart">Szív</string> + <string name="verification_emoji_smiley">Mosoly</string> + <string name="verification_emoji_robot">Robot</string> + <string name="verification_emoji_hat">Kalap</string> + <string name="verification_emoji_glasses">Szemüveg</string> + <string name="verification_emoji_spanner">Csavarkulcs</string> + <string name="verification_emoji_santa">Télapó</string> + <string name="verification_emoji_thumbs_up">Hüvelykujj fel</string> + <string name="verification_emoji_umbrella">Esernyő</string> + <string name="verification_emoji_hourglass">Homokóra</string> + <string name="verification_emoji_clock">Óra</string> + <string name="verification_emoji_gift">Ajándék</string> + <string name="verification_emoji_light_bulb">Égő</string> + <string name="verification_emoji_book">Könyv</string> + <string name="verification_emoji_pencil">Ceruza</string> + <string name="verification_emoji_paperclip">Gémkapocs</string> + <string name="verification_emoji_scissors">Olló</string> + <string name="verification_emoji_lock">Lakat</string> + <string name="verification_emoji_key">Kulcs</string> + <string name="verification_emoji_hammer">Kalapács</string> + <string name="verification_emoji_telephone">Telefon</string> + <string name="verification_emoji_flag">Zászló</string> + <string name="verification_emoji_train">Vonat</string> + <string name="verification_emoji_bicycle">Kerékpár</string> + <string name="verification_emoji_aeroplane">Repülő</string> + <string name="verification_emoji_rocket">Rakáta</string> + <string name="verification_emoji_trophy">Trófea</string> + <string name="verification_emoji_ball">Labda</string> + <string name="verification_emoji_guitar">Gitár</string> + <string name="verification_emoji_trumpet">Trombita</string> + <string name="verification_emoji_bell">Harang</string> + <string name="verification_emoji_anchor">Horgony</string> + <string name="verification_emoji_headphones">Fejhallgató</string> + <string name="verification_emoji_folder">Mappa</string> + <string name="verification_emoji_pin">Rajszeg</string> +</resources> diff --git a/matrix-sdk-android/src/main/res/values-tzm/strings_sas.xml b/matrix-sdk-android/src/main/res/values-tzm/strings_sas.xml new file mode 100644 index 0000000000..bebf64e5ab --- /dev/null +++ b/matrix-sdk-android/src/main/res/values-tzm/strings_sas.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Generated file, do not edit --> + <string name="verification_emoji_dog">Aydi</string> + <string name="verification_emoji_cat">Amuc</string> + <string name="verification_emoji_lion">Izem</string> + <string name="verification_emoji_horse">Ayyis</string> + <string name="verification_emoji_pig">Ilef</string> + <string name="verification_emoji_elephant">Ilu</string> + <string name="verification_emoji_rabbit">Agnin</string> + <string name="verification_emoji_rooster">Ayaẓiḍ</string> + <string name="verification_emoji_turtle">Ifker</string> + <string name="verification_emoji_fish">Aselm</string> + <string name="verification_emoji_tree">Aseklu</string> + <string name="verification_emoji_mushroom">Agursel</string> + <string name="verification_emoji_moon">Ayyur</string> + <string name="verification_emoji_fire">Timessi</string> + <string name="verification_emoji_banana">Tabanant</string> + <string name="verification_emoji_apple">Tadeffuyt</string> + <string name="verification_emoji_heart">Ul</string> + <string name="verification_emoji_robot">Aṛubu</string> + <string name="verification_emoji_hat">Taraza</string> + <string name="verification_emoji_book">Adlis</string> + <string name="verification_emoji_key">Tasarut</string> + <string name="verification_emoji_telephone">Atilifun</string> + <string name="verification_emoji_flag">Acenyal</string> + <string name="verification_emoji_ball">Tcama</string> + <string name="verification_emoji_guitar">Agiṭaṛ</string> + <string name="verification_emoji_folder">Asdaw</string> +</resources> diff --git a/multipicker/build.gradle b/multipicker/build.gradle index ecccc76ad8..a993c452b0 100644 --- a/multipicker/build.gradle +++ b/multipicker/build.gradle @@ -43,7 +43,7 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.3.0' - implementation "androidx.fragment:fragment-ktx:1.3.4" + implementation "androidx.fragment:fragment-ktx:1.3.5" implementation 'androidx.exifinterface:exifinterface:1.3.2' // Log diff --git a/newsfragment/2449.feature b/newsfragment/2449.feature deleted file mode 100644 index 7fca1730b6..0000000000 --- a/newsfragment/2449.feature +++ /dev/null @@ -1 +0,0 @@ -Migrate DefaultTypingService, KeysImporter and KeysExporter to coroutines \ No newline at end of file diff --git a/newsfragment/3182.feature b/newsfragment/3182.feature deleted file mode 100644 index 83eee3c29c..0000000000 --- a/newsfragment/3182.feature +++ /dev/null @@ -1 +0,0 @@ -Update Message Composer design \ No newline at end of file diff --git a/newsfragment/3207.bugfix b/newsfragment/3207.bugfix new file mode 100644 index 0000000000..162485907b --- /dev/null +++ b/newsfragment/3207.bugfix @@ -0,0 +1 @@ +Space Explore Rooms no feedback on failed to join \ No newline at end of file diff --git a/newsfragment/3435.feature b/newsfragment/3435.feature deleted file mode 100644 index 222092924d..0000000000 --- a/newsfragment/3435.feature +++ /dev/null @@ -1 +0,0 @@ -Cleanup Epoxy items, and debounce all the clicks \ No newline at end of file diff --git a/newsfragment/3459.feature b/newsfragment/3459.feature deleted file mode 100644 index eedec1dfda..0000000000 --- a/newsfragment/3459.feature +++ /dev/null @@ -1,2 +0,0 @@ -Migrate to new colors and cleanup the style and theme -Ref: https://material.io/blog/migrate-android-material-components \ No newline at end of file diff --git a/newsfragment/3467.misc b/newsfragment/3467.misc deleted file mode 100644 index b726da2353..0000000000 --- a/newsfragment/3467.misc +++ /dev/null @@ -1 +0,0 @@ -VoIP: Change hold direction to send-only. \ No newline at end of file diff --git a/newsfragment/3479.removal b/newsfragment/3479.removal deleted file mode 100644 index f492a13f58..0000000000 --- a/newsfragment/3479.removal +++ /dev/null @@ -1 +0,0 @@ -Splits SessionAccountDataService and RoomAccountDataService and offers to query RoomAccountDataEvent at the session level. \ No newline at end of file diff --git a/newsfragment/3520.misc b/newsfragment/3520.misc new file mode 100644 index 0000000000..d015c3e03d --- /dev/null +++ b/newsfragment/3520.misc @@ -0,0 +1 @@ +VoIP: Merge virtual room timeline in corresponding native room (call events only). \ No newline at end of file diff --git a/newsfragment/3531.feature b/newsfragment/3531.feature new file mode 100644 index 0000000000..e8b63584e3 --- /dev/null +++ b/newsfragment/3531.feature @@ -0,0 +1 @@ +Introduces AutoAcceptInvites which can be enabled at compile time. \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 76a15a206d..b88ea99b05 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,3 +4,4 @@ include ':matrix-sdk-android-rx' include ':diff-match-patch' include ':attachment-viewer' include ':multipicker' +include ':library:ui-styles' diff --git a/tools/check/check_code_quality.sh b/tools/check/check_code_quality.sh index 0b4272cbfe..7decb985bb 100755 --- a/tools/check/check_code_quality.sh +++ b/tools/check/check_code_quality.sh @@ -95,6 +95,14 @@ ${searchForbiddenStringsScript} ./tools/check/forbidden_strings_in_resources.txt resultForbiddenStringInResource=$? +echo +echo "Search for forbidden patterns in layouts..." + +${searchForbiddenStringsScript} ./tools/check/forbidden_strings_in_layout.txt \ + ./vector/src/main/res/layout + +resultForbiddenStringInLayout=$? + ####################################################################################################################### # Check files with long lines ####################################################################################################################### @@ -156,7 +164,13 @@ fi echo -if [[ ${resultNbOfDrawable} -eq 0 ]] && [[ ${resultForbiddenStringInCode} -eq 0 ]] && [[ ${resultForbiddenStringInCodeSdk} -eq 0 ]] && [[ ${resultForbiddenStringInResource} -eq 0 ]] && [[ ${resultLongFiles} -eq 0 ]] && [[ ${resultPngInDrawable} -eq 0 ]]; then +if [[ ${resultNbOfDrawable} -eq 0 ]] \ + && [[ ${resultForbiddenStringInCode} -eq 0 ]] \ + && [[ ${resultForbiddenStringInCodeSdk} -eq 0 ]] \ + && [[ ${resultForbiddenStringInResource} -eq 0 ]] \ + && [[ ${resultForbiddenStringInLayout} -eq 0 ]] \ + && [[ ${resultLongFiles} -eq 0 ]] \ + && [[ ${resultPngInDrawable} -eq 0 ]]; then echo "MAIN OK" else echo "❌ MAIN ERROR" diff --git a/tools/check/forbidden_strings_in_layout.txt b/tools/check/forbidden_strings_in_layout.txt new file mode 100644 index 0000000000..09f0d01f69 --- /dev/null +++ b/tools/check/forbidden_strings_in_layout.txt @@ -0,0 +1,27 @@ +# +# Copyright 2021 New Vector Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# This file list String which are not allowed in source code. +# Use Perl regex to write forbidden strings +# Note: line cannot start with a space. Use \s instead. +# It is possible to specify an authorized number of occurrence with === suffix. Default is 0 +# Example: +# AuthorizedStringThreeTimes===3 + +# Extension:xml + +### Use style="@style/Widget.Vector.TextView.*" instead of textSize attribute +android:textSize===9 diff --git a/tools/check/forbidden_strings_in_resources.txt b/tools/check/forbidden_strings_in_resources.txt index 92eec6cdfd..474fb03508 100644 --- a/tools/check/forbidden_strings_in_resources.txt +++ b/tools/check/forbidden_strings_in_resources.txt @@ -98,8 +98,15 @@ layout_constraintLeft_ ### Use com.google.android.material.switchmaterial.SwitchMaterial instead of Switch, the inflater will not automatically inflate Material Views for Switch. <Switch +### Use com.google.android.material.appbar.MaterialToolbar instead of Toolbar, the inflater will not automatically inflate Material Views for Toolbar. +<Toolbar +<androidx\.appcompat\.widget\.Toolbar + ### Use colorSecondary colorAccent ### Use MaterialCardView -<androidx\.cardview\.widget\.CardView \ No newline at end of file +<androidx\.cardview\.widget\.CardView + +### Useless attribute, please remove +android:textStyle=\"normal\" diff --git a/tools/emojis/README.md b/tools/emojis/README.md new file mode 100644 index 0000000000..6e79c54ae3 --- /dev/null +++ b/tools/emojis/README.md @@ -0,0 +1,5 @@ +# Emojis in Element Android + +This folder contains a formatted version of emoji_picker_datasource.json, for easier comparison when doing change. + +It is updated each time the emoji are imported, using ./tools/import_emoji.py. \ No newline at end of file diff --git a/tools/emojis/emoji_picker_datasource_formatted.json b/tools/emojis/emoji_picker_datasource_formatted.json new file mode 100644 index 0000000000..33fc9be128 --- /dev/null +++ b/tools/emojis/emoji_picker_datasource_formatted.json @@ -0,0 +1,23194 @@ +{ + "compressed": true, + "categories": [ + { + "id": "smileys_&_emotion", + "name": "Smileys & Emotion", + "emojis": [ + "grinning-face", + "grinning-face-with-big-eyes", + "grinning-face-with-smiling-eyes", + "beaming-face-with-smiling-eyes", + "grinning-squinting-face", + "grinning-face-with-sweat", + "rolling-on-the-floor-laughing", + "face-with-tears-of-joy", + "slightly-smiling-face", + "upsidedown-face", + "winking-face", + "smiling-face-with-smiling-eyes", + "smiling-face-with-halo", + "smiling-face-with-hearts", + "smiling-face-with-hearteyes", + "starstruck", + "face-blowing-a-kiss", + "kissing-face", + "smiling-face", + "kissing-face-with-closed-eyes", + "kissing-face-with-smiling-eyes", + "smiling-face-with-tear", + "face-savoring-food", + "face-with-tongue", + "winking-face-with-tongue", + "zany-face", + "squinting-face-with-tongue", + "moneymouth-face", + "hugging-face", + "face-with-hand-over-mouth", + "shushing-face", + "thinking-face", + "zippermouth-face", + "face-with-raised-eyebrow", + "neutral-face", + "expressionless-face", + "face-without-mouth", + "face-in-clouds", + "smirking-face", + "unamused-face", + "face-with-rolling-eyes", + "grimacing-face", + "face-exhaling", + "lying-face", + "relieved-face", + "pensive-face", + "sleepy-face", + "drooling-face", + "sleeping-face", + "face-with-medical-mask", + "face-with-thermometer", + "face-with-headbandage", + "nauseated-face", + "face-vomiting", + "sneezing-face", + "hot-face", + "cold-face", + "woozy-face", + "knockedout-face", + "face-with-spiral-eyes", + "exploding-head", + "cowboy-hat-face", + "partying-face", + "disguised-face", + "smiling-face-with-sunglasses", + "nerd-face", + "face-with-monocle", + "confused-face", + "worried-face", + "slightly-frowning-face", + "frowning-face", + "face-with-open-mouth", + "hushed-face", + "astonished-face", + "flushed-face", + "pleading-face", + "frowning-face-with-open-mouth", + "anguished-face", + "fearful-face", + "anxious-face-with-sweat", + "sad-but-relieved-face", + "crying-face", + "loudly-crying-face", + "face-screaming-in-fear", + "confounded-face", + "persevering-face", + "disappointed-face", + "downcast-face-with-sweat", + "weary-face", + "tired-face", + "yawning-face", + "face-with-steam-from-nose", + "pouting-face", + "angry-face", + "face-with-symbols-on-mouth", + "smiling-face-with-horns", + "angry-face-with-horns", + "skull", + "skull-and-crossbones", + "pile-of-poo", + "clown-face", + "ogre", + "goblin", + "ghost", + "alien", + "alien-monster", + "robot", + "grinning-cat", + "grinning-cat-with-smiling-eyes", + "cat-with-tears-of-joy", + "smiling-cat-with-hearteyes", + "cat-with-wry-smile", + "kissing-cat", + "weary-cat", + "crying-cat", + "pouting-cat", + "seenoevil-monkey", + "hearnoevil-monkey", + "speaknoevil-monkey", + "kiss-mark", + "love-letter", + "heart-with-arrow", + "heart-with-ribbon", + "sparkling-heart", + "growing-heart", + "beating-heart", + "revolving-hearts", + "two-hearts", + "heart-decoration", + "heart-exclamation", + "broken-heart", + "heart-on-fire", + "mending-heart", + "red-heart", + "orange-heart", + "yellow-heart", + "green-heart", + "blue-heart", + "purple-heart", + "brown-heart", + "black-heart", + "white-heart", + "hundred-points", + "anger-symbol", + "collision", + "dizzy", + "sweat-droplets", + "dashing-away", + "hole", + "bomb", + "speech-balloon", + "eye-in-speech-bubble", + "left-speech-bubble", + "right-anger-bubble", + "thought-balloon", + "zzz" + ] + }, + { + "id": "people_&_body", + "name": "People & Body", + "emojis": [ + "waving-hand", + "raised-back-of-hand", + "hand-with-fingers-splayed", + "raised-hand", + "vulcan-salute", + "ok-hand", + "pinched-fingers", + "pinching-hand", + "victory-hand", + "crossed-fingers", + "loveyou-gesture", + "sign-of-the-horns", + "call-me-hand", + "backhand-index-pointing-left", + "backhand-index-pointing-right", + "backhand-index-pointing-up", + "middle-finger", + "backhand-index-pointing-down", + "index-pointing-up", + "thumbs-up", + "thumbs-down", + "raised-fist", + "oncoming-fist", + "leftfacing-fist", + "rightfacing-fist", + "clapping-hands", + "raising-hands", + "open-hands", + "palms-up-together", + "handshake", + "folded-hands", + "writing-hand", + "nail-polish", + "selfie", + "flexed-biceps", + "mechanical-arm", + "mechanical-leg", + "leg", + "foot", + "ear", + "ear-with-hearing-aid", + "nose", + "brain", + "anatomical-heart", + "lungs", + "tooth", + "bone", + "eyes", + "eye", + "tongue", + "mouth", + "baby", + "child", + "boy", + "girl", + "person", + "person-blond-hair", + "man", + "person-beard", + "man-beard", + "woman-beard", + "man-red-hair", + "man-curly-hair", + "man-white-hair", + "man-bald", + "woman", + "woman-red-hair", + "person-red-hair", + "woman-curly-hair", + "person-curly-hair", + "woman-white-hair", + "person-white-hair", + "woman-bald", + "person-bald", + "woman-blond-hair", + "man-blond-hair", + "older-person", + "old-man", + "old-woman", + "person-frowning", + "man-frowning", + "woman-frowning", + "person-pouting", + "man-pouting", + "woman-pouting", + "person-gesturing-no", + "man-gesturing-no", + "woman-gesturing-no", + "person-gesturing-ok", + "man-gesturing-ok", + "woman-gesturing-ok", + "person-tipping-hand", + "man-tipping-hand", + "woman-tipping-hand", + "person-raising-hand", + "man-raising-hand", + "woman-raising-hand", + "deaf-person", + "deaf-man", + "deaf-woman", + "person-bowing", + "man-bowing", + "woman-bowing", + "person-facepalming", + "man-facepalming", + "woman-facepalming", + "person-shrugging", + "man-shrugging", + "woman-shrugging", + "health-worker", + "man-health-worker", + "woman-health-worker", + "student", + "man-student", + "woman-student", + "teacher", + "man-teacher", + "woman-teacher", + "judge", + "man-judge", + "woman-judge", + "farmer", + "man-farmer", + "woman-farmer", + "cook", + "man-cook", + "woman-cook", + "mechanic", + "man-mechanic", + "woman-mechanic", + "factory-worker", + "man-factory-worker", + "woman-factory-worker", + "office-worker", + "man-office-worker", + "woman-office-worker", + "scientist", + "man-scientist", + "woman-scientist", + "technologist", + "man-technologist", + "woman-technologist", + "singer", + "man-singer", + "woman-singer", + "artist", + "man-artist", + "woman-artist", + "pilot", + "man-pilot", + "woman-pilot", + "astronaut", + "man-astronaut", + "woman-astronaut", + "firefighter", + "man-firefighter", + "woman-firefighter", + "police-officer", + "man-police-officer", + "woman-police-officer", + "detective", + "man-detective", + "woman-detective", + "guard", + "man-guard", + "woman-guard", + "ninja", + "construction-worker", + "man-construction-worker", + "woman-construction-worker", + "prince", + "princess", + "person-wearing-turban", + "man-wearing-turban", + "woman-wearing-turban", + "person-with-skullcap", + "woman-with-headscarf", + "person-in-tuxedo", + "man-in-tuxedo", + "woman-in-tuxedo", + "person-with-veil", + "man-with-veil", + "woman-with-veil", + "pregnant-woman", + "breastfeeding", + "woman-feeding-baby", + "man-feeding-baby", + "person-feeding-baby", + "baby-angel", + "santa-claus", + "mrs-claus", + "mx-claus", + "superhero", + "man-superhero", + "woman-superhero", + "supervillain", + "man-supervillain", + "woman-supervillain", + "mage", + "man-mage", + "woman-mage", + "fairy", + "man-fairy", + "woman-fairy", + "vampire", + "man-vampire", + "woman-vampire", + "merperson", + "merman", + "mermaid", + "elf", + "man-elf", + "woman-elf", + "genie", + "man-genie", + "woman-genie", + "zombie", + "man-zombie", + "woman-zombie", + "person-getting-massage", + "man-getting-massage", + "woman-getting-massage", + "person-getting-haircut", + "man-getting-haircut", + "woman-getting-haircut", + "person-walking", + "man-walking", + "woman-walking", + "person-standing", + "man-standing", + "woman-standing", + "person-kneeling", + "man-kneeling", + "woman-kneeling", + "person-with-white-cane", + "man-with-white-cane", + "woman-with-white-cane", + "person-in-motorized-wheelchair", + "man-in-motorized-wheelchair", + "woman-in-motorized-wheelchair", + "person-in-manual-wheelchair", + "man-in-manual-wheelchair", + "woman-in-manual-wheelchair", + "person-running", + "man-running", + "woman-running", + "woman-dancing", + "man-dancing", + "person-in-suit-levitating", + "people-with-bunny-ears", + "men-with-bunny-ears", + "women-with-bunny-ears", + "person-in-steamy-room", + "man-in-steamy-room", + "woman-in-steamy-room", + "person-climbing", + "man-climbing", + "woman-climbing", + "person-fencing", + "horse-racing", + "skier", + "snowboarder", + "person-golfing", + "man-golfing", + "woman-golfing", + "person-surfing", + "man-surfing", + "woman-surfing", + "person-rowing-boat", + "man-rowing-boat", + "woman-rowing-boat", + "person-swimming", + "man-swimming", + "woman-swimming", + "person-bouncing-ball", + "man-bouncing-ball", + "woman-bouncing-ball", + "person-lifting-weights", + "man-lifting-weights", + "woman-lifting-weights", + "person-biking", + "man-biking", + "woman-biking", + "person-mountain-biking", + "man-mountain-biking", + "woman-mountain-biking", + "person-cartwheeling", + "man-cartwheeling", + "woman-cartwheeling", + "people-wrestling", + "men-wrestling", + "women-wrestling", + "person-playing-water-polo", + "man-playing-water-polo", + "woman-playing-water-polo", + "person-playing-handball", + "man-playing-handball", + "woman-playing-handball", + "person-juggling", + "man-juggling", + "woman-juggling", + "person-in-lotus-position", + "man-in-lotus-position", + "woman-in-lotus-position", + "person-taking-bath", + "person-in-bed", + "people-holding-hands", + "women-holding-hands", + "woman-and-man-holding-hands", + "men-holding-hands", + "kiss", + "kiss-woman-man", + "kiss-man-man", + "kiss-woman-woman", + "couple-with-heart", + "couple-with-heart-woman-man", + "couple-with-heart-man-man", + "couple-with-heart-woman-woman", + "family", + "family-man-woman-boy", + "family-man-woman-girl", + "family-man-woman-girl-boy", + "family-man-woman-boy-boy", + "family-man-woman-girl-girl", + "family-man-man-boy", + "family-man-man-girl", + "family-man-man-girl-boy", + "family-man-man-boy-boy", + "family-man-man-girl-girl", + "family-woman-woman-boy", + "family-woman-woman-girl", + "family-woman-woman-girl-boy", + "family-woman-woman-boy-boy", + "family-woman-woman-girl-girl", + "family-man-boy", + "family-man-boy-boy", + "family-man-girl", + "family-man-girl-boy", + "family-man-girl-girl", + "family-woman-boy", + "family-woman-boy-boy", + "family-woman-girl", + "family-woman-girl-boy", + "family-woman-girl-girl", + "speaking-head", + "bust-in-silhouette", + "busts-in-silhouette", + "people-hugging", + "footprints" + ] + }, + { + "id": "animals_&_nature", + "name": "Animals & Nature", + "emojis": [ + "monkey-face", + "monkey", + "gorilla", + "orangutan", + "dog-face", + "dog", + "guide-dog", + "service-dog", + "poodle", + "wolf", + "fox", + "raccoon", + "cat-face", + "cat", + "black-cat", + "lion", + "tiger-face", + "tiger", + "leopard", + "horse-face", + "horse", + "unicorn", + "zebra", + "deer", + "bison", + "cow-face", + "ox", + "water-buffalo", + "cow", + "pig-face", + "pig", + "boar", + "pig-nose", + "ram", + "ewe", + "goat", + "camel", + "twohump-camel", + "llama", + "giraffe", + "elephant", + "mammoth", + "rhinoceros", + "hippopotamus", + "mouse-face", + "mouse", + "rat", + "hamster", + "rabbit-face", + "rabbit", + "chipmunk", + "beaver", + "hedgehog", + "bat", + "bear", + "polar-bear", + "koala", + "panda", + "sloth", + "otter", + "skunk", + "kangaroo", + "badger", + "paw-prints", + "turkey", + "chicken", + "rooster", + "hatching-chick", + "baby-chick", + "frontfacing-baby-chick", + "bird", + "penguin", + "dove", + "eagle", + "duck", + "swan", + "owl", + "dodo", + "feather", + "flamingo", + "peacock", + "parrot", + "frog", + "crocodile", + "turtle", + "lizard", + "snake", + "dragon-face", + "dragon", + "sauropod", + "trex", + "spouting-whale", + "whale", + "dolphin", + "seal", + "fish", + "tropical-fish", + "blowfish", + "shark", + "octopus", + "spiral-shell", + "snail", + "butterfly", + "bug", + "ant", + "honeybee", + "beetle", + "lady-beetle", + "cricket", + "cockroach", + "spider", + "spider-web", + "scorpion", + "mosquito", + "fly", + "worm", + "microbe", + "bouquet", + "cherry-blossom", + "white-flower", + "rosette", + "rose", + "wilted-flower", + "hibiscus", + "sunflower", + "blossom", + "tulip", + "seedling", + "potted-plant", + "evergreen-tree", + "deciduous-tree", + "palm-tree", + "cactus", + "sheaf-of-rice", + "herb", + "shamrock", + "four-leaf-clover", + "maple-leaf", + "fallen-leaf", + "leaf-fluttering-in-wind" + ] + }, + { + "id": "food_&_drink", + "name": "Food & Drink", + "emojis": [ + "grapes", + "melon", + "watermelon", + "tangerine", + "lemon", + "banana", + "pineapple", + "mango", + "red-apple", + "green-apple", + "pear", + "peach", + "cherries", + "strawberry", + "blueberries", + "kiwi-fruit", + "tomato", + "olive", + "coconut", + "avocado", + "eggplant", + "potato", + "carrot", + "ear-of-corn", + "hot-pepper", + "bell-pepper", + "cucumber", + "leafy-green", + "broccoli", + "garlic", + "onion", + "mushroom", + "peanuts", + "chestnut", + "bread", + "croissant", + "baguette-bread", + "flatbread", + "pretzel", + "bagel", + "pancakes", + "waffle", + "cheese-wedge", + "meat-on-bone", + "poultry-leg", + "cut-of-meat", + "bacon", + "hamburger", + "french-fries", + "pizza", + "hot-dog", + "sandwich", + "taco", + "burrito", + "tamale", + "stuffed-flatbread", + "falafel", + "egg", + "cooking", + "shallow-pan-of-food", + "pot-of-food", + "fondue", + "bowl-with-spoon", + "green-salad", + "popcorn", + "butter", + "salt", + "canned-food", + "bento-box", + "rice-cracker", + "rice-ball", + "cooked-rice", + "curry-rice", + "steaming-bowl", + "spaghetti", + "roasted-sweet-potato", + "oden", + "sushi", + "fried-shrimp", + "fish-cake-with-swirl", + "moon-cake", + "dango", + "dumpling", + "fortune-cookie", + "takeout-box", + "crab", + "lobster", + "shrimp", + "squid", + "oyster", + "soft-ice-cream", + "shaved-ice", + "ice-cream", + "doughnut", + "cookie", + "birthday-cake", + "shortcake", + "cupcake", + "pie", + "chocolate-bar", + "candy", + "lollipop", + "custard", + "honey-pot", + "baby-bottle", + "glass-of-milk", + "hot-beverage", + "teapot", + "teacup-without-handle", + "sake", + "bottle-with-popping-cork", + "wine-glass", + "cocktail-glass", + "tropical-drink", + "beer-mug", + "clinking-beer-mugs", + "clinking-glasses", + "tumbler-glass", + "cup-with-straw", + "bubble-tea", + "beverage-box", + "mate", + "ice", + "chopsticks", + "fork-and-knife-with-plate", + "fork-and-knife", + "spoon", + "kitchen-knife", + "amphora" + ] + }, + { + "id": "travel_&_places", + "name": "Travel & Places", + "emojis": [ + "globe-showing-europeafrica", + "globe-showing-americas", + "globe-showing-asiaaustralia", + "globe-with-meridians", + "world-map", + "map-of-japan", + "compass", + "snowcapped-mountain", + "mountain", + "volcano", + "mount-fuji", + "camping", + "beach-with-umbrella", + "desert", + "desert-island", + "national-park", + "stadium", + "classical-building", + "building-construction", + "brick", + "rock", + "wood", + "hut", + "houses", + "derelict-house", + "house", + "house-with-garden", + "office-building", + "japanese-post-office", + "post-office", + "hospital", + "bank", + "hotel", + "love-hotel", + "convenience-store", + "school", + "department-store", + "factory", + "japanese-castle", + "castle", + "wedding", + "tokyo-tower", + "statue-of-liberty", + "church", + "mosque", + "hindu-temple", + "synagogue", + "shinto-shrine", + "kaaba", + "fountain", + "tent", + "foggy", + "night-with-stars", + "cityscape", + "sunrise-over-mountains", + "sunrise", + "cityscape-at-dusk", + "sunset", + "bridge-at-night", + "hot-springs", + "carousel-horse", + "ferris-wheel", + "roller-coaster", + "barber-pole", + "circus-tent", + "locomotive", + "railway-car", + "highspeed-train", + "bullet-train", + "train", + "metro", + "light-rail", + "station", + "tram", + "monorail", + "mountain-railway", + "tram-car", + "bus", + "oncoming-bus", + "trolleybus", + "minibus", + "ambulance", + "fire-engine", + "police-car", + "oncoming-police-car", + "taxi", + "oncoming-taxi", + "automobile", + "oncoming-automobile", + "sport-utility-vehicle", + "pickup-truck", + "delivery-truck", + "articulated-lorry", + "tractor", + "racing-car", + "motorcycle", + "motor-scooter", + "manual-wheelchair", + "motorized-wheelchair", + "auto-rickshaw", + "bicycle", + "kick-scooter", + "skateboard", + "roller-skate", + "bus-stop", + "motorway", + "railway-track", + "oil-drum", + "fuel-pump", + "police-car-light", + "horizontal-traffic-light", + "vertical-traffic-light", + "stop-sign", + "construction", + "anchor", + "sailboat", + "canoe", + "speedboat", + "passenger-ship", + "ferry", + "motor-boat", + "ship", + "airplane", + "small-airplane", + "airplane-departure", + "airplane-arrival", + "parachute", + "seat", + "helicopter", + "suspension-railway", + "mountain-cableway", + "aerial-tramway", + "satellite", + "rocket", + "flying-saucer", + "bellhop-bell", + "luggage", + "hourglass-done", + "hourglass-not-done", + "watch", + "alarm-clock", + "stopwatch", + "timer-clock", + "mantelpiece-clock", + "twelve-oclock", + "twelvethirty", + "one-oclock", + "onethirty", + "two-oclock", + "twothirty", + "three-oclock", + "threethirty", + "four-oclock", + "fourthirty", + "five-oclock", + "fivethirty", + "six-oclock", + "sixthirty", + "seven-oclock", + "seventhirty", + "eight-oclock", + "eightthirty", + "nine-oclock", + "ninethirty", + "ten-oclock", + "tenthirty", + "eleven-oclock", + "eleventhirty", + "new-moon", + "waxing-crescent-moon", + "first-quarter-moon", + "waxing-gibbous-moon", + "full-moon", + "waning-gibbous-moon", + "last-quarter-moon", + "waning-crescent-moon", + "crescent-moon", + "new-moon-face", + "first-quarter-moon-face", + "last-quarter-moon-face", + "thermometer", + "sun", + "full-moon-face", + "sun-with-face", + "ringed-planet", + "star", + "glowing-star", + "shooting-star", + "milky-way", + "cloud", + "sun-behind-cloud", + "cloud-with-lightning-and-rain", + "sun-behind-small-cloud", + "sun-behind-large-cloud", + "sun-behind-rain-cloud", + "cloud-with-rain", + "cloud-with-snow", + "cloud-with-lightning", + "tornado", + "fog", + "wind-face", + "cyclone", + "rainbow", + "closed-umbrella", + "umbrella", + "umbrella-with-rain-drops", + "umbrella-on-ground", + "high-voltage", + "snowflake", + "snowman", + "snowman-without-snow", + "comet", + "fire", + "droplet", + "water-wave" + ] + }, + { + "id": "activities", + "name": "Activities", + "emojis": [ + "jackolantern", + "christmas-tree", + "fireworks", + "sparkler", + "firecracker", + "sparkles", + "balloon", + "party-popper", + "confetti-ball", + "tanabata-tree", + "pine-decoration", + "japanese-dolls", + "carp-streamer", + "wind-chime", + "moon-viewing-ceremony", + "red-envelope", + "ribbon", + "wrapped-gift", + "reminder-ribbon", + "admission-tickets", + "ticket", + "military-medal", + "trophy", + "sports-medal", + "1st-place-medal", + "2nd-place-medal", + "3rd-place-medal", + "soccer-ball", + "baseball", + "softball", + "basketball", + "volleyball", + "american-football", + "rugby-football", + "tennis", + "flying-disc", + "bowling", + "cricket-game", + "field-hockey", + "ice-hockey", + "lacrosse", + "ping-pong", + "badminton", + "boxing-glove", + "martial-arts-uniform", + "goal-net", + "flag-in-hole", + "ice-skate", + "fishing-pole", + "diving-mask", + "running-shirt", + "skis", + "sled", + "curling-stone", + "bullseye", + "yoyo", + "kite", + "pool-8-ball", + "crystal-ball", + "magic-wand", + "nazar-amulet", + "video-game", + "joystick", + "slot-machine", + "game-die", + "puzzle-piece", + "teddy-bear", + "piata", + "nesting-dolls", + "spade-suit", + "heart-suit", + "diamond-suit", + "club-suit", + "chess-pawn", + "joker", + "mahjong-red-dragon", + "flower-playing-cards", + "performing-arts", + "framed-picture", + "artist-palette", + "thread", + "sewing-needle", + "yarn", + "knot" + ] + }, + { + "id": "objects", + "name": "Objects", + "emojis": [ + "glasses", + "sunglasses", + "goggles", + "lab-coat", + "safety-vest", + "necktie", + "tshirt", + "jeans", + "scarf", + "gloves", + "coat", + "socks", + "dress", + "kimono", + "sari", + "onepiece-swimsuit", + "briefs", + "shorts", + "bikini", + "womans-clothes", + "purse", + "handbag", + "clutch-bag", + "shopping-bags", + "backpack", + "thong-sandal", + "mans-shoe", + "running-shoe", + "hiking-boot", + "flat-shoe", + "highheeled-shoe", + "womans-sandal", + "ballet-shoes", + "womans-boot", + "crown", + "womans-hat", + "top-hat", + "graduation-cap", + "billed-cap", + "military-helmet", + "rescue-workers-helmet", + "prayer-beads", + "lipstick", + "ring", + "gem-stone", + "muted-speaker", + "speaker-low-volume", + "speaker-medium-volume", + "speaker-high-volume", + "loudspeaker", + "megaphone", + "postal-horn", + "bell", + "bell-with-slash", + "musical-score", + "musical-note", + "musical-notes", + "studio-microphone", + "level-slider", + "control-knobs", + "microphone", + "headphone", + "radio", + "saxophone", + "accordion", + "guitar", + "musical-keyboard", + "trumpet", + "violin", + "banjo", + "drum", + "long-drum", + "mobile-phone", + "mobile-phone-with-arrow", + "telephone", + "telephone-receiver", + "pager", + "fax-machine", + "battery", + "electric-plug", + "laptop", + "desktop-computer", + "printer", + "keyboard", + "computer-mouse", + "trackball", + "computer-disk", + "floppy-disk", + "optical-disk", + "dvd", + "abacus", + "movie-camera", + "film-frames", + "film-projector", + "clapper-board", + "television", + "camera", + "camera-with-flash", + "video-camera", + "videocassette", + "magnifying-glass-tilted-left", + "magnifying-glass-tilted-right", + "candle", + "light-bulb", + "flashlight", + "red-paper-lantern", + "diya-lamp", + "notebook-with-decorative-cover", + "closed-book", + "open-book", + "green-book", + "blue-book", + "orange-book", + "books", + "notebook", + "ledger", + "page-with-curl", + "scroll", + "page-facing-up", + "newspaper", + "rolledup-newspaper", + "bookmark-tabs", + "bookmark", + "label", + "money-bag", + "coin", + "yen-banknote", + "dollar-banknote", + "euro-banknote", + "pound-banknote", + "money-with-wings", + "credit-card", + "receipt", + "chart-increasing-with-yen", + "envelope", + "email", + "incoming-envelope", + "envelope-with-arrow", + "outbox-tray", + "inbox-tray", + "package", + "closed-mailbox-with-raised-flag", + "closed-mailbox-with-lowered-flag", + "open-mailbox-with-raised-flag", + "open-mailbox-with-lowered-flag", + "postbox", + "ballot-box-with-ballot", + "pencil", + "black-nib", + "fountain-pen", + "pen", + "paintbrush", + "crayon", + "memo", + "briefcase", + "file-folder", + "open-file-folder", + "card-index-dividers", + "calendar", + "tearoff-calendar", + "spiral-notepad", + "spiral-calendar", + "card-index", + "chart-increasing", + "chart-decreasing", + "bar-chart", + "clipboard", + "pushpin", + "round-pushpin", + "paperclip", + "linked-paperclips", + "straight-ruler", + "triangular-ruler", + "scissors", + "card-file-box", + "file-cabinet", + "wastebasket", + "locked", + "unlocked", + "locked-with-pen", + "locked-with-key", + "key", + "old-key", + "hammer", + "axe", + "pick", + "hammer-and-pick", + "hammer-and-wrench", + "dagger", + "crossed-swords", + "water-pistol", + "boomerang", + "bow-and-arrow", + "shield", + "carpentry-saw", + "wrench", + "screwdriver", + "nut-and-bolt", + "gear", + "clamp", + "balance-scale", + "white-cane", + "link", + "chains", + "hook", + "toolbox", + "magnet", + "ladder", + "alembic", + "test-tube", + "petri-dish", + "dna", + "microscope", + "telescope", + "satellite-antenna", + "syringe", + "drop-of-blood", + "pill", + "adhesive-bandage", + "stethoscope", + "door", + "elevator", + "mirror", + "window", + "bed", + "couch-and-lamp", + "chair", + "toilet", + "plunger", + "shower", + "bathtub", + "mouse-trap", + "razor", + "lotion-bottle", + "safety-pin", + "broom", + "basket", + "roll-of-paper", + "bucket", + "soap", + "toothbrush", + "sponge", + "fire-extinguisher", + "shopping-cart", + "cigarette", + "coffin", + "headstone", + "funeral-urn", + "moai", + "placard" + ] + }, + { + "id": "symbols", + "name": "Symbols", + "emojis": [ + "atm-sign", + "litter-in-bin-sign", + "potable-water", + "wheelchair-symbol", + "mens-room", + "womens-room", + "restroom", + "baby-symbol", + "water-closet", + "passport-control", + "customs", + "baggage-claim", + "left-luggage", + "warning", + "children-crossing", + "no-entry", + "prohibited", + "no-bicycles", + "no-smoking", + "no-littering", + "nonpotable-water", + "no-pedestrians", + "no-mobile-phones", + "no-one-under-eighteen", + "radioactive", + "biohazard", + "up-arrow", + "upright-arrow", + "right-arrow", + "downright-arrow", + "down-arrow", + "downleft-arrow", + "left-arrow", + "upleft-arrow", + "updown-arrow", + "leftright-arrow", + "right-arrow-curving-left", + "left-arrow-curving-right", + "right-arrow-curving-up", + "right-arrow-curving-down", + "clockwise-vertical-arrows", + "counterclockwise-arrows-button", + "back-arrow", + "end-arrow", + "on-arrow", + "soon-arrow", + "top-arrow", + "place-of-worship", + "atom-symbol", + "om", + "star-of-david", + "wheel-of-dharma", + "yin-yang", + "latin-cross", + "orthodox-cross", + "star-and-crescent", + "peace-symbol", + "menorah", + "dotted-sixpointed-star", + "aries", + "taurus", + "gemini", + "cancer", + "leo", + "virgo", + "libra", + "scorpio", + "sagittarius", + "capricorn", + "aquarius", + "pisces", + "ophiuchus", + "shuffle-tracks-button", + "repeat-button", + "repeat-single-button", + "play-button", + "fastforward-button", + "next-track-button", + "play-or-pause-button", + "reverse-button", + "fast-reverse-button", + "last-track-button", + "upwards-button", + "fast-up-button", + "downwards-button", + "fast-down-button", + "pause-button", + "stop-button", + "record-button", + "eject-button", + "cinema", + "dim-button", + "bright-button", + "antenna-bars", + "vibration-mode", + "mobile-phone-off", + "female-sign", + "male-sign", + "transgender-symbol", + "multiply", + "plus", + "minus", + "divide", + "infinity", + "double-exclamation-mark", + "exclamation-question-mark", + "red-question-mark", + "white-question-mark", + "white-exclamation-mark", + "red-exclamation-mark", + "wavy-dash", + "currency-exchange", + "heavy-dollar-sign", + "medical-symbol", + "recycling-symbol", + "fleurdelis", + "trident-emblem", + "name-badge", + "japanese-symbol-for-beginner", + "hollow-red-circle", + "check-mark-button", + "check-box-with-check", + "check-mark", + "cross-mark", + "cross-mark-button", + "curly-loop", + "double-curly-loop", + "part-alternation-mark", + "eightspoked-asterisk", + "eightpointed-star", + "sparkle", + "copyright", + "registered", + "trade-mark", + "keycap", + "keycap", + "keycap-0", + "keycap-1", + "keycap-2", + "keycap-3", + "keycap-4", + "keycap-5", + "keycap-6", + "keycap-7", + "keycap-8", + "keycap-9", + "keycap-10", + "input-latin-uppercase", + "input-latin-lowercase", + "input-numbers", + "input-symbols", + "input-latin-letters", + "a-button-blood-type", + "ab-button-blood-type", + "b-button-blood-type", + "cl-button", + "cool-button", + "free-button", + "information", + "id-button", + "circled-m", + "new-button", + "ng-button", + "o-button-blood-type", + "ok-button", + "p-button", + "sos-button", + "up-button", + "vs-button", + "japanese-here-button", + "japanese-service-charge-button", + "japanese-monthly-amount-button", + "japanese-not-free-of-charge-button", + "japanese-reserved-button", + "japanese-bargain-button", + "japanese-discount-button", + "japanese-free-of-charge-button", + "japanese-prohibited-button", + "japanese-acceptable-button", + "japanese-application-button", + "japanese-passing-grade-button", + "japanese-vacancy-button", + "japanese-congratulations-button", + "japanese-secret-button", + "japanese-open-for-business-button", + "japanese-no-vacancy-button", + "red-circle", + "orange-circle", + "yellow-circle", + "green-circle", + "blue-circle", + "purple-circle", + "brown-circle", + "black-circle", + "white-circle", + "red-square", + "orange-square", + "yellow-square", + "green-square", + "blue-square", + "purple-square", + "brown-square", + "black-large-square", + "white-large-square", + "black-medium-square", + "white-medium-square", + "black-mediumsmall-square", + "white-mediumsmall-square", + "black-small-square", + "white-small-square", + "large-orange-diamond", + "large-blue-diamond", + "small-orange-diamond", + "small-blue-diamond", + "red-triangle-pointed-up", + "red-triangle-pointed-down", + "diamond-with-a-dot", + "radio-button", + "white-square-button", + "black-square-button" + ] + }, + { + "id": "flags", + "name": "Flags", + "emojis": [ + "chequered-flag", + "triangular-flag", + "crossed-flags", + "black-flag", + "white-flag", + "rainbow-flag", + "transgender-flag", + "pirate-flag", + "flag-ascension-island", + "flag-andorra", + "flag-united-arab-emirates", + "flag-afghanistan", + "flag-antigua--barbuda", + "flag-anguilla", + "flag-albania", + "flag-armenia", + "flag-angola", + "flag-antarctica", + "flag-argentina", + "flag-american-samoa", + "flag-austria", + "flag-australia", + "flag-aruba", + "flag-land-islands", + "flag-azerbaijan", + "flag-bosnia--herzegovina", + "flag-barbados", + "flag-bangladesh", + "flag-belgium", + "flag-burkina-faso", + "flag-bulgaria", + "flag-bahrain", + "flag-burundi", + "flag-benin", + "flag-st-barthlemy", + "flag-bermuda", + "flag-brunei", + "flag-bolivia", + "flag-caribbean-netherlands", + "flag-brazil", + "flag-bahamas", + "flag-bhutan", + "flag-bouvet-island", + "flag-botswana", + "flag-belarus", + "flag-belize", + "flag-canada", + "flag-cocos-keeling-islands", + "flag-congo--kinshasa", + "flag-central-african-republic", + "flag-congo--brazzaville", + "flag-switzerland", + "flag-cte-divoire", + "flag-cook-islands", + "flag-chile", + "flag-cameroon", + "flag-china", + "flag-colombia", + "flag-clipperton-island", + "flag-costa-rica", + "flag-cuba", + "flag-cape-verde", + "flag-curaao", + "flag-christmas-island", + "flag-cyprus", + "flag-czechia", + "flag-germany", + "flag-diego-garcia", + "flag-djibouti", + "flag-denmark", + "flag-dominica", + "flag-dominican-republic", + "flag-algeria", + "flag-ceuta--melilla", + "flag-ecuador", + "flag-estonia", + "flag-egypt", + "flag-western-sahara", + "flag-eritrea", + "flag-spain", + "flag-ethiopia", + "flag-european-union", + "flag-finland", + "flag-fiji", + "flag-falkland-islands", + "flag-micronesia", + "flag-faroe-islands", + "flag-france", + "flag-gabon", + "flag-united-kingdom", + "flag-grenada", + "flag-georgia", + "flag-french-guiana", + "flag-guernsey", + "flag-ghana", + "flag-gibraltar", + "flag-greenland", + "flag-gambia", + "flag-guinea", + "flag-guadeloupe", + "flag-equatorial-guinea", + "flag-greece", + "flag-south-georgia--south-sandwich-islands", + "flag-guatemala", + "flag-guam", + "flag-guineabissau", + "flag-guyana", + "flag-hong-kong-sar-china", + "flag-heard--mcdonald-islands", + "flag-honduras", + "flag-croatia", + "flag-haiti", + "flag-hungary", + "flag-canary-islands", + "flag-indonesia", + "flag-ireland", + "flag-israel", + "flag-isle-of-man", + "flag-india", + "flag-british-indian-ocean-territory", + "flag-iraq", + "flag-iran", + "flag-iceland", + "flag-italy", + "flag-jersey", + "flag-jamaica", + "flag-jordan", + "flag-japan", + "flag-kenya", + "flag-kyrgyzstan", + "flag-cambodia", + "flag-kiribati", + "flag-comoros", + "flag-st-kitts--nevis", + "flag-north-korea", + "flag-south-korea", + "flag-kuwait", + "flag-cayman-islands", + "flag-kazakhstan", + "flag-laos", + "flag-lebanon", + "flag-st-lucia", + "flag-liechtenstein", + "flag-sri-lanka", + "flag-liberia", + "flag-lesotho", + "flag-lithuania", + "flag-luxembourg", + "flag-latvia", + "flag-libya", + "flag-morocco", + "flag-monaco", + "flag-moldova", + "flag-montenegro", + "flag-st-martin", + "flag-madagascar", + "flag-marshall-islands", + "flag-north-macedonia", + "flag-mali", + "flag-myanmar-burma", + "flag-mongolia", + "flag-macao-sar-china", + "flag-northern-mariana-islands", + "flag-martinique", + "flag-mauritania", + "flag-montserrat", + "flag-malta", + "flag-mauritius", + "flag-maldives", + "flag-malawi", + "flag-mexico", + "flag-malaysia", + "flag-mozambique", + "flag-namibia", + "flag-new-caledonia", + "flag-niger", + "flag-norfolk-island", + "flag-nigeria", + "flag-nicaragua", + "flag-netherlands", + "flag-norway", + "flag-nepal", + "flag-nauru", + "flag-niue", + "flag-new-zealand", + "flag-oman", + "flag-panama", + "flag-peru", + "flag-french-polynesia", + "flag-papua-new-guinea", + "flag-philippines", + "flag-pakistan", + "flag-poland", + "flag-st-pierre--miquelon", + "flag-pitcairn-islands", + "flag-puerto-rico", + "flag-palestinian-territories", + "flag-portugal", + "flag-palau", + "flag-paraguay", + "flag-qatar", + "flag-runion", + "flag-romania", + "flag-serbia", + "flag-russia", + "flag-rwanda", + "flag-saudi-arabia", + "flag-solomon-islands", + "flag-seychelles", + "flag-sudan", + "flag-sweden", + "flag-singapore", + "flag-st-helena", + "flag-slovenia", + "flag-svalbard--jan-mayen", + "flag-slovakia", + "flag-sierra-leone", + "flag-san-marino", + "flag-senegal", + "flag-somalia", + "flag-suriname", + "flag-south-sudan", + "flag-so-tom--prncipe", + "flag-el-salvador", + "flag-sint-maarten", + "flag-syria", + "flag-eswatini", + "flag-tristan-da-cunha", + "flag-turks--caicos-islands", + "flag-chad", + "flag-french-southern-territories", + "flag-togo", + "flag-thailand", + "flag-tajikistan", + "flag-tokelau", + "flag-timorleste", + "flag-turkmenistan", + "flag-tunisia", + "flag-tonga", + "flag-turkey", + "flag-trinidad--tobago", + "flag-tuvalu", + "flag-taiwan", + "flag-tanzania", + "flag-ukraine", + "flag-uganda", + "flag-us-outlying-islands", + "flag-united-nations", + "flag-united-states", + "flag-uruguay", + "flag-uzbekistan", + "flag-vatican-city", + "flag-st-vincent--grenadines", + "flag-venezuela", + "flag-british-virgin-islands", + "flag-us-virgin-islands", + "flag-vietnam", + "flag-vanuatu", + "flag-wallis--futuna", + "flag-samoa", + "flag-kosovo", + "flag-yemen", + "flag-mayotte", + "flag-south-africa", + "flag-zambia", + "flag-zimbabwe", + "flag-england", + "flag-scotland", + "flag-wales" + ] + } + ], + "emojis": { + "grinning-face": { + "a": "Grinning Face", + "b": "1F600", + "j": [ + "face", + "grin", + "smile", + "happy", + "joy", + ":D" + ] + }, + "grinning-face-with-big-eyes": { + "a": "Grinning Face with Big Eyes", + "b": "1F603", + "j": [ + "face", + "mouth", + "open", + "smile", + "happy", + "joy", + "haha", + ":D", + ":)", + "funny" + ] + }, + "grinning-face-with-smiling-eyes": { + "a": "Grinning Face with Smiling Eyes", + "b": "1F604", + "j": [ + "eye", + "face", + "mouth", + "open", + "smile", + "happy", + "joy", + "funny", + "haha", + "laugh", + "like", + ":D", + ":)" + ] + }, + "beaming-face-with-smiling-eyes": { + "a": "Beaming Face with Smiling Eyes", + "b": "1F601", + "j": [ + "eye", + "face", + "grin", + "smile", + "happy", + "joy", + "kawaii" + ] + }, + "grinning-squinting-face": { + "a": "Grinning Squinting Face", + "b": "1F606", + "j": [ + "face", + "laugh", + "mouth", + "satisfied", + "smile", + "happy", + "joy", + "lol", + "haha", + "glad", + "XD" + ] + }, + "grinning-face-with-sweat": { + "a": "Grinning Face with Sweat", + "b": "1F605", + "j": [ + "cold", + "face", + "open", + "smile", + "sweat", + "hot", + "happy", + "laugh", + "relief" + ] + }, + "rolling-on-the-floor-laughing": { + "a": "Rolling on the Floor Laughing", + "b": "1F923", + "j": [ + "face", + "floor", + "laugh", + "rofl", + "rolling", + "rotfl", + "laughing", + "lol", + "haha" + ] + }, + "face-with-tears-of-joy": { + "a": "Face with Tears of Joy", + "b": "1F602", + "j": [ + "face", + "joy", + "laugh", + "tear", + "cry", + "tears", + "weep", + "happy", + "happytears", + "haha" + ] + }, + "slightly-smiling-face": { + "a": "Slightly Smiling Face", + "b": "1F642", + "j": [ + "face", + "smile" + ] + }, + "upsidedown-face": { + "a": "Upside-Down Face", + "b": "1F643", + "j": [ + "face", + "upside-down", + "upside_down_face", + "flipped", + "silly", + "smile" + ] + }, + "winking-face": { + "a": "Winking Face", + "b": "1F609", + "j": [ + "face", + "wink", + "happy", + "mischievous", + "secret", + ";)", + "smile", + "eye" + ] + }, + "smiling-face-with-smiling-eyes": { + "a": "Smiling Face with Smiling Eyes", + "b": "1F60A", + "j": [ + "blush", + "eye", + "face", + "smile", + "happy", + "flushed", + "crush", + "embarrassed", + "shy", + "joy" + ] + }, + "smiling-face-with-halo": { + "a": "Smiling Face with Halo", + "b": "1F607", + "j": [ + "angel", + "face", + "fantasy", + "halo", + "innocent", + "heaven" + ] + }, + "smiling-face-with-hearts": { + "a": "Smiling Face with Hearts", + "b": "1F970", + "j": [ + "adore", + "crush", + "hearts", + "in love", + "face", + "love", + "like", + "affection", + "valentines", + "infatuation" + ] + }, + "smiling-face-with-hearteyes": { + "a": "Smiling Face with Heart-Eyes", + "b": "1F60D", + "j": [ + "eye", + "face", + "love", + "smile", + "smiling face with heart-eyes", + "smiling_face_with_heart_eyes", + "like", + "affection", + "valentines", + "infatuation", + "crush", + "heart" + ] + }, + "starstruck": { + "a": "Star-Struck", + "b": "1F929", + "j": [ + "eyes", + "face", + "grinning", + "star", + "star-struck", + "starry-eyed", + "star_struck", + "smile", + "starry" + ] + }, + "face-blowing-a-kiss": { + "a": "Face Blowing a Kiss", + "b": "1F618", + "j": [ + "face", + "kiss", + "love", + "like", + "affection", + "valentines", + "infatuation" + ] + }, + "kissing-face": { + "a": "Kissing Face", + "b": "1F617", + "j": [ + "face", + "kiss", + "love", + "like", + "3", + "valentines", + "infatuation" + ] + }, + "smiling-face": { + "a": "Smiling Face", + "b": "263A", + "j": [ + "face", + "outlined", + "relaxed", + "smile", + "blush", + "massage", + "happiness" + ] + }, + "kissing-face-with-closed-eyes": { + "a": "Kissing Face with Closed Eyes", + "b": "1F61A", + "j": [ + "closed", + "eye", + "face", + "kiss", + "love", + "like", + "affection", + "valentines", + "infatuation" + ] + }, + "kissing-face-with-smiling-eyes": { + "a": "Kissing Face with Smiling Eyes", + "b": "1F619", + "j": [ + "eye", + "face", + "kiss", + "smile", + "affection", + "valentines", + "infatuation" + ] + }, + "smiling-face-with-tear": { + "a": "Smiling Face with Tear", + "b": "1F972", + "j": [ + "grateful", + "proud", + "relieved", + "smiling", + "tear", + "touched", + "sad", + "cry", + "pretend" + ] + }, + "face-savoring-food": { + "a": "Face Savoring Food", + "b": "1F60B", + "j": [ + "delicious", + "face", + "savouring", + "smile", + "yum", + "happy", + "joy", + "tongue", + "silly", + "yummy", + "nom" + ] + }, + "face-with-tongue": { + "a": "Face with Tongue", + "b": "1F61B", + "j": [ + "face", + "tongue", + "prank", + "childish", + "playful", + "mischievous", + "smile" + ] + }, + "winking-face-with-tongue": { + "a": "Winking Face with Tongue", + "b": "1F61C", + "j": [ + "eye", + "face", + "joke", + "tongue", + "wink", + "prank", + "childish", + "playful", + "mischievous", + "smile" + ] + }, + "zany-face": { + "a": "Zany Face", + "b": "1F92A", + "j": [ + "eye", + "goofy", + "large", + "small", + "face", + "crazy" + ] + }, + "squinting-face-with-tongue": { + "a": "Squinting Face with Tongue", + "b": "1F61D", + "j": [ + "eye", + "face", + "horrible", + "taste", + "tongue", + "prank", + "playful", + "mischievous", + "smile" + ] + }, + "moneymouth-face": { + "a": "Money-Mouth Face", + "b": "1F911", + "j": [ + "face", + "money", + "money-mouth face", + "mouth", + "money_mouth_face", + "rich", + "dollar" + ] + }, + "hugging-face": { + "a": "Hugging Face", + "b": "1F917", + "j": [ + "face", + "hug", + "hugging", + "smile" + ] + }, + "face-with-hand-over-mouth": { + "a": "Face with Hand over Mouth", + "b": "1F92D", + "j": [ + "whoops", + "shock", + "sudden realization", + "surprise", + "face" + ] + }, + "shushing-face": { + "a": "Shushing Face", + "b": "1F92B", + "j": [ + "quiet", + "shush", + "face", + "shhh" + ] + }, + "thinking-face": { + "a": "Thinking Face", + "b": "1F914", + "j": [ + "face", + "thinking", + "hmmm", + "think", + "consider" + ] + }, + "zippermouth-face": { + "a": "Zipper-Mouth Face", + "b": "1F910", + "j": [ + "face", + "mouth", + "zipper", + "zipper-mouth face", + "zipper_mouth_face", + "sealed", + "secret" + ] + }, + "face-with-raised-eyebrow": { + "a": "Face with Raised Eyebrow", + "b": "1F928", + "j": [ + "distrust", + "skeptic", + "disapproval", + "disbelief", + "mild surprise", + "scepticism", + "face", + "surprise" + ] + }, + "neutral-face": { + "a": "Neutral Face", + "b": "1F610", + "j": [ + "deadpan", + "face", + "meh", + "neutral", + "indifference", + ":|" + ] + }, + "expressionless-face": { + "a": "Expressionless Face", + "b": "1F611", + "j": [ + "expressionless", + "face", + "inexpressive", + "meh", + "unexpressive", + "indifferent", + "-_-", + "deadpan" + ] + }, + "face-without-mouth": { + "a": "Face Without Mouth", + "b": "1F636", + "j": [ + "face", + "mouth", + "quiet", + "silent", + "hellokitty" + ] + }, + "face-in-clouds": { + "a": "⊛ Face in Clouds", + "b": "1F636-200D-1F32B-FE0F", + "j": [ + "absentminded", + "face in clouds", + "face in the fog", + "head in clouds" + ] + }, + "smirking-face": { + "a": "Smirking Face", + "b": "1F60F", + "j": [ + "face", + "smirk", + "smile", + "mean", + "prank", + "smug", + "sarcasm" + ] + }, + "unamused-face": { + "a": "Unamused Face", + "b": "1F612", + "j": [ + "face", + "unamused", + "unhappy", + "indifference", + "bored", + "straight face", + "serious", + "sarcasm", + "unimpressed", + "skeptical", + "dubious", + "side_eye" + ] + }, + "face-with-rolling-eyes": { + "a": "Face with Rolling Eyes", + "b": "1F644", + "j": [ + "eyeroll", + "eyes", + "face", + "rolling", + "frustrated" + ] + }, + "grimacing-face": { + "a": "Grimacing Face", + "b": "1F62C", + "j": [ + "face", + "grimace", + "teeth" + ] + }, + "face-exhaling": { + "a": "⊛ Face Exhaling", + "b": "1F62E-200D-1F4A8", + "j": [ + "exhale", + "face exhaling", + "gasp", + "groan", + "relief", + "whisper", + "whistle" + ] + }, + "lying-face": { + "a": "Lying Face", + "b": "1F925", + "j": [ + "face", + "lie", + "pinocchio" + ] + }, + "relieved-face": { + "a": "Relieved Face", + "b": "1F60C", + "j": [ + "face", + "relieved", + "relaxed", + "phew", + "massage", + "happiness" + ] + }, + "pensive-face": { + "a": "Pensive Face", + "b": "1F614", + "j": [ + "dejected", + "face", + "pensive", + "sad", + "depressed", + "upset" + ] + }, + "sleepy-face": { + "a": "Sleepy Face", + "b": "1F62A", + "j": [ + "face", + "sleep", + "tired", + "rest", + "nap" + ] + }, + "drooling-face": { + "a": "Drooling Face", + "b": "1F924", + "j": [ + "drooling", + "face" + ] + }, + "sleeping-face": { + "a": "Sleeping Face", + "b": "1F634", + "j": [ + "face", + "sleep", + "zzz", + "tired", + "sleepy", + "night" + ] + }, + "face-with-medical-mask": { + "a": "Face with Medical Mask", + "b": "1F637", + "j": [ + "cold", + "doctor", + "face", + "mask", + "sick", + "ill", + "disease" + ] + }, + "face-with-thermometer": { + "a": "Face with Thermometer", + "b": "1F912", + "j": [ + "face", + "ill", + "sick", + "thermometer", + "temperature", + "cold", + "fever" + ] + }, + "face-with-headbandage": { + "a": "Face with Head-Bandage", + "b": "1F915", + "j": [ + "bandage", + "face", + "face with head-bandage", + "hurt", + "injury", + "face_with_head_bandage", + "injured", + "clumsy" + ] + }, + "nauseated-face": { + "a": "Nauseated Face", + "b": "1F922", + "j": [ + "face", + "nauseated", + "vomit", + "gross", + "green", + "sick", + "throw up", + "ill" + ] + }, + "face-vomiting": { + "a": "Face Vomiting", + "b": "1F92E", + "j": [ + "puke", + "sick", + "vomit", + "face" + ] + }, + "sneezing-face": { + "a": "Sneezing Face", + "b": "1F927", + "j": [ + "face", + "gesundheit", + "sneeze", + "sick", + "allergy" + ] + }, + "hot-face": { + "a": "Hot Face", + "b": "1F975", + "j": [ + "feverish", + "heat stroke", + "hot", + "red-faced", + "sweating", + "face", + "heat", + "red" + ] + }, + "cold-face": { + "a": "Cold Face", + "b": "1F976", + "j": [ + "blue-faced", + "cold", + "freezing", + "frostbite", + "icicles", + "face", + "blue", + "frozen" + ] + }, + "woozy-face": { + "a": "Woozy Face", + "b": "1F974", + "j": [ + "dizzy", + "intoxicated", + "tipsy", + "uneven eyes", + "wavy mouth", + "face", + "wavy" + ] + }, + "knockedout-face": { + "a": "Knocked-out Face", + "b": "1F635", + "j": [ + "dead", + "face", + "knocked out", + "knocked-out face", + "dizzy_face", + "spent", + "unconscious", + "xox", + "dizzy" + ] + }, + "face-with-spiral-eyes": { + "a": "⊛ Face with Spiral Eyes", + "b": "1F635-200D-1F4AB", + "j": [ + "dizzy", + "face with spiral eyes", + "hypnotized", + "spiral", + "trouble", + "whoa" + ] + }, + "exploding-head": { + "a": "Exploding Head", + "b": "1F92F", + "j": [ + "mind blown", + "shocked", + "face", + "mind", + "blown" + ] + }, + "cowboy-hat-face": { + "a": "Cowboy Hat Face", + "b": "1F920", + "j": [ + "cowboy", + "cowgirl", + "face", + "hat" + ] + }, + "partying-face": { + "a": "Partying Face", + "b": "1F973", + "j": [ + "celebration", + "hat", + "horn", + "party", + "face", + "woohoo" + ] + }, + "disguised-face": { + "a": "Disguised Face", + "b": "1F978", + "j": [ + "disguise", + "face", + "glasses", + "incognito", + "nose", + "pretent", + "brows", + "moustache" + ] + }, + "smiling-face-with-sunglasses": { + "a": "Smiling Face with Sunglasses", + "b": "1F60E", + "j": [ + "bright", + "cool", + "face", + "sun", + "sunglasses", + "smile", + "summer", + "beach", + "sunglass" + ] + }, + "nerd-face": { + "a": "Nerd Face", + "b": "1F913", + "j": [ + "face", + "geek", + "nerd", + "nerdy", + "dork" + ] + }, + "face-with-monocle": { + "a": "Face with Monocle", + "b": "1F9D0", + "j": [ + "stuffy", + "wealthy", + "face" + ] + }, + "confused-face": { + "a": "Confused Face", + "b": "1F615", + "j": [ + "confused", + "face", + "meh", + "indifference", + "huh", + "weird", + "hmmm", + ":/" + ] + }, + "worried-face": { + "a": "Worried Face", + "b": "1F61F", + "j": [ + "face", + "worried", + "concern", + "nervous", + ":(" + ] + }, + "slightly-frowning-face": { + "a": "Slightly Frowning Face", + "b": "1F641", + "j": [ + "face", + "frown", + "frowning", + "disappointed", + "sad", + "upset" + ] + }, + "frowning-face": { + "a": "Frowning Face", + "b": "2639", + "j": [ + "face", + "frown", + "sad", + "upset" + ] + }, + "face-with-open-mouth": { + "a": "Face with Open Mouth", + "b": "1F62E", + "j": [ + "face", + "mouth", + "open", + "sympathy", + "surprise", + "impressed", + "wow", + "whoa", + ":O" + ] + }, + "hushed-face": { + "a": "Hushed Face", + "b": "1F62F", + "j": [ + "face", + "hushed", + "stunned", + "surprised", + "woo", + "shh" + ] + }, + "astonished-face": { + "a": "Astonished Face", + "b": "1F632", + "j": [ + "astonished", + "face", + "shocked", + "totally", + "xox", + "surprised", + "poisoned" + ] + }, + "flushed-face": { + "a": "Flushed Face", + "b": "1F633", + "j": [ + "dazed", + "face", + "flushed", + "blush", + "shy", + "flattered" + ] + }, + "pleading-face": { + "a": "Pleading Face", + "b": "1F97A", + "j": [ + "begging", + "mercy", + "puppy eyes", + "face" + ] + }, + "frowning-face-with-open-mouth": { + "a": "Frowning Face with Open Mouth", + "b": "1F626", + "j": [ + "face", + "frown", + "mouth", + "open", + "aw", + "what" + ] + }, + "anguished-face": { + "a": "Anguished Face", + "b": "1F627", + "j": [ + "anguished", + "face", + "stunned", + "nervous" + ] + }, + "fearful-face": { + "a": "Fearful Face", + "b": "1F628", + "j": [ + "face", + "fear", + "fearful", + "scared", + "terrified", + "nervous", + "oops", + "huh" + ] + }, + "anxious-face-with-sweat": { + "a": "Anxious Face with Sweat", + "b": "1F630", + "j": [ + "blue", + "cold", + "face", + "rushed", + "sweat", + "nervous" + ] + }, + "sad-but-relieved-face": { + "a": "Sad but Relieved Face", + "b": "1F625", + "j": [ + "disappointed", + "face", + "relieved", + "whew", + "phew", + "sweat", + "nervous" + ] + }, + "crying-face": { + "a": "Crying Face", + "b": "1F622", + "j": [ + "cry", + "face", + "sad", + "tear", + "tears", + "depressed", + "upset", + ":'(" + ] + }, + "loudly-crying-face": { + "a": "Loudly Crying Face", + "b": "1F62D", + "j": [ + "cry", + "face", + "sad", + "sob", + "tear", + "tears", + "upset", + "depressed" + ] + }, + "face-screaming-in-fear": { + "a": "Face Screaming in Fear", + "b": "1F631", + "j": [ + "face", + "fear", + "munch", + "scared", + "scream", + "omg" + ] + }, + "confounded-face": { + "a": "Confounded Face", + "b": "1F616", + "j": [ + "confounded", + "face", + "confused", + "sick", + "unwell", + "oops", + ":S" + ] + }, + "persevering-face": { + "a": "Persevering Face", + "b": "1F623", + "j": [ + "face", + "persevere", + "sick", + "no", + "upset", + "oops" + ] + }, + "disappointed-face": { + "a": "Disappointed Face", + "b": "1F61E", + "j": [ + "disappointed", + "face", + "sad", + "upset", + "depressed", + ":(" + ] + }, + "downcast-face-with-sweat": { + "a": "Downcast Face with Sweat", + "b": "1F613", + "j": [ + "cold", + "face", + "sweat", + "hot", + "sad", + "tired", + "exercise" + ] + }, + "weary-face": { + "a": "Weary Face", + "b": "1F629", + "j": [ + "face", + "tired", + "weary", + "sleepy", + "sad", + "frustrated", + "upset" + ] + }, + "tired-face": { + "a": "Tired Face", + "b": "1F62B", + "j": [ + "face", + "tired", + "sick", + "whine", + "upset", + "frustrated" + ] + }, + "yawning-face": { + "a": "Yawning Face", + "b": "1F971", + "j": [ + "bored", + "tired", + "yawn", + "sleepy" + ] + }, + "face-with-steam-from-nose": { + "a": "Face with Steam From Nose", + "b": "1F624", + "j": [ + "face", + "triumph", + "won", + "gas", + "phew", + "proud", + "pride" + ] + }, + "pouting-face": { + "a": "Pouting Face", + "b": "1F621", + "j": [ + "angry", + "face", + "mad", + "pouting", + "rage", + "red", + "hate", + "despise" + ] + }, + "angry-face": { + "a": "Angry Face", + "b": "1F620", + "j": [ + "anger", + "angry", + "face", + "mad", + "annoyed", + "frustrated" + ] + }, + "face-with-symbols-on-mouth": { + "a": "Face with Symbols on Mouth", + "b": "1F92C", + "j": [ + "swearing", + "cursing", + "face", + "cussing", + "profanity", + "expletive" + ] + }, + "smiling-face-with-horns": { + "a": "Smiling Face with Horns", + "b": "1F608", + "j": [ + "face", + "fairy tale", + "fantasy", + "horns", + "smile", + "devil" + ] + }, + "angry-face-with-horns": { + "a": "Angry Face with Horns", + "b": "1F47F", + "j": [ + "demon", + "devil", + "face", + "fantasy", + "imp", + "angry", + "horns" + ] + }, + "skull": { + "a": "Skull", + "b": "1F480", + "j": [ + "death", + "face", + "fairy tale", + "monster", + "dead", + "skeleton", + "creepy" + ] + }, + "skull-and-crossbones": { + "a": "Skull and Crossbones", + "b": "2620", + "j": [ + "crossbones", + "death", + "face", + "monster", + "skull", + "poison", + "danger", + "deadly", + "scary", + "pirate", + "evil" + ] + }, + "pile-of-poo": { + "a": "Pile of Poo", + "b": "1F4A9", + "j": [ + "dung", + "face", + "monster", + "poo", + "poop", + "hankey", + "shitface", + "fail", + "turd", + "shit" + ] + }, + "clown-face": { + "a": "Clown Face", + "b": "1F921", + "j": [ + "clown", + "face" + ] + }, + "ogre": { + "a": "Ogre", + "b": "1F479", + "j": [ + "creature", + "face", + "fairy tale", + "fantasy", + "monster", + "troll", + "red", + "mask", + "halloween", + "scary", + "creepy", + "devil", + "demon", + "japanese" + ] + }, + "goblin": { + "a": "Goblin", + "b": "1F47A", + "j": [ + "creature", + "face", + "fairy tale", + "fantasy", + "monster", + "red", + "evil", + "mask", + "scary", + "creepy", + "japanese" + ] + }, + "ghost": { + "a": "Ghost", + "b": "1F47B", + "j": [ + "creature", + "face", + "fairy tale", + "fantasy", + "monster", + "halloween", + "spooky", + "scary" + ] + }, + "alien": { + "a": "Alien", + "b": "1F47D", + "j": [ + "creature", + "extraterrestrial", + "face", + "fantasy", + "ufo", + "UFO", + "paul", + "weird", + "outer_space" + ] + }, + "alien-monster": { + "a": "Alien Monster", + "b": "1F47E", + "j": [ + "alien", + "creature", + "extraterrestrial", + "face", + "monster", + "ufo", + "game", + "arcade", + "play" + ] + }, + "robot": { + "a": "Robot", + "b": "1F916", + "j": [ + "face", + "monster", + "computer", + "machine", + "bot" + ] + }, + "grinning-cat": { + "a": "Grinning Cat", + "b": "1F63A", + "j": [ + "cat", + "face", + "grinning", + "mouth", + "open", + "smile", + "animal", + "cats", + "happy" + ] + }, + "grinning-cat-with-smiling-eyes": { + "a": "Grinning Cat with Smiling Eyes", + "b": "1F638", + "j": [ + "cat", + "eye", + "face", + "grin", + "smile", + "animal", + "cats" + ] + }, + "cat-with-tears-of-joy": { + "a": "Cat with Tears of Joy", + "b": "1F639", + "j": [ + "cat", + "face", + "joy", + "tear", + "animal", + "cats", + "haha", + "happy", + "tears" + ] + }, + "smiling-cat-with-hearteyes": { + "a": "Smiling Cat with Heart-Eyes", + "b": "1F63B", + "j": [ + "cat", + "eye", + "face", + "heart", + "love", + "smile", + "smiling cat with heart-eyes", + "smiling_cat_with_heart_eyes", + "animal", + "like", + "affection", + "cats", + "valentines" + ] + }, + "cat-with-wry-smile": { + "a": "Cat with Wry Smile", + "b": "1F63C", + "j": [ + "cat", + "face", + "ironic", + "smile", + "wry", + "animal", + "cats", + "smirk" + ] + }, + "kissing-cat": { + "a": "Kissing Cat", + "b": "1F63D", + "j": [ + "cat", + "eye", + "face", + "kiss", + "animal", + "cats" + ] + }, + "weary-cat": { + "a": "Weary Cat", + "b": "1F640", + "j": [ + "cat", + "face", + "oh", + "surprised", + "weary", + "animal", + "cats", + "munch", + "scared", + "scream" + ] + }, + "crying-cat": { + "a": "Crying Cat", + "b": "1F63F", + "j": [ + "cat", + "cry", + "face", + "sad", + "tear", + "animal", + "tears", + "weep", + "cats", + "upset" + ] + }, + "pouting-cat": { + "a": "Pouting Cat", + "b": "1F63E", + "j": [ + "cat", + "face", + "pouting", + "animal", + "cats" + ] + }, + "seenoevil-monkey": { + "a": "See-No-Evil Monkey", + "b": "1F648", + "j": [ + "evil", + "face", + "forbidden", + "monkey", + "see", + "see-no-evil monkey", + "see_no_evil_monkey", + "animal", + "nature", + "haha" + ] + }, + "hearnoevil-monkey": { + "a": "Hear-No-Evil Monkey", + "b": "1F649", + "j": [ + "evil", + "face", + "forbidden", + "hear", + "hear-no-evil monkey", + "monkey", + "hear_no_evil_monkey", + "animal", + "nature" + ] + }, + "speaknoevil-monkey": { + "a": "Speak-No-Evil Monkey", + "b": "1F64A", + "j": [ + "evil", + "face", + "forbidden", + "monkey", + "speak", + "speak-no-evil monkey", + "speak_no_evil_monkey", + "animal", + "nature", + "omg" + ] + }, + "kiss-mark": { + "a": "Kiss Mark", + "b": "1F48B", + "j": [ + "kiss", + "lips", + "face", + "love", + "like", + "affection", + "valentines" + ] + }, + "love-letter": { + "a": "Love Letter", + "b": "1F48C", + "j": [ + "heart", + "letter", + "love", + "mail", + "email", + "like", + "affection", + "envelope", + "valentines" + ] + }, + "heart-with-arrow": { + "a": "Heart with Arrow", + "b": "1F498", + "j": [ + "arrow", + "cupid", + "love", + "like", + "heart", + "affection", + "valentines" + ] + }, + "heart-with-ribbon": { + "a": "Heart with Ribbon", + "b": "1F49D", + "j": [ + "ribbon", + "valentine", + "love", + "valentines" + ] + }, + "sparkling-heart": { + "a": "Sparkling Heart", + "b": "1F496", + "j": [ + "excited", + "sparkle", + "love", + "like", + "affection", + "valentines" + ] + }, + "growing-heart": { + "a": "Growing Heart", + "b": "1F497", + "j": [ + "excited", + "growing", + "nervous", + "pulse", + "like", + "love", + "affection", + "valentines", + "pink" + ] + }, + "beating-heart": { + "a": "Beating Heart", + "b": "1F493", + "j": [ + "beating", + "heartbeat", + "pulsating", + "love", + "like", + "affection", + "valentines", + "pink", + "heart" + ] + }, + "revolving-hearts": { + "a": "Revolving Hearts", + "b": "1F49E", + "j": [ + "revolving", + "love", + "like", + "affection", + "valentines" + ] + }, + "two-hearts": { + "a": "Two Hearts", + "b": "1F495", + "j": [ + "love", + "like", + "affection", + "valentines", + "heart" + ] + }, + "heart-decoration": { + "a": "Heart Decoration", + "b": "1F49F", + "j": [ + "heart", + "purple-square", + "love", + "like" + ] + }, + "heart-exclamation": { + "a": "Heart Exclamation", + "b": "2763", + "j": [ + "exclamation", + "mark", + "punctuation", + "decoration", + "love" + ] + }, + "broken-heart": { + "a": "Broken Heart", + "b": "1F494", + "j": [ + "break", + "broken", + "sad", + "sorry", + "heart", + "heartbreak" + ] + }, + "heart-on-fire": { + "a": "⊛ Heart on Fire", + "b": "2764-FE0F-200D-1F525", + "j": [ + "burn", + "heart", + "heart on fire", + "love", + "lust", + "sacred heart" + ] + }, + "mending-heart": { + "a": "⊛ Mending Heart", + "b": "2764-FE0F-200D-1FA79", + "j": [ + "healthier", + "improving", + "mending", + "mending heart", + "recovering", + "recuperating", + "well" + ] + }, + "red-heart": { + "a": "Red Heart", + "b": "2764", + "j": [ + "heart", + "love", + "like", + "valentines" + ] + }, + "orange-heart": { + "a": "Orange Heart", + "b": "1F9E1", + "j": [ + "orange", + "love", + "like", + "affection", + "valentines" + ] + }, + "yellow-heart": { + "a": "Yellow Heart", + "b": "1F49B", + "j": [ + "yellow", + "love", + "like", + "affection", + "valentines" + ] + }, + "green-heart": { + "a": "Green Heart", + "b": "1F49A", + "j": [ + "green", + "love", + "like", + "affection", + "valentines" + ] + }, + "blue-heart": { + "a": "Blue Heart", + "b": "1F499", + "j": [ + "blue", + "love", + "like", + "affection", + "valentines" + ] + }, + "purple-heart": { + "a": "Purple Heart", + "b": "1F49C", + "j": [ + "purple", + "love", + "like", + "affection", + "valentines" + ] + }, + "brown-heart": { + "a": "Brown Heart", + "b": "1F90E", + "j": [ + "brown", + "heart", + "coffee" + ] + }, + "black-heart": { + "a": "Black Heart", + "b": "1F5A4", + "j": [ + "black", + "evil", + "wicked" + ] + }, + "white-heart": { + "a": "White Heart", + "b": "1F90D", + "j": [ + "heart", + "white", + "pure" + ] + }, + "hundred-points": { + "a": "Hundred Points", + "b": "1F4AF", + "j": [ + "100", + "full", + "hundred", + "score", + "perfect", + "numbers", + "century", + "exam", + "quiz", + "test", + "pass" + ] + }, + "anger-symbol": { + "a": "Anger Symbol", + "b": "1F4A2", + "j": [ + "angry", + "comic", + "mad" + ] + }, + "collision": { + "a": "Collision", + "b": "1F4A5", + "j": [ + "boom", + "comic", + "bomb", + "explode", + "explosion", + "blown" + ] + }, + "dizzy": { + "a": "Dizzy", + "b": "1F4AB", + "j": [ + "comic", + "star", + "sparkle", + "shoot", + "magic" + ] + }, + "sweat-droplets": { + "a": "Sweat Droplets", + "b": "1F4A6", + "j": [ + "comic", + "splashing", + "sweat", + "water", + "drip", + "oops" + ] + }, + "dashing-away": { + "a": "Dashing Away", + "b": "1F4A8", + "j": [ + "comic", + "dash", + "running", + "wind", + "air", + "fast", + "shoo", + "fart", + "smoke", + "puff" + ] + }, + "hole": { + "a": "Hole", + "b": "1F573", + "j": [ + "embarrassing" + ] + }, + "bomb": { + "a": "Bomb", + "b": "1F4A3", + "j": [ + "comic", + "boom", + "explode", + "explosion", + "terrorism" + ] + }, + "speech-balloon": { + "a": "Speech Balloon", + "b": "1F4AC", + "j": [ + "balloon", + "bubble", + "comic", + "dialog", + "speech", + "words", + "message", + "talk", + "chatting" + ] + }, + "eye-in-speech-bubble": { + "a": "Eye in Speech Bubble", + "b": "1F441-FE0F-200D-1F5E8-FE0F", + "j": [ + "eye", + "speech bubble", + "witness", + "info" + ] + }, + "left-speech-bubble": { + "a": "Left Speech Bubble", + "b": "1F5E8", + "j": [ + "dialog", + "speech", + "words", + "message", + "talk", + "chatting" + ] + }, + "right-anger-bubble": { + "a": "Right Anger Bubble", + "b": "1F5EF", + "j": [ + "angry", + "balloon", + "bubble", + "mad", + "caption", + "speech", + "thinking" + ] + }, + "thought-balloon": { + "a": "Thought Balloon", + "b": "1F4AD", + "j": [ + "balloon", + "bubble", + "comic", + "thought", + "cloud", + "speech", + "thinking", + "dream" + ] + }, + "zzz": { + "a": "Zzz", + "b": "1F4A4", + "j": [ + "comic", + "sleep", + "sleepy", + "tired", + "dream" + ] + }, + "waving-hand": { + "a": "Waving Hand", + "b": "1F44B", + "j": [ + "hand", + "wave", + "waving", + "hands", + "gesture", + "goodbye", + "solong", + "farewell", + "hello", + "hi", + "palm" + ] + }, + "raised-back-of-hand": { + "a": "Raised Back of Hand", + "b": "1F91A", + "j": [ + "backhand", + "raised", + "fingers" + ] + }, + "hand-with-fingers-splayed": { + "a": "Hand with Fingers Splayed", + "b": "1F590", + "j": [ + "finger", + "hand", + "splayed", + "fingers", + "palm" + ] + }, + "raised-hand": { + "a": "Raised Hand", + "b": "270B", + "j": [ + "hand", + "high 5", + "high five", + "fingers", + "stop", + "highfive", + "palm", + "ban" + ] + }, + "vulcan-salute": { + "a": "Vulcan Salute", + "b": "1F596", + "j": [ + "finger", + "hand", + "spock", + "vulcan", + "fingers", + "star trek" + ] + }, + "ok-hand": { + "a": "Ok Hand", + "b": "1F44C", + "j": [ + "hand", + "OK", + "fingers", + "limbs", + "perfect", + "ok", + "okay" + ] + }, + "pinched-fingers": { + "a": "Pinched Fingers", + "b": "1F90C", + "j": [ + "fingers", + "hand gesture", + "interrogation", + "pinched", + "sarcastic", + "size", + "tiny", + "small" + ] + }, + "pinching-hand": { + "a": "Pinching Hand", + "b": "1F90F", + "j": [ + "small amount", + "tiny", + "small", + "size" + ] + }, + "victory-hand": { + "a": "Victory Hand", + "b": "270C", + "j": [ + "hand", + "v", + "victory", + "fingers", + "ohyeah", + "peace", + "two" + ] + }, + "crossed-fingers": { + "a": "Crossed Fingers", + "b": "1F91E", + "j": [ + "cross", + "finger", + "hand", + "luck", + "good", + "lucky" + ] + }, + "loveyou-gesture": { + "a": "Love-You Gesture", + "b": "1F91F", + "j": [ + "hand", + "ILY", + "love-you gesture", + "love_you_gesture", + "fingers", + "gesture" + ] + }, + "sign-of-the-horns": { + "a": "Sign of the Horns", + "b": "1F918", + "j": [ + "finger", + "hand", + "horns", + "rock-on", + "fingers", + "evil_eye", + "sign_of_horns", + "rock_on" + ] + }, + "call-me-hand": { + "a": "Call Me Hand", + "b": "1F919", + "j": [ + "call", + "hand", + "hands", + "gesture" + ] + }, + "backhand-index-pointing-left": { + "a": "Backhand Index Pointing Left", + "b": "1F448", + "j": [ + "backhand", + "finger", + "hand", + "index", + "point", + "direction", + "fingers", + "left" + ] + }, + "backhand-index-pointing-right": { + "a": "Backhand Index Pointing Right", + "b": "1F449", + "j": [ + "backhand", + "finger", + "hand", + "index", + "point", + "fingers", + "direction", + "right" + ] + }, + "backhand-index-pointing-up": { + "a": "Backhand Index Pointing Up", + "b": "1F446", + "j": [ + "backhand", + "finger", + "hand", + "point", + "up", + "fingers", + "direction" + ] + }, + "middle-finger": { + "a": "Middle Finger", + "b": "1F595", + "j": [ + "finger", + "hand", + "fingers", + "rude", + "middle", + "flipping" + ] + }, + "backhand-index-pointing-down": { + "a": "Backhand Index Pointing Down", + "b": "1F447", + "j": [ + "backhand", + "down", + "finger", + "hand", + "point", + "fingers", + "direction" + ] + }, + "index-pointing-up": { + "a": "Index Pointing Up", + "b": "261D", + "j": [ + "finger", + "hand", + "index", + "point", + "up", + "fingers", + "direction" + ] + }, + "thumbs-up": { + "a": "Thumbs Up", + "b": "1F44D", + "j": [ + "+1", + "hand", + "thumb", + "up", + "thumbsup", + "yes", + "awesome", + "good", + "agree", + "accept", + "cool", + "like" + ] + }, + "thumbs-down": { + "a": "Thumbs Down", + "b": "1F44E", + "j": [ + "-1", + "down", + "hand", + "thumb", + "thumbsdown", + "no", + "dislike" + ] + }, + "raised-fist": { + "a": "Raised Fist", + "b": "270A", + "j": [ + "clenched", + "fist", + "hand", + "punch", + "fingers", + "grasp" + ] + }, + "oncoming-fist": { + "a": "Oncoming Fist", + "b": "1F44A", + "j": [ + "clenched", + "fist", + "hand", + "punch", + "angry", + "violence", + "hit", + "attack" + ] + }, + "leftfacing-fist": { + "a": "Left-Facing Fist", + "b": "1F91B", + "j": [ + "fist", + "left-facing fist", + "leftwards", + "left_facing_fist", + "hand", + "fistbump" + ] + }, + "rightfacing-fist": { + "a": "Right-Facing Fist", + "b": "1F91C", + "j": [ + "fist", + "right-facing fist", + "rightwards", + "right_facing_fist", + "hand", + "fistbump" + ] + }, + "clapping-hands": { + "a": "Clapping Hands", + "b": "1F44F", + "j": [ + "clap", + "hand", + "hands", + "praise", + "applause", + "congrats", + "yay" + ] + }, + "raising-hands": { + "a": "Raising Hands", + "b": "1F64C", + "j": [ + "celebration", + "gesture", + "hand", + "hooray", + "raised", + "yea", + "hands" + ] + }, + "open-hands": { + "a": "Open Hands", + "b": "1F450", + "j": [ + "hand", + "open", + "fingers", + "butterfly", + "hands" + ] + }, + "palms-up-together": { + "a": "Palms Up Together", + "b": "1F932", + "j": [ + "prayer", + "cupped hands", + "hands", + "gesture", + "cupped" + ] + }, + "handshake": { + "a": "Handshake", + "b": "1F91D", + "j": [ + "agreement", + "hand", + "meeting", + "shake" + ] + }, + "folded-hands": { + "a": "Folded Hands", + "b": "1F64F", + "j": [ + "ask", + "hand", + "high 5", + "high five", + "please", + "pray", + "thanks", + "hope", + "wish", + "namaste", + "highfive" + ] + }, + "writing-hand": { + "a": "Writing Hand", + "b": "270D", + "j": [ + "hand", + "write", + "lower_left_ballpoint_pen", + "stationery", + "compose" + ] + }, + "nail-polish": { + "a": "Nail Polish", + "b": "1F485", + "j": [ + "care", + "cosmetics", + "manicure", + "nail", + "polish", + "beauty", + "finger", + "fashion" + ] + }, + "selfie": { + "a": "Selfie", + "b": "1F933", + "j": [ + "camera", + "phone" + ] + }, + "flexed-biceps": { + "a": "Flexed Biceps", + "b": "1F4AA", + "j": [ + "biceps", + "comic", + "flex", + "muscle", + "arm", + "hand", + "summer", + "strong" + ] + }, + "mechanical-arm": { + "a": "Mechanical Arm", + "b": "1F9BE", + "j": [ + "accessibility", + "prosthetic" + ] + }, + "mechanical-leg": { + "a": "Mechanical Leg", + "b": "1F9BF", + "j": [ + "accessibility", + "prosthetic" + ] + }, + "leg": { + "a": "Leg", + "b": "1F9B5", + "j": [ + "kick", + "limb" + ] + }, + "foot": { + "a": "Foot", + "b": "1F9B6", + "j": [ + "kick", + "stomp" + ] + }, + "ear": { + "a": "Ear", + "b": "1F442", + "j": [ + "body", + "face", + "hear", + "sound", + "listen" + ] + }, + "ear-with-hearing-aid": { + "a": "Ear with Hearing Aid", + "b": "1F9BB", + "j": [ + "accessibility", + "hard of hearing" + ] + }, + "nose": { + "a": "Nose", + "b": "1F443", + "j": [ + "body", + "smell", + "sniff" + ] + }, + "brain": { + "a": "Brain", + "b": "1F9E0", + "j": [ + "intelligent", + "smart" + ] + }, + "anatomical-heart": { + "a": "Anatomical Heart", + "b": "1FAC0", + "j": [ + "anatomical", + "cardiology", + "heart", + "organ", + "pulse", + "health", + "heartbeat" + ] + }, + "lungs": { + "a": "Lungs", + "b": "1FAC1", + "j": [ + "breath", + "exhalation", + "inhalation", + "organ", + "respiration", + "breathe" + ] + }, + "tooth": { + "a": "Tooth", + "b": "1F9B7", + "j": [ + "dentist", + "teeth" + ] + }, + "bone": { + "a": "Bone", + "b": "1F9B4", + "j": [ + "skeleton" + ] + }, + "eyes": { + "a": "Eyes", + "b": "1F440", + "j": [ + "eye", + "face", + "look", + "watch", + "stalk", + "peek", + "see" + ] + }, + "eye": { + "a": "Eye", + "b": "1F441", + "j": [ + "body", + "face", + "look", + "see", + "watch", + "stare" + ] + }, + "tongue": { + "a": "Tongue", + "b": "1F445", + "j": [ + "body", + "mouth", + "playful" + ] + }, + "mouth": { + "a": "Mouth", + "b": "1F444", + "j": [ + "lips", + "kiss" + ] + }, + "baby": { + "a": "Baby", + "b": "1F476", + "j": [ + "young", + "child", + "boy", + "girl", + "toddler" + ] + }, + "child": { + "a": "Child", + "b": "1F9D2", + "j": [ + "gender-neutral", + "unspecified gender", + "young" + ] + }, + "boy": { + "a": "Boy", + "b": "1F466", + "j": [ + "young", + "man", + "male", + "guy", + "teenager" + ] + }, + "girl": { + "a": "Girl", + "b": "1F467", + "j": [ + "Virgo", + "young", + "zodiac", + "female", + "woman", + "teenager" + ] + }, + "person": { + "a": "Person", + "b": "1F9D1", + "j": [ + "adult", + "gender-neutral", + "unspecified gender" + ] + }, + "person-blond-hair": { + "a": "Person: Blond Hair", + "b": "1F471", + "j": [ + "blond", + "blond-haired person", + "hair", + "person: blond hair", + "hairstyle" + ] + }, + "man": { + "a": "Man", + "b": "1F468", + "j": [ + "adult", + "mustache", + "father", + "dad", + "guy", + "classy", + "sir", + "moustache" + ] + }, + "person-beard": { + "a": "Person: Beard", + "b": "1F9D4", + "j": [ + "beard", + "person", + "person: beard", + "bewhiskered", + "man_beard" + ] + }, + "man-beard": { + "a": "⊛ Man: Beard", + "b": "1F9D4-200D-2642-FE0F", + "j": [ + "beard", + "man", + "man: beard" + ] + }, + "woman-beard": { + "a": "⊛ Woman: Beard", + "b": "1F9D4-200D-2640-FE0F", + "j": [ + "beard", + "woman", + "woman: beard" + ] + }, + "man-red-hair": { + "a": "Man: Red Hair", + "b": "1F468-200D-1F9B0", + "j": [ + "adult", + "man", + "red hair", + "hairstyle" + ] + }, + "man-curly-hair": { + "a": "Man: Curly Hair", + "b": "1F468-200D-1F9B1", + "j": [ + "adult", + "curly hair", + "man", + "hairstyle" + ] + }, + "man-white-hair": { + "a": "Man: White Hair", + "b": "1F468-200D-1F9B3", + "j": [ + "adult", + "man", + "white hair", + "old", + "elder" + ] + }, + "man-bald": { + "a": "Man: Bald", + "b": "1F468-200D-1F9B2", + "j": [ + "adult", + "bald", + "man", + "hairless" + ] + }, + "woman": { + "a": "Woman", + "b": "1F469", + "j": [ + "adult", + "female", + "girls", + "lady" + ] + }, + "woman-red-hair": { + "a": "Woman: Red Hair", + "b": "1F469-200D-1F9B0", + "j": [ + "adult", + "red hair", + "woman", + "hairstyle" + ] + }, + "person-red-hair": { + "a": "Person: Red Hair", + "b": "1F9D1-200D-1F9B0", + "j": [ + "adult", + "gender-neutral", + "person", + "red hair", + "unspecified gender", + "hairstyle" + ] + }, + "woman-curly-hair": { + "a": "Woman: Curly Hair", + "b": "1F469-200D-1F9B1", + "j": [ + "adult", + "curly hair", + "woman", + "hairstyle" + ] + }, + "person-curly-hair": { + "a": "Person: Curly Hair", + "b": "1F9D1-200D-1F9B1", + "j": [ + "adult", + "curly hair", + "gender-neutral", + "person", + "unspecified gender", + "hairstyle" + ] + }, + "woman-white-hair": { + "a": "Woman: White Hair", + "b": "1F469-200D-1F9B3", + "j": [ + "adult", + "white hair", + "woman", + "old", + "elder" + ] + }, + "person-white-hair": { + "a": "Person: White Hair", + "b": "1F9D1-200D-1F9B3", + "j": [ + "adult", + "gender-neutral", + "person", + "unspecified gender", + "white hair", + "elder", + "old" + ] + }, + "woman-bald": { + "a": "Woman: Bald", + "b": "1F469-200D-1F9B2", + "j": [ + "adult", + "bald", + "woman", + "hairless" + ] + }, + "person-bald": { + "a": "Person: Bald", + "b": "1F9D1-200D-1F9B2", + "j": [ + "adult", + "bald", + "gender-neutral", + "person", + "unspecified gender", + "hairless" + ] + }, + "woman-blond-hair": { + "a": "Woman: Blond Hair", + "b": "1F471-200D-2640-FE0F", + "j": [ + "blond-haired woman", + "blonde", + "hair", + "woman", + "woman: blond hair", + "female", + "girl", + "person" + ] + }, + "man-blond-hair": { + "a": "Man: Blond Hair", + "b": "1F471-200D-2642-FE0F", + "j": [ + "blond", + "blond-haired man", + "hair", + "man", + "man: blond hair", + "male", + "boy", + "blonde", + "guy", + "person" + ] + }, + "older-person": { + "a": "Older Person", + "b": "1F9D3", + "j": [ + "adult", + "gender-neutral", + "old", + "unspecified gender", + "human", + "elder", + "senior" + ] + }, + "old-man": { + "a": "Old Man", + "b": "1F474", + "j": [ + "adult", + "man", + "old", + "human", + "male", + "men", + "elder", + "senior" + ] + }, + "old-woman": { + "a": "Old Woman", + "b": "1F475", + "j": [ + "adult", + "old", + "woman", + "human", + "female", + "women", + "lady", + "elder", + "senior" + ] + }, + "person-frowning": { + "a": "Person Frowning", + "b": "1F64D", + "j": [ + "frown", + "gesture", + "worried" + ] + }, + "man-frowning": { + "a": "Man Frowning", + "b": "1F64D-200D-2642-FE0F", + "j": [ + "frowning", + "gesture", + "man", + "male", + "boy", + "sad", + "depressed", + "discouraged", + "unhappy" + ] + }, + "woman-frowning": { + "a": "Woman Frowning", + "b": "1F64D-200D-2640-FE0F", + "j": [ + "frowning", + "gesture", + "woman", + "female", + "girl", + "sad", + "depressed", + "discouraged", + "unhappy" + ] + }, + "person-pouting": { + "a": "Person Pouting", + "b": "1F64E", + "j": [ + "gesture", + "pouting", + "upset" + ] + }, + "man-pouting": { + "a": "Man Pouting", + "b": "1F64E-200D-2642-FE0F", + "j": [ + "gesture", + "man", + "pouting", + "male", + "boy" + ] + }, + "woman-pouting": { + "a": "Woman Pouting", + "b": "1F64E-200D-2640-FE0F", + "j": [ + "gesture", + "pouting", + "woman", + "female", + "girl" + ] + }, + "person-gesturing-no": { + "a": "Person Gesturing No", + "b": "1F645", + "j": [ + "forbidden", + "gesture", + "hand", + "person gesturing NO", + "prohibited", + "decline" + ] + }, + "man-gesturing-no": { + "a": "Man Gesturing No", + "b": "1F645-200D-2642-FE0F", + "j": [ + "forbidden", + "gesture", + "hand", + "man", + "man gesturing NO", + "prohibited", + "male", + "boy", + "nope" + ] + }, + "woman-gesturing-no": { + "a": "Woman Gesturing No", + "b": "1F645-200D-2640-FE0F", + "j": [ + "forbidden", + "gesture", + "hand", + "prohibited", + "woman", + "woman gesturing NO", + "female", + "girl", + "nope" + ] + }, + "person-gesturing-ok": { + "a": "Person Gesturing Ok", + "b": "1F646", + "j": [ + "gesture", + "hand", + "OK", + "person gesturing OK", + "agree" + ] + }, + "man-gesturing-ok": { + "a": "Man Gesturing Ok", + "b": "1F646-200D-2642-FE0F", + "j": [ + "gesture", + "hand", + "man", + "man gesturing OK", + "OK", + "men", + "boy", + "male", + "blue", + "human" + ] + }, + "woman-gesturing-ok": { + "a": "Woman Gesturing Ok", + "b": "1F646-200D-2640-FE0F", + "j": [ + "gesture", + "hand", + "OK", + "woman", + "woman gesturing OK", + "women", + "girl", + "female", + "pink", + "human" + ] + }, + "person-tipping-hand": { + "a": "Person Tipping Hand", + "b": "1F481", + "j": [ + "hand", + "help", + "information", + "sassy", + "tipping" + ] + }, + "man-tipping-hand": { + "a": "Man Tipping Hand", + "b": "1F481-200D-2642-FE0F", + "j": [ + "man", + "sassy", + "tipping hand", + "male", + "boy", + "human", + "information" + ] + }, + "woman-tipping-hand": { + "a": "Woman Tipping Hand", + "b": "1F481-200D-2640-FE0F", + "j": [ + "sassy", + "tipping hand", + "woman", + "female", + "girl", + "human", + "information" + ] + }, + "person-raising-hand": { + "a": "Person Raising Hand", + "b": "1F64B", + "j": [ + "gesture", + "hand", + "happy", + "raised", + "question" + ] + }, + "man-raising-hand": { + "a": "Man Raising Hand", + "b": "1F64B-200D-2642-FE0F", + "j": [ + "gesture", + "man", + "raising hand", + "male", + "boy" + ] + }, + "woman-raising-hand": { + "a": "Woman Raising Hand", + "b": "1F64B-200D-2640-FE0F", + "j": [ + "gesture", + "raising hand", + "woman", + "female", + "girl" + ] + }, + "deaf-person": { + "a": "Deaf Person", + "b": "1F9CF", + "j": [ + "accessibility", + "deaf", + "ear", + "hear" + ] + }, + "deaf-man": { + "a": "Deaf Man", + "b": "1F9CF-200D-2642-FE0F", + "j": [ + "deaf", + "man", + "accessibility" + ] + }, + "deaf-woman": { + "a": "Deaf Woman", + "b": "1F9CF-200D-2640-FE0F", + "j": [ + "deaf", + "woman", + "accessibility" + ] + }, + "person-bowing": { + "a": "Person Bowing", + "b": "1F647", + "j": [ + "apology", + "bow", + "gesture", + "sorry", + "respectiful" + ] + }, + "man-bowing": { + "a": "Man Bowing", + "b": "1F647-200D-2642-FE0F", + "j": [ + "apology", + "bowing", + "favor", + "gesture", + "man", + "sorry", + "male", + "boy" + ] + }, + "woman-bowing": { + "a": "Woman Bowing", + "b": "1F647-200D-2640-FE0F", + "j": [ + "apology", + "bowing", + "favor", + "gesture", + "sorry", + "woman", + "female", + "girl" + ] + }, + "person-facepalming": { + "a": "Person Facepalming", + "b": "1F926", + "j": [ + "disbelief", + "exasperation", + "face", + "palm", + "disappointed" + ] + }, + "man-facepalming": { + "a": "Man Facepalming", + "b": "1F926-200D-2642-FE0F", + "j": [ + "disbelief", + "exasperation", + "facepalm", + "man", + "male", + "boy" + ] + }, + "woman-facepalming": { + "a": "Woman Facepalming", + "b": "1F926-200D-2640-FE0F", + "j": [ + "disbelief", + "exasperation", + "facepalm", + "woman", + "female", + "girl" + ] + }, + "person-shrugging": { + "a": "Person Shrugging", + "b": "1F937", + "j": [ + "doubt", + "ignorance", + "indifference", + "shrug", + "regardless" + ] + }, + "man-shrugging": { + "a": "Man Shrugging", + "b": "1F937-200D-2642-FE0F", + "j": [ + "doubt", + "ignorance", + "indifference", + "man", + "shrug", + "male", + "boy", + "confused", + "indifferent" + ] + }, + "woman-shrugging": { + "a": "Woman Shrugging", + "b": "1F937-200D-2640-FE0F", + "j": [ + "doubt", + "ignorance", + "indifference", + "shrug", + "woman", + "female", + "girl", + "confused", + "indifferent" + ] + }, + "health-worker": { + "a": "Health Worker", + "b": "1F9D1-200D-2695-FE0F", + "j": [ + "doctor", + "healthcare", + "nurse", + "therapist", + "hospital" + ] + }, + "man-health-worker": { + "a": "Man Health Worker", + "b": "1F468-200D-2695-FE0F", + "j": [ + "doctor", + "healthcare", + "man", + "nurse", + "therapist", + "human" + ] + }, + "woman-health-worker": { + "a": "Woman Health Worker", + "b": "1F469-200D-2695-FE0F", + "j": [ + "doctor", + "healthcare", + "nurse", + "therapist", + "woman", + "human" + ] + }, + "student": { + "a": "Student", + "b": "1F9D1-200D-1F393", + "j": [ + "graduate", + "learn" + ] + }, + "man-student": { + "a": "Man Student", + "b": "1F468-200D-1F393", + "j": [ + "graduate", + "man", + "student", + "human" + ] + }, + "woman-student": { + "a": "Woman Student", + "b": "1F469-200D-1F393", + "j": [ + "graduate", + "student", + "woman", + "human" + ] + }, + "teacher": { + "a": "Teacher", + "b": "1F9D1-200D-1F3EB", + "j": [ + "instructor", + "professor" + ] + }, + "man-teacher": { + "a": "Man Teacher", + "b": "1F468-200D-1F3EB", + "j": [ + "instructor", + "man", + "professor", + "teacher", + "human" + ] + }, + "woman-teacher": { + "a": "Woman Teacher", + "b": "1F469-200D-1F3EB", + "j": [ + "instructor", + "professor", + "teacher", + "woman", + "human" + ] + }, + "judge": { + "a": "Judge", + "b": "1F9D1-200D-2696-FE0F", + "j": [ + "justice", + "scales", + "law" + ] + }, + "man-judge": { + "a": "Man Judge", + "b": "1F468-200D-2696-FE0F", + "j": [ + "judge", + "justice", + "man", + "scales", + "court", + "human" + ] + }, + "woman-judge": { + "a": "Woman Judge", + "b": "1F469-200D-2696-FE0F", + "j": [ + "judge", + "justice", + "scales", + "woman", + "court", + "human" + ] + }, + "farmer": { + "a": "Farmer", + "b": "1F9D1-200D-1F33E", + "j": [ + "gardener", + "rancher", + "crops" + ] + }, + "man-farmer": { + "a": "Man Farmer", + "b": "1F468-200D-1F33E", + "j": [ + "farmer", + "gardener", + "man", + "rancher", + "human" + ] + }, + "woman-farmer": { + "a": "Woman Farmer", + "b": "1F469-200D-1F33E", + "j": [ + "farmer", + "gardener", + "rancher", + "woman", + "human" + ] + }, + "cook": { + "a": "Cook", + "b": "1F9D1-200D-1F373", + "j": [ + "chef", + "food", + "kitchen", + "culinary" + ] + }, + "man-cook": { + "a": "Man Cook", + "b": "1F468-200D-1F373", + "j": [ + "chef", + "cook", + "man", + "human" + ] + }, + "woman-cook": { + "a": "Woman Cook", + "b": "1F469-200D-1F373", + "j": [ + "chef", + "cook", + "woman", + "human" + ] + }, + "mechanic": { + "a": "Mechanic", + "b": "1F9D1-200D-1F527", + "j": [ + "electrician", + "plumber", + "tradesperson", + "worker", + "technician" + ] + }, + "man-mechanic": { + "a": "Man Mechanic", + "b": "1F468-200D-1F527", + "j": [ + "electrician", + "man", + "mechanic", + "plumber", + "tradesperson", + "human", + "wrench" + ] + }, + "woman-mechanic": { + "a": "Woman Mechanic", + "b": "1F469-200D-1F527", + "j": [ + "electrician", + "mechanic", + "plumber", + "tradesperson", + "woman", + "human", + "wrench" + ] + }, + "factory-worker": { + "a": "Factory Worker", + "b": "1F9D1-200D-1F3ED", + "j": [ + "assembly", + "factory", + "industrial", + "worker", + "labor" + ] + }, + "man-factory-worker": { + "a": "Man Factory Worker", + "b": "1F468-200D-1F3ED", + "j": [ + "assembly", + "factory", + "industrial", + "man", + "worker", + "human" + ] + }, + "woman-factory-worker": { + "a": "Woman Factory Worker", + "b": "1F469-200D-1F3ED", + "j": [ + "assembly", + "factory", + "industrial", + "woman", + "worker", + "human" + ] + }, + "office-worker": { + "a": "Office Worker", + "b": "1F9D1-200D-1F4BC", + "j": [ + "architect", + "business", + "manager", + "white-collar" + ] + }, + "man-office-worker": { + "a": "Man Office Worker", + "b": "1F468-200D-1F4BC", + "j": [ + "architect", + "business", + "man", + "manager", + "white-collar", + "human" + ] + }, + "woman-office-worker": { + "a": "Woman Office Worker", + "b": "1F469-200D-1F4BC", + "j": [ + "architect", + "business", + "manager", + "white-collar", + "woman", + "human" + ] + }, + "scientist": { + "a": "Scientist", + "b": "1F9D1-200D-1F52C", + "j": [ + "biologist", + "chemist", + "engineer", + "physicist", + "chemistry" + ] + }, + "man-scientist": { + "a": "Man Scientist", + "b": "1F468-200D-1F52C", + "j": [ + "biologist", + "chemist", + "engineer", + "man", + "physicist", + "scientist", + "human" + ] + }, + "woman-scientist": { + "a": "Woman Scientist", + "b": "1F469-200D-1F52C", + "j": [ + "biologist", + "chemist", + "engineer", + "physicist", + "scientist", + "woman", + "human" + ] + }, + "technologist": { + "a": "Technologist", + "b": "1F9D1-200D-1F4BB", + "j": [ + "coder", + "developer", + "inventor", + "software", + "computer" + ] + }, + "man-technologist": { + "a": "Man Technologist", + "b": "1F468-200D-1F4BB", + "j": [ + "coder", + "developer", + "inventor", + "man", + "software", + "technologist", + "engineer", + "programmer", + "human", + "laptop", + "computer" + ] + }, + "woman-technologist": { + "a": "Woman Technologist", + "b": "1F469-200D-1F4BB", + "j": [ + "coder", + "developer", + "inventor", + "software", + "technologist", + "woman", + "engineer", + "programmer", + "human", + "laptop", + "computer" + ] + }, + "singer": { + "a": "Singer", + "b": "1F9D1-200D-1F3A4", + "j": [ + "actor", + "entertainer", + "rock", + "star", + "song", + "artist", + "performer" + ] + }, + "man-singer": { + "a": "Man Singer", + "b": "1F468-200D-1F3A4", + "j": [ + "actor", + "entertainer", + "man", + "rock", + "singer", + "star", + "rockstar", + "human" + ] + }, + "woman-singer": { + "a": "Woman Singer", + "b": "1F469-200D-1F3A4", + "j": [ + "actor", + "entertainer", + "rock", + "singer", + "star", + "woman", + "rockstar", + "human" + ] + }, + "artist": { + "a": "Artist", + "b": "1F9D1-200D-1F3A8", + "j": [ + "palette", + "painting", + "draw", + "creativity" + ] + }, + "man-artist": { + "a": "Man Artist", + "b": "1F468-200D-1F3A8", + "j": [ + "artist", + "man", + "palette", + "painter", + "human" + ] + }, + "woman-artist": { + "a": "Woman Artist", + "b": "1F469-200D-1F3A8", + "j": [ + "artist", + "palette", + "woman", + "painter", + "human" + ] + }, + "pilot": { + "a": "Pilot", + "b": "1F9D1-200D-2708-FE0F", + "j": [ + "plane", + "fly", + "airplane" + ] + }, + "man-pilot": { + "a": "Man Pilot", + "b": "1F468-200D-2708-FE0F", + "j": [ + "man", + "pilot", + "plane", + "aviator", + "human" + ] + }, + "woman-pilot": { + "a": "Woman Pilot", + "b": "1F469-200D-2708-FE0F", + "j": [ + "pilot", + "plane", + "woman", + "aviator", + "human" + ] + }, + "astronaut": { + "a": "Astronaut", + "b": "1F9D1-200D-1F680", + "j": [ + "rocket", + "outerspace" + ] + }, + "man-astronaut": { + "a": "Man Astronaut", + "b": "1F468-200D-1F680", + "j": [ + "astronaut", + "man", + "rocket", + "space", + "human" + ] + }, + "woman-astronaut": { + "a": "Woman Astronaut", + "b": "1F469-200D-1F680", + "j": [ + "astronaut", + "rocket", + "woman", + "space", + "human" + ] + }, + "firefighter": { + "a": "Firefighter", + "b": "1F9D1-200D-1F692", + "j": [ + "firetruck", + "fire" + ] + }, + "man-firefighter": { + "a": "Man Firefighter", + "b": "1F468-200D-1F692", + "j": [ + "firefighter", + "firetruck", + "man", + "fireman", + "human" + ] + }, + "woman-firefighter": { + "a": "Woman Firefighter", + "b": "1F469-200D-1F692", + "j": [ + "firefighter", + "firetruck", + "woman", + "fireman", + "human" + ] + }, + "police-officer": { + "a": "Police Officer", + "b": "1F46E", + "j": [ + "cop", + "officer", + "police" + ] + }, + "man-police-officer": { + "a": "Man Police Officer", + "b": "1F46E-200D-2642-FE0F", + "j": [ + "cop", + "man", + "officer", + "police", + "law", + "legal", + "enforcement", + "arrest", + "911" + ] + }, + "woman-police-officer": { + "a": "Woman Police Officer", + "b": "1F46E-200D-2640-FE0F", + "j": [ + "cop", + "officer", + "police", + "woman", + "law", + "legal", + "enforcement", + "arrest", + "911", + "female" + ] + }, + "detective": { + "a": "Detective", + "b": "1F575", + "j": [ + "sleuth", + "spy", + "human" + ] + }, + "man-detective": { + "a": "Man Detective", + "b": "1F575-FE0F-200D-2642-FE0F", + "j": [ + "detective", + "man", + "sleuth", + "spy", + "crime" + ] + }, + "woman-detective": { + "a": "Woman Detective", + "b": "1F575-FE0F-200D-2640-FE0F", + "j": [ + "detective", + "sleuth", + "spy", + "woman", + "human", + "female" + ] + }, + "guard": { + "a": "Guard", + "b": "1F482", + "j": [ + "protect" + ] + }, + "man-guard": { + "a": "Man Guard", + "b": "1F482-200D-2642-FE0F", + "j": [ + "guard", + "man", + "uk", + "gb", + "british", + "male", + "guy", + "royal" + ] + }, + "woman-guard": { + "a": "Woman Guard", + "b": "1F482-200D-2640-FE0F", + "j": [ + "guard", + "woman", + "uk", + "gb", + "british", + "female", + "royal" + ] + }, + "ninja": { + "a": "Ninja", + "b": "1F977", + "j": [ + "fighter", + "hidden", + "stealth", + "ninjutsu", + "skills", + "japanese" + ] + }, + "construction-worker": { + "a": "Construction Worker", + "b": "1F477", + "j": [ + "construction", + "hat", + "worker", + "labor", + "build" + ] + }, + "man-construction-worker": { + "a": "Man Construction Worker", + "b": "1F477-200D-2642-FE0F", + "j": [ + "construction", + "man", + "worker", + "male", + "human", + "wip", + "guy", + "build", + "labor" + ] + }, + "woman-construction-worker": { + "a": "Woman Construction Worker", + "b": "1F477-200D-2640-FE0F", + "j": [ + "construction", + "woman", + "worker", + "female", + "human", + "wip", + "build", + "labor" + ] + }, + "prince": { + "a": "Prince", + "b": "1F934", + "j": [ + "boy", + "man", + "male", + "crown", + "royal", + "king" + ] + }, + "princess": { + "a": "Princess", + "b": "1F478", + "j": [ + "fairy tale", + "fantasy", + "girl", + "woman", + "female", + "blond", + "crown", + "royal", + "queen" + ] + }, + "person-wearing-turban": { + "a": "Person Wearing Turban", + "b": "1F473", + "j": [ + "turban", + "headdress" + ] + }, + "man-wearing-turban": { + "a": "Man Wearing Turban", + "b": "1F473-200D-2642-FE0F", + "j": [ + "man", + "turban", + "male", + "indian", + "hinduism", + "arabs" + ] + }, + "woman-wearing-turban": { + "a": "Woman Wearing Turban", + "b": "1F473-200D-2640-FE0F", + "j": [ + "turban", + "woman", + "female", + "indian", + "hinduism", + "arabs" + ] + }, + "person-with-skullcap": { + "a": "Person with Skullcap", + "b": "1F472", + "j": [ + "cap", + "gua pi mao", + "hat", + "person", + "skullcap", + "man_with_skullcap", + "male", + "boy", + "chinese" + ] + }, + "woman-with-headscarf": { + "a": "Woman with Headscarf", + "b": "1F9D5", + "j": [ + "headscarf", + "hijab", + "mantilla", + "tichel", + "bandana", + "head kerchief", + "female" + ] + }, + "person-in-tuxedo": { + "a": "Person in Tuxedo", + "b": "1F935", + "j": [ + "groom", + "person", + "tuxedo", + "man_in_tuxedo", + "couple", + "marriage", + "wedding" + ] + }, + "man-in-tuxedo": { + "a": "Man in Tuxedo", + "b": "1F935-200D-2642-FE0F", + "j": [ + "man", + "tuxedo", + "formal", + "fashion" + ] + }, + "woman-in-tuxedo": { + "a": "Woman in Tuxedo", + "b": "1F935-200D-2640-FE0F", + "j": [ + "tuxedo", + "woman", + "formal", + "fashion" + ] + }, + "person-with-veil": { + "a": "Person with Veil", + "b": "1F470", + "j": [ + "bride", + "person", + "veil", + "wedding", + "bride_with_veil", + "couple", + "marriage", + "woman" + ] + }, + "man-with-veil": { + "a": "Man with Veil", + "b": "1F470-200D-2642-FE0F", + "j": [ + "man", + "veil", + "wedding", + "marriage" + ] + }, + "woman-with-veil": { + "a": "Woman with Veil", + "b": "1F470-200D-2640-FE0F", + "j": [ + "veil", + "woman", + "wedding", + "marriage" + ] + }, + "pregnant-woman": { + "a": "Pregnant Woman", + "b": "1F930", + "j": [ + "pregnant", + "woman", + "baby" + ] + }, + "breastfeeding": { + "a": "Breast-Feeding", + "b": "1F931", + "j": [ + "baby", + "breast", + "breast-feeding", + "nursing", + "breast_feeding" + ] + }, + "woman-feeding-baby": { + "a": "Woman Feeding Baby", + "b": "1F469-200D-1F37C", + "j": [ + "baby", + "feeding", + "nursing", + "woman", + "birth", + "food" + ] + }, + "man-feeding-baby": { + "a": "Man Feeding Baby", + "b": "1F468-200D-1F37C", + "j": [ + "baby", + "feeding", + "man", + "nursing", + "birth", + "food" + ] + }, + "person-feeding-baby": { + "a": "Person Feeding Baby", + "b": "1F9D1-200D-1F37C", + "j": [ + "baby", + "feeding", + "nursing", + "person", + "birth", + "food" + ] + }, + "baby-angel": { + "a": "Baby Angel", + "b": "1F47C", + "j": [ + "angel", + "baby", + "face", + "fairy tale", + "fantasy", + "heaven", + "wings", + "halo" + ] + }, + "santa-claus": { + "a": "Santa Claus", + "b": "1F385", + "j": [ + "celebration", + "Christmas", + "claus", + "father", + "santa", + "festival", + "man", + "male", + "xmas", + "father christmas" + ] + }, + "mrs-claus": { + "a": "Mrs. Claus", + "b": "1F936", + "j": [ + "celebration", + "Christmas", + "claus", + "mother", + "Mrs.", + "woman", + "female", + "xmas", + "mother christmas" + ] + }, + "mx-claus": { + "a": "Mx Claus", + "b": "1F9D1-200D-1F384", + "j": [ + "Claus, christmas", + "christmas" + ] + }, + "superhero": { + "a": "Superhero", + "b": "1F9B8", + "j": [ + "good", + "hero", + "heroine", + "superpower", + "marvel" + ] + }, + "man-superhero": { + "a": "Man Superhero", + "b": "1F9B8-200D-2642-FE0F", + "j": [ + "good", + "hero", + "man", + "superpower", + "male", + "superpowers" + ] + }, + "woman-superhero": { + "a": "Woman Superhero", + "b": "1F9B8-200D-2640-FE0F", + "j": [ + "good", + "hero", + "heroine", + "superpower", + "woman", + "female", + "superpowers" + ] + }, + "supervillain": { + "a": "Supervillain", + "b": "1F9B9", + "j": [ + "criminal", + "evil", + "superpower", + "villain", + "marvel" + ] + }, + "man-supervillain": { + "a": "Man Supervillain", + "b": "1F9B9-200D-2642-FE0F", + "j": [ + "criminal", + "evil", + "man", + "superpower", + "villain", + "male", + "bad", + "hero", + "superpowers" + ] + }, + "woman-supervillain": { + "a": "Woman Supervillain", + "b": "1F9B9-200D-2640-FE0F", + "j": [ + "criminal", + "evil", + "superpower", + "villain", + "woman", + "female", + "bad", + "heroine", + "superpowers" + ] + }, + "mage": { + "a": "Mage", + "b": "1F9D9", + "j": [ + "sorcerer", + "sorceress", + "witch", + "wizard", + "magic" + ] + }, + "man-mage": { + "a": "Man Mage", + "b": "1F9D9-200D-2642-FE0F", + "j": [ + "sorcerer", + "wizard", + "man", + "male", + "mage" + ] + }, + "woman-mage": { + "a": "Woman Mage", + "b": "1F9D9-200D-2640-FE0F", + "j": [ + "sorceress", + "witch", + "woman", + "female", + "mage" + ] + }, + "fairy": { + "a": "Fairy", + "b": "1F9DA", + "j": [ + "Oberon", + "Puck", + "Titania", + "wings", + "magical" + ] + }, + "man-fairy": { + "a": "Man Fairy", + "b": "1F9DA-200D-2642-FE0F", + "j": [ + "Oberon", + "Puck", + "man", + "male" + ] + }, + "woman-fairy": { + "a": "Woman Fairy", + "b": "1F9DA-200D-2640-FE0F", + "j": [ + "Titania", + "woman", + "female" + ] + }, + "vampire": { + "a": "Vampire", + "b": "1F9DB", + "j": [ + "Dracula", + "undead", + "blood", + "twilight" + ] + }, + "man-vampire": { + "a": "Man Vampire", + "b": "1F9DB-200D-2642-FE0F", + "j": [ + "Dracula", + "undead", + "man", + "male", + "dracula" + ] + }, + "woman-vampire": { + "a": "Woman Vampire", + "b": "1F9DB-200D-2640-FE0F", + "j": [ + "undead", + "woman", + "female" + ] + }, + "merperson": { + "a": "Merperson", + "b": "1F9DC", + "j": [ + "mermaid", + "merman", + "merwoman", + "sea" + ] + }, + "merman": { + "a": "Merman", + "b": "1F9DC-200D-2642-FE0F", + "j": [ + "Triton", + "man", + "male", + "triton" + ] + }, + "mermaid": { + "a": "Mermaid", + "b": "1F9DC-200D-2640-FE0F", + "j": [ + "merwoman", + "woman", + "female", + "ariel" + ] + }, + "elf": { + "a": "Elf", + "b": "1F9DD", + "j": [ + "magical", + "LOTR style" + ] + }, + "man-elf": { + "a": "Man Elf", + "b": "1F9DD-200D-2642-FE0F", + "j": [ + "magical", + "man", + "male" + ] + }, + "woman-elf": { + "a": "Woman Elf", + "b": "1F9DD-200D-2640-FE0F", + "j": [ + "magical", + "woman", + "female" + ] + }, + "genie": { + "a": "Genie", + "b": "1F9DE", + "j": [ + "djinn", + "(non-human color)", + "magical", + "wishes" + ] + }, + "man-genie": { + "a": "Man Genie", + "b": "1F9DE-200D-2642-FE0F", + "j": [ + "djinn", + "man", + "male" + ] + }, + "woman-genie": { + "a": "Woman Genie", + "b": "1F9DE-200D-2640-FE0F", + "j": [ + "djinn", + "woman", + "female" + ] + }, + "zombie": { + "a": "Zombie", + "b": "1F9DF", + "j": [ + "undead", + "walking dead", + "(non-human color)", + "dead" + ] + }, + "man-zombie": { + "a": "Man Zombie", + "b": "1F9DF-200D-2642-FE0F", + "j": [ + "undead", + "walking dead", + "man", + "male", + "dracula" + ] + }, + "woman-zombie": { + "a": "Woman Zombie", + "b": "1F9DF-200D-2640-FE0F", + "j": [ + "undead", + "walking dead", + "woman", + "female" + ] + }, + "person-getting-massage": { + "a": "Person Getting Massage", + "b": "1F486", + "j": [ + "face", + "massage", + "salon", + "relax" + ] + }, + "man-getting-massage": { + "a": "Man Getting Massage", + "b": "1F486-200D-2642-FE0F", + "j": [ + "face", + "man", + "massage", + "male", + "boy", + "head" + ] + }, + "woman-getting-massage": { + "a": "Woman Getting Massage", + "b": "1F486-200D-2640-FE0F", + "j": [ + "face", + "massage", + "woman", + "female", + "girl", + "head" + ] + }, + "person-getting-haircut": { + "a": "Person Getting Haircut", + "b": "1F487", + "j": [ + "barber", + "beauty", + "haircut", + "parlor", + "hairstyle" + ] + }, + "man-getting-haircut": { + "a": "Man Getting Haircut", + "b": "1F487-200D-2642-FE0F", + "j": [ + "haircut", + "man", + "male", + "boy" + ] + }, + "woman-getting-haircut": { + "a": "Woman Getting Haircut", + "b": "1F487-200D-2640-FE0F", + "j": [ + "haircut", + "woman", + "female", + "girl" + ] + }, + "person-walking": { + "a": "Person Walking", + "b": "1F6B6", + "j": [ + "hike", + "walk", + "walking", + "move" + ] + }, + "man-walking": { + "a": "Man Walking", + "b": "1F6B6-200D-2642-FE0F", + "j": [ + "hike", + "man", + "walk", + "human", + "feet", + "steps" + ] + }, + "woman-walking": { + "a": "Woman Walking", + "b": "1F6B6-200D-2640-FE0F", + "j": [ + "hike", + "walk", + "woman", + "human", + "feet", + "steps", + "female" + ] + }, + "person-standing": { + "a": "Person Standing", + "b": "1F9CD", + "j": [ + "stand", + "standing", + "still" + ] + }, + "man-standing": { + "a": "Man Standing", + "b": "1F9CD-200D-2642-FE0F", + "j": [ + "man", + "standing", + "still" + ] + }, + "woman-standing": { + "a": "Woman Standing", + "b": "1F9CD-200D-2640-FE0F", + "j": [ + "standing", + "woman", + "still" + ] + }, + "person-kneeling": { + "a": "Person Kneeling", + "b": "1F9CE", + "j": [ + "kneel", + "kneeling", + "pray", + "respectful" + ] + }, + "man-kneeling": { + "a": "Man Kneeling", + "b": "1F9CE-200D-2642-FE0F", + "j": [ + "kneeling", + "man", + "pray", + "respectful" + ] + }, + "woman-kneeling": { + "a": "Woman Kneeling", + "b": "1F9CE-200D-2640-FE0F", + "j": [ + "kneeling", + "woman", + "respectful", + "pray" + ] + }, + "person-with-white-cane": { + "a": "Person with White Cane", + "b": "1F9D1-200D-1F9AF", + "j": [ + "accessibility", + "blind", + "person_with_probing_cane" + ] + }, + "man-with-white-cane": { + "a": "Man with White Cane", + "b": "1F468-200D-1F9AF", + "j": [ + "accessibility", + "blind", + "man", + "man_with_probing_cane" + ] + }, + "woman-with-white-cane": { + "a": "Woman with White Cane", + "b": "1F469-200D-1F9AF", + "j": [ + "accessibility", + "blind", + "woman", + "woman_with_probing_cane" + ] + }, + "person-in-motorized-wheelchair": { + "a": "Person in Motorized Wheelchair", + "b": "1F9D1-200D-1F9BC", + "j": [ + "accessibility", + "wheelchair", + "disability" + ] + }, + "man-in-motorized-wheelchair": { + "a": "Man in Motorized Wheelchair", + "b": "1F468-200D-1F9BC", + "j": [ + "accessibility", + "man", + "wheelchair", + "disability" + ] + }, + "woman-in-motorized-wheelchair": { + "a": "Woman in Motorized Wheelchair", + "b": "1F469-200D-1F9BC", + "j": [ + "accessibility", + "wheelchair", + "woman", + "disability" + ] + }, + "person-in-manual-wheelchair": { + "a": "Person in Manual Wheelchair", + "b": "1F9D1-200D-1F9BD", + "j": [ + "accessibility", + "wheelchair", + "disability" + ] + }, + "man-in-manual-wheelchair": { + "a": "Man in Manual Wheelchair", + "b": "1F468-200D-1F9BD", + "j": [ + "accessibility", + "man", + "wheelchair", + "disability" + ] + }, + "woman-in-manual-wheelchair": { + "a": "Woman in Manual Wheelchair", + "b": "1F469-200D-1F9BD", + "j": [ + "accessibility", + "wheelchair", + "woman", + "disability" + ] + }, + "person-running": { + "a": "Person Running", + "b": "1F3C3", + "j": [ + "marathon", + "running", + "move" + ] + }, + "man-running": { + "a": "Man Running", + "b": "1F3C3-200D-2642-FE0F", + "j": [ + "man", + "marathon", + "racing", + "running", + "walking", + "exercise", + "race" + ] + }, + "woman-running": { + "a": "Woman Running", + "b": "1F3C3-200D-2640-FE0F", + "j": [ + "marathon", + "racing", + "running", + "woman", + "walking", + "exercise", + "race", + "female" + ] + }, + "woman-dancing": { + "a": "Woman Dancing", + "b": "1F483", + "j": [ + "dance", + "dancing", + "woman", + "female", + "girl", + "fun" + ] + }, + "man-dancing": { + "a": "Man Dancing", + "b": "1F57A", + "j": [ + "dance", + "dancing", + "man", + "male", + "boy", + "fun", + "dancer" + ] + }, + "person-in-suit-levitating": { + "a": "Person in Suit Levitating", + "b": "1F574", + "j": [ + "business", + "person", + "suit", + "man_in_suit_levitating", + "levitate", + "hover", + "jump" + ] + }, + "people-with-bunny-ears": { + "a": "People with Bunny Ears", + "b": "1F46F", + "j": [ + "bunny ear", + "dancer", + "partying", + "perform", + "costume" + ] + }, + "men-with-bunny-ears": { + "a": "Men with Bunny Ears", + "b": "1F46F-200D-2642-FE0F", + "j": [ + "bunny ear", + "dancer", + "men", + "partying", + "male", + "bunny", + "boys" + ] + }, + "women-with-bunny-ears": { + "a": "Women with Bunny Ears", + "b": "1F46F-200D-2640-FE0F", + "j": [ + "bunny ear", + "dancer", + "partying", + "women", + "female", + "bunny", + "girls" + ] + }, + "person-in-steamy-room": { + "a": "Person in Steamy Room", + "b": "1F9D6", + "j": [ + "sauna", + "steam room", + "hamam", + "steambath", + "relax", + "spa" + ] + }, + "man-in-steamy-room": { + "a": "Man in Steamy Room", + "b": "1F9D6-200D-2642-FE0F", + "j": [ + "sauna", + "steam room", + "male", + "man", + "spa", + "steamroom" + ] + }, + "woman-in-steamy-room": { + "a": "Woman in Steamy Room", + "b": "1F9D6-200D-2640-FE0F", + "j": [ + "sauna", + "steam room", + "female", + "woman", + "spa", + "steamroom" + ] + }, + "person-climbing": { + "a": "Person Climbing", + "b": "1F9D7", + "j": [ + "climber", + "sport" + ] + }, + "man-climbing": { + "a": "Man Climbing", + "b": "1F9D7-200D-2642-FE0F", + "j": [ + "climber", + "sports", + "hobby", + "man", + "male", + "rock" + ] + }, + "woman-climbing": { + "a": "Woman Climbing", + "b": "1F9D7-200D-2640-FE0F", + "j": [ + "climber", + "sports", + "hobby", + "woman", + "female", + "rock" + ] + }, + "person-fencing": { + "a": "Person Fencing", + "b": "1F93A", + "j": [ + "fencer", + "fencing", + "sword", + "sports" + ] + }, + "horse-racing": { + "a": "Horse Racing", + "b": "1F3C7", + "j": [ + "horse", + "jockey", + "racehorse", + "racing", + "animal", + "betting", + "competition", + "gambling", + "luck" + ] + }, + "skier": { + "a": "Skier", + "b": "26F7", + "j": [ + "ski", + "snow", + "sports", + "winter" + ] + }, + "snowboarder": { + "a": "Snowboarder", + "b": "1F3C2", + "j": [ + "ski", + "snow", + "snowboard", + "sports", + "winter" + ] + }, + "person-golfing": { + "a": "Person Golfing", + "b": "1F3CC", + "j": [ + "ball", + "golf", + "sports", + "business" + ] + }, + "man-golfing": { + "a": "Man Golfing", + "b": "1F3CC-FE0F-200D-2642-FE0F", + "j": [ + "golf", + "man", + "sport" + ] + }, + "woman-golfing": { + "a": "Woman Golfing", + "b": "1F3CC-FE0F-200D-2640-FE0F", + "j": [ + "golf", + "woman", + "sports", + "business", + "female" + ] + }, + "person-surfing": { + "a": "Person Surfing", + "b": "1F3C4", + "j": [ + "surfing", + "sport", + "sea" + ] + }, + "man-surfing": { + "a": "Man Surfing", + "b": "1F3C4-200D-2642-FE0F", + "j": [ + "man", + "surfing", + "sports", + "ocean", + "sea", + "summer", + "beach" + ] + }, + "woman-surfing": { + "a": "Woman Surfing", + "b": "1F3C4-200D-2640-FE0F", + "j": [ + "surfing", + "woman", + "sports", + "ocean", + "sea", + "summer", + "beach", + "female" + ] + }, + "person-rowing-boat": { + "a": "Person Rowing Boat", + "b": "1F6A3", + "j": [ + "boat", + "rowboat", + "sport", + "move" + ] + }, + "man-rowing-boat": { + "a": "Man Rowing Boat", + "b": "1F6A3-200D-2642-FE0F", + "j": [ + "boat", + "man", + "rowboat", + "sports", + "hobby", + "water", + "ship" + ] + }, + "woman-rowing-boat": { + "a": "Woman Rowing Boat", + "b": "1F6A3-200D-2640-FE0F", + "j": [ + "boat", + "rowboat", + "woman", + "sports", + "hobby", + "water", + "ship", + "female" + ] + }, + "person-swimming": { + "a": "Person Swimming", + "b": "1F3CA", + "j": [ + "swim", + "sport", + "pool" + ] + }, + "man-swimming": { + "a": "Man Swimming", + "b": "1F3CA-200D-2642-FE0F", + "j": [ + "man", + "swim", + "sports", + "exercise", + "human", + "athlete", + "water", + "summer" + ] + }, + "woman-swimming": { + "a": "Woman Swimming", + "b": "1F3CA-200D-2640-FE0F", + "j": [ + "swim", + "woman", + "sports", + "exercise", + "human", + "athlete", + "water", + "summer", + "female" + ] + }, + "person-bouncing-ball": { + "a": "Person Bouncing Ball", + "b": "26F9", + "j": [ + "ball", + "sports", + "human" + ] + }, + "man-bouncing-ball": { + "a": "Man Bouncing Ball", + "b": "26F9-FE0F-200D-2642-FE0F", + "j": [ + "ball", + "man", + "sport" + ] + }, + "woman-bouncing-ball": { + "a": "Woman Bouncing Ball", + "b": "26F9-FE0F-200D-2640-FE0F", + "j": [ + "ball", + "woman", + "sports", + "human", + "female" + ] + }, + "person-lifting-weights": { + "a": "Person Lifting Weights", + "b": "1F3CB", + "j": [ + "lifter", + "weight", + "sports", + "training", + "exercise" + ] + }, + "man-lifting-weights": { + "a": "Man Lifting Weights", + "b": "1F3CB-FE0F-200D-2642-FE0F", + "j": [ + "man", + "weight lifter", + "sport" + ] + }, + "woman-lifting-weights": { + "a": "Woman Lifting Weights", + "b": "1F3CB-FE0F-200D-2640-FE0F", + "j": [ + "weight lifter", + "woman", + "sports", + "training", + "exercise", + "female" + ] + }, + "person-biking": { + "a": "Person Biking", + "b": "1F6B4", + "j": [ + "bicycle", + "biking", + "cyclist", + "sport", + "move" + ] + }, + "man-biking": { + "a": "Man Biking", + "b": "1F6B4-200D-2642-FE0F", + "j": [ + "bicycle", + "biking", + "cyclist", + "man", + "sports", + "bike", + "exercise", + "hipster" + ] + }, + "woman-biking": { + "a": "Woman Biking", + "b": "1F6B4-200D-2640-FE0F", + "j": [ + "bicycle", + "biking", + "cyclist", + "woman", + "sports", + "bike", + "exercise", + "hipster", + "female" + ] + }, + "person-mountain-biking": { + "a": "Person Mountain Biking", + "b": "1F6B5", + "j": [ + "bicycle", + "bicyclist", + "bike", + "cyclist", + "mountain", + "sport", + "move" + ] + }, + "man-mountain-biking": { + "a": "Man Mountain Biking", + "b": "1F6B5-200D-2642-FE0F", + "j": [ + "bicycle", + "bike", + "cyclist", + "man", + "mountain", + "transportation", + "sports", + "human", + "race" + ] + }, + "woman-mountain-biking": { + "a": "Woman Mountain Biking", + "b": "1F6B5-200D-2640-FE0F", + "j": [ + "bicycle", + "bike", + "biking", + "cyclist", + "mountain", + "woman", + "transportation", + "sports", + "human", + "race", + "female" + ] + }, + "person-cartwheeling": { + "a": "Person Cartwheeling", + "b": "1F938", + "j": [ + "cartwheel", + "gymnastics", + "sport", + "gymnastic" + ] + }, + "man-cartwheeling": { + "a": "Man Cartwheeling", + "b": "1F938-200D-2642-FE0F", + "j": [ + "cartwheel", + "gymnastics", + "man" + ] + }, + "woman-cartwheeling": { + "a": "Woman Cartwheeling", + "b": "1F938-200D-2640-FE0F", + "j": [ + "cartwheel", + "gymnastics", + "woman" + ] + }, + "people-wrestling": { + "a": "People Wrestling", + "b": "1F93C", + "j": [ + "wrestle", + "wrestler", + "sport" + ] + }, + "men-wrestling": { + "a": "Men Wrestling", + "b": "1F93C-200D-2642-FE0F", + "j": [ + "men", + "wrestle", + "sports", + "wrestlers" + ] + }, + "women-wrestling": { + "a": "Women Wrestling", + "b": "1F93C-200D-2640-FE0F", + "j": [ + "women", + "wrestle", + "sports", + "wrestlers" + ] + }, + "person-playing-water-polo": { + "a": "Person Playing Water Polo", + "b": "1F93D", + "j": [ + "polo", + "water", + "sport" + ] + }, + "man-playing-water-polo": { + "a": "Man Playing Water Polo", + "b": "1F93D-200D-2642-FE0F", + "j": [ + "man", + "water polo", + "sports", + "pool" + ] + }, + "woman-playing-water-polo": { + "a": "Woman Playing Water Polo", + "b": "1F93D-200D-2640-FE0F", + "j": [ + "water polo", + "woman", + "sports", + "pool" + ] + }, + "person-playing-handball": { + "a": "Person Playing Handball", + "b": "1F93E", + "j": [ + "ball", + "handball", + "sport" + ] + }, + "man-playing-handball": { + "a": "Man Playing Handball", + "b": "1F93E-200D-2642-FE0F", + "j": [ + "handball", + "man", + "sports" + ] + }, + "woman-playing-handball": { + "a": "Woman Playing Handball", + "b": "1F93E-200D-2640-FE0F", + "j": [ + "handball", + "woman", + "sports" + ] + }, + "person-juggling": { + "a": "Person Juggling", + "b": "1F939", + "j": [ + "balance", + "juggle", + "multitask", + "skill", + "performance" + ] + }, + "man-juggling": { + "a": "Man Juggling", + "b": "1F939-200D-2642-FE0F", + "j": [ + "juggling", + "man", + "multitask", + "juggle", + "balance", + "skill" + ] + }, + "woman-juggling": { + "a": "Woman Juggling", + "b": "1F939-200D-2640-FE0F", + "j": [ + "juggling", + "multitask", + "woman", + "juggle", + "balance", + "skill" + ] + }, + "person-in-lotus-position": { + "a": "Person in Lotus Position", + "b": "1F9D8", + "j": [ + "meditation", + "yoga", + "serenity", + "meditate" + ] + }, + "man-in-lotus-position": { + "a": "Man in Lotus Position", + "b": "1F9D8-200D-2642-FE0F", + "j": [ + "meditation", + "yoga", + "man", + "male", + "serenity", + "zen", + "mindfulness" + ] + }, + "woman-in-lotus-position": { + "a": "Woman in Lotus Position", + "b": "1F9D8-200D-2640-FE0F", + "j": [ + "meditation", + "yoga", + "woman", + "female", + "serenity", + "zen", + "mindfulness" + ] + }, + "person-taking-bath": { + "a": "Person Taking Bath", + "b": "1F6C0", + "j": [ + "bath", + "bathtub", + "clean", + "shower", + "bathroom" + ] + }, + "person-in-bed": { + "a": "Person in Bed", + "b": "1F6CC", + "j": [ + "hotel", + "sleep", + "bed", + "rest" + ] + }, + "people-holding-hands": { + "a": "People Holding Hands", + "b": "1F9D1-200D-1F91D-200D-1F9D1", + "j": [ + "couple", + "hand", + "hold", + "holding hands", + "person", + "friendship" + ] + }, + "women-holding-hands": { + "a": "Women Holding Hands", + "b": "1F46D", + "j": [ + "couple", + "hand", + "holding hands", + "women", + "pair", + "friendship", + "love", + "like", + "female", + "people", + "human" + ] + }, + "woman-and-man-holding-hands": { + "a": "Woman and Man Holding Hands", + "b": "1F46B", + "j": [ + "couple", + "hand", + "hold", + "holding hands", + "man", + "woman", + "pair", + "people", + "human", + "love", + "date", + "dating", + "like", + "affection", + "valentines", + "marriage" + ] + }, + "men-holding-hands": { + "a": "Men Holding Hands", + "b": "1F46C", + "j": [ + "couple", + "Gemini", + "holding hands", + "man", + "men", + "twins", + "zodiac", + "pair", + "love", + "like", + "bromance", + "friendship", + "people", + "human" + ] + }, + "kiss": { + "a": "Kiss", + "b": "1F48F", + "j": [ + "couple", + "pair", + "valentines", + "love", + "like", + "dating", + "marriage" + ] + }, + "kiss-woman-man": { + "a": "Kiss: Woman, Man", + "b": "1F469-200D-2764-FE0F-200D-1F48B-200D-1F468", + "j": [ + "couple", + "kiss", + "man", + "woman", + "love" + ] + }, + "kiss-man-man": { + "a": "Kiss: Man, Man", + "b": "1F468-200D-2764-FE0F-200D-1F48B-200D-1F468", + "j": [ + "couple", + "kiss", + "man", + "pair", + "valentines", + "love", + "like", + "dating", + "marriage" + ] + }, + "kiss-woman-woman": { + "a": "Kiss: Woman, Woman", + "b": "1F469-200D-2764-FE0F-200D-1F48B-200D-1F469", + "j": [ + "couple", + "kiss", + "woman", + "pair", + "valentines", + "love", + "like", + "dating", + "marriage" + ] + }, + "couple-with-heart": { + "a": "Couple with Heart", + "b": "1F491", + "j": [ + "couple", + "love", + "pair", + "like", + "affection", + "human", + "dating", + "valentines", + "marriage" + ] + }, + "couple-with-heart-woman-man": { + "a": "Couple with Heart: Woman, Man", + "b": "1F469-200D-2764-FE0F-200D-1F468", + "j": [ + "couple", + "couple with heart", + "love", + "man", + "woman" + ] + }, + "couple-with-heart-man-man": { + "a": "Couple with Heart: Man, Man", + "b": "1F468-200D-2764-FE0F-200D-1F468", + "j": [ + "couple", + "couple with heart", + "love", + "man", + "pair", + "like", + "affection", + "human", + "dating", + "valentines", + "marriage" + ] + }, + "couple-with-heart-woman-woman": { + "a": "Couple with Heart: Woman, Woman", + "b": "1F469-200D-2764-FE0F-200D-1F469", + "j": [ + "couple", + "couple with heart", + "love", + "woman", + "pair", + "like", + "affection", + "human", + "dating", + "valentines", + "marriage" + ] + }, + "family": { + "a": "Family", + "b": "1F46A", + "j": [ + "home", + "parents", + "child", + "mom", + "dad", + "father", + "mother", + "people", + "human" + ] + }, + "family-man-woman-boy": { + "a": "Family: Man, Woman, Boy", + "b": "1F468-200D-1F469-200D-1F466", + "j": [ + "boy", + "family", + "man", + "woman", + "love" + ] + }, + "family-man-woman-girl": { + "a": "Family: Man, Woman, Girl", + "b": "1F468-200D-1F469-200D-1F467", + "j": [ + "family", + "girl", + "man", + "woman", + "home", + "parents", + "people", + "human", + "child" + ] + }, + "family-man-woman-girl-boy": { + "a": "Family: Man, Woman, Girl, Boy", + "b": "1F468-200D-1F469-200D-1F467-200D-1F466", + "j": [ + "boy", + "family", + "girl", + "man", + "woman", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-man-woman-boy-boy": { + "a": "Family: Man, Woman, Boy, Boy", + "b": "1F468-200D-1F469-200D-1F466-200D-1F466", + "j": [ + "boy", + "family", + "man", + "woman", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-man-woman-girl-girl": { + "a": "Family: Man, Woman, Girl, Girl", + "b": "1F468-200D-1F469-200D-1F467-200D-1F467", + "j": [ + "family", + "girl", + "man", + "woman", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-man-man-boy": { + "a": "Family: Man, Man, Boy", + "b": "1F468-200D-1F468-200D-1F466", + "j": [ + "boy", + "family", + "man", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-man-man-girl": { + "a": "Family: Man, Man, Girl", + "b": "1F468-200D-1F468-200D-1F467", + "j": [ + "family", + "girl", + "man", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-man-man-girl-boy": { + "a": "Family: Man, Man, Girl, Boy", + "b": "1F468-200D-1F468-200D-1F467-200D-1F466", + "j": [ + "boy", + "family", + "girl", + "man", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-man-man-boy-boy": { + "a": "Family: Man, Man, Boy, Boy", + "b": "1F468-200D-1F468-200D-1F466-200D-1F466", + "j": [ + "boy", + "family", + "man", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-man-man-girl-girl": { + "a": "Family: Man, Man, Girl, Girl", + "b": "1F468-200D-1F468-200D-1F467-200D-1F467", + "j": [ + "family", + "girl", + "man", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-woman-woman-boy": { + "a": "Family: Woman, Woman, Boy", + "b": "1F469-200D-1F469-200D-1F466", + "j": [ + "boy", + "family", + "woman", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-woman-woman-girl": { + "a": "Family: Woman, Woman, Girl", + "b": "1F469-200D-1F469-200D-1F467", + "j": [ + "family", + "girl", + "woman", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-woman-woman-girl-boy": { + "a": "Family: Woman, Woman, Girl, Boy", + "b": "1F469-200D-1F469-200D-1F467-200D-1F466", + "j": [ + "boy", + "family", + "girl", + "woman", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-woman-woman-boy-boy": { + "a": "Family: Woman, Woman, Boy, Boy", + "b": "1F469-200D-1F469-200D-1F466-200D-1F466", + "j": [ + "boy", + "family", + "woman", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-woman-woman-girl-girl": { + "a": "Family: Woman, Woman, Girl, Girl", + "b": "1F469-200D-1F469-200D-1F467-200D-1F467", + "j": [ + "family", + "girl", + "woman", + "home", + "parents", + "people", + "human", + "children" + ] + }, + "family-man-boy": { + "a": "Family: Man, Boy", + "b": "1F468-200D-1F466", + "j": [ + "boy", + "family", + "man", + "home", + "parent", + "people", + "human", + "child" + ] + }, + "family-man-boy-boy": { + "a": "Family: Man, Boy, Boy", + "b": "1F468-200D-1F466-200D-1F466", + "j": [ + "boy", + "family", + "man", + "home", + "parent", + "people", + "human", + "children" + ] + }, + "family-man-girl": { + "a": "Family: Man, Girl", + "b": "1F468-200D-1F467", + "j": [ + "family", + "girl", + "man", + "home", + "parent", + "people", + "human", + "child" + ] + }, + "family-man-girl-boy": { + "a": "Family: Man, Girl, Boy", + "b": "1F468-200D-1F467-200D-1F466", + "j": [ + "boy", + "family", + "girl", + "man", + "home", + "parent", + "people", + "human", + "children" + ] + }, + "family-man-girl-girl": { + "a": "Family: Man, Girl, Girl", + "b": "1F468-200D-1F467-200D-1F467", + "j": [ + "family", + "girl", + "man", + "home", + "parent", + "people", + "human", + "children" + ] + }, + "family-woman-boy": { + "a": "Family: Woman, Boy", + "b": "1F469-200D-1F466", + "j": [ + "boy", + "family", + "woman", + "home", + "parent", + "people", + "human", + "child" + ] + }, + "family-woman-boy-boy": { + "a": "Family: Woman, Boy, Boy", + "b": "1F469-200D-1F466-200D-1F466", + "j": [ + "boy", + "family", + "woman", + "home", + "parent", + "people", + "human", + "children" + ] + }, + "family-woman-girl": { + "a": "Family: Woman, Girl", + "b": "1F469-200D-1F467", + "j": [ + "family", + "girl", + "woman", + "home", + "parent", + "people", + "human", + "child" + ] + }, + "family-woman-girl-boy": { + "a": "Family: Woman, Girl, Boy", + "b": "1F469-200D-1F467-200D-1F466", + "j": [ + "boy", + "family", + "girl", + "woman", + "home", + "parent", + "people", + "human", + "children" + ] + }, + "family-woman-girl-girl": { + "a": "Family: Woman, Girl, Girl", + "b": "1F469-200D-1F467-200D-1F467", + "j": [ + "family", + "girl", + "woman", + "home", + "parent", + "people", + "human", + "children" + ] + }, + "speaking-head": { + "a": "Speaking Head", + "b": "1F5E3", + "j": [ + "face", + "head", + "silhouette", + "speak", + "speaking", + "user", + "person", + "human", + "sing", + "say", + "talk" + ] + }, + "bust-in-silhouette": { + "a": "Bust in Silhouette", + "b": "1F464", + "j": [ + "bust", + "silhouette", + "user", + "person", + "human" + ] + }, + "busts-in-silhouette": { + "a": "Busts in Silhouette", + "b": "1F465", + "j": [ + "bust", + "silhouette", + "user", + "person", + "human", + "group", + "team" + ] + }, + "people-hugging": { + "a": "People Hugging", + "b": "1FAC2", + "j": [ + "goodbye", + "hello", + "hug", + "thanks", + "care" + ] + }, + "footprints": { + "a": "Footprints", + "b": "1F463", + "j": [ + "clothing", + "footprint", + "print", + "feet", + "tracking", + "walking", + "beach" + ] + }, + "red-hair": { + "a": "Red Hair", + "b": "1F9B0", + "j": [ + "ginger", + "red hair", + "redhead" + ] + }, + "curly-hair": { + "a": "Curly Hair", + "b": "1F9B1", + "j": [ + "afro", + "curly", + "curly hair", + "ringlets" + ] + }, + "white-hair": { + "a": "White Hair", + "b": "1F9B3", + "j": [ + "gray", + "hair", + "old", + "white" + ] + }, + "bald": { + "a": "Bald", + "b": "1F9B2", + "j": [ + "bald", + "chemotherapy", + "hairless", + "no hair", + "shaven" + ] + }, + "monkey-face": { + "a": "Monkey Face", + "b": "1F435", + "j": [ + "face", + "monkey", + "animal", + "nature", + "circus" + ] + }, + "monkey": { + "a": "Monkey", + "b": "1F412", + "j": [ + "animal", + "nature", + "banana", + "circus" + ] + }, + "gorilla": { + "a": "Gorilla", + "b": "1F98D", + "j": [ + "animal", + "nature", + "circus" + ] + }, + "orangutan": { + "a": "Orangutan", + "b": "1F9A7", + "j": [ + "ape", + "animal" + ] + }, + "dog-face": { + "a": "Dog Face", + "b": "1F436", + "j": [ + "dog", + "face", + "pet", + "animal", + "friend", + "nature", + "woof", + "puppy", + "faithful" + ] + }, + "dog": { + "a": "Dog", + "b": "1F415", + "j": [ + "pet", + "animal", + "nature", + "friend", + "doge", + "faithful" + ] + }, + "guide-dog": { + "a": "Guide Dog", + "b": "1F9AE", + "j": [ + "accessibility", + "blind", + "guide", + "animal" + ] + }, + "service-dog": { + "a": "Service Dog", + "b": "1F415-200D-1F9BA", + "j": [ + "accessibility", + "assistance", + "dog", + "service", + "blind", + "animal" + ] + }, + "poodle": { + "a": "Poodle", + "b": "1F429", + "j": [ + "dog", + "animal", + "101", + "nature", + "pet" + ] + }, + "wolf": { + "a": "Wolf", + "b": "1F43A", + "j": [ + "face", + "animal", + "nature", + "wild" + ] + }, + "fox": { + "a": "Fox", + "b": "1F98A", + "j": [ + "face", + "animal", + "nature" + ] + }, + "raccoon": { + "a": "Raccoon", + "b": "1F99D", + "j": [ + "curious", + "sly", + "animal", + "nature" + ] + }, + "cat-face": { + "a": "Cat Face", + "b": "1F431", + "j": [ + "cat", + "face", + "pet", + "animal", + "meow", + "nature", + "kitten" + ] + }, + "cat": { + "a": "Cat", + "b": "1F408", + "j": [ + "pet", + "animal", + "meow", + "cats" + ] + }, + "black-cat": { + "a": "Black Cat", + "b": "1F408-200D-2B1B", + "j": [ + "black", + "cat", + "unlucky", + "superstition", + "luck" + ] + }, + "lion": { + "a": "Lion", + "b": "1F981", + "j": [ + "face", + "Leo", + "zodiac", + "animal", + "nature" + ] + }, + "tiger-face": { + "a": "Tiger Face", + "b": "1F42F", + "j": [ + "face", + "tiger", + "animal", + "cat", + "danger", + "wild", + "nature", + "roar" + ] + }, + "tiger": { + "a": "Tiger", + "b": "1F405", + "j": [ + "animal", + "nature", + "roar" + ] + }, + "leopard": { + "a": "Leopard", + "b": "1F406", + "j": [ + "animal", + "nature" + ] + }, + "horse-face": { + "a": "Horse Face", + "b": "1F434", + "j": [ + "face", + "horse", + "animal", + "brown", + "nature" + ] + }, + "horse": { + "a": "Horse", + "b": "1F40E", + "j": [ + "equestrian", + "racehorse", + "racing", + "animal", + "gamble", + "luck" + ] + }, + "unicorn": { + "a": "Unicorn", + "b": "1F984", + "j": [ + "face", + "animal", + "nature", + "mystical" + ] + }, + "zebra": { + "a": "Zebra", + "b": "1F993", + "j": [ + "stripe", + "animal", + "nature", + "stripes", + "safari" + ] + }, + "deer": { + "a": "Deer", + "b": "1F98C", + "j": [ + "animal", + "nature", + "horns", + "venison" + ] + }, + "bison": { + "a": "Bison", + "b": "1F9AC", + "j": [ + "buffalo", + "herd", + "wisent", + "ox" + ] + }, + "cow-face": { + "a": "Cow Face", + "b": "1F42E", + "j": [ + "cow", + "face", + "beef", + "ox", + "animal", + "nature", + "moo", + "milk" + ] + }, + "ox": { + "a": "Ox", + "b": "1F402", + "j": [ + "bull", + "Taurus", + "zodiac", + "animal", + "cow", + "beef" + ] + }, + "water-buffalo": { + "a": "Water Buffalo", + "b": "1F403", + "j": [ + "buffalo", + "water", + "animal", + "nature", + "ox", + "cow" + ] + }, + "cow": { + "a": "Cow", + "b": "1F404", + "j": [ + "beef", + "ox", + "animal", + "nature", + "moo", + "milk" + ] + }, + "pig-face": { + "a": "Pig Face", + "b": "1F437", + "j": [ + "face", + "pig", + "animal", + "oink", + "nature" + ] + }, + "pig": { + "a": "Pig", + "b": "1F416", + "j": [ + "sow", + "animal", + "nature" + ] + }, + "boar": { + "a": "Boar", + "b": "1F417", + "j": [ + "pig", + "animal", + "nature" + ] + }, + "pig-nose": { + "a": "Pig Nose", + "b": "1F43D", + "j": [ + "face", + "nose", + "pig", + "animal", + "oink" + ] + }, + "ram": { + "a": "Ram", + "b": "1F40F", + "j": [ + "Aries", + "male", + "sheep", + "zodiac", + "animal", + "nature" + ] + }, + "ewe": { + "a": "Ewe", + "b": "1F411", + "j": [ + "female", + "sheep", + "animal", + "nature", + "wool", + "shipit" + ] + }, + "goat": { + "a": "Goat", + "b": "1F410", + "j": [ + "Capricorn", + "zodiac", + "animal", + "nature" + ] + }, + "camel": { + "a": "Camel", + "b": "1F42A", + "j": [ + "dromedary", + "hump", + "animal", + "hot", + "desert" + ] + }, + "twohump-camel": { + "a": "Two-Hump Camel", + "b": "1F42B", + "j": [ + "bactrian", + "camel", + "hump", + "two-hump camel", + "two_hump_camel", + "animal", + "nature", + "hot", + "desert" + ] + }, + "llama": { + "a": "Llama", + "b": "1F999", + "j": [ + "alpaca", + "guanaco", + "vicuña", + "wool", + "animal", + "nature" + ] + }, + "giraffe": { + "a": "Giraffe", + "b": "1F992", + "j": [ + "spots", + "animal", + "nature", + "safari" + ] + }, + "elephant": { + "a": "Elephant", + "b": "1F418", + "j": [ + "animal", + "nature", + "nose", + "th", + "circus" + ] + }, + "mammoth": { + "a": "Mammoth", + "b": "1F9A3", + "j": [ + "extinction", + "large", + "tusk", + "woolly", + "elephant", + "tusks" + ] + }, + "rhinoceros": { + "a": "Rhinoceros", + "b": "1F98F", + "j": [ + "animal", + "nature", + "horn" + ] + }, + "hippopotamus": { + "a": "Hippopotamus", + "b": "1F99B", + "j": [ + "hippo", + "animal", + "nature" + ] + }, + "mouse-face": { + "a": "Mouse Face", + "b": "1F42D", + "j": [ + "face", + "mouse", + "animal", + "nature", + "cheese_wedge", + "rodent" + ] + }, + "mouse": { + "a": "Mouse", + "b": "1F401", + "j": [ + "animal", + "nature", + "rodent" + ] + }, + "rat": { + "a": "Rat", + "b": "1F400", + "j": [ + "animal", + "mouse", + "rodent" + ] + }, + "hamster": { + "a": "Hamster", + "b": "1F439", + "j": [ + "face", + "pet", + "animal", + "nature" + ] + }, + "rabbit-face": { + "a": "Rabbit Face", + "b": "1F430", + "j": [ + "bunny", + "face", + "pet", + "rabbit", + "animal", + "nature", + "spring", + "magic" + ] + }, + "rabbit": { + "a": "Rabbit", + "b": "1F407", + "j": [ + "bunny", + "pet", + "animal", + "nature", + "magic", + "spring" + ] + }, + "chipmunk": { + "a": "Chipmunk", + "b": "1F43F", + "j": [ + "squirrel", + "animal", + "nature", + "rodent" + ] + }, + "beaver": { + "a": "Beaver", + "b": "1F9AB", + "j": [ + "dam", + "animal", + "rodent" + ] + }, + "hedgehog": { + "a": "Hedgehog", + "b": "1F994", + "j": [ + "spiny", + "animal", + "nature" + ] + }, + "bat": { + "a": "Bat", + "b": "1F987", + "j": [ + "vampire", + "animal", + "nature", + "blind" + ] + }, + "bear": { + "a": "Bear", + "b": "1F43B", + "j": [ + "face", + "animal", + "nature", + "wild" + ] + }, + "polar-bear": { + "a": "Polar Bear", + "b": "1F43B-200D-2744-FE0F", + "j": [ + "arctic", + "bear", + "white", + "animal" + ] + }, + "koala": { + "a": "Koala", + "b": "1F428", + "j": [ + "bear", + "animal", + "nature" + ] + }, + "panda": { + "a": "Panda", + "b": "1F43C", + "j": [ + "face", + "animal", + "nature" + ] + }, + "sloth": { + "a": "Sloth", + "b": "1F9A5", + "j": [ + "lazy", + "slow", + "animal" + ] + }, + "otter": { + "a": "Otter", + "b": "1F9A6", + "j": [ + "fishing", + "playful", + "animal" + ] + }, + "skunk": { + "a": "Skunk", + "b": "1F9A8", + "j": [ + "stink", + "animal" + ] + }, + "kangaroo": { + "a": "Kangaroo", + "b": "1F998", + "j": [ + "Australia", + "joey", + "jump", + "marsupial", + "animal", + "nature", + "australia", + "hop" + ] + }, + "badger": { + "a": "Badger", + "b": "1F9A1", + "j": [ + "honey badger", + "pester", + "animal", + "nature", + "honey" + ] + }, + "paw-prints": { + "a": "Paw Prints", + "b": "1F43E", + "j": [ + "feet", + "paw", + "print", + "animal", + "tracking", + "footprints", + "dog", + "cat", + "pet" + ] + }, + "turkey": { + "a": "Turkey", + "b": "1F983", + "j": [ + "bird", + "animal" + ] + }, + "chicken": { + "a": "Chicken", + "b": "1F414", + "j": [ + "bird", + "animal", + "cluck", + "nature" + ] + }, + "rooster": { + "a": "Rooster", + "b": "1F413", + "j": [ + "bird", + "animal", + "nature", + "chicken" + ] + }, + "hatching-chick": { + "a": "Hatching Chick", + "b": "1F423", + "j": [ + "baby", + "bird", + "chick", + "hatching", + "animal", + "chicken", + "egg", + "born" + ] + }, + "baby-chick": { + "a": "Baby Chick", + "b": "1F424", + "j": [ + "baby", + "bird", + "chick", + "animal", + "chicken" + ] + }, + "frontfacing-baby-chick": { + "a": "Front-Facing Baby Chick", + "b": "1F425", + "j": [ + "baby", + "bird", + "chick", + "front-facing baby chick", + "front_facing_baby_chick", + "animal", + "chicken" + ] + }, + "bird": { + "a": "Bird", + "b": "1F426", + "j": [ + "animal", + "nature", + "fly", + "tweet", + "spring" + ] + }, + "penguin": { + "a": "Penguin", + "b": "1F427", + "j": [ + "bird", + "animal", + "nature" + ] + }, + "dove": { + "a": "Dove", + "b": "1F54A", + "j": [ + "bird", + "fly", + "peace", + "animal" + ] + }, + "eagle": { + "a": "Eagle", + "b": "1F985", + "j": [ + "bird", + "animal", + "nature" + ] + }, + "duck": { + "a": "Duck", + "b": "1F986", + "j": [ + "bird", + "animal", + "nature", + "mallard" + ] + }, + "swan": { + "a": "Swan", + "b": "1F9A2", + "j": [ + "bird", + "cygnet", + "ugly duckling", + "animal", + "nature" + ] + }, + "owl": { + "a": "Owl", + "b": "1F989", + "j": [ + "bird", + "wise", + "animal", + "nature", + "hoot" + ] + }, + "dodo": { + "a": "Dodo", + "b": "1F9A4", + "j": [ + "extinction", + "large", + "Mauritius", + "animal", + "bird" + ] + }, + "feather": { + "a": "Feather", + "b": "1FAB6", + "j": [ + "bird", + "flight", + "light", + "plumage", + "fly" + ] + }, + "flamingo": { + "a": "Flamingo", + "b": "1F9A9", + "j": [ + "flamboyant", + "tropical", + "animal" + ] + }, + "peacock": { + "a": "Peacock", + "b": "1F99A", + "j": [ + "bird", + "ostentatious", + "peahen", + "proud", + "animal", + "nature" + ] + }, + "parrot": { + "a": "Parrot", + "b": "1F99C", + "j": [ + "bird", + "pirate", + "talk", + "animal", + "nature" + ] + }, + "frog": { + "a": "Frog", + "b": "1F438", + "j": [ + "face", + "animal", + "nature", + "croak", + "toad" + ] + }, + "crocodile": { + "a": "Crocodile", + "b": "1F40A", + "j": [ + "animal", + "nature", + "reptile", + "lizard", + "alligator" + ] + }, + "turtle": { + "a": "Turtle", + "b": "1F422", + "j": [ + "terrapin", + "tortoise", + "animal", + "slow", + "nature" + ] + }, + "lizard": { + "a": "Lizard", + "b": "1F98E", + "j": [ + "reptile", + "animal", + "nature" + ] + }, + "snake": { + "a": "Snake", + "b": "1F40D", + "j": [ + "bearer", + "Ophiuchus", + "serpent", + "zodiac", + "animal", + "evil", + "nature", + "hiss", + "python" + ] + }, + "dragon-face": { + "a": "Dragon Face", + "b": "1F432", + "j": [ + "dragon", + "face", + "fairy tale", + "animal", + "myth", + "nature", + "chinese", + "green" + ] + }, + "dragon": { + "a": "Dragon", + "b": "1F409", + "j": [ + "fairy tale", + "animal", + "myth", + "nature", + "chinese", + "green" + ] + }, + "sauropod": { + "a": "Sauropod", + "b": "1F995", + "j": [ + "brachiosaurus", + "brontosaurus", + "diplodocus", + "animal", + "nature", + "dinosaur", + "extinct" + ] + }, + "trex": { + "a": "T-Rex", + "b": "1F996", + "j": [ + "Tyrannosaurus Rex", + "t_rex", + "animal", + "nature", + "dinosaur", + "tyrannosaurus", + "extinct" + ] + }, + "spouting-whale": { + "a": "Spouting Whale", + "b": "1F433", + "j": [ + "face", + "spouting", + "whale", + "animal", + "nature", + "sea", + "ocean" + ] + }, + "whale": { + "a": "Whale", + "b": "1F40B", + "j": [ + "animal", + "nature", + "sea", + "ocean" + ] + }, + "dolphin": { + "a": "Dolphin", + "b": "1F42C", + "j": [ + "flipper", + "animal", + "nature", + "fish", + "sea", + "ocean", + "fins", + "beach" + ] + }, + "seal": { + "a": "Seal", + "b": "1F9AD", + "j": [ + "sea lion", + "animal", + "creature", + "sea" + ] + }, + "fish": { + "a": "Fish", + "b": "1F41F", + "j": [ + "Pisces", + "zodiac", + "animal", + "food", + "nature" + ] + }, + "tropical-fish": { + "a": "Tropical Fish", + "b": "1F420", + "j": [ + "fish", + "tropical", + "animal", + "swim", + "ocean", + "beach", + "nemo" + ] + }, + "blowfish": { + "a": "Blowfish", + "b": "1F421", + "j": [ + "fish", + "animal", + "nature", + "food", + "sea", + "ocean" + ] + }, + "shark": { + "a": "Shark", + "b": "1F988", + "j": [ + "fish", + "animal", + "nature", + "sea", + "ocean", + "jaws", + "fins", + "beach" + ] + }, + "octopus": { + "a": "Octopus", + "b": "1F419", + "j": [ + "animal", + "creature", + "ocean", + "sea", + "nature", + "beach" + ] + }, + "spiral-shell": { + "a": "Spiral Shell", + "b": "1F41A", + "j": [ + "shell", + "spiral", + "nature", + "sea", + "beach" + ] + }, + "snail": { + "a": "Snail", + "b": "1F40C", + "j": [ + "slow", + "animal", + "shell" + ] + }, + "butterfly": { + "a": "Butterfly", + "b": "1F98B", + "j": [ + "insect", + "pretty", + "animal", + "nature", + "caterpillar" + ] + }, + "bug": { + "a": "Bug", + "b": "1F41B", + "j": [ + "insect", + "animal", + "nature", + "worm" + ] + }, + "ant": { + "a": "Ant", + "b": "1F41C", + "j": [ + "insect", + "animal", + "nature", + "bug" + ] + }, + "honeybee": { + "a": "Honeybee", + "b": "1F41D", + "j": [ + "bee", + "insect", + "animal", + "nature", + "bug", + "spring", + "honey" + ] + }, + "beetle": { + "a": "Beetle", + "b": "1FAB2", + "j": [ + "bug", + "insect" + ] + }, + "lady-beetle": { + "a": "Lady Beetle", + "b": "1F41E", + "j": [ + "beetle", + "insect", + "ladybird", + "ladybug", + "animal", + "nature" + ] + }, + "cricket": { + "a": "Cricket", + "b": "1F997", + "j": [ + "grasshopper", + "Orthoptera", + "animal", + "chirp" + ] + }, + "cockroach": { + "a": "Cockroach", + "b": "1FAB3", + "j": [ + "insect", + "pest", + "roach", + "pests" + ] + }, + "spider": { + "a": "Spider", + "b": "1F577", + "j": [ + "insect", + "animal", + "arachnid" + ] + }, + "spider-web": { + "a": "Spider Web", + "b": "1F578", + "j": [ + "spider", + "web", + "animal", + "insect", + "arachnid", + "silk" + ] + }, + "scorpion": { + "a": "Scorpion", + "b": "1F982", + "j": [ + "scorpio", + "Scorpio", + "zodiac", + "animal", + "arachnid" + ] + }, + "mosquito": { + "a": "Mosquito", + "b": "1F99F", + "j": [ + "disease", + "fever", + "malaria", + "pest", + "virus", + "animal", + "nature", + "insect" + ] + }, + "fly": { + "a": "Fly", + "b": "1FAB0", + "j": [ + "disease", + "maggot", + "pest", + "rotting", + "insect" + ] + }, + "worm": { + "a": "Worm", + "b": "1FAB1", + "j": [ + "annelid", + "earthworm", + "parasite", + "animal" + ] + }, + "microbe": { + "a": "Microbe", + "b": "1F9A0", + "j": [ + "amoeba", + "bacteria", + "virus", + "germs" + ] + }, + "bouquet": { + "a": "Bouquet", + "b": "1F490", + "j": [ + "flower", + "flowers", + "nature", + "spring" + ] + }, + "cherry-blossom": { + "a": "Cherry Blossom", + "b": "1F338", + "j": [ + "blossom", + "cherry", + "flower", + "nature", + "plant", + "spring" + ] + }, + "white-flower": { + "a": "White Flower", + "b": "1F4AE", + "j": [ + "flower", + "japanese", + "spring" + ] + }, + "rosette": { + "a": "Rosette", + "b": "1F3F5", + "j": [ + "plant", + "flower", + "decoration", + "military" + ] + }, + "rose": { + "a": "Rose", + "b": "1F339", + "j": [ + "flower", + "flowers", + "valentines", + "love", + "spring" + ] + }, + "wilted-flower": { + "a": "Wilted Flower", + "b": "1F940", + "j": [ + "flower", + "wilted", + "plant", + "nature" + ] + }, + "hibiscus": { + "a": "Hibiscus", + "b": "1F33A", + "j": [ + "flower", + "plant", + "vegetable", + "flowers", + "beach" + ] + }, + "sunflower": { + "a": "Sunflower", + "b": "1F33B", + "j": [ + "flower", + "sun", + "nature", + "plant", + "fall" + ] + }, + "blossom": { + "a": "Blossom", + "b": "1F33C", + "j": [ + "flower", + "nature", + "flowers", + "yellow" + ] + }, + "tulip": { + "a": "Tulip", + "b": "1F337", + "j": [ + "flower", + "flowers", + "plant", + "nature", + "summer", + "spring" + ] + }, + "seedling": { + "a": "Seedling", + "b": "1F331", + "j": [ + "young", + "plant", + "nature", + "grass", + "lawn", + "spring" + ] + }, + "potted-plant": { + "a": "Potted Plant", + "b": "1FAB4", + "j": [ + "boring", + "grow", + "house", + "nurturing", + "plant", + "useless", + "greenery" + ] + }, + "evergreen-tree": { + "a": "Evergreen Tree", + "b": "1F332", + "j": [ + "tree", + "plant", + "nature" + ] + }, + "deciduous-tree": { + "a": "Deciduous Tree", + "b": "1F333", + "j": [ + "deciduous", + "shedding", + "tree", + "plant", + "nature" + ] + }, + "palm-tree": { + "a": "Palm Tree", + "b": "1F334", + "j": [ + "palm", + "tree", + "plant", + "vegetable", + "nature", + "summer", + "beach", + "mojito", + "tropical" + ] + }, + "cactus": { + "a": "Cactus", + "b": "1F335", + "j": [ + "plant", + "vegetable", + "nature" + ] + }, + "sheaf-of-rice": { + "a": "Sheaf of Rice", + "b": "1F33E", + "j": [ + "ear", + "grain", + "rice", + "nature", + "plant" + ] + }, + "herb": { + "a": "Herb", + "b": "1F33F", + "j": [ + "leaf", + "vegetable", + "plant", + "medicine", + "weed", + "grass", + "lawn" + ] + }, + "shamrock": { + "a": "Shamrock", + "b": "2618", + "j": [ + "plant", + "vegetable", + "nature", + "irish", + "clover" + ] + }, + "four-leaf-clover": { + "a": "Four Leaf Clover", + "b": "1F340", + "j": [ + "4", + "clover", + "four", + "four-leaf clover", + "leaf", + "vegetable", + "plant", + "nature", + "lucky", + "irish" + ] + }, + "maple-leaf": { + "a": "Maple Leaf", + "b": "1F341", + "j": [ + "falling", + "leaf", + "maple", + "nature", + "plant", + "vegetable", + "ca", + "fall" + ] + }, + "fallen-leaf": { + "a": "Fallen Leaf", + "b": "1F342", + "j": [ + "falling", + "leaf", + "nature", + "plant", + "vegetable", + "leaves" + ] + }, + "leaf-fluttering-in-wind": { + "a": "Leaf Fluttering in Wind", + "b": "1F343", + "j": [ + "blow", + "flutter", + "leaf", + "wind", + "nature", + "plant", + "tree", + "vegetable", + "grass", + "lawn", + "spring" + ] + }, + "grapes": { + "a": "Grapes", + "b": "1F347", + "j": [ + "fruit", + "grape", + "food", + "wine" + ] + }, + "melon": { + "a": "Melon", + "b": "1F348", + "j": [ + "fruit", + "nature", + "food" + ] + }, + "watermelon": { + "a": "Watermelon", + "b": "1F349", + "j": [ + "fruit", + "food", + "picnic", + "summer" + ] + }, + "tangerine": { + "a": "Tangerine", + "b": "1F34A", + "j": [ + "fruit", + "orange", + "food", + "nature" + ] + }, + "lemon": { + "a": "Lemon", + "b": "1F34B", + "j": [ + "citrus", + "fruit", + "nature" + ] + }, + "banana": { + "a": "Banana", + "b": "1F34C", + "j": [ + "fruit", + "food", + "monkey" + ] + }, + "pineapple": { + "a": "Pineapple", + "b": "1F34D", + "j": [ + "fruit", + "nature", + "food" + ] + }, + "mango": { + "a": "Mango", + "b": "1F96D", + "j": [ + "fruit", + "tropical", + "food" + ] + }, + "red-apple": { + "a": "Red Apple", + "b": "1F34E", + "j": [ + "apple", + "fruit", + "red", + "mac", + "school" + ] + }, + "green-apple": { + "a": "Green Apple", + "b": "1F34F", + "j": [ + "apple", + "fruit", + "green", + "nature" + ] + }, + "pear": { + "a": "Pear", + "b": "1F350", + "j": [ + "fruit", + "nature", + "food" + ] + }, + "peach": { + "a": "Peach", + "b": "1F351", + "j": [ + "fruit", + "nature", + "food" + ] + }, + "cherries": { + "a": "Cherries", + "b": "1F352", + "j": [ + "berries", + "cherry", + "fruit", + "red", + "food" + ] + }, + "strawberry": { + "a": "Strawberry", + "b": "1F353", + "j": [ + "berry", + "fruit", + "food", + "nature" + ] + }, + "blueberries": { + "a": "Blueberries", + "b": "1FAD0", + "j": [ + "berry", + "bilberry", + "blue", + "blueberry", + "fruit" + ] + }, + "kiwi-fruit": { + "a": "Kiwi Fruit", + "b": "1F95D", + "j": [ + "food", + "fruit", + "kiwi" + ] + }, + "tomato": { + "a": "Tomato", + "b": "1F345", + "j": [ + "fruit", + "vegetable", + "nature", + "food" + ] + }, + "olive": { + "a": "Olive", + "b": "1FAD2", + "j": [ + "food", + "fruit" + ] + }, + "coconut": { + "a": "Coconut", + "b": "1F965", + "j": [ + "palm", + "piña colada", + "fruit", + "nature", + "food" + ] + }, + "avocado": { + "a": "Avocado", + "b": "1F951", + "j": [ + "food", + "fruit" + ] + }, + "eggplant": { + "a": "Eggplant", + "b": "1F346", + "j": [ + "aubergine", + "vegetable", + "nature", + "food" + ] + }, + "potato": { + "a": "Potato", + "b": "1F954", + "j": [ + "food", + "vegetable", + "tuber", + "vegatable", + "starch" + ] + }, + "carrot": { + "a": "Carrot", + "b": "1F955", + "j": [ + "food", + "vegetable", + "orange" + ] + }, + "ear-of-corn": { + "a": "Ear of Corn", + "b": "1F33D", + "j": [ + "corn", + "ear", + "maize", + "maze", + "food", + "vegetable", + "plant" + ] + }, + "hot-pepper": { + "a": "Hot Pepper", + "b": "1F336", + "j": [ + "hot", + "pepper", + "food", + "spicy", + "chilli", + "chili" + ] + }, + "bell-pepper": { + "a": "Bell Pepper", + "b": "1FAD1", + "j": [ + "capsicum", + "pepper", + "vegetable", + "fruit", + "plant" + ] + }, + "cucumber": { + "a": "Cucumber", + "b": "1F952", + "j": [ + "food", + "pickle", + "vegetable", + "fruit" + ] + }, + "leafy-green": { + "a": "Leafy Green", + "b": "1F96C", + "j": [ + "bok choy", + "cabbage", + "kale", + "lettuce", + "food", + "vegetable", + "plant" + ] + }, + "broccoli": { + "a": "Broccoli", + "b": "1F966", + "j": [ + "wild cabbage", + "fruit", + "food", + "vegetable" + ] + }, + "garlic": { + "a": "Garlic", + "b": "1F9C4", + "j": [ + "flavoring", + "food", + "spice", + "cook" + ] + }, + "onion": { + "a": "Onion", + "b": "1F9C5", + "j": [ + "flavoring", + "cook", + "food", + "spice" + ] + }, + "mushroom": { + "a": "Mushroom", + "b": "1F344", + "j": [ + "toadstool", + "plant", + "vegetable" + ] + }, + "peanuts": { + "a": "Peanuts", + "b": "1F95C", + "j": [ + "food", + "nut", + "peanut", + "vegetable" + ] + }, + "chestnut": { + "a": "Chestnut", + "b": "1F330", + "j": [ + "plant", + "food", + "squirrel" + ] + }, + "bread": { + "a": "Bread", + "b": "1F35E", + "j": [ + "loaf", + "food", + "wheat", + "breakfast", + "toast" + ] + }, + "croissant": { + "a": "Croissant", + "b": "1F950", + "j": [ + "bread", + "breakfast", + "food", + "french", + "roll" + ] + }, + "baguette-bread": { + "a": "Baguette Bread", + "b": "1F956", + "j": [ + "baguette", + "bread", + "food", + "french" + ] + }, + "flatbread": { + "a": "Flatbread", + "b": "1FAD3", + "j": [ + "arepa", + "lavash", + "naan", + "pita", + "flour", + "food" + ] + }, + "pretzel": { + "a": "Pretzel", + "b": "1F968", + "j": [ + "twisted", + "convoluted", + "food", + "bread" + ] + }, + "bagel": { + "a": "Bagel", + "b": "1F96F", + "j": [ + "bakery", + "breakfast", + "schmear", + "food", + "bread" + ] + }, + "pancakes": { + "a": "Pancakes", + "b": "1F95E", + "j": [ + "breakfast", + "crêpe", + "food", + "hotcake", + "pancake", + "flapjacks", + "hotcakes" + ] + }, + "waffle": { + "a": "Waffle", + "b": "1F9C7", + "j": [ + "breakfast", + "indecisive", + "iron", + "food" + ] + }, + "cheese-wedge": { + "a": "Cheese Wedge", + "b": "1F9C0", + "j": [ + "cheese", + "food", + "chadder" + ] + }, + "meat-on-bone": { + "a": "Meat on Bone", + "b": "1F356", + "j": [ + "bone", + "meat", + "good", + "food", + "drumstick" + ] + }, + "poultry-leg": { + "a": "Poultry Leg", + "b": "1F357", + "j": [ + "bone", + "chicken", + "drumstick", + "leg", + "poultry", + "food", + "meat", + "bird", + "turkey" + ] + }, + "cut-of-meat": { + "a": "Cut of Meat", + "b": "1F969", + "j": [ + "chop", + "lambchop", + "porkchop", + "steak", + "food", + "cow", + "meat", + "cut" + ] + }, + "bacon": { + "a": "Bacon", + "b": "1F953", + "j": [ + "breakfast", + "food", + "meat", + "pork", + "pig" + ] + }, + "hamburger": { + "a": "Hamburger", + "b": "1F354", + "j": [ + "burger", + "meat", + "fast food", + "beef", + "cheeseburger", + "mcdonalds", + "burger king" + ] + }, + "french-fries": { + "a": "French Fries", + "b": "1F35F", + "j": [ + "french", + "fries", + "chips", + "snack", + "fast food" + ] + }, + "pizza": { + "a": "Pizza", + "b": "1F355", + "j": [ + "cheese", + "slice", + "food", + "party" + ] + }, + "hot-dog": { + "a": "Hot Dog", + "b": "1F32D", + "j": [ + "frankfurter", + "hotdog", + "sausage", + "food" + ] + }, + "sandwich": { + "a": "Sandwich", + "b": "1F96A", + "j": [ + "bread", + "food", + "lunch" + ] + }, + "taco": { + "a": "Taco", + "b": "1F32E", + "j": [ + "mexican", + "food" + ] + }, + "burrito": { + "a": "Burrito", + "b": "1F32F", + "j": [ + "mexican", + "wrap", + "food" + ] + }, + "tamale": { + "a": "Tamale", + "b": "1FAD4", + "j": [ + "mexican", + "wrapped", + "food", + "masa" + ] + }, + "stuffed-flatbread": { + "a": "Stuffed Flatbread", + "b": "1F959", + "j": [ + "falafel", + "flatbread", + "food", + "gyro", + "kebab", + "stuffed" + ] + }, + "falafel": { + "a": "Falafel", + "b": "1F9C6", + "j": [ + "chickpea", + "meatball", + "food" + ] + }, + "egg": { + "a": "Egg", + "b": "1F95A", + "j": [ + "breakfast", + "food", + "chicken" + ] + }, + "cooking": { + "a": "Cooking", + "b": "1F373", + "j": [ + "breakfast", + "egg", + "frying", + "pan", + "food", + "kitchen" + ] + }, + "shallow-pan-of-food": { + "a": "Shallow Pan of Food", + "b": "1F958", + "j": [ + "casserole", + "food", + "paella", + "pan", + "shallow", + "cooking" + ] + }, + "pot-of-food": { + "a": "Pot of Food", + "b": "1F372", + "j": [ + "pot", + "stew", + "food", + "meat", + "soup" + ] + }, + "fondue": { + "a": "Fondue", + "b": "1FAD5", + "j": [ + "cheese", + "chocolate", + "melted", + "pot", + "Swiss", + "food" + ] + }, + "bowl-with-spoon": { + "a": "Bowl with Spoon", + "b": "1F963", + "j": [ + "breakfast", + "cereal", + "congee", + "oatmeal", + "porridge", + "food" + ] + }, + "green-salad": { + "a": "Green Salad", + "b": "1F957", + "j": [ + "food", + "green", + "salad", + "healthy", + "lettuce" + ] + }, + "popcorn": { + "a": "Popcorn", + "b": "1F37F", + "j": [ + "food", + "movie theater", + "films", + "snack" + ] + }, + "butter": { + "a": "Butter", + "b": "1F9C8", + "j": [ + "dairy", + "food", + "cook" + ] + }, + "salt": { + "a": "Salt", + "b": "1F9C2", + "j": [ + "condiment", + "shaker" + ] + }, + "canned-food": { + "a": "Canned Food", + "b": "1F96B", + "j": [ + "can", + "food", + "soup" + ] + }, + "bento-box": { + "a": "Bento Box", + "b": "1F371", + "j": [ + "bento", + "box", + "food", + "japanese" + ] + }, + "rice-cracker": { + "a": "Rice Cracker", + "b": "1F358", + "j": [ + "cracker", + "rice", + "food", + "japanese" + ] + }, + "rice-ball": { + "a": "Rice Ball", + "b": "1F359", + "j": [ + "ball", + "Japanese", + "rice", + "food", + "japanese" + ] + }, + "cooked-rice": { + "a": "Cooked Rice", + "b": "1F35A", + "j": [ + "cooked", + "rice", + "food", + "china", + "asian" + ] + }, + "curry-rice": { + "a": "Curry Rice", + "b": "1F35B", + "j": [ + "curry", + "rice", + "food", + "spicy", + "hot", + "indian" + ] + }, + "steaming-bowl": { + "a": "Steaming Bowl", + "b": "1F35C", + "j": [ + "bowl", + "noodle", + "ramen", + "steaming", + "food", + "japanese", + "chopsticks" + ] + }, + "spaghetti": { + "a": "Spaghetti", + "b": "1F35D", + "j": [ + "pasta", + "food", + "italian", + "noodle" + ] + }, + "roasted-sweet-potato": { + "a": "Roasted Sweet Potato", + "b": "1F360", + "j": [ + "potato", + "roasted", + "sweet", + "food", + "nature" + ] + }, + "oden": { + "a": "Oden", + "b": "1F362", + "j": [ + "kebab", + "seafood", + "skewer", + "stick", + "food", + "japanese" + ] + }, + "sushi": { + "a": "Sushi", + "b": "1F363", + "j": [ + "food", + "fish", + "japanese", + "rice" + ] + }, + "fried-shrimp": { + "a": "Fried Shrimp", + "b": "1F364", + "j": [ + "fried", + "prawn", + "shrimp", + "tempura", + "food", + "animal", + "appetizer", + "summer" + ] + }, + "fish-cake-with-swirl": { + "a": "Fish Cake with Swirl", + "b": "1F365", + "j": [ + "cake", + "fish", + "pastry", + "swirl", + "food", + "japan", + "sea", + "beach", + "narutomaki", + "pink", + "kamaboko", + "surimi", + "ramen" + ] + }, + "moon-cake": { + "a": "Moon Cake", + "b": "1F96E", + "j": [ + "autumn", + "festival", + "yuèbǐng", + "food" + ] + }, + "dango": { + "a": "Dango", + "b": "1F361", + "j": [ + "dessert", + "Japanese", + "skewer", + "stick", + "sweet", + "food", + "japanese", + "barbecue", + "meat" + ] + }, + "dumpling": { + "a": "Dumpling", + "b": "1F95F", + "j": [ + "empanada", + "gyōza", + "jiaozi", + "pierogi", + "potsticker", + "food" + ] + }, + "fortune-cookie": { + "a": "Fortune Cookie", + "b": "1F960", + "j": [ + "prophecy", + "food" + ] + }, + "takeout-box": { + "a": "Takeout Box", + "b": "1F961", + "j": [ + "oyster pail", + "food", + "leftovers" + ] + }, + "crab": { + "a": "Crab", + "b": "1F980", + "j": [ + "Cancer", + "zodiac", + "animal", + "crustacean" + ] + }, + "lobster": { + "a": "Lobster", + "b": "1F99E", + "j": [ + "bisque", + "claws", + "seafood", + "animal", + "nature" + ] + }, + "shrimp": { + "a": "Shrimp", + "b": "1F990", + "j": [ + "food", + "shellfish", + "small", + "animal", + "ocean", + "nature", + "seafood" + ] + }, + "squid": { + "a": "Squid", + "b": "1F991", + "j": [ + "food", + "molusc", + "animal", + "nature", + "ocean", + "sea" + ] + }, + "oyster": { + "a": "Oyster", + "b": "1F9AA", + "j": [ + "diving", + "pearl", + "food" + ] + }, + "soft-ice-cream": { + "a": "Soft Ice Cream", + "b": "1F366", + "j": [ + "cream", + "dessert", + "ice", + "icecream", + "soft", + "sweet", + "food", + "hot", + "summer" + ] + }, + "shaved-ice": { + "a": "Shaved Ice", + "b": "1F367", + "j": [ + "dessert", + "ice", + "shaved", + "sweet", + "hot", + "summer" + ] + }, + "ice-cream": { + "a": "Ice Cream", + "b": "1F368", + "j": [ + "cream", + "dessert", + "ice", + "sweet", + "food", + "hot" + ] + }, + "doughnut": { + "a": "Doughnut", + "b": "1F369", + "j": [ + "breakfast", + "dessert", + "donut", + "sweet", + "food", + "snack" + ] + }, + "cookie": { + "a": "Cookie", + "b": "1F36A", + "j": [ + "dessert", + "sweet", + "food", + "snack", + "oreo", + "chocolate" + ] + }, + "birthday-cake": { + "a": "Birthday Cake", + "b": "1F382", + "j": [ + "birthday", + "cake", + "celebration", + "dessert", + "pastry", + "sweet", + "food" + ] + }, + "shortcake": { + "a": "Shortcake", + "b": "1F370", + "j": [ + "cake", + "dessert", + "pastry", + "slice", + "sweet", + "food" + ] + }, + "cupcake": { + "a": "Cupcake", + "b": "1F9C1", + "j": [ + "bakery", + "sweet", + "food", + "dessert" + ] + }, + "pie": { + "a": "Pie", + "b": "1F967", + "j": [ + "filling", + "pastry", + "fruit", + "meat", + "food", + "dessert" + ] + }, + "chocolate-bar": { + "a": "Chocolate Bar", + "b": "1F36B", + "j": [ + "bar", + "chocolate", + "dessert", + "sweet", + "food", + "snack" + ] + }, + "candy": { + "a": "Candy", + "b": "1F36C", + "j": [ + "dessert", + "sweet", + "snack", + "lolly" + ] + }, + "lollipop": { + "a": "Lollipop", + "b": "1F36D", + "j": [ + "candy", + "dessert", + "sweet", + "food", + "snack" + ] + }, + "custard": { + "a": "Custard", + "b": "1F36E", + "j": [ + "dessert", + "pudding", + "sweet", + "food" + ] + }, + "honey-pot": { + "a": "Honey Pot", + "b": "1F36F", + "j": [ + "honey", + "honeypot", + "pot", + "sweet", + "bees", + "kitchen" + ] + }, + "baby-bottle": { + "a": "Baby Bottle", + "b": "1F37C", + "j": [ + "baby", + "bottle", + "drink", + "milk", + "food", + "container" + ] + }, + "glass-of-milk": { + "a": "Glass of Milk", + "b": "1F95B", + "j": [ + "drink", + "glass", + "milk", + "beverage", + "cow" + ] + }, + "hot-beverage": { + "a": "Hot Beverage", + "b": "2615", + "j": [ + "beverage", + "coffee", + "drink", + "hot", + "steaming", + "tea", + "caffeine", + "latte", + "espresso" + ] + }, + "teapot": { + "a": "Teapot", + "b": "1FAD6", + "j": [ + "drink", + "pot", + "tea", + "hot" + ] + }, + "teacup-without-handle": { + "a": "Teacup Without Handle", + "b": "1F375", + "j": [ + "beverage", + "cup", + "drink", + "tea", + "teacup", + "bowl", + "breakfast", + "green", + "british" + ] + }, + "sake": { + "a": "Sake", + "b": "1F376", + "j": [ + "bar", + "beverage", + "bottle", + "cup", + "drink", + "wine", + "drunk", + "japanese", + "alcohol", + "booze" + ] + }, + "bottle-with-popping-cork": { + "a": "Bottle with Popping Cork", + "b": "1F37E", + "j": [ + "bar", + "bottle", + "cork", + "drink", + "popping", + "wine", + "celebration" + ] + }, + "wine-glass": { + "a": "Wine Glass", + "b": "1F377", + "j": [ + "bar", + "beverage", + "drink", + "glass", + "wine", + "drunk", + "alcohol", + "booze" + ] + }, + "cocktail-glass": { + "a": "Cocktail Glass", + "b": "1F378", + "j": [ + "bar", + "cocktail", + "drink", + "glass", + "drunk", + "alcohol", + "beverage", + "booze", + "mojito" + ] + }, + "tropical-drink": { + "a": "Tropical Drink", + "b": "1F379", + "j": [ + "bar", + "drink", + "tropical", + "beverage", + "cocktail", + "summer", + "beach", + "alcohol", + "booze", + "mojito" + ] + }, + "beer-mug": { + "a": "Beer Mug", + "b": "1F37A", + "j": [ + "bar", + "beer", + "drink", + "mug", + "relax", + "beverage", + "drunk", + "party", + "pub", + "summer", + "alcohol", + "booze" + ] + }, + "clinking-beer-mugs": { + "a": "Clinking Beer Mugs", + "b": "1F37B", + "j": [ + "bar", + "beer", + "clink", + "drink", + "mug", + "relax", + "beverage", + "drunk", + "party", + "pub", + "summer", + "alcohol", + "booze" + ] + }, + "clinking-glasses": { + "a": "Clinking Glasses", + "b": "1F942", + "j": [ + "celebrate", + "clink", + "drink", + "glass", + "beverage", + "party", + "alcohol", + "cheers", + "wine", + "champagne", + "toast" + ] + }, + "tumbler-glass": { + "a": "Tumbler Glass", + "b": "1F943", + "j": [ + "glass", + "liquor", + "shot", + "tumbler", + "whisky", + "drink", + "beverage", + "drunk", + "alcohol", + "booze", + "bourbon", + "scotch" + ] + }, + "cup-with-straw": { + "a": "Cup with Straw", + "b": "1F964", + "j": [ + "juice", + "soda", + "malt", + "soft drink", + "water", + "drink" + ] + }, + "bubble-tea": { + "a": "Bubble Tea", + "b": "1F9CB", + "j": [ + "bubble", + "milk", + "pearl", + "tea", + "taiwan", + "boba", + "milk tea", + "straw" + ] + }, + "beverage-box": { + "a": "Beverage Box", + "b": "1F9C3", + "j": [ + "beverage", + "box", + "juice", + "straw", + "sweet", + "drink" + ] + }, + "mate": { + "a": "Mate", + "b": "1F9C9", + "j": [ + "drink", + "tea", + "beverage" + ] + }, + "ice": { + "a": "Ice", + "b": "1F9CA", + "j": [ + "cold", + "ice cube", + "iceberg", + "water" + ] + }, + "chopsticks": { + "a": "Chopsticks", + "b": "1F962", + "j": [ + "hashi", + "jeotgarak", + "kuaizi", + "food" + ] + }, + "fork-and-knife-with-plate": { + "a": "Fork and Knife with Plate", + "b": "1F37D", + "j": [ + "cooking", + "fork", + "knife", + "plate", + "food", + "eat", + "meal", + "lunch", + "dinner", + "restaurant" + ] + }, + "fork-and-knife": { + "a": "Fork and Knife", + "b": "1F374", + "j": [ + "cooking", + "cutlery", + "fork", + "knife", + "kitchen" + ] + }, + "spoon": { + "a": "Spoon", + "b": "1F944", + "j": [ + "tableware", + "cutlery", + "kitchen" + ] + }, + "kitchen-knife": { + "a": "Kitchen Knife", + "b": "1F52A", + "j": [ + "cooking", + "hocho", + "knife", + "tool", + "weapon", + "blade", + "cutlery", + "kitchen" + ] + }, + "amphora": { + "a": "Amphora", + "b": "1F3FA", + "j": [ + "Aquarius", + "cooking", + "drink", + "jug", + "zodiac", + "vase", + "jar" + ] + }, + "globe-showing-europeafrica": { + "a": "Globe Showing Europe-Africa", + "b": "1F30D", + "j": [ + "Africa", + "earth", + "Europe", + "globe", + "globe showing Europe-Africa", + "world", + "globe_showing_europe_africa", + "international" + ] + }, + "globe-showing-americas": { + "a": "Globe Showing Americas", + "b": "1F30E", + "j": [ + "Americas", + "earth", + "globe", + "globe showing Americas", + "world", + "USA", + "international" + ] + }, + "globe-showing-asiaaustralia": { + "a": "Globe Showing Asia-Australia", + "b": "1F30F", + "j": [ + "Asia", + "Australia", + "earth", + "globe", + "globe showing Asia-Australia", + "world", + "globe_showing_asia_australia", + "east", + "international" + ] + }, + "globe-with-meridians": { + "a": "Globe with Meridians", + "b": "1F310", + "j": [ + "earth", + "globe", + "meridians", + "world", + "international", + "internet", + "interweb", + "i18n" + ] + }, + "world-map": { + "a": "World Map", + "b": "1F5FA", + "j": [ + "map", + "world", + "location", + "direction" + ] + }, + "map-of-japan": { + "a": "Map of Japan", + "b": "1F5FE", + "j": [ + "Japan", + "map", + "map of Japan", + "nation", + "country", + "japanese", + "asia" + ] + }, + "compass": { + "a": "Compass", + "b": "1F9ED", + "j": [ + "magnetic", + "navigation", + "orienteering" + ] + }, + "snowcapped-mountain": { + "a": "Snow-Capped Mountain", + "b": "1F3D4", + "j": [ + "cold", + "mountain", + "snow", + "snow-capped mountain", + "snow_capped_mountain", + "photo", + "nature", + "environment", + "winter" + ] + }, + "mountain": { + "a": "Mountain", + "b": "26F0", + "j": [ + "photo", + "nature", + "environment" + ] + }, + "volcano": { + "a": "Volcano", + "b": "1F30B", + "j": [ + "eruption", + "mountain", + "photo", + "nature", + "disaster" + ] + }, + "mount-fuji": { + "a": "Mount Fuji", + "b": "1F5FB", + "j": [ + "fuji", + "mountain", + "photo", + "nature", + "japanese" + ] + }, + "camping": { + "a": "Camping", + "b": "1F3D5", + "j": [ + "photo", + "outdoors", + "tent" + ] + }, + "beach-with-umbrella": { + "a": "Beach with Umbrella", + "b": "1F3D6", + "j": [ + "beach", + "umbrella", + "weather", + "summer", + "sunny", + "sand", + "mojito" + ] + }, + "desert": { + "a": "Desert", + "b": "1F3DC", + "j": [ + "photo", + "warm", + "saharah" + ] + }, + "desert-island": { + "a": "Desert Island", + "b": "1F3DD", + "j": [ + "desert", + "island", + "photo", + "tropical", + "mojito" + ] + }, + "national-park": { + "a": "National Park", + "b": "1F3DE", + "j": [ + "park", + "photo", + "environment", + "nature" + ] + }, + "stadium": { + "a": "Stadium", + "b": "1F3DF", + "j": [ + "photo", + "place", + "sports", + "concert", + "venue" + ] + }, + "classical-building": { + "a": "Classical Building", + "b": "1F3DB", + "j": [ + "classical", + "art", + "culture", + "history" + ] + }, + "building-construction": { + "a": "Building Construction", + "b": "1F3D7", + "j": [ + "construction", + "wip", + "working", + "progress" + ] + }, + "brick": { + "a": "Brick", + "b": "1F9F1", + "j": [ + "bricks", + "clay", + "mortar", + "wall" + ] + }, + "rock": { + "a": "Rock", + "b": "1FAA8", + "j": [ + "boulder", + "heavy", + "solid", + "stone" + ] + }, + "wood": { + "a": "Wood", + "b": "1FAB5", + "j": [ + "log", + "lumber", + "timber", + "nature", + "trunk" + ] + }, + "hut": { + "a": "Hut", + "b": "1F6D6", + "j": [ + "house", + "roundhouse", + "yurt", + "structure" + ] + }, + "houses": { + "a": "Houses", + "b": "1F3D8", + "j": [ + "buildings", + "photo" + ] + }, + "derelict-house": { + "a": "Derelict House", + "b": "1F3DA", + "j": [ + "derelict", + "house", + "abandon", + "evict", + "broken", + "building" + ] + }, + "house": { + "a": "House", + "b": "1F3E0", + "j": [ + "home", + "building" + ] + }, + "house-with-garden": { + "a": "House with Garden", + "b": "1F3E1", + "j": [ + "garden", + "home", + "house", + "plant", + "nature" + ] + }, + "office-building": { + "a": "Office Building", + "b": "1F3E2", + "j": [ + "building", + "bureau", + "work" + ] + }, + "japanese-post-office": { + "a": "Japanese Post Office", + "b": "1F3E3", + "j": [ + "Japanese", + "Japanese post office", + "post", + "building", + "envelope", + "communication" + ] + }, + "post-office": { + "a": "Post Office", + "b": "1F3E4", + "j": [ + "European", + "post", + "building", + "email" + ] + }, + "hospital": { + "a": "Hospital", + "b": "1F3E5", + "j": [ + "doctor", + "medicine", + "building", + "health", + "surgery" + ] + }, + "bank": { + "a": "Bank", + "b": "1F3E6", + "j": [ + "building", + "money", + "sales", + "cash", + "business", + "enterprise" + ] + }, + "hotel": { + "a": "Hotel", + "b": "1F3E8", + "j": [ + "building", + "accomodation", + "checkin" + ] + }, + "love-hotel": { + "a": "Love Hotel", + "b": "1F3E9", + "j": [ + "hotel", + "love", + "like", + "affection", + "dating" + ] + }, + "convenience-store": { + "a": "Convenience Store", + "b": "1F3EA", + "j": [ + "convenience", + "store", + "building", + "shopping", + "groceries" + ] + }, + "school": { + "a": "School", + "b": "1F3EB", + "j": [ + "building", + "student", + "education", + "learn", + "teach" + ] + }, + "department-store": { + "a": "Department Store", + "b": "1F3EC", + "j": [ + "department", + "store", + "building", + "shopping", + "mall" + ] + }, + "factory": { + "a": "Factory", + "b": "1F3ED", + "j": [ + "building", + "industry", + "pollution", + "smoke" + ] + }, + "japanese-castle": { + "a": "Japanese Castle", + "b": "1F3EF", + "j": [ + "castle", + "Japanese", + "photo", + "building" + ] + }, + "castle": { + "a": "Castle", + "b": "1F3F0", + "j": [ + "European", + "building", + "royalty", + "history" + ] + }, + "wedding": { + "a": "Wedding", + "b": "1F492", + "j": [ + "chapel", + "romance", + "love", + "like", + "affection", + "couple", + "marriage", + "bride", + "groom" + ] + }, + "tokyo-tower": { + "a": "Tokyo Tower", + "b": "1F5FC", + "j": [ + "Tokyo", + "tower", + "photo", + "japanese" + ] + }, + "statue-of-liberty": { + "a": "Statue of Liberty", + "b": "1F5FD", + "j": [ + "liberty", + "statue", + "american", + "newyork" + ] + }, + "church": { + "a": "Church", + "b": "26EA", + "j": [ + "Christian", + "cross", + "religion", + "building", + "christ" + ] + }, + "mosque": { + "a": "Mosque", + "b": "1F54C", + "j": [ + "islam", + "Muslim", + "religion", + "worship", + "minaret" + ] + }, + "hindu-temple": { + "a": "Hindu Temple", + "b": "1F6D5", + "j": [ + "hindu", + "temple", + "religion" + ] + }, + "synagogue": { + "a": "Synagogue", + "b": "1F54D", + "j": [ + "Jew", + "Jewish", + "religion", + "temple", + "judaism", + "worship", + "jewish" + ] + }, + "shinto-shrine": { + "a": "Shinto Shrine", + "b": "26E9", + "j": [ + "religion", + "shinto", + "shrine", + "temple", + "japan", + "kyoto" + ] + }, + "kaaba": { + "a": "Kaaba", + "b": "1F54B", + "j": [ + "islam", + "Muslim", + "religion", + "mecca", + "mosque" + ] + }, + "fountain": { + "a": "Fountain", + "b": "26F2", + "j": [ + "photo", + "summer", + "water", + "fresh" + ] + }, + "tent": { + "a": "Tent", + "b": "26FA", + "j": [ + "camping", + "photo", + "outdoors" + ] + }, + "foggy": { + "a": "Foggy", + "b": "1F301", + "j": [ + "fog", + "photo", + "mountain" + ] + }, + "night-with-stars": { + "a": "Night with Stars", + "b": "1F303", + "j": [ + "night", + "star", + "evening", + "city", + "downtown" + ] + }, + "cityscape": { + "a": "Cityscape", + "b": "1F3D9", + "j": [ + "city", + "photo", + "night life", + "urban" + ] + }, + "sunrise-over-mountains": { + "a": "Sunrise over Mountains", + "b": "1F304", + "j": [ + "morning", + "mountain", + "sun", + "sunrise", + "view", + "vacation", + "photo" + ] + }, + "sunrise": { + "a": "Sunrise", + "b": "1F305", + "j": [ + "morning", + "sun", + "view", + "vacation", + "photo" + ] + }, + "cityscape-at-dusk": { + "a": "Cityscape at Dusk", + "b": "1F306", + "j": [ + "city", + "dusk", + "evening", + "landscape", + "sunset", + "photo", + "sky", + "buildings" + ] + }, + "sunset": { + "a": "Sunset", + "b": "1F307", + "j": [ + "dusk", + "sun", + "photo", + "good morning", + "dawn" + ] + }, + "bridge-at-night": { + "a": "Bridge at Night", + "b": "1F309", + "j": [ + "bridge", + "night", + "photo", + "sanfrancisco" + ] + }, + "hot-springs": { + "a": "Hot Springs", + "b": "2668", + "j": [ + "hot", + "hotsprings", + "springs", + "steaming", + "bath", + "warm", + "relax" + ] + }, + "carousel-horse": { + "a": "Carousel Horse", + "b": "1F3A0", + "j": [ + "carousel", + "horse", + "photo", + "carnival" + ] + }, + "ferris-wheel": { + "a": "Ferris Wheel", + "b": "1F3A1", + "j": [ + "amusement park", + "ferris", + "wheel", + "photo", + "carnival", + "londoneye" + ] + }, + "roller-coaster": { + "a": "Roller Coaster", + "b": "1F3A2", + "j": [ + "amusement park", + "coaster", + "roller", + "carnival", + "playground", + "photo", + "fun" + ] + }, + "barber-pole": { + "a": "Barber Pole", + "b": "1F488", + "j": [ + "barber", + "haircut", + "pole", + "hair", + "salon", + "style" + ] + }, + "circus-tent": { + "a": "Circus Tent", + "b": "1F3AA", + "j": [ + "circus", + "tent", + "festival", + "carnival", + "party" + ] + }, + "locomotive": { + "a": "Locomotive", + "b": "1F682", + "j": [ + "engine", + "railway", + "steam", + "train", + "transportation", + "vehicle" + ] + }, + "railway-car": { + "a": "Railway Car", + "b": "1F683", + "j": [ + "car", + "electric", + "railway", + "train", + "tram", + "trolleybus", + "transportation", + "vehicle" + ] + }, + "highspeed-train": { + "a": "High-Speed Train", + "b": "1F684", + "j": [ + "high-speed train", + "railway", + "shinkansen", + "speed", + "train", + "high_speed_train", + "transportation", + "vehicle" + ] + }, + "bullet-train": { + "a": "Bullet Train", + "b": "1F685", + "j": [ + "bullet", + "railway", + "shinkansen", + "speed", + "train", + "transportation", + "vehicle", + "fast", + "public", + "travel" + ] + }, + "train": { + "a": "Train", + "b": "1F686", + "j": [ + "railway", + "transportation", + "vehicle" + ] + }, + "metro": { + "a": "Metro", + "b": "1F687", + "j": [ + "subway", + "transportation", + "blue-square", + "mrt", + "underground", + "tube" + ] + }, + "light-rail": { + "a": "Light Rail", + "b": "1F688", + "j": [ + "railway", + "transportation", + "vehicle" + ] + }, + "station": { + "a": "Station", + "b": "1F689", + "j": [ + "railway", + "train", + "transportation", + "vehicle", + "public" + ] + }, + "tram": { + "a": "Tram", + "b": "1F68A", + "j": [ + "trolleybus", + "transportation", + "vehicle" + ] + }, + "monorail": { + "a": "Monorail", + "b": "1F69D", + "j": [ + "vehicle", + "transportation" + ] + }, + "mountain-railway": { + "a": "Mountain Railway", + "b": "1F69E", + "j": [ + "car", + "mountain", + "railway", + "transportation", + "vehicle" + ] + }, + "tram-car": { + "a": "Tram Car", + "b": "1F68B", + "j": [ + "car", + "tram", + "trolleybus", + "transportation", + "vehicle", + "carriage", + "public", + "travel" + ] + }, + "bus": { + "a": "Bus", + "b": "1F68C", + "j": [ + "vehicle", + "car", + "transportation" + ] + }, + "oncoming-bus": { + "a": "Oncoming Bus", + "b": "1F68D", + "j": [ + "bus", + "oncoming", + "vehicle", + "transportation" + ] + }, + "trolleybus": { + "a": "Trolleybus", + "b": "1F68E", + "j": [ + "bus", + "tram", + "trolley", + "bart", + "transportation", + "vehicle" + ] + }, + "minibus": { + "a": "Minibus", + "b": "1F690", + "j": [ + "bus", + "vehicle", + "car", + "transportation" + ] + }, + "ambulance": { + "a": "Ambulance", + "b": "1F691", + "j": [ + "vehicle", + "health", + "911", + "hospital" + ] + }, + "fire-engine": { + "a": "Fire Engine", + "b": "1F692", + "j": [ + "engine", + "fire", + "truck", + "transportation", + "cars", + "vehicle" + ] + }, + "police-car": { + "a": "Police Car", + "b": "1F693", + "j": [ + "car", + "patrol", + "police", + "vehicle", + "cars", + "transportation", + "law", + "legal", + "enforcement" + ] + }, + "oncoming-police-car": { + "a": "Oncoming Police Car", + "b": "1F694", + "j": [ + "car", + "oncoming", + "police", + "vehicle", + "law", + "legal", + "enforcement", + "911" + ] + }, + "taxi": { + "a": "Taxi", + "b": "1F695", + "j": [ + "vehicle", + "uber", + "cars", + "transportation" + ] + }, + "oncoming-taxi": { + "a": "Oncoming Taxi", + "b": "1F696", + "j": [ + "oncoming", + "taxi", + "vehicle", + "cars", + "uber" + ] + }, + "automobile": { + "a": "Automobile", + "b": "1F697", + "j": [ + "car", + "red", + "transportation", + "vehicle" + ] + }, + "oncoming-automobile": { + "a": "Oncoming Automobile", + "b": "1F698", + "j": [ + "automobile", + "car", + "oncoming", + "vehicle", + "transportation" + ] + }, + "sport-utility-vehicle": { + "a": "Sport Utility Vehicle", + "b": "1F699", + "j": [ + "recreational", + "sport utility", + "transportation", + "vehicle" + ] + }, + "pickup-truck": { + "a": "Pickup Truck", + "b": "1F6FB", + "j": [ + "pick-up", + "pickup", + "truck", + "car", + "transportation" + ] + }, + "delivery-truck": { + "a": "Delivery Truck", + "b": "1F69A", + "j": [ + "delivery", + "truck", + "cars", + "transportation" + ] + }, + "articulated-lorry": { + "a": "Articulated Lorry", + "b": "1F69B", + "j": [ + "lorry", + "semi", + "truck", + "vehicle", + "cars", + "transportation", + "express" + ] + }, + "tractor": { + "a": "Tractor", + "b": "1F69C", + "j": [ + "vehicle", + "car", + "farming", + "agriculture" + ] + }, + "racing-car": { + "a": "Racing Car", + "b": "1F3CE", + "j": [ + "car", + "racing", + "sports", + "race", + "fast", + "formula", + "f1" + ] + }, + "motorcycle": { + "a": "Motorcycle", + "b": "1F3CD", + "j": [ + "racing", + "race", + "sports", + "fast" + ] + }, + "motor-scooter": { + "a": "Motor Scooter", + "b": "1F6F5", + "j": [ + "motor", + "scooter", + "vehicle", + "vespa", + "sasha" + ] + }, + "manual-wheelchair": { + "a": "Manual Wheelchair", + "b": "1F9BD", + "j": [ + "accessibility" + ] + }, + "motorized-wheelchair": { + "a": "Motorized Wheelchair", + "b": "1F9BC", + "j": [ + "accessibility" + ] + }, + "auto-rickshaw": { + "a": "Auto Rickshaw", + "b": "1F6FA", + "j": [ + "tuk tuk", + "move", + "transportation" + ] + }, + "bicycle": { + "a": "Bicycle", + "b": "1F6B2", + "j": [ + "bike", + "sports", + "exercise", + "hipster" + ] + }, + "kick-scooter": { + "a": "Kick Scooter", + "b": "1F6F4", + "j": [ + "kick", + "scooter", + "vehicle", + "razor" + ] + }, + "skateboard": { + "a": "Skateboard", + "b": "1F6F9", + "j": [ + "board" + ] + }, + "roller-skate": { + "a": "Roller Skate", + "b": "1F6FC", + "j": [ + "roller", + "skate", + "footwear", + "sports" + ] + }, + "bus-stop": { + "a": "Bus Stop", + "b": "1F68F", + "j": [ + "bus", + "busstop", + "stop", + "transportation", + "wait" + ] + }, + "motorway": { + "a": "Motorway", + "b": "1F6E3", + "j": [ + "highway", + "road", + "cupertino", + "interstate" + ] + }, + "railway-track": { + "a": "Railway Track", + "b": "1F6E4", + "j": [ + "railway", + "train", + "transportation" + ] + }, + "oil-drum": { + "a": "Oil Drum", + "b": "1F6E2", + "j": [ + "drum", + "oil", + "barrell" + ] + }, + "fuel-pump": { + "a": "Fuel Pump", + "b": "26FD", + "j": [ + "diesel", + "fuel", + "fuelpump", + "gas", + "pump", + "station", + "gas station", + "petroleum" + ] + }, + "police-car-light": { + "a": "Police Car Light", + "b": "1F6A8", + "j": [ + "beacon", + "car", + "light", + "police", + "revolving", + "ambulance", + "911", + "emergency", + "alert", + "error", + "pinged", + "law", + "legal" + ] + }, + "horizontal-traffic-light": { + "a": "Horizontal Traffic Light", + "b": "1F6A5", + "j": [ + "light", + "signal", + "traffic", + "transportation" + ] + }, + "vertical-traffic-light": { + "a": "Vertical Traffic Light", + "b": "1F6A6", + "j": [ + "light", + "signal", + "traffic", + "transportation", + "driving" + ] + }, + "stop-sign": { + "a": "Stop Sign", + "b": "1F6D1", + "j": [ + "octagonal", + "sign", + "stop" + ] + }, + "construction": { + "a": "Construction", + "b": "1F6A7", + "j": [ + "barrier", + "wip", + "progress", + "caution", + "warning" + ] + }, + "anchor": { + "a": "Anchor", + "b": "2693", + "j": [ + "ship", + "tool", + "ferry", + "sea", + "boat" + ] + }, + "sailboat": { + "a": "Sailboat", + "b": "26F5", + "j": [ + "boat", + "resort", + "sea", + "yacht", + "ship", + "summer", + "transportation", + "water", + "sailing" + ] + }, + "canoe": { + "a": "Canoe", + "b": "1F6F6", + "j": [ + "boat", + "paddle", + "water", + "ship" + ] + }, + "speedboat": { + "a": "Speedboat", + "b": "1F6A4", + "j": [ + "boat", + "ship", + "transportation", + "vehicle", + "summer" + ] + }, + "passenger-ship": { + "a": "Passenger Ship", + "b": "1F6F3", + "j": [ + "passenger", + "ship", + "yacht", + "cruise", + "ferry" + ] + }, + "ferry": { + "a": "Ferry", + "b": "26F4", + "j": [ + "boat", + "passenger", + "ship", + "yacht" + ] + }, + "motor-boat": { + "a": "Motor Boat", + "b": "1F6E5", + "j": [ + "boat", + "motorboat", + "ship" + ] + }, + "ship": { + "a": "Ship", + "b": "1F6A2", + "j": [ + "boat", + "passenger", + "transportation", + "titanic", + "deploy" + ] + }, + "airplane": { + "a": "Airplane", + "b": "2708", + "j": [ + "aeroplane", + "vehicle", + "transportation", + "flight", + "fly" + ] + }, + "small-airplane": { + "a": "Small Airplane", + "b": "1F6E9", + "j": [ + "aeroplane", + "airplane", + "flight", + "transportation", + "fly", + "vehicle" + ] + }, + "airplane-departure": { + "a": "Airplane Departure", + "b": "1F6EB", + "j": [ + "aeroplane", + "airplane", + "check-in", + "departure", + "departures", + "airport", + "flight", + "landing" + ] + }, + "airplane-arrival": { + "a": "Airplane Arrival", + "b": "1F6EC", + "j": [ + "aeroplane", + "airplane", + "arrivals", + "arriving", + "landing", + "airport", + "flight", + "boarding" + ] + }, + "parachute": { + "a": "Parachute", + "b": "1FA82", + "j": [ + "hang-glide", + "parasail", + "skydive", + "fly", + "glide" + ] + }, + "seat": { + "a": "Seat", + "b": "1F4BA", + "j": [ + "chair", + "sit", + "airplane", + "transport", + "bus", + "flight", + "fly" + ] + }, + "helicopter": { + "a": "Helicopter", + "b": "1F681", + "j": [ + "vehicle", + "transportation", + "fly" + ] + }, + "suspension-railway": { + "a": "Suspension Railway", + "b": "1F69F", + "j": [ + "railway", + "suspension", + "vehicle", + "transportation" + ] + }, + "mountain-cableway": { + "a": "Mountain Cableway", + "b": "1F6A0", + "j": [ + "cable", + "gondola", + "mountain", + "transportation", + "vehicle", + "ski" + ] + }, + "aerial-tramway": { + "a": "Aerial Tramway", + "b": "1F6A1", + "j": [ + "aerial", + "cable", + "car", + "gondola", + "tramway", + "transportation", + "vehicle", + "ski" + ] + }, + "satellite": { + "a": "Satellite", + "b": "1F6F0", + "j": [ + "space", + "communication", + "gps", + "orbit", + "spaceflight", + "NASA", + "ISS" + ] + }, + "rocket": { + "a": "Rocket", + "b": "1F680", + "j": [ + "space", + "launch", + "ship", + "staffmode", + "NASA", + "outer space", + "outer_space", + "fly" + ] + }, + "flying-saucer": { + "a": "Flying Saucer", + "b": "1F6F8", + "j": [ + "UFO", + "transportation", + "vehicle", + "ufo" + ] + }, + "bellhop-bell": { + "a": "Bellhop Bell", + "b": "1F6CE", + "j": [ + "bell", + "bellhop", + "hotel", + "service" + ] + }, + "luggage": { + "a": "Luggage", + "b": "1F9F3", + "j": [ + "packing", + "travel" + ] + }, + "hourglass-done": { + "a": "Hourglass Done", + "b": "231B", + "j": [ + "sand", + "timer", + "time", + "clock", + "oldschool", + "limit", + "exam", + "quiz", + "test" + ] + }, + "hourglass-not-done": { + "a": "Hourglass Not Done", + "b": "23F3", + "j": [ + "hourglass", + "sand", + "timer", + "oldschool", + "time", + "countdown" + ] + }, + "watch": { + "a": "Watch", + "b": "231A", + "j": [ + "clock", + "time", + "accessories" + ] + }, + "alarm-clock": { + "a": "Alarm Clock", + "b": "23F0", + "j": [ + "alarm", + "clock", + "time", + "wake" + ] + }, + "stopwatch": { + "a": "Stopwatch", + "b": "23F1", + "j": [ + "clock", + "time", + "deadline" + ] + }, + "timer-clock": { + "a": "Timer Clock", + "b": "23F2", + "j": [ + "clock", + "timer", + "alarm" + ] + }, + "mantelpiece-clock": { + "a": "Mantelpiece Clock", + "b": "1F570", + "j": [ + "clock", + "time" + ] + }, + "twelve-oclock": { + "a": "Twelve O’Clock", + "b": "1F55B", + "j": [ + "00", + "12", + "12:00", + "clock", + "o’clock", + "twelve", + "twelve_o_clock", + "time", + "noon", + "midnight", + "midday", + "late", + "early", + "schedule" + ] + }, + "twelvethirty": { + "a": "Twelve-Thirty", + "b": "1F567", + "j": [ + "12", + "12:30", + "clock", + "thirty", + "twelve", + "twelve-thirty", + "twelve_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "one-oclock": { + "a": "One O’Clock", + "b": "1F550", + "j": [ + "00", + "1", + "1:00", + "clock", + "o’clock", + "one", + "one_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "onethirty": { + "a": "One-Thirty", + "b": "1F55C", + "j": [ + "1", + "1:30", + "clock", + "one", + "one-thirty", + "thirty", + "one_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "two-oclock": { + "a": "Two O’Clock", + "b": "1F551", + "j": [ + "00", + "2", + "2:00", + "clock", + "o’clock", + "two", + "two_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "twothirty": { + "a": "Two-Thirty", + "b": "1F55D", + "j": [ + "2", + "2:30", + "clock", + "thirty", + "two", + "two-thirty", + "two_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "three-oclock": { + "a": "Three O’Clock", + "b": "1F552", + "j": [ + "00", + "3", + "3:00", + "clock", + "o’clock", + "three", + "three_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "threethirty": { + "a": "Three-Thirty", + "b": "1F55E", + "j": [ + "3", + "3:30", + "clock", + "thirty", + "three", + "three-thirty", + "three_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "four-oclock": { + "a": "Four O’Clock", + "b": "1F553", + "j": [ + "00", + "4", + "4:00", + "clock", + "four", + "o’clock", + "four_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "fourthirty": { + "a": "Four-Thirty", + "b": "1F55F", + "j": [ + "4", + "4:30", + "clock", + "four", + "four-thirty", + "thirty", + "four_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "five-oclock": { + "a": "Five O’Clock", + "b": "1F554", + "j": [ + "00", + "5", + "5:00", + "clock", + "five", + "o’clock", + "five_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "fivethirty": { + "a": "Five-Thirty", + "b": "1F560", + "j": [ + "5", + "5:30", + "clock", + "five", + "five-thirty", + "thirty", + "five_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "six-oclock": { + "a": "Six O’Clock", + "b": "1F555", + "j": [ + "00", + "6", + "6:00", + "clock", + "o’clock", + "six", + "six_o_clock", + "time", + "late", + "early", + "schedule", + "dawn", + "dusk" + ] + }, + "sixthirty": { + "a": "Six-Thirty", + "b": "1F561", + "j": [ + "6", + "6:30", + "clock", + "six", + "six-thirty", + "thirty", + "six_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "seven-oclock": { + "a": "Seven O’Clock", + "b": "1F556", + "j": [ + "00", + "7", + "7:00", + "clock", + "o’clock", + "seven", + "seven_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "seventhirty": { + "a": "Seven-Thirty", + "b": "1F562", + "j": [ + "7", + "7:30", + "clock", + "seven", + "seven-thirty", + "thirty", + "seven_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "eight-oclock": { + "a": "Eight O’Clock", + "b": "1F557", + "j": [ + "00", + "8", + "8:00", + "clock", + "eight", + "o’clock", + "eight_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "eightthirty": { + "a": "Eight-Thirty", + "b": "1F563", + "j": [ + "8", + "8:30", + "clock", + "eight", + "eight-thirty", + "thirty", + "eight_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "nine-oclock": { + "a": "Nine O’Clock", + "b": "1F558", + "j": [ + "00", + "9", + "9:00", + "clock", + "nine", + "o’clock", + "nine_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "ninethirty": { + "a": "Nine-Thirty", + "b": "1F564", + "j": [ + "9", + "9:30", + "clock", + "nine", + "nine-thirty", + "thirty", + "nine_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "ten-oclock": { + "a": "Ten O’Clock", + "b": "1F559", + "j": [ + "00", + "10", + "10:00", + "clock", + "o’clock", + "ten", + "ten_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "tenthirty": { + "a": "Ten-Thirty", + "b": "1F565", + "j": [ + "10", + "10:30", + "clock", + "ten", + "ten-thirty", + "thirty", + "ten_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "eleven-oclock": { + "a": "Eleven O’Clock", + "b": "1F55A", + "j": [ + "00", + "11", + "11:00", + "clock", + "eleven", + "o’clock", + "eleven_o_clock", + "time", + "late", + "early", + "schedule" + ] + }, + "eleventhirty": { + "a": "Eleven-Thirty", + "b": "1F566", + "j": [ + "11", + "11:30", + "clock", + "eleven", + "eleven-thirty", + "thirty", + "eleven_thirty", + "time", + "late", + "early", + "schedule" + ] + }, + "new-moon": { + "a": "New Moon", + "b": "1F311", + "j": [ + "dark", + "moon", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "waxing-crescent-moon": { + "a": "Waxing Crescent Moon", + "b": "1F312", + "j": [ + "crescent", + "moon", + "waxing", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "first-quarter-moon": { + "a": "First Quarter Moon", + "b": "1F313", + "j": [ + "moon", + "quarter", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "waxing-gibbous-moon": { + "a": "Waxing Gibbous Moon", + "b": "1F314", + "j": [ + "gibbous", + "moon", + "waxing", + "nature", + "night", + "sky", + "gray", + "twilight", + "planet", + "space", + "evening", + "sleep" + ] + }, + "full-moon": { + "a": "Full Moon", + "b": "1F315", + "j": [ + "full", + "moon", + "nature", + "yellow", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "waning-gibbous-moon": { + "a": "Waning Gibbous Moon", + "b": "1F316", + "j": [ + "gibbous", + "moon", + "waning", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep", + "waxing_gibbous_moon" + ] + }, + "last-quarter-moon": { + "a": "Last Quarter Moon", + "b": "1F317", + "j": [ + "moon", + "quarter", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "waning-crescent-moon": { + "a": "Waning Crescent Moon", + "b": "1F318", + "j": [ + "crescent", + "moon", + "waning", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "crescent-moon": { + "a": "Crescent Moon", + "b": "1F319", + "j": [ + "crescent", + "moon", + "night", + "sleep", + "sky", + "evening", + "magic" + ] + }, + "new-moon-face": { + "a": "New Moon Face", + "b": "1F31A", + "j": [ + "face", + "moon", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "first-quarter-moon-face": { + "a": "First Quarter Moon Face", + "b": "1F31B", + "j": [ + "face", + "moon", + "quarter", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "last-quarter-moon-face": { + "a": "Last Quarter Moon Face", + "b": "1F31C", + "j": [ + "face", + "moon", + "quarter", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "thermometer": { + "a": "Thermometer", + "b": "1F321", + "j": [ + "weather", + "temperature", + "hot", + "cold" + ] + }, + "sun": { + "a": "Sun", + "b": "2600", + "j": [ + "bright", + "rays", + "sunny", + "weather", + "nature", + "brightness", + "summer", + "beach", + "spring" + ] + }, + "full-moon-face": { + "a": "Full Moon Face", + "b": "1F31D", + "j": [ + "bright", + "face", + "full", + "moon", + "nature", + "twilight", + "planet", + "space", + "night", + "evening", + "sleep" + ] + }, + "sun-with-face": { + "a": "Sun with Face", + "b": "1F31E", + "j": [ + "bright", + "face", + "sun", + "nature", + "morning", + "sky" + ] + }, + "ringed-planet": { + "a": "Ringed Planet", + "b": "1FA90", + "j": [ + "saturn", + "saturnine", + "outerspace" + ] + }, + "star": { + "a": "Star", + "b": "2B50", + "j": [ + "night", + "yellow" + ] + }, + "glowing-star": { + "a": "Glowing Star", + "b": "1F31F", + "j": [ + "glittery", + "glow", + "shining", + "sparkle", + "star", + "night", + "awesome", + "good", + "magic" + ] + }, + "shooting-star": { + "a": "Shooting Star", + "b": "1F320", + "j": [ + "falling", + "shooting", + "star", + "night", + "photo" + ] + }, + "milky-way": { + "a": "Milky Way", + "b": "1F30C", + "j": [ + "space", + "photo", + "stars" + ] + }, + "cloud": { + "a": "Cloud", + "b": "2601", + "j": [ + "weather", + "sky" + ] + }, + "sun-behind-cloud": { + "a": "Sun Behind Cloud", + "b": "26C5", + "j": [ + "cloud", + "sun", + "weather", + "nature", + "cloudy", + "morning", + "fall", + "spring" + ] + }, + "cloud-with-lightning-and-rain": { + "a": "Cloud with Lightning and Rain", + "b": "26C8", + "j": [ + "cloud", + "rain", + "thunder", + "weather", + "lightning" + ] + }, + "sun-behind-small-cloud": { + "a": "Sun Behind Small Cloud", + "b": "1F324", + "j": [ + "cloud", + "sun", + "weather" + ] + }, + "sun-behind-large-cloud": { + "a": "Sun Behind Large Cloud", + "b": "1F325", + "j": [ + "cloud", + "sun", + "weather" + ] + }, + "sun-behind-rain-cloud": { + "a": "Sun Behind Rain Cloud", + "b": "1F326", + "j": [ + "cloud", + "rain", + "sun", + "weather" + ] + }, + "cloud-with-rain": { + "a": "Cloud with Rain", + "b": "1F327", + "j": [ + "cloud", + "rain", + "weather" + ] + }, + "cloud-with-snow": { + "a": "Cloud with Snow", + "b": "1F328", + "j": [ + "cloud", + "cold", + "snow", + "weather" + ] + }, + "cloud-with-lightning": { + "a": "Cloud with Lightning", + "b": "1F329", + "j": [ + "cloud", + "lightning", + "weather", + "thunder" + ] + }, + "tornado": { + "a": "Tornado", + "b": "1F32A", + "j": [ + "cloud", + "whirlwind", + "weather", + "cyclone", + "twister" + ] + }, + "fog": { + "a": "Fog", + "b": "1F32B", + "j": [ + "cloud", + "weather" + ] + }, + "wind-face": { + "a": "Wind Face", + "b": "1F32C", + "j": [ + "blow", + "cloud", + "face", + "wind", + "gust", + "air" + ] + }, + "cyclone": { + "a": "Cyclone", + "b": "1F300", + "j": [ + "dizzy", + "hurricane", + "twister", + "typhoon", + "weather", + "swirl", + "blue", + "cloud", + "vortex", + "spiral", + "whirlpool", + "spin", + "tornado" + ] + }, + "rainbow": { + "a": "Rainbow", + "b": "1F308", + "j": [ + "rain", + "nature", + "happy", + "unicorn_face", + "photo", + "sky", + "spring" + ] + }, + "closed-umbrella": { + "a": "Closed Umbrella", + "b": "1F302", + "j": [ + "clothing", + "rain", + "umbrella", + "weather", + "drizzle" + ] + }, + "umbrella": { + "a": "Umbrella", + "b": "2602", + "j": [ + "clothing", + "rain", + "weather", + "spring" + ] + }, + "umbrella-with-rain-drops": { + "a": "Umbrella with Rain Drops", + "b": "2614", + "j": [ + "clothing", + "drop", + "rain", + "umbrella", + "rainy", + "weather", + "spring" + ] + }, + "umbrella-on-ground": { + "a": "Umbrella on Ground", + "b": "26F1", + "j": [ + "rain", + "sun", + "umbrella", + "weather", + "summer" + ] + }, + "high-voltage": { + "a": "High Voltage", + "b": "26A1", + "j": [ + "danger", + "electric", + "lightning", + "voltage", + "zap", + "thunder", + "weather", + "lightning bolt", + "fast" + ] + }, + "snowflake": { + "a": "Snowflake", + "b": "2744", + "j": [ + "cold", + "snow", + "winter", + "season", + "weather", + "christmas", + "xmas" + ] + }, + "snowman": { + "a": "Snowman", + "b": "2603", + "j": [ + "cold", + "snow", + "winter", + "season", + "weather", + "christmas", + "xmas", + "frozen" + ] + }, + "snowman-without-snow": { + "a": "Snowman Without Snow", + "b": "26C4", + "j": [ + "cold", + "snow", + "snowman", + "winter", + "season", + "weather", + "christmas", + "xmas", + "frozen", + "without_snow" + ] + }, + "comet": { + "a": "Comet", + "b": "2604", + "j": [ + "space" + ] + }, + "fire": { + "a": "Fire", + "b": "1F525", + "j": [ + "flame", + "tool", + "hot", + "cook" + ] + }, + "droplet": { + "a": "Droplet", + "b": "1F4A7", + "j": [ + "cold", + "comic", + "drop", + "sweat", + "water", + "drip", + "faucet", + "spring" + ] + }, + "water-wave": { + "a": "Water Wave", + "b": "1F30A", + "j": [ + "ocean", + "water", + "wave", + "sea", + "nature", + "tsunami", + "disaster" + ] + }, + "jackolantern": { + "a": "Jack-O-Lantern", + "b": "1F383", + "j": [ + "celebration", + "halloween", + "jack", + "jack-o-lantern", + "lantern", + "jack_o_lantern", + "light", + "pumpkin", + "creepy", + "fall" + ] + }, + "christmas-tree": { + "a": "Christmas Tree", + "b": "1F384", + "j": [ + "celebration", + "Christmas", + "tree", + "festival", + "vacation", + "december", + "xmas" + ] + }, + "fireworks": { + "a": "Fireworks", + "b": "1F386", + "j": [ + "celebration", + "photo", + "festival", + "carnival", + "congratulations" + ] + }, + "sparkler": { + "a": "Sparkler", + "b": "1F387", + "j": [ + "celebration", + "fireworks", + "sparkle", + "stars", + "night", + "shine" + ] + }, + "firecracker": { + "a": "Firecracker", + "b": "1F9E8", + "j": [ + "dynamite", + "explosive", + "fireworks", + "boom", + "explode", + "explosion" + ] + }, + "sparkles": { + "a": "Sparkles", + "b": "2728", + "j": [ + "*", + "sparkle", + "star", + "stars", + "shine", + "shiny", + "cool", + "awesome", + "good", + "magic" + ] + }, + "balloon": { + "a": "Balloon", + "b": "1F388", + "j": [ + "celebration", + "party", + "birthday", + "circus" + ] + }, + "party-popper": { + "a": "Party Popper", + "b": "1F389", + "j": [ + "celebration", + "party", + "popper", + "tada", + "congratulations", + "birthday", + "magic", + "circus" + ] + }, + "confetti-ball": { + "a": "Confetti Ball", + "b": "1F38A", + "j": [ + "ball", + "celebration", + "confetti", + "festival", + "party", + "birthday", + "circus" + ] + }, + "tanabata-tree": { + "a": "Tanabata Tree", + "b": "1F38B", + "j": [ + "banner", + "celebration", + "Japanese", + "tree", + "plant", + "nature", + "branch", + "summer" + ] + }, + "pine-decoration": { + "a": "Pine Decoration", + "b": "1F38D", + "j": [ + "bamboo", + "celebration", + "Japanese", + "pine", + "plant", + "nature", + "vegetable", + "panda" + ] + }, + "japanese-dolls": { + "a": "Japanese Dolls", + "b": "1F38E", + "j": [ + "celebration", + "doll", + "festival", + "Japanese", + "Japanese dolls", + "japanese", + "toy", + "kimono" + ] + }, + "carp-streamer": { + "a": "Carp Streamer", + "b": "1F38F", + "j": [ + "carp", + "celebration", + "streamer", + "fish", + "japanese", + "koinobori", + "banner" + ] + }, + "wind-chime": { + "a": "Wind Chime", + "b": "1F390", + "j": [ + "bell", + "celebration", + "chime", + "wind", + "nature", + "ding", + "spring" + ] + }, + "moon-viewing-ceremony": { + "a": "Moon Viewing Ceremony", + "b": "1F391", + "j": [ + "celebration", + "ceremony", + "moon", + "photo", + "japan", + "asia", + "tsukimi" + ] + }, + "red-envelope": { + "a": "Red Envelope", + "b": "1F9E7", + "j": [ + "gift", + "good luck", + "hóngbāo", + "lai see", + "money" + ] + }, + "ribbon": { + "a": "Ribbon", + "b": "1F380", + "j": [ + "celebration", + "decoration", + "pink", + "girl", + "bowtie" + ] + }, + "wrapped-gift": { + "a": "Wrapped Gift", + "b": "1F381", + "j": [ + "box", + "celebration", + "gift", + "present", + "wrapped", + "birthday", + "christmas", + "xmas" + ] + }, + "reminder-ribbon": { + "a": "Reminder Ribbon", + "b": "1F397", + "j": [ + "celebration", + "reminder", + "ribbon", + "sports", + "cause", + "support", + "awareness" + ] + }, + "admission-tickets": { + "a": "Admission Tickets", + "b": "1F39F", + "j": [ + "admission", + "ticket", + "sports", + "concert", + "entrance" + ] + }, + "ticket": { + "a": "Ticket", + "b": "1F3AB", + "j": [ + "admission", + "event", + "concert", + "pass" + ] + }, + "military-medal": { + "a": "Military Medal", + "b": "1F396", + "j": [ + "celebration", + "medal", + "military", + "award", + "winning", + "army" + ] + }, + "trophy": { + "a": "Trophy", + "b": "1F3C6", + "j": [ + "prize", + "win", + "award", + "contest", + "place", + "ftw", + "ceremony" + ] + }, + "sports-medal": { + "a": "Sports Medal", + "b": "1F3C5", + "j": [ + "medal", + "award", + "winning" + ] + }, + "1st-place-medal": { + "a": "1st Place Medal", + "b": "1F947", + "j": [ + "first", + "gold", + "medal", + "award", + "winning" + ] + }, + "2nd-place-medal": { + "a": "2nd Place Medal", + "b": "1F948", + "j": [ + "medal", + "second", + "silver", + "award" + ] + }, + "3rd-place-medal": { + "a": "3rd Place Medal", + "b": "1F949", + "j": [ + "bronze", + "medal", + "third", + "award" + ] + }, + "soccer-ball": { + "a": "Soccer Ball", + "b": "26BD", + "j": [ + "ball", + "football", + "soccer", + "sports" + ] + }, + "baseball": { + "a": "Baseball", + "b": "26BE", + "j": [ + "ball", + "sports", + "balls" + ] + }, + "softball": { + "a": "Softball", + "b": "1F94E", + "j": [ + "ball", + "glove", + "underarm", + "sports", + "balls" + ] + }, + "basketball": { + "a": "Basketball", + "b": "1F3C0", + "j": [ + "ball", + "hoop", + "sports", + "balls", + "NBA" + ] + }, + "volleyball": { + "a": "Volleyball", + "b": "1F3D0", + "j": [ + "ball", + "game", + "sports", + "balls" + ] + }, + "american-football": { + "a": "American Football", + "b": "1F3C8", + "j": [ + "american", + "ball", + "football", + "sports", + "balls", + "NFL" + ] + }, + "rugby-football": { + "a": "Rugby Football", + "b": "1F3C9", + "j": [ + "ball", + "football", + "rugby", + "sports", + "team" + ] + }, + "tennis": { + "a": "Tennis", + "b": "1F3BE", + "j": [ + "ball", + "racquet", + "sports", + "balls", + "green" + ] + }, + "flying-disc": { + "a": "Flying Disc", + "b": "1F94F", + "j": [ + "ultimate", + "sports", + "frisbee" + ] + }, + "bowling": { + "a": "Bowling", + "b": "1F3B3", + "j": [ + "ball", + "game", + "sports", + "fun", + "play" + ] + }, + "cricket-game": { + "a": "Cricket Game", + "b": "1F3CF", + "j": [ + "ball", + "bat", + "game", + "sports" + ] + }, + "field-hockey": { + "a": "Field Hockey", + "b": "1F3D1", + "j": [ + "ball", + "field", + "game", + "hockey", + "stick", + "sports" + ] + }, + "ice-hockey": { + "a": "Ice Hockey", + "b": "1F3D2", + "j": [ + "game", + "hockey", + "ice", + "puck", + "stick", + "sports" + ] + }, + "lacrosse": { + "a": "Lacrosse", + "b": "1F94D", + "j": [ + "ball", + "goal", + "stick", + "sports" + ] + }, + "ping-pong": { + "a": "Ping Pong", + "b": "1F3D3", + "j": [ + "ball", + "bat", + "game", + "paddle", + "table tennis", + "sports", + "pingpong" + ] + }, + "badminton": { + "a": "Badminton", + "b": "1F3F8", + "j": [ + "birdie", + "game", + "racquet", + "shuttlecock", + "sports" + ] + }, + "boxing-glove": { + "a": "Boxing Glove", + "b": "1F94A", + "j": [ + "boxing", + "glove", + "sports", + "fighting" + ] + }, + "martial-arts-uniform": { + "a": "Martial Arts Uniform", + "b": "1F94B", + "j": [ + "judo", + "karate", + "martial arts", + "taekwondo", + "uniform" + ] + }, + "goal-net": { + "a": "Goal Net", + "b": "1F945", + "j": [ + "goal", + "net", + "sports" + ] + }, + "flag-in-hole": { + "a": "Flag in Hole", + "b": "26F3", + "j": [ + "golf", + "hole", + "sports", + "business", + "flag", + "summer" + ] + }, + "ice-skate": { + "a": "Ice Skate", + "b": "26F8", + "j": [ + "ice", + "skate", + "sports" + ] + }, + "fishing-pole": { + "a": "Fishing Pole", + "b": "1F3A3", + "j": [ + "fish", + "pole", + "food", + "hobby", + "summer" + ] + }, + "diving-mask": { + "a": "Diving Mask", + "b": "1F93F", + "j": [ + "diving", + "scuba", + "snorkeling", + "sport", + "ocean" + ] + }, + "running-shirt": { + "a": "Running Shirt", + "b": "1F3BD", + "j": [ + "athletics", + "running", + "sash", + "shirt", + "play", + "pageant" + ] + }, + "skis": { + "a": "Skis", + "b": "1F3BF", + "j": [ + "ski", + "snow", + "sports", + "winter", + "cold" + ] + }, + "sled": { + "a": "Sled", + "b": "1F6F7", + "j": [ + "sledge", + "sleigh", + "luge", + "toboggan" + ] + }, + "curling-stone": { + "a": "Curling Stone", + "b": "1F94C", + "j": [ + "game", + "rock", + "sports" + ] + }, + "bullseye": { + "a": "Bullseye", + "b": "1F3AF", + "j": [ + "dart", + "direct hit", + "game", + "hit", + "target", + "direct_hit", + "play", + "bar" + ] + }, + "yoyo": { + "a": "Yo-Yo", + "b": "1FA80", + "j": [ + "fluctuate", + "toy", + "yo-yo", + "yo_yo" + ] + }, + "kite": { + "a": "Kite", + "b": "1FA81", + "j": [ + "fly", + "soar", + "wind" + ] + }, + "pool-8-ball": { + "a": "Pool 8 Ball", + "b": "1F3B1", + "j": [ + "8", + "ball", + "billiard", + "eight", + "game", + "pool", + "hobby", + "luck", + "magic" + ] + }, + "crystal-ball": { + "a": "Crystal Ball", + "b": "1F52E", + "j": [ + "ball", + "crystal", + "fairy tale", + "fantasy", + "fortune", + "tool", + "disco", + "party", + "magic", + "circus", + "fortune_teller" + ] + }, + "magic-wand": { + "a": "Magic Wand", + "b": "1FA84", + "j": [ + "magic", + "witch", + "wizard", + "supernature", + "power" + ] + }, + "nazar-amulet": { + "a": "Nazar Amulet", + "b": "1F9FF", + "j": [ + "bead", + "charm", + "evil-eye", + "nazar", + "talisman" + ] + }, + "video-game": { + "a": "Video Game", + "b": "1F3AE", + "j": [ + "controller", + "game", + "play", + "console", + "PS4" + ] + }, + "joystick": { + "a": "Joystick", + "b": "1F579", + "j": [ + "game", + "video game", + "play" + ] + }, + "slot-machine": { + "a": "Slot Machine", + "b": "1F3B0", + "j": [ + "game", + "slot", + "bet", + "gamble", + "vegas", + "fruit machine", + "luck", + "casino" + ] + }, + "game-die": { + "a": "Game Die", + "b": "1F3B2", + "j": [ + "dice", + "die", + "game", + "random", + "tabletop", + "play", + "luck" + ] + }, + "puzzle-piece": { + "a": "Puzzle Piece", + "b": "1F9E9", + "j": [ + "clue", + "interlocking", + "jigsaw", + "piece", + "puzzle" + ] + }, + "teddy-bear": { + "a": "Teddy Bear", + "b": "1F9F8", + "j": [ + "plaything", + "plush", + "stuffed", + "toy" + ] + }, + "piata": { + "a": "Piñata", + "b": "1FA85", + "j": [ + "celebration", + "party", + "piñata", + "pinata", + "mexico", + "candy" + ] + }, + "nesting-dolls": { + "a": "Nesting Dolls", + "b": "1FA86", + "j": [ + "doll", + "nesting", + "russia", + "matryoshka", + "toy" + ] + }, + "spade-suit": { + "a": "Spade Suit", + "b": "2660", + "j": [ + "card", + "game", + "poker", + "cards", + "suits", + "magic" + ] + }, + "heart-suit": { + "a": "Heart Suit", + "b": "2665", + "j": [ + "card", + "game", + "poker", + "cards", + "magic", + "suits" + ] + }, + "diamond-suit": { + "a": "Diamond Suit", + "b": "2666", + "j": [ + "card", + "game", + "poker", + "cards", + "magic", + "suits" + ] + }, + "club-suit": { + "a": "Club Suit", + "b": "2663", + "j": [ + "card", + "game", + "poker", + "cards", + "magic", + "suits" + ] + }, + "chess-pawn": { + "a": "Chess Pawn", + "b": "265F", + "j": [ + "chess", + "dupe", + "expendable" + ] + }, + "joker": { + "a": "Joker", + "b": "1F0CF", + "j": [ + "card", + "game", + "wildcard", + "poker", + "cards", + "play", + "magic" + ] + }, + "mahjong-red-dragon": { + "a": "Mahjong Red Dragon", + "b": "1F004", + "j": [ + "game", + "mahjong", + "red", + "play", + "chinese", + "kanji" + ] + }, + "flower-playing-cards": { + "a": "Flower Playing Cards", + "b": "1F3B4", + "j": [ + "card", + "flower", + "game", + "Japanese", + "playing", + "sunset", + "red" + ] + }, + "performing-arts": { + "a": "Performing Arts", + "b": "1F3AD", + "j": [ + "art", + "mask", + "performing", + "theater", + "theatre", + "acting", + "drama" + ] + }, + "framed-picture": { + "a": "Framed Picture", + "b": "1F5BC", + "j": [ + "art", + "frame", + "museum", + "painting", + "picture", + "photography" + ] + }, + "artist-palette": { + "a": "Artist Palette", + "b": "1F3A8", + "j": [ + "art", + "museum", + "painting", + "palette", + "design", + "paint", + "draw", + "colors" + ] + }, + "thread": { + "a": "Thread", + "b": "1F9F5", + "j": [ + "needle", + "sewing", + "spool", + "string" + ] + }, + "sewing-needle": { + "a": "Sewing Needle", + "b": "1FAA1", + "j": [ + "embroidery", + "needle", + "sewing", + "stitches", + "sutures", + "tailoring" + ] + }, + "yarn": { + "a": "Yarn", + "b": "1F9F6", + "j": [ + "ball", + "crochet", + "knit" + ] + }, + "knot": { + "a": "Knot", + "b": "1FAA2", + "j": [ + "rope", + "tangled", + "tie", + "twine", + "twist", + "scout" + ] + }, + "glasses": { + "a": "Glasses", + "b": "1F453", + "j": [ + "clothing", + "eye", + "eyeglasses", + "eyewear", + "fashion", + "accessories", + "eyesight", + "nerdy", + "dork", + "geek" + ] + }, + "sunglasses": { + "a": "Sunglasses", + "b": "1F576", + "j": [ + "dark", + "eye", + "eyewear", + "glasses", + "face", + "cool", + "accessories" + ] + }, + "goggles": { + "a": "Goggles", + "b": "1F97D", + "j": [ + "eye protection", + "swimming", + "welding", + "eyes", + "protection", + "safety" + ] + }, + "lab-coat": { + "a": "Lab Coat", + "b": "1F97C", + "j": [ + "doctor", + "experiment", + "scientist", + "chemist" + ] + }, + "safety-vest": { + "a": "Safety Vest", + "b": "1F9BA", + "j": [ + "emergency", + "safety", + "vest", + "protection" + ] + }, + "necktie": { + "a": "Necktie", + "b": "1F454", + "j": [ + "clothing", + "tie", + "shirt", + "suitup", + "formal", + "fashion", + "cloth", + "business" + ] + }, + "tshirt": { + "a": "T-Shirt", + "b": "1F455", + "j": [ + "clothing", + "shirt", + "t-shirt", + "t_shirt", + "fashion", + "cloth", + "casual", + "tee" + ] + }, + "jeans": { + "a": "Jeans", + "b": "1F456", + "j": [ + "clothing", + "pants", + "trousers", + "fashion", + "shopping" + ] + }, + "scarf": { + "a": "Scarf", + "b": "1F9E3", + "j": [ + "neck", + "winter", + "clothes" + ] + }, + "gloves": { + "a": "Gloves", + "b": "1F9E4", + "j": [ + "hand", + "hands", + "winter", + "clothes" + ] + }, + "coat": { + "a": "Coat", + "b": "1F9E5", + "j": [ + "jacket" + ] + }, + "socks": { + "a": "Socks", + "b": "1F9E6", + "j": [ + "stocking", + "stockings", + "clothes" + ] + }, + "dress": { + "a": "Dress", + "b": "1F457", + "j": [ + "clothing", + "clothes", + "fashion", + "shopping" + ] + }, + "kimono": { + "a": "Kimono", + "b": "1F458", + "j": [ + "clothing", + "dress", + "fashion", + "women", + "female", + "japanese" + ] + }, + "sari": { + "a": "Sari", + "b": "1F97B", + "j": [ + "clothing", + "dress" + ] + }, + "onepiece-swimsuit": { + "a": "One-Piece Swimsuit", + "b": "1FA71", + "j": [ + "bathing suit", + "one-piece swimsuit", + "one_piece_swimsuit", + "fashion" + ] + }, + "briefs": { + "a": "Briefs", + "b": "1FA72", + "j": [ + "bathing suit", + "one-piece", + "swimsuit", + "underwear", + "clothing" + ] + }, + "shorts": { + "a": "Shorts", + "b": "1FA73", + "j": [ + "bathing suit", + "pants", + "underwear", + "clothing" + ] + }, + "bikini": { + "a": "Bikini", + "b": "1F459", + "j": [ + "clothing", + "swim", + "swimming", + "female", + "woman", + "girl", + "fashion", + "beach", + "summer" + ] + }, + "womans-clothes": { + "a": "Woman’S Clothes", + "b": "1F45A", + "j": [ + "clothing", + "woman", + "woman’s clothes", + "woman_s_clothes", + "fashion", + "shopping_bags", + "female" + ] + }, + "purse": { + "a": "Purse", + "b": "1F45B", + "j": [ + "clothing", + "coin", + "fashion", + "accessories", + "money", + "sales", + "shopping" + ] + }, + "handbag": { + "a": "Handbag", + "b": "1F45C", + "j": [ + "bag", + "clothing", + "purse", + "fashion", + "accessory", + "accessories", + "shopping" + ] + }, + "clutch-bag": { + "a": "Clutch Bag", + "b": "1F45D", + "j": [ + "bag", + "clothing", + "pouch", + "accessories", + "shopping" + ] + }, + "shopping-bags": { + "a": "Shopping Bags", + "b": "1F6CD", + "j": [ + "bag", + "hotel", + "shopping", + "mall", + "buy", + "purchase" + ] + }, + "backpack": { + "a": "Backpack", + "b": "1F392", + "j": [ + "bag", + "rucksack", + "satchel", + "school", + "student", + "education" + ] + }, + "thong-sandal": { + "a": "Thong Sandal", + "b": "1FA74", + "j": [ + "beach sandals", + "sandals", + "thong sandals", + "thongs", + "zōri", + "footwear", + "summer" + ] + }, + "mans-shoe": { + "a": "Man’S Shoe", + "b": "1F45E", + "j": [ + "clothing", + "man", + "man’s shoe", + "shoe", + "man_s_shoe", + "fashion", + "male" + ] + }, + "running-shoe": { + "a": "Running Shoe", + "b": "1F45F", + "j": [ + "athletic", + "clothing", + "shoe", + "sneaker", + "shoes", + "sports", + "sneakers" + ] + }, + "hiking-boot": { + "a": "Hiking Boot", + "b": "1F97E", + "j": [ + "backpacking", + "boot", + "camping", + "hiking" + ] + }, + "flat-shoe": { + "a": "Flat Shoe", + "b": "1F97F", + "j": [ + "ballet flat", + "slip-on", + "slipper", + "ballet" + ] + }, + "highheeled-shoe": { + "a": "High-Heeled Shoe", + "b": "1F460", + "j": [ + "clothing", + "heel", + "high-heeled shoe", + "shoe", + "woman", + "high_heeled_shoe", + "fashion", + "shoes", + "female", + "pumps", + "stiletto" + ] + }, + "womans-sandal": { + "a": "Woman’S Sandal", + "b": "1F461", + "j": [ + "clothing", + "sandal", + "shoe", + "woman", + "woman’s sandal", + "woman_s_sandal", + "shoes", + "fashion", + "flip flops" + ] + }, + "ballet-shoes": { + "a": "Ballet Shoes", + "b": "1FA70", + "j": [ + "ballet", + "dance" + ] + }, + "womans-boot": { + "a": "Woman’S Boot", + "b": "1F462", + "j": [ + "boot", + "clothing", + "shoe", + "woman", + "woman’s boot", + "woman_s_boot", + "shoes", + "fashion" + ] + }, + "crown": { + "a": "Crown", + "b": "1F451", + "j": [ + "clothing", + "king", + "queen", + "kod", + "leader", + "royalty", + "lord" + ] + }, + "womans-hat": { + "a": "Woman’S Hat", + "b": "1F452", + "j": [ + "clothing", + "hat", + "woman", + "woman’s hat", + "woman_s_hat", + "fashion", + "accessories", + "female", + "lady", + "spring" + ] + }, + "top-hat": { + "a": "Top Hat", + "b": "1F3A9", + "j": [ + "clothing", + "hat", + "top", + "tophat", + "magic", + "gentleman", + "classy", + "circus" + ] + }, + "graduation-cap": { + "a": "Graduation Cap", + "b": "1F393", + "j": [ + "cap", + "celebration", + "clothing", + "graduation", + "hat", + "school", + "college", + "degree", + "university", + "legal", + "learn", + "education" + ] + }, + "billed-cap": { + "a": "Billed Cap", + "b": "1F9E2", + "j": [ + "baseball cap", + "cap", + "baseball" + ] + }, + "military-helmet": { + "a": "Military Helmet", + "b": "1FA96", + "j": [ + "army", + "helmet", + "military", + "soldier", + "warrior", + "protection" + ] + }, + "rescue-workers-helmet": { + "a": "Rescue Worker’S Helmet", + "b": "26D1", + "j": [ + "aid", + "cross", + "face", + "hat", + "helmet", + "rescue worker’s helmet", + "rescue_worker_s_helmet", + "construction", + "build" + ] + }, + "prayer-beads": { + "a": "Prayer Beads", + "b": "1F4FF", + "j": [ + "beads", + "clothing", + "necklace", + "prayer", + "religion", + "dhikr", + "religious" + ] + }, + "lipstick": { + "a": "Lipstick", + "b": "1F484", + "j": [ + "cosmetics", + "makeup", + "female", + "girl", + "fashion", + "woman" + ] + }, + "ring": { + "a": "Ring", + "b": "1F48D", + "j": [ + "diamond", + "wedding", + "propose", + "marriage", + "valentines", + "fashion", + "jewelry", + "gem", + "engagement" + ] + }, + "gem-stone": { + "a": "Gem Stone", + "b": "1F48E", + "j": [ + "diamond", + "gem", + "jewel", + "blue", + "ruby", + "jewelry" + ] + }, + "muted-speaker": { + "a": "Muted Speaker", + "b": "1F507", + "j": [ + "mute", + "quiet", + "silent", + "speaker", + "sound", + "volume", + "silence" + ] + }, + "speaker-low-volume": { + "a": "Speaker Low Volume", + "b": "1F508", + "j": [ + "soft", + "sound", + "volume", + "silence", + "broadcast" + ] + }, + "speaker-medium-volume": { + "a": "Speaker Medium Volume", + "b": "1F509", + "j": [ + "medium", + "volume", + "speaker", + "broadcast" + ] + }, + "speaker-high-volume": { + "a": "Speaker High Volume", + "b": "1F50A", + "j": [ + "loud", + "volume", + "noise", + "noisy", + "speaker", + "broadcast" + ] + }, + "loudspeaker": { + "a": "Loudspeaker", + "b": "1F4E2", + "j": [ + "loud", + "public address", + "volume", + "sound" + ] + }, + "megaphone": { + "a": "Megaphone", + "b": "1F4E3", + "j": [ + "cheering", + "sound", + "speaker", + "volume" + ] + }, + "postal-horn": { + "a": "Postal Horn", + "b": "1F4EF", + "j": [ + "horn", + "post", + "postal", + "instrument", + "music" + ] + }, + "bell": { + "a": "Bell", + "b": "1F514", + "j": [ + "sound", + "notification", + "christmas", + "xmas", + "chime" + ] + }, + "bell-with-slash": { + "a": "Bell with Slash", + "b": "1F515", + "j": [ + "bell", + "forbidden", + "mute", + "quiet", + "silent", + "sound", + "volume" + ] + }, + "musical-score": { + "a": "Musical Score", + "b": "1F3BC", + "j": [ + "music", + "score", + "treble", + "clef", + "compose" + ] + }, + "musical-note": { + "a": "Musical Note", + "b": "1F3B5", + "j": [ + "music", + "note", + "score", + "tone", + "sound" + ] + }, + "musical-notes": { + "a": "Musical Notes", + "b": "1F3B6", + "j": [ + "music", + "note", + "notes", + "score" + ] + }, + "studio-microphone": { + "a": "Studio Microphone", + "b": "1F399", + "j": [ + "mic", + "microphone", + "music", + "studio", + "sing", + "recording", + "artist", + "talkshow" + ] + }, + "level-slider": { + "a": "Level Slider", + "b": "1F39A", + "j": [ + "level", + "music", + "slider", + "scale" + ] + }, + "control-knobs": { + "a": "Control Knobs", + "b": "1F39B", + "j": [ + "control", + "knobs", + "music", + "dial" + ] + }, + "microphone": { + "a": "Microphone", + "b": "1F3A4", + "j": [ + "karaoke", + "mic", + "sound", + "music", + "PA", + "sing", + "talkshow" + ] + }, + "headphone": { + "a": "Headphone", + "b": "1F3A7", + "j": [ + "earbud", + "music", + "score", + "gadgets" + ] + }, + "radio": { + "a": "Radio", + "b": "1F4FB", + "j": [ + "video", + "communication", + "music", + "podcast", + "program" + ] + }, + "saxophone": { + "a": "Saxophone", + "b": "1F3B7", + "j": [ + "instrument", + "music", + "sax", + "jazz", + "blues" + ] + }, + "accordion": { + "a": "Accordion", + "b": "1FA97", + "j": [ + "concertina", + "squeeze box", + "music" + ] + }, + "guitar": { + "a": "Guitar", + "b": "1F3B8", + "j": [ + "instrument", + "music" + ] + }, + "musical-keyboard": { + "a": "Musical Keyboard", + "b": "1F3B9", + "j": [ + "instrument", + "keyboard", + "music", + "piano", + "compose" + ] + }, + "trumpet": { + "a": "Trumpet", + "b": "1F3BA", + "j": [ + "instrument", + "music", + "brass" + ] + }, + "violin": { + "a": "Violin", + "b": "1F3BB", + "j": [ + "instrument", + "music", + "orchestra", + "symphony" + ] + }, + "banjo": { + "a": "Banjo", + "b": "1FA95", + "j": [ + "music", + "stringed", + "instructment" + ] + }, + "drum": { + "a": "Drum", + "b": "1F941", + "j": [ + "drumsticks", + "music", + "instrument", + "snare" + ] + }, + "long-drum": { + "a": "Long Drum", + "b": "1FA98", + "j": [ + "beat", + "conga", + "drum", + "rhythm", + "music" + ] + }, + "mobile-phone": { + "a": "Mobile Phone", + "b": "1F4F1", + "j": [ + "cell", + "mobile", + "phone", + "telephone", + "technology", + "apple", + "gadgets", + "dial" + ] + }, + "mobile-phone-with-arrow": { + "a": "Mobile Phone with Arrow", + "b": "1F4F2", + "j": [ + "arrow", + "cell", + "mobile", + "phone", + "receive", + "iphone", + "incoming" + ] + }, + "telephone": { + "a": "Telephone", + "b": "260E", + "j": [ + "phone", + "technology", + "communication", + "dial" + ] + }, + "telephone-receiver": { + "a": "Telephone Receiver", + "b": "1F4DE", + "j": [ + "phone", + "receiver", + "telephone", + "technology", + "communication", + "dial" + ] + }, + "pager": { + "a": "Pager", + "b": "1F4DF", + "j": [ + "bbcall", + "oldschool", + "90s" + ] + }, + "fax-machine": { + "a": "Fax Machine", + "b": "1F4E0", + "j": [ + "fax", + "communication", + "technology" + ] + }, + "battery": { + "a": "Battery", + "b": "1F50B", + "j": [ + "power", + "energy", + "sustain" + ] + }, + "electric-plug": { + "a": "Electric Plug", + "b": "1F50C", + "j": [ + "electric", + "electricity", + "plug", + "charger", + "power" + ] + }, + "laptop": { + "a": "Laptop", + "b": "1F4BB", + "j": [ + "computer", + "pc", + "personal", + "technology", + "screen", + "display", + "monitor" + ] + }, + "desktop-computer": { + "a": "Desktop Computer", + "b": "1F5A5", + "j": [ + "computer", + "desktop", + "technology", + "computing", + "screen" + ] + }, + "printer": { + "a": "Printer", + "b": "1F5A8", + "j": [ + "computer", + "paper", + "ink" + ] + }, + "keyboard": { + "a": "Keyboard", + "b": "2328", + "j": [ + "computer", + "technology", + "type", + "input", + "text" + ] + }, + "computer-mouse": { + "a": "Computer Mouse", + "b": "1F5B1", + "j": [ + "computer", + "click" + ] + }, + "trackball": { + "a": "Trackball", + "b": "1F5B2", + "j": [ + "computer", + "technology", + "trackpad" + ] + }, + "computer-disk": { + "a": "Computer Disk", + "b": "1F4BD", + "j": [ + "computer", + "disk", + "minidisk", + "optical", + "technology", + "record", + "data", + "90s" + ] + }, + "floppy-disk": { + "a": "Floppy Disk", + "b": "1F4BE", + "j": [ + "computer", + "disk", + "floppy", + "oldschool", + "technology", + "save", + "90s", + "80s" + ] + }, + "optical-disk": { + "a": "Optical Disk", + "b": "1F4BF", + "j": [ + "cd", + "computer", + "disk", + "optical", + "technology", + "dvd", + "disc", + "90s" + ] + }, + "dvd": { + "a": "Dvd", + "b": "1F4C0", + "j": [ + "blu-ray", + "computer", + "disk", + "optical", + "cd", + "disc" + ] + }, + "abacus": { + "a": "Abacus", + "b": "1F9EE", + "j": [ + "calculation" + ] + }, + "movie-camera": { + "a": "Movie Camera", + "b": "1F3A5", + "j": [ + "camera", + "cinema", + "movie", + "film", + "record" + ] + }, + "film-frames": { + "a": "Film Frames", + "b": "1F39E", + "j": [ + "cinema", + "film", + "frames", + "movie" + ] + }, + "film-projector": { + "a": "Film Projector", + "b": "1F4FD", + "j": [ + "cinema", + "film", + "movie", + "projector", + "video", + "tape", + "record" + ] + }, + "clapper-board": { + "a": "Clapper Board", + "b": "1F3AC", + "j": [ + "clapper", + "movie", + "film", + "record" + ] + }, + "television": { + "a": "Television", + "b": "1F4FA", + "j": [ + "tv", + "video", + "technology", + "program", + "oldschool", + "show" + ] + }, + "camera": { + "a": "Camera", + "b": "1F4F7", + "j": [ + "video", + "gadgets", + "photography" + ] + }, + "camera-with-flash": { + "a": "Camera with Flash", + "b": "1F4F8", + "j": [ + "camera", + "flash", + "video", + "photography", + "gadgets" + ] + }, + "video-camera": { + "a": "Video Camera", + "b": "1F4F9", + "j": [ + "camera", + "video", + "film", + "record" + ] + }, + "videocassette": { + "a": "Videocassette", + "b": "1F4FC", + "j": [ + "tape", + "vhs", + "video", + "record", + "oldschool", + "90s", + "80s" + ] + }, + "magnifying-glass-tilted-left": { + "a": "Magnifying Glass Tilted Left", + "b": "1F50D", + "j": [ + "glass", + "magnifying", + "search", + "tool", + "zoom", + "find", + "detective" + ] + }, + "magnifying-glass-tilted-right": { + "a": "Magnifying Glass Tilted Right", + "b": "1F50E", + "j": [ + "glass", + "magnifying", + "search", + "tool", + "zoom", + "find", + "detective" + ] + }, + "candle": { + "a": "Candle", + "b": "1F56F", + "j": [ + "light", + "fire", + "wax" + ] + }, + "light-bulb": { + "a": "Light Bulb", + "b": "1F4A1", + "j": [ + "bulb", + "comic", + "electric", + "idea", + "light", + "electricity" + ] + }, + "flashlight": { + "a": "Flashlight", + "b": "1F526", + "j": [ + "electric", + "light", + "tool", + "torch", + "dark", + "camping", + "sight", + "night" + ] + }, + "red-paper-lantern": { + "a": "Red Paper Lantern", + "b": "1F3EE", + "j": [ + "bar", + "lantern", + "light", + "red", + "paper", + "halloween", + "spooky" + ] + }, + "diya-lamp": { + "a": "Diya Lamp", + "b": "1FA94", + "j": [ + "diya", + "lamp", + "oil", + "lighting" + ] + }, + "notebook-with-decorative-cover": { + "a": "Notebook with Decorative Cover", + "b": "1F4D4", + "j": [ + "book", + "cover", + "decorated", + "notebook", + "classroom", + "notes", + "record", + "paper", + "study" + ] + }, + "closed-book": { + "a": "Closed Book", + "b": "1F4D5", + "j": [ + "book", + "closed", + "read", + "library", + "knowledge", + "textbook", + "learn" + ] + }, + "open-book": { + "a": "Open Book", + "b": "1F4D6", + "j": [ + "book", + "open", + "read", + "library", + "knowledge", + "literature", + "learn", + "study" + ] + }, + "green-book": { + "a": "Green Book", + "b": "1F4D7", + "j": [ + "book", + "green", + "read", + "library", + "knowledge", + "study" + ] + }, + "blue-book": { + "a": "Blue Book", + "b": "1F4D8", + "j": [ + "blue", + "book", + "read", + "library", + "knowledge", + "learn", + "study" + ] + }, + "orange-book": { + "a": "Orange Book", + "b": "1F4D9", + "j": [ + "book", + "orange", + "read", + "library", + "knowledge", + "textbook", + "study" + ] + }, + "books": { + "a": "Books", + "b": "1F4DA", + "j": [ + "book", + "literature", + "library", + "study" + ] + }, + "notebook": { + "a": "Notebook", + "b": "1F4D3", + "j": [ + "stationery", + "record", + "notes", + "paper", + "study" + ] + }, + "ledger": { + "a": "Ledger", + "b": "1F4D2", + "j": [ + "notebook", + "notes", + "paper" + ] + }, + "page-with-curl": { + "a": "Page with Curl", + "b": "1F4C3", + "j": [ + "curl", + "document", + "page", + "documents", + "office", + "paper" + ] + }, + "scroll": { + "a": "Scroll", + "b": "1F4DC", + "j": [ + "paper", + "documents", + "ancient", + "history" + ] + }, + "page-facing-up": { + "a": "Page Facing Up", + "b": "1F4C4", + "j": [ + "document", + "page", + "documents", + "office", + "paper", + "information" + ] + }, + "newspaper": { + "a": "Newspaper", + "b": "1F4F0", + "j": [ + "news", + "paper", + "press", + "headline" + ] + }, + "rolledup-newspaper": { + "a": "Rolled-Up Newspaper", + "b": "1F5DE", + "j": [ + "news", + "newspaper", + "paper", + "rolled", + "rolled-up newspaper", + "rolled_up_newspaper", + "press", + "headline" + ] + }, + "bookmark-tabs": { + "a": "Bookmark Tabs", + "b": "1F4D1", + "j": [ + "bookmark", + "mark", + "marker", + "tabs", + "favorite", + "save", + "order", + "tidy" + ] + }, + "bookmark": { + "a": "Bookmark", + "b": "1F516", + "j": [ + "mark", + "favorite", + "label", + "save" + ] + }, + "label": { + "a": "Label", + "b": "1F3F7", + "j": [ + "sale", + "tag" + ] + }, + "money-bag": { + "a": "Money Bag", + "b": "1F4B0", + "j": [ + "bag", + "dollar", + "money", + "moneybag", + "payment", + "coins", + "sale" + ] + }, + "coin": { + "a": "Coin", + "b": "1FA99", + "j": [ + "gold", + "metal", + "money", + "silver", + "treasure", + "currency" + ] + }, + "yen-banknote": { + "a": "Yen Banknote", + "b": "1F4B4", + "j": [ + "banknote", + "bill", + "currency", + "money", + "note", + "yen", + "sales", + "japanese", + "dollar" + ] + }, + "dollar-banknote": { + "a": "Dollar Banknote", + "b": "1F4B5", + "j": [ + "banknote", + "bill", + "currency", + "dollar", + "money", + "note", + "sales" + ] + }, + "euro-banknote": { + "a": "Euro Banknote", + "b": "1F4B6", + "j": [ + "banknote", + "bill", + "currency", + "euro", + "money", + "note", + "sales", + "dollar" + ] + }, + "pound-banknote": { + "a": "Pound Banknote", + "b": "1F4B7", + "j": [ + "banknote", + "bill", + "currency", + "money", + "note", + "pound", + "british", + "sterling", + "sales", + "bills", + "uk", + "england" + ] + }, + "money-with-wings": { + "a": "Money with Wings", + "b": "1F4B8", + "j": [ + "banknote", + "bill", + "fly", + "money", + "wings", + "dollar", + "bills", + "payment", + "sale" + ] + }, + "credit-card": { + "a": "Credit Card", + "b": "1F4B3", + "j": [ + "card", + "credit", + "money", + "sales", + "dollar", + "bill", + "payment", + "shopping" + ] + }, + "receipt": { + "a": "Receipt", + "b": "1F9FE", + "j": [ + "accounting", + "bookkeeping", + "evidence", + "proof", + "expenses" + ] + }, + "chart-increasing-with-yen": { + "a": "Chart Increasing with Yen", + "b": "1F4B9", + "j": [ + "chart", + "graph", + "growth", + "money", + "yen", + "green-square", + "presentation", + "stats" + ] + }, + "envelope": { + "a": "Envelope", + "b": "2709", + "j": [ + "email", + "letter", + "postal", + "inbox", + "communication" + ] + }, + "email": { + "a": "E-Mail", + "b": "1F4E7", + "j": [ + "e-mail", + "letter", + "mail", + "e_mail", + "communication", + "inbox" + ] + }, + "incoming-envelope": { + "a": "Incoming Envelope", + "b": "1F4E8", + "j": [ + "e-mail", + "email", + "envelope", + "incoming", + "letter", + "receive", + "inbox" + ] + }, + "envelope-with-arrow": { + "a": "Envelope with Arrow", + "b": "1F4E9", + "j": [ + "arrow", + "e-mail", + "email", + "envelope", + "outgoing", + "communication" + ] + }, + "outbox-tray": { + "a": "Outbox Tray", + "b": "1F4E4", + "j": [ + "box", + "letter", + "mail", + "outbox", + "sent", + "tray", + "inbox", + "email" + ] + }, + "inbox-tray": { + "a": "Inbox Tray", + "b": "1F4E5", + "j": [ + "box", + "inbox", + "letter", + "mail", + "receive", + "tray", + "email", + "documents" + ] + }, + "package": { + "a": "Package", + "b": "1F4E6", + "j": [ + "box", + "parcel", + "mail", + "gift", + "cardboard", + "moving" + ] + }, + "closed-mailbox-with-raised-flag": { + "a": "Closed Mailbox with Raised Flag", + "b": "1F4EB", + "j": [ + "closed", + "mail", + "mailbox", + "postbox", + "email", + "inbox", + "communication" + ] + }, + "closed-mailbox-with-lowered-flag": { + "a": "Closed Mailbox with Lowered Flag", + "b": "1F4EA", + "j": [ + "closed", + "lowered", + "mail", + "mailbox", + "postbox", + "email", + "communication", + "inbox" + ] + }, + "open-mailbox-with-raised-flag": { + "a": "Open Mailbox with Raised Flag", + "b": "1F4EC", + "j": [ + "mail", + "mailbox", + "open", + "postbox", + "email", + "inbox", + "communication" + ] + }, + "open-mailbox-with-lowered-flag": { + "a": "Open Mailbox with Lowered Flag", + "b": "1F4ED", + "j": [ + "lowered", + "mail", + "mailbox", + "open", + "postbox", + "email", + "inbox" + ] + }, + "postbox": { + "a": "Postbox", + "b": "1F4EE", + "j": [ + "mail", + "mailbox", + "email", + "letter", + "envelope" + ] + }, + "ballot-box-with-ballot": { + "a": "Ballot Box with Ballot", + "b": "1F5F3", + "j": [ + "ballot", + "box", + "election", + "vote" + ] + }, + "pencil": { + "a": "Pencil", + "b": "270F", + "j": [ + "stationery", + "write", + "paper", + "writing", + "school", + "study" + ] + }, + "black-nib": { + "a": "Black Nib", + "b": "2712", + "j": [ + "nib", + "pen", + "stationery", + "writing", + "write" + ] + }, + "fountain-pen": { + "a": "Fountain Pen", + "b": "1F58B", + "j": [ + "fountain", + "pen", + "stationery", + "writing", + "write" + ] + }, + "pen": { + "a": "Pen", + "b": "1F58A", + "j": [ + "ballpoint", + "stationery", + "writing", + "write" + ] + }, + "paintbrush": { + "a": "Paintbrush", + "b": "1F58C", + "j": [ + "painting", + "drawing", + "creativity", + "art" + ] + }, + "crayon": { + "a": "Crayon", + "b": "1F58D", + "j": [ + "drawing", + "creativity" + ] + }, + "memo": { + "a": "Memo", + "b": "1F4DD", + "j": [ + "pencil", + "write", + "documents", + "stationery", + "paper", + "writing", + "legal", + "exam", + "quiz", + "test", + "study", + "compose" + ] + }, + "briefcase": { + "a": "Briefcase", + "b": "1F4BC", + "j": [ + "business", + "documents", + "work", + "law", + "legal", + "job", + "career" + ] + }, + "file-folder": { + "a": "File Folder", + "b": "1F4C1", + "j": [ + "file", + "folder", + "documents", + "business", + "office" + ] + }, + "open-file-folder": { + "a": "Open File Folder", + "b": "1F4C2", + "j": [ + "file", + "folder", + "open", + "documents", + "load" + ] + }, + "card-index-dividers": { + "a": "Card Index Dividers", + "b": "1F5C2", + "j": [ + "card", + "dividers", + "index", + "organizing", + "business", + "stationery" + ] + }, + "calendar": { + "a": "Calendar", + "b": "1F4C5", + "j": [ + "date", + "schedule" + ] + }, + "tearoff-calendar": { + "a": "Tear-off Calendar", + "b": "1F4C6", + "j": [ + "calendar", + "tear-off calendar", + "tear_off_calendar", + "schedule", + "date", + "planning" + ] + }, + "spiral-notepad": { + "a": "Spiral Notepad", + "b": "1F5D2", + "j": [ + "note", + "pad", + "spiral", + "memo", + "stationery" + ] + }, + "spiral-calendar": { + "a": "Spiral Calendar", + "b": "1F5D3", + "j": [ + "calendar", + "pad", + "spiral", + "date", + "schedule", + "planning" + ] + }, + "card-index": { + "a": "Card Index", + "b": "1F4C7", + "j": [ + "card", + "index", + "rolodex", + "business", + "stationery" + ] + }, + "chart-increasing": { + "a": "Chart Increasing", + "b": "1F4C8", + "j": [ + "chart", + "graph", + "growth", + "trend", + "upward", + "presentation", + "stats", + "recovery", + "business", + "economics", + "money", + "sales", + "good", + "success" + ] + }, + "chart-decreasing": { + "a": "Chart Decreasing", + "b": "1F4C9", + "j": [ + "chart", + "down", + "graph", + "trend", + "presentation", + "stats", + "recession", + "business", + "economics", + "money", + "sales", + "bad", + "failure" + ] + }, + "bar-chart": { + "a": "Bar Chart", + "b": "1F4CA", + "j": [ + "bar", + "chart", + "graph", + "presentation", + "stats" + ] + }, + "clipboard": { + "a": "Clipboard", + "b": "1F4CB", + "j": [ + "stationery", + "documents" + ] + }, + "pushpin": { + "a": "Pushpin", + "b": "1F4CC", + "j": [ + "pin", + "stationery", + "mark", + "here" + ] + }, + "round-pushpin": { + "a": "Round Pushpin", + "b": "1F4CD", + "j": [ + "pin", + "pushpin", + "stationery", + "location", + "map", + "here" + ] + }, + "paperclip": { + "a": "Paperclip", + "b": "1F4CE", + "j": [ + "documents", + "stationery" + ] + }, + "linked-paperclips": { + "a": "Linked Paperclips", + "b": "1F587", + "j": [ + "link", + "paperclip", + "documents", + "stationery" + ] + }, + "straight-ruler": { + "a": "Straight Ruler", + "b": "1F4CF", + "j": [ + "ruler", + "straight edge", + "stationery", + "calculate", + "length", + "math", + "school", + "drawing", + "architect", + "sketch" + ] + }, + "triangular-ruler": { + "a": "Triangular Ruler", + "b": "1F4D0", + "j": [ + "ruler", + "set", + "triangle", + "stationery", + "math", + "architect", + "sketch" + ] + }, + "scissors": { + "a": "Scissors", + "b": "2702", + "j": [ + "cutting", + "tool", + "stationery", + "cut" + ] + }, + "card-file-box": { + "a": "Card File Box", + "b": "1F5C3", + "j": [ + "box", + "card", + "file", + "business", + "stationery" + ] + }, + "file-cabinet": { + "a": "File Cabinet", + "b": "1F5C4", + "j": [ + "cabinet", + "file", + "filing", + "organizing" + ] + }, + "wastebasket": { + "a": "Wastebasket", + "b": "1F5D1", + "j": [ + "bin", + "trash", + "rubbish", + "garbage", + "toss" + ] + }, + "locked": { + "a": "Locked", + "b": "1F512", + "j": [ + "closed", + "security", + "password", + "padlock" + ] + }, + "unlocked": { + "a": "Unlocked", + "b": "1F513", + "j": [ + "lock", + "open", + "unlock", + "privacy", + "security" + ] + }, + "locked-with-pen": { + "a": "Locked with Pen", + "b": "1F50F", + "j": [ + "ink", + "lock", + "nib", + "pen", + "privacy", + "security", + "secret" + ] + }, + "locked-with-key": { + "a": "Locked with Key", + "b": "1F510", + "j": [ + "closed", + "key", + "lock", + "secure", + "security", + "privacy" + ] + }, + "key": { + "a": "Key", + "b": "1F511", + "j": [ + "lock", + "password", + "door" + ] + }, + "old-key": { + "a": "Old Key", + "b": "1F5DD", + "j": [ + "clue", + "key", + "lock", + "old", + "door", + "password" + ] + }, + "hammer": { + "a": "Hammer", + "b": "1F528", + "j": [ + "tool", + "tools", + "build", + "create" + ] + }, + "axe": { + "a": "Axe", + "b": "1FA93", + "j": [ + "chop", + "hatchet", + "split", + "wood", + "tool", + "cut" + ] + }, + "pick": { + "a": "Pick", + "b": "26CF", + "j": [ + "mining", + "tool", + "tools", + "dig" + ] + }, + "hammer-and-pick": { + "a": "Hammer and Pick", + "b": "2692", + "j": [ + "hammer", + "pick", + "tool", + "tools", + "build", + "create" + ] + }, + "hammer-and-wrench": { + "a": "Hammer and Wrench", + "b": "1F6E0", + "j": [ + "hammer", + "spanner", + "tool", + "wrench", + "tools", + "build", + "create" + ] + }, + "dagger": { + "a": "Dagger", + "b": "1F5E1", + "j": [ + "knife", + "weapon" + ] + }, + "crossed-swords": { + "a": "Crossed Swords", + "b": "2694", + "j": [ + "crossed", + "swords", + "weapon" + ] + }, + "water-pistol": { + "a": "Water Pistol", + "b": "1F52B", + "j": [ + "gun", + "handgun", + "pistol", + "revolver", + "tool", + "water", + "weapon", + "violence" + ] + }, + "boomerang": { + "a": "Boomerang", + "b": "1FA83", + "j": [ + "australia", + "rebound", + "repercussion", + "weapon" + ] + }, + "bow-and-arrow": { + "a": "Bow and Arrow", + "b": "1F3F9", + "j": [ + "archer", + "arrow", + "bow", + "Sagittarius", + "zodiac", + "sports" + ] + }, + "shield": { + "a": "Shield", + "b": "1F6E1", + "j": [ + "weapon", + "protection", + "security" + ] + }, + "carpentry-saw": { + "a": "Carpentry Saw", + "b": "1FA9A", + "j": [ + "carpenter", + "lumber", + "saw", + "tool", + "cut", + "chop" + ] + }, + "wrench": { + "a": "Wrench", + "b": "1F527", + "j": [ + "spanner", + "tool", + "tools", + "diy", + "ikea", + "fix", + "maintainer" + ] + }, + "screwdriver": { + "a": "Screwdriver", + "b": "1FA9B", + "j": [ + "screw", + "tool", + "tools" + ] + }, + "nut-and-bolt": { + "a": "Nut and Bolt", + "b": "1F529", + "j": [ + "bolt", + "nut", + "tool", + "handy", + "tools", + "fix" + ] + }, + "gear": { + "a": "Gear", + "b": "2699", + "j": [ + "cog", + "cogwheel", + "tool" + ] + }, + "clamp": { + "a": "Clamp", + "b": "1F5DC", + "j": [ + "compress", + "tool", + "vice" + ] + }, + "balance-scale": { + "a": "Balance Scale", + "b": "2696", + "j": [ + "balance", + "justice", + "Libra", + "scale", + "zodiac", + "law", + "fairness", + "weight" + ] + }, + "white-cane": { + "a": "White Cane", + "b": "1F9AF", + "j": [ + "accessibility", + "blind", + "probing_cane" + ] + }, + "link": { + "a": "Link", + "b": "1F517", + "j": [ + "rings", + "url" + ] + }, + "chains": { + "a": "Chains", + "b": "26D3", + "j": [ + "chain", + "lock", + "arrest" + ] + }, + "hook": { + "a": "Hook", + "b": "1FA9D", + "j": [ + "catch", + "crook", + "curve", + "ensnare", + "selling point", + "tools" + ] + }, + "toolbox": { + "a": "Toolbox", + "b": "1F9F0", + "j": [ + "chest", + "mechanic", + "tool", + "tools", + "diy", + "fix", + "maintainer" + ] + }, + "magnet": { + "a": "Magnet", + "b": "1F9F2", + "j": [ + "attraction", + "horseshoe", + "magnetic" + ] + }, + "ladder": { + "a": "Ladder", + "b": "1FA9C", + "j": [ + "climb", + "rung", + "step", + "tools" + ] + }, + "alembic": { + "a": "Alembic", + "b": "2697", + "j": [ + "chemistry", + "tool", + "distilling", + "science", + "experiment" + ] + }, + "test-tube": { + "a": "Test Tube", + "b": "1F9EA", + "j": [ + "chemist", + "chemistry", + "experiment", + "lab", + "science" + ] + }, + "petri-dish": { + "a": "Petri Dish", + "b": "1F9EB", + "j": [ + "bacteria", + "biologist", + "biology", + "culture", + "lab" + ] + }, + "dna": { + "a": "Dna", + "b": "1F9EC", + "j": [ + "biologist", + "evolution", + "gene", + "genetics", + "life" + ] + }, + "microscope": { + "a": "Microscope", + "b": "1F52C", + "j": [ + "science", + "tool", + "laboratory", + "experiment", + "zoomin", + "study" + ] + }, + "telescope": { + "a": "Telescope", + "b": "1F52D", + "j": [ + "science", + "tool", + "stars", + "space", + "zoom", + "astronomy" + ] + }, + "satellite-antenna": { + "a": "Satellite Antenna", + "b": "1F4E1", + "j": [ + "antenna", + "dish", + "satellite", + "communication", + "future", + "radio", + "space" + ] + }, + "syringe": { + "a": "Syringe", + "b": "1F489", + "j": [ + "medicine", + "needle", + "shot", + "sick", + "health", + "hospital", + "drugs", + "blood", + "doctor", + "nurse" + ] + }, + "drop-of-blood": { + "a": "Drop of Blood", + "b": "1FA78", + "j": [ + "bleed", + "blood donation", + "injury", + "medicine", + "menstruation", + "period", + "hurt", + "harm", + "wound" + ] + }, + "pill": { + "a": "Pill", + "b": "1F48A", + "j": [ + "doctor", + "medicine", + "sick", + "health", + "pharmacy", + "drug" + ] + }, + "adhesive-bandage": { + "a": "Adhesive Bandage", + "b": "1FA79", + "j": [ + "bandage", + "heal" + ] + }, + "stethoscope": { + "a": "Stethoscope", + "b": "1FA7A", + "j": [ + "doctor", + "heart", + "medicine", + "health" + ] + }, + "door": { + "a": "Door", + "b": "1F6AA", + "j": [ + "house", + "entry", + "exit" + ] + }, + "elevator": { + "a": "Elevator", + "b": "1F6D7", + "j": [ + "accessibility", + "hoist", + "lift" + ] + }, + "mirror": { + "a": "Mirror", + "b": "1FA9E", + "j": [ + "reflection", + "reflector", + "speculum" + ] + }, + "window": { + "a": "Window", + "b": "1FA9F", + "j": [ + "frame", + "fresh air", + "opening", + "transparent", + "view", + "scenery" + ] + }, + "bed": { + "a": "Bed", + "b": "1F6CF", + "j": [ + "hotel", + "sleep", + "rest" + ] + }, + "couch-and-lamp": { + "a": "Couch and Lamp", + "b": "1F6CB", + "j": [ + "couch", + "hotel", + "lamp", + "read", + "chill" + ] + }, + "chair": { + "a": "Chair", + "b": "1FA91", + "j": [ + "seat", + "sit", + "furniture" + ] + }, + "toilet": { + "a": "Toilet", + "b": "1F6BD", + "j": [ + "restroom", + "wc", + "washroom", + "bathroom", + "potty" + ] + }, + "plunger": { + "a": "Plunger", + "b": "1FAA0", + "j": [ + "force cup", + "plumber", + "suction", + "toilet" + ] + }, + "shower": { + "a": "Shower", + "b": "1F6BF", + "j": [ + "water", + "clean", + "bathroom" + ] + }, + "bathtub": { + "a": "Bathtub", + "b": "1F6C1", + "j": [ + "bath", + "clean", + "shower", + "bathroom" + ] + }, + "mouse-trap": { + "a": "Mouse Trap", + "b": "1FAA4", + "j": [ + "bait", + "mousetrap", + "snare", + "trap", + "cheese" + ] + }, + "razor": { + "a": "Razor", + "b": "1FA92", + "j": [ + "sharp", + "shave", + "cut" + ] + }, + "lotion-bottle": { + "a": "Lotion Bottle", + "b": "1F9F4", + "j": [ + "lotion", + "moisturizer", + "shampoo", + "sunscreen" + ] + }, + "safety-pin": { + "a": "Safety Pin", + "b": "1F9F7", + "j": [ + "diaper", + "punk rock" + ] + }, + "broom": { + "a": "Broom", + "b": "1F9F9", + "j": [ + "cleaning", + "sweeping", + "witch" + ] + }, + "basket": { + "a": "Basket", + "b": "1F9FA", + "j": [ + "farming", + "laundry", + "picnic" + ] + }, + "roll-of-paper": { + "a": "Roll of Paper", + "b": "1F9FB", + "j": [ + "paper towels", + "toilet paper", + "roll" + ] + }, + "bucket": { + "a": "Bucket", + "b": "1FAA3", + "j": [ + "cask", + "pail", + "vat", + "water", + "container" + ] + }, + "soap": { + "a": "Soap", + "b": "1F9FC", + "j": [ + "bar", + "bathing", + "cleaning", + "lather", + "soapdish" + ] + }, + "toothbrush": { + "a": "Toothbrush", + "b": "1FAA5", + "j": [ + "bathroom", + "brush", + "clean", + "dental", + "hygiene", + "teeth" + ] + }, + "sponge": { + "a": "Sponge", + "b": "1F9FD", + "j": [ + "absorbing", + "cleaning", + "porous" + ] + }, + "fire-extinguisher": { + "a": "Fire Extinguisher", + "b": "1F9EF", + "j": [ + "extinguish", + "fire", + "quench" + ] + }, + "shopping-cart": { + "a": "Shopping Cart", + "b": "1F6D2", + "j": [ + "cart", + "shopping", + "trolley" + ] + }, + "cigarette": { + "a": "Cigarette", + "b": "1F6AC", + "j": [ + "smoking", + "kills", + "tobacco", + "joint", + "smoke" + ] + }, + "coffin": { + "a": "Coffin", + "b": "26B0", + "j": [ + "death", + "vampire", + "dead", + "die", + "rip", + "graveyard", + "cemetery", + "casket", + "funeral", + "box" + ] + }, + "headstone": { + "a": "Headstone", + "b": "1FAA6", + "j": [ + "cemetery", + "grave", + "graveyard", + "tombstone", + "death", + "rip" + ] + }, + "funeral-urn": { + "a": "Funeral Urn", + "b": "26B1", + "j": [ + "ashes", + "death", + "funeral", + "urn", + "dead", + "die", + "rip" + ] + }, + "moai": { + "a": "Moai", + "b": "1F5FF", + "j": [ + "face", + "moyai", + "statue", + "rock", + "easter island" + ] + }, + "placard": { + "a": "Placard", + "b": "1FAA7", + "j": [ + "demonstration", + "picket", + "protest", + "sign", + "announcement" + ] + }, + "atm-sign": { + "a": "Atm Sign", + "b": "1F3E7", + "j": [ + "atm", + "ATM sign", + "automated", + "bank", + "teller", + "money", + "sales", + "cash", + "blue-square", + "payment" + ] + }, + "litter-in-bin-sign": { + "a": "Litter in Bin Sign", + "b": "1F6AE", + "j": [ + "litter", + "litter bin", + "blue-square", + "sign", + "human", + "info" + ] + }, + "potable-water": { + "a": "Potable Water", + "b": "1F6B0", + "j": [ + "drinking", + "potable", + "water", + "blue-square", + "liquid", + "restroom", + "cleaning", + "faucet" + ] + }, + "wheelchair-symbol": { + "a": "Wheelchair Symbol", + "b": "267F", + "j": [ + "access", + "blue-square", + "disabled", + "accessibility" + ] + }, + "mens-room": { + "a": "Men’S Room", + "b": "1F6B9", + "j": [ + "lavatory", + "man", + "men’s room", + "restroom", + "wc", + "men_s_room", + "toilet", + "blue-square", + "gender", + "male" + ] + }, + "womens-room": { + "a": "Women’S Room", + "b": "1F6BA", + "j": [ + "lavatory", + "restroom", + "wc", + "woman", + "women’s room", + "women_s_room", + "purple-square", + "female", + "toilet", + "loo", + "gender" + ] + }, + "restroom": { + "a": "Restroom", + "b": "1F6BB", + "j": [ + "lavatory", + "WC", + "blue-square", + "toilet", + "refresh", + "wc", + "gender" + ] + }, + "baby-symbol": { + "a": "Baby Symbol", + "b": "1F6BC", + "j": [ + "baby", + "changing", + "orange-square", + "child" + ] + }, + "water-closet": { + "a": "Water Closet", + "b": "1F6BE", + "j": [ + "closet", + "lavatory", + "restroom", + "water", + "wc", + "toilet", + "blue-square" + ] + }, + "passport-control": { + "a": "Passport Control", + "b": "1F6C2", + "j": [ + "control", + "passport", + "custom", + "blue-square" + ] + }, + "customs": { + "a": "Customs", + "b": "1F6C3", + "j": [ + "passport", + "border", + "blue-square" + ] + }, + "baggage-claim": { + "a": "Baggage Claim", + "b": "1F6C4", + "j": [ + "baggage", + "claim", + "blue-square", + "airport", + "transport" + ] + }, + "left-luggage": { + "a": "Left Luggage", + "b": "1F6C5", + "j": [ + "baggage", + "locker", + "luggage", + "blue-square", + "travel" + ] + }, + "warning": { + "a": "Warning", + "b": "26A0", + "j": [ + "exclamation", + "wip", + "alert", + "error", + "problem", + "issue" + ] + }, + "children-crossing": { + "a": "Children Crossing", + "b": "1F6B8", + "j": [ + "child", + "crossing", + "pedestrian", + "traffic", + "school", + "warning", + "danger", + "sign", + "driving", + "yellow-diamond" + ] + }, + "no-entry": { + "a": "No Entry", + "b": "26D4", + "j": [ + "entry", + "forbidden", + "no", + "not", + "prohibited", + "traffic", + "limit", + "security", + "privacy", + "bad", + "denied", + "stop", + "circle" + ] + }, + "prohibited": { + "a": "Prohibited", + "b": "1F6AB", + "j": [ + "entry", + "forbidden", + "no", + "not", + "forbid", + "stop", + "limit", + "denied", + "disallow", + "circle" + ] + }, + "no-bicycles": { + "a": "No Bicycles", + "b": "1F6B3", + "j": [ + "bicycle", + "bike", + "forbidden", + "no", + "prohibited", + "cyclist", + "circle" + ] + }, + "no-smoking": { + "a": "No Smoking", + "b": "1F6AD", + "j": [ + "forbidden", + "no", + "not", + "prohibited", + "smoking", + "cigarette", + "blue-square", + "smell", + "smoke" + ] + }, + "no-littering": { + "a": "No Littering", + "b": "1F6AF", + "j": [ + "forbidden", + "litter", + "no", + "not", + "prohibited", + "trash", + "bin", + "garbage", + "circle" + ] + }, + "nonpotable-water": { + "a": "Non-Potable Water", + "b": "1F6B1", + "j": [ + "non-drinking", + "non-potable", + "water", + "non_potable_water", + "drink", + "faucet", + "tap", + "circle" + ] + }, + "no-pedestrians": { + "a": "No Pedestrians", + "b": "1F6B7", + "j": [ + "forbidden", + "no", + "not", + "pedestrian", + "prohibited", + "rules", + "crossing", + "walking", + "circle" + ] + }, + "no-mobile-phones": { + "a": "No Mobile Phones", + "b": "1F4F5", + "j": [ + "cell", + "forbidden", + "mobile", + "no", + "phone", + "iphone", + "mute", + "circle" + ] + }, + "no-one-under-eighteen": { + "a": "No One Under Eighteen", + "b": "1F51E", + "j": [ + "18", + "age restriction", + "eighteen", + "prohibited", + "underage", + "drink", + "pub", + "night", + "minor", + "circle" + ] + }, + "radioactive": { + "a": "Radioactive", + "b": "2622", + "j": [ + "sign", + "nuclear", + "danger" + ] + }, + "biohazard": { + "a": "Biohazard", + "b": "2623", + "j": [ + "sign", + "danger" + ] + }, + "up-arrow": { + "a": "Up Arrow", + "b": "2B06", + "j": [ + "arrow", + "cardinal", + "direction", + "north", + "blue-square", + "continue", + "top" + ] + }, + "upright-arrow": { + "a": "Up-Right Arrow", + "b": "2197", + "j": [ + "arrow", + "direction", + "intercardinal", + "northeast", + "up-right arrow", + "up_right_arrow", + "blue-square", + "point", + "diagonal" + ] + }, + "right-arrow": { + "a": "Right Arrow", + "b": "27A1", + "j": [ + "arrow", + "cardinal", + "direction", + "east", + "blue-square", + "next" + ] + }, + "downright-arrow": { + "a": "Down-Right Arrow", + "b": "2198", + "j": [ + "arrow", + "direction", + "down-right arrow", + "intercardinal", + "southeast", + "down_right_arrow", + "blue-square", + "diagonal" + ] + }, + "down-arrow": { + "a": "Down Arrow", + "b": "2B07", + "j": [ + "arrow", + "cardinal", + "direction", + "down", + "south", + "blue-square", + "bottom" + ] + }, + "downleft-arrow": { + "a": "Down-Left Arrow", + "b": "2199", + "j": [ + "arrow", + "direction", + "down-left arrow", + "intercardinal", + "southwest", + "down_left_arrow", + "blue-square", + "diagonal" + ] + }, + "left-arrow": { + "a": "Left Arrow", + "b": "2B05", + "j": [ + "arrow", + "cardinal", + "direction", + "west", + "blue-square", + "previous", + "back" + ] + }, + "upleft-arrow": { + "a": "Up-Left Arrow", + "b": "2196", + "j": [ + "arrow", + "direction", + "intercardinal", + "northwest", + "up-left arrow", + "up_left_arrow", + "blue-square", + "point", + "diagonal" + ] + }, + "updown-arrow": { + "a": "Up-Down Arrow", + "b": "2195", + "j": [ + "arrow", + "up-down arrow", + "up_down_arrow", + "blue-square", + "direction", + "way", + "vertical" + ] + }, + "leftright-arrow": { + "a": "Left-Right Arrow", + "b": "2194", + "j": [ + "arrow", + "left-right arrow", + "left_right_arrow", + "shape", + "direction", + "horizontal", + "sideways" + ] + }, + "right-arrow-curving-left": { + "a": "Right Arrow Curving Left", + "b": "21A9", + "j": [ + "arrow", + "back", + "return", + "blue-square", + "undo", + "enter" + ] + }, + "left-arrow-curving-right": { + "a": "Left Arrow Curving Right", + "b": "21AA", + "j": [ + "arrow", + "blue-square", + "return", + "rotate", + "direction" + ] + }, + "right-arrow-curving-up": { + "a": "Right Arrow Curving Up", + "b": "2934", + "j": [ + "arrow", + "blue-square", + "direction", + "top" + ] + }, + "right-arrow-curving-down": { + "a": "Right Arrow Curving Down", + "b": "2935", + "j": [ + "arrow", + "down", + "blue-square", + "direction", + "bottom" + ] + }, + "clockwise-vertical-arrows": { + "a": "Clockwise Vertical Arrows", + "b": "1F503", + "j": [ + "arrow", + "clockwise", + "reload", + "sync", + "cycle", + "round", + "repeat" + ] + }, + "counterclockwise-arrows-button": { + "a": "Counterclockwise Arrows Button", + "b": "1F504", + "j": [ + "anticlockwise", + "arrow", + "counterclockwise", + "withershins", + "blue-square", + "sync", + "cycle" + ] + }, + "back-arrow": { + "a": "Back Arrow", + "b": "1F519", + "j": [ + "arrow", + "back", + "BACK arrow", + "words", + "return" + ] + }, + "end-arrow": { + "a": "End Arrow", + "b": "1F51A", + "j": [ + "arrow", + "end", + "END arrow", + "words" + ] + }, + "on-arrow": { + "a": "On! Arrow", + "b": "1F51B", + "j": [ + "arrow", + "mark", + "on", + "ON! arrow", + "words" + ] + }, + "soon-arrow": { + "a": "Soon Arrow", + "b": "1F51C", + "j": [ + "arrow", + "soon", + "SOON arrow", + "words" + ] + }, + "top-arrow": { + "a": "Top Arrow", + "b": "1F51D", + "j": [ + "arrow", + "top", + "TOP arrow", + "up", + "words", + "blue-square" + ] + }, + "place-of-worship": { + "a": "Place of Worship", + "b": "1F6D0", + "j": [ + "religion", + "worship", + "church", + "temple", + "prayer" + ] + }, + "atom-symbol": { + "a": "Atom Symbol", + "b": "269B", + "j": [ + "atheist", + "atom", + "science", + "physics", + "chemistry" + ] + }, + "om": { + "a": "Om", + "b": "1F549", + "j": [ + "Hindu", + "religion", + "hinduism", + "buddhism", + "sikhism", + "jainism" + ] + }, + "star-of-david": { + "a": "Star of David", + "b": "2721", + "j": [ + "David", + "Jew", + "Jewish", + "religion", + "star", + "star of David", + "judaism" + ] + }, + "wheel-of-dharma": { + "a": "Wheel of Dharma", + "b": "2638", + "j": [ + "Buddhist", + "dharma", + "religion", + "wheel", + "hinduism", + "buddhism", + "sikhism", + "jainism" + ] + }, + "yin-yang": { + "a": "Yin Yang", + "b": "262F", + "j": [ + "religion", + "tao", + "taoist", + "yang", + "yin", + "balance" + ] + }, + "latin-cross": { + "a": "Latin Cross", + "b": "271D", + "j": [ + "Christian", + "cross", + "religion", + "christianity" + ] + }, + "orthodox-cross": { + "a": "Orthodox Cross", + "b": "2626", + "j": [ + "Christian", + "cross", + "religion", + "suppedaneum" + ] + }, + "star-and-crescent": { + "a": "Star and Crescent", + "b": "262A", + "j": [ + "islam", + "Muslim", + "religion" + ] + }, + "peace-symbol": { + "a": "Peace Symbol", + "b": "262E", + "j": [ + "peace", + "hippie" + ] + }, + "menorah": { + "a": "Menorah", + "b": "1F54E", + "j": [ + "candelabrum", + "candlestick", + "religion", + "hanukkah", + "candles", + "jewish" + ] + }, + "dotted-sixpointed-star": { + "a": "Dotted Six-Pointed Star", + "b": "1F52F", + "j": [ + "dotted six-pointed star", + "fortune", + "star", + "dotted_six_pointed_star", + "purple-square", + "religion", + "jewish", + "hexagram" + ] + }, + "aries": { + "a": "Aries", + "b": "2648", + "j": [ + "ram", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "taurus": { + "a": "Taurus", + "b": "2649", + "j": [ + "bull", + "ox", + "zodiac", + "purple-square", + "sign", + "astrology" + ] + }, + "gemini": { + "a": "Gemini", + "b": "264A", + "j": [ + "twins", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "cancer": { + "a": "Cancer", + "b": "264B", + "j": [ + "crab", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "leo": { + "a": "Leo", + "b": "264C", + "j": [ + "lion", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "virgo": { + "a": "Virgo", + "b": "264D", + "j": [ + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "libra": { + "a": "Libra", + "b": "264E", + "j": [ + "balance", + "justice", + "scales", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "scorpio": { + "a": "Scorpio", + "b": "264F", + "j": [ + "scorpion", + "scorpius", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "sagittarius": { + "a": "Sagittarius", + "b": "2650", + "j": [ + "archer", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "capricorn": { + "a": "Capricorn", + "b": "2651", + "j": [ + "goat", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "aquarius": { + "a": "Aquarius", + "b": "2652", + "j": [ + "bearer", + "water", + "zodiac", + "sign", + "purple-square", + "astrology" + ] + }, + "pisces": { + "a": "Pisces", + "b": "2653", + "j": [ + "fish", + "zodiac", + "purple-square", + "sign", + "astrology" + ] + }, + "ophiuchus": { + "a": "Ophiuchus", + "b": "26CE", + "j": [ + "bearer", + "serpent", + "snake", + "zodiac", + "sign", + "purple-square", + "constellation", + "astrology" + ] + }, + "shuffle-tracks-button": { + "a": "Shuffle Tracks Button", + "b": "1F500", + "j": [ + "arrow", + "crossed", + "blue-square", + "shuffle", + "music", + "random" + ] + }, + "repeat-button": { + "a": "Repeat Button", + "b": "1F501", + "j": [ + "arrow", + "clockwise", + "repeat", + "loop", + "record" + ] + }, + "repeat-single-button": { + "a": "Repeat Single Button", + "b": "1F502", + "j": [ + "arrow", + "clockwise", + "once", + "blue-square", + "loop" + ] + }, + "play-button": { + "a": "Play Button", + "b": "25B6", + "j": [ + "arrow", + "play", + "right", + "triangle", + "blue-square", + "direction" + ] + }, + "fastforward-button": { + "a": "Fast-Forward Button", + "b": "23E9", + "j": [ + "arrow", + "double", + "fast", + "fast-forward button", + "forward", + "fast_forward_button", + "blue-square", + "play", + "speed", + "continue" + ] + }, + "next-track-button": { + "a": "Next Track Button", + "b": "23ED", + "j": [ + "arrow", + "next scene", + "next track", + "triangle", + "forward", + "next", + "blue-square" + ] + }, + "play-or-pause-button": { + "a": "Play or Pause Button", + "b": "23EF", + "j": [ + "arrow", + "pause", + "play", + "right", + "triangle", + "blue-square" + ] + }, + "reverse-button": { + "a": "Reverse Button", + "b": "25C0", + "j": [ + "arrow", + "left", + "reverse", + "triangle", + "blue-square", + "direction" + ] + }, + "fast-reverse-button": { + "a": "Fast Reverse Button", + "b": "23EA", + "j": [ + "arrow", + "double", + "rewind", + "play", + "blue-square" + ] + }, + "last-track-button": { + "a": "Last Track Button", + "b": "23EE", + "j": [ + "arrow", + "previous scene", + "previous track", + "triangle", + "backward" + ] + }, + "upwards-button": { + "a": "Upwards Button", + "b": "1F53C", + "j": [ + "arrow", + "button", + "red", + "blue-square", + "triangle", + "direction", + "point", + "forward", + "top" + ] + }, + "fast-up-button": { + "a": "Fast Up Button", + "b": "23EB", + "j": [ + "arrow", + "double", + "blue-square", + "direction", + "top" + ] + }, + "downwards-button": { + "a": "Downwards Button", + "b": "1F53D", + "j": [ + "arrow", + "button", + "down", + "red", + "blue-square", + "direction", + "bottom" + ] + }, + "fast-down-button": { + "a": "Fast Down Button", + "b": "23EC", + "j": [ + "arrow", + "double", + "down", + "blue-square", + "direction", + "bottom" + ] + }, + "pause-button": { + "a": "Pause Button", + "b": "23F8", + "j": [ + "bar", + "double", + "pause", + "vertical", + "blue-square" + ] + }, + "stop-button": { + "a": "Stop Button", + "b": "23F9", + "j": [ + "square", + "stop", + "blue-square" + ] + }, + "record-button": { + "a": "Record Button", + "b": "23FA", + "j": [ + "circle", + "record", + "blue-square" + ] + }, + "eject-button": { + "a": "Eject Button", + "b": "23CF", + "j": [ + "eject", + "blue-square" + ] + }, + "cinema": { + "a": "Cinema", + "b": "1F3A6", + "j": [ + "camera", + "film", + "movie", + "blue-square", + "record", + "curtain", + "stage", + "theater" + ] + }, + "dim-button": { + "a": "Dim Button", + "b": "1F505", + "j": [ + "brightness", + "dim", + "low", + "sun", + "afternoon", + "warm", + "summer" + ] + }, + "bright-button": { + "a": "Bright Button", + "b": "1F506", + "j": [ + "bright", + "brightness", + "sun", + "light" + ] + }, + "antenna-bars": { + "a": "Antenna Bars", + "b": "1F4F6", + "j": [ + "antenna", + "bar", + "cell", + "mobile", + "phone", + "blue-square", + "reception", + "internet", + "connection", + "wifi", + "bluetooth", + "bars" + ] + }, + "vibration-mode": { + "a": "Vibration Mode", + "b": "1F4F3", + "j": [ + "cell", + "mobile", + "mode", + "phone", + "telephone", + "vibration", + "orange-square" + ] + }, + "mobile-phone-off": { + "a": "Mobile Phone off", + "b": "1F4F4", + "j": [ + "cell", + "mobile", + "off", + "phone", + "telephone", + "mute", + "orange-square", + "silence", + "quiet" + ] + }, + "female-sign": { + "a": "Female Sign", + "b": "2640", + "j": [ + "woman", + "women", + "lady", + "girl" + ] + }, + "male-sign": { + "a": "Male Sign", + "b": "2642", + "j": [ + "man", + "boy", + "men" + ] + }, + "transgender-symbol": { + "a": "Transgender Symbol", + "b": "26A7", + "j": [ + "transgender", + "lgbtq" + ] + }, + "multiply": { + "a": "Multiply", + "b": "2716", + "j": [ + "×", + "cancel", + "multiplication", + "sign", + "x", + "multiplication_sign", + "math", + "calculation" + ] + }, + "plus": { + "a": "Plus", + "b": "2795", + "j": [ + "+", + "math", + "sign", + "plus_sign", + "calculation", + "addition", + "more", + "increase" + ] + }, + "minus": { + "a": "Minus", + "b": "2796", + "j": [ + "-", + "−", + "math", + "sign", + "minus_sign", + "calculation", + "subtract", + "less" + ] + }, + "divide": { + "a": "Divide", + "b": "2797", + "j": [ + "÷", + "division", + "math", + "sign", + "division_sign", + "calculation" + ] + }, + "infinity": { + "a": "Infinity", + "b": "267E", + "j": [ + "forever", + "unbounded", + "universal" + ] + }, + "double-exclamation-mark": { + "a": "Double Exclamation Mark", + "b": "203C", + "j": [ + "!", + "!!", + "bangbang", + "exclamation", + "mark", + "surprise" + ] + }, + "exclamation-question-mark": { + "a": "Exclamation Question Mark", + "b": "2049", + "j": [ + "!", + "!?", + "?", + "exclamation", + "interrobang", + "mark", + "punctuation", + "question", + "wat", + "surprise" + ] + }, + "red-question-mark": { + "a": "Red Question Mark", + "b": "2753", + "j": [ + "?", + "mark", + "punctuation", + "question", + "question_mark", + "doubt", + "confused" + ] + }, + "white-question-mark": { + "a": "White Question Mark", + "b": "2754", + "j": [ + "?", + "mark", + "outlined", + "punctuation", + "question", + "doubts", + "gray", + "huh", + "confused" + ] + }, + "white-exclamation-mark": { + "a": "White Exclamation Mark", + "b": "2755", + "j": [ + "!", + "exclamation", + "mark", + "outlined", + "punctuation", + "surprise", + "gray", + "wow", + "warning" + ] + }, + "red-exclamation-mark": { + "a": "Red Exclamation Mark", + "b": "2757", + "j": [ + "!", + "exclamation", + "mark", + "punctuation", + "exclamation_mark", + "heavy_exclamation_mark", + "danger", + "surprise", + "wow", + "warning" + ] + }, + "wavy-dash": { + "a": "Wavy Dash", + "b": "3030", + "j": [ + "dash", + "punctuation", + "wavy", + "draw", + "line", + "moustache", + "mustache", + "squiggle", + "scribble" + ] + }, + "currency-exchange": { + "a": "Currency Exchange", + "b": "1F4B1", + "j": [ + "bank", + "currency", + "exchange", + "money", + "sales", + "dollar", + "travel" + ] + }, + "heavy-dollar-sign": { + "a": "Heavy Dollar Sign", + "b": "1F4B2", + "j": [ + "currency", + "dollar", + "money", + "sales", + "payment", + "buck" + ] + }, + "medical-symbol": { + "a": "Medical Symbol", + "b": "2695", + "j": [ + "aesculapius", + "medicine", + "staff", + "health", + "hospital" + ] + }, + "recycling-symbol": { + "a": "Recycling Symbol", + "b": "267B", + "j": [ + "recycle", + "arrow", + "environment", + "garbage", + "trash" + ] + }, + "fleurdelis": { + "a": "Fleur-De-Lis", + "b": "269C", + "j": [ + "fleur-de-lis", + "fleur_de_lis", + "decorative", + "scout" + ] + }, + "trident-emblem": { + "a": "Trident Emblem", + "b": "1F531", + "j": [ + "anchor", + "emblem", + "ship", + "tool", + "trident", + "weapon", + "spear" + ] + }, + "name-badge": { + "a": "Name Badge", + "b": "1F4DB", + "j": [ + "badge", + "name", + "fire", + "forbid" + ] + }, + "japanese-symbol-for-beginner": { + "a": "Japanese Symbol for Beginner", + "b": "1F530", + "j": [ + "beginner", + "chevron", + "Japanese", + "Japanese symbol for beginner", + "leaf", + "badge", + "shield" + ] + }, + "hollow-red-circle": { + "a": "Hollow Red Circle", + "b": "2B55", + "j": [ + "circle", + "large", + "o", + "red", + "round" + ] + }, + "check-mark-button": { + "a": "Check Mark Button", + "b": "2705", + "j": [ + "✓", + "button", + "check", + "mark", + "green-square", + "ok", + "agree", + "vote", + "election", + "answer", + "tick" + ] + }, + "check-box-with-check": { + "a": "Check Box with Check", + "b": "2611", + "j": [ + "✓", + "box", + "check", + "ok", + "agree", + "confirm", + "black-square", + "vote", + "election", + "yes", + "tick" + ] + }, + "check-mark": { + "a": "Check Mark", + "b": "2714", + "j": [ + "✓", + "check", + "mark", + "ok", + "nike", + "answer", + "yes", + "tick" + ] + }, + "cross-mark": { + "a": "Cross Mark", + "b": "274C", + "j": [ + "×", + "cancel", + "cross", + "mark", + "multiplication", + "multiply", + "x", + "no", + "delete", + "remove", + "red" + ] + }, + "cross-mark-button": { + "a": "Cross Mark Button", + "b": "274E", + "j": [ + "×", + "mark", + "square", + "x", + "green-square", + "no", + "deny" + ] + }, + "curly-loop": { + "a": "Curly Loop", + "b": "27B0", + "j": [ + "curl", + "loop", + "scribble", + "draw", + "shape", + "squiggle" + ] + }, + "double-curly-loop": { + "a": "Double Curly Loop", + "b": "27BF", + "j": [ + "curl", + "double", + "loop", + "tape", + "cassette" + ] + }, + "part-alternation-mark": { + "a": "Part Alternation Mark", + "b": "303D", + "j": [ + "mark", + "part", + "graph", + "presentation", + "stats", + "business", + "economics", + "bad" + ] + }, + "eightspoked-asterisk": { + "a": "Eight-Spoked Asterisk", + "b": "2733", + "j": [ + "*", + "asterisk", + "eight-spoked asterisk", + "eight_spoked_asterisk", + "star", + "sparkle", + "green-square" + ] + }, + "eightpointed-star": { + "a": "Eight-Pointed Star", + "b": "2734", + "j": [ + "*", + "eight-pointed star", + "star", + "eight_pointed_star", + "orange-square", + "shape", + "polygon" + ] + }, + "sparkle": { + "a": "Sparkle", + "b": "2747", + "j": [ + "*", + "stars", + "green-square", + "awesome", + "good", + "fireworks" + ] + }, + "copyright": { + "a": "Copyright", + "b": "00A9", + "j": [ + "c", + "ip", + "license", + "circle", + "law", + "legal" + ] + }, + "registered": { + "a": "Registered", + "b": "00AE", + "j": [ + "r", + "alphabet", + "circle" + ] + }, + "trade-mark": { + "a": "Trade Mark", + "b": "2122", + "j": [ + "mark", + "tm", + "trademark", + "brand", + "law", + "legal" + ] + }, + "keycap": { + "a": "Keycap: *", + "b": "002A-FE0F-20E3", + "j": [ + "keycap_", + "star" + ] + }, + "keycap-0": { + "a": "Keycap: 0", + "b": "0030-FE0F-20E3", + "j": [ + "keycap", + "0", + "numbers", + "blue-square", + "null" + ] + }, + "keycap-1": { + "a": "Keycap: 1", + "b": "0031-FE0F-20E3", + "j": [ + "keycap", + "blue-square", + "numbers", + "1" + ] + }, + "keycap-2": { + "a": "Keycap: 2", + "b": "0032-FE0F-20E3", + "j": [ + "keycap", + "numbers", + "2", + "prime", + "blue-square" + ] + }, + "keycap-3": { + "a": "Keycap: 3", + "b": "0033-FE0F-20E3", + "j": [ + "keycap", + "3", + "numbers", + "prime", + "blue-square" + ] + }, + "keycap-4": { + "a": "Keycap: 4", + "b": "0034-FE0F-20E3", + "j": [ + "keycap", + "4", + "numbers", + "blue-square" + ] + }, + "keycap-5": { + "a": "Keycap: 5", + "b": "0035-FE0F-20E3", + "j": [ + "keycap", + "5", + "numbers", + "blue-square", + "prime" + ] + }, + "keycap-6": { + "a": "Keycap: 6", + "b": "0036-FE0F-20E3", + "j": [ + "keycap", + "6", + "numbers", + "blue-square" + ] + }, + "keycap-7": { + "a": "Keycap: 7", + "b": "0037-FE0F-20E3", + "j": [ + "keycap", + "7", + "numbers", + "blue-square", + "prime" + ] + }, + "keycap-8": { + "a": "Keycap: 8", + "b": "0038-FE0F-20E3", + "j": [ + "keycap", + "8", + "blue-square", + "numbers" + ] + }, + "keycap-9": { + "a": "Keycap: 9", + "b": "0039-FE0F-20E3", + "j": [ + "keycap", + "blue-square", + "numbers", + "9" + ] + }, + "keycap-10": { + "a": "Keycap: 10", + "b": "1F51F", + "j": [ + "keycap", + "numbers", + "10", + "blue-square" + ] + }, + "input-latin-uppercase": { + "a": "Input Latin Uppercase", + "b": "1F520", + "j": [ + "ABCD", + "input", + "latin", + "letters", + "uppercase", + "alphabet", + "words", + "blue-square" + ] + }, + "input-latin-lowercase": { + "a": "Input Latin Lowercase", + "b": "1F521", + "j": [ + "abcd", + "input", + "latin", + "letters", + "lowercase", + "blue-square", + "alphabet" + ] + }, + "input-numbers": { + "a": "Input Numbers", + "b": "1F522", + "j": [ + "1234", + "input", + "numbers", + "blue-square" + ] + }, + "input-symbols": { + "a": "Input Symbols", + "b": "1F523", + "j": [ + "〒♪&%", + "input", + "blue-square", + "music", + "note", + "ampersand", + "percent", + "glyphs", + "characters" + ] + }, + "input-latin-letters": { + "a": "Input Latin Letters", + "b": "1F524", + "j": [ + "abc", + "alphabet", + "input", + "latin", + "letters", + "blue-square" + ] + }, + "a-button-blood-type": { + "a": "A Button (Blood Type)", + "b": "1F170", + "j": [ + "a", + "A button (blood type)", + "blood type", + "a_button", + "red-square", + "alphabet", + "letter" + ] + }, + "ab-button-blood-type": { + "a": "Ab Button (Blood Type)", + "b": "1F18E", + "j": [ + "ab", + "AB button (blood type)", + "blood type", + "ab_button", + "red-square", + "alphabet" + ] + }, + "b-button-blood-type": { + "a": "B Button (Blood Type)", + "b": "1F171", + "j": [ + "b", + "B button (blood type)", + "blood type", + "b_button", + "red-square", + "alphabet", + "letter" + ] + }, + "cl-button": { + "a": "Cl Button", + "b": "1F191", + "j": [ + "cl", + "CL button", + "alphabet", + "words", + "red-square" + ] + }, + "cool-button": { + "a": "Cool Button", + "b": "1F192", + "j": [ + "cool", + "COOL button", + "words", + "blue-square" + ] + }, + "free-button": { + "a": "Free Button", + "b": "1F193", + "j": [ + "free", + "FREE button", + "blue-square", + "words" + ] + }, + "information": { + "a": "Information", + "b": "2139", + "j": [ + "i", + "blue-square", + "alphabet", + "letter" + ] + }, + "id-button": { + "a": "Id Button", + "b": "1F194", + "j": [ + "id", + "ID button", + "identity", + "purple-square", + "words" + ] + }, + "circled-m": { + "a": "Circled M", + "b": "24C2", + "j": [ + "circle", + "circled M", + "m", + "alphabet", + "blue-circle", + "letter" + ] + }, + "new-button": { + "a": "New Button", + "b": "1F195", + "j": [ + "new", + "NEW button", + "blue-square", + "words", + "start" + ] + }, + "ng-button": { + "a": "Ng Button", + "b": "1F196", + "j": [ + "ng", + "NG button", + "blue-square", + "words", + "shape", + "icon" + ] + }, + "o-button-blood-type": { + "a": "O Button (Blood Type)", + "b": "1F17E", + "j": [ + "blood type", + "o", + "O button (blood type)", + "o_button", + "alphabet", + "red-square", + "letter" + ] + }, + "ok-button": { + "a": "Ok Button", + "b": "1F197", + "j": [ + "OK", + "OK button", + "good", + "agree", + "yes", + "blue-square" + ] + }, + "p-button": { + "a": "P Button", + "b": "1F17F", + "j": [ + "P button", + "parking", + "cars", + "blue-square", + "alphabet", + "letter" + ] + }, + "sos-button": { + "a": "Sos Button", + "b": "1F198", + "j": [ + "help", + "sos", + "SOS button", + "red-square", + "words", + "emergency", + "911" + ] + }, + "up-button": { + "a": "Up! Button", + "b": "1F199", + "j": [ + "mark", + "up", + "UP! button", + "blue-square", + "above", + "high" + ] + }, + "vs-button": { + "a": "Vs Button", + "b": "1F19A", + "j": [ + "versus", + "vs", + "VS button", + "words", + "orange-square" + ] + }, + "japanese-here-button": { + "a": "Japanese “Here” Button", + "b": "1F201", + "j": [ + "“here”", + "Japanese", + "Japanese “here” button", + "katakana", + "ココ", + "blue-square", + "here", + "japanese", + "destination" + ] + }, + "japanese-service-charge-button": { + "a": "Japanese “Service Charge” Button", + "b": "1F202", + "j": [ + "“service charge”", + "Japanese", + "Japanese “service charge” button", + "katakana", + "サ", + "japanese", + "blue-square" + ] + }, + "japanese-monthly-amount-button": { + "a": "Japanese “Monthly Amount” Button", + "b": "1F237", + "j": [ + "“monthly amount”", + "ideograph", + "Japanese", + "Japanese “monthly amount” button", + "月", + "chinese", + "month", + "moon", + "japanese", + "orange-square", + "kanji" + ] + }, + "japanese-not-free-of-charge-button": { + "a": "Japanese “Not Free of Charge” Button", + "b": "1F236", + "j": [ + "“not free of charge”", + "ideograph", + "Japanese", + "Japanese “not free of charge” button", + "有", + "orange-square", + "chinese", + "have", + "kanji" + ] + }, + "japanese-reserved-button": { + "a": "Japanese “Reserved” Button", + "b": "1F22F", + "j": [ + "“reserved”", + "ideograph", + "Japanese", + "Japanese “reserved” button", + "指", + "chinese", + "point", + "green-square", + "kanji" + ] + }, + "japanese-bargain-button": { + "a": "Japanese “Bargain” Button", + "b": "1F250", + "j": [ + "“bargain”", + "ideograph", + "Japanese", + "Japanese “bargain” button", + "得", + "chinese", + "kanji", + "obtain", + "get", + "circle" + ] + }, + "japanese-discount-button": { + "a": "Japanese “Discount” Button", + "b": "1F239", + "j": [ + "“discount”", + "ideograph", + "Japanese", + "Japanese “discount” button", + "割", + "cut", + "divide", + "chinese", + "kanji", + "pink-square" + ] + }, + "japanese-free-of-charge-button": { + "a": "Japanese “Free of Charge” Button", + "b": "1F21A", + "j": [ + "“free of charge”", + "ideograph", + "Japanese", + "Japanese “free of charge” button", + "無", + "nothing", + "chinese", + "kanji", + "japanese", + "orange-square" + ] + }, + "japanese-prohibited-button": { + "a": "Japanese “Prohibited” Button", + "b": "1F232", + "j": [ + "“prohibited”", + "ideograph", + "Japanese", + "Japanese “prohibited” button", + "禁", + "kanji", + "japanese", + "chinese", + "forbidden", + "limit", + "restricted", + "red-square" + ] + }, + "japanese-acceptable-button": { + "a": "Japanese “Acceptable” Button", + "b": "1F251", + "j": [ + "“acceptable”", + "ideograph", + "Japanese", + "Japanese “acceptable” button", + "可", + "ok", + "good", + "chinese", + "kanji", + "agree", + "yes", + "orange-circle" + ] + }, + "japanese-application-button": { + "a": "Japanese “Application” Button", + "b": "1F238", + "j": [ + "“application”", + "ideograph", + "Japanese", + "Japanese “application” button", + "申", + "chinese", + "japanese", + "kanji", + "orange-square" + ] + }, + "japanese-passing-grade-button": { + "a": "Japanese “Passing Grade” Button", + "b": "1F234", + "j": [ + "“passing grade”", + "ideograph", + "Japanese", + "Japanese “passing grade” button", + "合", + "japanese", + "chinese", + "join", + "kanji", + "red-square" + ] + }, + "japanese-vacancy-button": { + "a": "Japanese “Vacancy” Button", + "b": "1F233", + "j": [ + "“vacancy”", + "ideograph", + "Japanese", + "Japanese “vacancy” button", + "空", + "kanji", + "japanese", + "chinese", + "empty", + "sky", + "blue-square" + ] + }, + "japanese-congratulations-button": { + "a": "Japanese “Congratulations” Button", + "b": "3297", + "j": [ + "“congratulations”", + "ideograph", + "Japanese", + "Japanese “congratulations” button", + "祝", + "chinese", + "kanji", + "japanese", + "red-circle" + ] + }, + "japanese-secret-button": { + "a": "Japanese “Secret” Button", + "b": "3299", + "j": [ + "“secret”", + "ideograph", + "Japanese", + "Japanese “secret” button", + "秘", + "privacy", + "chinese", + "sshh", + "kanji", + "red-circle" + ] + }, + "japanese-open-for-business-button": { + "a": "Japanese “Open for Business” Button", + "b": "1F23A", + "j": [ + "“open for business”", + "ideograph", + "Japanese", + "Japanese “open for business” button", + "営", + "japanese", + "opening hours", + "orange-square" + ] + }, + "japanese-no-vacancy-button": { + "a": "Japanese “No Vacancy” Button", + "b": "1F235", + "j": [ + "“no vacancy”", + "ideograph", + "Japanese", + "Japanese “no vacancy” button", + "満", + "full", + "chinese", + "japanese", + "red-square", + "kanji" + ] + }, + "red-circle": { + "a": "Red Circle", + "b": "1F534", + "j": [ + "circle", + "geometric", + "red", + "shape", + "error", + "danger" + ] + }, + "orange-circle": { + "a": "Orange Circle", + "b": "1F7E0", + "j": [ + "circle", + "orange", + "round" + ] + }, + "yellow-circle": { + "a": "Yellow Circle", + "b": "1F7E1", + "j": [ + "circle", + "yellow", + "round" + ] + }, + "green-circle": { + "a": "Green Circle", + "b": "1F7E2", + "j": [ + "circle", + "green", + "round" + ] + }, + "blue-circle": { + "a": "Blue Circle", + "b": "1F535", + "j": [ + "blue", + "circle", + "geometric", + "shape", + "icon", + "button" + ] + }, + "purple-circle": { + "a": "Purple Circle", + "b": "1F7E3", + "j": [ + "circle", + "purple", + "round" + ] + }, + "brown-circle": { + "a": "Brown Circle", + "b": "1F7E4", + "j": [ + "brown", + "circle", + "round" + ] + }, + "black-circle": { + "a": "Black Circle", + "b": "26AB", + "j": [ + "circle", + "geometric", + "shape", + "button", + "round" + ] + }, + "white-circle": { + "a": "White Circle", + "b": "26AA", + "j": [ + "circle", + "geometric", + "shape", + "round" + ] + }, + "red-square": { + "a": "Red Square", + "b": "1F7E5", + "j": [ + "red", + "square" + ] + }, + "orange-square": { + "a": "Orange Square", + "b": "1F7E7", + "j": [ + "orange", + "square" + ] + }, + "yellow-square": { + "a": "Yellow Square", + "b": "1F7E8", + "j": [ + "square", + "yellow" + ] + }, + "green-square": { + "a": "Green Square", + "b": "1F7E9", + "j": [ + "green", + "square" + ] + }, + "blue-square": { + "a": "Blue Square", + "b": "1F7E6", + "j": [ + "blue", + "square" + ] + }, + "purple-square": { + "a": "Purple Square", + "b": "1F7EA", + "j": [ + "purple", + "square" + ] + }, + "brown-square": { + "a": "Brown Square", + "b": "1F7EB", + "j": [ + "brown", + "square" + ] + }, + "black-large-square": { + "a": "Black Large Square", + "b": "2B1B", + "j": [ + "geometric", + "square", + "shape", + "icon", + "button" + ] + }, + "white-large-square": { + "a": "White Large Square", + "b": "2B1C", + "j": [ + "geometric", + "square", + "shape", + "icon", + "stone", + "button" + ] + }, + "black-medium-square": { + "a": "Black Medium Square", + "b": "25FC", + "j": [ + "geometric", + "square", + "shape", + "button", + "icon" + ] + }, + "white-medium-square": { + "a": "White Medium Square", + "b": "25FB", + "j": [ + "geometric", + "square", + "shape", + "stone", + "icon" + ] + }, + "black-mediumsmall-square": { + "a": "Black Medium-Small Square", + "b": "25FE", + "j": [ + "black medium-small square", + "geometric", + "square", + "black_medium_small_square", + "icon", + "shape", + "button" + ] + }, + "white-mediumsmall-square": { + "a": "White Medium-Small Square", + "b": "25FD", + "j": [ + "geometric", + "square", + "white medium-small square", + "white_medium_small_square", + "shape", + "stone", + "icon", + "button" + ] + }, + "black-small-square": { + "a": "Black Small Square", + "b": "25AA", + "j": [ + "geometric", + "square", + "shape", + "icon" + ] + }, + "white-small-square": { + "a": "White Small Square", + "b": "25AB", + "j": [ + "geometric", + "square", + "shape", + "icon" + ] + }, + "large-orange-diamond": { + "a": "Large Orange Diamond", + "b": "1F536", + "j": [ + "diamond", + "geometric", + "orange", + "shape", + "jewel", + "gem" + ] + }, + "large-blue-diamond": { + "a": "Large Blue Diamond", + "b": "1F537", + "j": [ + "blue", + "diamond", + "geometric", + "shape", + "jewel", + "gem" + ] + }, + "small-orange-diamond": { + "a": "Small Orange Diamond", + "b": "1F538", + "j": [ + "diamond", + "geometric", + "orange", + "shape", + "jewel", + "gem" + ] + }, + "small-blue-diamond": { + "a": "Small Blue Diamond", + "b": "1F539", + "j": [ + "blue", + "diamond", + "geometric", + "shape", + "jewel", + "gem" + ] + }, + "red-triangle-pointed-up": { + "a": "Red Triangle Pointed Up", + "b": "1F53A", + "j": [ + "geometric", + "red", + "shape", + "direction", + "up", + "top" + ] + }, + "red-triangle-pointed-down": { + "a": "Red Triangle Pointed Down", + "b": "1F53B", + "j": [ + "down", + "geometric", + "red", + "shape", + "direction", + "bottom" + ] + }, + "diamond-with-a-dot": { + "a": "Diamond with a Dot", + "b": "1F4A0", + "j": [ + "comic", + "diamond", + "geometric", + "inside", + "jewel", + "blue", + "gem", + "crystal", + "fancy" + ] + }, + "radio-button": { + "a": "Radio Button", + "b": "1F518", + "j": [ + "button", + "geometric", + "radio", + "input", + "old", + "music", + "circle" + ] + }, + "white-square-button": { + "a": "White Square Button", + "b": "1F533", + "j": [ + "button", + "geometric", + "outlined", + "square", + "shape", + "input" + ] + }, + "black-square-button": { + "a": "Black Square Button", + "b": "1F532", + "j": [ + "button", + "geometric", + "square", + "shape", + "input", + "frame" + ] + }, + "chequered-flag": { + "a": "Chequered Flag", + "b": "1F3C1", + "j": [ + "checkered", + "chequered", + "racing", + "contest", + "finishline", + "race", + "gokart" + ] + }, + "triangular-flag": { + "a": "Triangular Flag", + "b": "1F6A9", + "j": [ + "post", + "mark", + "milestone", + "place" + ] + }, + "crossed-flags": { + "a": "Crossed Flags", + "b": "1F38C", + "j": [ + "celebration", + "cross", + "crossed", + "Japanese", + "japanese", + "nation", + "country", + "border" + ] + }, + "black-flag": { + "a": "Black Flag", + "b": "1F3F4", + "j": [ + "waving", + "pirate" + ] + }, + "white-flag": { + "a": "White Flag", + "b": "1F3F3", + "j": [ + "waving", + "losing", + "loser", + "lost", + "surrender", + "give up", + "fail" + ] + }, + "rainbow-flag": { + "a": "Rainbow Flag", + "b": "1F3F3-FE0F-200D-1F308", + "j": [ + "pride", + "rainbow", + "flag", + "gay", + "lgbt", + "glbt", + "queer", + "homosexual", + "lesbian", + "bisexual", + "transgender" + ] + }, + "transgender-flag": { + "a": "Transgender Flag", + "b": "1F3F3-FE0F-200D-26A7-FE0F", + "j": [ + "flag", + "light blue", + "pink", + "transgender", + "white", + "lgbtq" + ] + }, + "pirate-flag": { + "a": "Pirate Flag", + "b": "1F3F4-200D-2620-FE0F", + "j": [ + "Jolly Roger", + "pirate", + "plunder", + "treasure", + "skull", + "crossbones", + "flag", + "banner" + ] + }, + "flag-ascension-island": { + "a": "Flag: Ascension Island", + "b": "1F1E6-1F1E8", + "j": [ + "flag" + ] + }, + "flag-andorra": { + "a": "Flag: Andorra", + "b": "1F1E6-1F1E9", + "j": [ + "flag", + "ad", + "nation", + "country", + "banner" + ] + }, + "flag-united-arab-emirates": { + "a": "Flag: United Arab Emirates", + "b": "1F1E6-1F1EA", + "j": [ + "flag", + "united", + "arab", + "emirates", + "nation", + "country", + "banner" + ] + }, + "flag-afghanistan": { + "a": "Flag: Afghanistan", + "b": "1F1E6-1F1EB", + "j": [ + "flag", + "af", + "nation", + "country", + "banner" + ] + }, + "flag-antigua--barbuda": { + "a": "Flag: Antigua & Barbuda", + "b": "1F1E6-1F1EC", + "j": [ + "flag", + "flag_antigua_barbuda", + "antigua", + "barbuda", + "nation", + "country", + "banner" + ] + }, + "flag-anguilla": { + "a": "Flag: Anguilla", + "b": "1F1E6-1F1EE", + "j": [ + "flag", + "ai", + "nation", + "country", + "banner" + ] + }, + "flag-albania": { + "a": "Flag: Albania", + "b": "1F1E6-1F1F1", + "j": [ + "flag", + "al", + "nation", + "country", + "banner" + ] + }, + "flag-armenia": { + "a": "Flag: Armenia", + "b": "1F1E6-1F1F2", + "j": [ + "flag", + "am", + "nation", + "country", + "banner" + ] + }, + "flag-angola": { + "a": "Flag: Angola", + "b": "1F1E6-1F1F4", + "j": [ + "flag", + "ao", + "nation", + "country", + "banner" + ] + }, + "flag-antarctica": { + "a": "Flag: Antarctica", + "b": "1F1E6-1F1F6", + "j": [ + "flag", + "aq", + "nation", + "country", + "banner" + ] + }, + "flag-argentina": { + "a": "Flag: Argentina", + "b": "1F1E6-1F1F7", + "j": [ + "flag", + "ar", + "nation", + "country", + "banner" + ] + }, + "flag-american-samoa": { + "a": "Flag: American Samoa", + "b": "1F1E6-1F1F8", + "j": [ + "flag", + "american", + "ws", + "nation", + "country", + "banner" + ] + }, + "flag-austria": { + "a": "Flag: Austria", + "b": "1F1E6-1F1F9", + "j": [ + "flag", + "at", + "nation", + "country", + "banner" + ] + }, + "flag-australia": { + "a": "Flag: Australia", + "b": "1F1E6-1F1FA", + "j": [ + "flag", + "au", + "nation", + "country", + "banner" + ] + }, + "flag-aruba": { + "a": "Flag: Aruba", + "b": "1F1E6-1F1FC", + "j": [ + "flag", + "aw", + "nation", + "country", + "banner" + ] + }, + "flag-land-islands": { + "a": "Flag: Åland Islands", + "b": "1F1E6-1F1FD", + "j": [ + "flag", + "flag_aland_islands", + "Åland", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-azerbaijan": { + "a": "Flag: Azerbaijan", + "b": "1F1E6-1F1FF", + "j": [ + "flag", + "az", + "nation", + "country", + "banner" + ] + }, + "flag-bosnia--herzegovina": { + "a": "Flag: Bosnia & Herzegovina", + "b": "1F1E7-1F1E6", + "j": [ + "flag", + "flag_bosnia_herzegovina", + "bosnia", + "herzegovina", + "nation", + "country", + "banner" + ] + }, + "flag-barbados": { + "a": "Flag: Barbados", + "b": "1F1E7-1F1E7", + "j": [ + "flag", + "bb", + "nation", + "country", + "banner" + ] + }, + "flag-bangladesh": { + "a": "Flag: Bangladesh", + "b": "1F1E7-1F1E9", + "j": [ + "flag", + "bd", + "nation", + "country", + "banner" + ] + }, + "flag-belgium": { + "a": "Flag: Belgium", + "b": "1F1E7-1F1EA", + "j": [ + "flag", + "be", + "nation", + "country", + "banner" + ] + }, + "flag-burkina-faso": { + "a": "Flag: Burkina Faso", + "b": "1F1E7-1F1EB", + "j": [ + "flag", + "burkina", + "faso", + "nation", + "country", + "banner" + ] + }, + "flag-bulgaria": { + "a": "Flag: Bulgaria", + "b": "1F1E7-1F1EC", + "j": [ + "flag", + "bg", + "nation", + "country", + "banner" + ] + }, + "flag-bahrain": { + "a": "Flag: Bahrain", + "b": "1F1E7-1F1ED", + "j": [ + "flag", + "bh", + "nation", + "country", + "banner" + ] + }, + "flag-burundi": { + "a": "Flag: Burundi", + "b": "1F1E7-1F1EE", + "j": [ + "flag", + "bi", + "nation", + "country", + "banner" + ] + }, + "flag-benin": { + "a": "Flag: Benin", + "b": "1F1E7-1F1EF", + "j": [ + "flag", + "bj", + "nation", + "country", + "banner" + ] + }, + "flag-st-barthlemy": { + "a": "Flag: St. Barthélemy", + "b": "1F1E7-1F1F1", + "j": [ + "flag", + "flag_st_barthelemy", + "saint", + "barthélemy", + "nation", + "country", + "banner" + ] + }, + "flag-bermuda": { + "a": "Flag: Bermuda", + "b": "1F1E7-1F1F2", + "j": [ + "flag", + "bm", + "nation", + "country", + "banner" + ] + }, + "flag-brunei": { + "a": "Flag: Brunei", + "b": "1F1E7-1F1F3", + "j": [ + "flag", + "bn", + "darussalam", + "nation", + "country", + "banner" + ] + }, + "flag-bolivia": { + "a": "Flag: Bolivia", + "b": "1F1E7-1F1F4", + "j": [ + "flag", + "bo", + "nation", + "country", + "banner" + ] + }, + "flag-caribbean-netherlands": { + "a": "Flag: Caribbean Netherlands", + "b": "1F1E7-1F1F6", + "j": [ + "flag", + "bonaire", + "nation", + "country", + "banner" + ] + }, + "flag-brazil": { + "a": "Flag: Brazil", + "b": "1F1E7-1F1F7", + "j": [ + "flag", + "br", + "nation", + "country", + "banner" + ] + }, + "flag-bahamas": { + "a": "Flag: Bahamas", + "b": "1F1E7-1F1F8", + "j": [ + "flag", + "bs", + "nation", + "country", + "banner" + ] + }, + "flag-bhutan": { + "a": "Flag: Bhutan", + "b": "1F1E7-1F1F9", + "j": [ + "flag", + "bt", + "nation", + "country", + "banner" + ] + }, + "flag-bouvet-island": { + "a": "Flag: Bouvet Island", + "b": "1F1E7-1F1FB", + "j": [ + "flag", + "norway" + ] + }, + "flag-botswana": { + "a": "Flag: Botswana", + "b": "1F1E7-1F1FC", + "j": [ + "flag", + "bw", + "nation", + "country", + "banner" + ] + }, + "flag-belarus": { + "a": "Flag: Belarus", + "b": "1F1E7-1F1FE", + "j": [ + "flag", + "by", + "nation", + "country", + "banner" + ] + }, + "flag-belize": { + "a": "Flag: Belize", + "b": "1F1E7-1F1FF", + "j": [ + "flag", + "bz", + "nation", + "country", + "banner" + ] + }, + "flag-canada": { + "a": "Flag: Canada", + "b": "1F1E8-1F1E6", + "j": [ + "flag", + "ca", + "nation", + "country", + "banner" + ] + }, + "flag-cocos-keeling-islands": { + "a": "Flag: Cocos (Keeling) Islands", + "b": "1F1E8-1F1E8", + "j": [ + "flag", + "flag_cocos_islands", + "cocos", + "keeling", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-congo--kinshasa": { + "a": "Flag: Congo - Kinshasa", + "b": "1F1E8-1F1E9", + "j": [ + "flag", + "flag_congo_kinshasa", + "congo", + "democratic", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-central-african-republic": { + "a": "Flag: Central African Republic", + "b": "1F1E8-1F1EB", + "j": [ + "flag", + "central", + "african", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-congo--brazzaville": { + "a": "Flag: Congo - Brazzaville", + "b": "1F1E8-1F1EC", + "j": [ + "flag", + "flag_congo_brazzaville", + "congo", + "nation", + "country", + "banner" + ] + }, + "flag-switzerland": { + "a": "Flag: Switzerland", + "b": "1F1E8-1F1ED", + "j": [ + "flag", + "ch", + "nation", + "country", + "banner" + ] + }, + "flag-cte-divoire": { + "a": "Flag: Côte D’Ivoire", + "b": "1F1E8-1F1EE", + "j": [ + "flag", + "flag_cote_d_ivoire", + "ivory", + "coast", + "nation", + "country", + "banner" + ] + }, + "flag-cook-islands": { + "a": "Flag: Cook Islands", + "b": "1F1E8-1F1F0", + "j": [ + "flag", + "cook", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-chile": { + "a": "Flag: Chile", + "b": "1F1E8-1F1F1", + "j": [ + "flag", + "nation", + "country", + "banner" + ] + }, + "flag-cameroon": { + "a": "Flag: Cameroon", + "b": "1F1E8-1F1F2", + "j": [ + "flag", + "cm", + "nation", + "country", + "banner" + ] + }, + "flag-china": { + "a": "Flag: China", + "b": "1F1E8-1F1F3", + "j": [ + "flag", + "china", + "chinese", + "prc", + "country", + "nation", + "banner" + ] + }, + "flag-colombia": { + "a": "Flag: Colombia", + "b": "1F1E8-1F1F4", + "j": [ + "flag", + "co", + "nation", + "country", + "banner" + ] + }, + "flag-clipperton-island": { + "a": "Flag: Clipperton Island", + "b": "1F1E8-1F1F5", + "j": [ + "flag" + ] + }, + "flag-costa-rica": { + "a": "Flag: Costa Rica", + "b": "1F1E8-1F1F7", + "j": [ + "flag", + "costa", + "rica", + "nation", + "country", + "banner" + ] + }, + "flag-cuba": { + "a": "Flag: Cuba", + "b": "1F1E8-1F1FA", + "j": [ + "flag", + "cu", + "nation", + "country", + "banner" + ] + }, + "flag-cape-verde": { + "a": "Flag: Cape Verde", + "b": "1F1E8-1F1FB", + "j": [ + "flag", + "cabo", + "verde", + "nation", + "country", + "banner" + ] + }, + "flag-curaao": { + "a": "Flag: Curaçao", + "b": "1F1E8-1F1FC", + "j": [ + "flag", + "flag_curacao", + "curaçao", + "nation", + "country", + "banner" + ] + }, + "flag-christmas-island": { + "a": "Flag: Christmas Island", + "b": "1F1E8-1F1FD", + "j": [ + "flag", + "christmas", + "island", + "nation", + "country", + "banner" + ] + }, + "flag-cyprus": { + "a": "Flag: Cyprus", + "b": "1F1E8-1F1FE", + "j": [ + "flag", + "cy", + "nation", + "country", + "banner" + ] + }, + "flag-czechia": { + "a": "Flag: Czechia", + "b": "1F1E8-1F1FF", + "j": [ + "flag", + "cz", + "nation", + "country", + "banner" + ] + }, + "flag-germany": { + "a": "Flag: Germany", + "b": "1F1E9-1F1EA", + "j": [ + "flag", + "german", + "nation", + "country", + "banner" + ] + }, + "flag-diego-garcia": { + "a": "Flag: Diego Garcia", + "b": "1F1E9-1F1EC", + "j": [ + "flag" + ] + }, + "flag-djibouti": { + "a": "Flag: Djibouti", + "b": "1F1E9-1F1EF", + "j": [ + "flag", + "dj", + "nation", + "country", + "banner" + ] + }, + "flag-denmark": { + "a": "Flag: Denmark", + "b": "1F1E9-1F1F0", + "j": [ + "flag", + "dk", + "nation", + "country", + "banner" + ] + }, + "flag-dominica": { + "a": "Flag: Dominica", + "b": "1F1E9-1F1F2", + "j": [ + "flag", + "dm", + "nation", + "country", + "banner" + ] + }, + "flag-dominican-republic": { + "a": "Flag: Dominican Republic", + "b": "1F1E9-1F1F4", + "j": [ + "flag", + "dominican", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-algeria": { + "a": "Flag: Algeria", + "b": "1F1E9-1F1FF", + "j": [ + "flag", + "dz", + "nation", + "country", + "banner" + ] + }, + "flag-ceuta--melilla": { + "a": "Flag: Ceuta & Melilla", + "b": "1F1EA-1F1E6", + "j": [ + "flag", + "flag_ceuta_melilla" + ] + }, + "flag-ecuador": { + "a": "Flag: Ecuador", + "b": "1F1EA-1F1E8", + "j": [ + "flag", + "ec", + "nation", + "country", + "banner" + ] + }, + "flag-estonia": { + "a": "Flag: Estonia", + "b": "1F1EA-1F1EA", + "j": [ + "flag", + "ee", + "nation", + "country", + "banner" + ] + }, + "flag-egypt": { + "a": "Flag: Egypt", + "b": "1F1EA-1F1EC", + "j": [ + "flag", + "eg", + "nation", + "country", + "banner" + ] + }, + "flag-western-sahara": { + "a": "Flag: Western Sahara", + "b": "1F1EA-1F1ED", + "j": [ + "flag", + "western", + "sahara", + "nation", + "country", + "banner" + ] + }, + "flag-eritrea": { + "a": "Flag: Eritrea", + "b": "1F1EA-1F1F7", + "j": [ + "flag", + "er", + "nation", + "country", + "banner" + ] + }, + "flag-spain": { + "a": "Flag: Spain", + "b": "1F1EA-1F1F8", + "j": [ + "flag", + "spain", + "nation", + "country", + "banner" + ] + }, + "flag-ethiopia": { + "a": "Flag: Ethiopia", + "b": "1F1EA-1F1F9", + "j": [ + "flag", + "et", + "nation", + "country", + "banner" + ] + }, + "flag-european-union": { + "a": "Flag: European Union", + "b": "1F1EA-1F1FA", + "j": [ + "flag", + "european", + "union", + "banner" + ] + }, + "flag-finland": { + "a": "Flag: Finland", + "b": "1F1EB-1F1EE", + "j": [ + "flag", + "fi", + "nation", + "country", + "banner" + ] + }, + "flag-fiji": { + "a": "Flag: Fiji", + "b": "1F1EB-1F1EF", + "j": [ + "flag", + "fj", + "nation", + "country", + "banner" + ] + }, + "flag-falkland-islands": { + "a": "Flag: Falkland Islands", + "b": "1F1EB-1F1F0", + "j": [ + "flag", + "falkland", + "islands", + "malvinas", + "nation", + "country", + "banner" + ] + }, + "flag-micronesia": { + "a": "Flag: Micronesia", + "b": "1F1EB-1F1F2", + "j": [ + "flag", + "micronesia", + "federated", + "states", + "nation", + "country", + "banner" + ] + }, + "flag-faroe-islands": { + "a": "Flag: Faroe Islands", + "b": "1F1EB-1F1F4", + "j": [ + "flag", + "faroe", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-france": { + "a": "Flag: France", + "b": "1F1EB-1F1F7", + "j": [ + "flag", + "banner", + "nation", + "france", + "french", + "country" + ] + }, + "flag-gabon": { + "a": "Flag: Gabon", + "b": "1F1EC-1F1E6", + "j": [ + "flag", + "ga", + "nation", + "country", + "banner" + ] + }, + "flag-united-kingdom": { + "a": "Flag: United Kingdom", + "b": "1F1EC-1F1E7", + "j": [ + "flag", + "united", + "kingdom", + "great", + "britain", + "northern", + "ireland", + "nation", + "country", + "banner", + "british", + "UK", + "english", + "england", + "union jack" + ] + }, + "flag-grenada": { + "a": "Flag: Grenada", + "b": "1F1EC-1F1E9", + "j": [ + "flag", + "gd", + "nation", + "country", + "banner" + ] + }, + "flag-georgia": { + "a": "Flag: Georgia", + "b": "1F1EC-1F1EA", + "j": [ + "flag", + "ge", + "nation", + "country", + "banner" + ] + }, + "flag-french-guiana": { + "a": "Flag: French Guiana", + "b": "1F1EC-1F1EB", + "j": [ + "flag", + "french", + "guiana", + "nation", + "country", + "banner" + ] + }, + "flag-guernsey": { + "a": "Flag: Guernsey", + "b": "1F1EC-1F1EC", + "j": [ + "flag", + "gg", + "nation", + "country", + "banner" + ] + }, + "flag-ghana": { + "a": "Flag: Ghana", + "b": "1F1EC-1F1ED", + "j": [ + "flag", + "gh", + "nation", + "country", + "banner" + ] + }, + "flag-gibraltar": { + "a": "Flag: Gibraltar", + "b": "1F1EC-1F1EE", + "j": [ + "flag", + "gi", + "nation", + "country", + "banner" + ] + }, + "flag-greenland": { + "a": "Flag: Greenland", + "b": "1F1EC-1F1F1", + "j": [ + "flag", + "gl", + "nation", + "country", + "banner" + ] + }, + "flag-gambia": { + "a": "Flag: Gambia", + "b": "1F1EC-1F1F2", + "j": [ + "flag", + "gm", + "nation", + "country", + "banner" + ] + }, + "flag-guinea": { + "a": "Flag: Guinea", + "b": "1F1EC-1F1F3", + "j": [ + "flag", + "gn", + "nation", + "country", + "banner" + ] + }, + "flag-guadeloupe": { + "a": "Flag: Guadeloupe", + "b": "1F1EC-1F1F5", + "j": [ + "flag", + "gp", + "nation", + "country", + "banner" + ] + }, + "flag-equatorial-guinea": { + "a": "Flag: Equatorial Guinea", + "b": "1F1EC-1F1F6", + "j": [ + "flag", + "equatorial", + "gn", + "nation", + "country", + "banner" + ] + }, + "flag-greece": { + "a": "Flag: Greece", + "b": "1F1EC-1F1F7", + "j": [ + "flag", + "gr", + "nation", + "country", + "banner" + ] + }, + "flag-south-georgia--south-sandwich-islands": { + "a": "Flag: South Georgia & South Sandwich Islands", + "b": "1F1EC-1F1F8", + "j": [ + "flag", + "flag_south_georgia_south_sandwich_islands", + "south", + "georgia", + "sandwich", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-guatemala": { + "a": "Flag: Guatemala", + "b": "1F1EC-1F1F9", + "j": [ + "flag", + "gt", + "nation", + "country", + "banner" + ] + }, + "flag-guam": { + "a": "Flag: Guam", + "b": "1F1EC-1F1FA", + "j": [ + "flag", + "gu", + "nation", + "country", + "banner" + ] + }, + "flag-guineabissau": { + "a": "Flag: Guinea-Bissau", + "b": "1F1EC-1F1FC", + "j": [ + "flag", + "flag_guinea_bissau", + "gw", + "bissau", + "nation", + "country", + "banner" + ] + }, + "flag-guyana": { + "a": "Flag: Guyana", + "b": "1F1EC-1F1FE", + "j": [ + "flag", + "gy", + "nation", + "country", + "banner" + ] + }, + "flag-hong-kong-sar-china": { + "a": "Flag: Hong Kong Sar China", + "b": "1F1ED-1F1F0", + "j": [ + "flag", + "hong", + "kong", + "nation", + "country", + "banner" + ] + }, + "flag-heard--mcdonald-islands": { + "a": "Flag: Heard & Mcdonald Islands", + "b": "1F1ED-1F1F2", + "j": [ + "flag", + "flag_heard_mcdonald_islands" + ] + }, + "flag-honduras": { + "a": "Flag: Honduras", + "b": "1F1ED-1F1F3", + "j": [ + "flag", + "hn", + "nation", + "country", + "banner" + ] + }, + "flag-croatia": { + "a": "Flag: Croatia", + "b": "1F1ED-1F1F7", + "j": [ + "flag", + "hr", + "nation", + "country", + "banner" + ] + }, + "flag-haiti": { + "a": "Flag: Haiti", + "b": "1F1ED-1F1F9", + "j": [ + "flag", + "ht", + "nation", + "country", + "banner" + ] + }, + "flag-hungary": { + "a": "Flag: Hungary", + "b": "1F1ED-1F1FA", + "j": [ + "flag", + "hu", + "nation", + "country", + "banner" + ] + }, + "flag-canary-islands": { + "a": "Flag: Canary Islands", + "b": "1F1EE-1F1E8", + "j": [ + "flag", + "canary", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-indonesia": { + "a": "Flag: Indonesia", + "b": "1F1EE-1F1E9", + "j": [ + "flag", + "nation", + "country", + "banner" + ] + }, + "flag-ireland": { + "a": "Flag: Ireland", + "b": "1F1EE-1F1EA", + "j": [ + "flag", + "ie", + "nation", + "country", + "banner" + ] + }, + "flag-israel": { + "a": "Flag: Israel", + "b": "1F1EE-1F1F1", + "j": [ + "flag", + "il", + "nation", + "country", + "banner" + ] + }, + "flag-isle-of-man": { + "a": "Flag: Isle of Man", + "b": "1F1EE-1F1F2", + "j": [ + "flag", + "isle", + "man", + "nation", + "country", + "banner" + ] + }, + "flag-india": { + "a": "Flag: India", + "b": "1F1EE-1F1F3", + "j": [ + "flag", + "in", + "nation", + "country", + "banner" + ] + }, + "flag-british-indian-ocean-territory": { + "a": "Flag: British Indian Ocean Territory", + "b": "1F1EE-1F1F4", + "j": [ + "flag", + "british", + "indian", + "ocean", + "territory", + "nation", + "country", + "banner" + ] + }, + "flag-iraq": { + "a": "Flag: Iraq", + "b": "1F1EE-1F1F6", + "j": [ + "flag", + "iq", + "nation", + "country", + "banner" + ] + }, + "flag-iran": { + "a": "Flag: Iran", + "b": "1F1EE-1F1F7", + "j": [ + "flag", + "iran", + "islamic", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-iceland": { + "a": "Flag: Iceland", + "b": "1F1EE-1F1F8", + "j": [ + "flag", + "is", + "nation", + "country", + "banner" + ] + }, + "flag-italy": { + "a": "Flag: Italy", + "b": "1F1EE-1F1F9", + "j": [ + "flag", + "italy", + "nation", + "country", + "banner" + ] + }, + "flag-jersey": { + "a": "Flag: Jersey", + "b": "1F1EF-1F1EA", + "j": [ + "flag", + "je", + "nation", + "country", + "banner" + ] + }, + "flag-jamaica": { + "a": "Flag: Jamaica", + "b": "1F1EF-1F1F2", + "j": [ + "flag", + "jm", + "nation", + "country", + "banner" + ] + }, + "flag-jordan": { + "a": "Flag: Jordan", + "b": "1F1EF-1F1F4", + "j": [ + "flag", + "jo", + "nation", + "country", + "banner" + ] + }, + "flag-japan": { + "a": "Flag: Japan", + "b": "1F1EF-1F1F5", + "j": [ + "flag", + "japanese", + "nation", + "country", + "banner" + ] + }, + "flag-kenya": { + "a": "Flag: Kenya", + "b": "1F1F0-1F1EA", + "j": [ + "flag", + "ke", + "nation", + "country", + "banner" + ] + }, + "flag-kyrgyzstan": { + "a": "Flag: Kyrgyzstan", + "b": "1F1F0-1F1EC", + "j": [ + "flag", + "kg", + "nation", + "country", + "banner" + ] + }, + "flag-cambodia": { + "a": "Flag: Cambodia", + "b": "1F1F0-1F1ED", + "j": [ + "flag", + "kh", + "nation", + "country", + "banner" + ] + }, + "flag-kiribati": { + "a": "Flag: Kiribati", + "b": "1F1F0-1F1EE", + "j": [ + "flag", + "ki", + "nation", + "country", + "banner" + ] + }, + "flag-comoros": { + "a": "Flag: Comoros", + "b": "1F1F0-1F1F2", + "j": [ + "flag", + "km", + "nation", + "country", + "banner" + ] + }, + "flag-st-kitts--nevis": { + "a": "Flag: St. Kitts & Nevis", + "b": "1F1F0-1F1F3", + "j": [ + "flag", + "flag_st_kitts_nevis", + "saint", + "kitts", + "nevis", + "nation", + "country", + "banner" + ] + }, + "flag-north-korea": { + "a": "Flag: North Korea", + "b": "1F1F0-1F1F5", + "j": [ + "flag", + "north", + "korea", + "nation", + "country", + "banner" + ] + }, + "flag-south-korea": { + "a": "Flag: South Korea", + "b": "1F1F0-1F1F7", + "j": [ + "flag", + "south", + "korea", + "nation", + "country", + "banner" + ] + }, + "flag-kuwait": { + "a": "Flag: Kuwait", + "b": "1F1F0-1F1FC", + "j": [ + "flag", + "kw", + "nation", + "country", + "banner" + ] + }, + "flag-cayman-islands": { + "a": "Flag: Cayman Islands", + "b": "1F1F0-1F1FE", + "j": [ + "flag", + "cayman", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-kazakhstan": { + "a": "Flag: Kazakhstan", + "b": "1F1F0-1F1FF", + "j": [ + "flag", + "kz", + "nation", + "country", + "banner" + ] + }, + "flag-laos": { + "a": "Flag: Laos", + "b": "1F1F1-1F1E6", + "j": [ + "flag", + "lao", + "democratic", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-lebanon": { + "a": "Flag: Lebanon", + "b": "1F1F1-1F1E7", + "j": [ + "flag", + "lb", + "nation", + "country", + "banner" + ] + }, + "flag-st-lucia": { + "a": "Flag: St. Lucia", + "b": "1F1F1-1F1E8", + "j": [ + "flag", + "saint", + "lucia", + "nation", + "country", + "banner" + ] + }, + "flag-liechtenstein": { + "a": "Flag: Liechtenstein", + "b": "1F1F1-1F1EE", + "j": [ + "flag", + "li", + "nation", + "country", + "banner" + ] + }, + "flag-sri-lanka": { + "a": "Flag: Sri Lanka", + "b": "1F1F1-1F1F0", + "j": [ + "flag", + "sri", + "lanka", + "nation", + "country", + "banner" + ] + }, + "flag-liberia": { + "a": "Flag: Liberia", + "b": "1F1F1-1F1F7", + "j": [ + "flag", + "lr", + "nation", + "country", + "banner" + ] + }, + "flag-lesotho": { + "a": "Flag: Lesotho", + "b": "1F1F1-1F1F8", + "j": [ + "flag", + "ls", + "nation", + "country", + "banner" + ] + }, + "flag-lithuania": { + "a": "Flag: Lithuania", + "b": "1F1F1-1F1F9", + "j": [ + "flag", + "lt", + "nation", + "country", + "banner" + ] + }, + "flag-luxembourg": { + "a": "Flag: Luxembourg", + "b": "1F1F1-1F1FA", + "j": [ + "flag", + "lu", + "nation", + "country", + "banner" + ] + }, + "flag-latvia": { + "a": "Flag: Latvia", + "b": "1F1F1-1F1FB", + "j": [ + "flag", + "lv", + "nation", + "country", + "banner" + ] + }, + "flag-libya": { + "a": "Flag: Libya", + "b": "1F1F1-1F1FE", + "j": [ + "flag", + "ly", + "nation", + "country", + "banner" + ] + }, + "flag-morocco": { + "a": "Flag: Morocco", + "b": "1F1F2-1F1E6", + "j": [ + "flag", + "ma", + "nation", + "country", + "banner" + ] + }, + "flag-monaco": { + "a": "Flag: Monaco", + "b": "1F1F2-1F1E8", + "j": [ + "flag", + "mc", + "nation", + "country", + "banner" + ] + }, + "flag-moldova": { + "a": "Flag: Moldova", + "b": "1F1F2-1F1E9", + "j": [ + "flag", + "moldova", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-montenegro": { + "a": "Flag: Montenegro", + "b": "1F1F2-1F1EA", + "j": [ + "flag", + "me", + "nation", + "country", + "banner" + ] + }, + "flag-st-martin": { + "a": "Flag: St. Martin", + "b": "1F1F2-1F1EB", + "j": [ + "flag" + ] + }, + "flag-madagascar": { + "a": "Flag: Madagascar", + "b": "1F1F2-1F1EC", + "j": [ + "flag", + "mg", + "nation", + "country", + "banner" + ] + }, + "flag-marshall-islands": { + "a": "Flag: Marshall Islands", + "b": "1F1F2-1F1ED", + "j": [ + "flag", + "marshall", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-north-macedonia": { + "a": "Flag: North Macedonia", + "b": "1F1F2-1F1F0", + "j": [ + "flag", + "macedonia", + "nation", + "country", + "banner" + ] + }, + "flag-mali": { + "a": "Flag: Mali", + "b": "1F1F2-1F1F1", + "j": [ + "flag", + "ml", + "nation", + "country", + "banner" + ] + }, + "flag-myanmar-burma": { + "a": "Flag: Myanmar (Burma)", + "b": "1F1F2-1F1F2", + "j": [ + "flag", + "flag_myanmar", + "mm", + "nation", + "country", + "banner" + ] + }, + "flag-mongolia": { + "a": "Flag: Mongolia", + "b": "1F1F2-1F1F3", + "j": [ + "flag", + "mn", + "nation", + "country", + "banner" + ] + }, + "flag-macao-sar-china": { + "a": "Flag: Macao Sar China", + "b": "1F1F2-1F1F4", + "j": [ + "flag", + "macao", + "nation", + "country", + "banner" + ] + }, + "flag-northern-mariana-islands": { + "a": "Flag: Northern Mariana Islands", + "b": "1F1F2-1F1F5", + "j": [ + "flag", + "northern", + "mariana", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-martinique": { + "a": "Flag: Martinique", + "b": "1F1F2-1F1F6", + "j": [ + "flag", + "mq", + "nation", + "country", + "banner" + ] + }, + "flag-mauritania": { + "a": "Flag: Mauritania", + "b": "1F1F2-1F1F7", + "j": [ + "flag", + "mr", + "nation", + "country", + "banner" + ] + }, + "flag-montserrat": { + "a": "Flag: Montserrat", + "b": "1F1F2-1F1F8", + "j": [ + "flag", + "ms", + "nation", + "country", + "banner" + ] + }, + "flag-malta": { + "a": "Flag: Malta", + "b": "1F1F2-1F1F9", + "j": [ + "flag", + "mt", + "nation", + "country", + "banner" + ] + }, + "flag-mauritius": { + "a": "Flag: Mauritius", + "b": "1F1F2-1F1FA", + "j": [ + "flag", + "mu", + "nation", + "country", + "banner" + ] + }, + "flag-maldives": { + "a": "Flag: Maldives", + "b": "1F1F2-1F1FB", + "j": [ + "flag", + "mv", + "nation", + "country", + "banner" + ] + }, + "flag-malawi": { + "a": "Flag: Malawi", + "b": "1F1F2-1F1FC", + "j": [ + "flag", + "mw", + "nation", + "country", + "banner" + ] + }, + "flag-mexico": { + "a": "Flag: Mexico", + "b": "1F1F2-1F1FD", + "j": [ + "flag", + "mx", + "nation", + "country", + "banner" + ] + }, + "flag-malaysia": { + "a": "Flag: Malaysia", + "b": "1F1F2-1F1FE", + "j": [ + "flag", + "my", + "nation", + "country", + "banner" + ] + }, + "flag-mozambique": { + "a": "Flag: Mozambique", + "b": "1F1F2-1F1FF", + "j": [ + "flag", + "mz", + "nation", + "country", + "banner" + ] + }, + "flag-namibia": { + "a": "Flag: Namibia", + "b": "1F1F3-1F1E6", + "j": [ + "flag", + "na", + "nation", + "country", + "banner" + ] + }, + "flag-new-caledonia": { + "a": "Flag: New Caledonia", + "b": "1F1F3-1F1E8", + "j": [ + "flag", + "new", + "caledonia", + "nation", + "country", + "banner" + ] + }, + "flag-niger": { + "a": "Flag: Niger", + "b": "1F1F3-1F1EA", + "j": [ + "flag", + "ne", + "nation", + "country", + "banner" + ] + }, + "flag-norfolk-island": { + "a": "Flag: Norfolk Island", + "b": "1F1F3-1F1EB", + "j": [ + "flag", + "norfolk", + "island", + "nation", + "country", + "banner" + ] + }, + "flag-nigeria": { + "a": "Flag: Nigeria", + "b": "1F1F3-1F1EC", + "j": [ + "flag", + "nation", + "country", + "banner" + ] + }, + "flag-nicaragua": { + "a": "Flag: Nicaragua", + "b": "1F1F3-1F1EE", + "j": [ + "flag", + "ni", + "nation", + "country", + "banner" + ] + }, + "flag-netherlands": { + "a": "Flag: Netherlands", + "b": "1F1F3-1F1F1", + "j": [ + "flag", + "nl", + "nation", + "country", + "banner" + ] + }, + "flag-norway": { + "a": "Flag: Norway", + "b": "1F1F3-1F1F4", + "j": [ + "flag", + "no", + "nation", + "country", + "banner" + ] + }, + "flag-nepal": { + "a": "Flag: Nepal", + "b": "1F1F3-1F1F5", + "j": [ + "flag", + "np", + "nation", + "country", + "banner" + ] + }, + "flag-nauru": { + "a": "Flag: Nauru", + "b": "1F1F3-1F1F7", + "j": [ + "flag", + "nr", + "nation", + "country", + "banner" + ] + }, + "flag-niue": { + "a": "Flag: Niue", + "b": "1F1F3-1F1FA", + "j": [ + "flag", + "nu", + "nation", + "country", + "banner" + ] + }, + "flag-new-zealand": { + "a": "Flag: New Zealand", + "b": "1F1F3-1F1FF", + "j": [ + "flag", + "new", + "zealand", + "nation", + "country", + "banner" + ] + }, + "flag-oman": { + "a": "Flag: Oman", + "b": "1F1F4-1F1F2", + "j": [ + "flag", + "om_symbol", + "nation", + "country", + "banner" + ] + }, + "flag-panama": { + "a": "Flag: Panama", + "b": "1F1F5-1F1E6", + "j": [ + "flag", + "pa", + "nation", + "country", + "banner" + ] + }, + "flag-peru": { + "a": "Flag: Peru", + "b": "1F1F5-1F1EA", + "j": [ + "flag", + "pe", + "nation", + "country", + "banner" + ] + }, + "flag-french-polynesia": { + "a": "Flag: French Polynesia", + "b": "1F1F5-1F1EB", + "j": [ + "flag", + "french", + "polynesia", + "nation", + "country", + "banner" + ] + }, + "flag-papua-new-guinea": { + "a": "Flag: Papua New Guinea", + "b": "1F1F5-1F1EC", + "j": [ + "flag", + "papua", + "new", + "guinea", + "nation", + "country", + "banner" + ] + }, + "flag-philippines": { + "a": "Flag: Philippines", + "b": "1F1F5-1F1ED", + "j": [ + "flag", + "ph", + "nation", + "country", + "banner" + ] + }, + "flag-pakistan": { + "a": "Flag: Pakistan", + "b": "1F1F5-1F1F0", + "j": [ + "flag", + "pk", + "nation", + "country", + "banner" + ] + }, + "flag-poland": { + "a": "Flag: Poland", + "b": "1F1F5-1F1F1", + "j": [ + "flag", + "pl", + "nation", + "country", + "banner" + ] + }, + "flag-st-pierre--miquelon": { + "a": "Flag: St. Pierre & Miquelon", + "b": "1F1F5-1F1F2", + "j": [ + "flag", + "flag_st_pierre_miquelon", + "saint", + "pierre", + "miquelon", + "nation", + "country", + "banner" + ] + }, + "flag-pitcairn-islands": { + "a": "Flag: Pitcairn Islands", + "b": "1F1F5-1F1F3", + "j": [ + "flag", + "pitcairn", + "nation", + "country", + "banner" + ] + }, + "flag-puerto-rico": { + "a": "Flag: Puerto Rico", + "b": "1F1F5-1F1F7", + "j": [ + "flag", + "puerto", + "rico", + "nation", + "country", + "banner" + ] + }, + "flag-palestinian-territories": { + "a": "Flag: Palestinian Territories", + "b": "1F1F5-1F1F8", + "j": [ + "flag", + "palestine", + "palestinian", + "territories", + "nation", + "country", + "banner" + ] + }, + "flag-portugal": { + "a": "Flag: Portugal", + "b": "1F1F5-1F1F9", + "j": [ + "flag", + "pt", + "nation", + "country", + "banner" + ] + }, + "flag-palau": { + "a": "Flag: Palau", + "b": "1F1F5-1F1FC", + "j": [ + "flag", + "pw", + "nation", + "country", + "banner" + ] + }, + "flag-paraguay": { + "a": "Flag: Paraguay", + "b": "1F1F5-1F1FE", + "j": [ + "flag", + "py", + "nation", + "country", + "banner" + ] + }, + "flag-qatar": { + "a": "Flag: Qatar", + "b": "1F1F6-1F1E6", + "j": [ + "flag", + "qa", + "nation", + "country", + "banner" + ] + }, + "flag-runion": { + "a": "Flag: Réunion", + "b": "1F1F7-1F1EA", + "j": [ + "flag", + "flag_reunion", + "réunion", + "nation", + "country", + "banner" + ] + }, + "flag-romania": { + "a": "Flag: Romania", + "b": "1F1F7-1F1F4", + "j": [ + "flag", + "ro", + "nation", + "country", + "banner" + ] + }, + "flag-serbia": { + "a": "Flag: Serbia", + "b": "1F1F7-1F1F8", + "j": [ + "flag", + "rs", + "nation", + "country", + "banner" + ] + }, + "flag-russia": { + "a": "Flag: Russia", + "b": "1F1F7-1F1FA", + "j": [ + "flag", + "russian", + "federation", + "nation", + "country", + "banner" + ] + }, + "flag-rwanda": { + "a": "Flag: Rwanda", + "b": "1F1F7-1F1FC", + "j": [ + "flag", + "rw", + "nation", + "country", + "banner" + ] + }, + "flag-saudi-arabia": { + "a": "Flag: Saudi Arabia", + "b": "1F1F8-1F1E6", + "j": [ + "flag", + "nation", + "country", + "banner" + ] + }, + "flag-solomon-islands": { + "a": "Flag: Solomon Islands", + "b": "1F1F8-1F1E7", + "j": [ + "flag", + "solomon", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-seychelles": { + "a": "Flag: Seychelles", + "b": "1F1F8-1F1E8", + "j": [ + "flag", + "sc", + "nation", + "country", + "banner" + ] + }, + "flag-sudan": { + "a": "Flag: Sudan", + "b": "1F1F8-1F1E9", + "j": [ + "flag", + "sd", + "nation", + "country", + "banner" + ] + }, + "flag-sweden": { + "a": "Flag: Sweden", + "b": "1F1F8-1F1EA", + "j": [ + "flag", + "se", + "nation", + "country", + "banner" + ] + }, + "flag-singapore": { + "a": "Flag: Singapore", + "b": "1F1F8-1F1EC", + "j": [ + "flag", + "sg", + "nation", + "country", + "banner" + ] + }, + "flag-st-helena": { + "a": "Flag: St. Helena", + "b": "1F1F8-1F1ED", + "j": [ + "flag", + "saint", + "helena", + "ascension", + "tristan", + "cunha", + "nation", + "country", + "banner" + ] + }, + "flag-slovenia": { + "a": "Flag: Slovenia", + "b": "1F1F8-1F1EE", + "j": [ + "flag", + "si", + "nation", + "country", + "banner" + ] + }, + "flag-svalbard--jan-mayen": { + "a": "Flag: Svalbard & Jan Mayen", + "b": "1F1F8-1F1EF", + "j": [ + "flag", + "flag_svalbard_jan_mayen" + ] + }, + "flag-slovakia": { + "a": "Flag: Slovakia", + "b": "1F1F8-1F1F0", + "j": [ + "flag", + "sk", + "nation", + "country", + "banner" + ] + }, + "flag-sierra-leone": { + "a": "Flag: Sierra Leone", + "b": "1F1F8-1F1F1", + "j": [ + "flag", + "sierra", + "leone", + "nation", + "country", + "banner" + ] + }, + "flag-san-marino": { + "a": "Flag: San Marino", + "b": "1F1F8-1F1F2", + "j": [ + "flag", + "san", + "marino", + "nation", + "country", + "banner" + ] + }, + "flag-senegal": { + "a": "Flag: Senegal", + "b": "1F1F8-1F1F3", + "j": [ + "flag", + "sn", + "nation", + "country", + "banner" + ] + }, + "flag-somalia": { + "a": "Flag: Somalia", + "b": "1F1F8-1F1F4", + "j": [ + "flag", + "so", + "nation", + "country", + "banner" + ] + }, + "flag-suriname": { + "a": "Flag: Suriname", + "b": "1F1F8-1F1F7", + "j": [ + "flag", + "sr", + "nation", + "country", + "banner" + ] + }, + "flag-south-sudan": { + "a": "Flag: South Sudan", + "b": "1F1F8-1F1F8", + "j": [ + "flag", + "south", + "sd", + "nation", + "country", + "banner" + ] + }, + "flag-so-tom--prncipe": { + "a": "Flag: São Tomé & Príncipe", + "b": "1F1F8-1F1F9", + "j": [ + "flag", + "flag_sao_tome_principe", + "sao", + "tome", + "principe", + "nation", + "country", + "banner" + ] + }, + "flag-el-salvador": { + "a": "Flag: El Salvador", + "b": "1F1F8-1F1FB", + "j": [ + "flag", + "el", + "salvador", + "nation", + "country", + "banner" + ] + }, + "flag-sint-maarten": { + "a": "Flag: Sint Maarten", + "b": "1F1F8-1F1FD", + "j": [ + "flag", + "sint", + "maarten", + "dutch", + "nation", + "country", + "banner" + ] + }, + "flag-syria": { + "a": "Flag: Syria", + "b": "1F1F8-1F1FE", + "j": [ + "flag", + "syrian", + "arab", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-eswatini": { + "a": "Flag: Eswatini", + "b": "1F1F8-1F1FF", + "j": [ + "flag", + "sz", + "nation", + "country", + "banner" + ] + }, + "flag-tristan-da-cunha": { + "a": "Flag: Tristan Da Cunha", + "b": "1F1F9-1F1E6", + "j": [ + "flag" + ] + }, + "flag-turks--caicos-islands": { + "a": "Flag: Turks & Caicos Islands", + "b": "1F1F9-1F1E8", + "j": [ + "flag", + "flag_turks_caicos_islands", + "turks", + "caicos", + "islands", + "nation", + "country", + "banner" + ] + }, + "flag-chad": { + "a": "Flag: Chad", + "b": "1F1F9-1F1E9", + "j": [ + "flag", + "td", + "nation", + "country", + "banner" + ] + }, + "flag-french-southern-territories": { + "a": "Flag: French Southern Territories", + "b": "1F1F9-1F1EB", + "j": [ + "flag", + "french", + "southern", + "territories", + "nation", + "country", + "banner" + ] + }, + "flag-togo": { + "a": "Flag: Togo", + "b": "1F1F9-1F1EC", + "j": [ + "flag", + "tg", + "nation", + "country", + "banner" + ] + }, + "flag-thailand": { + "a": "Flag: Thailand", + "b": "1F1F9-1F1ED", + "j": [ + "flag", + "th", + "nation", + "country", + "banner" + ] + }, + "flag-tajikistan": { + "a": "Flag: Tajikistan", + "b": "1F1F9-1F1EF", + "j": [ + "flag", + "tj", + "nation", + "country", + "banner" + ] + }, + "flag-tokelau": { + "a": "Flag: Tokelau", + "b": "1F1F9-1F1F0", + "j": [ + "flag", + "tk", + "nation", + "country", + "banner" + ] + }, + "flag-timorleste": { + "a": "Flag: Timor-Leste", + "b": "1F1F9-1F1F1", + "j": [ + "flag", + "flag_timor_leste", + "timor", + "leste", + "nation", + "country", + "banner" + ] + }, + "flag-turkmenistan": { + "a": "Flag: Turkmenistan", + "b": "1F1F9-1F1F2", + "j": [ + "flag", + "nation", + "country", + "banner" + ] + }, + "flag-tunisia": { + "a": "Flag: Tunisia", + "b": "1F1F9-1F1F3", + "j": [ + "flag", + "tn", + "nation", + "country", + "banner" + ] + }, + "flag-tonga": { + "a": "Flag: Tonga", + "b": "1F1F9-1F1F4", + "j": [ + "flag", + "to", + "nation", + "country", + "banner" + ] + }, + "flag-turkey": { + "a": "Flag: Turkey", + "b": "1F1F9-1F1F7", + "j": [ + "flag", + "turkey", + "nation", + "country", + "banner" + ] + }, + "flag-trinidad--tobago": { + "a": "Flag: Trinidad & Tobago", + "b": "1F1F9-1F1F9", + "j": [ + "flag", + "flag_trinidad_tobago", + "trinidad", + "tobago", + "nation", + "country", + "banner" + ] + }, + "flag-tuvalu": { + "a": "Flag: Tuvalu", + "b": "1F1F9-1F1FB", + "j": [ + "flag", + "nation", + "country", + "banner" + ] + }, + "flag-taiwan": { + "a": "Flag: Taiwan", + "b": "1F1F9-1F1FC", + "j": [ + "flag", + "tw", + "nation", + "country", + "banner" + ] + }, + "flag-tanzania": { + "a": "Flag: Tanzania", + "b": "1F1F9-1F1FF", + "j": [ + "flag", + "tanzania", + "united", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-ukraine": { + "a": "Flag: Ukraine", + "b": "1F1FA-1F1E6", + "j": [ + "flag", + "ua", + "nation", + "country", + "banner" + ] + }, + "flag-uganda": { + "a": "Flag: Uganda", + "b": "1F1FA-1F1EC", + "j": [ + "flag", + "ug", + "nation", + "country", + "banner" + ] + }, + "flag-us-outlying-islands": { + "a": "Flag: U.S. Outlying Islands", + "b": "1F1FA-1F1F2", + "j": [ + "flag", + "flag_u_s_outlying_islands" + ] + }, + "flag-united-nations": { + "a": "Flag: United Nations", + "b": "1F1FA-1F1F3", + "j": [ + "flag", + "un", + "banner" + ] + }, + "flag-united-states": { + "a": "Flag: United States", + "b": "1F1FA-1F1F8", + "j": [ + "flag", + "united", + "states", + "america", + "nation", + "country", + "banner" + ] + }, + "flag-uruguay": { + "a": "Flag: Uruguay", + "b": "1F1FA-1F1FE", + "j": [ + "flag", + "uy", + "nation", + "country", + "banner" + ] + }, + "flag-uzbekistan": { + "a": "Flag: Uzbekistan", + "b": "1F1FA-1F1FF", + "j": [ + "flag", + "uz", + "nation", + "country", + "banner" + ] + }, + "flag-vatican-city": { + "a": "Flag: Vatican City", + "b": "1F1FB-1F1E6", + "j": [ + "flag", + "vatican", + "city", + "nation", + "country", + "banner" + ] + }, + "flag-st-vincent--grenadines": { + "a": "Flag: St. Vincent & Grenadines", + "b": "1F1FB-1F1E8", + "j": [ + "flag", + "flag_st_vincent_grenadines", + "saint", + "vincent", + "grenadines", + "nation", + "country", + "banner" + ] + }, + "flag-venezuela": { + "a": "Flag: Venezuela", + "b": "1F1FB-1F1EA", + "j": [ + "flag", + "ve", + "bolivarian", + "republic", + "nation", + "country", + "banner" + ] + }, + "flag-british-virgin-islands": { + "a": "Flag: British Virgin Islands", + "b": "1F1FB-1F1EC", + "j": [ + "flag", + "british", + "virgin", + "islands", + "bvi", + "nation", + "country", + "banner" + ] + }, + "flag-us-virgin-islands": { + "a": "Flag: U.S. Virgin Islands", + "b": "1F1FB-1F1EE", + "j": [ + "flag", + "flag_u_s_virgin_islands", + "virgin", + "islands", + "us", + "nation", + "country", + "banner" + ] + }, + "flag-vietnam": { + "a": "Flag: Vietnam", + "b": "1F1FB-1F1F3", + "j": [ + "flag", + "viet", + "nam", + "nation", + "country", + "banner" + ] + }, + "flag-vanuatu": { + "a": "Flag: Vanuatu", + "b": "1F1FB-1F1FA", + "j": [ + "flag", + "vu", + "nation", + "country", + "banner" + ] + }, + "flag-wallis--futuna": { + "a": "Flag: Wallis & Futuna", + "b": "1F1FC-1F1EB", + "j": [ + "flag", + "flag_wallis_futuna", + "wallis", + "futuna", + "nation", + "country", + "banner" + ] + }, + "flag-samoa": { + "a": "Flag: Samoa", + "b": "1F1FC-1F1F8", + "j": [ + "flag", + "ws", + "nation", + "country", + "banner" + ] + }, + "flag-kosovo": { + "a": "Flag: Kosovo", + "b": "1F1FD-1F1F0", + "j": [ + "flag", + "xk", + "nation", + "country", + "banner" + ] + }, + "flag-yemen": { + "a": "Flag: Yemen", + "b": "1F1FE-1F1EA", + "j": [ + "flag", + "ye", + "nation", + "country", + "banner" + ] + }, + "flag-mayotte": { + "a": "Flag: Mayotte", + "b": "1F1FE-1F1F9", + "j": [ + "flag", + "yt", + "nation", + "country", + "banner" + ] + }, + "flag-south-africa": { + "a": "Flag: South Africa", + "b": "1F1FF-1F1E6", + "j": [ + "flag", + "south", + "africa", + "nation", + "country", + "banner" + ] + }, + "flag-zambia": { + "a": "Flag: Zambia", + "b": "1F1FF-1F1F2", + "j": [ + "flag", + "zm", + "nation", + "country", + "banner" + ] + }, + "flag-zimbabwe": { + "a": "Flag: Zimbabwe", + "b": "1F1FF-1F1FC", + "j": [ + "flag", + "zw", + "nation", + "country", + "banner" + ] + }, + "flag-england": { + "a": "Flag: England", + "b": "1F3F4-E0067-E0062-E0065-E006E-E0067-E007F", + "j": [ + "flag", + "english" + ] + }, + "flag-scotland": { + "a": "Flag: Scotland", + "b": "1F3F4-E0067-E0062-E0073-E0063-E0074-E007F", + "j": [ + "flag", + "scottish" + ] + }, + "flag-wales": { + "a": "Flag: Wales", + "b": "1F3F4-E0067-E0062-E0077-E006C-E0073-E007F", + "j": [ + "flag", + "welsh" + ] + } + }, + "aliases": {} +} \ No newline at end of file diff --git a/tools/import_emojis.py b/tools/import_emojis.py index 30db3b0b13..5138c25c68 100755 --- a/tools/import_emojis.py +++ b/tools/import_emojis.py @@ -130,4 +130,10 @@ print("Writing emoji_picker_datasource.json...") scripts_dir = os.path.dirname(os.path.abspath(__file__)) with open(os.path.join(scripts_dir, "../vector/src/main/res/raw/emoji_picker_datasource.json"), "w") as outfile: json.dump(emoji_picker_datasource, outfile, ensure_ascii=False, separators=(',', ':')) + +# Also export a formatted version +print("Writing emoji_picker_datasource_formatted.json...") +with open(os.path.join(scripts_dir, "../tools/emojis/emoji_picker_datasource_formatted.json"), "w") as outfile: + json.dump(emoji_picker_datasource, outfile, ensure_ascii=False, indent=4) + print("Done.") diff --git a/tools/release/pushPlayStoreMetaData.sh b/tools/release/pushPlayStoreMetaData.sh new file mode 100755 index 0000000000..ad7288ac36 --- /dev/null +++ b/tools/release/pushPlayStoreMetaData.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash + +# +# Copyright (c) 2021 New Vector Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +set +e + +# Fastlane / PlayStore is not happy if the folder name for local is not supported by the PlayStore. So temporary move them before running fast lane +# List of supported languages: https://support.google.com/googleplay/android-developer/answer/9844778?hl=en#zippy=%2Cview-list-of-available-languages + +echo "Ignoring some languages not supported by the PlayStore" +mkdir ./fastlane_tmp +mv ./fastlane/metadata/android/eo ./fastlane_tmp +mv ./fastlane/metadata/android/fy ./fastlane_tmp +mv ./fastlane/metadata/android/ga ./fastlane_tmp +mv ./fastlane/metadata/android/kab ./fastlane_tmp +mv ./fastlane/metadata/android/nb ./fastlane_tmp + +# Fastlane / PlayStore require longDescription and shortDescription file to be set, so copy the default one for +echo "Copying default description when missing" +if [[ -f "./fastlane/metadata/android/ro/full_description.txt" ]]; then + echo "It appears that file ./fastlane/metadata/android/ro/full_description.txt now exists. This can be removed." + removeFullDes_ro=0 +else + echo "Copy default full description to ./fastlane/metadata/android/ro" + cp ./fastlane/metadata/android/en-US/full_description.txt ./fastlane/metadata/android/ro + removeFullDes_ro=1 +fi + +if [[ -f "./fastlane/metadata/android/si-LK/full_description.txt" ]]; then + echo "It appears that file ./fastlane/metadata/android/si-LK/full_description.txt now exists. This can be removed." + removeFullDes_si=0 +else + echo "Copy default full description to ./fastlane/metadata/android/si-LK" + cp ./fastlane/metadata/android/en-US/full_description.txt ./fastlane/metadata/android/si-LK + removeFullDes_si=1 +fi + +if [[ -f "./fastlane/metadata/android/si-LK/short_description.txt" ]]; then + echo "It appears that file ./fastlane/metadata/android/si-LK/short_description.txt now exists. This can be removed." + removeShortDes_si=0 +else + echo "Copy default short description to ./fastlane/metadata/android/si-LK" + cp ./fastlane/metadata/android/en-US/short_description.txt ./fastlane/metadata/android/si-LK + removeShortDes_si=1 +fi + +if [[ -f "./fastlane/metadata/android/th/full_description.txt" ]]; then + echo "It appears that file ./fastlane/metadata/android/th/full_description.txt now exists. This can be removed." + removeFullDes_th=0 +else + echo "Copy default full description to ./fastlane/metadata/android/th" + cp ./fastlane/metadata/android/en-US/full_description.txt ./fastlane/metadata/android/th + removeFullDes_th=1 +fi + +if [[ -f "./fastlane/metadata/android/vi/full_description.txt" ]]; then + echo "It appears that file ./fastlane/metadata/android/vi/full_description.txt now exists. This can be removed." + removeFullDes_vi=0 +else + echo "Copy default full description to ./fastlane/metadata/android/vi" + cp ./fastlane/metadata/android/en-US/full_description.txt ./fastlane/metadata/android/vi + removeFullDes_vi=1 +fi + +# Run fastlane +echo "Run fastlane to push to the PlaysStore" +fastlane deployMeta + +echo "Cleanup" +mv ./fastlane_tmp/* ./fastlane/metadata/android/ + +# Delete the tmp folder (should be empty) +rmdir ./fastlane_tmp + +if [[ ${removeFullDes_ro} -eq 1 ]]; then + rm ./fastlane/metadata/android/ro/full_description.txt +fi + +if [[ ${removeFullDes_si} -eq 1 ]]; then + rm ./fastlane/metadata/android/si-LK/full_description.txt +fi + +if [[ ${removeShortDes_si} -eq 1 ]]; then + rm ./fastlane/metadata/android/si-LK/short_description.txt +fi + +if [[ ${removeFullDes_th} -eq 1 ]]; then + rm ./fastlane/metadata/android/th/full_description.txt +fi + +if [[ ${removeFullDes_vi} -eq 1 ]]; then + rm ./fastlane/metadata/android/vi/full_description.txt +fi + +echo "Success!" diff --git a/tools/templates/ElementFeature/root/res/layout/fragment.xml.ftl b/tools/templates/ElementFeature/root/res/layout/fragment.xml.ftl index 539c40f3f9..0450d74aff 100644 --- a/tools/templates/ElementFeature/root/res/layout/fragment.xml.ftl +++ b/tools/templates/ElementFeature/root/res/layout/fragment.xml.ftl @@ -9,6 +9,7 @@ <TextView android:id="@+id/message" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="${fragmentClass}" diff --git a/tools/templates/ElementFeature/root/src/app_package/Activity.kt.ftl b/tools/templates/ElementFeature/root/src/app_package/Activity.kt.ftl index ea301b241b..a4622d1d21 100644 --- a/tools/templates/ElementFeature/root/src/app_package/Activity.kt.ftl +++ b/tools/templates/ElementFeature/root/src/app_package/Activity.kt.ftl @@ -2,7 +2,7 @@ package ${escapeKotlinIdentifiers(packageName)} import android.content.Context import android.content.Intent -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import im.vector.app.R import im.vector.app.core.extensions.addFragment import im.vector.app.core.platform.ToolbarConfigurable @@ -42,7 +42,7 @@ class ${activityClass} : VectorBaseActivity(), ToolbarConfigurable { } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/tools/towncrier/template.md b/tools/towncrier/template.md index fd160682b5..4e5e96a4ac 100644 --- a/tools/towncrier/template.md +++ b/tools/towncrier/template.md @@ -15,19 +15,8 @@ {% if sections[section] %} {% for category, val in definitions.items() if category in sections[section]%} -{% if definitions[category]['name'] == "Features" %} -Features ✨: -{% elif definitions[category]['name'] == "Bugfixes" %} -Bugfixes 🐛: -{% elif definitions[category]['name'] == "Deprecations and Removals" %} -SDK API changes ⚠️: -{% elif definitions[category]['name'] == "Improved Documentation" %} -Improved Documentation 📚: -{% elif definitions[category]['name'] == "Misc" %} -Other changes: -{% else %} {{ definitions[category]['name'] }} -{% endif %} +{{ underline * definitions[category]['name']|length }} {% if definitions[category]['showcontent'] %} {% for text, values in sections[section][category].items() %} - {{ text }} ({{ values|join(', ') }}) diff --git a/tools/travis/check_pr.sh b/tools/travis/check_pr.sh index b797244e55..d8d95879e2 100755 --- a/tools/travis/check_pr.sh +++ b/tools/travis/check_pr.sh @@ -23,7 +23,7 @@ branch=${TRAVIS_BRANCH} # If not on develop, exit, else we cannot get the list of modified files # It is ok to check only when on develop branch if [[ "${branch}" -eq 'develop' ]]; then - echo "Check that a file has been added to /newsfragment" + echo "Check that a file has been added to /changelog.d" else echo "Not on develop branch" exit 0 @@ -37,9 +37,9 @@ listOfModifiedFiles=`git diff --name-only HEAD ${branch}` # echo ${listOfModifiedFiles} -if [[ ${listOfModifiedFiles} = *"newsfragment"* ]]; then - echo "A file has been added to /newsfragment!" +if [[ ${listOfModifiedFiles} = *"changelog.d"* ]]; then + echo "A file has been added to /changelog.d!" else - echo "❌ Please add a file describing your changes in /newsfragment. See https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#changelog" + echo "❌ Please add a file describing your changes in /changelog.d. See https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#changelog" exit 1 fi diff --git a/towncrier.toml b/towncrier.toml index 09a927b77f..486ef6f186 100644 --- a/towncrier.toml +++ b/towncrier.toml @@ -1,7 +1,31 @@ [tool.towncrier] -directory = "newsfragment" -filename = "CHANGES.md" -name = "Changes in Element" -# Note: there is a bug, if I use title_format, the title is printed twice -# title_format = "Changes in Element {version} ({project_date})" -template="tools/towncrier/template.md" + directory = "changelog.d" + filename = "CHANGES.md" + name = "Changes in Element" + template = "tools/towncrier/template.md" + issue_format = "[#{issue}](https://github.com/vector-im/element-android/issues/{issue})" + + [[tool.towncrier.type]] + directory = "feature" + name = "Features ✨" + showcontent = true + + [[tool.towncrier.type]] + directory = "bugfix" + name = "Bugfixes 🐛" + showcontent = true + + [[tool.towncrier.type]] + directory = "doc" + name = "Improved Documentation 📚" + showcontent = true + + [[tool.towncrier.type]] + directory = "removal" + name = "SDK API changes ⚠️" + showcontent = true + + [[tool.towncrier.type]] + directory = "misc" + name = "Other changes" + showcontent = true diff --git a/vector/build.gradle b/vector/build.gradle index 2d662ea242..82ae3d609f 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -14,7 +14,7 @@ kapt { // Note: 2 digits max for each value ext.versionMajor = 1 ext.versionMinor = 1 -ext.versionPatch = 10 +ext.versionPatch = 12 static def getGitTimestamp() { def cmd = 'git show -s --format=%ct' @@ -146,6 +146,10 @@ android { buildConfigField "Long", "VOICE_MESSAGE_DURATION_LIMIT_MS", "120000L" + // If set, MSC3086 asserted identity messages sent on VoIP calls will cause the call to appear in the room corresponding to the asserted identity. + // This *must* only be set in trusted environments. + buildConfigField "Boolean", "handleCallAssertedIdentityEvents", "false" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // Keep abiFilter for the universalApk @@ -244,6 +248,11 @@ android { productFlavors { gplay { + apply plugin: 'com.google.gms.google-services' + afterEvaluate { + tasks.matching { it.name.contains("GoogleServices") && !it.name.contains("Gplay") }*.enabled = false + } + dimension "store" isDefault = true versionName "${versionMajor}.${versionMinor}.${versionPatch}${getGplayVersionSuffix()}" @@ -297,14 +306,14 @@ android { dependencies { - def epoxy_version = '4.6.1' - def fragment_version = '1.3.4' + def epoxy_version = '4.6.2' + def fragment_version = '1.3.5' def arrow_version = "0.8.2" def markwon_version = '4.1.2' def big_image_viewer_version = '1.8.0' def glide_version = '4.12.0' def moshi_version = '1.12.0' - def daggerVersion = '2.36' + def daggerVersion = '2.37' def autofill_version = "1.1.0" def work_version = '2.5.0' def arch_version = '2.1.0' @@ -313,7 +322,7 @@ dependencies { def jjwt_version = '0.11.2' // Tests - def kluent_version = '1.65' + def kluent_version = '1.67' def androidxTest_version = '1.3.0' def espresso_version = '3.3.0' @@ -322,6 +331,7 @@ dependencies { implementation project(":diff-match-patch") implementation project(":multipicker") implementation project(":attachment-viewer") + implementation project(":library:ui-styles") implementation 'androidx.multidex:multidex:2.0.1' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" @@ -352,7 +362,7 @@ dependencies { implementation 'com.facebook.stetho:stetho:1.6.0' // Phone number https://github.com/google/libphonenumber - implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.24' + implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.26' // rx implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0' @@ -504,7 +514,3 @@ dependencies { exclude group: 'org.jetbrains.kotlin' } } - -if (getGradle().getStartParameter().getTaskRequests().toString().contains("Gplay")) { - apply plugin: 'com.google.gms.google-services' -} diff --git a/vector/lint.xml b/vector/lint.xml index e7e5fe78fe..a8eed30160 100644 --- a/vector/lint.xml +++ b/vector/lint.xml @@ -58,6 +58,9 @@ <!-- Manifest --> <issue id="PermissionImpliesUnsupportedChromeOsHardware" severity="error" /> + <!-- Performance --> + <issue id="UselessParent" severity="error" /> + <!-- Dependencies --> <issue id="KtxExtensionAvailable" severity="error" /> diff --git a/vector/sampledata/users.json b/vector/sampledata/users.json index 0a49d27450..d1b1758db3 100644 --- a/vector/sampledata/users.json +++ b/vector/sampledata/users.json @@ -1,15 +1,15 @@ { "data": [ { - "displayName": "amandine", + "displayName": "Amandine", "id": "@amandine:matrix.org" }, { - "displayName": "benoit", + "displayName": "Benoit", "id": "@benoit:matrix.org" }, { - "displayName": "gaelle", + "displayName": "Gaelle", "id": "@gawa:matrix.org" }, { diff --git a/vector/src/debug/AndroidManifest.xml b/vector/src/debug/AndroidManifest.xml index 95066bb44f..b97384099f 100644 --- a/vector/src/debug/AndroidManifest.xml +++ b/vector/src/debug/AndroidManifest.xml @@ -5,27 +5,6 @@ <application> <activity android:name=".features.debug.TestLinkifyActivity" /> <activity android:name=".features.debug.sas.DebugSasEmojiActivity" /> - <activity - android:name=".features.debug.DebugMaterialThemeLightDefaultActivity" - android:theme="@style/VectorMaterialThemeDebugLight" /> - <activity - android:name=".features.debug.DebugMaterialThemeLightTestActivity" - android:theme="@style/VectorMaterialThemeDebugLight.Test" /> - <activity - android:name=".features.debug.DebugMaterialThemeLightVectorActivity" - android:theme="@style/AppTheme.Light" /> - <activity - android:name=".features.debug.DebugMaterialThemeDarkDefaultActivity" - android:theme="@style/VectorMaterialThemeDebugDark" /> - <activity - android:name=".features.debug.DebugMaterialThemeDarkTestActivity" - android:theme="@style/VectorMaterialThemeDebugDark.Test" /> - <activity - android:name=".features.debug.DebugMaterialThemeDarkVectorActivity" - android:theme="@style/AppTheme.Dark" /> - <activity - android:name=".features.debug.DebugVectorButtonStylesActivity" - android:theme="@style/AppTheme.Light" /> </application> </manifest> diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeActivity.kt b/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeActivity.kt deleted file mode 100644 index de6b981c02..0000000000 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMaterialThemeActivity.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.debug - -import android.os.Bundle -import android.view.Menu -import androidx.appcompat.app.AppCompatActivity -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.snackbar.Snackbar -import im.vector.app.R -import im.vector.app.core.utils.toast -import im.vector.app.databinding.ActivityTestMaterialThemeBinding - -// Rendering is not the same with VectorBaseActivity -abstract class DebugMaterialThemeActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val views = ActivityTestMaterialThemeBinding.inflate(layoutInflater) - setContentView(views.root) - - views.debugShowSnackbar.setOnClickListener { - Snackbar.make(views.coordinatorLayout, "Snackbar!", Snackbar.LENGTH_SHORT) - .setAction("Action") { } - .show() - } - - views.debugShowToast.setOnClickListener { - toast("Toast") - } - - views.debugShowDialog.setOnClickListener { - MaterialAlertDialogBuilder(this) - .setTitle("Dialog title") - .setMessage("Dialog content") - .setIcon(R.drawable.ic_settings_x) - .setPositiveButton("Positive", null) - .setNegativeButton("Negative", null) - .setNeutralButton("Neutral", null) - .show() - } - - views.debugShowBottomSheet.setOnClickListener { - DebugBottomSheet().show(supportFragmentManager, "TAG") - } - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.home, menu) - return true - } -} diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt b/vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt index 65a24c9aeb..539091c7ce 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt +++ b/vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt @@ -37,6 +37,16 @@ import im.vector.app.core.utils.toast import im.vector.app.databinding.ActivityDebugMenuBinding import im.vector.app.features.debug.sas.DebugSasEmojiActivity import im.vector.app.features.qrcode.QrCodeScannerActivity +import im.vector.lib.ui.styles.debug.DebugMaterialThemeDarkDefaultActivity +import im.vector.lib.ui.styles.debug.DebugMaterialThemeDarkTestActivity +import im.vector.lib.ui.styles.debug.DebugMaterialThemeDarkVectorActivity +import im.vector.lib.ui.styles.debug.DebugMaterialThemeLightDefaultActivity +import im.vector.lib.ui.styles.debug.DebugMaterialThemeLightTestActivity +import im.vector.lib.ui.styles.debug.DebugMaterialThemeLightVectorActivity +import im.vector.lib.ui.styles.debug.DebugVectorButtonStylesDarkActivity +import im.vector.lib.ui.styles.debug.DebugVectorButtonStylesLightActivity +import im.vector.lib.ui.styles.debug.DebugVectorTextViewDarkActivity +import im.vector.lib.ui.styles.debug.DebugVectorTextViewLightActivity import org.matrix.android.sdk.internal.crypto.verification.qrcode.toQrCodeData import timber.log.Timber @@ -71,8 +81,17 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() { private fun setupViews() { views.debugTestTextViewLink.setOnClickListener { testTextViewLink() } - views.debugOpenButtonStyles.setOnClickListener { - startActivity(Intent(this, DebugVectorButtonStylesActivity::class.java)) + views.debugOpenButtonStylesLight.setOnClickListener { + startActivity(Intent(this, DebugVectorButtonStylesLightActivity::class.java)) + } + views.debugOpenButtonStylesDark.setOnClickListener { + startActivity(Intent(this, DebugVectorButtonStylesDarkActivity::class.java)) + } + views.debugTestTextViewLight.setOnClickListener { + startActivity(Intent(this, DebugVectorTextViewLightActivity::class.java)) + } + views.debugTestTextViewDark.setOnClickListener { + startActivity(Intent(this, DebugVectorTextViewDarkActivity::class.java)) } views.debugShowSasEmoji.setOnClickListener { showSasEmoji() } views.debugTestNotification.setOnClickListener { testNotification() } diff --git a/vector/src/debug/res/layout/activity_debug_menu.xml b/vector/src/debug/res/layout/activity_debug_menu.xml index 454d8992fd..a83f61266a 100644 --- a/vector/src/debug/res/layout/activity_debug_menu.xml +++ b/vector/src/debug/res/layout/activity_debug_menu.xml @@ -66,6 +66,20 @@ android:text="Vector" /> </LinearLayout> + <Button + android:id="@+id/debug_open_button_styles_light" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="See button light" /> + + <Button + android:id="@+id/debug_test_text_view_light" + android:layout_width="wrap_content" + android:layout_height="0dp" + android:layout_margin="8dp" + android:layout_weight="1" + android:text="Text Views Light" /> + <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -101,10 +115,18 @@ </LinearLayout> <Button - android:id="@+id/debug_open_button_styles" + android:id="@+id/debug_open_button_styles_dark" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="See button styles" /> + android:text="See button dark" /> + + <Button + android:id="@+id/debug_test_text_view_dark" + android:layout_width="wrap_content" + android:layout_height="0dp" + android:layout_margin="8dp" + android:layout_weight="1" + android:text="Text Views Dark" /> <Button android:id="@+id/debug_show_sas_emoji" diff --git a/vector/src/debug/res/layout/activity_test_material_theme.xml b/vector/src/debug/res/layout/activity_test_material_theme.xml deleted file mode 100644 index 2ec23a4b31..0000000000 --- a/vector/src/debug/res/layout/activity_test_material_theme.xml +++ /dev/null @@ -1,444 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/coordinatorLayout" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".features.debug.DebugMaterialThemeActivity" - tools:ignore="HardcodedText"> - - <androidx.core.widget.NestedScrollView - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:divider="@drawable/linear_divider" - android:orientation="vertical" - android:padding="16dp" - android:showDividers="middle"> - - <androidx.appcompat.widget.Toolbar - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:layout_constraintTop_toTopOf="parent" - app:subtitle="Toolbar Subtitle" - app:title="Toolbar Title" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:baselineAligned="false" - android:divider="@drawable/linear_divider" - android:showDividers="middle"> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:background="#FFFFFF" - android:divider="@drawable/linear_divider" - android:orientation="vertical" - android:padding="8dp" - android:showDividers="middle"> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorPrimary" - android:text="colorPrimary" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorPrimaryVariant" - android:text="colorPrimaryVariant" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorOnPrimary" - android:text="colorOnPrimary" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorSecondary" - android:text="colorSecondary" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorSecondaryVariant" - android:text="colorSecondaryVariant" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorOnSecondary" - android:text="colorOnSecondary" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorError" - android:text="colorError" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorOnError" - android:text="colorOnError" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorSurface" - android:text="colorSurface" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorOnSurface" - android:text="colorOnSurface" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?android:colorBackground" - android:text="android:colorBackground" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorOnBackground" - android:text="colorOnBackground" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?colorAccent" - android:text="colorAccent" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?android:statusBarColor" - android:text="android:statusBarColor" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?android:navigationBarColor" - android:text="android:navigationBarColor" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?android:textColorPrimary" - android:text="android:textColorPrimary" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?android:textColorSecondary" - android:text="android:textColorSecondary" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?android:textColorTertiary" - android:text="android:textColorTertiary" /> - - <TextView - style="@style/DebugTextColorDemo.White" - android:background="?android:textColorLink" - android:text="android:textColorLink" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:background="#000000" - android:divider="@drawable/linear_divider" - android:dividerPadding="8dp" - android:orientation="vertical" - android:padding="8dp" - android:showDividers="middle"> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorPrimary" - android:text="colorPrimary" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorPrimaryVariant" - android:text="colorPrimaryVariant" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorOnPrimary" - android:text="colorOnPrimary" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorSecondary" - android:text="colorSecondary" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorSecondaryVariant" - android:text="colorSecondaryVariant" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorOnSecondary" - android:text="colorOnSecondary" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorError" - android:text="colorError" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorOnError" - android:text="colorOnError" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorSurface" - android:text="colorSurface" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorOnSurface" - android:text="colorOnSurface" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?android:colorBackground" - android:text="android:colorBackground" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorOnBackground" - android:text="colorOnBackground" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?colorAccent" - android:text="colorAccent" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?android:statusBarColor" - android:text="android:statusBarColor" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?android:navigationBarColor" - android:text="android:navigationBarColor" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?android:textColorPrimary" - android:text="android:textColorPrimary" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?android:textColorSecondary" - android:text="android:textColorSecondary" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?android:textColorTertiary" - android:text="android:textColorTertiary" /> - - <TextView - style="@style/DebugTextColorDemo.Black" - android:background="?android:textColorLink" - android:text="android:textColorLink" /> - </LinearLayout> - - </LinearLayout> - - <com.google.android.material.textfield.TextInputLayout - style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="OutlinedBox"> - - <com.google.android.material.textfield.TextInputEditText - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:maxLines="1" /> - - </com.google.android.material.textfield.TextInputLayout> - - <com.google.android.material.textfield.TextInputLayout - style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="OutlinedBox.Dense"> - - <com.google.android.material.textfield.TextInputEditText - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:maxLines="1" /> - - </com.google.android.material.textfield.TextInputLayout> - - - <com.google.android.material.textfield.TextInputLayout - style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="FilledBox"> - - <com.google.android.material.textfield.TextInputEditText - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:maxLines="1" /> - - </com.google.android.material.textfield.TextInputLayout> - - <com.google.android.material.textfield.TextInputLayout - style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="FilledBox.Dense"> - - <com.google.android.material.textfield.TextInputEditText - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:maxLines="1" /> - - </com.google.android.material.textfield.TextInputLayout> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Buttons" /> - - <Button - style="@style/Widget.MaterialComponents.Button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Classic" - app:icon="@drawable/ic_settings_x" /> - - <Button - style="@style/Widget.MaterialComponents.Button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:enabled="false" - android:text="Classic Disabled" - app:icon="@drawable/ic_settings_x" /> - - <Button - style="@style/Widget.MaterialComponents.Button.OutlinedButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="OutlinedButton" - app:icon="@drawable/ic_settings_x" /> - - <Button - style="@style/Widget.MaterialComponents.Button.OutlinedButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:enabled="false" - android:text="OutlinedButton Disabled" - app:icon="@drawable/ic_settings_x" /> - - <Button - style="@style/Widget.MaterialComponents.Button.TextButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="TextButton" - app:icon="@drawable/ic_settings_x" /> - - <Button - style="@style/Widget.MaterialComponents.Button.TextButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:enabled="false" - android:text="TextButton Disabled" - app:icon="@drawable/ic_settings_x" /> - - <Button - style="@style/Widget.MaterialComponents.Button.UnelevatedButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="UnelevatedButton" - app:icon="@drawable/ic_settings_x" /> - - <Button - style="@style/Widget.MaterialComponents.Button.UnelevatedButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:enabled="false" - android:text="UnelevatedButton Disabled" - app:icon="@drawable/ic_settings_x" /> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Actions" /> - - <Button - android:id="@+id/debugShowSnackbar" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:text="Show Snackbar" /> - - <Button - android:id="@+id/debugShowToast" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:text="Show Toast" /> - - <Button - android:id="@+id/debugShowDialog" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:text="Show Dialog" /> - - <Button - android:id="@+id/debugShowBottomSheet" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:text="Show Bottom Sheet" /> - - <CheckBox - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Material CheckBox" /> - - <com.google.android.material.switchmaterial.SwitchMaterial - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Material Switch" /> - - <com.google.android.material.card.MaterialCardView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:padding="48dp" - android:text="TextView in MaterialCardView" /> - - </com.google.android.material.card.MaterialCardView> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:layout_margin="16dp" - android:importantForAccessibility="no" - android:src="@drawable/ic_settings_x" /> - - <com.google.android.material.bottomnavigation.BottomNavigationView - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:menu="@menu/home_bottom_navigation" /> - - </LinearLayout> - - </androidx.core.widget.NestedScrollView> - -</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/vector/src/debug/res/layout/demo_themes.xml b/vector/src/debug/res/layout/demo_themes.xml index 7cd4a77066..3b2f5acbf0 100644 --- a/vector/src/debug/res/layout/demo_themes.xml +++ b/vector/src/debug/res/layout/demo_themes.xml @@ -14,7 +14,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:theme="@style/AppTheme.Light"> + android:theme="@style/Theme.Vector.Light"> <include layout="@layout/demo_theme_sample" /> @@ -24,7 +24,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:theme="@style/AppTheme.Dark"> + android:theme="@style/Theme.Vector.Dark"> <include layout="@layout/demo_theme_sample" /> @@ -34,7 +34,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:theme="@style/AppTheme.Black"> + android:theme="@style/Theme.Vector.Black"> <include layout="@layout/demo_theme_sample" /> diff --git a/vector/src/debug/res/layout/item_sas_emoji.xml b/vector/src/debug/res/layout/item_sas_emoji.xml index 23d6f3b348..a6a0e28058 100644 --- a/vector/src/debug/res/layout/item_sas_emoji.xml +++ b/vector/src/debug/res/layout/item_sas_emoji.xml @@ -12,20 +12,21 @@ <TextView android:id="@+id/sas_emoji_index" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="32dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:gravity="center" - android:textSize="16sp" + android:textColor="?vctr_content_primary" tools:text="63:" /> <TextView android:id="@+id/sas_emoji" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:textColor="@color/emoji_color" - android:textSize="22sp" tools:text="🔧" /> <LinearLayout @@ -35,18 +36,19 @@ <TextView android:id="@+id/sas_emoji_text" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" - android:textSize="16sp" + android:textColor="?vctr_content_primary" tools:text="@string/verification_emoji_spanner" /> <TextView android:id="@+id/sas_emoji_text_id" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" - android:textSize="12sp" tools:text="verification_emoji_spanner" /> </LinearLayout> diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml index f601dc88dd..e71f355a23 100644 --- a/vector/src/main/AndroidManifest.xml +++ b/vector/src/main/AndroidManifest.xml @@ -75,7 +75,7 @@ android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme.Light" + android:theme="@style/Theme.Vector.Light" tools:replace="android:allowBackup"> <!-- No limit for screen ratio: avoid black strips --> @@ -85,7 +85,7 @@ <activity android:name=".features.MainActivity" - android:theme="@style/AppTheme.Launcher" /> + android:theme="@style/Theme.Vector.Launcher" /> <!-- Activity alias for the launcher Activity (must be declared after the Activity it targets) --> <activity-alias @@ -141,7 +141,7 @@ <!-- Add tools:ignore="Instantiatable" for the error reported only by Buildkite :/ --> <activity android:name=".features.media.VectorAttachmentViewerActivity" - android:theme="@style/AppTheme.Transparent" + android:theme="@style/Theme.Vector.Black.Transparent" tools:ignore="Instantiatable" /> <activity android:name=".features.media.BigImageViewerActivity" /> @@ -268,7 +268,7 @@ <activity android:name=".features.attachments.preview.AttachmentsPreviewActivity" - android:theme="@style/AppTheme.AttachmentsPreview" /> + android:theme="@style/Theme.Vector.Black.AttachmentsPreview" /> <activity android:name=".features.call.VectorCallActivity" android:excludeFromRecents="true" /> diff --git a/vector/src/main/java/im/vector/app/AppStateHandler.kt b/vector/src/main/java/im/vector/app/AppStateHandler.kt index c5eac7e3e0..06174b9573 100644 --- a/vector/src/main/java/im/vector/app/AppStateHandler.kt +++ b/vector/src/main/java/im/vector/app/AppStateHandler.kt @@ -49,13 +49,12 @@ fun RoomGroupingMethod.group() = (this as? RoomGroupingMethod.ByLegacyGroup)?.gr // TODO Keep this class for now, will maybe be used fro Space @Singleton class AppStateHandler @Inject constructor( - sessionDataSource: ActiveSessionDataSource, + private val sessionDataSource: ActiveSessionDataSource, private val uiStateRepository: UiStateRepository, private val activeSessionHolder: ActiveSessionHolder ) : LifecycleObserver { private val compositeDisposable = CompositeDisposable() - private val selectedSpaceDataSource = BehaviorDataSource<Option<RoomGroupingMethod>>(Option.empty()) val selectedRoomGroupingObservable = selectedSpaceDataSource.observe() @@ -92,11 +91,11 @@ class AppStateHandler @Inject constructor( } } - init { + private fun observeActiveSession() { sessionDataSource.observe() .distinctUntilChanged() .subscribe { - // sessionDataSource could already return a session while acitveSession holder still returns null + // sessionDataSource could already return a session while activeSession holder still returns null it.orNull()?.let { session -> if (uiStateRepository.isGroupingMethodSpace(session.sessionId)) { setCurrentSpace(uiStateRepository.getSelectedSpace(session.sessionId), session) @@ -119,6 +118,7 @@ class AppStateHandler @Inject constructor( @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun entersForeground() { + observeActiveSession() } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) @@ -126,7 +126,7 @@ class AppStateHandler @Inject constructor( compositeDisposable.clear() val session = activeSessionHolder.getSafeActiveSession() ?: return when (val currentMethod = selectedSpaceDataSource.currentValue?.orNull() ?: RoomGroupingMethod.BySpace(null)) { - is RoomGroupingMethod.BySpace -> { + is RoomGroupingMethod.BySpace -> { uiStateRepository.storeGroupingMethod(true, session.sessionId) uiStateRepository.storeSelectedSpace(currentMethod.spaceSummary?.roomId, session.sessionId) } diff --git a/vector/src/main/java/im/vector/app/VectorApplication.kt b/vector/src/main/java/im/vector/app/VectorApplication.kt index f3e2f8740e..4791c2e499 100644 --- a/vector/src/main/java/im/vector/app/VectorApplication.kt +++ b/vector/src/main/java/im/vector/app/VectorApplication.kt @@ -47,6 +47,7 @@ import im.vector.app.core.rx.RxConfig import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.configuration.VectorConfiguration import im.vector.app.features.disclaimer.doNotShowDisclaimerDialog +import im.vector.app.features.invite.InvitesAcceptor import im.vector.app.features.lifecycle.VectorActivityLifecycleCallbacks import im.vector.app.features.notifications.NotificationDrawerManager import im.vector.app.features.notifications.NotificationUtils @@ -95,6 +96,7 @@ class VectorApplication : @Inject lateinit var popupAlertManager: PopupAlertManager @Inject lateinit var pinLocker: PinLocker @Inject lateinit var callManager: WebRtcCallManager + @Inject lateinit var invitesAcceptor: InvitesAcceptor lateinit var vectorComponent: VectorComponent @@ -116,6 +118,7 @@ class VectorApplication : appContext = this vectorComponent = DaggerVectorComponent.factory().create(this) vectorComponent.inject(this) + invitesAcceptor.initialize() vectorUncaughtExceptionHandler.activate(this) rxConfig.setupRxPlugin() diff --git a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt index 3c11bfcd13..38edb771bb 100644 --- a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt +++ b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt @@ -50,6 +50,7 @@ import im.vector.app.features.home.room.detail.widget.RoomWidgetsBottomSheet import im.vector.app.features.home.room.filtered.FilteredRoomsActivity import im.vector.app.features.home.room.list.RoomListModule import im.vector.app.features.home.room.list.actions.RoomListQuickActionsBottomSheet +import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.invite.InviteUsersToRoomActivity import im.vector.app.features.invite.VectorInviteView import im.vector.app.features.link.LinkHandlerActivity @@ -122,6 +123,7 @@ interface ScreenComponent { fun errorFormatter(): ErrorFormatter fun uiStateRepository(): UiStateRepository fun unrecognizedCertificateDialog(): UnrecognizedCertificateDialog + fun autoAcceptInvites(): AutoAcceptInvites /* ========================================================================================== * Activities diff --git a/vector/src/main/java/im/vector/app/core/di/VectorComponent.kt b/vector/src/main/java/im/vector/app/core/di/VectorComponent.kt index e5a47e872c..4a3379cb5a 100644 --- a/vector/src/main/java/im/vector/app/core/di/VectorComponent.kt +++ b/vector/src/main/java/im/vector/app/core/di/VectorComponent.kt @@ -42,6 +42,7 @@ import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorPr import im.vector.app.features.home.room.detail.timeline.helper.RoomSummariesHolder import im.vector.app.features.html.EventHtmlRenderer import im.vector.app.features.html.VectorHtmlCompressor +import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.login.ReAuthHelper import im.vector.app.features.navigation.Navigator import im.vector.app.features.notifications.NotifiableEventResolver @@ -160,6 +161,8 @@ interface VectorComponent { fun pinLocker(): PinLocker + fun autoAcceptInvites(): AutoAcceptInvites + fun webRtcCallManager(): WebRtcCallManager fun roomSummaryHolder(): RoomSummariesHolder diff --git a/vector/src/main/java/im/vector/app/core/di/VectorModule.kt b/vector/src/main/java/im/vector/app/core/di/VectorModule.kt index 77cad0ae73..006a2f5aa0 100644 --- a/vector/src/main/java/im/vector/app/core/di/VectorModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/VectorModule.kt @@ -25,6 +25,8 @@ import dagger.Module import dagger.Provides import im.vector.app.core.error.DefaultErrorFormatter import im.vector.app.core.error.ErrorFormatter +import im.vector.app.features.invite.AutoAcceptInvites +import im.vector.app.features.invite.CompileTimeAutoAcceptInvites import im.vector.app.features.navigation.DefaultNavigator import im.vector.app.features.navigation.Navigator import im.vector.app.features.pin.PinCodeStore @@ -105,4 +107,7 @@ abstract class VectorModule { @Binds abstract fun bindPinCodeStore(store: SharedPrefPinCodeStore): PinCodeStore + + @Binds + abstract fun bindAutoAcceptInvites(autoAcceptInvites: CompileTimeAutoAcceptInvites): AutoAcceptInvites } diff --git a/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt b/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt index afa50de9b6..b87b7f0286 100644 --- a/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt +++ b/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt @@ -20,14 +20,11 @@ import android.app.Activity import android.text.Editable import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.SimpleTextWatcher import im.vector.app.databinding.DialogExportE2eKeysBinding class ExportKeysDialog { - private var passwordVisible = false - fun show(activity: Activity, exportKeyDialogListener: ExportKeyDialogListener) { val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_export_e2e_keys, null) val views = DialogExportE2eKeysBinding.bind(dialogLayout) @@ -57,13 +54,6 @@ class ExportKeysDialog { views.exportDialogEt.addTextChangedListener(textWatcher) views.exportDialogEtConfirm.addTextChangedListener(textWatcher) - views.exportDialogShowPassword.setOnClickListener { - passwordVisible = !passwordVisible - views.exportDialogEt.showPassword(passwordVisible) - views.exportDialogEtConfirm.showPassword(passwordVisible) - views.exportDialogShowPassword.render(passwordVisible) - } - val exportDialog = builder.show() views.exportDialogSubmit.setOnClickListener { diff --git a/vector/src/main/java/im/vector/app/core/dialogs/PromptPasswordDialog.kt b/vector/src/main/java/im/vector/app/core/dialogs/PromptPasswordDialog.kt deleted file mode 100644 index 500062376e..0000000000 --- a/vector/src/main/java/im/vector/app/core/dialogs/PromptPasswordDialog.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2020 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.core.dialogs - -import android.app.Activity -import android.content.DialogInterface -import android.text.Editable -import android.view.KeyEvent -import androidx.appcompat.app.AlertDialog -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import im.vector.app.R -import im.vector.app.core.extensions.hideKeyboard -import im.vector.app.core.extensions.showPassword -import im.vector.app.core.platform.SimpleTextWatcher -import im.vector.app.databinding.DialogPromptPasswordBinding - -class PromptPasswordDialog { - - private var passwordVisible = false - - fun show(activity: Activity, listener: (String) -> Unit) { - val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_prompt_password, null) - val views = DialogPromptPasswordBinding.bind(dialogLayout) - val textWatcher = object : SimpleTextWatcher() { - override fun afterTextChanged(s: Editable) { - views.promptPasswordTil.error = null - } - } - views.promptPassword.addTextChangedListener(textWatcher) - - views.promptPasswordPasswordReveal.setOnClickListener { - passwordVisible = !passwordVisible - views.promptPassword.showPassword(passwordVisible) - views.promptPasswordPasswordReveal.render(passwordVisible) - } - - MaterialAlertDialogBuilder(activity) - .setIcon(android.R.drawable.ic_dialog_alert) - .setTitle(R.string.devices_delete_dialog_title) - .setView(dialogLayout) - .setPositiveButton(R.string.auth_submit, null) - .setNegativeButton(R.string.cancel, null) - .setOnKeyListener(DialogInterface.OnKeyListener { dialog, keyCode, event -> - if (event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { - dialog.cancel() - return@OnKeyListener true - } - false - }) - .setOnDismissListener { - dialogLayout.hideKeyboard() - } - .create() - .apply { - setOnShowListener { - getButton(AlertDialog.BUTTON_POSITIVE) - .setOnClickListener { - if (views.promptPassword.text.toString().isEmpty()) { - views.promptPasswordTil.error = activity.getString(R.string.error_empty_field_your_password) - } else { - listener.invoke(views.promptPassword.text.toString()) - dismiss() - } - } - } - } - .show() - } -} diff --git a/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt b/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt index b5f45e6586..c0219b26e2 100644 --- a/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt +++ b/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt @@ -116,7 +116,9 @@ class DefaultErrorFormatter @Inject constructor( throwable.localizedMessage } } - is DialPadLookup.Failure -> + is DialPadLookup.Failure.NumberIsYours -> + stringProvider.getString(R.string.cannot_call_yourself) + is DialPadLookup.Failure.NoResult -> stringProvider.getString(R.string.call_dial_pad_lookup_error) else -> throwable.localizedMessage } diff --git a/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt b/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt index 31aaac41f0..759e130e29 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt @@ -40,13 +40,8 @@ fun SearchView.withoutLeftMargin() { } } -fun EditText.showPassword(visible: Boolean, updateCursor: Boolean = true) { - if (visible) { - inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD - } else { - inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD - } - if (updateCursor) setSelection(text?.length ?: 0) +fun EditText.hidePassword() { + inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD } fun View.getMeasurements(): Pair<Int, Int> { diff --git a/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt b/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt new file mode 100644 index 0000000000..32968c4f80 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.core.glide + +import android.content.Context +import android.graphics.drawable.Drawable +import com.bumptech.glide.Priority +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.data.DataFetcher +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import com.bumptech.glide.signature.ObjectKey +import im.vector.app.core.extensions.vectorComponent +import org.matrix.android.sdk.api.util.MatrixItem + +data class AvatarPlaceholder(val matrixItem: MatrixItem) + +class AvatarPlaceholderModelLoaderFactory(private val context: Context) : ModelLoaderFactory<AvatarPlaceholder, Drawable> { + + override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<AvatarPlaceholder, Drawable> { + return AvatarPlaceholderModelLoader(context) + } + + override fun teardown() { + // Is there something to do here? + } +} + +class AvatarPlaceholderModelLoader(private val context: Context) + : ModelLoader<AvatarPlaceholder, Drawable> { + + override fun buildLoadData(model: AvatarPlaceholder, width: Int, height: Int, options: Options): ModelLoader.LoadData<Drawable>? { + return ModelLoader.LoadData(ObjectKey(model), AvatarPlaceholderDataFetcher(context, model)) + } + + override fun handles(model: AvatarPlaceholder): Boolean { + return true + } +} + +class AvatarPlaceholderDataFetcher(context: Context, private val data: AvatarPlaceholder) + : DataFetcher<Drawable> { + + private val avatarRenderer = context.vectorComponent().avatarRenderer() + + override fun loadData(priority: Priority, callback: DataFetcher.DataCallback<in Drawable>) { + val avatarPlaceholder = avatarRenderer.getPlaceholderDrawable(data.matrixItem) + callback.onDataReady(avatarPlaceholder) + } + + override fun cleanup() { + // NOOP + } + + override fun cancel() { + // NOOP + } + + override fun getDataClass(): Class<Drawable> { + return Drawable::class.java + } + + override fun getDataSource(): DataSource { + return DataSource.LOCAL + } +} diff --git a/vector/src/main/java/im/vector/app/core/glide/MyAppGlideModule.kt b/vector/src/main/java/im/vector/app/core/glide/MyAppGlideModule.kt index 6ded33f823..74c9d4f0f6 100644 --- a/vector/src/main/java/im/vector/app/core/glide/MyAppGlideModule.kt +++ b/vector/src/main/java/im/vector/app/core/glide/MyAppGlideModule.kt @@ -17,6 +17,7 @@ package im.vector.app.core.glide import android.content.Context +import android.graphics.drawable.Drawable import android.util.Log import com.bumptech.glide.Glide @@ -40,5 +41,10 @@ class MyAppGlideModule : AppGlideModule() { InputStream::class.java, VectorGlideModelLoaderFactory(context) ) + registry.append( + AvatarPlaceholder::class.java, + Drawable::class.java, + AvatarPlaceholderModelLoaderFactory(context) + ) } } diff --git a/vector/src/main/java/im/vector/app/core/platform/ToolbarConfigurable.kt b/vector/src/main/java/im/vector/app/core/platform/ToolbarConfigurable.kt index c42a47c40c..9aca8dd17f 100644 --- a/vector/src/main/java/im/vector/app/core/platform/ToolbarConfigurable.kt +++ b/vector/src/main/java/im/vector/app/core/platform/ToolbarConfigurable.kt @@ -16,9 +16,9 @@ package im.vector.app.core.platform -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar interface ToolbarConfigurable { - fun configure(toolbar: Toolbar) + fun configure(toolbar: MaterialToolbar) } diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt index ddfb578e95..899a99c314 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt @@ -32,7 +32,7 @@ import androidx.annotation.MainThread import androidx.annotation.MenuRes import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat import androidx.core.view.isVisible @@ -519,7 +519,7 @@ abstract class VectorBaseActivity<VB: ViewBinding> : AppCompatActivity(), HasScr /** * Configure the Toolbar, with default back button. */ - protected fun configureToolbar(toolbar: Toolbar, displayBack: Boolean = true) { + protected fun configureToolbar(toolbar: MaterialToolbar, displayBack: Boolean = true) { setSupportActionBar(toolbar) supportActionBar?.let { it.setDisplayShowHomeEnabled(displayBack) diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt index b5b6937aad..2c9452c4fd 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt @@ -14,11 +14,8 @@ * limitations under the License. */ -@file:Suppress("DEPRECATION") - package im.vector.app.core.platform -import android.app.ProgressDialog import android.content.Context import android.os.Bundle import android.os.Parcelable @@ -29,11 +26,12 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.CallSuper import androidx.annotation.MainThread -import androidx.appcompat.widget.Toolbar +import androidx.appcompat.app.AlertDialog import androidx.lifecycle.ViewModelProvider import androidx.viewbinding.ViewBinding import com.airbnb.mvrx.BaseMvRxFragment import com.bumptech.glide.util.Util.assertMainThread +import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.jakewharton.rxbinding3.view.clicks import im.vector.app.R @@ -44,14 +42,14 @@ import im.vector.app.core.dialogs.UnrecognizedCertificateDialog import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.extensions.toMvRxBundle import im.vector.app.features.navigation.Navigator +import im.vector.lib.ui.styles.dialogs.MaterialProgressDialog import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable - import timber.log.Timber import java.util.concurrent.TimeUnit -abstract class VectorBaseFragment<VB: ViewBinding> : BaseMvRxFragment(), HasScreenInjector { +abstract class VectorBaseFragment<VB : ViewBinding> : BaseMvRxFragment(), HasScreenInjector { protected val vectorBaseActivity: VectorBaseActivity<*> by lazy { activity as VectorBaseActivity<*> @@ -67,7 +65,7 @@ abstract class VectorBaseFragment<VB: ViewBinding> : BaseMvRxFragment(), HasScre protected lateinit var errorFormatter: ErrorFormatter protected lateinit var unrecognizedCertificateDialog: UnrecognizedCertificateDialog - private var progress: ProgressDialog? = null + private var progress: AlertDialog? = null /* ========================================================================================== * View model @@ -203,14 +201,10 @@ abstract class VectorBaseFragment<VB: ViewBinding> : BaseMvRxFragment(), HasScre vectorBaseActivity.getCoordinatorLayout()?.showOptimizedSnackbar(errorFormatter.toHumanReadable(throwable)) } - protected fun showLoadingDialog(message: CharSequence? = null, cancelable: Boolean = false) { + protected fun showLoadingDialog(message: CharSequence? = null) { progress?.dismiss() - progress = ProgressDialog(requireContext()).apply { - setCancelable(cancelable) - setMessage(message ?: getString(R.string.please_wait)) - setProgressStyle(ProgressDialog.STYLE_SPINNER) - show() - } + progress = MaterialProgressDialog(requireContext()) + .show(message ?: getString(R.string.please_wait)) } protected fun dismissLoadingDialog() { @@ -224,7 +218,7 @@ abstract class VectorBaseFragment<VB: ViewBinding> : BaseMvRxFragment(), HasScre /** * Configure the Toolbar. */ - protected fun setupToolbar(toolbar: Toolbar) { + protected fun setupToolbar(toolbar: MaterialToolbar) { val parentActivity = vectorBaseActivity if (parentActivity is ToolbarConfigurable) { parentActivity.configure(toolbar) diff --git a/vector/src/main/java/im/vector/app/core/ui/views/JumpToReadMarkerView.kt b/vector/src/main/java/im/vector/app/core/ui/views/JumpToReadMarkerView.kt deleted file mode 100644 index 28e23c0e50..0000000000 --- a/vector/src/main/java/im/vector/app/core/ui/views/JumpToReadMarkerView.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.core.ui.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.RelativeLayout -import androidx.core.content.ContextCompat -import im.vector.app.R -import im.vector.app.databinding.ViewJumpToReadMarkerBinding - -class JumpToReadMarkerView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : RelativeLayout(context, attrs, defStyleAttr) { - - interface Callback { - fun onJumpToReadMarkerClicked() - fun onClearReadMarkerClicked() - } - - var callback: Callback? = null - - init { - setupView() - } - - private fun setupView() { - inflate(context, R.layout.view_jump_to_read_marker, this) - val views = ViewJumpToReadMarkerBinding.bind(this) - setBackgroundColor(ContextCompat.getColor(context, R.color.notification_accent_color)) - views.jumpToReadMarkerLabelView.setOnClickListener { - callback?.onJumpToReadMarkerClicked() - } - views.closeJumpToReadMarkerView.setOnClickListener { - visibility = View.INVISIBLE - callback?.onClearReadMarkerClicked() - } - } -} diff --git a/vector/src/main/java/im/vector/app/core/ui/views/NonScrollingTextView.kt b/vector/src/main/java/im/vector/app/core/ui/views/NonScrollingTextView.kt index 712432abfd..6c9b3d19fc 100644 --- a/vector/src/main/java/im/vector/app/core/ui/views/NonScrollingTextView.kt +++ b/vector/src/main/java/im/vector/app/core/ui/views/NonScrollingTextView.kt @@ -18,9 +18,9 @@ package im.vector.app.core.ui.views import android.content.Context import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatTextView +import com.google.android.material.textview.MaterialTextView -class NonScrollingTextView : AppCompatTextView { +class NonScrollingTextView : MaterialTextView { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) diff --git a/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt b/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt deleted file mode 100644 index b4bcecad16..0000000000 --- a/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2021 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.core.ui.views - -import android.content.Context -import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatImageView -import im.vector.app.R - -class RevealPasswordImageView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : AppCompatImageView(context, attrs, defStyleAttr) { - - init { - render(false) - } - - fun render(isPasswordShown: Boolean) { - if (isPasswordShown) { - contentDescription = context.getString(R.string.a11y_hide_password) - setImageResource(R.drawable.ic_eye_closed) - } else { - contentDescription = context.getString(R.string.a11y_show_password) - setImageResource(R.drawable.ic_eye) - } - } -} diff --git a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewActivity.kt b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewActivity.kt index f282cc3358..6c25f688bd 100644 --- a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewActivity.kt +++ b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewActivity.kt @@ -19,7 +19,7 @@ package im.vector.app.features.attachments.preview import android.content.Context import android.content.Intent -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import im.vector.app.R import im.vector.app.core.extensions.addFragment import im.vector.app.core.platform.ToolbarConfigurable @@ -72,7 +72,7 @@ class AttachmentsPreviewActivity : VectorBaseActivity<ActivitySimpleBinding>(), finish() } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } } diff --git a/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt b/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt index 4bdd54ae45..501af00ad2 100644 --- a/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt +++ b/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt @@ -24,7 +24,6 @@ import androidx.core.view.isVisible import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.withState import im.vector.app.R -import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentReauthConfirmBinding import org.matrix.android.sdk.api.auth.data.LoginFlowTypes @@ -41,13 +40,6 @@ class PromptFragment : VectorBaseFragment<FragmentReauthConfirmBinding>() { views.reAuthConfirmButton.debouncedClicks { onButtonClicked() } - views.passwordReveal.debouncedClicks { - viewModel.handle(ReAuthActions.StartSSOFallback) - } - - views.passwordReveal.debouncedClicks { - viewModel.handle(ReAuthActions.TogglePassVisibility) - } } private fun onButtonClicked() = withState(viewModel) { state -> @@ -74,11 +66,11 @@ class PromptFragment : VectorBaseFragment<FragmentReauthConfirmBinding>() { override fun invalidate() = withState(viewModel) { when (it.flowType) { LoginFlowTypes.SSO -> { - views.passwordContainer.isVisible = false + views.passwordFieldTil.isVisible = false views.reAuthConfirmButton.text = getString(R.string.auth_login_sso) } LoginFlowTypes.PASSWORD -> { - views.passwordContainer.isVisible = true + views.passwordFieldTil.isVisible = true views.reAuthConfirmButton.text = getString(R.string._continue) } else -> { @@ -86,9 +78,6 @@ class PromptFragment : VectorBaseFragment<FragmentReauthConfirmBinding>() { } } - views.passwordField.showPassword(it.passwordVisible) - views.passwordReveal.render(it.passwordVisible) - if (it.lastErrorCode != null) { when (it.flowType) { LoginFlowTypes.SSO -> { diff --git a/vector/src/main/java/im/vector/app/features/auth/ReAuthActions.kt b/vector/src/main/java/im/vector/app/features/auth/ReAuthActions.kt index 036afda405..b0a7a9fe4c 100644 --- a/vector/src/main/java/im/vector/app/features/auth/ReAuthActions.kt +++ b/vector/src/main/java/im/vector/app/features/auth/ReAuthActions.kt @@ -22,6 +22,5 @@ sealed class ReAuthActions : VectorViewModelAction { object StartSSOFallback : ReAuthActions() object FallBackPageLoaded : ReAuthActions() object FallBackPageClosed : ReAuthActions() - object TogglePassVisibility : ReAuthActions() data class ReAuthWithPass(val password: String) : ReAuthActions() } diff --git a/vector/src/main/java/im/vector/app/features/auth/ReAuthState.kt b/vector/src/main/java/im/vector/app/features/auth/ReAuthState.kt index 540a08405c..075ef758b8 100644 --- a/vector/src/main/java/im/vector/app/features/auth/ReAuthState.kt +++ b/vector/src/main/java/im/vector/app/features/auth/ReAuthState.kt @@ -23,7 +23,6 @@ data class ReAuthState( val session: String? = null, val flowType: String? = null, val ssoFallbackPageWasShown: Boolean = false, - val passwordVisible: Boolean = false, val lastErrorCode: String? = null, val resultKeyStoreAlias: String = "" ) : MvRxState { diff --git a/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt b/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt index 4204da0d24..edbceae20f 100644 --- a/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt @@ -65,13 +65,6 @@ class ReAuthViewModel @AssistedInject constructor( ReAuthActions.FallBackPageClosed -> { // Should we do something here? } - ReAuthActions.TogglePassVisibility -> { - setState { - copy( - passwordVisible = !state.passwordVisible - ) - } - } is ReAuthActions.ReAuthWithPass -> { val safeForIntentCypher = ByteArrayOutputStream().also { it.use { diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt index 11b3a51c6f..21939bd42b 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt @@ -198,18 +198,7 @@ class VectorCallActivity : VectorBaseActivity<ActivityCallBinding>(), CallContro } is CallState.Connected -> { if (callState.iceConnectionState == MxPeerConnectionState.CONNECTED) { - if (state.transferee !is VectorCallViewState.TransfereeState.NoTransferee) { - val transfereeName = if (state.transferee is VectorCallViewState.TransfereeState.KnownTransferee) { - state.transferee.name - } else { - getString(R.string.call_transfer_unknown_person) - } - views.callActionText.text = getString(R.string.call_transfer_transfer_to_title, transfereeName) - views.callActionText.isVisible = true - views.callActionText.setOnClickListener { callViewModel.handle(VectorCallViewActions.TransferCall) } - views.callStatusText.text = state.formattedDuration - configureCallInfo(state) - } else if (state.isLocalOnHold || state.isRemoteOnHold) { + if (state.isLocalOnHold || state.isRemoteOnHold) { views.smallIsHeldIcon.isVisible = true views.callVideoGroup.isInvisible = true views.callInfoGroup.isVisible = true @@ -221,10 +210,21 @@ class VectorCallActivity : VectorBaseActivity<ActivityCallBinding>(), CallContro views.callStatusText.setText(R.string.call_held_by_you) } else { views.callActionText.isInvisible = true - state.callInfo.otherUserItem?.let { + state.callInfo?.opponentUserItem?.let { views.callStatusText.text = getString(R.string.call_held_by_user, it.getBestName()) } } + } else if (state.transferee !is VectorCallViewState.TransfereeState.NoTransferee) { + val transfereeName = if (state.transferee is VectorCallViewState.TransfereeState.KnownTransferee) { + state.transferee.name + } else { + getString(R.string.call_transfer_unknown_person) + } + views.callActionText.text = getString(R.string.call_transfer_transfer_to_title, transfereeName) + views.callActionText.isVisible = true + views.callActionText.setOnClickListener { callViewModel.handle(VectorCallViewActions.TransferCall) } + views.callStatusText.text = state.formattedDuration + configureCallInfo(state) } else { views.callStatusText.text = state.formattedDuration configureCallInfo(state) @@ -255,31 +255,32 @@ class VectorCallActivity : VectorBaseActivity<ActivityCallBinding>(), CallContro } private fun configureCallInfo(state: VectorCallViewState, blurAvatar: Boolean = false) { - state.callInfo.otherUserItem?.let { - val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen) - avatarRenderer.renderBlur(it, views.bgCallView, sampling = 20, rounded = false, colorFilter = colorFilter) + state.callInfo?.opponentUserItem?.let { + val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen_blur) + avatarRenderer.renderBlur(it, views.bgCallView, sampling = 20, rounded = false, colorFilter = colorFilter, addPlaceholder = false) if (state.transferee is VectorCallViewState.TransfereeState.NoTransferee) { views.participantNameText.text = it.getBestName() } else { views.participantNameText.text = getString(R.string.call_transfer_consulting_with, it.getBestName()) } if (blurAvatar) { - avatarRenderer.renderBlur(it, views.otherMemberAvatar, sampling = 2, rounded = true, colorFilter = colorFilter) + avatarRenderer.renderBlur(it, views.otherMemberAvatar, sampling = 2, rounded = true, colorFilter = colorFilter, addPlaceholder = true) } else { avatarRenderer.render(it, views.otherMemberAvatar) } } - if (state.otherKnownCallInfo?.otherUserItem == null) { + if (state.otherKnownCallInfo?.opponentUserItem == null) { views.otherKnownCallLayout.isVisible = false } else { val otherCall = callManager.getCallById(state.otherKnownCallInfo.callId) - val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen) + val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen_blur) avatarRenderer.renderBlur( - matrixItem = state.otherKnownCallInfo.otherUserItem, + matrixItem = state.otherKnownCallInfo.opponentUserItem, imageView = views.otherKnownCallAvatarView, sampling = 20, - rounded = false, - colorFilter = colorFilter + rounded = true, + colorFilter = colorFilter, + addPlaceholder = true ) views.otherKnownCallLayout.isVisible = true views.otherSmallIsHeldIcon.isVisible = otherCall?.let { it.isLocalOnHold || it.remoteOnHold }.orFalse() @@ -288,7 +289,7 @@ class VectorCallActivity : VectorBaseActivity<ActivityCallBinding>(), CallContro private fun configureCallViews() { views.callControlsView.interactionListener = this - views.otherKnownCallAvatarView.setOnClickListener { + views.otherKnownCallLayout.setOnClickListener { withState(callViewModel) { val otherCall = callManager.getCallById(it.otherKnownCallInfo?.callId ?: "") ?: return@withState startActivity(newIntent(this, otherCall, null)) diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt index 18eda0fd6f..e7b2b629e1 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt @@ -34,11 +34,13 @@ import im.vector.app.features.call.webrtc.getOpponentAsMatrixItem import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.call.CallState import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.api.session.call.MxPeerConnectionState import org.matrix.android.sdk.api.session.room.model.call.supportCallTransfer +import org.matrix.android.sdk.api.util.MatrixItem class VectorCallViewModel @AssistedInject constructor( @Assisted initialState: VectorCallViewState, @@ -87,6 +89,12 @@ class VectorCallViewModel @AssistedInject constructor( } } + override fun assertedIdentityChanged() { + setState { + copy(callInfo = call?.extractCallInfo()) + } + } + override fun onStateUpdate(call: MxCall) { val callState = call.state if (callState is CallState.Connected && callState.iceConnectionState == MxPeerConnectionState.CONNECTED) { @@ -160,8 +168,7 @@ class VectorCallViewModel @AssistedInject constructor( if (otherCall == null) { copy(otherKnownCallInfo = null) } else { - val otherUserItem = otherCall.getOpponentAsMatrixItem(session) - copy(otherKnownCallInfo = VectorCallViewState.CallInfo(otherCall.callId, otherUserItem)) + copy(otherKnownCallInfo = otherCall.extractCallInfo()) } } } @@ -175,7 +182,6 @@ class VectorCallViewModel @AssistedInject constructor( } else { call = webRtcCall callManager.addCurrentCallListener(currentCallListener) - val item = webRtcCall.getOpponentAsMatrixItem(session) webRtcCall.addListener(callListener) val currentSoundDevice = callManager.audioManager.selectedDevice if (currentSoundDevice == CallAudioManager.Device.PHONE) { @@ -185,7 +191,7 @@ class VectorCallViewModel @AssistedInject constructor( copy( isVideoCall = webRtcCall.mxCall.isVideoCall, callState = Success(webRtcCall.mxCall.state), - callInfo = VectorCallViewState.CallInfo(callId, item), + callInfo = webRtcCall.extractCallInfo(), device = currentSoundDevice ?: CallAudioManager.Device.PHONE, isLocalOnHold = webRtcCall.isLocalOnHold, isRemoteOnHold = webRtcCall.remoteOnHold, @@ -202,6 +208,22 @@ class VectorCallViewModel @AssistedInject constructor( } } + private fun WebRtcCall.extractCallInfo(): VectorCallViewState.CallInfo { + val assertedIdentity = this.remoteAssertedIdentity + val matrixItem = if (assertedIdentity != null) { + val userId = if (MatrixPatterns.isUserId(assertedIdentity.id)) { + assertedIdentity.id!! + } else { + // Need an id starting with @ + "@${assertedIdentity.displayName}" + } + MatrixItem.UserItem(userId, assertedIdentity.displayName, assertedIdentity.avatarUrl) + } else { + getOpponentAsMatrixItem(session) + } + return VectorCallViewState.CallInfo(callId, matrixItem) + } + override fun onCleared() { callManager.removeCurrentCallListener(currentCallListener) call?.removeListener(callListener) diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt index c5ae61cf60..3e7791cc08 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt @@ -39,7 +39,7 @@ data class VectorCallViewState( val availableDevices: Set<CallAudioManager.Device> = emptySet(), val callState: Async<CallState> = Uninitialized, val otherKnownCallInfo: CallInfo? = null, - val callInfo: CallInfo = CallInfo(callId), + val callInfo: CallInfo? = null, val formattedDuration: String = "", val canOpponentBeTransferred: Boolean = false, val transferee: TransfereeState = TransfereeState.NoTransferee @@ -53,7 +53,7 @@ data class VectorCallViewState( data class CallInfo( val callId: String, - val otherUserItem: MatrixItem? = null + val opponentUserItem: MatrixItem? = null ) constructor(callArgs: CallArgs) : this( diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt index 06b4dbfe7b..e7c8602698 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt @@ -61,6 +61,7 @@ class CallDialPadBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetCa arguments = Bundle().apply { putBoolean(DialPadFragment.EXTRA_ENABLE_DELETE, showActions) putBoolean(DialPadFragment.EXTRA_ENABLE_OK, showActions) + putBoolean(DialPadFragment.EXTRA_CURSOR_VISIBLE, false) putString(DialPadFragment.EXTRA_REGION_CODE, VectorLocale.applicationLocale.country) } callback = DialPadFragmentCallbackWrapper(this@CallDialPadBottomSheet.callback) @@ -70,7 +71,7 @@ class CallDialPadBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetCa } else { setCallbackToFragment(callback) } - views.callDialPadClose.setOnClickListener { + views.callDialPadClose.debouncedClicks { dismiss() } } @@ -88,10 +89,6 @@ class CallDialPadBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetCa private inner class DialPadFragmentCallbackWrapper(val callback: DialPadFragment.Callback?): DialPadFragment.Callback { - override fun onDigitAppended(digit: String) { - callback?.onDigitAppended(digit) - } - override fun onOkClicked(formatted: String?, raw: String?) { callback?.onOkClicked(formatted, raw) dismiss() diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadFragment.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadFragment.kt index fe0afc166d..5e2a569188 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadFragment.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadFragment.kt @@ -16,34 +16,40 @@ package im.vector.app.features.call.dialpad +import android.content.ClipboardManager import android.content.res.ColorStateList import android.os.Bundle +import android.telephony.PhoneNumberFormattingTextWatcher +import android.telephony.PhoneNumberUtils +import android.text.Editable +import android.text.InputType +import android.text.TextUtils +import android.text.TextWatcher +import android.text.method.DialerKeyListener +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.getSystemService import androidx.core.view.isVisible import androidx.core.widget.ImageViewCompat import androidx.fragment.app.Fragment import com.android.dialer.dialpadview.DialpadView import com.android.dialer.dialpadview.DigitsEditText -import com.android.dialer.dialpadview.R -import com.google.i18n.phonenumbers.AsYouTypeFormatter -import com.google.i18n.phonenumbers.PhoneNumberUtil +import im.vector.app.R import im.vector.app.features.themes.ThemeUtils -class DialPadFragment : Fragment() { +class DialPadFragment : Fragment(), TextWatcher { var callback: Callback? = null - private var digits: DigitsEditText? = null - private var formatter: AsYouTypeFormatter? = null - private var input = "" + private lateinit var digits: DigitsEditText private var regionCode: String = DEFAULT_REGION_CODE private var formatAsYouType = true private var enableStar = true private var enablePound = true private var enablePlus = true - private var cursorVisible = false + private var cursorVisible = true private var enableDelete = true private var enableFabOk = true @@ -53,72 +59,80 @@ class DialPadFragment : Fragment() { savedInstanceState: Bundle?): View { initArgs(savedInstanceState) val view = inflater.inflate(R.layout.dialpad_fragment, container, false) + view.setBackgroundColor(ThemeUtils.getColor(requireContext(), R.attr.backgroundColor)) val dialpadView = view.findViewById<View>(R.id.dialpad_view) as DialpadView dialpadView.findViewById<View>(R.id.dialpad_key_voicemail).isVisible = false - digits = dialpadView.digits as? DigitsEditText - digits?.isCursorVisible = cursorVisible - digits?.setTextColor(ThemeUtils.getColor(requireContext(), im.vector.app.R.attr.vctr_content_primary)) - dialpadView.findViewById<View>(R.id.zero).setOnClickListener { append('0') } - if (enablePlus) { - dialpadView.findViewById<View>(R.id.zero).setOnLongClickListener { - append('+') - true - } - } - dialpadView.findViewById<View>(R.id.one).setOnClickListener { append('1') } - dialpadView.findViewById<View>(R.id.two).setOnClickListener { append('2') } - dialpadView.findViewById<View>(R.id.three).setOnClickListener { append('3') } - dialpadView.findViewById<View>(R.id.four).setOnClickListener { append('4') } - dialpadView.findViewById<View>(R.id.four).setOnClickListener { append('4') } - dialpadView.findViewById<View>(R.id.five).setOnClickListener { append('5') } - dialpadView.findViewById<View>(R.id.six).setOnClickListener { append('6') } - dialpadView.findViewById<View>(R.id.seven).setOnClickListener { append('7') } - dialpadView.findViewById<View>(R.id.eight).setOnClickListener { append('8') } - dialpadView.findViewById<View>(R.id.nine).setOnClickListener { append('9') } + digits = dialpadView.digits as DigitsEditText + digits.isCursorVisible = cursorVisible + digits.inputType = InputType.TYPE_CLASS_PHONE + digits.keyListener = DialerKeyListener.getInstance() + digits.setTextColor(ThemeUtils.getColor(requireContext(), R.attr.vctr_content_primary)) + digits.addTextChangedListener(PhoneNumberFormattingTextWatcher(if (formatAsYouType) regionCode else "")) + digits.addTextChangedListener(this) + dialpadView.findViewById<View>(R.id.zero).setOnClickListener { keyPressed(KeyEvent.KEYCODE_0, "0") } + dialpadView.findViewById<View>(R.id.one).setOnClickListener { keyPressed(KeyEvent.KEYCODE_1, "1") } + dialpadView.findViewById<View>(R.id.two).setOnClickListener { keyPressed(KeyEvent.KEYCODE_2, "2") } + dialpadView.findViewById<View>(R.id.three).setOnClickListener { keyPressed(KeyEvent.KEYCODE_3, "3") } + dialpadView.findViewById<View>(R.id.four).setOnClickListener { keyPressed(KeyEvent.KEYCODE_4, "4") } + dialpadView.findViewById<View>(R.id.five).setOnClickListener { keyPressed(KeyEvent.KEYCODE_5, "5") } + dialpadView.findViewById<View>(R.id.six).setOnClickListener { keyPressed(KeyEvent.KEYCODE_6, "6") } + dialpadView.findViewById<View>(R.id.seven).setOnClickListener { keyPressed(KeyEvent.KEYCODE_7, "7") } + dialpadView.findViewById<View>(R.id.eight).setOnClickListener { keyPressed(KeyEvent.KEYCODE_8, "8") } + dialpadView.findViewById<View>(R.id.nine).setOnClickListener { keyPressed(KeyEvent.KEYCODE_9, "9") } if (enableStar) { - dialpadView.findViewById<View>(R.id.star).setOnClickListener { append('*') } + dialpadView.findViewById<View>(R.id.star).setOnClickListener { keyPressed(KeyEvent.KEYCODE_STAR, "*") } } else { dialpadView.findViewById<View>(R.id.star).isVisible = false } if (enablePound) { - dialpadView.findViewById<View>(R.id.pound).setOnClickListener { append('#') } + dialpadView.findViewById<View>(R.id.pound).setOnClickListener { keyPressed(KeyEvent.KEYCODE_POUND, "#") } } else { dialpadView.findViewById<View>(R.id.pound).isVisible = false } + if (enablePlus) { + dialpadView.findViewById<View>(R.id.zero).setOnLongClickListener { + keyPressed(KeyEvent.KEYCODE_PLUS, "+") + true + } + } if (enableDelete) { - dialpadView.deleteButton.setOnClickListener { poll() } + dialpadView.deleteButton.setOnClickListener { keyPressed(KeyEvent.KEYCODE_DEL, null) } dialpadView.deleteButton.setOnLongClickListener { clear() true } - val tintColor = ThemeUtils.getColor(requireContext(), im.vector.app.R.attr.vctr_content_secondary) + val tintColor = ThemeUtils.getColor(requireContext(), R.attr.vctr_content_secondary) ImageViewCompat.setImageTintList(dialpadView.deleteButton, ColorStateList.valueOf(tintColor)) } else { dialpadView.deleteButton.isVisible = false } - - // if region code is null, no formatting is performed - formatter = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(if (formatAsYouType) regionCode else "") - val fabOk = view.findViewById<View>(R.id.fab_ok) if (enableFabOk) { - fabOk.setOnClickListener { - callback?.onOkClicked(digits?.text.toString(), input) - } + fabOk.setOnClickListener { onOkClicked() } } else { fabOk.isVisible = false } - - digits?.setOnTextContextMenuClickListener { - val string = digits?.text.toString() - clear() - for (element in string) { - append(element) - } - } return view } + private fun onOkClicked() { + val rawInput = getRawInput() + if (rawInput.isEmpty()) { + val clipboard = requireContext().getSystemService<ClipboardManager>() + val textToPaste = clipboard?.primaryClip?.getItemAt(0)?.text ?: return + val formatted = formatNumber(textToPaste.toString()) + digits.setText(formatted) + digits.setSelection(digits.text!!.length) + } else { + val formatted = digits.text.toString() + callback?.onOkClicked(formatted, rawInput) + } + } + + fun getRawInput(): String { + return PhoneNumberUtils.normalizeNumber(digits.text.toString()) + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString(EXTRA_REGION_CODE, regionCode) @@ -145,40 +159,35 @@ class DialPadFragment : Fragment() { } } - private fun poll() { - if (input.isNotEmpty()) { - input = input.substring(0, input.length - 1) - formatter = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(regionCode) - if (formatAsYouType) { - digits?.setText("") - for (c in input.toCharArray()) { - digits?.setText(formatter?.inputDigit(c)) - } - } else { - digits?.setText(input) - } + private fun keyPressed(keyCode: Int, digitString: String?) { + val event = KeyEvent(KeyEvent.ACTION_DOWN, keyCode) + // Disable cursor and enable it again after onKeyDown otherwise DigitsEditText force replacing cursor at the end + digits.isCursorVisible = false + digits.onKeyDown(keyCode, event) + digits.isCursorVisible = cursorVisible + digitString?.also { + callback?.onDigitAppended(it) } } private fun clear() { - formatter?.clear() - digits?.setText("") - input = "" + digits.setText("") } - private fun append(c: Char) { - callback?.onDigitAppended(c.toString()) - input += c - if (formatAsYouType) { - digits?.setText(formatter?.inputDigit(c)) - } else { - digits?.setText(input) + private fun formatNumber(dialString: String): String { + val networkPortion = PhoneNumberUtils.extractNetworkPortion(dialString) + if (TextUtils.isEmpty(networkPortion)) { + return "" } + val number = PhoneNumberUtils.formatNumber(networkPortion, null, regionCode) ?: networkPortion + // Also retrieve the post dial portion of the provided data, so that the entire dial string can be reconstituted + val postDial = PhoneNumberUtils.extractPostDialPortion(dialString) + return number + postDial } interface Callback { - fun onOkClicked(formatted: String?, raw: String?) = Unit fun onDigitAppended(digit: String) = Unit + fun onOkClicked(formatted: String?, raw: String?) = Unit } companion object { @@ -193,4 +202,20 @@ class DialPadFragment : Fragment() { private const val DEFAULT_REGION_CODE = "US" } + + // Text watcher + + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { + // Noop + } + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + // Noop + } + + override fun afterTextChanged(s: Editable) { + if (s.isEmpty()) { + digits.clearFocus() + } + } } diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt index 4ed1e4a0db..4f025dc239 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt @@ -17,10 +17,11 @@ package im.vector.app.features.call.dialpad import im.vector.app.features.call.lookup.pstnLookup +import im.vector.app.features.call.lookup.sipNativeLookup +import im.vector.app.features.call.vectorCallService import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.createdirect.DirectRoomHelper import org.matrix.android.sdk.api.session.Session -import java.lang.IllegalStateException import javax.inject.Inject class DialPadLookup @Inject constructor( @@ -28,13 +29,25 @@ class DialPadLookup @Inject constructor( private val webRtcCallManager: WebRtcCallManager, private val directRoomHelper: DirectRoomHelper ) { - class Failure : Throwable() + sealed class Failure : Throwable() { + object NoResult: Failure() + object NumberIsYours: Failure() + } data class Result(val userId: String, val roomId: String) suspend fun lookupPhoneNumber(phoneNumber: String): Result { - val thirdPartyUser = session.pstnLookup(phoneNumber, webRtcCallManager.supportedPSTNProtocol).firstOrNull() ?: throw IllegalStateException() - val roomId = directRoomHelper.ensureDMExists(thirdPartyUser.userId) - return Result(userId = thirdPartyUser.userId, roomId = roomId) + session.vectorCallService.protocolChecker.awaitCheckProtocols() + val thirdPartyUser = session.pstnLookup(phoneNumber, webRtcCallManager.supportedPSTNProtocol).firstOrNull() ?: throw Failure.NoResult + // check to see if this is a virtual user, in which case we should find the native user + val nativeUserId = if (webRtcCallManager.supportsVirtualRooms) { + val nativeLookupResults = session.sipNativeLookup(thirdPartyUser.userId) + nativeLookupResults.firstOrNull()?.userId ?: thirdPartyUser.userId + } else { + thirdPartyUser.userId + } + if (nativeUserId == session.myUserId) throw Failure.NumberIsYours + val roomId = directRoomHelper.ensureDMExists(nativeUserId) + return Result(userId = nativeUserId, roomId = roomId) } } diff --git a/vector/src/main/java/im/vector/app/features/call/lookup/CallUserMapper.kt b/vector/src/main/java/im/vector/app/features/call/lookup/CallUserMapper.kt index 04177bd2b0..0820b34124 100644 --- a/vector/src/main/java/im/vector/app/features/call/lookup/CallUserMapper.kt +++ b/vector/src/main/java/im/vector/app/features/call/lookup/CallUserMapper.kt @@ -27,11 +27,21 @@ import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams class CallUserMapper(private val session: Session, private val protocolsChecker: CallProtocolsChecker) { fun nativeRoomForVirtualRoom(roomId: String): String? { + if (!protocolsChecker.supportVirtualRooms) return null val virtualRoom = session.getRoom(roomId) ?: return null val virtualRoomEvent = virtualRoom.getAccountDataEvent(RoomAccountDataTypes.EVENT_TYPE_VIRTUAL_ROOM) return virtualRoomEvent?.content?.toModel<RoomVirtualContent>()?.nativeRoomId } + fun virtualRoomForNativeRoom(roomId: String): String? { + if (!protocolsChecker.supportVirtualRooms) return null + val virtualRoomEvents = session.accountDataService().getRoomAccountDataEvents(setOf(RoomAccountDataTypes.EVENT_TYPE_VIRTUAL_ROOM)) + return virtualRoomEvents.firstOrNull { + val virtualRoomContent = it.content.toModel<RoomVirtualContent>() + virtualRoomContent?.nativeRoomId == roomId + }?.roomId + } + suspend fun getOrCreateVirtualRoomForRoom(roomId: String, opponentUserId: String): String? { protocolsChecker.awaitCheckProtocols() if (!protocolsChecker.supportVirtualRooms) return null @@ -57,10 +67,6 @@ class CallUserMapper(private val session: Session, private val protocolsChecker: // will make sure we know where how to map calls and also allow us know not to display // it in the future. invitedRoom.markVirtual(nativeRoomId) - // also auto-join the virtual room if we have a matching native room - // (possibly we should only join if we've also joined the native room, then we'd also have - // to make sure we joined virtual rooms on joining a native one) - session.joinRoom(invitedRoomId) } } } diff --git a/vector/src/main/java/im/vector/app/features/call/lookup/ThirdPartyLookup.kt b/vector/src/main/java/im/vector/app/features/call/lookup/ThirdPartyLookup.kt index 1e9834059f..dfdc58f78f 100644 --- a/vector/src/main/java/im/vector/app/features/call/lookup/ThirdPartyLookup.kt +++ b/vector/src/main/java/im/vector/app/features/call/lookup/ThirdPartyLookup.kt @@ -16,10 +16,13 @@ package im.vector.app.features.call.lookup +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.thirdparty.model.ThirdPartyUser +private const val LOOKUP_SUCCESS_FIELD = "lookup_success" + suspend fun Session.pstnLookup(phoneNumber: String, protocol: String?): List<ThirdPartyUser> { if (protocol == null) return emptyList() return tryOrNull { @@ -36,7 +39,11 @@ suspend fun Session.sipVirtualLookup(nativeMxid: String): List<ThirdPartyUser> { protocol = PROTOCOL_SIP_VIRTUAL, fields = mapOf("native_mxid" to nativeMxid) ) - }.orEmpty() + } + .orEmpty() + .filter { + (it.fields[LOOKUP_SUCCESS_FIELD] as? Boolean).orFalse() + } } suspend fun Session.sipNativeLookup(virtualMxid: String): List<ThirdPartyUser> { @@ -45,5 +52,9 @@ suspend fun Session.sipNativeLookup(virtualMxid: String): List<ThirdPartyUser> { protocol = PROTOCOL_SIP_NATIVE, fields = mapOf("virtual_mxid" to virtualMxid) ) - }.orEmpty() + } + .orEmpty() + .filter { + (it.fields[LOOKUP_SUCCESS_FIELD] as? Boolean).orFalse() + } } diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt index 7f59a1c89b..c80b21334a 100644 --- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt @@ -79,24 +79,20 @@ class CallTransferActivity : VectorBaseActivity<ActivityCallTransferBinding>(), waitingView = views.waitingView.waitingView callTransferViewModel.observeViewEvents { - when (it) { + when (it) { is CallTransferViewEvents.Dismiss -> finish() CallTransferViewEvents.Loading -> showWaitingView() is CallTransferViewEvents.FailToTransfer -> showSnackbar(getString(R.string.call_transfer_failure)) } } - sectionsPagerAdapter = CallTransferPagerAdapter(this).register() + sectionsPagerAdapter = CallTransferPagerAdapter(this) views.callTransferViewPager.adapter = sectionsPagerAdapter - sectionsPagerAdapter.onDialPadOkClicked = { phoneNumber -> - val action = CallTransferAction.ConnectWithPhoneNumber(views.callTransferConsultCheckBox.isChecked, phoneNumber) - callTransferViewModel.handle(action) - } TabLayoutMediator(views.callTransferTabLayout, views.callTransferViewPager) { tab, position -> when (position) { - 0 -> tab.text = getString(R.string.call_transfer_users_tab_title) - 1 -> tab.text = getString(R.string.call_dial_pad_title) + CallTransferPagerAdapter.USER_LIST_INDEX -> tab.text = getString(R.string.call_transfer_users_tab_title) + CallTransferPagerAdapter.DIAL_PAD_INDEX -> tab.text = getString(R.string.call_dial_pad_title) } }.attach() configureToolbar(views.callTransferToolbar) @@ -106,10 +102,17 @@ class CallTransferActivity : VectorBaseActivity<ActivityCallTransferBinding>(), private fun setupConnectAction() { views.callTransferConnectAction.debouncedClicks { - val selectedUser = sectionsPagerAdapter.userListFragment?.getCurrentState()?.getSelectedMatrixId()?.firstOrNull() - if (selectedUser != null) { - val action = CallTransferAction.ConnectWithUserId(views.callTransferConsultCheckBox.isChecked, selectedUser) - callTransferViewModel.handle(action) + when (views.callTransferTabLayout.selectedTabPosition) { + CallTransferPagerAdapter.USER_LIST_INDEX -> { + val selectedUser = sectionsPagerAdapter.userListFragment?.getCurrentState()?.getSelectedMatrixId()?.firstOrNull() ?: return@debouncedClicks + val action = CallTransferAction.ConnectWithUserId(views.callTransferConsultCheckBox.isChecked, selectedUser) + callTransferViewModel.handle(action) + } + CallTransferPagerAdapter.DIAL_PAD_INDEX -> { + val phoneNumber = sectionsPagerAdapter.dialPadFragment?.getRawInput() ?: return@debouncedClicks + val action = CallTransferAction.ConnectWithPhoneNumber(views.callTransferConsultCheckBox.isChecked, phoneNumber) + callTransferViewModel.handle(action) + } } } } diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferPagerAdapter.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferPagerAdapter.kt index 1f2d3070dd..2bb544bdbb 100644 --- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferPagerAdapter.kt +++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferPagerAdapter.kt @@ -21,7 +21,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.viewpager2.adapter.FragmentStateAdapter import im.vector.app.core.extensions.toMvRxBundle -import im.vector.app.core.platform.Restorable import im.vector.app.features.call.dialpad.DialPadFragment import im.vector.app.features.settings.VectorLocale import im.vector.app.features.userdirectory.UserListFragment @@ -29,14 +28,17 @@ import im.vector.app.features.userdirectory.UserListFragmentArgs class CallTransferPagerAdapter( private val fragmentActivity: FragmentActivity -) : FragmentStateAdapter(fragmentActivity), Restorable { +) : FragmentStateAdapter(fragmentActivity) { + + companion object { + const val USER_LIST_INDEX = 0 + const val DIAL_PAD_INDEX = 1 + } val userListFragment: UserListFragment? - get() = findFragmentAtPosition(0) as? UserListFragment + get() = findFragmentAtPosition(USER_LIST_INDEX) as? UserListFragment val dialPadFragment: DialPadFragment? - get() = findFragmentAtPosition(1) as? DialPadFragment - - var onDialPadOkClicked: ((String) -> Unit)? = null + get() = findFragmentAtPosition(DIAL_PAD_INDEX) as? DialPadFragment override fun getItemCount() = 2 @@ -57,10 +59,9 @@ class CallTransferPagerAdapter( (fragment as DialPadFragment).apply { arguments = Bundle().apply { putBoolean(DialPadFragment.EXTRA_ENABLE_DELETE, true) - putBoolean(DialPadFragment.EXTRA_ENABLE_OK, true) + putBoolean(DialPadFragment.EXTRA_ENABLE_OK, false) putString(DialPadFragment.EXTRA_REGION_CODE, VectorLocale.applicationLocale.country) } - applyCallback() } } return fragment @@ -69,20 +70,4 @@ class CallTransferPagerAdapter( private fun findFragmentAtPosition(position: Int): Fragment? { return fragmentActivity.supportFragmentManager.findFragmentByTag("f$position") } - - override fun onSaveInstanceState(outState: Bundle) = Unit - - override fun onRestoreInstanceState(savedInstanceState: Bundle?) { - dialPadFragment?.applyCallback() - } - - private fun DialPadFragment.applyCallback(): DialPadFragment { - callback = object : DialPadFragment.Callback { - override fun onOkClicked(formatted: String?, raw: String?) { - if (raw.isNullOrEmpty()) return - onDialPadOkClicked?.invoke(raw) - } - } - return this - } } diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt index c688c48429..3259b0915f 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt @@ -27,6 +27,7 @@ import im.vector.app.features.call.CameraProxy import im.vector.app.features.call.CameraType import im.vector.app.features.call.CaptureFormat import im.vector.app.features.call.VectorCallActivity +import im.vector.app.features.call.lookup.sipNativeLookup import im.vector.app.features.call.utils.asWebRTC import im.vector.app.features.call.utils.awaitCreateAnswer import im.vector.app.features.call.utils.awaitCreateOffer @@ -51,6 +52,7 @@ import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.api.session.call.MxPeerConnectionState import org.matrix.android.sdk.api.session.call.TurnServerResponse import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -81,9 +83,9 @@ import java.util.concurrent.TimeUnit import javax.inject.Provider import kotlin.coroutines.CoroutineContext -private const val STREAM_ID = "ARDAMS" -private const val AUDIO_TRACK_ID = "ARDAMSa0" -private const val VIDEO_TRACK_ID = "ARDAMSv0" +private const val STREAM_ID = "userMedia" +private const val AUDIO_TRACK_ID = "${STREAM_ID}a0" +private const val VIDEO_TRACK_ID = "${STREAM_ID}v0" private val DEFAULT_AUDIO_CONSTRAINTS = MediaConstraints() class WebRtcCall( @@ -104,6 +106,7 @@ class WebRtcCall( fun onCaptureStateChanged() {} fun onCameraChanged() {} fun onHoldUnhold() {} + fun assertedIdentityChanged() {} fun onTick(formattedDuration: String) {} override fun onStateUpdate(call: MxCall) {} } @@ -168,6 +171,8 @@ class WebRtcCall( // This value is used to track localOnHold when changing remoteOnHold value private var wasLocalOnHold = false + var remoteAssertedIdentity: CallAssertedIdentityContent.AssertedIdentity? = null + private set var offerSdp: CallInviteContent.Offer? = null @@ -269,12 +274,77 @@ class WebRtcCall( peerConnection = peerConnectionFactory.createPeerConnection(rtcConfig, PeerConnectionObserver(this)) } - fun attachViewRenderers(localViewRenderer: SurfaceViewRenderer?, remoteViewRenderer: SurfaceViewRenderer, mode: String?) { - Timber.v("## VOIP attachViewRenderers localRendeder $localViewRenderer / $remoteViewRenderer") - localSurfaceRenderers.addIfNeeded(localViewRenderer) - remoteSurfaceRenderers.addIfNeeded(remoteViewRenderer) - + /** + * Without consultation + */ + fun transferToUser(targetUserId: String, targetRoomId: String?) { sessionScope?.launch(dispatcher) { + mxCall.transfer( + targetUserId = targetUserId, + targetRoomId = targetRoomId, + createCallId = CallIdGenerator.generate(), + awaitCallId = null + ) + endCall(sendEndSignaling = false) + } + } + + /** + * With consultation + */ + fun transferToCall(transferTargetCall: WebRtcCall) { + sessionScope?.launch(dispatcher) { + val newCallId = CallIdGenerator.generate() + transferTargetCall.mxCall.transfer( + targetUserId = mxCall.opponentUserId, + targetRoomId = null, + createCallId = null, + awaitCallId = newCallId + ) + mxCall.transfer( + targetUserId = transferTargetCall.mxCall.opponentUserId, + targetRoomId = null, + createCallId = newCallId, + awaitCallId = null + ) + endCall(sendEndSignaling = false) + transferTargetCall.endCall(sendEndSignaling = false) + } + } + + fun acceptIncomingCall() { + sessionScope?.launch { + Timber.v("## VOIP acceptIncomingCall from state ${mxCall.state}") + if (mxCall.state == CallState.LocalRinging) { + internalAcceptIncomingCall() + } + } + } + + /** + * Sends a DTMF digit to the other party + * @param digit The digit (nb. string - '#' and '*' are dtmf too) + */ + fun sendDtmfDigit(digit: String) { + sessionScope?.launch { + for (sender in peerConnection?.senders.orEmpty()) { + if (sender.track()?.kind() == "audio" && sender.dtmf()?.canInsertDtmf() == true) { + try { + sender.dtmf()?.insertDtmf(digit, 100, 70) + return@launch + } catch (failure: Throwable) { + Timber.v("Fail to send Dtmf digit") + } + } + } + } + } + + fun attachViewRenderers(localViewRenderer: SurfaceViewRenderer?, remoteViewRenderer: SurfaceViewRenderer, mode: String?) { + sessionScope?.launch(dispatcher) { + Timber.v("## VOIP attachViewRenderers localRendeder $localViewRenderer / $remoteViewRenderer") + localSurfaceRenderers.addIfNeeded(localViewRenderer) + remoteSurfaceRenderers.addIfNeeded(remoteViewRenderer) when (mode) { VectorCallActivity.INCOMING_ACCEPT -> { internalAcceptIncomingCall() @@ -294,67 +364,31 @@ class WebRtcCall( } } - /** - * Without consultation - */ - suspend fun transferToUser(targetUserId: String, targetRoomId: String?) { - mxCall.transfer( - targetUserId = targetUserId, - targetRoomId = targetRoomId, - createCallId = CallIdGenerator.generate(), - awaitCallId = null - ) - endCall(sendEndSignaling = false) - } - - /** - * With consultation - */ - suspend fun transferToCall(transferTargetCall: WebRtcCall) { - val newCallId = CallIdGenerator.generate() - transferTargetCall.mxCall.transfer( - targetUserId = mxCall.opponentUserId, - targetRoomId = null, - createCallId = null, - awaitCallId = newCallId - ) - mxCall.transfer( - targetUserId = transferTargetCall.mxCall.opponentUserId, - targetRoomId = null, - createCallId = newCallId, - awaitCallId = null - ) - endCall(sendEndSignaling = false) - transferTargetCall.endCall(sendEndSignaling = false) - } - - fun acceptIncomingCall() { - sessionScope?.launch { - Timber.v("## VOIP acceptIncomingCall from state ${mxCall.state}") - if (mxCall.state == CallState.LocalRinging) { - internalAcceptIncomingCall() + private suspend fun attachViewRenderersInternal() = withContext(dispatcher) { + // render local video in pip view + localSurfaceRenderers.forEach { renderer -> + renderer.get()?.let { pipSurface -> + pipSurface.setMirror(cameraInUse?.type == CameraType.FRONT) + // no need to check if already added, addSink is checking that + localVideoTrack?.addSink(pipSurface) } } - } - /** - * Sends a DTMF digit to the other party - * @param digit The digit (nb. string - '#' and '*' are dtmf too) - */ - fun sendDtmfDigit(digit: String) { - for (sender in peerConnection?.senders.orEmpty()) { - if (sender.track()?.kind() == "audio" && sender.dtmf()?.canInsertDtmf() == true) { - try { - sender.dtmf()?.insertDtmf(digit, 100, 70) - return - } catch (failure: Throwable) { - Timber.v("Fail to send Dtmf digit") - } + // If remote track exists, then sink it to surface + remoteSurfaceRenderers.forEach { renderer -> + renderer.get()?.let { participantSurface -> + remoteVideoTrack?.addSink(participantSurface) } } } fun detachRenderers(renderers: List<SurfaceViewRenderer>?) { + sessionScope?.launch(dispatcher) { + detachRenderersInternal(renderers) + } + } + + private suspend fun detachRenderersInternal(renderers: List<SurfaceViewRenderer>?) = withContext(dispatcher) { Timber.v("## VOIP detachRenderers") if (renderers.isNullOrEmpty()) { // remove all sinks @@ -447,24 +481,6 @@ class WebRtcCall( }) } - private fun attachViewRenderersInternal() { - // render local video in pip view - localSurfaceRenderers.forEach { renderer -> - renderer.get()?.let { pipSurface -> - pipSurface.setMirror(this.cameraInUse?.type == CameraType.FRONT) - // no need to check if already added, addSink is checking that - localVideoTrack?.addSink(pipSurface) - } - } - - // If remote track exists, then sink it to surface - remoteSurfaceRenderers.forEach { renderer -> - renderer.get()?.let { participantSurface -> - remoteVideoTrack?.addSink(participantSurface) - } - } - } - private suspend fun getTurnServer(): TurnServerResponse? { return tryOrNull { sessionProvider.get()?.callSignalingService()?.getTurnServer() @@ -575,9 +591,11 @@ class WebRtcCall( } fun setCaptureFormat(format: CaptureFormat) { - Timber.v("## VOIP setCaptureFormat $format") - videoCapturer?.changeCaptureFormat(format.width, format.height, format.fps) - currentCaptureFormat = format + sessionScope?.launch(dispatcher) { + Timber.v("## VOIP setCaptureFormat $format") + videoCapturer?.changeCaptureFormat(format.width, format.height, format.fps) + currentCaptureFormat = format + } } private fun updateMuteStatus() { @@ -640,13 +658,17 @@ class WebRtcCall( } fun muteCall(muted: Boolean) { - micMuted = muted - updateMuteStatus() + sessionScope?.launch(dispatcher) { + micMuted = muted + updateMuteStatus() + } } fun enableVideo(enabled: Boolean) { - videoMuted = !enabled - updateMuteStatus() + sessionScope?.launch(dispatcher) { + videoMuted = !enabled + updateMuteStatus() + } } fun canSwitchCamera(): Boolean { @@ -663,28 +685,30 @@ class WebRtcCall( } fun switchCamera() { - Timber.v("## VOIP switchCamera") - if (mxCall.state is CallState.Connected && mxCall.isVideoCall) { - val oppositeCamera = getOppositeCameraIfAny() ?: return - videoCapturer?.switchCamera( - object : CameraVideoCapturer.CameraSwitchHandler { - // Invoked on success. |isFrontCamera| is true if the new camera is front facing. - override fun onCameraSwitchDone(isFrontCamera: Boolean) { - Timber.v("## VOIP onCameraSwitchDone isFront $isFrontCamera") - cameraInUse = oppositeCamera - localSurfaceRenderers.forEach { - it.get()?.setMirror(isFrontCamera) + sessionScope?.launch(dispatcher) { + Timber.v("## VOIP switchCamera") + if (mxCall.state is CallState.Connected && mxCall.isVideoCall) { + val oppositeCamera = getOppositeCameraIfAny() ?: return@launch + videoCapturer?.switchCamera( + object : CameraVideoCapturer.CameraSwitchHandler { + // Invoked on success. |isFrontCamera| is true if the new camera is front facing. + override fun onCameraSwitchDone(isFrontCamera: Boolean) { + Timber.v("## VOIP onCameraSwitchDone isFront $isFrontCamera") + cameraInUse = oppositeCamera + localSurfaceRenderers.forEach { + it.get()?.setMirror(isFrontCamera) + } + listeners.forEach { + tryOrNull { it.onCameraChanged() } + } } - listeners.forEach { - tryOrNull { it.onCameraChanged() } - } - } - override fun onCameraSwitchError(errorDescription: String?) { - Timber.v("## VOIP onCameraSwitchError isFront $errorDescription") - } - }, oppositeCamera.name - ) + override fun onCameraSwitchError(errorDescription: String?) { + Timber.v("## VOIP onCameraSwitchError isFront $errorDescription") + } + }, oppositeCamera.name + ) + } } } @@ -713,11 +737,12 @@ class WebRtcCall( return currentCaptureFormat } - private fun release() { + private suspend fun release() { listeners.clear() mxCall.removeListener(this) timer.stop() timer.tickListener = null + detachRenderersInternal(null) videoCapturer?.stopCapture() videoCapturer?.dispose() videoCapturer = null @@ -731,6 +756,8 @@ class WebRtcCall( localAudioTrack = null localVideoSource = null localVideoTrack = null + remoteAudioTrack = null + remoteVideoTrack = null cameraAvailabilityCallback = null } @@ -740,7 +767,7 @@ class WebRtcCall( if (stream.audioTracks.size > 1 || stream.videoTracks.size > 1) { Timber.e("## VOIP StreamObserver weird looking stream: $stream") // TODO maybe do something more?? - mxCall.hangUp() + endCall(true) return@launch } if (stream.audioTracks.size == 1) { @@ -769,27 +796,27 @@ class WebRtcCall( } fun endCall(sendEndSignaling: Boolean = true, reason: CallHangupContent.Reason? = null) { - if (mxCall.state == CallState.Terminated) { - return - } - // Close tracks ASAP - localVideoTrack?.setEnabled(false) - localVideoTrack?.setEnabled(false) - cameraAvailabilityCallback?.let { cameraAvailabilityCallback -> - val cameraManager = context.getSystemService<CameraManager>()!! - cameraManager.unregisterAvailabilityCallback(cameraAvailabilityCallback) - } - val wasRinging = mxCall.state is CallState.LocalRinging - mxCall.state = CallState.Terminated sessionScope?.launch(dispatcher) { + if (mxCall.state == CallState.Terminated) { + return@launch + } + // Close tracks ASAP + localVideoTrack?.setEnabled(false) + localVideoTrack?.setEnabled(false) + cameraAvailabilityCallback?.let { cameraAvailabilityCallback -> + val cameraManager = context.getSystemService<CameraManager>()!! + cameraManager.unregisterAvailabilityCallback(cameraAvailabilityCallback) + } + val wasRinging = mxCall.state is CallState.LocalRinging + mxCall.state = CallState.Terminated release() onCallEnded(callId) - } - if (sendEndSignaling) { - if (wasRinging) { - mxCall.reject() - } else { - mxCall.hangUp(reason) + if (sendEndSignaling) { + if (wasRinging) { + mxCall.reject() + } else { + mxCall.hangUp(reason) + } } } } @@ -877,6 +904,38 @@ class WebRtcCall( } } + fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) { + sessionScope?.launch(dispatcher) { + val session = sessionProvider.get() ?: return@launch + val newAssertedIdentity = callAssertedIdentityContent.assertedIdentity ?: return@launch + if (newAssertedIdentity.id == null && newAssertedIdentity.displayName == null) { + Timber.v("Asserted identity received with no relevant information, skip") + return@launch + } + remoteAssertedIdentity = newAssertedIdentity + if (newAssertedIdentity.id != null) { + val nativeUserId = session.sipNativeLookup(newAssertedIdentity.id!!).firstOrNull()?.userId + if (nativeUserId != null) { + val resolvedUser = tryOrNull { + session.resolveUser(nativeUserId) + } + if (resolvedUser != null) { + remoteAssertedIdentity = newAssertedIdentity.copy( + id = nativeUserId, + avatarUrl = resolvedUser.avatarUrl, + displayName = resolvedUser.displayName + ) + } else { + remoteAssertedIdentity = newAssertedIdentity.copy(id = nativeUserId) + } + } + } + listeners.forEach { + tryOrNull { it.assertedIdentityChanged() } + } + } + } + // MxCall.StateListener override fun onStateUpdate(call: MxCall) { diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt index 3c18d97937..25463428e9 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent import im.vector.app.ActiveSessionDataSource +import im.vector.app.BuildConfig import im.vector.app.core.services.CallService import im.vector.app.features.call.VectorCallActivity import im.vector.app.features.call.audio.CallAudioManager @@ -37,6 +38,7 @@ import org.matrix.android.sdk.api.session.call.CallListener import org.matrix.android.sdk.api.session.call.CallState import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -420,4 +422,15 @@ class WebRtcCallManager @Inject constructor( Timber.v("## VOIP onCallManagedByOtherSession: $callId") onCallEnded(callId) } + + override fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) { + if (!BuildConfig.handleCallAssertedIdentityEvents) { + return + } + val call = callsByCallId[callAssertedIdentityContent.callId] + ?: return Unit.also { + Timber.w("onCallAssertedIdentityReceived for non active call? ${callAssertedIdentityContent.callId}") + } + call.onCallAssertedIdentityReceived(callAssertedIdentityContent) + } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt index 0f0c9a23c7..96d8a257b7 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt @@ -25,7 +25,6 @@ import android.view.inputmethod.EditorInfo import androidx.core.text.set import androidx.core.widget.doOnTextChanged import im.vector.app.R -import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentKeysBackupRestoreFromPassphraseBinding @@ -40,10 +39,6 @@ class KeysBackupRestoreFromPassphraseFragment @Inject constructor() : VectorBase private lateinit var viewModel: KeysBackupRestoreFromPassphraseViewModel private lateinit var sharedViewModel: KeysBackupRestoreSharedViewModel - private fun toggleVisibilityMode() { - viewModel.showPasswordMode.value = !(viewModel.showPasswordMode.value ?: false) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -56,12 +51,6 @@ class KeysBackupRestoreFromPassphraseFragment @Inject constructor() : VectorBase views.helperTextWithLink.text = spannableStringForHelperText() - viewModel.showPasswordMode.observe(viewLifecycleOwner) { - val shouldBeVisible = it ?: false - views.keysBackupPassphraseEnterEdittext.showPassword(shouldBeVisible) - views.keysBackupViewShowPassword.render(shouldBeVisible) - } - views.keysBackupPassphraseEnterEdittext.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { onRestoreBackup() @@ -70,7 +59,6 @@ class KeysBackupRestoreFromPassphraseFragment @Inject constructor() : VectorBase return@setOnEditorActionListener false } - views.keysBackupViewShowPassword.setOnClickListener { toggleVisibilityMode() } views.helperTextWithLink.setOnClickListener { onUseRecoveryKey() } views.keysBackupRestoreWithPassphraseSubmit.setOnClickListener { onRestoreBackup() } views.keysBackupPassphraseEnterEdittext.doOnTextChanged { text, _, _, _ -> onPassphraseTextEditChange(text) } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt index d45a961dd7..af5938e20a 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt @@ -30,12 +30,10 @@ class KeysBackupRestoreFromPassphraseViewModel @Inject constructor( var passphrase: MutableLiveData<String> = MutableLiveData() var passphraseErrorText: MutableLiveData<String> = MutableLiveData() - var showPasswordMode: MutableLiveData<Boolean> = MutableLiveData() init { passphrase.value = null passphraseErrorText.value = null - showPasswordMode.value = false } // ========= Actions ========= diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt index 8a5264d404..cd59a69a86 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt @@ -64,7 +64,6 @@ class KeysBackupSetupSharedViewModel @Inject constructor() : ViewModel() { var confirmPassphraseError: MutableLiveData<String> = MutableLiveData() var passwordStrength: MutableLiveData<Strength> = MutableLiveData() - var showPasswordMode: MutableLiveData<Boolean> = MutableLiveData() // Step 3 // Var to ignore events from previous request(s) to generate a recovery key @@ -80,7 +79,6 @@ class KeysBackupSetupSharedViewModel @Inject constructor() : ViewModel() { var loadingStatus: MutableLiveData<WaitingViewData> = MutableLiveData() init { - showPasswordMode.value = false recoveryKey.value = null isCreatingBackupVersion.value = false prepareRecoverFailError.value = null @@ -97,9 +95,6 @@ class KeysBackupSetupSharedViewModel @Inject constructor() : ViewModel() { currentRequestId.value = System.currentTimeMillis() isCreatingBackupVersion.value = true - // Ensure passphrase is hidden during the process - showPasswordMode.value = false - recoveryKey.value = null prepareRecoverFailError.value = null session.let { mxSession -> diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt index b2d60fb02d..3e4ce2807d 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt @@ -25,7 +25,7 @@ import androidx.lifecycle.viewModelScope import androidx.transition.TransitionManager import com.nulabinc.zxcvbn.Zxcvbn import im.vector.app.R -import im.vector.app.core.extensions.showPassword +import im.vector.app.core.extensions.hidePassword import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentKeysBackupSetupStep2Binding import im.vector.app.features.settings.VectorLocale @@ -113,13 +113,6 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment<Fr views.keysBackupSetupStep2PassphraseConfirmEditText.setText(viewModel.confirmPassphrase.value) - viewModel.showPasswordMode.observe(viewLifecycleOwner) { - val shouldBeVisible = it ?: false - views.keysBackupSetupStep2PassphraseEnterEdittext.showPassword(shouldBeVisible) - views.keysBackupSetupStep2PassphraseConfirmEditText.showPassword(shouldBeVisible) - views.keysBackupSetupStep2ShowPassword.render(shouldBeVisible) - } - viewModel.confirmPassphraseError.observe(viewLifecycleOwner) { TransitionManager.beginDelayedTransition(views.keysBackupRoot) views.keysBackupSetupStep2PassphraseConfirmTil.error = it @@ -135,7 +128,6 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment<Fr } private fun setupViews() { - views.keysBackupSetupStep2ShowPassword.setOnClickListener { toggleVisibilityMode() } views.keysBackupSetupStep2Button.setOnClickListener { doNext() } views.keysBackupSetupStep2SkipButton.setOnClickListener { skipPassphrase() } @@ -143,10 +135,6 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment<Fr views.keysBackupSetupStep2PassphraseConfirmEditText.doOnTextChanged { _, _, _, _ -> onConfirmPassphraseChanged() } } - private fun toggleVisibilityMode() { - viewModel.showPasswordMode.value = !(viewModel.showPasswordMode.value ?: false) - } - private fun doNext() { when { viewModel.passphrase.value.isNullOrEmpty() -> { @@ -161,6 +149,9 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment<Fr else -> { viewModel.megolmBackupCreationInfo = null + // Ensure passphrase is hidden during the process + views.keysBackupSetupStep2PassphraseEnterEdittext.hidePassword() + views.keysBackupSetupStep2PassphraseConfirmEditText.hidePassword() viewModel.prepareRecoveryKey(requireActivity(), viewModel.passphrase.value) } } @@ -172,6 +163,9 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment<Fr // Generate a recovery key for the user viewModel.megolmBackupCreationInfo = null + // Ensure passphrase is hidden during the process + views.keysBackupSetupStep2PassphraseEnterEdittext.hidePassword() + views.keysBackupSetupStep2PassphraseConfirmEditText.hidePassword() viewModel.prepareRecoveryKey(requireActivity(), null) } else -> { diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageAction.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageAction.kt index 30a7ab3cc0..7d44e66531 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageAction.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageAction.kt @@ -21,8 +21,6 @@ import im.vector.app.core.platform.VectorViewModelAction import im.vector.app.core.platform.WaitingViewData sealed class SharedSecureStorageAction : VectorViewModelAction { - - object TogglePasswordVisibility : SharedSecureStorageAction() object UseKey : SharedSecureStorageAction() object Back : SharedSecureStorageAction() object Cancel : SharedSecureStorageAction() diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt index d246d33f40..9a5fc4ca06 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt @@ -50,7 +50,6 @@ import java.io.ByteArrayOutputStream data class SharedSecureStorageViewState( val ready: Boolean = false, val hasPassphrase: Boolean = true, - val passphraseVisible: Boolean = false, val checkingSSSSAction: Async<Unit> = Uninitialized, val step: Step = Step.EnterPassphrase, val activeDeviceCount: Int = 0, @@ -128,7 +127,6 @@ class SharedSecureStorageViewModel @AssistedInject constructor( override fun handle(action: SharedSecureStorageAction) = withState { when (action) { - is SharedSecureStorageAction.TogglePasswordVisibility -> handleTogglePasswordVisibility() is SharedSecureStorageAction.Cancel -> handleCancel() is SharedSecureStorageAction.SubmitPassphrase -> handleSubmitPassphrase(action) SharedSecureStorageAction.UseKey -> handleUseKey() @@ -319,14 +317,6 @@ class SharedSecureStorageViewModel @AssistedInject constructor( _viewEvents.post(SharedSecureStorageViewEvent.Dismiss) } - private fun handleTogglePasswordVisibility() { - setState { - copy( - passphraseVisible = !passphraseVisible - ) - } - } - companion object : MvRxViewModelFactory<SharedSecureStorageViewModel, SharedSecureStorageViewState> { @JvmStatic diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt index ba2c923d8b..800b02a936 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt @@ -23,11 +23,9 @@ import android.view.ViewGroup import android.view.inputmethod.EditorInfo import androidx.core.text.toSpannable import com.airbnb.mvrx.activityViewModel -import com.airbnb.mvrx.withState import com.jakewharton.rxbinding3.widget.editorActionEvents import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R -import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.ColorProvider import im.vector.app.databinding.FragmentSsssAccessFromPassphraseBinding @@ -92,7 +90,6 @@ class SharedSecuredStoragePassphraseFragment @Inject constructor( views.ssssPassphraseSubmit.debouncedClicks { submit() } views.ssssPassphraseUseKey.debouncedClicks { sharedViewModel.handle(SharedSecureStorageAction.UseKey) } - views.ssssViewShowPassword.debouncedClicks { sharedViewModel.handle(SharedSecureStorageAction.TogglePasswordVisibility) } } fun submit() { @@ -101,10 +98,4 @@ class SharedSecuredStoragePassphraseFragment @Inject constructor( views.ssssPassphraseSubmit.isEnabled = false sharedViewModel.handle(SharedSecureStorageAction.SubmitPassphrase(text)) } - - override fun invalidate() = withState(sharedViewModel) { state -> - val shouldBeVisible = state.passphraseVisible - views.ssssPassphraseEnterEdittext.showPassword(shouldBeVisible) - views.ssssViewShowPassword.render(shouldBeVisible) - } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt index ce06fe726f..869f0ed8ec 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt @@ -34,7 +34,6 @@ sealed class BootstrapActions : VectorViewModelAction { data class DoInitialize(val passphrase: String) : BootstrapActions() object DoInitializeGeneratedKey : BootstrapActions() - object TogglePasswordVisibility : BootstrapActions() data class UpdateCandidatePassphrase(val pass: String) : BootstrapActions() data class UpdateConfirmCandidatePassphrase(val pass: String) : BootstrapActions() // data class ReAuth(val pass: String) : BootstrapActions() diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt index 2d26436556..602f0bad91 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt @@ -28,7 +28,6 @@ import com.jakewharton.rxbinding3.widget.editorActionEvents import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard -import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentBootstrapEnterPassphraseBinding import io.reactivex.android.schedulers.AndroidSchedulers @@ -84,7 +83,6 @@ class BootstrapConfirmPassphraseFragment @Inject constructor() // } } - views.ssssViewShowPassword.debouncedClicks { sharedViewModel.handle(BootstrapActions.TogglePasswordVisibility) } views.bootstrapSubmit.debouncedClicks { submit() } } @@ -104,12 +102,4 @@ class BootstrapConfirmPassphraseFragment @Inject constructor() } } } - - override fun invalidate() = withState(sharedViewModel) { state -> - if (state.step is BootstrapStep.ConfirmPassphrase) { - val isPasswordVisible = state.step.isPasswordVisible - views.ssssPassphraseEnterEdittext.showPassword(isPasswordVisible, updateCursor = false) - views.ssssViewShowPassword.render(isPasswordVisible) - } - } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt index 7a5d6e5fd7..9ecc7719a5 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt @@ -26,7 +26,6 @@ import com.airbnb.mvrx.withState import com.jakewharton.rxbinding3.widget.editorActionEvents import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R -import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentBootstrapEnterPassphraseBinding import im.vector.app.features.settings.VectorLocale @@ -80,7 +79,6 @@ class BootstrapEnterPassphraseFragment @Inject constructor() // } } - views.ssssViewShowPassword.debouncedClicks { sharedViewModel.handle(BootstrapActions.TogglePasswordVisibility) } views.bootstrapSubmit.debouncedClicks { submit() } } @@ -101,10 +99,6 @@ class BootstrapEnterPassphraseFragment @Inject constructor() override fun invalidate() = withState(sharedViewModel) { state -> if (state.step is BootstrapStep.SetupPassphrase) { - val isPasswordVisible = state.step.isPasswordVisible - views.ssssPassphraseEnterEdittext.showPassword(isPasswordVisible, updateCursor = false) - views.ssssViewShowPassword.render(isPasswordVisible) - state.passphraseStrength.invoke()?.let { strength -> val score = strength.score views.ssssPassphraseSecurityProgress.strength = score diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt index ca0942f59a..23d3068e34 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt @@ -34,7 +34,6 @@ import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard import im.vector.app.core.extensions.registerStartForActivityResult -import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.ColorProvider import im.vector.app.core.utils.colorizeMatchingText @@ -84,7 +83,6 @@ class BootstrapMigrateBackupFragment @Inject constructor( // sharedViewModel.observeViewEvents {} views.bootstrapMigrateContinueButton.debouncedClicks { submit() } - views.bootstrapMigrateShowPassword.debouncedClicks { sharedViewModel.handle(BootstrapActions.TogglePasswordVisibility) } views.bootstrapMigrateForgotPassphrase.debouncedClicks { sharedViewModel.handle(BootstrapActions.HandleForgotBackupPassphrase) } views.bootstrapMigrateUseFile.debouncedClicks { startImportTextFromFileIntent(requireContext(), importFileStartForActivityResult) } } @@ -116,7 +114,6 @@ class BootstrapMigrateBackupFragment @Inject constructor( val isEnteringKey = getBackupSecretForMigration.useKey() if (isEnteringKey) { - views.bootstrapMigrateShowPassword.isVisible = false views.bootstrapMigrateEditText.inputType = TYPE_CLASS_TEXT or TYPE_TEXT_VARIATION_VISIBLE_PASSWORD or TYPE_TEXT_FLAG_MULTI_LINE val recKey = getString(R.string.bootstrap_migration_backup_recovery_key) @@ -128,14 +125,6 @@ class BootstrapMigrateBackupFragment @Inject constructor( views.bootstrapMigrateForgotPassphrase.isVisible = false views.bootstrapMigrateUseFile.isVisible = true } else { - views.bootstrapMigrateShowPassword.isVisible = true - - if (state.step is BootstrapStep.GetBackupSecretPassForMigration) { - val isPasswordVisible = state.step.isPasswordVisible - views.bootstrapMigrateEditText.showPassword(isPasswordVisible, updateCursor = false) - views.bootstrapMigrateShowPassword.render(isPasswordVisible) - } - views.bootstrapDescriptionText.text = getString(R.string.bootstrap_migration_enter_backup_password) views.bootstrapMigrateEditText.hint = getString(R.string.passphrase_enter_passphrase) diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSharedViewModel.kt index fe55d81cc4..866a87d7f9 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSharedViewModel.kt @@ -139,7 +139,7 @@ class BootstrapSharedViewModel @AssistedInject constructor( private fun handleStartMigratingKeyBackup() { if (isBackupCreatedFromPassphrase) { setState { - copy(step = BootstrapStep.GetBackupSecretPassForMigration(isPasswordVisible = false, useKey = false)) + copy(step = BootstrapStep.GetBackupSecretPassForMigration(useKey = false)) } } else { setState { @@ -151,29 +151,6 @@ class BootstrapSharedViewModel @AssistedInject constructor( override fun handle(action: BootstrapActions) = withState { state -> when (action) { is BootstrapActions.GoBack -> queryBack() - BootstrapActions.TogglePasswordVisibility -> { - when (state.step) { - is BootstrapStep.SetupPassphrase -> { - setState { - copy(step = state.step.copy(isPasswordVisible = !state.step.isPasswordVisible)) - } - } - is BootstrapStep.ConfirmPassphrase -> { - setState { - copy(step = state.step.copy(isPasswordVisible = !state.step.isPasswordVisible)) - } - } - is BootstrapStep.AccountReAuth -> { - // nop - } - is BootstrapStep.GetBackupSecretPassForMigration -> { - setState { - copy(step = state.step.copy(isPasswordVisible = !state.step.isPasswordVisible)) - } - } - else -> Unit - } - } BootstrapActions.StartKeyBackupMigration -> { handleStartMigratingKeyBackup() } @@ -193,9 +170,7 @@ class BootstrapSharedViewModel @AssistedInject constructor( setState { copy( passphrase = action.passphrase, - step = BootstrapStep.ConfirmPassphrase( - isPasswordVisible = (state.step as? BootstrapStep.SetupPassphrase)?.isPasswordVisible ?: false - ) + step = BootstrapStep.ConfirmPassphrase ) } } @@ -255,7 +230,7 @@ class BootstrapSharedViewModel @AssistedInject constructor( BootstrapActions.HandleForgotBackupPassphrase -> { if (state.step is BootstrapStep.GetBackupSecretPassForMigration) { setState { - copy(step = BootstrapStep.GetBackupSecretPassForMigration(state.step.isPasswordVisible, true)) + copy(step = BootstrapStep.GetBackupSecretPassForMigration(true)) } } else return@withState } @@ -293,7 +268,7 @@ class BootstrapSharedViewModel @AssistedInject constructor( if (action.userWantsToEnterPassphrase) { setState { copy( - step = BootstrapStep.SetupPassphrase(isPasswordVisible = false) + step = BootstrapStep.SetupPassphrase ) } } else { @@ -493,7 +468,6 @@ class BootstrapSharedViewModel @AssistedInject constructor( setState { copy( step = BootstrapStep.GetBackupSecretPassForMigration( - isPasswordVisible = state.step.isPasswordVisible, useKey = false ) ) @@ -524,9 +498,7 @@ class BootstrapSharedViewModel @AssistedInject constructor( is BootstrapStep.ConfirmPassphrase -> { setState { copy( - step = BootstrapStep.SetupPassphrase( - isPasswordVisible = state.step.isPasswordVisible - ) + step = BootstrapStep.SetupPassphrase ) } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapStep.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapStep.kt index 09f0e90d5d..a4fa31ad03 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapStep.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapStep.kt @@ -91,13 +91,13 @@ sealed class BootstrapStep { // Use will be asked to choose between passphrase or recovery key, or to start process if a key backup exists data class FirstForm(val keyBackUpExist: Boolean, val reset: Boolean = false) : BootstrapStep() - data class SetupPassphrase(val isPasswordVisible: Boolean) : BootstrapStep() - data class ConfirmPassphrase(val isPasswordVisible: Boolean) : BootstrapStep() + object SetupPassphrase : BootstrapStep() + object ConfirmPassphrase : BootstrapStep() data class AccountReAuth(val failure: String? = null) : BootstrapStep() abstract class GetBackupSecretForMigration : BootstrapStep() - data class GetBackupSecretPassForMigration(val isPasswordVisible: Boolean, val useKey: Boolean) : GetBackupSecretForMigration() + data class GetBackupSecretPassForMigration(val useKey: Boolean) : GetBackupSecretForMigration() object GetBackupSecretKeyForMigration : GetBackupSecretForMigration() object Initializing : BootstrapStep() diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/epoxy/BottomSheetVerificationEmojisItem.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/epoxy/BottomSheetVerificationEmojisItem.kt index decb9eaad5..e1b703e0fc 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/epoxy/BottomSheetVerificationEmojisItem.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/epoxy/BottomSheetVerificationEmojisItem.kt @@ -18,8 +18,6 @@ package im.vector.app.features.crypto.verification.epoxy import android.content.Context import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute @@ -27,6 +25,7 @@ import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.databinding.ItemEmojiVerifBinding import me.gujun.android.span.Span import me.gujun.android.span.image import me.gujun.android.span.span @@ -68,16 +67,18 @@ abstract class BottomSheetVerificationEmojisItem : VectorEpoxyModel<BottomSheetV } private fun bindEmojiView(view: ViewGroup, rep: EmojiRepresentation) { - rep.drawableRes?.let { - view.findViewById<TextView>(R.id.item_emoji_tv).isVisible = false - view.findViewById<ImageView>(R.id.item_emoji_image).isVisible = true - view.findViewById<ImageView>(R.id.item_emoji_image).setImageDrawable(ContextCompat.getDrawable(view.context, it)) - } ?: run { - view.findViewById<TextView>(R.id.item_emoji_tv).isVisible = true - view.findViewById<ImageView>(R.id.item_emoji_image).isVisible = false - view.findViewById<TextView>(R.id.item_emoji_tv).text = rep.emoji + val views = ItemEmojiVerifBinding.bind(view) + val drawableRes = rep.drawableRes + if (drawableRes != null) { + views.itemEmojiTv.isVisible = false + views.itemEmojiImage.isVisible = true + views.itemEmojiImage.setImageDrawable(ContextCompat.getDrawable(view.context, drawableRes)) + } else { + views.itemEmojiTv.isVisible = true + views.itemEmojiImage.isVisible = false + views.itemEmojiTv.text = rep.emoji } - view.findViewById<TextView>(R.id.item_emoji_name_tv).setText(rep.nameResId) + views.itemEmojiNameTv.setText(rep.nameResId) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/app/features/form/FormEditTextItem.kt b/vector/src/main/java/im/vector/app/features/form/FormEditTextItem.kt index e2203057ab..2b2fddd0c9 100644 --- a/vector/src/main/java/im/vector/app/features/form/FormEditTextItem.kt +++ b/vector/src/main/java/im/vector/app/features/form/FormEditTextItem.kt @@ -17,6 +17,7 @@ package im.vector.app.features.form import android.text.Editable +import android.view.View import android.view.inputmethod.EditorInfo import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute @@ -40,6 +41,9 @@ abstract class FormEditTextItem : VectorEpoxyModel<FormEditTextItem.Holder>() { @EpoxyAttribute var value: String? = null + @EpoxyAttribute + var forceUpdateValue: Boolean = false + @EpoxyAttribute var errorMessage: String? = null @@ -64,12 +68,23 @@ abstract class FormEditTextItem : VectorEpoxyModel<FormEditTextItem.Holder>() { @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var editorActionListener: TextView.OnEditorActionListener? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) + var onFocusChange: ((Boolean) -> Unit)? = null + + @EpoxyAttribute + var prefixText: String? = null + + @EpoxyAttribute + var suffixText: String? = null + private val onTextChangeListener = object : SimpleTextWatcher() { override fun afterTextChanged(s: Editable) { onTextChange?.invoke(s.toString()) } } + private val onFocusChangedListener = View.OnFocusChangeListener { _, hasFocus -> onFocusChange?.invoke(hasFocus) } + override fun bind(holder: Holder) { super.bind(holder) holder.textInputLayout.isEnabled = enabled @@ -77,7 +92,14 @@ abstract class FormEditTextItem : VectorEpoxyModel<FormEditTextItem.Holder>() { holder.textInputLayout.error = errorMessage holder.textInputLayout.endIconMode = endIconMode ?: TextInputLayout.END_ICON_NONE - holder.setValueOnce(holder.textInputEditText, value) + holder.textInputLayout.prefixText = prefixText + holder.textInputLayout.suffixText = suffixText + + if (forceUpdateValue) { + holder.textInputEditText.setText(value) + } else { + holder.setValueOnce(holder.textInputEditText, value) + } holder.textInputEditText.isEnabled = enabled inputType?.let { holder.textInputEditText.inputType = it } @@ -86,6 +108,7 @@ abstract class FormEditTextItem : VectorEpoxyModel<FormEditTextItem.Holder>() { holder.textInputEditText.addTextChangedListenerOnce(onTextChangeListener) holder.textInputEditText.setOnEditorActionListener(editorActionListener) + holder.textInputEditText.onFocusChangeListener = onFocusChangedListener } override fun shouldSaveViewState(): Boolean { diff --git a/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt b/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt index c6cceee3b9..787027e0e2 100644 --- a/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt +++ b/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt @@ -34,6 +34,7 @@ import com.bumptech.glide.request.target.DrawableImageViewTarget import com.bumptech.glide.request.target.Target import im.vector.app.core.contacts.MappedContact import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.core.glide.AvatarPlaceholder import im.vector.app.core.glide.GlideApp import im.vector.app.core.glide.GlideRequest import im.vector.app.core.glide.GlideRequests @@ -136,7 +137,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active matrixItem: MatrixItem, target: Target<Drawable>) { val placeholder = getPlaceholderDrawable(matrixItem) - buildGlideRequest(glideRequests, matrixItem.avatarUrl) + glideRequests.loadResolvedUrl(matrixItem.avatarUrl) .apply { when (matrixItem) { is MatrixItem.SpaceItem -> { @@ -175,7 +176,12 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active } @UiThread - fun renderBlur(matrixItem: MatrixItem, imageView: ImageView, sampling: Int, rounded: Boolean, @ColorInt colorFilter: Int? = null) { + fun renderBlur(matrixItem: MatrixItem, + imageView: ImageView, + sampling: Int, + rounded: Boolean, + @ColorInt colorFilter: Int? = null, + addPlaceholder: Boolean) { val transformations = mutableListOf<Transformation<Bitmap>>( BlurTransformation(20, sampling) ) @@ -185,14 +191,26 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active if (rounded) { transformations.add(CircleCrop()) } - buildGlideRequest(GlideApp.with(imageView), matrixItem.avatarUrl) - .apply(RequestOptions.bitmapTransform(MultiTransformation(transformations))) + val bitmapTransform = RequestOptions.bitmapTransform(MultiTransformation(transformations)) + val glideRequests = GlideApp.with(imageView) + val placeholderRequest = if (addPlaceholder) { + glideRequests + .load(AvatarPlaceholder(matrixItem)) + .apply(bitmapTransform) + } else { + null + } + glideRequests.loadResolvedUrl(matrixItem.avatarUrl) + .apply(bitmapTransform) + // We are using thumbnail and error API so we can have blur transformation on it... + .thumbnail(placeholderRequest) + .error(placeholderRequest) .into(imageView) } @AnyThread fun getCachedDrawable(glideRequests: GlideRequests, matrixItem: MatrixItem): Drawable { - return buildGlideRequest(glideRequests, matrixItem.avatarUrl) + return glideRequests.loadResolvedUrl(matrixItem.avatarUrl) .onlyRetrieveFromCache(true) .apply(RequestOptions.circleCropTransform()) .submit() @@ -220,9 +238,9 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active // PRIVATE API ********************************************************************************* - private fun buildGlideRequest(glideRequests: GlideRequests, avatarUrl: String?): GlideRequest<Drawable> { + private fun GlideRequests.loadResolvedUrl(avatarUrl: String?): GlideRequest<Drawable> { val resolvedUrl = resolvedUrl(avatarUrl) - return glideRequests.load(resolvedUrl) + return load(resolvedUrl) } private fun resolvedUrl(avatarUrl: String?): String? { diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 64c87d00e9..4a563b563a 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -24,7 +24,7 @@ import android.os.Bundle import android.os.Parcelable import android.view.Menu import android.view.MenuItem -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.GravityCompat import androidx.core.view.isVisible import androidx.drawerlayout.widget.DrawerLayout @@ -437,7 +437,7 @@ class HomeActivity : serverBackupStatusViewModel.refreshRemoteStateIfNeeded() } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar, false) } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailAction.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailAction.kt index c64f9d453d..b466f204ec 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailAction.kt @@ -19,6 +19,7 @@ package im.vector.app.features.home import im.vector.app.core.platform.VectorViewModelAction sealed class HomeDetailAction : VectorViewModelAction { - data class SwitchDisplayMode(val displayMode: RoomListDisplayMode) : HomeDetailAction() + data class SwitchTab(val tab: HomeTab) : HomeDetailAction() object MarkAllRoomsRead : HomeDetailAction() + data class StartCallWithPhoneNumber(val phoneNumber: String): HomeDetailAction() } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt index 488e42c7ef..dda3df3881 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt @@ -22,7 +22,10 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup +import androidx.core.view.get import androidx.core.view.isVisible +import androidx.core.view.iterator +import androidx.fragment.app.Fragment import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState @@ -41,12 +44,14 @@ import im.vector.app.core.ui.views.KnownCallsViewHolder import im.vector.app.databinding.FragmentHomeDetailBinding import im.vector.app.features.call.SharedKnownCallsViewModel import im.vector.app.features.call.VectorCallActivity +import im.vector.app.features.call.dialpad.DialPadFragment import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.home.room.list.RoomListFragment import im.vector.app.features.home.room.list.RoomListParams import im.vector.app.features.home.room.list.UnreadCounterBadgeView import im.vector.app.features.popup.PopupAlertManager import im.vector.app.features.popup.VerificationVectorAlert +import im.vector.app.features.settings.VectorLocale import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS import im.vector.app.features.themes.ThemeUtils @@ -101,6 +106,9 @@ class HomeDetailFragment @Inject constructor( } override fun onPrepareOptionsMenu(menu: Menu) { + withState(viewModel) { state -> + menu.iterator().forEach { it.isVisible = state.currentTab is HomeTab.RoomList } + } menu.findItem(R.id.menu_home_mark_all_as_read).isVisible = hasUnreadRooms super.onPrepareOptionsMenu(menu) } @@ -115,7 +123,6 @@ class HomeDetailFragment @Inject constructor( super.onViewCreated(view, savedInstanceState) sharedActionViewModel = activityViewModelProvider.get(HomeSharedActionViewModel::class.java) sharedCallActionViewModel = activityViewModelProvider.get(SharedKnownCallsViewModel::class.java) - setupBottomNavigationView() setupToolbar() setupKeysBackupBanner() @@ -123,7 +130,7 @@ class HomeDetailFragment @Inject constructor( withState(viewModel) { // Update the navigation view if needed (for when we restore the tabs) - views.bottomNavigationView.selectedItemId = it.displayMode.toMenuId() + views.bottomNavigationView.selectedItemId = it.currentTab.toMenuId() } viewModel.selectSubscribe(this, HomeDetailViewState::roomGroupingMethod) { roomGroupingMethod -> @@ -137,8 +144,20 @@ class HomeDetailFragment @Inject constructor( } } - viewModel.selectSubscribe(this, HomeDetailViewState::displayMode) { displayMode -> - switchDisplayMode(displayMode) + viewModel.selectSubscribe(this, HomeDetailViewState::currentTab) { currentTab -> + updateUIForTab(currentTab) + } + + viewModel.selectSubscribe(this, HomeDetailViewState::showDialPadTab) { showDialPadTab -> + updateTabVisibilitySafely(R.id.bottom_action_dial_pad, showDialPadTab) + } + + viewModel.observeViewEvents { viewEvent -> + when (viewEvent) { + HomeDetailViewEvents.CallStarted -> dismissLoadingDialog() + is HomeDetailViewEvents.FailToCall -> showFailure(viewEvent.failure) + HomeDetailViewEvents.Loading -> showLoadingDialog() + } } unknownDeviceDetectorSharedViewModel.subscribe { state -> @@ -179,20 +198,8 @@ class HomeDetailFragment @Inject constructor( override fun onResume() { super.onResume() // update notification tab if needed - checkNotificationTabStatus() - } - - private fun checkNotificationTabStatus() { - val wasVisible = views.bottomNavigationView.menu.findItem(R.id.bottom_action_notification).isVisible - views.bottomNavigationView.menu.findItem(R.id.bottom_action_notification).isVisible = vectorPreferences.labAddNotificationTab() - if (wasVisible && !vectorPreferences.labAddNotificationTab()) { - // As we hide it check if it's not the current item! - withState(viewModel) { - if (it.displayMode.toMenuId() == R.id.bottom_action_notification) { - viewModel.handle(HomeDetailAction.SwitchDisplayMode(RoomListDisplayMode.PEOPLE)) - } - } - } + updateTabVisibilitySafely(R.id.bottom_action_notification, vectorPreferences.labAddNotificationTab()) + callManager.checkForProtocolsSupportIfNeeded() } private fun promptForNewUnknownDevices(uid: String, state: UnknownDevicesState, newest: DeviceInfo) { @@ -321,12 +328,13 @@ class HomeDetailFragment @Inject constructor( private fun setupBottomNavigationView() { views.bottomNavigationView.menu.findItem(R.id.bottom_action_notification).isVisible = vectorPreferences.labAddNotificationTab() views.bottomNavigationView.setOnNavigationItemSelectedListener { - val displayMode = when (it.itemId) { - R.id.bottom_action_people -> RoomListDisplayMode.PEOPLE - R.id.bottom_action_rooms -> RoomListDisplayMode.ROOMS - else -> RoomListDisplayMode.NOTIFICATIONS + val tab = when (it.itemId) { + R.id.bottom_action_people -> HomeTab.RoomList(RoomListDisplayMode.PEOPLE) + R.id.bottom_action_rooms -> HomeTab.RoomList(RoomListDisplayMode.ROOMS) + R.id.bottom_action_notification -> HomeTab.RoomList(RoomListDisplayMode.NOTIFICATIONS) + else -> HomeTab.DialPad } - viewModel.handle(HomeDetailAction.SwitchDisplayMode(displayMode)) + viewModel.handle(HomeDetailAction.SwitchTab(tab)) true } @@ -342,13 +350,15 @@ class HomeDetailFragment @Inject constructor( // } } - private fun switchDisplayMode(displayMode: RoomListDisplayMode) { - views.groupToolbarTitleView.setText(displayMode.titleRes) - updateSelectedFragment(displayMode) + private fun updateUIForTab(tab: HomeTab) { + views.bottomNavigationView.menu.findItem(tab.toMenuId()).isChecked = true + views.groupToolbarTitleView.setText(tab.titleRes) + updateSelectedFragment(tab) + invalidateOptionsMenu() } - private fun updateSelectedFragment(displayMode: RoomListDisplayMode) { - val fragmentTag = "FRAGMENT_TAG_${displayMode.name}" + private fun updateSelectedFragment(tab: HomeTab) { + val fragmentTag = "FRAGMENT_TAG_$tab" val fragmentToShow = childFragmentManager.findFragmentByTag(fragmentTag) childFragmentManager.commitTransaction { childFragmentManager.fragments @@ -357,14 +367,49 @@ class HomeDetailFragment @Inject constructor( detach(it) } if (fragmentToShow == null) { - val params = RoomListParams(displayMode) - add(R.id.roomListContainer, RoomListFragment::class.java, params.toMvRxBundle(), fragmentTag) + when (tab) { + is HomeTab.RoomList -> { + val params = RoomListParams(tab.displayMode) + add(R.id.roomListContainer, RoomListFragment::class.java, params.toMvRxBundle(), fragmentTag) + } + is HomeTab.DialPad -> { + add(R.id.roomListContainer, createDialPadFragment()) + } + } } else { + if (tab is HomeTab.DialPad) { + (fragmentToShow as? DialPadFragment)?.applyCallback() + } attach(fragmentToShow) } } } + private fun createDialPadFragment(): Fragment { + val fragment = childFragmentManager.fragmentFactory.instantiate(vectorBaseActivity.classLoader, DialPadFragment::class.java.name) + return (fragment as DialPadFragment).apply { + arguments = Bundle().apply { + putBoolean(DialPadFragment.EXTRA_ENABLE_DELETE, true) + putBoolean(DialPadFragment.EXTRA_ENABLE_OK, true) + putString(DialPadFragment.EXTRA_REGION_CODE, VectorLocale.applicationLocale.country) + } + applyCallback() + } + } + + private fun updateTabVisibilitySafely(tabId: Int, isVisible: Boolean) { + val wasVisible = views.bottomNavigationView.menu.findItem(tabId).isVisible + views.bottomNavigationView.menu.findItem(tabId).isVisible = isVisible + if (wasVisible && !isVisible) { + // As we hide it check if it's not the current item! + withState(viewModel) { + if (it.currentTab.toMenuId() == tabId) { + viewModel.handle(HomeDetailAction.SwitchTab(HomeTab.RoomList(RoomListDisplayMode.PEOPLE))) + } + } + } + } + /* ========================================================================================== * KeysBackupBanner Listener * ========================================================================================== */ @@ -399,10 +444,13 @@ class HomeDetailFragment @Inject constructor( } } - private fun RoomListDisplayMode.toMenuId() = when (this) { - RoomListDisplayMode.PEOPLE -> R.id.bottom_action_people - RoomListDisplayMode.ROOMS -> R.id.bottom_action_rooms - else -> R.id.bottom_action_notification + private fun HomeTab.toMenuId() = when (this) { + is HomeTab.DialPad -> R.id.bottom_action_dial_pad + is HomeTab.RoomList -> when (displayMode) { + RoomListDisplayMode.PEOPLE -> R.id.bottom_action_people + RoomListDisplayMode.ROOMS -> R.id.bottom_action_rooms + else -> R.id.bottom_action_notification + } } override fun onTapToReturnToCall() { @@ -421,6 +469,16 @@ class HomeDetailFragment @Inject constructor( } } + private fun DialPadFragment.applyCallback(): DialPadFragment { + callback = object : DialPadFragment.Callback { + override fun onOkClicked(formatted: String?, raw: String?) { + if (raw.isNullOrEmpty()) return + viewModel.handle(HomeDetailAction.StartCallWithPhoneNumber(raw)) + } + } + return this + } + override fun create(initialState: ServerBackupStatusViewState): ServerBackupStatusViewModel { return serverBackupStatusViewModelFactory.create(initialState) } diff --git a/vector/src/main/java/im/vector/app/core/dialogs/Extensions.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewEvents.kt similarity index 57% rename from vector/src/main/java/im/vector/app/core/dialogs/Extensions.kt rename to vector/src/main/java/im/vector/app/features/home/HomeDetailViewEvents.kt index 56544f929e..a0ff67dc0a 100644 --- a/vector/src/main/java/im/vector/app/core/dialogs/Extensions.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewEvents.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019 New Vector Ltd + * Copyright (c) 2020 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,14 +14,12 @@ * limitations under the License. */ -package im.vector.app.core.dialogs +package im.vector.app.features.home -import androidx.annotation.AttrRes -import androidx.appcompat.app.AlertDialog -import im.vector.app.R -import im.vector.app.features.themes.ThemeUtils +import im.vector.app.core.platform.VectorViewEvents -fun AlertDialog.withColoredButton(whichButton: Int, @AttrRes color: Int = R.attr.colorError): AlertDialog { - getButton(whichButton)?.setTextColor(ThemeUtils.getColor(context, color)) - return this +sealed class HomeDetailViewEvents : VectorViewEvents { + object Loading : HomeDetailViewEvents() + object CallStarted : HomeDetailViewEvents() + data class FailToCall(val failure: Throwable) : HomeDetailViewEvents() } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt index 836c63e85b..b960402f90 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt @@ -26,8 +26,13 @@ import dagger.assisted.AssistedInject import im.vector.app.AppStateHandler import im.vector.app.RoomGroupingMethod import im.vector.app.core.di.HasScreenInjector -import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.call.dialpad.DialPadLookup +import im.vector.app.features.call.lookup.CallProtocolsChecker +import im.vector.app.features.call.webrtc.WebRtcCallManager +import im.vector.app.features.createdirect.DirectRoomHelper +import im.vector.app.features.invite.AutoAcceptInvites +import im.vector.app.features.invite.showInvites import im.vector.app.features.ui.UiStateRepository import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.Dispatchers @@ -51,8 +56,12 @@ import java.util.concurrent.TimeUnit class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: HomeDetailViewState, private val session: Session, private val uiStateRepository: UiStateRepository, - private val appStateHandler: AppStateHandler) - : VectorViewModel<HomeDetailViewState, HomeDetailAction, EmptyViewEvents>(initialState) { + private val callManager: WebRtcCallManager, + private val directRoomHelper: DirectRoomHelper, + private val appStateHandler: AppStateHandler, +private val autoAcceptInvites: AutoAcceptInvites) + : VectorViewModel<HomeDetailViewState, HomeDetailAction, HomeDetailViewEvents>(initialState), + CallProtocolsChecker.Listener { @AssistedFactory interface Factory { @@ -64,7 +73,7 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho override fun initialState(viewModelContext: ViewModelContext): HomeDetailViewState? { val uiStateRepository = (viewModelContext.activity as HasScreenInjector).injector().uiStateRepository() return HomeDetailViewState( - displayMode = uiStateRepository.getDisplayMode() + currentTab = HomeTab.RoomList(uiStateRepository.getDisplayMode()) ) } @@ -79,7 +88,8 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho observeSyncState() observeRoomGroupingMethod() observeRoomSummaries() - + updateShowDialPadTab() + callManager.addProtocolsCheckerListener(this) session.rx().liveUser(session.myUserId).execute { copy( myMatrixItem = it.invoke()?.getOrNull()?.toMatrixItem() @@ -89,18 +99,48 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho override fun handle(action: HomeDetailAction) { when (action) { - is HomeDetailAction.SwitchDisplayMode -> handleSwitchDisplayMode(action) - HomeDetailAction.MarkAllRoomsRead -> handleMarkAllRoomsRead() + is HomeDetailAction.SwitchTab -> handleSwitchTab(action) + HomeDetailAction.MarkAllRoomsRead -> handleMarkAllRoomsRead() + is HomeDetailAction.StartCallWithPhoneNumber -> handleStartCallWithPhoneNumber(action) } } - private fun handleSwitchDisplayMode(action: HomeDetailAction.SwitchDisplayMode) = withState { state -> - if (state.displayMode != action.displayMode) { - setState { - copy(displayMode = action.displayMode) + private fun handleStartCallWithPhoneNumber(action: HomeDetailAction.StartCallWithPhoneNumber) { + viewModelScope.launch { + try { + _viewEvents.post(HomeDetailViewEvents.Loading) + val result = DialPadLookup(session, callManager, directRoomHelper).lookupPhoneNumber(action.phoneNumber) + callManager.startOutgoingCall(result.roomId, result.userId, isVideoCall = false) + _viewEvents.post(HomeDetailViewEvents.CallStarted) + } catch (failure: Throwable) { + _viewEvents.post(HomeDetailViewEvents.FailToCall(failure)) } + } + } - uiStateRepository.storeDisplayMode(action.displayMode) + private fun handleSwitchTab(action: HomeDetailAction.SwitchTab) = withState { state -> + if (state.currentTab != action.tab) { + setState { + copy(currentTab = action.tab) + } + if (action.tab is HomeTab.RoomList) { + uiStateRepository.storeDisplayMode(action.tab.displayMode) + } + } + } + + override fun onCleared() { + super.onCleared() + callManager.removeProtocolsCheckerListener(this) + } + + override fun onPSTNSupportUpdated() { + updateShowDialPadTab() + } + + private fun updateShowDialPadTab() { + setState { + copy(showDialPadTab = callManager.supportsPSTNProtocol) } } @@ -138,11 +178,11 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho private fun observeRoomGroupingMethod() { appStateHandler.selectedRoomGroupingObservable .subscribe { - setState { - copy( - roomGroupingMethod = it.orNull() ?: RoomGroupingMethod.BySpace(null) - ) - } + setState { + copy( + roomGroupingMethod = it.orNull() ?: RoomGroupingMethod.BySpace(null) + ) + } } .disposeOnClear() } @@ -165,23 +205,27 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho is RoomGroupingMethod.ByLegacyGroup -> { // TODO!! } - is RoomGroupingMethod.BySpace -> { + is RoomGroupingMethod.BySpace -> { val activeSpaceRoomId = groupingMethod.spaceSummary?.roomId - val dmInvites = session.getRoomSummaries( - roomSummaryQueryParams { - memberships = listOf(Membership.INVITE) - roomCategoryFilter = RoomCategoryFilter.ONLY_DM - activeSpaceFilter = activeSpaceRoomId?.let { ActiveSpaceFilter.ActiveSpace(it) } ?: ActiveSpaceFilter.None - } - ).size + var dmInvites = 0 + var roomsInvite = 0 + if (autoAcceptInvites.showInvites()) { + dmInvites = session.getRoomSummaries( + roomSummaryQueryParams { + memberships = listOf(Membership.INVITE) + roomCategoryFilter = RoomCategoryFilter.ONLY_DM + activeSpaceFilter = activeSpaceRoomId?.let { ActiveSpaceFilter.ActiveSpace(it) } ?: ActiveSpaceFilter.None + } + ).size - val roomsInvite = session.getRoomSummaries( - roomSummaryQueryParams { - memberships = listOf(Membership.INVITE) - roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS - activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(groupingMethod.spaceSummary?.roomId) - } - ).size + roomsInvite = session.getRoomSummaries( + roomSummaryQueryParams { + memberships = listOf(Membership.INVITE) + roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS + activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(groupingMethod.spaceSummary?.roomId) + } + ).size + } val dmRooms = session.getNotificationCountForRooms( roomSummaryQueryParams { diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt index 5aa9612a7a..304444abdd 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt @@ -16,9 +16,11 @@ package im.vector.app.features.home +import androidx.annotation.StringRes import com.airbnb.mvrx.Async import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized +import im.vector.app.R import im.vector.app.RoomGroupingMethod import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.sync.SyncState @@ -28,7 +30,7 @@ data class HomeDetailViewState( val roomGroupingMethod: RoomGroupingMethod = RoomGroupingMethod.BySpace(null), val myMatrixItem: MatrixItem? = null, val asyncRooms: Async<List<RoomSummary>> = Uninitialized, - val displayMode: RoomListDisplayMode = RoomListDisplayMode.PEOPLE, + val currentTab: HomeTab = HomeTab.RoomList(RoomListDisplayMode.PEOPLE), val notificationCountCatchup: Int = 0, val notificationHighlightCatchup: Boolean = false, val notificationCountPeople: Int = 0, @@ -36,5 +38,11 @@ data class HomeDetailViewState( val notificationCountRooms: Int = 0, val notificationHighlightRooms: Boolean = false, val hasUnreadMessages: Boolean = false, - val syncState: SyncState = SyncState.Idle + val syncState: SyncState = SyncState.Idle, + val showDialPadTab: Boolean = false ) : MvRxState + +sealed class HomeTab(@StringRes val titleRes: Int) { + data class RoomList(val displayMode: RoomListDisplayMode) : HomeTab(displayMode.titleRes) + object DialPad : HomeTab(R.string.call_dial_pad_title) +} diff --git a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt index 9b506b6ed7..e9e2447b39 100644 --- a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt @@ -29,6 +29,7 @@ import im.vector.app.RoomGroupingMethod import im.vector.app.core.platform.EmptyAction import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.settings.VectorPreferences import io.reactivex.Observable import io.reactivex.schedulers.Schedulers @@ -54,7 +55,8 @@ data class CountInfo( class UnreadMessagesSharedViewModel @AssistedInject constructor(@Assisted initialState: UnreadMessagesState, session: Session, private val vectorPreferences: VectorPreferences, - appStateHandler: AppStateHandler) + appStateHandler: AppStateHandler, + private val autoAcceptInvites: AutoAcceptInvites) : VectorViewModel<UnreadMessagesState, EmptyAction, EmptyViewEvents>(initialState) { @AssistedFactory @@ -92,12 +94,17 @@ class UnreadMessagesSharedViewModel @AssistedInject constructor(@Assisted initia this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null) } ) - val invites = session.getRoomSummaries( - roomSummaryQueryParams { - this.memberships = listOf(Membership.INVITE) - this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null) - } - ).size + val invites = if (autoAcceptInvites.hideInvites) { + 0 + } else { + session.getRoomSummaries( + roomSummaryQueryParams { + this.memberships = listOf(Membership.INVITE) + this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null) + } + ).size + } + copy( homeSpaceUnread = RoomAggregateNotificationCount( counts.notificationCount + invites, @@ -129,10 +136,13 @@ class UnreadMessagesSharedViewModel @AssistedInject constructor(@Assisted initia is RoomGroupingMethod.BySpace -> { val selectedSpace = appStateHandler.safeActiveSpaceId() - val inviteCount = session.getRoomSummaries( - roomSummaryQueryParams { this.memberships = listOf(Membership.INVITE) } - ).size - + val inviteCount = if (autoAcceptInvites.hideInvites) { + 0 + } else { + session.getRoomSummaries( + roomSummaryQueryParams { this.memberships = listOf(Membership.INVITE) } + ).size + } val totalCount = session.getNotificationCountForRooms( roomSummaryQueryParams { this.memberships = listOf(Membership.JOIN) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt index a8c6f53ebf..ac28f63850 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt @@ -74,7 +74,6 @@ sealed class RoomDetailAction : VectorViewModelAction { object ResendAll : RoomDetailAction() - data class StartCallWithPhoneNumber(val phoneNumber: String, val videoCall: Boolean): RoomDetailAction() data class StartCall(val isVideo: Boolean) : RoomDetailAction() data class AcceptCall(val callId: String): RoomDetailAction() object EndCall : RoomDetailAction() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt index 640e9a62ff..ce3346f8a6 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt @@ -20,7 +20,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.widget.Toast -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.GravityCompat import androidx.drawerlayout.widget.DrawerLayout import com.airbnb.mvrx.viewModel @@ -132,7 +132,7 @@ class RoomDetailActivity : super.onDestroy() } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index 102bcb0511..4fb996bc7e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -18,7 +18,6 @@ package im.vector.app.features.home.room.detail import android.annotation.SuppressLint import android.app.Activity -import android.content.DialogInterface import android.content.Intent import android.content.res.Configuration import android.graphics.Color @@ -75,7 +74,6 @@ import com.vanniktech.emoji.EmojiPopup import im.vector.app.R import im.vector.app.core.dialogs.ConfirmationDialogBuilder import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.epoxy.LayoutManagerStateRestorer import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.exhaustive @@ -94,7 +92,6 @@ import im.vector.app.core.resources.ColorProvider import im.vector.app.core.ui.views.ActiveConferenceView import im.vector.app.core.ui.views.CurrentCallsView import im.vector.app.core.ui.views.FailedMessagesWarningView -import im.vector.app.core.ui.views.JumpToReadMarkerView import im.vector.app.core.ui.views.KnownCallsViewHolder import im.vector.app.core.ui.views.NotificationAreaView import im.vector.app.core.utils.Debouncer @@ -244,7 +241,6 @@ class RoomDetailFragment @Inject constructor( VectorBaseFragment<FragmentRoomDetailBinding>(), TimelineEventController.Callback, VectorInviteView.Callback, - JumpToReadMarkerView.Callback, AttachmentTypeSelectorView.Callback, AttachmentsHelper.Callback, GalleryOrCameraDialogHelper.Listener, @@ -325,7 +321,7 @@ class RoomDetailFragment @Inject constructor( startCallActivityResultLauncher = startCallActivityResultLauncher, showDialogWithMessage = ::showDialogWithMessage, onTapToReturnToCall = ::onTapToReturnToCall - ).register() + ) keyboardStateUtils = KeyboardStateUtils(requireActivity()) setupToolbar(views.roomToolbar) setupRecyclerView() @@ -362,6 +358,10 @@ class RoomDetailFragment @Inject constructor( renderTombstoneEventHandling(it) } + roomDetailViewModel.selectSubscribe(RoomDetailViewState::canShowJumpToReadMarker, RoomDetailViewState::unreadState) { _, _ -> + updateJumpToReadMarkerViewVisibility() + } + roomDetailViewModel.selectSubscribe(RoomDetailViewState::sendMode, RoomDetailViewState::canSendMessage) { mode, canSend -> if (!canSend) { return@selectSubscribe @@ -758,7 +758,12 @@ class RoomDetailFragment @Inject constructor( } private fun setupJumpToReadMarkerView() { - views.jumpToReadMarkerView.callback = this + views.jumpToReadMarkerView.setOnClickListener { + onJumpToReadMarkerClicked() + } + views.jumpToReadMarkerView.setOnCloseIconClickListener { + roomDetailViewModel.handle(RoomDetailAction.MarkAllAsRead) + } } private fun setupActiveCallView() { @@ -1091,7 +1096,13 @@ class RoomDetailFragment @Inject constructor( timelineEventController.timeline = roomDetailViewModel.timeline views.timelineRecyclerView.trackItemsVisibilityChange() - layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, true) + layoutManager = object : LinearLayoutManager(context, RecyclerView.VERTICAL, true) { + override fun onLayoutCompleted(state: RecyclerView.State?) { + super.onLayoutCompleted(state) + updateJumpToReadMarkerViewVisibility() + jumpToBottomViewVisibilityManager.maybeShowJumpToBottomViewVisibilityWithDelay() + } + } val stateRestorer = LayoutManagerStateRestorer(layoutManager).register() scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager, timelineEventController) scrollOnHighlightedEventCallback = ScrollOnHighlightedEventCallback(views.timelineRecyclerView, layoutManager, timelineEventController) @@ -1102,8 +1113,6 @@ class RoomDetailFragment @Inject constructor( it.dispatchTo(stateRestorer) it.dispatchTo(scrollOnNewMessageCallback) it.dispatchTo(scrollOnHighlightedEventCallback) - updateJumpToReadMarkerViewVisibility() - jumpToBottomViewVisibilityManager.maybeShowJumpToBottomViewVisibilityWithDelay() } timelineEventController.addModelBuildListener(modelBuildListener) views.timelineRecyclerView.adapter = timelineEventController.adapter @@ -1159,7 +1168,7 @@ class RoomDetailFragment @Inject constructor( is UnreadState.ReadMarkerNotLoaded -> true is UnreadState.HasUnread -> { if (it.canShowJumpToReadMarker) { - val lastVisibleItem = layoutManager.findLastVisibleItemPosition() + val lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition() val positionOfReadMarker = timelineEventController.getPositionOfReadMarker() if (positionOfReadMarker == null) { false @@ -1226,7 +1235,7 @@ class RoomDetailFragment @Inject constructor( return sendUri(contentUri) } - override fun onTextEmptyStateChanged(isEmpty: Boolean) { + override fun onTextBlankStateChanged(isBlank: Boolean) { views.voiceMessageRecorderView.isVisible = !views.composerLayout.views.sendButton.isVisible } @@ -1454,7 +1463,7 @@ class RoomDetailFragment @Inject constructor( is RoomDetailAction.ReportContent -> { when { data.spam -> { - MaterialAlertDialogBuilder(requireActivity()) + MaterialAlertDialogBuilder(requireActivity(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_NegativeDestructive) .setTitle(R.string.content_reported_as_spam_title) .setMessage(R.string.content_reported_as_spam_content) .setPositiveButton(R.string.ok, null) @@ -1462,10 +1471,9 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) } .show() - .withColoredButton(DialogInterface.BUTTON_NEGATIVE) } data.inappropriate -> { - MaterialAlertDialogBuilder(requireActivity()) + MaterialAlertDialogBuilder(requireActivity(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_NegativeDestructive) .setTitle(R.string.content_reported_as_inappropriate_title) .setMessage(R.string.content_reported_as_inappropriate_content) .setPositiveButton(R.string.ok, null) @@ -1473,10 +1481,9 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) } .show() - .withColoredButton(DialogInterface.BUTTON_NEGATIVE) } else -> { - MaterialAlertDialogBuilder(requireActivity()) + MaterialAlertDialogBuilder(requireActivity(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_NegativeDestructive) .setTitle(R.string.content_reported_title) .setMessage(R.string.content_reported_content) .setPositiveButton(R.string.ok, null) @@ -1484,7 +1491,6 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(data.senderId)) } .show() - .withColoredButton(DialogInterface.BUTTON_NEGATIVE) } } } @@ -1546,7 +1552,7 @@ class RoomDetailFragment @Inject constructor( .subscribe { managed -> if (!managed) { if (title.isValidUrl() && url.isValidUrl() && URL(title).host != URL(url).host) { - MaterialAlertDialogBuilder(requireActivity()) + MaterialAlertDialogBuilder(requireActivity(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_NegativeDestructive) .setTitle(R.string.external_link_confirmation_title) .setMessage( getString(R.string.external_link_confirmation_message, title, url) @@ -1559,7 +1565,6 @@ class RoomDetailFragment @Inject constructor( } .setNegativeButton(R.string.cancel, null) .show() - .withColoredButton(DialogInterface.BUTTON_NEGATIVE) } else { // Open in external browser, in a new Tab openUrlInExternalBrowser(requireContext(), url) @@ -1658,8 +1663,7 @@ class RoomDetailFragment @Inject constructor( override fun onEventLongClicked(informationData: MessageInformationData, messageContent: Any?, view: View): Boolean { view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) - val roomId = roomDetailArgs.roomId - + val roomId = roomDetailViewModel.timeline.getTimelineEventWithId(informationData.eventId)?.roomId ?: return false this.view?.hideKeyboard() MessageActionsBottomSheet @@ -1743,7 +1747,6 @@ class RoomDetailFragment @Inject constructor( } override fun onReadMarkerVisible() { - updateJumpToReadMarkerViewVisibility() roomDetailViewModel.handle(RoomDetailAction.EnterTrackingUnreadMessagesState) } @@ -1751,8 +1754,8 @@ class RoomDetailFragment @Inject constructor( onUrlClicked(url, url) } - override fun onPreviewUrlCloseClicked(eventId: String, fileUrl: String) { - roomDetailViewModel.handle(RoomDetailAction.DoNotShowPreviewUrlFor(eventId, fileUrl)) + override fun onPreviewUrlCloseClicked(eventId: String, url: String) { + roomDetailViewModel.handle(RoomDetailAction.DoNotShowPreviewUrlFor(eventId, url)) } override fun onPreviewUrlImageClicked(sharedView: View?, mxcUrl: String?, title: String?) { @@ -1916,7 +1919,7 @@ class RoomDetailFragment @Inject constructor( } private fun askConfirmationToIgnoreUser(senderId: String) { - MaterialAlertDialogBuilder(requireContext()) + MaterialAlertDialogBuilder(requireContext(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setTitle(R.string.room_participants_action_ignore_title) .setMessage(R.string.room_participants_action_ignore_prompt_msg) .setNegativeButton(R.string.cancel, null) @@ -1924,7 +1927,6 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(senderId)) } .show() - .withColoredButton(DialogInterface.BUTTON_POSITIVE) } /** @@ -2007,10 +2009,7 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.handle(RoomDetailAction.RejectInvite) } -// JumpToReadMarkerView.Callback - - override fun onJumpToReadMarkerClicked() = withState(roomDetailViewModel) { - views.jumpToReadMarkerView.isVisible = false + private fun onJumpToReadMarkerClicked() = withState(roomDetailViewModel) { if (it.unreadState is UnreadState.HasUnread) { roomDetailViewModel.handle(RoomDetailAction.NavigateToEvent(it.unreadState.firstUnreadEventId, false)) } @@ -2019,10 +2018,6 @@ class RoomDetailFragment @Inject constructor( } } - override fun onClearReadMarkerClicked() { - roomDetailViewModel.handle(RoomDetailAction.MarkAllAsRead) - } - // AttachmentTypeSelectorView.Callback private val typeSelectedActivityResultLauncher = registerForPermissionsResult { allGranted -> diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index b582d075d2..166618fae7 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -40,7 +40,6 @@ import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider import im.vector.app.features.attachments.toContentAttachmentData import im.vector.app.features.call.conference.JitsiService -import im.vector.app.features.call.dialpad.DialPadLookup import im.vector.app.features.call.lookup.CallProtocolsChecker import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.command.CommandParser @@ -51,8 +50,8 @@ import im.vector.app.features.crypto.verification.SupportedVerificationMethodsPr import im.vector.app.features.home.room.detail.composer.VoiceMessageHelper import im.vector.app.features.home.room.detail.composer.rainbow.RainbowGenerator import im.vector.app.features.home.room.detail.sticker.StickerPickerActionHandler +import im.vector.app.features.home.room.detail.timeline.factory.TimelineFactory import im.vector.app.features.home.room.detail.timeline.helper.RoomSummariesHolder -import im.vector.app.features.home.room.detail.timeline.helper.TimelineSettingsFactory import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever import im.vector.app.features.home.room.typing.TypingHelper import im.vector.app.features.powerlevel.PowerLevelsObservableFactory @@ -122,7 +121,7 @@ class RoomDetailViewModel @AssistedInject constructor( private val directRoomHelper: DirectRoomHelper, private val jitsiService: JitsiService, private val voiceMessageHelper: VoiceMessageHelper, - timelineSettingsFactory: TimelineSettingsFactory + timelineFactory: TimelineFactory ) : VectorViewModel<RoomDetailViewState, RoomDetailAction, RoomDetailViewEvents>(initialState), Timeline.Listener, ChatEffectManager.Delegate, CallProtocolsChecker.Listener { @@ -130,9 +129,8 @@ class RoomDetailViewModel @AssistedInject constructor( private val eventId = initialState.eventId private val invisibleEventsObservable = BehaviorRelay.create<RoomDetailAction.TimelineEventTurnsInvisible>() private val visibleEventsObservable = BehaviorRelay.create<RoomDetailAction.TimelineEventTurnsVisible>() - private val timelineSettings = timelineSettingsFactory.create() private var timelineEvents = PublishRelay.create<List<TimelineEvent>>() - val timeline = room.createTimeline(eventId, timelineSettings) + val timeline = timelineFactory.createTimeline(viewModelScope, room, eventId) // Same lifecycle than the ViewModel (survive to screen rotation) val previewUrlRetriever = PreviewUrlRetriever(session, viewModelScope) @@ -179,7 +177,6 @@ class RoomDetailViewModel @AssistedInject constructor( observeMyRoomMember() observeActiveRoomWidgets() observePowerLevel() - updateShowDialerOptionState() room.getRoomSummaryLive() viewModelScope.launch(Dispatchers.IO) { tryOrNull { room.markAsRead(ReadService.MarkAsReadParams.READ_RECEIPT) } @@ -304,7 +301,6 @@ class RoomDetailViewModel @AssistedInject constructor( is RoomDetailAction.TapOnFailedToDecrypt -> handleTapOnFailedToDecrypt(action) is RoomDetailAction.SelectStickerAttachment -> handleSelectStickerAttachment() is RoomDetailAction.OpenIntegrationManager -> handleOpenIntegrationManager() - is RoomDetailAction.StartCallWithPhoneNumber -> handleStartCallWithPhoneNumber(action) is RoomDetailAction.StartCall -> handleStartCall(action) is RoomDetailAction.AcceptCall -> handleAcceptCall(action) is RoomDetailAction.EndCall -> handleEndCall() @@ -336,17 +332,6 @@ class RoomDetailViewModel @AssistedInject constructor( }.exhaustive } - private fun handleStartCallWithPhoneNumber(action: RoomDetailAction.StartCallWithPhoneNumber) { - viewModelScope.launch { - try { - val result = DialPadLookup(session, callManager, directRoomHelper).lookupPhoneNumber(action.phoneNumber) - callManager.startOutgoingCall(result.roomId, result.userId, action.videoCall) - } catch (failure: Throwable) { - _viewEvents.post(RoomDetailViewEvents.ActionFailure(action, failure)) - } - } - } - private fun handleAcceptCall(action: RoomDetailAction.AcceptCall) { callManager.getCallById(action.callId)?.also { _viewEvents.post(RoomDetailViewEvents.DisplayAndAcceptCall(it)) @@ -1301,6 +1286,7 @@ class RoomDetailViewModel @AssistedInject constructor( } private fun handleMarkAllAsRead() { + setState { copy(unreadState = UnreadState.HasNoUnread) } viewModelScope.launch { tryOrNull { room.markAsRead(ReadService.MarkAsReadParams.BOTH) } } @@ -1437,7 +1423,6 @@ class RoomDetailViewModel @AssistedInject constructor( } } .subscribe { - Timber.v("Unread state: $it") setState { copy(unreadState = it) } } .disposeOnClear() @@ -1534,16 +1519,6 @@ class RoomDetailViewModel @AssistedInject constructor( _viewEvents.post(RoomDetailViewEvents.OnNewTimelineEvents(eventIds)) } - override fun onPSTNSupportUpdated() { - updateShowDialerOptionState() - } - - private fun updateShowDialerOptionState() { - setState { - copy(showDialerOption = callManager.supportsPSTNProtocol) - } - } - override fun onCleared() { roomSummariesHolder.remove(room.roomId) timeline.dispose() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt index 965733c424..1ead34fadd 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt @@ -75,7 +75,6 @@ data class RoomDetailViewState( val canInvite: Boolean = true, val isAllowedToManageWidgets: Boolean = false, val isAllowedToStartWebRTCCall: Boolean = true, - val showDialerOption: Boolean = false, val hasFailedSending: Boolean = false ) : MvRxState { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/ScrollOnHighlightedEventCallback.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/ScrollOnHighlightedEventCallback.kt index 5d3a91f18d..7f652a2eea 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/ScrollOnHighlightedEventCallback.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/ScrollOnHighlightedEventCallback.kt @@ -20,7 +20,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import im.vector.app.core.platform.DefaultListUpdateCallback import im.vector.app.features.home.room.detail.timeline.TimelineEventController -import timber.log.Timber import java.util.concurrent.atomic.AtomicReference /** @@ -42,19 +41,10 @@ class ScrollOnHighlightedEventCallback(private val recyclerView: RecyclerView, private fun scrollIfNeeded() { val eventId = scheduledEventId.get() ?: return - val positionToScroll = timelineEventController.searchPositionOfEvent(eventId) - if (positionToScroll != null) { - val firstVisibleItem = layoutManager.findFirstCompletelyVisibleItemPosition() - val lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition() - - // Do not scroll it item is already visible - if (positionToScroll !in firstVisibleItem..lastVisibleItem) { - Timber.v("Scroll to $positionToScroll") - recyclerView.stopScroll() - layoutManager.scrollToPosition(positionToScroll) - } - scheduledEventId.set(null) - } + val positionToScroll = timelineEventController.searchPositionOfEvent(eventId) ?: return + recyclerView.stopScroll() + layoutManager.scrollToPosition(positionToScroll) + scheduledEventId.set(null) } fun scheduleScrollTo(eventId: String?) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt index 6f9a4fa651..b71b90ace3 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt @@ -16,26 +16,18 @@ package im.vector.app.features.home.room.detail -import android.os.Bundle import androidx.activity.result.ActivityResultLauncher import androidx.fragment.app.Fragment import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.platform.Restorable import im.vector.app.core.utils.PERMISSIONS_FOR_AUDIO_IP_CALL import im.vector.app.core.utils.PERMISSIONS_FOR_VIDEO_IP_CALL import im.vector.app.core.utils.checkPermissions -import im.vector.app.features.call.DialerChoiceBottomSheet -import im.vector.app.features.call.dialpad.CallDialPadBottomSheet -import im.vector.app.features.call.dialpad.DialPadFragment import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.session.widgets.model.WidgetType -private const val DIALER_OPTION_TAG = "DIALER_OPTION_TAG" -private const val DIAL_PAD_TAG = "DIAL_PAD_TAG" - class StartCallActionsHandler( private val roomId: String, private val fragment: Fragment, @@ -44,52 +36,20 @@ class StartCallActionsHandler( private val roomDetailViewModel: RoomDetailViewModel, private val startCallActivityResultLauncher: ActivityResultLauncher<Array<String>>, private val showDialogWithMessage: (String) -> Unit, - private val onTapToReturnToCall: () -> Unit): Restorable { + private val onTapToReturnToCall: () -> Unit) { fun onVideoCallClicked() { handleCallRequest(true) } - fun onVoiceCallClicked() = withState(roomDetailViewModel) { - if (it.showDialerOption) { - displayDialerChoiceBottomSheet() - } else { - handleCallRequest(false) - } - } - - private fun DialerChoiceBottomSheet.applyListeners(): DialerChoiceBottomSheet { - onDialPadClicked = ::displayDialPadBottomSheet - onVoiceCallClicked = { handleCallRequest(false) } - return this - } - - private fun CallDialPadBottomSheet.applyCallback(): CallDialPadBottomSheet { - callback = object : DialPadFragment.Callback { - override fun onOkClicked(formatted: String?, raw: String?) { - if (raw.isNullOrEmpty()) return - roomDetailViewModel.handle(RoomDetailAction.StartCallWithPhoneNumber(raw, false)) - } - } - return this - } - - private fun displayDialerChoiceBottomSheet() { - DialerChoiceBottomSheet() - .applyListeners() - .show(fragment.parentFragmentManager, DIALER_OPTION_TAG) - } - - private fun displayDialPadBottomSheet() { - CallDialPadBottomSheet.newInstance(true) - .applyCallback() - .show(fragment.parentFragmentManager, DIAL_PAD_TAG) + fun onVoiceCallClicked() { + handleCallRequest(false) } private fun handleCallRequest(isVideoCall: Boolean) = withState(roomDetailViewModel) { state -> val roomSummary = state.asyncRoomSummary.invoke() ?: return@withState when (roomSummary.joinedMembersCount) { - 1 -> { + 1 -> { val pendingInvite = roomSummary.invitedMembersCount ?: 0 > 0 if (pendingInvite) { // wait for other to join @@ -99,7 +59,7 @@ class StartCallActionsHandler( showDialogWithMessage(fragment.getString(R.string.cannot_call_yourself)) } } - 2 -> { + 2 -> { val currentCall = callManager.getCurrentCall() if (currentCall != null) { // resume existing if same room, if not prompt to kill and then restart new call? @@ -190,13 +150,4 @@ class StartCallActionsHandler( } } } - - override fun onSaveInstanceState(outState: Bundle) = Unit - - override fun onRestoreInstanceState(savedInstanceState: Bundle?) { - if (savedInstanceState != null) { - (fragment.parentFragmentManager.findFragmentByTag(DIALER_OPTION_TAG) as? DialerChoiceBottomSheet)?.applyListeners() - (fragment.parentFragmentManager.findFragmentByTag(DIAL_PAD_TAG) as? CallDialPadBottomSheet)?.applyCallback() - } - } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt index 2a2ae56c4c..79ff7be441 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt @@ -37,11 +37,11 @@ class ComposerEditText @JvmOverloads constructor(context: Context, attrs: Attrib interface Callback { fun onRichContentSelected(contentUri: Uri): Boolean - fun onTextEmptyStateChanged(isEmpty: Boolean) + fun onTextBlankStateChanged(isBlank: Boolean) } var callback: Callback? = null - private var isEmptyText = true + private var isBlankText = true override fun onCreateInputConnection(editorInfo: EditorInfo): InputConnection? { val ic = super.onCreateInputConnection(editorInfo) ?: return null @@ -96,9 +96,9 @@ class ComposerEditText @JvmOverloads constructor(context: Context, attrs: Attrib spanToRemove = null } // Report blank status of EditText to be able to arrange other elements of the composer - if (s.isEmpty() != isEmptyText) { - isEmptyText = !isEmptyText - callback?.onTextEmptyStateChanged(isEmptyText) + if (s.isBlank() != isBlankText) { + isBlankText = !isBlankText + callback?.onTextBlankStateChanged(isBlankText) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt index 7833864707..9722f49aaf 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt @@ -27,6 +27,7 @@ import androidx.constraintlayout.widget.ConstraintSet import androidx.core.text.toSpannable import androidx.core.view.isInvisible import androidx.core.view.isVisible +import androidx.transition.AutoTransition import androidx.transition.ChangeBounds import androidx.transition.Fade import androidx.transition.Transition @@ -38,7 +39,6 @@ import org.matrix.android.sdk.api.extensions.orFalse /** * Encapsulate the timeline composer UX. - * */ class TextComposerView @JvmOverloads constructor( context: Context, @@ -74,10 +74,17 @@ class TextComposerView @JvmOverloads constructor( return callback?.onRichContentSelected(contentUri) ?: false } - override fun onTextEmptyStateChanged(isEmpty: Boolean) { - val shouldShowSendButton = currentConstraintSetId == R.layout.composer_layout_constraint_set_expanded || !isEmpty - views.sendButton.isInvisible = !shouldShowSendButton - callback?.onTextEmptyStateChanged(isEmpty) + override fun onTextBlankStateChanged(isBlank: Boolean) { + callback?.onTextBlankStateChanged(isBlank) + val shouldShowSendButton = currentConstraintSetId == R.layout.composer_layout_constraint_set_expanded || !isBlank + TransitionManager.endTransitions(this@TextComposerView) + if (views.sendButton.isVisible != shouldShowSendButton) { + TransitionManager.beginDelayedTransition( + this@TextComposerView, + AutoTransition().also { it.duration = 150 } + ) + views.sendButton.isInvisible = !shouldShowSendButton + } } } views.composerRelatedMessageCloseButton.setOnClickListener { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/CallItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/CallItemFactory.kt index 9dcc3e8182..9697fb6672 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/CallItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/CallItemFactory.kt @@ -16,6 +16,7 @@ package im.vector.app.features.home.room.detail.timeline.factory import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.features.call.vectorCallService import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.home.room.detail.timeline.MessageColorProvider import im.vector.app.features.home.room.detail.timeline.TimelineEventController @@ -26,6 +27,7 @@ import im.vector.app.features.home.room.detail.timeline.helper.RoomSummariesHold import im.vector.app.features.home.room.detail.timeline.item.CallTileTimelineItem import im.vector.app.features.home.room.detail.timeline.item.CallTileTimelineItem_ import im.vector.app.features.home.room.detail.timeline.item.MessageInformationData +import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent @@ -38,6 +40,7 @@ import org.matrix.android.sdk.api.util.toMatrixItem import javax.inject.Inject class CallItemFactory @Inject constructor( + private val session: Session, private val messageColorProvider: MessageColorProvider, private val messageInformationDataFactory: MessageInformationDataFactory, private val messageItemAttributesFactory: MessageItemAttributesFactory, @@ -132,7 +135,8 @@ class CallItemFactory @Inject constructor( isStillActive: Boolean, callback: TimelineEventController.Callback? ): CallTileTimelineItem? { - val userOfInterest = roomSummariesHolder.get(roomId)?.toMatrixItem() ?: return null + val correctedRoomId = session.vectorCallService.userMapper.nativeRoomForVirtualRoom(roomId) ?: roomId + val userOfInterest = roomSummariesHolder.get(correctedRoomId)?.toMatrixItem() ?: return null val attributes = messageItemAttributesFactory.create(null, informationData, callback).let { CallTileTimelineItem.Attributes( callId = callId, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineFactory.kt new file mode 100644 index 0000000000..b57e39b3cf --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineFactory.kt @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home.room.detail.timeline.factory + +import im.vector.app.features.call.vectorCallService +import im.vector.app.features.home.room.detail.timeline.helper.TimelineSettingsFactory +import im.vector.app.features.home.room.detail.timeline.merged.MergedTimelines +import kotlinx.coroutines.CoroutineScope +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.room.Room +import org.matrix.android.sdk.api.session.room.timeline.Timeline +import javax.inject.Inject + +private val secondaryTimelineAllowedTypes = listOf( + EventType.CALL_HANGUP, + EventType.CALL_INVITE, + EventType.CALL_REJECT, + EventType.CALL_ANSWER +) + +class TimelineFactory @Inject constructor(private val session: Session, private val timelineSettingsFactory: TimelineSettingsFactory) { + + fun createTimeline(coroutineScope: CoroutineScope, mainRoom: Room, eventId: String?): Timeline { + val settings = timelineSettingsFactory.create() + if (!session.vectorCallService.protocolChecker.supportVirtualRooms) { + return mainRoom.createTimeline(eventId, settings) + } + val virtualRoomId = session.vectorCallService.userMapper.virtualRoomForNativeRoom(mainRoom.roomId) + return if (virtualRoomId == null) { + mainRoom.createTimeline(eventId, settings) + } else { + val virtualRoom = session.getRoom(virtualRoomId)!! + MergedTimelines( + coroutineScope = coroutineScope, + mainTimeline = mainRoom.createTimeline(eventId, settings), + secondaryTimelineParams = MergedTimelines.SecondaryTimelineParams( + timeline = virtualRoom.createTimeline(null, settings), + shouldFilterTypes = true, + allowedTypes = secondaryTimelineAllowedTypes + ) + ) + } + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt index a9b6bbf0aa..1f12bdbd2c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt @@ -69,7 +69,7 @@ abstract class CallTileTimelineItem : AbsBaseMessageItem<CallTileTimelineItem.Ho holder.acceptView.onClick { attributes.callback?.onTimelineItemAction(RoomDetailAction.AcceptCall(callId = attributes.callId)) } - holder.rejectView.setLeftDrawable(R.drawable.ic_call_hangup, R.attr.colorError) + holder.rejectView.setLeftDrawable(R.drawable.ic_call_hangup, R.attr.colorOnPrimary) holder.rejectView.onClick { attributes.callback?.onTimelineItemAction(RoomDetailAction.EndCall) } @@ -78,17 +78,17 @@ abstract class CallTileTimelineItem : AbsBaseMessageItem<CallTileTimelineItem.Ho CallKind.CONFERENCE -> { holder.rejectView.setText(R.string.ignore) holder.acceptView.setText(R.string.join) - holder.acceptView.setLeftDrawable(R.drawable.ic_call_audio_small, R.attr.colorPrimary) + holder.acceptView.setLeftDrawable(R.drawable.ic_call_audio_small, R.attr.colorOnPrimary) } CallKind.AUDIO -> { holder.rejectView.setText(R.string.call_notification_reject) holder.acceptView.setText(R.string.call_notification_answer) - holder.acceptView.setLeftDrawable(R.drawable.ic_call_audio_small, R.attr.colorPrimary) + holder.acceptView.setLeftDrawable(R.drawable.ic_call_audio_small, R.attr.colorOnPrimary) } CallKind.VIDEO -> { holder.rejectView.setText(R.string.call_notification_reject) holder.acceptView.setText(R.string.call_notification_answer) - holder.acceptView.setLeftDrawable(R.drawable.ic_call_video_small, R.attr.colorPrimary) + holder.acceptView.setLeftDrawable(R.drawable.ic_call_video_small, R.attr.colorOnPrimary) } else -> { Timber.w("Shouldn't be in that state") diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/merged/MergedTimelines.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/merged/MergedTimelines.kt new file mode 100644 index 0000000000..0d5dbc5a8e --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/merged/MergedTimelines.kt @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home.room.detail.timeline.merged + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Semaphore +import kotlinx.coroutines.sync.withPermit +import kotlinx.coroutines.withContext +import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.session.room.sender.SenderInfo +import org.matrix.android.sdk.api.session.room.timeline.Timeline +import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent +import kotlin.reflect.KMutableProperty0 + +/** + * This can be use to merge timeline tiles from 2 different rooms. + * Be aware it wont work properly with permalink. + */ +class MergedTimelines( + private val coroutineScope: CoroutineScope, + private val mainTimeline: Timeline, + private val secondaryTimelineParams: SecondaryTimelineParams) : Timeline by mainTimeline { + + data class SecondaryTimelineParams( + val timeline: Timeline, + val disableReadReceipts: Boolean = true, + val shouldFilterTypes: Boolean = false, + val allowedTypes: List<String> = emptyList() + ) + + private var mainIsInit = false + private var secondaryIsInit = false + private val secondaryTimeline = secondaryTimelineParams.timeline + + private val listenersMapping = HashMap<Timeline.Listener, List<ListenerInterceptor>>() + private val mainTimelineEvents = ArrayList<TimelineEvent>() + private val secondaryTimelineEvents = ArrayList<TimelineEvent>() + private val positionsMapping = HashMap<String, Int>() + private val mergedEvents = ArrayList<TimelineEvent>() + + private val processingSemaphore = Semaphore(1) + + private class ListenerInterceptor( + var timeline: Timeline?, + private val wrappedListener: Timeline.Listener, + private val shouldFilterTypes: Boolean, + private val allowedTypes: List<String>, + private val onTimelineUpdate: (List<TimelineEvent>) -> Unit + ) : Timeline.Listener by wrappedListener { + + override fun onTimelineUpdated(snapshot: List<TimelineEvent>) { + val filteredEvents = if (shouldFilterTypes) { + snapshot.filter { + allowedTypes.contains(it.root.getClearType()) + } + } else { + snapshot + } + onTimelineUpdate(filteredEvents) + } + } + + override fun addListener(listener: Timeline.Listener): Boolean { + val mainTimelineListener = ListenerInterceptor( + timeline = mainTimeline, + wrappedListener = listener, + shouldFilterTypes = false, + allowedTypes = emptyList()) { + processTimelineUpdates(::mainIsInit, mainTimelineEvents, it) + } + val secondaryTimelineListener = ListenerInterceptor( + timeline = secondaryTimeline, + wrappedListener = listener, + shouldFilterTypes = secondaryTimelineParams.shouldFilterTypes, + allowedTypes = secondaryTimelineParams.allowedTypes) { + processTimelineUpdates(::secondaryIsInit, secondaryTimelineEvents, it) + } + listenersMapping[listener] = listOf(mainTimelineListener, secondaryTimelineListener) + return mainTimeline.addListener(mainTimelineListener) && secondaryTimeline.addListener(secondaryTimelineListener) + } + + override fun removeListener(listener: Timeline.Listener): Boolean { + return listenersMapping.remove(listener)?.let { + it.forEach { listener -> + listener.timeline?.removeListener(listener) + listener.timeline = null + } + true + } ?: false + } + + override fun removeAllListeners() { + mainTimeline.removeAllListeners() + secondaryTimeline.removeAllListeners() + } + + override fun start() { + mainTimeline.start() + secondaryTimeline.start() + } + + override fun dispose() { + mainTimeline.dispose() + secondaryTimeline.dispose() + } + + override fun restartWithEventId(eventId: String?) { + mainTimeline.restartWithEventId(eventId) + } + + override fun hasMoreToLoad(direction: Timeline.Direction): Boolean { + return mainTimeline.hasMoreToLoad(direction) || secondaryTimeline.hasMoreToLoad(direction) + } + + override fun paginate(direction: Timeline.Direction, count: Int) { + mainTimeline.paginate(direction, count) + secondaryTimeline.paginate(direction, count) + } + + override fun pendingEventCount(): Int { + return mainTimeline.pendingEventCount() + secondaryTimeline.pendingEventCount() + } + + override fun failedToDeliverEventCount(): Int { + return mainTimeline.pendingEventCount() + secondaryTimeline.pendingEventCount() + } + + override fun getTimelineEventAtIndex(index: Int): TimelineEvent? { + return mergedEvents.getOrNull(index) + } + + override fun getIndexOfEvent(eventId: String?): Int? { + return positionsMapping[eventId] + } + + override fun getTimelineEventWithId(eventId: String?): TimelineEvent? { + return positionsMapping[eventId]?.let { + getTimelineEventAtIndex(it) + } + } + + private fun processTimelineUpdates(isInit: KMutableProperty0<Boolean>, eventsRef: MutableList<TimelineEvent>, newData: List<TimelineEvent>) { + coroutineScope.launch(Dispatchers.Default) { + processingSemaphore.withPermit { + isInit.set(true) + eventsRef.apply { + clear() + addAll(newData) + } + mergeTimeline() + } + } + } + + private suspend fun mergeTimeline() { + val merged = mutableListOf<TimelineEvent>() + val mainItr = mainTimelineEvents.toList().listIterator() + val secondaryItr = secondaryTimelineEvents.toList().listIterator() + var index = 0 + var correctedSenderInfo: SenderInfo? = mainTimelineEvents.firstOrNull()?.senderInfo + if (!mainIsInit || !secondaryIsInit) { + return + } + while (merged.size < mainTimelineEvents.size + secondaryTimelineEvents.size) { + if (mainItr.hasNext()) { + val nextMain = mainItr.next() + correctedSenderInfo = nextMain.senderInfo + if (secondaryItr.hasNext()) { + val nextSecondary = secondaryItr.next() + if (nextSecondary.root.originServerTs ?: 0 > nextMain.root.originServerTs ?: 0) { + positionsMapping[nextSecondary.eventId] = index + merged.add(nextSecondary.correctBeforeMerging(correctedSenderInfo)) + mainItr.previous() + } else { + positionsMapping[nextMain.eventId] = index + merged.add(nextMain) + secondaryItr.previous() + } + } else { + positionsMapping[nextMain.eventId] = index + merged.add(nextMain) + } + } else if (secondaryItr.hasNext()) { + val nextSecondary = secondaryItr.next() + positionsMapping[nextSecondary.eventId] = index + merged.add(nextSecondary.correctBeforeMerging(correctedSenderInfo)) + } + index++ + } + mergedEvents.apply { + clear() + addAll(merged) + } + withContext(Dispatchers.Main) { + listenersMapping.keys.forEach { listener -> + tryOrNull { listener.onTimelineUpdated(merged) } + } + } + } + + private fun TimelineEvent.correctBeforeMerging(correctedSenderInfo: SenderInfo?): TimelineEvent { + return copy( + senderInfo = correctedSenderInfo ?: senderInfo, + readReceipts = if (secondaryTimelineParams.disableReadReceipts) emptyList() else readReceipts + ) + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/GroupRoomListSectionBuilder.kt b/vector/src/main/java/im/vector/app/features/home/room/list/GroupRoomListSectionBuilder.kt index 22b0eb091c..106a02cd3c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/GroupRoomListSectionBuilder.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/GroupRoomListSectionBuilder.kt @@ -22,6 +22,8 @@ import im.vector.app.R import im.vector.app.RoomGroupingMethod import im.vector.app.core.resources.StringProvider import im.vector.app.features.home.RoomListDisplayMode +import im.vector.app.features.invite.AutoAcceptInvites +import im.vector.app.features.invite.showInvites import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.CoroutineScope @@ -38,6 +40,7 @@ class GroupRoomListSectionBuilder( val stringProvider: StringProvider, val viewModelScope: CoroutineScope, val appStateHandler: AppStateHandler, + private val autoAcceptInvites: AutoAcceptInvites, val onDisposable: (Disposable) -> Unit, val onUdpatable: (UpdatableLivePageResult) -> Unit ) : RoomListSectionBuilder { @@ -48,15 +51,15 @@ class GroupRoomListSectionBuilder( val actualGroupId = appStateHandler.safeActiveGroupId() when (mode) { - RoomListDisplayMode.PEOPLE -> { + RoomListDisplayMode.PEOPLE -> { // 3 sections Invites / Fav / Dms buildPeopleSections(sections, activeGroupAwareQueries, actualGroupId) } - RoomListDisplayMode.ROOMS -> { + RoomListDisplayMode.ROOMS -> { // 5 sections invites / Fav / Rooms / Low Priority / Server notice buildRoomsSections(sections, activeGroupAwareQueries, actualGroupId) } - RoomListDisplayMode.FILTERED -> { + RoomListDisplayMode.FILTERED -> { // Used when searching for rooms withQueryParams( { @@ -73,17 +76,18 @@ class GroupRoomListSectionBuilder( ) } RoomListDisplayMode.NOTIFICATIONS -> { - addSection( - sections, - activeGroupAwareQueries, - R.string.invitations_header, - true - ) { - it.memberships = listOf(Membership.INVITE) - it.roomCategoryFilter = RoomCategoryFilter.ALL - it.activeGroupId = actualGroupId + if (autoAcceptInvites.showInvites()) { + addSection( + sections, + activeGroupAwareQueries, + R.string.invitations_header, + true + ) { + it.memberships = listOf(Membership.INVITE) + it.roomCategoryFilter = RoomCategoryFilter.ALL + it.activeGroupId = actualGroupId + } } - addSection( sections, activeGroupAwareQueries, @@ -115,15 +119,17 @@ class GroupRoomListSectionBuilder( private fun buildRoomsSections(sections: MutableList<RoomsSection>, activeSpaceAwareQueries: MutableList<UpdatableLivePageResult>, actualGroupId: String?) { - addSection( - sections, - activeSpaceAwareQueries, - R.string.invitations_header, - true - ) { - it.memberships = listOf(Membership.INVITE) - it.roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS - it.activeGroupId = actualGroupId + if (autoAcceptInvites.showInvites()) { + addSection( + sections, + activeSpaceAwareQueries, + R.string.invitations_header, + true + ) { + it.memberships = listOf(Membership.INVITE) + it.roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS + it.activeGroupId = actualGroupId + } } addSection( @@ -180,14 +186,16 @@ class GroupRoomListSectionBuilder( activeSpaceAwareQueries: MutableList<UpdatableLivePageResult>, actualGroupId: String? ) { - addSection(sections, - activeSpaceAwareQueries, - R.string.invitations_header, - true - ) { - it.memberships = listOf(Membership.INVITE) - it.roomCategoryFilter = RoomCategoryFilter.ONLY_DM - it.activeGroupId = actualGroupId + if (autoAcceptInvites.showInvites()) { + addSection(sections, + activeSpaceAwareQueries, + R.string.invitations_header, + true + ) { + it.memberships = listOf(Membership.INVITE) + it.roomCategoryFilter = RoomCategoryFilter.ONLY_DM + it.activeGroupId = actualGroupId + } } addSection( diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt index 02c89c09dc..3c08793fa4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.list -import android.content.DialogInterface import android.os.Bundle import android.os.Parcelable import android.view.LayoutInflater @@ -34,7 +33,6 @@ import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.epoxy.LayoutManagerStateRestorer import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.exhaustive @@ -386,7 +384,7 @@ class RoomListFragment @Inject constructor( append(getString(R.string.room_participants_leave_private_warning)) } } - MaterialAlertDialogBuilder(requireContext()) + MaterialAlertDialogBuilder(requireContext(), if (isPublicRoom) 0 else R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setTitle(R.string.room_participants_leave_prompt_title) .setMessage(message) .setPositiveButton(R.string.leave) { _, _ -> @@ -394,11 +392,6 @@ class RoomListFragment @Inject constructor( } .setNegativeButton(R.string.cancel, null) .show() - .apply { - if (!isPublicRoom) { - withColoredButton(DialogInterface.BUTTON_POSITIVE) - } - } } override fun invalidate() = withState(roomListViewModel) { state -> diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt index fbb8faebb0..c5f166ea5b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt @@ -30,6 +30,7 @@ import im.vector.app.RoomGroupingMethod import im.vector.app.core.extensions.exhaustive import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider +import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.settings.VectorPreferences import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -49,7 +50,8 @@ class RoomListViewModel @Inject constructor( private val session: Session, private val stringProvider: StringProvider, private val appStateHandler: AppStateHandler, - private val vectorPreferences: VectorPreferences + private val vectorPreferences: VectorPreferences, + private val autoAcceptInvites: AutoAcceptInvites ) : VectorViewModel<RoomListViewState, RoomListAction, RoomListViewEvents>(initialState) { interface Factory { @@ -126,6 +128,7 @@ class RoomListViewModel @Inject constructor( appStateHandler, viewModelScope, suggestedRoomJoiningState, + autoAcceptInvites, { it.disposeOnClear() }, @@ -140,6 +143,7 @@ class RoomListViewModel @Inject constructor( stringProvider, viewModelScope, appStateHandler, + autoAcceptInvites, { it.disposeOnClear() }, diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModelFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModelFactory.kt index a30c175f41..6b269356c7 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModelFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModelFactory.kt @@ -18,6 +18,7 @@ package im.vector.app.features.home.room.list import im.vector.app.AppStateHandler import im.vector.app.core.resources.StringProvider +import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.session.Session import javax.inject.Inject @@ -26,16 +27,18 @@ import javax.inject.Provider class RoomListViewModelFactory @Inject constructor(private val session: Provider<Session>, private val appStateHandler: AppStateHandler, private val stringProvider: StringProvider, - private val vectorPreferences: VectorPreferences) + private val vectorPreferences: VectorPreferences, + private val autoAcceptInvites: AutoAcceptInvites) : RoomListViewModel.Factory { override fun create(initialState: RoomListViewState): RoomListViewModel { return RoomListViewModel( - initialState, - session.get(), - stringProvider, - appStateHandler, - vectorPreferences + initialState = initialState, + session = session.get(), + stringProvider = stringProvider, + appStateHandler = appStateHandler, + vectorPreferences = vectorPreferences, + autoAcceptInvites = autoAcceptInvites ) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItemFactory.kt index f0380b80be..17d96f210f 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItemFactory.kt @@ -17,11 +17,13 @@ package im.vector.app.features.home.room.list import com.airbnb.mvrx.Async +import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Loading import im.vector.app.R import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.resources.StringProvider import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter @@ -37,7 +39,8 @@ class RoomSummaryItemFactory @Inject constructor(private val displayableEventFor private val dateFormatter: VectorDateFormatter, private val stringProvider: StringProvider, private val typingHelper: TypingHelper, - private val avatarRenderer: AvatarRenderer) { + private val avatarRenderer: AvatarRenderer, + private val errorFormatter: ErrorFormatter) { fun create(roomSummary: RoomSummary, roomChangeMembershipStates: Map<String, ChangeMembershipState>, @@ -55,12 +58,21 @@ class RoomSummaryItemFactory @Inject constructor(private val displayableEventFor fun createSuggestion(spaceChildInfo: SpaceChildInfo, suggestedRoomJoiningStates: Map<String, Async<Unit>>, listener: RoomListListener?): VectorEpoxyModel<*> { + val error = (suggestedRoomJoiningStates[spaceChildInfo.childRoomId] as? Fail)?.error return SpaceChildInfoItem_() .id("sug_${spaceChildInfo.childRoomId}") .matrixItem(spaceChildInfo.toMatrixItem()) .avatarRenderer(avatarRenderer) .topic(spaceChildInfo.topic) - .buttonLabel(stringProvider.getString(R.string.join)) + .errorLabel( + error?.let { + stringProvider.getString(R.string.error_failed_to_join_room, errorFormatter.toHumanReadable(it)) + } + ) + .buttonLabel( + if (error != null) stringProvider.getString(R.string.global_retry) + else stringProvider.getString(R.string.join) + ) .loading(suggestedRoomJoiningStates[spaceChildInfo.childRoomId] is Loading) .memberCount(spaceChildInfo.activeMemberCount ?: 0) .buttonClickListener { listener?.onJoinSuggestedRoom(spaceChildInfo) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/SpaceChildInfoItem.kt b/vector/src/main/java/im/vector/app/features/home/room/list/SpaceChildInfoItem.kt index 61fcd1ba86..99cbd45294 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/SpaceChildInfoItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/SpaceChildInfoItem.kt @@ -33,6 +33,7 @@ import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.epoxy.onClick +import im.vector.app.core.extensions.setTextOrHide import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.themes.ThemeUtils import me.gujun.android.span.image @@ -52,6 +53,7 @@ abstract class SpaceChildInfoItem : VectorEpoxyModel<SpaceChildInfoItem.Holder>( @EpoxyAttribute var loading: Boolean = false @EpoxyAttribute var buttonLabel: String? = null + @EpoxyAttribute var errorLabel: String? = null @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var itemLongClickListener: View.OnLongClickListener? = null @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var itemClickListener: ClickListener? = null @@ -97,6 +99,8 @@ abstract class SpaceChildInfoItem : VectorEpoxyModel<SpaceChildInfoItem.Holder>( holder.joinButton.isVisible = true } + holder.errorTextView.setTextOrHide(errorLabel) + holder.joinButton.onClick { // local echo holder.joinButton.isEnabled = false @@ -120,5 +124,6 @@ abstract class SpaceChildInfoItem : VectorEpoxyModel<SpaceChildInfoItem.Holder>( val descriptionText by bind<TextView>(R.id.suggestedRoomDescription) val avatarImageView by bind<ImageView>(R.id.roomAvatarImageView) val rootView by bind<ViewGroup>(R.id.itemRoomLayout) + val errorTextView by bind<TextView>(R.id.inlineErrorText) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/SpaceRoomListSectionBuilder.kt b/vector/src/main/java/im/vector/app/features/home/room/list/SpaceRoomListSectionBuilder.kt index 266adf6b0c..5a296ce7ed 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/SpaceRoomListSectionBuilder.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/SpaceRoomListSectionBuilder.kt @@ -26,6 +26,8 @@ import im.vector.app.AppStateHandler import im.vector.app.R import im.vector.app.core.resources.StringProvider import im.vector.app.features.home.RoomListDisplayMode +import im.vector.app.features.invite.AutoAcceptInvites +import im.vector.app.features.invite.showInvites import im.vector.app.space import io.reactivex.Observable import io.reactivex.disposables.Disposable @@ -50,6 +52,7 @@ class SpaceRoomListSectionBuilder( val appStateHandler: AppStateHandler, val viewModelScope: CoroutineScope, private val suggestedRoomJoiningState: LiveData<Map<String, Async<Unit>>>, + private val autoAcceptInvites: AutoAcceptInvites, val onDisposable: (Disposable) -> Unit, val onUdpatable: (UpdatableLivePageResult) -> Unit, val onlyOrphansInHome: Boolean = false @@ -66,13 +69,13 @@ class SpaceRoomListSectionBuilder( val sections = mutableListOf<RoomsSection>() val activeSpaceAwareQueries = mutableListOf<RoomListViewModel.ActiveSpaceQueryUpdater>() when (mode) { - RoomListDisplayMode.PEOPLE -> { + RoomListDisplayMode.PEOPLE -> { buildDmSections(sections, activeSpaceAwareQueries) } - RoomListDisplayMode.ROOMS -> { + RoomListDisplayMode.ROOMS -> { buildRoomsSections(sections, activeSpaceAwareQueries) } - RoomListDisplayMode.FILTERED -> { + RoomListDisplayMode.FILTERED -> { withQueryParams( { it.memberships = Membership.activeMemberships() @@ -88,20 +91,22 @@ class SpaceRoomListSectionBuilder( ) } RoomListDisplayMode.NOTIFICATIONS -> { - addSection( - sections = sections, - activeSpaceUpdaters = activeSpaceAwareQueries, - nameRes = R.string.invitations_header, - notifyOfLocalEcho = true, - spaceFilterStrategy = if (onlyOrphansInHome) { - RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL - } else { - RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL - }, - countRoomAsNotif = true - ) { - it.memberships = listOf(Membership.INVITE) - it.roomCategoryFilter = RoomCategoryFilter.ALL + if (autoAcceptInvites.showInvites()) { + addSection( + sections = sections, + activeSpaceUpdaters = activeSpaceAwareQueries, + nameRes = R.string.invitations_header, + notifyOfLocalEcho = true, + spaceFilterStrategy = if (onlyOrphansInHome) { + RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL + } else { + RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL + }, + countRoomAsNotif = true + ) { + it.memberships = listOf(Membership.INVITE) + it.roomCategoryFilter = RoomCategoryFilter.ALL + } } addSection( @@ -136,16 +141,18 @@ class SpaceRoomListSectionBuilder( } private fun buildRoomsSections(sections: MutableList<RoomsSection>, activeSpaceAwareQueries: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>) { - addSection( - sections = sections, - activeSpaceUpdaters = activeSpaceAwareQueries, - nameRes = R.string.invitations_header, - notifyOfLocalEcho = true, - spaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL, - countRoomAsNotif = true - ) { - it.memberships = listOf(Membership.INVITE) - it.roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS + if (autoAcceptInvites.showInvites()) { + addSection( + sections = sections, + activeSpaceUpdaters = activeSpaceAwareQueries, + nameRes = R.string.invitations_header, + notifyOfLocalEcho = true, + spaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL, + countRoomAsNotif = true + ) { + it.memberships = listOf(Membership.INVITE) + it.roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS + } } addSection( @@ -253,15 +260,17 @@ class SpaceRoomListSectionBuilder( } private fun buildDmSections(sections: MutableList<RoomsSection>, activeSpaceAwareQueries: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>) { - addSection(sections = sections, - activeSpaceUpdaters = activeSpaceAwareQueries, - nameRes = R.string.invitations_header, - notifyOfLocalEcho = true, - spaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL, - countRoomAsNotif = true - ) { - it.memberships = listOf(Membership.INVITE) - it.roomCategoryFilter = RoomCategoryFilter.ONLY_DM + if (autoAcceptInvites.showInvites()) { + addSection(sections = sections, + activeSpaceUpdaters = activeSpaceAwareQueries, + nameRes = R.string.invitations_header, + notifyOfLocalEcho = true, + spaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL, + countRoomAsNotif = true + ) { + it.memberships = listOf(Membership.INVITE) + it.roomCategoryFilter = RoomCategoryFilter.ONLY_DM + } } addSection(sections, @@ -387,7 +396,7 @@ class SpaceRoomListSectionBuilder( activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(currentSpace) ) } - RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL -> { + RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL -> { if (currentSpace == null) { copy( activeSpaceFilter = ActiveSpaceFilter.None @@ -398,7 +407,7 @@ class SpaceRoomListSectionBuilder( ) } } - RoomListViewModel.SpaceFilterStrategy.NONE -> this + RoomListViewModel.SpaceFilterStrategy.NONE -> this } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/UnreadCounterBadgeView.kt b/vector/src/main/java/im/vector/app/features/home/room/list/UnreadCounterBadgeView.kt index cc7271b55f..9887e06654 100755 --- a/vector/src/main/java/im/vector/app/features/home/room/list/UnreadCounterBadgeView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/UnreadCounterBadgeView.kt @@ -18,10 +18,10 @@ package im.vector.app.features.home.room.list import android.content.Context import android.util.AttributeSet import android.view.View -import androidx.appcompat.widget.AppCompatTextView +import com.google.android.material.textview.MaterialTextView import im.vector.app.R -class UnreadCounterBadgeView : AppCompatTextView { +class UnreadCounterBadgeView : MaterialTextView { constructor(context: Context) : super(context) diff --git a/vector/src/main/java/im/vector/app/features/invite/AutoAcceptInvites.kt b/vector/src/main/java/im/vector/app/features/invite/AutoAcceptInvites.kt new file mode 100644 index 0000000000..87febb37bc --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/invite/AutoAcceptInvites.kt @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.invite + +import javax.inject.Inject + +/** + * This interface defines 2 flags so you can handle auto accept invites. + * At the moment we only have [CompileTimeAutoAcceptInvites] implementation. + */ +interface AutoAcceptInvites { + /** + * Enable auto-accept invites. It means, as soon as you got an invite from the sync, it will try to join it. + */ + val isEnabled: Boolean + + /** + * Hide invites from the UI (from notifications, notification count and room list). By default invites are hidden when [isEnabled] is true + */ + val hideInvites: Boolean + get() = isEnabled +} + +fun AutoAcceptInvites.showInvites() = !hideInvites + +/** + * Simple compile time implementation of AutoAcceptInvites flags. + */ +class CompileTimeAutoAcceptInvites @Inject constructor() : AutoAcceptInvites { + override val isEnabled = false +} diff --git a/vector/src/main/java/im/vector/app/features/invite/InvitesAcceptor.kt b/vector/src/main/java/im/vector/app/features/invite/InvitesAcceptor.kt new file mode 100644 index 0000000000..6e7de1c35b --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/invite/InvitesAcceptor.kt @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.invite + +import im.vector.app.ActiveSessionDataSource +import im.vector.app.features.session.coroutineScope +import io.reactivex.Observable +import io.reactivex.disposables.Disposable +import kotlinx.coroutines.async +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Semaphore +import kotlinx.coroutines.sync.withPermit +import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.api.failure.Failure +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.room.Room +import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState +import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams +import org.matrix.android.sdk.rx.rx +import timber.log.Timber +import java.util.concurrent.TimeUnit +import javax.inject.Inject +import javax.inject.Singleton + +/** + * This class is responsible for auto accepting invites. + * It's listening to invites and membershipChanges so it can retry automatically if needed. + * This mechanism will be on only if AutoAcceptInvites.isEnabled is true. + */ +@Singleton +class InvitesAcceptor @Inject constructor( + private val sessionDataSource: ActiveSessionDataSource, + private val autoAcceptInvites: AutoAcceptInvites +) : Session.Listener { + + private lateinit var activeSessionDisposable: Disposable + private val shouldRejectRoomIds = mutableSetOf<String>() + private val invitedRoomDisposables = HashMap<String, Disposable>() + private val semaphore = Semaphore(1) + + fun initialize() { + observeActiveSession() + } + + private fun observeActiveSession() { + activeSessionDisposable = sessionDataSource.observe() + .distinctUntilChanged() + .subscribe { + it.orNull()?.let { session -> + onSessionActive(session) + } + } + } + + private fun onSessionActive(session: Session) { + if (!autoAcceptInvites.isEnabled) { + return + } + if (invitedRoomDisposables.containsKey(session.sessionId)) { + return + } + session.addListener(this) + val roomQueryParams = roomSummaryQueryParams { + this.memberships = listOf(Membership.INVITE) + } + val rxSession = session.rx() + Observable + .combineLatest( + rxSession.liveRoomSummaries(roomQueryParams), + rxSession.liveRoomChangeMembershipState().debounce(1, TimeUnit.SECONDS), + { invitedRooms, _ -> invitedRooms.map { it.roomId } } + ) + .filter { it.isNotEmpty() } + .subscribe { invitedRoomIds -> + session.coroutineScope.launch { + semaphore.withPermit { + Timber.v("Invited roomIds: $invitedRoomIds") + for (roomId in invitedRoomIds) { + async { session.joinRoomSafely(roomId) }.start() + } + } + } + } + .also { + invitedRoomDisposables[session.sessionId] = it + } + } + + private suspend fun Session.joinRoomSafely(roomId: String) { + if (shouldRejectRoomIds.contains(roomId)) { + getRoom(roomId)?.rejectInviteSafely() + return + } + val roomMembershipChanged = getChangeMemberships(roomId) + if (roomMembershipChanged != ChangeMembershipState.Joined && !roomMembershipChanged.isInProgress()) { + try { + Timber.v("Try auto join room: $roomId") + joinRoom(roomId) + } catch (failure: Throwable) { + Timber.v("Failed auto join room: $roomId") + // if we got 404 on invites, the inviting user have left or the hs is off. + if (failure is Failure.ServerError && failure.httpCode == 404) { + val room = getRoom(roomId) ?: return + val inviterId = room.roomSummary()?.inviterId + // if the inviting user is on the same HS, there can only be one cause: they left, so we try to reject the invite. + if (inviterId?.endsWith(sessionParams.credentials.homeServer.orEmpty()).orFalse()) { + shouldRejectRoomIds.add(roomId) + room.rejectInviteSafely() + } + } + } + } + } + + private suspend fun Room.rejectInviteSafely() { + try { + leave(null) + shouldRejectRoomIds.remove(roomId) + } catch (failure: Throwable) { + Timber.v("Fail rejecting invite for room: $roomId") + } + } + + override fun onSessionStopped(session: Session) { + session.removeListener(this) + invitedRoomDisposables.remove(session.sessionId)?.dispose() + } +} diff --git a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt index ae099dba3f..07dfc62602 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt @@ -21,7 +21,7 @@ import android.content.Intent import android.view.View import android.view.ViewGroup import androidx.annotation.CallSuper -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.ViewCompat import androidx.core.view.children import androidx.core.view.isVisible @@ -356,7 +356,7 @@ open class LoginActivity : VectorBaseActivity<ActivityLoginBinding>(), ToolbarCo } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt index 389895c179..cf799681ac 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt @@ -32,7 +32,7 @@ import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R import im.vector.app.core.extensions.exhaustive import im.vector.app.core.extensions.hideKeyboard -import im.vector.app.core.extensions.showPassword +import im.vector.app.core.extensions.hidePassword import im.vector.app.core.extensions.toReducedUrl import im.vector.app.databinding.FragmentLoginBinding import io.reactivex.Observable @@ -53,7 +53,6 @@ import javax.inject.Inject */ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment<FragmentLoginBinding>() { - private var passwordShown = false private var isSignupMode = false // Temporary patch for https://github.com/vector-im/riotX-android/issues/1410, @@ -69,7 +68,6 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment<FragmentLog setupSubmitButton() setupForgottenPasswordButton() - setupPasswordReveal() views.passwordField.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { @@ -247,23 +245,6 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment<FragmentLog loginViewModel.handle(LoginAction.PostViewEvent(LoginViewEvents.OnForgetPasswordClicked)) } - private fun setupPasswordReveal() { - passwordShown = false - - views.passwordReveal.setOnClickListener { - passwordShown = !passwordShown - - renderPasswordField() - } - - renderPasswordField() - } - - private fun renderPasswordField() { - views.passwordField.showPassword(passwordShown) - views.passwordReveal.render(passwordShown) - } - override fun resetViewModel() { loginViewModel.handle(LoginAction.ResetLogin) } @@ -290,8 +271,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment<FragmentLog when (state.asyncLoginAction) { is Loading -> { // Ensure password is hidden - passwordShown = false - renderPasswordField() + views.passwordField.hidePassword() } is Fail -> { val error = state.asyncLoginAction.error @@ -317,8 +297,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment<FragmentLog when (state.asyncRegistration) { is Loading -> { // Ensure password is hidden - passwordShown = false - renderPasswordField() + views.passwordField.hidePassword() } // Success is handled by the LoginActivity is Success -> Unit diff --git a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt index eb7c437779..d08d81d98a 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt @@ -28,7 +28,7 @@ import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard import im.vector.app.core.extensions.isEmail -import im.vector.app.core.extensions.showPassword +import im.vector.app.core.extensions.hidePassword import im.vector.app.core.extensions.toReducedUrl import im.vector.app.databinding.FragmentLoginResetPasswordBinding import io.reactivex.Observable @@ -41,8 +41,6 @@ import javax.inject.Inject */ class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment<FragmentLoginResetPasswordBinding>() { - private var passwordShown = false - // Show warning only once private var showWarning = true @@ -54,7 +52,6 @@ class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment<F super.onViewCreated(view, savedInstanceState) setupSubmitButton() - setupPasswordReveal() } private fun setupUi(state: LoginViewState) { @@ -112,23 +109,6 @@ class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment<F views.passwordFieldTil.error = null } - private fun setupPasswordReveal() { - passwordShown = false - - views.passwordReveal.setOnClickListener { - passwordShown = !passwordShown - - renderPasswordField() - } - - renderPasswordField() - } - - private fun renderPasswordField() { - views.passwordField.showPassword(passwordShown) - views.passwordReveal.render(passwordShown) - } - override fun resetViewModel() { loginViewModel.handle(LoginAction.ResetResetPassword) } @@ -139,8 +119,7 @@ class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment<F when (state.asyncResetPassword) { is Loading -> { // Ensure new password is hidden - passwordShown = false - renderPasswordField() + views.passwordField.hidePassword() } is Fail -> { views.resetPasswordEmailTil.error = errorFormatter.toHumanReadable(state.asyncResetPassword.error) diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginActivity2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginActivity2.kt index 9adf4bd6c2..60eb1934d0 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginActivity2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginActivity2.kt @@ -21,7 +21,7 @@ import android.content.Intent import android.view.View import android.view.ViewGroup import androidx.annotation.CallSuper -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.ViewCompat import androidx.core.view.children import androidx.core.view.isVisible @@ -388,7 +388,7 @@ open class LoginActivity2 : VectorBaseActivity<ActivityLoginBinding>(), ToolbarC } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSigninPassword2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSigninPassword2.kt index a13905cc5f..71f1d10137 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSigninPassword2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSigninPassword2.kt @@ -28,7 +28,7 @@ import com.airbnb.mvrx.Fail import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard -import im.vector.app.core.extensions.showPassword +import im.vector.app.core.extensions.hidePassword import im.vector.app.databinding.FragmentLoginSigninPassword2Binding import im.vector.app.features.home.AvatarRenderer import io.reactivex.rxkotlin.subscribeBy @@ -47,8 +47,6 @@ class LoginFragmentSigninPassword2 @Inject constructor( private val avatarRenderer: AvatarRenderer ) : AbstractSSOLoginFragment2<FragmentLoginSigninPassword2Binding>() { - private var passwordShown = false - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginSigninPassword2Binding { return FragmentLoginSigninPassword2Binding.inflate(inflater, container, false) } @@ -58,7 +56,6 @@ class LoginFragmentSigninPassword2 @Inject constructor( setupSubmitButton() setupForgottenPasswordButton() - setupPasswordReveal() setupAutoFill() views.passwordField.setOnEditorActionListener { _, actionId, _ -> @@ -135,23 +132,6 @@ class LoginFragmentSigninPassword2 @Inject constructor( loginViewModel.handle(LoginAction2.PostViewEvent(LoginViewEvents2.OpenResetPasswordScreen)) } - private fun setupPasswordReveal() { - passwordShown = false - - views.passwordReveal.setOnClickListener { - passwordShown = !passwordShown - - renderPasswordField() - } - - renderPasswordField() - } - - private fun renderPasswordField() { - views.passwordField.showPassword(passwordShown) - views.passwordReveal.render(passwordShown) - } - override fun resetViewModel() { // loginViewModel.handle(LoginAction2.ResetSignin) } @@ -169,8 +149,7 @@ class LoginFragmentSigninPassword2 @Inject constructor( if (state.isLoading) { // Ensure password is hidden - passwordShown = false - renderPasswordField() + views.passwordField.hidePassword() } } diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSignupPassword2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSignupPassword2.kt index c67579e98d..28a87a0e8b 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSignupPassword2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentSignupPassword2.kt @@ -26,7 +26,7 @@ import androidx.autofill.HintConstants import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard -import im.vector.app.core.extensions.showPassword +import im.vector.app.core.extensions.hidePassword import im.vector.app.databinding.FragmentLoginSignupPassword2Binding import io.reactivex.rxkotlin.subscribeBy import javax.inject.Inject @@ -37,8 +37,6 @@ import javax.inject.Inject */ class LoginFragmentSignupPassword2 @Inject constructor() : AbstractLoginFragment2<FragmentLoginSignupPassword2Binding>() { - private var passwordShown = false - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginSignupPassword2Binding { return FragmentLoginSignupPassword2Binding.inflate(inflater, container, false) } @@ -48,7 +46,6 @@ class LoginFragmentSignupPassword2 @Inject constructor() : AbstractLoginFragment setupSubmitButton() setupAutoFill() - setupPasswordReveal() views.passwordField.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { @@ -97,23 +94,6 @@ class LoginFragmentSignupPassword2 @Inject constructor() : AbstractLoginFragment .disposeOnDestroyView() } - private fun setupPasswordReveal() { - passwordShown = false - - views.passwordReveal.setOnClickListener { - passwordShown = !passwordShown - - renderPasswordField() - } - - renderPasswordField() - } - - private fun renderPasswordField() { - views.passwordReveal.render(passwordShown) - views.passwordField.showPassword(passwordShown) - } - override fun resetViewModel() { // loginViewModel.handle(LoginAction2.ResetSignup) } @@ -127,8 +107,7 @@ class LoginFragmentSignupPassword2 @Inject constructor() : AbstractLoginFragment if (state.isLoading) { // Ensure password is hidden - passwordShown = false - renderPasswordField() + views.passwordField.hidePassword() } } } diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentToAny2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentToAny2.kt index 892699723e..8a12b7e9b6 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginFragmentToAny2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginFragmentToAny2.kt @@ -27,7 +27,7 @@ import androidx.core.view.isVisible import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard -import im.vector.app.core.extensions.showPassword +import im.vector.app.core.extensions.hidePassword import im.vector.app.core.extensions.toReducedUrl import im.vector.app.databinding.FragmentLoginSigninToAny2Binding import im.vector.app.features.login.LoginMode @@ -48,8 +48,6 @@ import javax.inject.Inject */ class LoginFragmentToAny2 @Inject constructor() : AbstractSSOLoginFragment2<FragmentLoginSigninToAny2Binding>() { - private var passwordShown = false - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginSigninToAny2Binding { return FragmentLoginSigninToAny2Binding.inflate(inflater, container, false) } @@ -59,7 +57,6 @@ class LoginFragmentToAny2 @Inject constructor() : AbstractSSOLoginFragment2<Frag setupSubmitButton() setupForgottenPasswordButton() - setupPasswordReveal() setupAutoFill() setupSocialLoginButtons() @@ -159,23 +156,6 @@ class LoginFragmentToAny2 @Inject constructor() : AbstractSSOLoginFragment2<Frag loginViewModel.handle(LoginAction2.PostViewEvent(LoginViewEvents2.OpenResetPasswordScreen)) } - private fun setupPasswordReveal() { - passwordShown = false - - views.passwordReveal.setOnClickListener { - passwordShown = !passwordShown - - renderPasswordField() - } - - renderPasswordField() - } - - private fun renderPasswordField() { - views.passwordField.showPassword(passwordShown) - views.passwordReveal.render(passwordShown) - } - override fun resetViewModel() { // loginViewModel.handle(LoginAction2.ResetSignin) } @@ -208,8 +188,7 @@ class LoginFragmentToAny2 @Inject constructor() : AbstractSSOLoginFragment2<Frag if (state.isLoading) { // Ensure password is hidden - passwordShown = false - renderPasswordField() + views.passwordField.hidePassword() } } diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginResetPasswordFragment2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginResetPasswordFragment2.kt index 2eae5ddcc2..02211209f5 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginResetPasswordFragment2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginResetPasswordFragment2.kt @@ -28,13 +28,12 @@ import com.jakewharton.rxbinding3.widget.textChanges import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard import im.vector.app.core.extensions.isEmail -import im.vector.app.core.extensions.showPassword +import im.vector.app.core.extensions.hidePassword import im.vector.app.core.extensions.toReducedUrl import im.vector.app.core.utils.autoResetTextInputLayoutErrors import im.vector.app.databinding.FragmentLoginResetPassword2Binding import io.reactivex.Observable import io.reactivex.rxkotlin.subscribeBy - import javax.inject.Inject /** @@ -42,8 +41,6 @@ import javax.inject.Inject */ class LoginResetPasswordFragment2 @Inject constructor() : AbstractLoginFragment2<FragmentLoginResetPassword2Binding>() { - private var passwordShown = false - // Show warning only once private var showWarning = true @@ -55,7 +52,6 @@ class LoginResetPasswordFragment2 @Inject constructor() : AbstractLoginFragment2 super.onViewCreated(view, savedInstanceState) setupSubmitButton() - setupPasswordReveal() setupAutoFill() autoResetTextInputLayoutErrors(listOf(views.resetPasswordEmailTil, views.passwordFieldTil)) @@ -148,23 +144,6 @@ class LoginResetPasswordFragment2 @Inject constructor() : AbstractLoginFragment2 views.passwordFieldTil.error = null } - private fun setupPasswordReveal() { - passwordShown = false - - views.passwordReveal.setOnClickListener { - passwordShown = !passwordShown - - renderPasswordField() - } - - renderPasswordField() - } - - private fun renderPasswordField() { - views.passwordField.showPassword(passwordShown) - views.passwordReveal.render(passwordShown) - } - override fun resetViewModel() { loginViewModel.handle(LoginAction2.ResetResetPassword) } @@ -178,8 +157,7 @@ class LoginResetPasswordFragment2 @Inject constructor() : AbstractLoginFragment2 if (state.isLoading) { // Ensure new password is hidden - passwordShown = false - renderPasswordField() + views.passwordField.hidePassword() } } } diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt index 7ac9b28b9a..37ed1e654a 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt @@ -27,6 +27,7 @@ import im.vector.app.BuildConfig import im.vector.app.R import im.vector.app.core.resources.StringProvider import im.vector.app.core.utils.FirstThrottler +import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.settings.VectorPreferences import me.gujun.android.span.span import org.matrix.android.sdk.api.session.Session @@ -50,7 +51,8 @@ class NotificationDrawerManager @Inject constructor(private val context: Context private val activeSessionDataSource: ActiveSessionDataSource, private val iconLoader: IconLoader, private val bitmapLoader: BitmapLoader, - private val outdatedDetector: OutdatedEventDetector?) { + private val outdatedDetector: OutdatedEventDetector?, + private val autoAcceptInvites: AutoAcceptInvites) { private val handlerThread: HandlerThread = HandlerThread("NotificationDrawerManager", Thread.MIN_PRIORITY) private var backgroundHandler: Handler @@ -253,7 +255,14 @@ class NotificationDrawerManager @Inject constructor(private val context: Context roomEvents.add(event) } } - is InviteNotifiableEvent -> invitationEvents.add(event) + is InviteNotifiableEvent -> { + if (autoAcceptInvites.hideInvites) { + // Forget this event + eventIterator.remove() + } else { + invitationEvents.add(event) + } + } is SimpleNotifiableEvent -> simpleEvents.add(event) else -> Timber.w("Type not handled") } diff --git a/vector/src/main/java/im/vector/app/features/pin/PinActivity.kt b/vector/src/main/java/im/vector/app/features/pin/PinActivity.kt index 66ebfa929d..6866afa0a6 100644 --- a/vector/src/main/java/im/vector/app/features/pin/PinActivity.kt +++ b/vector/src/main/java/im/vector/app/features/pin/PinActivity.kt @@ -18,7 +18,7 @@ package im.vector.app.features.pin import android.content.Context import android.content.Intent -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import com.airbnb.mvrx.MvRx import im.vector.app.R import im.vector.app.core.extensions.addFragment @@ -47,7 +47,7 @@ class PinActivity : VectorBaseActivity<ActivitySimpleBinding>(), ToolbarConfigur } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } } diff --git a/vector/src/main/java/im/vector/app/features/popup/IncomingCallAlert.kt b/vector/src/main/java/im/vector/app/features/popup/IncomingCallAlert.kt index 8a4fc7a78d..17ad35f07a 100644 --- a/vector/src/main/java/im/vector/app/features/popup/IncomingCallAlert.kt +++ b/vector/src/main/java/im/vector/app/features/popup/IncomingCallAlert.kt @@ -18,11 +18,10 @@ package im.vector.app.features.popup import android.app.Activity import android.view.View -import android.widget.ImageView -import android.widget.TextView import im.vector.app.R import im.vector.app.core.extensions.setLeftDrawable import im.vector.app.core.glide.GlideApp +import im.vector.app.databinding.AlerterIncomingCallLayoutBinding import im.vector.app.features.home.AvatarRenderer import org.matrix.android.sdk.api.util.MatrixItem @@ -40,30 +39,24 @@ class IncomingCallAlert(uid: String, private val avatarRenderer: AvatarRenderer, private val isVideoCall: Boolean, private val onAccept: () -> Unit, - private val onReject: () -> Unit) - : VectorAlert.ViewBinder { + private val onReject: () -> Unit) : VectorAlert.ViewBinder { override fun bind(view: View) { - val (callKindText, callKindIcon) = if (isVideoCall) { - Pair(R.string.action_video_call, R.drawable.ic_call_video_small) + val views = AlerterIncomingCallLayoutBinding.bind(view) + val (callKindText, callKindIcon, callKindActionIcon) = if (isVideoCall) { + Triple(R.string.action_video_call, R.drawable.ic_call_video_small, R.drawable.ic_call_answer_video) } else { - Pair(R.string.action_voice_call, R.drawable.ic_call_audio_small) + Triple(R.string.action_voice_call, R.drawable.ic_call_audio_small, R.drawable.ic_call_answer) } - view.findViewById<TextView>(R.id.incomingCallKindView).apply { - setText(callKindText) - setLeftDrawable(callKindIcon) + views.incomingCallKindView.setText(callKindText) + views.incomingCallKindView.setLeftDrawable(callKindIcon) + views.incomingCallNameView.text = matrixItem?.getBestName() + matrixItem?.let { avatarRenderer.render(it, views.incomingCallAvatar, GlideApp.with(view.context.applicationContext)) } + views.incomingCallAcceptView.setOnClickListener { + onAccept() } - view.findViewById<TextView>(R.id.incomingCallNameView).text = matrixItem?.getBestName() - view.findViewById<ImageView>(R.id.incomingCallAvatar)?.let { imageView -> - matrixItem?.let { avatarRenderer.render(it, imageView, GlideApp.with(view.context.applicationContext)) } - } - view.findViewById<ImageView>(R.id.incomingCallAcceptView).apply { - setOnClickListener { - onAccept() - } - setImageResource(callKindIcon) - } - view.findViewById<ImageView>(R.id.incomingCallRejectView).setOnClickListener { + views.incomingCallAcceptView.setImageResource(callKindActionIcon) + views.incomingCallRejectView.setOnClickListener { onReject() } } diff --git a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt index 3228ffa6e1..d6aa0a1943 100644 --- a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt +++ b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt @@ -231,7 +231,7 @@ class PopupAlertManager @Inject constructor() { setIcon(it) } alert.actions.forEach { action -> - addButton(action.title, R.style.AlerterButton) { + addButton(action.title, R.style.Widget_Vector_Button_Text_Alerter) { if (action.autoClose) { currentIsDismissed() Alerter.hide() diff --git a/vector/src/main/java/im/vector/app/features/popup/VerificationVectorAlert.kt b/vector/src/main/java/im/vector/app/features/popup/VerificationVectorAlert.kt index ee6728f969..228c629161 100644 --- a/vector/src/main/java/im/vector/app/features/popup/VerificationVectorAlert.kt +++ b/vector/src/main/java/im/vector/app/features/popup/VerificationVectorAlert.kt @@ -18,10 +18,10 @@ package im.vector.app.features.popup import android.app.Activity import android.view.View -import android.widget.ImageView import androidx.annotation.DrawableRes import im.vector.app.R import im.vector.app.core.glide.GlideApp +import im.vector.app.databinding.AlerterVerificationLayoutBinding import im.vector.app.features.home.AvatarRenderer import org.matrix.android.sdk.api.util.MatrixItem @@ -33,19 +33,15 @@ class VerificationVectorAlert(uid: String, * Alert are displayed by default, but let this lambda return false to prevent displaying */ override val shouldBeDisplayedIn: ((Activity) -> Boolean) = { true } -) : DefaultVectorAlert( - uid, title, description, iconId, shouldBeDisplayedIn -) { +) : DefaultVectorAlert(uid, title, description, iconId, shouldBeDisplayedIn) { override val layoutRes = R.layout.alerter_verification_layout class ViewBinder(private val matrixItem: MatrixItem?, - private val avatarRenderer: AvatarRenderer) - : VectorAlert.ViewBinder { + private val avatarRenderer: AvatarRenderer) : VectorAlert.ViewBinder { override fun bind(view: View) { - view.findViewById<ImageView>(R.id.ivUserAvatar)?.let { imageView -> - matrixItem?.let { avatarRenderer.render(it, imageView, GlideApp.with(view.context.applicationContext)) } - } + val views = AlerterVerificationLayoutBinding.bind(view) + matrixItem?.let { avatarRenderer.render(it, views.ivUserAvatar, GlideApp.with(view.context.applicationContext)) } } } } diff --git a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt index b2f1c3c15a..ecfaf93747 100644 --- a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt @@ -24,7 +24,6 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.widget.SearchView -import androidx.appcompat.widget.Toolbar import androidx.core.view.isVisible import com.airbnb.mvrx.viewModel import com.google.android.material.tabs.TabLayout @@ -150,13 +149,13 @@ class EmojiReactionPickerActivity : VectorBaseActivity<ActivityEmojiReactionPick searchView.isIconified = false searchView.requestFocusFromTouch() // we want to force the tool bar as visible even if hidden with scroll flags - findViewById<Toolbar>(R.id.toolbar)?.minimumHeight = getActionBarSize() + views.emojiPickerToolbar.minimumHeight = getActionBarSize() return true } override fun onMenuItemActionCollapse(p0: MenuItem?): Boolean { // when back, clear all search - findViewById<Toolbar>(R.id.toolbar)?.minimumHeight = 0 + views.emojiPickerToolbar.minimumHeight = 0 searchView.setQuery("", true) return true } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomActivity.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomActivity.kt index 5c4ee2b761..07dfadb753 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomActivity.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomActivity.kt @@ -19,7 +19,7 @@ package im.vector.app.features.roomdirectory.createroom import android.content.Context import android.content.Intent import android.os.Bundle -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import im.vector.app.R import im.vector.app.core.di.ScreenComponent import im.vector.app.core.extensions.addFragment @@ -40,7 +40,7 @@ class CreateRoomActivity : VectorBaseActivity<ActivitySimpleBinding>(), ToolbarC override fun getCoordinatorLayout() = views.coordinatorLayout - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomController.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomController.kt index 61b34a1499..6c441c355c 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomController.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomController.kt @@ -99,11 +99,13 @@ class CreateRoomController @Inject constructor( } if (viewState.roomVisibilityType is CreateRoomViewState.RoomVisibilityType.Public) { // Room alias for public room - roomAliasEditItem { + formEditTextItem { id("alias") enabled(enableFormElement) value(viewState.roomVisibilityType.aliasLocalPart) - homeServer(":" + viewState.homeServerName) + suffixText(":" + viewState.homeServerName) + prefixText("#") + hint(host.stringProvider.getString(R.string.room_alias_address_hint)) errorMessage( host.roomAliasErrorFormatter.format( (((viewState.asyncCreateRoomRequest as? Fail)?.error) as? CreateRoomFailure.AliasError)?.aliasError) diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/RoomAliasEditItem.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/RoomAliasEditItem.kt deleted file mode 100644 index 9cb6f79a56..0000000000 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/RoomAliasEditItem.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.roomdirectory.createroom - -import android.text.Editable -import android.widget.TextView -import com.airbnb.epoxy.EpoxyAttribute -import com.airbnb.epoxy.EpoxyModelClass -import com.google.android.material.textfield.TextInputEditText -import com.google.android.material.textfield.TextInputLayout -import im.vector.app.R -import im.vector.app.core.epoxy.TextListener -import im.vector.app.core.epoxy.VectorEpoxyHolder -import im.vector.app.core.epoxy.VectorEpoxyModel -import im.vector.app.core.epoxy.addTextChangedListenerOnce -import im.vector.app.core.epoxy.setValueOnce -import im.vector.app.core.platform.SimpleTextWatcher - -@EpoxyModelClass(layout = R.layout.item_room_alias_text_input) -abstract class RoomAliasEditItem : VectorEpoxyModel<RoomAliasEditItem.Holder>() { - - @EpoxyAttribute - var value: String? = null - - @EpoxyAttribute - var errorMessage: String? = null - - @EpoxyAttribute - var homeServer: String? = null - - @EpoxyAttribute - var enabled: Boolean = true - - @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) - var onTextChange: TextListener? = null - - private val onTextChangeListener = object : SimpleTextWatcher() { - override fun afterTextChanged(s: Editable) { - onTextChange?.invoke(s.toString()) - } - } - - override fun bind(holder: Holder) { - super.bind(holder) - holder.textInputLayout.isEnabled = enabled - holder.textInputLayout.error = errorMessage - - holder.setValueOnce(holder.textInputEditText, value) - holder.textInputEditText.isEnabled = enabled - holder.textInputEditText.addTextChangedListenerOnce(onTextChangeListener) - holder.homeServerText.text = homeServer - } - - override fun shouldSaveViewState(): Boolean { - return false - } - - override fun unbind(holder: Holder) { - super.unbind(holder) - holder.textInputEditText.removeTextChangedListener(onTextChangeListener) - } - - class Holder : VectorEpoxyHolder() { - val textInputLayout by bind<TextInputLayout>(R.id.itemRoomAliasTextInputLayout) - val textInputEditText by bind<TextInputEditText>(R.id.itemRoomAliasTextInputEditText) - val homeServerText by bind<TextView>(R.id.itemRoomAliasHomeServer) - } -} diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewActivity.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewActivity.kt index f9cf8e6dd7..d56870d623 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewActivity.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewActivity.kt @@ -19,7 +19,7 @@ package im.vector.app.features.roomdirectory.roompreview import android.content.Context import android.content.Intent import android.os.Parcelable -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import im.vector.app.R import im.vector.app.core.extensions.addFragment import im.vector.app.core.platform.ToolbarConfigurable @@ -77,7 +77,7 @@ class RoomPreviewActivity : VectorBaseActivity<ActivitySimpleBinding>(), Toolbar override fun getCoordinatorLayout() = views.coordinatorLayout - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileActivity.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileActivity.kt index ef0c7dc962..37ad2741ca 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileActivity.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileActivity.kt @@ -20,7 +20,7 @@ package im.vector.app.features.roommemberprofile import android.content.Context import android.content.Intent import android.widget.Toast -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.viewModel import im.vector.app.R @@ -77,7 +77,7 @@ class RoomMemberProfileActivity : } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt index 8a075e650e..07ba442621 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt @@ -20,7 +20,7 @@ package im.vector.app.features.roomprofile import android.content.Context import android.content.Intent import android.widget.Toast -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.viewModel import im.vector.app.R @@ -162,7 +162,7 @@ class RoomProfileActivity : addFragmentToBackstack(R.id.simpleFragmentContainer, RoomBannedMemberListFragment::class.java, roomProfileArgs) } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index f9324ad3e2..9ebca6164a 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -17,7 +17,6 @@ package im.vector.app.features.roomprofile -import android.content.DialogInterface import android.os.Bundle import android.os.Parcelable import android.view.LayoutInflater @@ -33,7 +32,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R import im.vector.app.core.animations.AppBarStateChangeListener import im.vector.app.core.animations.MatrixItemAppBarStateChangeListener -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith import im.vector.app.core.extensions.copyOnLongClick @@ -268,7 +266,7 @@ class RoomProfileFragment @Inject constructor( append(getString(R.string.room_participants_leave_private_warning)) } } - MaterialAlertDialogBuilder(requireContext()) + MaterialAlertDialogBuilder(requireContext(), if (isPublicRoom) 0 else R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setTitle(R.string.room_participants_leave_prompt_title) .setMessage(message) .setPositiveButton(R.string.leave) { _, _ -> @@ -276,11 +274,6 @@ class RoomProfileFragment @Inject constructor( } .setNegativeButton(R.string.cancel, null) .show() - .apply { - if (!isPublicRoom) { - withColoredButton(DialogInterface.BUTTON_POSITIVE) - } - } } override fun onRoomAliasesClicked() { diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt index 97050e9c6d..4a683b6292 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt @@ -36,9 +36,9 @@ import im.vector.app.features.discovery.settingsInfoItem import im.vector.app.features.form.formEditTextItem import im.vector.app.features.form.formSwitchItem import im.vector.app.features.roomdirectory.createroom.RoomAliasErrorFormatter -import im.vector.app.features.roomdirectory.createroom.roomAliasEditItem import org.matrix.android.sdk.api.session.room.alias.RoomAliasError import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility +import org.matrix.android.sdk.api.session.room.model.RoomType import javax.inject.Inject class RoomAliasController @Inject constructor( @@ -71,7 +71,9 @@ class RoomAliasController @Inject constructor( // Published alias buildPublishInfo(data) // Room directory visibility - buildRoomDirectoryVisibility(data) + if (data.roomSummary.invoke()?.roomType != RoomType.SPACE) { + buildRoomDirectoryVisibility(data) + } // Local alias buildLocalInfo(data) } @@ -243,10 +245,12 @@ class RoomAliasController @Inject constructor( } } is RoomAliasViewState.AddAliasState.Editing -> { - roomAliasEditItem { + formEditTextItem { id("newLocalAlias") value(data.newLocalAliasState.value) - homeServer(":" + data.homeServerName) + suffixText(":" + data.homeServerName) + prefixText("#") + hint(host.stringProvider.getString(R.string.room_alias_address_hint)) errorMessage(host.roomAliasErrorFormatter.format((data.newLocalAliasState.asyncRequest as? Fail)?.error as? RoomAliasError)) onTextChange { value -> host.callback?.setNewLocalAliasLocalPart(value) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt index b790e0fccf..3f429737f2 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt @@ -16,7 +16,6 @@ package im.vector.app.features.roomprofile.alias -import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -27,7 +26,6 @@ import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith import im.vector.app.core.extensions.exhaustive @@ -133,7 +131,7 @@ class RoomAliasFragment @Inject constructor( } private fun unpublishAlias(alias: String) { - MaterialAlertDialogBuilder(requireContext()) + MaterialAlertDialogBuilder(requireContext(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setTitle(R.string.dialog_title_confirmation) .setMessage(getString(R.string.room_alias_unpublish_confirmation, alias)) .setNegativeButton(R.string.cancel, null) @@ -141,7 +139,6 @@ class RoomAliasFragment @Inject constructor( viewModel.handle(RoomAliasAction.UnpublishAlias(alias)) } .show() - .withColoredButton(DialogInterface.BUTTON_POSITIVE) } override fun toggleManualPublishForm() { @@ -185,7 +182,7 @@ class RoomAliasFragment @Inject constructor( } private fun removeLocalAlias(alias: String) { - MaterialAlertDialogBuilder(requireContext()) + MaterialAlertDialogBuilder(requireContext(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setTitle(R.string.dialog_title_confirmation) .setMessage(getString(R.string.room_alias_delete_confirmation, alias)) .setNegativeButton(R.string.cancel, null) @@ -193,6 +190,5 @@ class RoomAliasFragment @Inject constructor( viewModel.handle(RoomAliasAction.RemoveLocalAlias(alias)) } .show() - .withColoredButton(DialogInterface.BUTTON_POSITIVE) } } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt index ed1188f682..caa0763c87 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt @@ -37,7 +37,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper import im.vector.app.core.extensions.hideKeyboard -import im.vector.app.core.extensions.showPassword +import im.vector.app.core.extensions.hidePassword import im.vector.app.core.intent.getFilenameFromUri import im.vector.app.core.platform.SimpleTextWatcher import im.vector.app.core.preference.UserAvatarPreference @@ -66,7 +66,7 @@ import javax.inject.Inject class VectorSettingsGeneralFragment @Inject constructor( colorProvider: ColorProvider -): +) : VectorSettingsBaseFragment(), GalleryOrCameraDialogHelper.Listener { @@ -347,18 +347,6 @@ class VectorSettingsGeneralFragment @Inject constructor( val view: ViewGroup = activity.layoutInflater.inflate(R.layout.dialog_change_password, null) as ViewGroup val views = DialogChangePasswordBinding.bind(view) - var passwordShown = false - - views.changePasswordShowPasswords.setOnClickListener { - passwordShown = !passwordShown - - views.changePasswordOldPwdText.showPassword(passwordShown) - views.changePasswordNewPwdText.showPassword(passwordShown) - views.changePasswordConfirmNewPwdText.showPassword(passwordShown) - - views.changePasswordShowPasswords.render(passwordShown) - } - val dialog = MaterialAlertDialogBuilder(activity) .setView(view) .setCancelable(false) @@ -377,13 +365,8 @@ class VectorSettingsGeneralFragment @Inject constructor( fun updateUi() { val oldPwd = views.changePasswordOldPwdText.text.toString() val newPwd = views.changePasswordNewPwdText.text.toString() - val newConfirmPwd = views.changePasswordConfirmNewPwdText.text.toString() - updateButton.isEnabled = oldPwd.isNotEmpty() && newPwd.isNotEmpty() && newPwd == newConfirmPwd - - if (newPwd.isNotEmpty() && newConfirmPwd.isNotEmpty() && newPwd != newConfirmPwd) { - views.changePasswordConfirmNewPwdTil.error = getString(R.string.passwords_do_not_match) - } + updateButton.isEnabled = oldPwd.isNotEmpty() && newPwd.isNotEmpty() } views.changePasswordOldPwdText.addTextChangedListener(object : SimpleTextWatcher() { @@ -395,32 +378,20 @@ class VectorSettingsGeneralFragment @Inject constructor( views.changePasswordNewPwdText.addTextChangedListener(object : SimpleTextWatcher() { override fun afterTextChanged(s: Editable) { - views.changePasswordConfirmNewPwdTil.error = null - updateUi() - } - }) - - views.changePasswordConfirmNewPwdText.addTextChangedListener(object : SimpleTextWatcher() { - override fun afterTextChanged(s: Editable) { - views.changePasswordConfirmNewPwdTil.error = null updateUi() } }) fun showPasswordLoadingView(toShow: Boolean) { if (toShow) { - views.changePasswordShowPasswords.isEnabled = false views.changePasswordOldPwdText.isEnabled = false views.changePasswordNewPwdText.isEnabled = false - views.changePasswordConfirmNewPwdText.isEnabled = false views.changePasswordLoader.isVisible = true updateButton.isEnabled = false cancelButton.isEnabled = false } else { - views.changePasswordShowPasswords.isEnabled = true views.changePasswordOldPwdText.isEnabled = true views.changePasswordNewPwdText.isEnabled = true - views.changePasswordConfirmNewPwdText.isEnabled = true views.changePasswordLoader.isVisible = false updateButton.isEnabled = true cancelButton.isEnabled = true @@ -428,10 +399,9 @@ class VectorSettingsGeneralFragment @Inject constructor( } updateButton.setOnClickListener { - if (passwordShown) { - // Hide passwords during processing - views.changePasswordShowPasswords.performClick() - } + // Hide passwords during processing + views.changePasswordOldPwdText.hidePassword() + views.changePasswordNewPwdText.hidePassword() view.hideKeyboard() diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt index bb946ace7d..0897e1c01d 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt @@ -37,7 +37,6 @@ import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.dialogs.ExportKeysDialog import im.vector.app.core.extensions.queryExportKeys import im.vector.app.core.extensions.registerStartForActivityResult -import im.vector.app.core.extensions.showPassword import im.vector.app.core.intent.ExternalIntentData import im.vector.app.core.intent.analyseIntent import im.vector.app.core.intent.getFilenameFromUri @@ -451,14 +450,6 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor( .setTitle(R.string.encryption_import_room_keys) .setView(dialogLayout) - var passwordVisible = false - - views.importDialogShowPassword.setOnClickListener { - passwordVisible = !passwordVisible - views.dialogE2eKeysPassphraseEditText.showPassword(passwordVisible) - views.importDialogShowPassword.render(passwordVisible) - } - views.dialogE2eKeysPassphraseEditText.addTextChangedListener(object : SimpleTextWatcher() { override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { views.dialogE2eKeysImportButton.isEnabled = !views.dialogE2eKeysPassphraseEditText.text.isNullOrEmpty() diff --git a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountAction.kt b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountAction.kt index c3fa844805..bf62800d6a 100644 --- a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountAction.kt +++ b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountAction.kt @@ -19,7 +19,6 @@ package im.vector.app.features.settings.account.deactivation import im.vector.app.core.platform.VectorViewModelAction sealed class DeactivateAccountAction : VectorViewModelAction { - object TogglePassword : DeactivateAccountAction() data class DeactivateAccount(val eraseAllData: Boolean) : DeactivateAccountAction() object SsoAuthDone: DeactivateAccountAction() diff --git a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountViewModel.kt index 80af64d9f3..80c64220c0 100644 --- a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountViewModel.kt @@ -41,7 +41,7 @@ import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException data class DeactivateAccountViewState( - val passwordShown: Boolean = false + val dummy: Boolean = false ) : MvRxState class DeactivateAccountViewModel @AssistedInject constructor(@Assisted private val initialState: DeactivateAccountViewState, @@ -58,7 +58,6 @@ class DeactivateAccountViewModel @AssistedInject constructor(@Assisted private v override fun handle(action: DeactivateAccountAction) { when (action) { - DeactivateAccountAction.TogglePassword -> handleTogglePassword() is DeactivateAccountAction.DeactivateAccount -> handleDeactivateAccount(action) DeactivateAccountAction.SsoAuthDone -> { Timber.d("## UIA - FallBack success") @@ -87,12 +86,6 @@ class DeactivateAccountViewModel @AssistedInject constructor(@Assisted private v }.exhaustive } - private fun handleTogglePassword() = withState { - setState { - copy(passwordShown = !passwordShown) - } - } - private fun handleDeactivateAccount(action: DeactivateAccountAction.DeactivateAccount) { _viewEvents.post(DeactivateAccountViewEvents.Loading()) diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataFragment.kt index 49d1789d64..a55032e44a 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataFragment.kt @@ -16,7 +16,6 @@ package im.vector.app.features.settings.devtools -import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -26,7 +25,6 @@ import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith import im.vector.app.core.platform.VectorBaseFragment @@ -85,7 +83,7 @@ class AccountDataFragment @Inject constructor( } override fun didLongTap(data: UserAccountDataEvent) { - MaterialAlertDialogBuilder(requireActivity()) + MaterialAlertDialogBuilder(requireActivity(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setTitle(R.string.delete) .setMessage(getString(R.string.delete_account_data_warning, data.type)) .setNegativeButton(R.string.cancel, null) @@ -93,6 +91,5 @@ class AccountDataFragment @Inject constructor( viewModel.handle(AccountDataAction.DeleteAccountData(data.type)) } .show() - .withColoredButton(DialogInterface.BUTTON_POSITIVE) } } diff --git a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsFragment.kt index d6b6315357..384348b85d 100644 --- a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsFragment.kt @@ -17,7 +17,6 @@ package im.vector.app.features.settings.threepids import android.app.Activity -import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -27,7 +26,6 @@ import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith import im.vector.app.core.extensions.exhaustive @@ -72,12 +70,6 @@ class ThreePidsSettingsFragment @Inject constructor( } } - // private fun askUserPassword() { -// PromptPasswordDialog().show(requireActivity()) { password -> -// viewModel.handle(ThreePidsSettingsAction.AccountPassword(password)) -// } -// } - private fun askAuthentication(event: ThreePidsSettingsViewEvents.RequestReAuth) { ReAuthActivity.newIntent(requireContext(), event.registrationFlowResponse, @@ -192,14 +184,13 @@ class ThreePidsSettingsFragment @Inject constructor( } override fun deleteThreePid(threePid: ThreePid) { - MaterialAlertDialogBuilder(requireActivity()) + MaterialAlertDialogBuilder(requireActivity(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setMessage(getString(R.string.settings_remove_three_pid_confirmation_content, threePid.getFormattedValue())) .setPositiveButton(R.string.remove) { _, _ -> viewModel.handle(ThreePidsSettingsAction.DeleteThreePid(threePid)) } .setNegativeButton(R.string.cancel, null) .show() - .withColoredButton(DialogInterface.BUTTON_POSITIVE) } override fun onBackPressed(toolbarButton: Boolean): Boolean { diff --git a/vector/src/main/java/im/vector/app/features/settings/troubleshoot/NotificationTroubleshootRecyclerViewAdapter.kt b/vector/src/main/java/im/vector/app/features/settings/troubleshoot/NotificationTroubleshootRecyclerViewAdapter.kt index fd7e3cbb6a..70e5bdff10 100644 --- a/vector/src/main/java/im/vector/app/features/settings/troubleshoot/NotificationTroubleshootRecyclerViewAdapter.kt +++ b/vector/src/main/java/im/vector/app/features/settings/troubleshoot/NotificationTroubleshootRecyclerViewAdapter.kt @@ -18,13 +18,10 @@ package im.vector.app.features.settings.troubleshoot import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button -import android.widget.ImageView -import android.widget.ProgressBar -import android.widget.TextView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import im.vector.app.R +import im.vector.app.databinding.ItemNotificationTroubleshootBinding import im.vector.app.features.themes.ThemeUtils class NotificationTroubleshootRecyclerViewAdapter(val tests: ArrayList<TroubleshootTest>) @@ -46,71 +43,67 @@ class NotificationTroubleshootRecyclerViewAdapter(val tests: ArrayList<Troublesh override fun getItemCount(): Int = tests.size class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val troubleshootProgressBar = itemView.findViewById<ProgressBar>(R.id.troubleshootProgressBar) - private val troubleshootTestTitle = itemView.findViewById<TextView>(R.id.troubleshootTestTitle) - private val troubleshootTestDescription = itemView.findViewById<TextView>(R.id.troubleshootTestDescription) - private val troubleshootStatusIcon = itemView.findViewById<ImageView>(R.id.troubleshootStatusIcon) - private val troubleshootTestButton = itemView.findViewById<Button>(R.id.troubleshootTestButton) + private val views = ItemNotificationTroubleshootBinding.bind(itemView) fun bind(test: TroubleshootTest) { val context = itemView.context - troubleshootTestTitle.setTextColor(ThemeUtils.getColor(context, R.attr.vctr_content_primary)) - troubleshootTestDescription.setTextColor(ThemeUtils.getColor(context, R.attr.vctr_content_secondary)) + views.troubleshootTestTitle.setTextColor(ThemeUtils.getColor(context, R.attr.vctr_content_primary)) + views.troubleshootTestDescription.setTextColor(ThemeUtils.getColor(context, R.attr.vctr_content_secondary)) when (test.status) { TroubleshootTest.TestStatus.NOT_STARTED -> { - troubleshootTestTitle.setTextColor(ThemeUtils.getColor(context, R.attr.vctr_content_secondary)) + views.troubleshootTestTitle.setTextColor(ThemeUtils.getColor(context, R.attr.vctr_content_secondary)) - troubleshootProgressBar.visibility = View.INVISIBLE - troubleshootStatusIcon.visibility = View.VISIBLE - troubleshootStatusIcon.setImageResource(R.drawable.unit_test) + views.troubleshootProgressBar.visibility = View.INVISIBLE + views.troubleshootStatusIcon.visibility = View.VISIBLE + views.troubleshootStatusIcon.setImageResource(R.drawable.unit_test) } TroubleshootTest.TestStatus.WAITING_FOR_USER -> { - troubleshootProgressBar.visibility = View.INVISIBLE - troubleshootStatusIcon.visibility = View.VISIBLE + views.troubleshootProgressBar.visibility = View.INVISIBLE + views.troubleshootStatusIcon.visibility = View.VISIBLE val infoColor = ContextCompat.getColor(context, R.color.vector_info_color) val drawable = ContextCompat.getDrawable(itemView.context, R.drawable.ic_notification_privacy_warning)?.apply { ThemeUtils.tintDrawableWithColor(this, infoColor) } - troubleshootStatusIcon.setImageDrawable(drawable) - troubleshootTestDescription.setTextColor(infoColor) + views.troubleshootStatusIcon.setImageDrawable(drawable) + views.troubleshootTestDescription.setTextColor(infoColor) } TroubleshootTest.TestStatus.RUNNING -> { - troubleshootProgressBar.visibility = View.VISIBLE - troubleshootStatusIcon.visibility = View.INVISIBLE + views.troubleshootProgressBar.visibility = View.VISIBLE + views.troubleshootStatusIcon.visibility = View.INVISIBLE } TroubleshootTest.TestStatus.FAILED -> { - troubleshootProgressBar.visibility = View.INVISIBLE - troubleshootStatusIcon.visibility = View.VISIBLE - troubleshootStatusIcon.setImageResource(R.drawable.unit_test_ko) - troubleshootStatusIcon.imageTintList = null - troubleshootTestDescription.setTextColor(ThemeUtils.getColor(context, R.attr.colorError)) + views.troubleshootProgressBar.visibility = View.INVISIBLE + views.troubleshootStatusIcon.visibility = View.VISIBLE + views.troubleshootStatusIcon.setImageResource(R.drawable.unit_test_ko) + views.troubleshootStatusIcon.imageTintList = null + views.troubleshootTestDescription.setTextColor(ThemeUtils.getColor(context, R.attr.colorError)) } TroubleshootTest.TestStatus.SUCCESS -> { - troubleshootProgressBar.visibility = View.INVISIBLE - troubleshootStatusIcon.visibility = View.VISIBLE - troubleshootStatusIcon.setImageResource(R.drawable.unit_test_ok) + views.troubleshootProgressBar.visibility = View.INVISIBLE + views.troubleshootStatusIcon.visibility = View.VISIBLE + views.troubleshootStatusIcon.setImageResource(R.drawable.unit_test_ok) } } val quickFix = test.quickFix if (quickFix != null) { - troubleshootTestButton.setText(test.quickFix!!.title) - troubleshootTestButton.setOnClickListener { + views.troubleshootTestButton.setText(test.quickFix!!.title) + views.troubleshootTestButton.setOnClickListener { test.quickFix!!.doFix() } - troubleshootTestButton.visibility = View.VISIBLE + views.troubleshootTestButton.visibility = View.VISIBLE } else { - troubleshootTestButton.visibility = View.GONE + views.troubleshootTestButton.visibility = View.GONE } - troubleshootTestTitle.setText(test.titleResId) + views.troubleshootTestTitle.setText(test.titleResId) val description = test.description if (description == null) { - troubleshootTestDescription.visibility = View.GONE + views.troubleshootTestDescription.visibility = View.GONE } else { - troubleshootTestDescription.visibility = View.VISIBLE - troubleshootTestDescription.text = description + views.troubleshootTestDescription.visibility = View.VISIBLE + views.troubleshootTestDescription.text = description } } } diff --git a/vector/src/main/java/im/vector/app/features/share/IncomingShareActivity.kt b/vector/src/main/java/im/vector/app/features/share/IncomingShareActivity.kt index d0b3500258..b9d3b1ba14 100644 --- a/vector/src/main/java/im/vector/app/features/share/IncomingShareActivity.kt +++ b/vector/src/main/java/im/vector/app/features/share/IncomingShareActivity.kt @@ -16,7 +16,7 @@ package im.vector.app.features.share -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import im.vector.app.R import im.vector.app.core.extensions.addFragment import im.vector.app.core.platform.ToolbarConfigurable @@ -35,7 +35,7 @@ class IncomingShareActivity : VectorBaseActivity<ActivitySimpleBinding>(), Toolb } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar, displayBack = false) } } diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutAction.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutAction.kt index d4edd2bc99..14dc19a95c 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutAction.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutAction.kt @@ -25,7 +25,6 @@ sealed class SoftLogoutAction : VectorViewModelAction { // For password entering management data class PasswordChanged(val password: String) : SoftLogoutAction() - object TogglePassword : SoftLogoutAction() data class SignInAgain(val password: String) : SoftLogoutAction() // For signing again with SSO diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt index 86cf6cc884..8aad6e2b77 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt @@ -114,11 +114,9 @@ class SoftLogoutController @Inject constructor( id("passwordForm") stringProvider(host.stringProvider) passwordValue(state.enteredPassword) - passwordShown(state.passwordShown) submitEnabled(state.enteredPassword.isNotEmpty()) onPasswordEdited { host.listener?.passwordEdited(it) } errorText((state.asyncLoginAction as? Fail)?.error?.let { host.errorFormatter.toHumanReadable(it) }) - passwordRevealClickListener { host.listener?.revealPasswordClicked() } forgetPasswordClickListener { host.listener?.forgetPasswordClicked() } submitClickListener { host.listener?.submit() } } @@ -169,6 +167,5 @@ class SoftLogoutController @Inject constructor( fun signinFallbackSubmit() fun clearData() fun forgetPasswordClicked() - fun revealPasswordClicked() } } diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt index 93aba7d932..48cf7b12bc 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt @@ -16,7 +16,6 @@ package im.vector.app.features.signout.soft -import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -25,7 +24,6 @@ import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith import im.vector.app.core.extensions.hideKeyboard @@ -127,7 +125,7 @@ class SoftLogoutFragment @Inject constructor( R.string.soft_logout_clear_data_dialog_content } - MaterialAlertDialogBuilder(requireActivity()) + MaterialAlertDialogBuilder(requireActivity(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setTitle(R.string.soft_logout_clear_data_dialog_title) .setMessage(messageResId) .setNegativeButton(R.string.cancel, null) @@ -135,7 +133,6 @@ class SoftLogoutFragment @Inject constructor( softLogoutViewModel.handle(SoftLogoutAction.ClearData) } .show() - .withColoredButton(DialogInterface.BUTTON_POSITIVE) } } @@ -147,10 +144,6 @@ class SoftLogoutFragment @Inject constructor( loginViewModel.handle(LoginAction.PostViewEvent(LoginViewEvents.OnForgetPasswordClicked)) } - override fun revealPasswordClicked() { - softLogoutViewModel.handle(SoftLogoutAction.TogglePassword) - } - override fun resetViewModel() { // No op } diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt index b310d379c6..f49527bd1d 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt @@ -122,7 +122,6 @@ class SoftLogoutViewModel @AssistedInject constructor( when (action) { is SoftLogoutAction.RetryLoginFlow -> getSupportedLoginFlow() is SoftLogoutAction.PasswordChanged -> handlePasswordChange(action) - is SoftLogoutAction.TogglePassword -> handleTogglePassword() is SoftLogoutAction.SignInAgain -> handleSignInAgain(action) is SoftLogoutAction.WebLoginSuccess -> handleWebLoginSuccess(action) is SoftLogoutAction.ClearData -> handleClearData() @@ -143,16 +142,6 @@ class SoftLogoutViewModel @AssistedInject constructor( } } - private fun handleTogglePassword() { - withState { - setState { - copy( - passwordShown = !this.passwordShown - ) - } - } - } - private fun handleWebLoginSuccess(action: SoftLogoutAction.WebLoginSuccess) { // User may have been connected with SSO with another userId // We have to check this @@ -188,9 +177,7 @@ class SoftLogoutViewModel @AssistedInject constructor( private fun handleSignInAgain(action: SoftLogoutAction.SignInAgain) { setState { copy( - asyncLoginAction = Loading(), - // Ensure password is hidden - passwordShown = false + asyncLoginAction = Loading() ) } viewModelScope.launch { diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewState.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewState.kt index 4872bfff0c..ccc186aba7 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewState.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewState.kt @@ -31,7 +31,6 @@ data class SoftLogoutViewState( val deviceId: String, val userDisplayName: String, val hasUnsavedKeys: Boolean, - val passwordShown: Boolean = false, val enteredPassword: String = "" ) : MvRxState { diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt b/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt index 0deb9d3508..c032da7192 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt @@ -32,20 +32,16 @@ import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.epoxy.addTextChangedListenerOnce import im.vector.app.core.epoxy.onClick import im.vector.app.core.epoxy.setValueOnce -import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.SimpleTextWatcher import im.vector.app.core.resources.StringProvider -import im.vector.app.core.ui.views.RevealPasswordImageView @EpoxyModelClass(layout = R.layout.item_login_password_form) abstract class LoginPasswordFormItem : VectorEpoxyModel<LoginPasswordFormItem.Holder>() { @EpoxyAttribute var passwordValue: String = "" - @EpoxyAttribute var passwordShown: Boolean = false @EpoxyAttribute var submitEnabled: Boolean = false @EpoxyAttribute var errorText: String? = null @EpoxyAttribute lateinit var stringProvider: StringProvider - @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var passwordRevealClickListener: ClickListener? = null @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var forgetPasswordClickListener: ClickListener? = null @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var submitClickListener: ClickListener? = null @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var onPasswordEdited: TextListener? = null @@ -61,8 +57,6 @@ abstract class LoginPasswordFormItem : VectorEpoxyModel<LoginPasswordFormItem.Ho setupAutoFill(holder) holder.passwordFieldTil.error = errorText - renderPasswordField(holder) - holder.passwordReveal.onClick(passwordRevealClickListener) holder.forgetPassword.onClick(forgetPasswordClickListener) holder.submit.isEnabled = submitEnabled holder.submit.onClick(submitClickListener) @@ -81,15 +75,9 @@ abstract class LoginPasswordFormItem : VectorEpoxyModel<LoginPasswordFormItem.Ho } } - private fun renderPasswordField(holder: Holder) { - holder.passwordField.showPassword(passwordShown) - holder.passwordReveal.render(passwordShown) - } - class Holder : VectorEpoxyHolder() { val passwordField by bind<TextInputEditText>(R.id.itemLoginPasswordFormPasswordField) val passwordFieldTil by bind<TextInputLayout>(R.id.itemLoginPasswordFormPasswordFieldTil) - val passwordReveal by bind<RevealPasswordImageView>(R.id.itemLoginPasswordFormPasswordReveal) val forgetPassword by bind<Button>(R.id.itemLoginPasswordFormForgetPasswordButton) val submit by bind<Button>(R.id.itemLoginPasswordFormSubmit) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt index 57c6b40404..a02755a155 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt @@ -53,16 +53,15 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (isFirstCreation()) { when (withState(viewModel) { it.step }) { - CreateSpaceState.Step.ChooseType -> { + CreateSpaceState.Step.ChooseType -> { navigateToFragment(ChooseSpaceTypeFragment::class.java) } - CreateSpaceState.Step.SetDetails -> { + CreateSpaceState.Step.SetDetails -> { navigateToFragment(ChooseSpaceTypeFragment::class.java) } - CreateSpaceState.Step.AddRooms -> { + CreateSpaceState.Step.AddRooms -> { navigateToFragment(CreateSpaceDefaultRoomsFragment::class.java) } CreateSpaceState.Step.ChoosePrivateType -> { @@ -81,29 +80,29 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac viewModel.observeViewEvents { when (it) { - CreateSpaceEvents.NavigateToDetails -> { + CreateSpaceEvents.NavigateToDetails -> { navigateToFragment(CreateSpaceDetailsFragment::class.java) } - CreateSpaceEvents.NavigateToChooseType -> { + CreateSpaceEvents.NavigateToChooseType -> { navigateToFragment(ChooseSpaceTypeFragment::class.java) } - CreateSpaceEvents.Dismiss -> { + CreateSpaceEvents.Dismiss -> { finish() } - CreateSpaceEvents.NavigateToAddRooms -> { + CreateSpaceEvents.NavigateToAddRooms -> { navigateToFragment(CreateSpaceDefaultRoomsFragment::class.java) } CreateSpaceEvents.NavigateToChoosePrivateType -> { navigateToFragment(ChoosePrivateSpaceTypeFragment::class.java) } - is CreateSpaceEvents.ShowModalError -> { + is CreateSpaceEvents.ShowModalError -> { hideWaitingView() MaterialAlertDialogBuilder(this) .setMessage(it.errorMessage) .setPositiveButton(getString(R.string.ok), null) .show() } - is CreateSpaceEvents.FinishSuccess -> { + is CreateSpaceEvents.FinishSuccess -> { setResult(RESULT_OK, Intent().apply { putExtra(RESULT_DATA_CREATED_SPACE_ID, it.spaceId) putExtra(RESULT_DATA_DEFAULT_ROOM_ID, it.defaultRoomId) @@ -111,9 +110,12 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac }) finish() } - CreateSpaceEvents.HideModalLoading -> { + CreateSpaceEvents.HideModalLoading -> { hideWaitingView() } + is CreateSpaceEvents.ShowModalLoading -> { + showWaitingView(it.message) + } } } } @@ -135,9 +137,9 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac private fun renderState(state: CreateSpaceState) { val titleRes = when (state.step) { - CreateSpaceState.Step.ChooseType -> R.string.activity_create_space_title + CreateSpaceState.Step.ChooseType -> R.string.activity_create_space_title CreateSpaceState.Step.SetDetails, - CreateSpaceState.Step.AddRooms -> { + CreateSpaceState.Step.AddRooms -> { if (state.spaceType == SpaceType.Public) R.string.your_public_space else R.string.your_private_space } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListAction.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListAction.kt index b8b6cb4667..12d4b40f42 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListAction.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListAction.kt @@ -26,6 +26,9 @@ sealed class SpaceListAction : VectorViewModelAction { data class LeaveSpace(val spaceSummary: RoomSummary) : SpaceListAction() data class ToggleExpand(val spaceSummary: RoomSummary) : SpaceListAction() object AddSpace : SpaceListAction() + data class MoveSpace(val spaceId: String, val delta : Int) : SpaceListAction() + data class OnStartDragging(val spaceId: String, val expanded: Boolean) : SpaceListAction() + data class OnEndDragging(val spaceId: String, val expanded: Boolean) : SpaceListAction() data class SelectLegacyGroup(val groupSummary: GroupSummary?) : SpaceListAction() } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt index f50ba90221..0a67977e6c 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt @@ -17,9 +17,11 @@ package im.vector.app.features.spaces import android.os.Bundle +import android.view.HapticFeedbackConstants import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import com.airbnb.epoxy.EpoxyTouchHelper import com.airbnb.mvrx.Incomplete import com.airbnb.mvrx.Success import com.airbnb.mvrx.fragmentViewModel @@ -54,6 +56,53 @@ class SpaceListFragment @Inject constructor( spaceController.callback = this views.stateView.contentView = views.groupListView views.groupListView.configureWith(spaceController) + EpoxyTouchHelper.initDragging(spaceController) + .withRecyclerView(views.groupListView) + .forVerticalList() + .withTarget(SpaceSummaryItem::class.java) + .andCallbacks(object : EpoxyTouchHelper.DragCallbacks<SpaceSummaryItem>() { + var toPositionM: Int? = null + var fromPositionM: Int? = null + var initialElevation: Float? = null + + override fun onDragStarted(model: SpaceSummaryItem?, itemView: View?, adapterPosition: Int) { + toPositionM = null + fromPositionM = null + model?.matrixItem?.id?.let { + viewModel.handle(SpaceListAction.OnStartDragging(it, model.expanded)) + } + itemView?.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) + initialElevation = itemView?.elevation + itemView?.elevation = 6f + } + + override fun onDragReleased(model: SpaceSummaryItem?, itemView: View?) { +// Timber.v("VAL: onModelMoved from $fromPositionM to $toPositionM ${model?.matrixItem?.getBestName()}") + if (toPositionM == null || fromPositionM == null) return + val movingSpace = model?.matrixItem?.id ?: return + viewModel.handle(SpaceListAction.MoveSpace(movingSpace, toPositionM!! - fromPositionM!!)) + } + + override fun clearView(model: SpaceSummaryItem?, itemView: View?) { +// Timber.v("VAL: clearView ${model?.matrixItem?.getBestName()}") + itemView?.elevation = initialElevation ?: 0f + } + + override fun onModelMoved(fromPosition: Int, toPosition: Int, modelBeingMoved: SpaceSummaryItem?, itemView: View?) { +// Timber.v("VAL: onModelMoved incremental from $fromPosition to $toPosition ${modelBeingMoved?.matrixItem?.getBestName()}") + if (fromPositionM == null) { + fromPositionM = fromPosition + } + toPositionM = toPosition + itemView?.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) + } + + override fun isDragEnabledForModel(model: SpaceSummaryItem?): Boolean { +// Timber.v("VAL: isDragEnabledForModel ${model?.matrixItem?.getBestName()}") + return model?.canDrag == true + } + }) + viewModel.observeViewEvents { when (it) { is SpaceListViewEvents.OpenSpaceSummary -> sharedActionViewModel.post(HomeActivitySharedAction.OpenSpacePreview(it.id)) @@ -74,7 +123,7 @@ class SpaceListFragment @Inject constructor( override fun invalidate() = withState(viewModel) { state -> when (state.asyncSpaces) { is Incomplete -> views.stateView.state = StateView.State.Loading - is Success -> views.stateView.state = StateView.State.Content + is Success -> views.stateView.state = StateView.State.Content } spaceController.update(state) } @@ -86,6 +135,7 @@ class SpaceListFragment @Inject constructor( override fun onSpaceInviteSelected(spaceSummary: RoomSummary) { viewModel.handle(SpaceListAction.OpenSpaceInvite(spaceSummary)) } + override fun onSpaceSettings(spaceSummary: RoomSummary) { sharedActionViewModel.post(HomeActivitySharedAction.ShowSpaceSettings(spaceSummary.roomId)) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewState.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewState.kt index b57a5d364b..7482f4881e 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewState.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewState.kt @@ -29,7 +29,9 @@ data class SpaceListViewState( val myMxItem : Async<MatrixItem.UserItem> = Uninitialized, val asyncSpaces: Async<List<RoomSummary>> = Uninitialized, val selectedGroupingMethod: RoomGroupingMethod = RoomGroupingMethod.BySpace(null), - val rootSpaces: List<RoomSummary>? = null, + val rootSpacesOrdered: List<RoomSummary>? = null, + val spaceOrderInfo: Map<String, String?>? = null, + val spaceOrderLocalEchos: Map<String, String?>? = null, val legacyGroups: List<GroupSummary>? = null, val expandedStates: Map<String, Boolean> = emptyMap(), val homeAggregateCount : RoomAggregateNotificationCount = RoomAggregateNotificationCount(0, 0) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt index 487f4406a3..37c5088123 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt @@ -16,7 +16,6 @@ package im.vector.app.features.spaces -import android.content.DialogInterface import android.os.Bundle import android.os.Parcelable import android.view.LayoutInflater @@ -28,7 +27,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.di.ScreenComponent -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment import im.vector.app.core.resources.ColorProvider @@ -128,7 +126,7 @@ class SpaceSettingsMenuBottomSheet : VectorBaseBottomSheetDialogFragment<BottomS isLastAdmin = isAdmin && otherAdminCount == 0 }.disposeOnDestroyView() - views.spaceBetaTag.setOnClickListener { + views.spaceBetaTag.debouncedClicks { bugReporter.openBugReportScreen(requireActivity(), ReportType.SPACE_BETA_FEEDBACK) } @@ -174,7 +172,7 @@ class SpaceSettingsMenuBottomSheet : VectorBaseBottomSheetDialogFragment<BottomS null } - MaterialAlertDialogBuilder(requireContext()) + MaterialAlertDialogBuilder(requireContext(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setMessage(warningMessage) .setTitle(getString(R.string.space_leave_prompt_msg)) .setPositiveButton(R.string.leave) { _, _ -> @@ -189,7 +187,6 @@ class SpaceSettingsMenuBottomSheet : VectorBaseBottomSheetDialogFragment<BottomS } .setNegativeButton(R.string.cancel, null) .show() - .withColoredButton(DialogInterface.BUTTON_POSITIVE) } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryController.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryController.kt index 78eb232cf6..828308007b 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryController.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryController.kt @@ -62,7 +62,7 @@ class SpaceSummaryController @Inject constructor( buildGroupModels( nonNullViewState.asyncSpaces(), nonNullViewState.selectedGroupingMethod, - nonNullViewState.rootSpaces, + nonNullViewState.rootSpacesOrdered, nonNullViewState.expandedStates, nonNullViewState.homeAggregateCount) @@ -127,6 +127,7 @@ class SpaceSummaryController @Inject constructor( countState(UnreadCounterBadgeView.State(1, true)) selected(false) description(host.stringProvider.getString(R.string.you_are_invited)) + canDrag(false) listener { host.callback?.onSpaceInviteSelected(roomSummary) } } } @@ -139,7 +140,6 @@ class SpaceSummaryController @Inject constructor( } rootSpaces - ?.sortedBy { it.roomId } ?.forEach { groupSummary -> val isSelected = selected is RoomGroupingMethod.BySpace && groupSummary.roomId == selected.space()?.roomId // does it have children? @@ -154,8 +154,12 @@ class SpaceSummaryController @Inject constructor( id(groupSummary.roomId) hasChildren(hasChildren) expanded(expanded) + // to debug order + // matrixItem(groupSummary.copy(displayName = "${groupSummary.displayName} / ${spaceOrderInfo?.get(groupSummary.roomId)}") + // .toMatrixItem()) matrixItem(groupSummary.toMatrixItem()) selected(isSelected) + canDrag(true) onMore { host.callback?.onSpaceSettings(groupSummary) } listener { host.callback?.onSpaceSelected(groupSummary) } toggleExpand { host.callback?.onToggleExpand(groupSummary) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryItem.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryItem.kt index a7432571ed..6cffabd851 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryItem.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryItem.kt @@ -51,6 +51,7 @@ abstract class SpaceSummaryItem : VectorEpoxyModel<SpaceSummaryItem.Holder>() { @EpoxyAttribute var countState: UnreadCounterBadgeView.State = UnreadCounterBadgeView.State(0, false) @EpoxyAttribute var description: String? = null @EpoxyAttribute var showSeparator: Boolean = false + @EpoxyAttribute var canDrag: Boolean = true override fun bind(holder: Holder) { super.bind(holder) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpacesListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpacesListViewModel.kt index d7d7af4ca5..400a658d1b 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpacesListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpacesListViewModel.kt @@ -28,23 +28,31 @@ import dagger.assisted.AssistedInject import im.vector.app.AppStateHandler import im.vector.app.RoomGroupingMethod import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.invite.AutoAcceptInvites +import im.vector.app.features.session.coroutineScope import im.vector.app.features.settings.VectorPreferences import im.vector.app.group import im.vector.app.space import io.reactivex.Observable -import io.reactivex.functions.BiFunction import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.query.ActiveSpaceFilter import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.events.model.toContent +import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.group.groupSummaryQueryParams import org.matrix.android.sdk.api.session.room.RoomSortOrder +import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataEvent +import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataTypes import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount +import org.matrix.android.sdk.api.session.space.SpaceOrderUtils +import org.matrix.android.sdk.api.session.space.model.SpaceOrderContent +import org.matrix.android.sdk.api.session.space.model.TopLevelSpaceComparator import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.rx.asObservable @@ -54,7 +62,8 @@ import java.util.concurrent.TimeUnit class SpacesListViewModel @AssistedInject constructor(@Assisted initialState: SpaceListViewState, private val appStateHandler: AppStateHandler, private val session: Session, - private val vectorPreferences: VectorPreferences + private val vectorPreferences: VectorPreferences, + private val autoAcceptInvites: AutoAcceptInvites ) : VectorViewModel<SpaceListViewState, SpaceListAction, SpaceListViewEvents>(initialState) { @AssistedFactory @@ -119,10 +128,13 @@ class SpacesListViewModel @AssistedInject constructor(@Assisted initialState: Sp .throttleFirst(300, TimeUnit.MILLISECONDS) .observeOn(Schedulers.computation()) .subscribe { - val inviteCount = session.getRoomSummaries( - roomSummaryQueryParams { this.memberships = listOf(Membership.INVITE) } - ).size - + val inviteCount = if (autoAcceptInvites.hideInvites) { + 0 + } else { + session.getRoomSummaries( + roomSummaryQueryParams { this.memberships = listOf(Membership.INVITE) } + ).size + } val totalCount = session.getNotificationCountForRooms( roomSummaryQueryParams { this.memberships = listOf(Membership.JOIN) @@ -143,37 +155,86 @@ class SpacesListViewModel @AssistedInject constructor(@Assisted initialState: Sp }.disposeOnClear() } -// private fun observeSelectionState() { -// selectSubscribe(SpaceListViewState::selectedSpace) { spaceSummary -> -// if (spaceSummary != null) { -// // We only want to open group if the updated selectedGroup is a different one. -// if (currentGroupId != spaceSummary.roomId) { -// currentGroupId = spaceSummary.roomId -// _viewEvents.post(SpaceListViewEvents.OpenSpace) -// } -// appStateHandler.setCurrentSpace(spaceSummary.roomId) -// } else { -// // If selected group is null we force to default. It can happens when leaving the selected group. -// setState { -// copy(selectedSpace = this.asyncSpaces()?.find { it.roomId == ALL_COMMUNITIES_GROUP_ID }) -// } -// } -// } -// } - override fun handle(action: SpaceListAction) { when (action) { - is SpaceListAction.SelectSpace -> handleSelectSpace(action) - is SpaceListAction.LeaveSpace -> handleLeaveSpace(action) - SpaceListAction.AddSpace -> handleAddSpace() - is SpaceListAction.ToggleExpand -> handleToggleExpand(action) - is SpaceListAction.OpenSpaceInvite -> handleSelectSpaceInvite(action) + is SpaceListAction.SelectSpace -> handleSelectSpace(action) + is SpaceListAction.LeaveSpace -> handleLeaveSpace(action) + SpaceListAction.AddSpace -> handleAddSpace() + is SpaceListAction.ToggleExpand -> handleToggleExpand(action) + is SpaceListAction.OpenSpaceInvite -> handleSelectSpaceInvite(action) is SpaceListAction.SelectLegacyGroup -> handleSelectGroup(action) + is SpaceListAction.MoveSpace -> handleMoveSpace(action) + is SpaceListAction.OnEndDragging -> handleEndDragging() + is SpaceListAction.OnStartDragging -> handleStartDragging() } } // PRIVATE METHODS ***************************************************************************** + var preDragExpandedState: Map<String, Boolean>? = null + private fun handleStartDragging() = withState { state -> + preDragExpandedState = state.expandedStates.toMap() + setState { + copy( + expandedStates = expandedStates.map { + it.key to false + }.toMap() + ) + } + } + + private fun handleEndDragging() { + // restore expanded state + setState { + copy( + expandedStates = preDragExpandedState.orEmpty() + ) + } + } + + private fun handleMoveSpace(action: SpaceListAction.MoveSpace) = withState { state -> + state.rootSpacesOrdered ?: return@withState + val orderCommands = SpaceOrderUtils.orderCommandsForMove( + state.rootSpacesOrdered.map { + it.roomId to (state.spaceOrderLocalEchos?.get(it.roomId) ?: state.spaceOrderInfo?.get(it.roomId)) + }, + action.spaceId, + action.delta + ) + + // local echo + val updatedLocalEchos = state.spaceOrderLocalEchos.orEmpty().toMutableMap().apply { + orderCommands.forEach { + this[it.spaceId] = it.order + } + }.toMap() + + setState { + copy( + rootSpacesOrdered = state.rootSpacesOrdered.toMutableList().apply { + val index = indexOfFirst { it.roomId == action.spaceId } + val moved = removeAt(index) + add(index + action.delta, moved) + }, + spaceOrderLocalEchos = updatedLocalEchos + ) + } + session.coroutineScope.launch { + orderCommands.forEach { + session.getRoom(it.spaceId)?.updateAccountData(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER, + SpaceOrderContent(order = it.order).toContent() + ) + } + } + + // restore expanded state + setState { + copy( + expandedStates = preDragExpandedState.orEmpty() + ) + } + } + private fun handleSelectSpace(action: SpaceListAction.SelectSpace) = withState { state -> val groupingMethod = state.selectedGroupingMethod if (groupingMethod is RoomGroupingMethod.ByLegacyGroup || groupingMethod.space()?.roomId != action.spaceSummary?.roomId) { @@ -224,24 +285,43 @@ class SpacesListViewModel @AssistedInject constructor(@Assisted initialState: Sp excludeType = listOf(/**RoomType.MESSAGING,$*/ null) } - Observable.combineLatest<User?, List<RoomSummary>, List<RoomSummary>>( - session - .rx() + + val rxSession = session.rx() + + Observable.combineLatest<User?, List<RoomSummary>, List<RoomAccountDataEvent>, List<RoomSummary>>( + rxSession .liveUser(session.myUserId) .map { it.getOrNull() }, - session - .rx() + rxSession .liveSpaceSummaries(spaceSummaryQueryParams), - BiFunction { _, communityGroups -> + session.accountDataService().getLiveRoomAccountDataEvents(setOf(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER)).asObservable(), + { _, communityGroups, _ -> communityGroups } ) .execute { async -> + val rootSpaces = session.spaceService().getRootSpaceSummaries() + val orders = rootSpaces.map { + it.roomId to session.getRoom(it.roomId) + ?.getAccountDataEvent(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER) + ?.content.toModel<SpaceOrderContent>() + ?.safeOrder() + }.toMap() copy( asyncSpaces = async, - rootSpaces = session.spaceService().getRootSpaceSummaries() + rootSpacesOrdered = rootSpaces.sortedWith(TopLevelSpaceComparator(orders)), + spaceOrderInfo = orders + ) + } + + // clear local echos on update + session.accountDataService() + .getLiveRoomAccountDataEvents(setOf(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER)) + .asObservable().execute { + copy( + spaceOrderLocalEchos = emptyMap() ) } } diff --git a/vector/src/main/java/im/vector/app/features/call/DialerChoiceBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt similarity index 58% rename from vector/src/main/java/im/vector/app/features/call/DialerChoiceBottomSheet.kt rename to vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt index 401b3e23d7..fc3d98e6b8 100644 --- a/vector/src/main/java/im/vector/app/features/call/DialerChoiceBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt @@ -14,33 +14,33 @@ * limitations under the License. */ -package im.vector.app.features.call +package im.vector.app.features.spaces.create import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.setFragmentResult import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment -import im.vector.app.databinding.BottomSheetCallDialerChoiceBinding +import im.vector.app.databinding.BottomSheetSpaceCreatePrivateWarningBinding -class DialerChoiceBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetCallDialerChoiceBinding>() { - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetCallDialerChoiceBinding { - return BottomSheetCallDialerChoiceBinding.inflate(inflater, container, false) - } +class BetaWarningBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetSpaceCreatePrivateWarningBinding>() { - var onDialPadClicked: (() -> Unit)? = null - var onVoiceCallClicked: (() -> Unit)? = null + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = + BottomSheetSpaceCreatePrivateWarningBinding.inflate(inflater, container, false) + + override val showExpanded = true override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - views.dialerChoiceDialPad.views.bottomSheetActionClickableZone.debouncedClicks { - onDialPadClicked?.invoke() - dismiss() - } - views.dialerChoiceVoiceCall.views.bottomSheetActionClickableZone.debouncedClicks { - onVoiceCallClicked?.invoke() + views.continueButton.debouncedClicks { + setFragmentResult(REQUEST_KEY, Bundle.EMPTY) dismiss() } } + + companion object { + const val REQUEST_KEY = "BetaWarningBottomSheet" + } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt index 4f079551eb..4031b56c1d 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt @@ -20,6 +20,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.setFragmentResultListener import com.airbnb.mvrx.activityViewModel import im.vector.app.R import im.vector.app.core.epoxy.onClick @@ -38,6 +39,13 @@ class ChoosePrivateSpaceTypeFragment @Inject constructor( override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = FragmentSpaceCreateChoosePrivateModelBinding.inflate(layoutInflater, container, false) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setFragmentResultListener(BetaWarningBottomSheet.REQUEST_KEY) { _, _ -> + sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates)) + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -46,7 +54,7 @@ class ChoosePrivateSpaceTypeFragment @Inject constructor( } views.teammatesButton.onClick { - sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates)) + BetaWarningBottomSheet().show(parentFragmentManager, "warning") } sharedViewModel.subscribe { state -> diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAction.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAction.kt index cd31b40354..1f0ed6428f 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAction.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAction.kt @@ -23,6 +23,7 @@ sealed class CreateSpaceAction : VectorViewModelAction { data class SetRoomType(val type: SpaceType) : CreateSpaceAction() data class NameChanged(val name: String) : CreateSpaceAction() data class TopicChanged(val topic: String) : CreateSpaceAction() + data class SpaceAliasChanged(val aliasLocalPart: String) : CreateSpaceAction() data class SetAvatar(val uri: Uri?) : CreateSpaceAction() object OnBackPressed : CreateSpaceAction() object NextFromDetails : CreateSpaceAction() diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceDetailsFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceDetailsFragment.kt index b5925eec59..544c33948b 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceDetailsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceDetailsFragment.kt @@ -84,6 +84,10 @@ class CreateSpaceDetailsFragment @Inject constructor( sharedViewModel.handle(CreateSpaceAction.TopicChanged(newTopic)) } + override fun setAliasLocalPart(aliasLocalPart: String) { + sharedViewModel.handle(CreateSpaceAction.SpaceAliasChanged(aliasLocalPart)) + } + override fun onBackPressed(toolbarButton: Boolean): Boolean { sharedViewModel.handle(CreateSpaceAction.OnBackPressed) return true diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt index c3fa2b2068..073531353f 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt @@ -27,4 +27,5 @@ sealed class CreateSpaceEvents : VectorViewEvents { data class FinishSuccess(val spaceId: String, val defaultRoomId: String?, val topology: SpaceTopology?) : CreateSpaceEvents() data class ShowModalError(val errorMessage: String) : CreateSpaceEvents() object HideModalLoading : CreateSpaceEvents() + data class ShowModalLoading(val message: String?) : CreateSpaceEvents() } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceState.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceState.kt index 147fd3a616..39a69e837b 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceState.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceState.kt @@ -28,6 +28,10 @@ data class CreateSpaceState( val step: Step = Step.ChooseType, val spaceType: SpaceType? = null, val spaceTopology: SpaceTopology? = null, + val homeServerName: String? = null, + val aliasLocalPart: String? = null, + val aliasManuallyModified: Boolean = false, + val aliasVerificationTask: Async<Boolean> = Uninitialized, val nameInlineError: String? = null, val defaultRooms: Map<Int /** position in form */, String?>? = null, val creationResult: Async<String> = Uninitialized diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt index 9881232f4d..60110b7dd5 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt @@ -35,14 +35,27 @@ import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.MatrixPatterns +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.room.AliasAvailabilityResult +import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure class CreateSpaceViewModel @AssistedInject constructor( @Assisted initialState: CreateSpaceState, + private val session: Session, private val stringProvider: StringProvider, private val createSpaceViewModelTask: CreateSpaceViewModelTask, private val errorFormatter: ErrorFormatter ) : VectorViewModel<CreateSpaceState, CreateSpaceAction, CreateSpaceEvents>(initialState) { + init { + setState { + copy( + homeServerName = session.myUserId.substringAfter(":") + ) + } + } + @AssistedFactory interface Factory { fun create(initialState: CreateSpaceState): CreateSpaceViewModel @@ -70,7 +83,7 @@ class CreateSpaceViewModel @AssistedInject constructor( override fun handle(action: CreateSpaceAction) { when (action) { - is CreateSpaceAction.SetRoomType -> { + is CreateSpaceAction.SetRoomType -> { setState { copy( step = CreateSpaceState.Step.SetDetails, @@ -79,28 +92,51 @@ class CreateSpaceViewModel @AssistedInject constructor( } _viewEvents.post(CreateSpaceEvents.NavigateToDetails) } - is CreateSpaceAction.NameChanged -> { + is CreateSpaceAction.NameChanged -> { setState { - copy( - nameInlineError = null, - name = action.name - ) + if (aliasManuallyModified) { + copy( + nameInlineError = null, + name = action.name, + aliasVerificationTask = Uninitialized + ) + } else { + val tentativeAlias = + MatrixPatterns.candidateAliasFromRoomName(action.name) + copy( + nameInlineError = null, + name = action.name, + aliasLocalPart = tentativeAlias, + aliasVerificationTask = Uninitialized + ) + } } } - is CreateSpaceAction.TopicChanged -> { + is CreateSpaceAction.TopicChanged -> { setState { copy( topic = action.topic ) } } - CreateSpaceAction.OnBackPressed -> { + is CreateSpaceAction.SpaceAliasChanged -> { + // This called only when the alias is change manually + // not when programmatically changed via a change on name + setState { + copy( + aliasManuallyModified = true, + aliasLocalPart = action.aliasLocalPart, + aliasVerificationTask = Uninitialized + ) + } + } + CreateSpaceAction.OnBackPressed -> { handleBackNavigation() } - CreateSpaceAction.NextFromDetails -> { + CreateSpaceAction.NextFromDetails -> { handleNextFromDetails() } - CreateSpaceAction.NextFromDefaultRooms -> { + CreateSpaceAction.NextFromDefaultRooms -> { handleNextFromDefaultRooms() } is CreateSpaceAction.DefaultRoomNameChanged -> { @@ -112,10 +148,10 @@ class CreateSpaceViewModel @AssistedInject constructor( ) } } - is CreateSpaceAction.SetAvatar -> { + is CreateSpaceAction.SetAvatar -> { setState { copy(avatarUri = action.uri) } } - is CreateSpaceAction.SetSpaceTopology -> { + is CreateSpaceAction.SetSpaceTopology -> { handleSetTopology(action) } }.exhaustive @@ -123,7 +159,7 @@ class CreateSpaceViewModel @AssistedInject constructor( private fun handleSetTopology(action: CreateSpaceAction.SetSpaceTopology) { when (action.topology) { - SpaceTopology.JustMe -> { + SpaceTopology.JustMe -> { setState { copy( spaceTopology = SpaceTopology.JustMe, @@ -146,10 +182,10 @@ class CreateSpaceViewModel @AssistedInject constructor( private fun handleBackNavigation() = withState { state -> when (state.step) { - CreateSpaceState.Step.ChooseType -> { + CreateSpaceState.Step.ChooseType -> { _viewEvents.post(CreateSpaceEvents.Dismiss) } - CreateSpaceState.Step.SetDetails -> { + CreateSpaceState.Step.SetDetails -> { setState { copy( step = CreateSpaceState.Step.ChooseType, @@ -159,7 +195,7 @@ class CreateSpaceViewModel @AssistedInject constructor( } _viewEvents.post(CreateSpaceEvents.NavigateToChooseType) } - CreateSpaceState.Step.AddRooms -> { + CreateSpaceState.Step.AddRooms -> { if (state.spaceType == SpaceType.Private && state.spaceTopology == SpaceTopology.MeAndTeammates) { setState { copy( @@ -204,12 +240,38 @@ class CreateSpaceViewModel @AssistedInject constructor( } _viewEvents.post(CreateSpaceEvents.NavigateToChoosePrivateType) } else { + // it'a public space, let's check alias + val aliasLocalPart = state.aliasLocalPart + _viewEvents.post(CreateSpaceEvents.ShowModalLoading(null)) setState { - copy( - step = CreateSpaceState.Step.AddRooms - ) + copy(aliasVerificationTask = Loading()) + } + viewModelScope.launch { + try { + when (val result = session.checkAliasAvailability(aliasLocalPart)) { + AliasAvailabilityResult.Available -> { + setState { + copy( + step = CreateSpaceState.Step.AddRooms + ) + } + _viewEvents.post(CreateSpaceEvents.HideModalLoading) + _viewEvents.post(CreateSpaceEvents.NavigateToAddRooms) + } + is AliasAvailabilityResult.NotAvailable -> { + setState { + copy(aliasVerificationTask = Fail(result.roomAliasError)) + } + _viewEvents.post(CreateSpaceEvents.HideModalLoading) + } + } + } catch (failure: Throwable) { + setState { + copy(aliasVerificationTask = Fail(failure)) + } + _viewEvents.post(CreateSpaceEvents.HideModalLoading) + } } - _viewEvents.post(CreateSpaceEvents.NavigateToAddRooms) } } } @@ -221,6 +283,9 @@ class CreateSpaceViewModel @AssistedInject constructor( } viewModelScope.launch(Dispatchers.IO) { try { + val alias = if (state.spaceType == SpaceType.Public) { + state.aliasLocalPart + } else null val result = createSpaceViewModelTask.execute( CreateSpaceTaskParams( spaceName = spaceName, @@ -230,11 +295,12 @@ class CreateSpaceViewModel @AssistedInject constructor( defaultRooms = state.defaultRooms ?.entries ?.sortedBy { it.key } - ?.mapNotNull { it.value } ?: emptyList() + ?.mapNotNull { it.value } ?: emptyList(), + spaceAlias = alias ) ) when (result) { - is CreateSpaceTaskResult.Success -> { + is CreateSpaceTaskResult.Success -> { setState { copy(creationResult = Success(result.spaceId)) } @@ -246,7 +312,7 @@ class CreateSpaceViewModel @AssistedInject constructor( ) ) } - is CreateSpaceTaskResult.PartialSuccess -> { + is CreateSpaceTaskResult.PartialSuccess -> { // XXX what can we do here? setState { copy(creationResult = Success(result.spaceId)) @@ -260,10 +326,22 @@ class CreateSpaceViewModel @AssistedInject constructor( ) } is CreateSpaceTaskResult.FailedToCreateSpace -> { - setState { - copy(creationResult = Fail(result.failure)) + if (result.failure is CreateRoomFailure.AliasError) { + setState { + copy( + step = CreateSpaceState.Step.SetDetails, + aliasVerificationTask = Fail(result.failure.aliasError), + creationResult = Uninitialized + ) + } + _viewEvents.post(CreateSpaceEvents.HideModalLoading) + _viewEvents.post(CreateSpaceEvents.NavigateToDetails) + } else { + setState { + copy(creationResult = Fail(result.failure)) + } + _viewEvents.post(CreateSpaceEvents.ShowModalError(errorFormatter.toHumanReadable(result.failure))) } - _viewEvents.post(CreateSpaceEvents.ShowModalError(errorFormatter.toHumanReadable(result.failure))) } } } catch (failure: Throwable) { diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt index 9ce1089f6c..f1731caf76 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt @@ -45,6 +45,7 @@ data class CreateSpaceTaskParams( val spaceName: String, val spaceTopic: String?, val spaceAvatar: Uri? = null, + val spaceAlias: String? = null, val isPublic: Boolean, val defaultRooms: List<String> = emptyList() ) @@ -57,7 +58,13 @@ class CreateSpaceViewModelTask @Inject constructor( override suspend fun execute(params: CreateSpaceTaskParams): CreateSpaceTaskResult { val spaceID = try { - session.spaceService().createSpace(params.spaceName, params.spaceTopic, params.spaceAvatar, params.isPublic) + session.spaceService().createSpace( + params.spaceName, + params.spaceTopic, + params.spaceAvatar, + params.isPublic, + params.spaceAlias + ) } catch (failure: Throwable) { return CreateSpaceTaskResult.FailedToCreateSpace(failure) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/SpaceDetailEpoxyController.kt b/vector/src/main/java/im/vector/app/features/spaces/create/SpaceDetailEpoxyController.kt index 9b3686c513..27c08d1f6f 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/SpaceDetailEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/SpaceDetailEpoxyController.kt @@ -17,24 +17,39 @@ package im.vector.app.features.spaces.create import com.airbnb.epoxy.TypedEpoxyController +import com.airbnb.mvrx.Fail import im.vector.app.R +import im.vector.app.core.epoxy.TextListener import im.vector.app.core.resources.StringProvider import im.vector.app.core.ui.list.genericFooterItem import im.vector.app.features.form.formEditTextItem import im.vector.app.features.form.formEditableSquareAvatarItem import im.vector.app.features.form.formMultiLineEditTextItem import im.vector.app.features.home.AvatarRenderer +import im.vector.app.features.roomdirectory.createroom.RoomAliasErrorFormatter +import org.matrix.android.sdk.api.session.room.alias.RoomAliasError import org.matrix.android.sdk.api.util.MatrixItem import javax.inject.Inject class SpaceDetailEpoxyController @Inject constructor( private val stringProvider: StringProvider, - private val avatarRenderer: AvatarRenderer + private val avatarRenderer: AvatarRenderer, + private val roomAliasErrorFormatter: RoomAliasErrorFormatter ) : TypedEpoxyController<CreateSpaceState>() { var listener: Listener? = null -// var shouldForceFocusOnce = true + /** + * Alias text can be automatically set when changing the room name, + * We have to be able to make a difference between a programming change versus + * a user change. + */ + var aliasTextIsFocused = false + private val aliasTextWatcher: TextListener = { + if (aliasTextIsFocused) { + listener?.setAliasLocalPart(it) + } + } override fun buildModels(data: CreateSpaceState?) { val host = this @@ -65,20 +80,31 @@ class SpaceDetailEpoxyController @Inject constructor( value(data?.name) hint(host.stringProvider.getString(R.string.create_room_name_hint)) errorMessage(data?.nameInlineError) -// onBind { _, view, _ -> -// if (shouldForceFocusOnce && data?.name.isNullOrBlank()) { -// shouldForceFocusOnce = false -// // sad face :( -// view.textInputEditText.post { -// view.textInputEditText.showKeyboard(true) -// } -// } -// } onTextChange { text -> host.listener?.onNameChange(text) } } + if (data?.spaceType == SpaceType.Public) { + formEditTextItem { + id("alias") + enabled(true) + forceUpdateValue(!data.aliasManuallyModified) + value(data.aliasLocalPart) + hint(host.stringProvider.getString(R.string.create_space_alias_hint)) + suffixText(":" + data.homeServerName) + prefixText("#") + onFocusChange { hasFocus -> + host.aliasTextIsFocused = hasFocus + } + errorMessage( + host.roomAliasErrorFormatter.format( + (((data.aliasVerificationTask as? Fail)?.error) as? RoomAliasError)) + ) + onTextChange(host.aliasTextWatcher) + } + } + formMultiLineEditTextItem { id("topic") enabled(true) @@ -96,5 +122,6 @@ class SpaceDetailEpoxyController @Inject constructor( fun onAvatarChange() fun onNameChange(newName: String) fun onTopicChange(newTopic: String) + fun setAliasLocalPart(aliasLocalPart: String) } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryController.kt b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryController.kt index 34bb50b871..1e67da7a4d 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryController.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryController.kt @@ -35,6 +35,7 @@ import im.vector.app.features.home.room.list.spaceChildInfoItem import me.gujun.android.span.span import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.failure.MatrixError.Companion.M_UNRECOGNIZED +import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState import org.matrix.android.sdk.api.session.room.model.RoomType import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo import org.matrix.android.sdk.api.util.toMatrixItem @@ -127,6 +128,7 @@ class SpaceDirectoryController @Inject constructor( val isSpace = info.roomType == RoomType.SPACE val isJoined = data?.joinedRoomsIds?.contains(info.childRoomId) == true val isLoading = data?.changeMembershipStates?.get(info.childRoomId)?.isInProgress() ?: false + val error = (data?.changeMembershipStates?.get(info.childRoomId) as? ChangeMembershipState.FailedJoining)?.throwable // if it's known use that matrixItem because it would have a better computed name val matrixItem = data?.knownRoomSummaries?.find { it.roomId == info.childRoomId }?.toMatrixItem() ?: info.toMatrixItem() @@ -135,11 +137,19 @@ class SpaceDirectoryController @Inject constructor( matrixItem(matrixItem) avatarRenderer(host.avatarRenderer) topic(info.topic) + errorLabel( + error?.let { + host.stringProvider.getString(R.string.error_failed_to_join_room, host.errorFormatter.toHumanReadable(it)) + } + ) memberCount(info.activeMemberCount ?: 0) loading(isLoading) buttonLabel( - if (isJoined) host.stringProvider.getString(R.string.action_open) - else host.stringProvider.getString(R.string.join) + when { + error != null -> host.stringProvider.getString(R.string.global_retry) + isJoined -> host.stringProvider.getString(R.string.action_open) + else -> host.stringProvider.getString(R.string.join) + } ) apply { if (isSpace) { diff --git a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryFragment.kt index cb163622fa..323d8a7c87 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryFragment.kt @@ -16,7 +16,6 @@ package im.vector.app.features.spaces.explore -import android.content.DialogInterface import android.os.Bundle import android.os.Parcelable import android.view.LayoutInflater @@ -30,7 +29,6 @@ import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith import im.vector.app.core.extensions.registerStartForActivityResult @@ -40,7 +38,7 @@ import im.vector.app.core.resources.ColorProvider import im.vector.app.core.utils.colorizeMatchingText import im.vector.app.core.utils.isValidUrl import im.vector.app.core.utils.openUrlInExternalBrowser -import im.vector.app.databinding.FragmentRoomDirectoryPickerBinding +import im.vector.app.databinding.FragmentSpaceDirectoryBinding import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.matrixto.SpaceCardRenderer import im.vector.app.features.permalink.PermalinkHandler @@ -63,7 +61,7 @@ class SpaceDirectoryFragment @Inject constructor( private val permalinkHandler: PermalinkHandler, private val spaceCardRenderer: SpaceCardRenderer, private val colorProvider: ColorProvider -) : VectorBaseFragment<FragmentRoomDirectoryPickerBinding>(), +) : VectorBaseFragment<FragmentSpaceDirectoryBinding>(), SpaceDirectoryController.InteractionListener, TimelineEventController.UrlClickCallback, OnBackPressed { @@ -71,7 +69,7 @@ class SpaceDirectoryFragment @Inject constructor( override fun getMenuRes() = R.menu.menu_space_directory override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = - FragmentRoomDirectoryPickerBinding.inflate(layoutInflater, container, false) + FragmentSpaceDirectoryBinding.inflate(layoutInflater, container, false) private val viewModel by activityViewModel(SpaceDirectoryViewModel::class) @@ -85,7 +83,7 @@ class SpaceDirectoryFragment @Inject constructor( it.setDisplayHomeAsUpEnabled(true) } epoxyController.listener = this - views.roomDirectoryPickerList.configureWith(epoxyController) + views.spaceDirectoryList.configureWith(epoxyController) viewModel.selectSubscribe(this, SpaceDirectoryState::canAddRooms) { invalidateOptionsMenu() @@ -97,7 +95,7 @@ class SpaceDirectoryFragment @Inject constructor( override fun onDestroyView() { epoxyController.listener = null - views.roomDirectoryPickerList.cleanup() + views.spaceDirectoryList.cleanup() super.onDestroyView() } @@ -180,7 +178,7 @@ class SpaceDirectoryFragment @Inject constructor( .subscribe { managed -> if (!managed) { if (title.isValidUrl() && url.isValidUrl() && URL(title).host != URL(url).host) { - MaterialAlertDialogBuilder(requireActivity()) + MaterialAlertDialogBuilder(requireActivity(), R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive) .setTitle(R.string.external_link_confirmation_title) .setMessage( getString(R.string.external_link_confirmation_message, title, url) @@ -193,7 +191,6 @@ class SpaceDirectoryFragment @Inject constructor( } .setNegativeButton(R.string.cancel, null) .show() - .withColoredButton(DialogInterface.BUTTON_NEGATIVE) } else { // Open in external browser, in a new Tab openUrlInExternalBrowser(requireContext(), url) diff --git a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt index 3d3e1dac65..de31f43322 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt @@ -188,20 +188,21 @@ class SpaceDirectoryViewModel @AssistedInject constructor( private fun handleJoinOrOpen(spaceChildInfo: SpaceChildInfo) = withState { state -> val isSpace = spaceChildInfo.roomType == RoomType.SPACE - if (state.joinedRoomsIds.contains(spaceChildInfo.childRoomId)) { + val childId = spaceChildInfo.childRoomId + if (state.joinedRoomsIds.contains(childId)) { if (isSpace) { handle(SpaceDirectoryViewAction.ExploreSubSpace(spaceChildInfo)) } else { - _viewEvents.post(SpaceDirectoryViewEvents.NavigateToRoom(spaceChildInfo.childRoomId)) + _viewEvents.post(SpaceDirectoryViewEvents.NavigateToRoom(childId)) } } else { // join viewModelScope.launch { try { if (isSpace) { - session.spaceService().joinSpace(spaceChildInfo.childRoomId, null, spaceChildInfo.viaServers) + session.spaceService().joinSpace(childId, null, spaceChildInfo.viaServers) } else { - session.joinRoom(spaceChildInfo.childRoomId, null, spaceChildInfo.viaServers) + session.joinRoom(childId, null, spaceChildInfo.viaServers) } } catch (failure: Throwable) { Timber.e(failure, "## Space: Failed to join room or subspace") diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageActivity.kt index a4585df474..630c578069 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageActivity.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageActivity.kt @@ -20,7 +20,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Parcelable -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.isGone import androidx.core.view.isVisible import com.airbnb.mvrx.MvRx @@ -39,6 +39,7 @@ import im.vector.app.features.roomdirectory.RoomDirectorySharedActionViewModel import im.vector.app.features.roomdirectory.createroom.CreateRoomArgs import im.vector.app.features.roomdirectory.createroom.CreateRoomFragment import im.vector.app.features.roomprofile.RoomProfileArgs +import im.vector.app.features.roomprofile.alias.RoomAliasFragment import kotlinx.parcelize.Parcelize import javax.inject.Inject @@ -155,6 +156,15 @@ class SpaceManageActivity : VectorBaseActivity<ActivitySimpleLoadingBinding>(), ) } } + SpaceManagedSharedViewEvents.NavigateToAliasSettings -> { + args?.spaceId?.let { spaceId -> + addFragmentToBackstack( + R.id.simpleFragmentContainer, + RoomAliasFragment::class.java, + RoomProfileArgs(spaceId) + ) + } + } } } } @@ -169,7 +179,7 @@ class SpaceManageActivity : VectorBaseActivity<ActivitySimpleLoadingBinding>(), override fun create(initialState: SpaceManageViewState) = sharedViewModelFactory.create(initialState) - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageSharedViewModel.kt index 57c47250f9..f1d041056f 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageSharedViewModel.kt @@ -56,6 +56,7 @@ class SpaceManageSharedViewModel @AssistedInject constructor( SpaceManagedSharedAction.ShowLoading -> _viewEvents.post(SpaceManagedSharedViewEvents.ShowLoading) SpaceManagedSharedAction.CreateRoom -> _viewEvents.post(SpaceManagedSharedViewEvents.NavigateToCreateRoom) SpaceManagedSharedAction.ManageRooms -> _viewEvents.post(SpaceManagedSharedViewEvents.NavigateToManageRooms) + SpaceManagedSharedAction.OpenSpaceAliasesSettings -> _viewEvents.post(SpaceManagedSharedViewEvents.NavigateToAliasSettings) } } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManagedSharedAction.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManagedSharedAction.kt index 0b413a3b8a..77143470bc 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManagedSharedAction.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManagedSharedAction.kt @@ -24,4 +24,5 @@ sealed class SpaceManagedSharedAction : VectorViewModelAction { object HideLoading : SpaceManagedSharedAction() object CreateRoom : SpaceManagedSharedAction() object ManageRooms : SpaceManagedSharedAction() + object OpenSpaceAliasesSettings : SpaceManagedSharedAction() } diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManagedSharedViewEvents.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManagedSharedViewEvents.kt index da6f01d205..ab993764c6 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManagedSharedViewEvents.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManagedSharedViewEvents.kt @@ -24,4 +24,5 @@ sealed class SpaceManagedSharedViewEvents : VectorViewEvents { object HideLoading : SpaceManagedSharedViewEvents() object NavigateToCreateRoom : SpaceManagedSharedViewEvents() object NavigateToManageRooms : SpaceManagedSharedViewEvents() + object NavigateToAliasSettings : SpaceManagedSharedViewEvents() } diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsController.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsController.kt index 08b21db025..27204be8a6 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsController.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsController.kt @@ -52,6 +52,7 @@ class SpaceSettingsController @Inject constructor( fun onDevRoomSettings() fun onManageRooms() fun setIsPublic(public: Boolean) + fun onRoomAliasesClicked() } var callback: Callback? = null @@ -103,6 +104,7 @@ class SpaceSettingsController @Inject constructor( } } + val isPublic = (data.newRoomJoinRules.newJoinRules ?: data.currentRoomJoinRules) == RoomJoinRules.PUBLIC if (vectorPreferences.labsUseExperimentalRestricted()) { buildProfileAction( id = "joinRule", @@ -113,7 +115,6 @@ class SpaceSettingsController @Inject constructor( action = { if (data.actionPermissions.canChangeJoinRule) callback?.onJoinRuleClicked() } ) } else { - val isPublic = (data.newRoomJoinRules.newJoinRules ?: data.currentRoomJoinRules) == RoomJoinRules.PUBLIC formSwitchItem { id("isPublic") enabled(data.actionPermissions.canChangeJoinRule) @@ -133,13 +134,24 @@ class SpaceSettingsController @Inject constructor( id = "manage_rooms", title = stringProvider.getString(R.string.space_settings_manage_rooms), // subtitle = data.getJoinRuleWording(stringProvider), - divider = vectorPreferences.developerMode(), + divider = vectorPreferences.developerMode() || isPublic, editable = data.actionPermissions.canAddChildren, action = { if (data.actionPermissions.canAddChildren) callback?.onManageRooms() } ) + if (isPublic) { + buildProfileAction( + id = "alias", + title = stringProvider.getString(R.string.space_settings_alias_title), + subtitle = stringProvider.getString(R.string.space_settings_alias_subtitle), + divider = vectorPreferences.developerMode(), + editable = true, + action = { callback?.onRoomAliasesClicked() } + ) + } + if (vectorPreferences.developerMode()) { buildProfileAction( id = "dev_tools", diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsFragment.kt index 350c0bdb4a..e831732bcc 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsFragment.kt @@ -233,6 +233,10 @@ class SpaceSettingsFragment @Inject constructor( } } + override fun onRoomAliasesClicked() { + sharedViewModel.handle(SpaceManagedSharedAction.OpenSpaceAliasesSettings) + } + override fun onImageReady(uri: Uri?) { uri ?: return viewModel.handle( diff --git a/vector/src/main/java/im/vector/app/features/themes/ActivityOtherThemes.kt b/vector/src/main/java/im/vector/app/features/themes/ActivityOtherThemes.kt index a1065ed10b..8c21e96bea 100644 --- a/vector/src/main/java/im/vector/app/features/themes/ActivityOtherThemes.kt +++ b/vector/src/main/java/im/vector/app/features/themes/ActivityOtherThemes.kt @@ -27,22 +27,22 @@ sealed class ActivityOtherThemes(@StyleRes val dark: Int, @StyleRes val black: Int) { object Default : ActivityOtherThemes( - R.style.AppTheme_Dark, - R.style.AppTheme_Black + R.style.Theme_Vector_Dark, + R.style.Theme_Vector_Black ) object Launcher : ActivityOtherThemes( - R.style.AppTheme_Launcher, - R.style.AppTheme_Launcher + R.style.Theme_Vector_Launcher, + R.style.Theme_Vector_Launcher ) object AttachmentsPreview : ActivityOtherThemes( - R.style.AppTheme_AttachmentsPreview, - R.style.AppTheme_AttachmentsPreview + R.style.Theme_Vector_Black_AttachmentsPreview, + R.style.Theme_Vector_Black_AttachmentsPreview ) object VectorAttachmentsPreview : ActivityOtherThemes( - R.style.AppTheme_Transparent, - R.style.AppTheme_Transparent + R.style.Theme_Vector_Black_Transparent, + R.style.Theme_Vector_Black_Transparent ) } diff --git a/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt b/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt index db8ad61c0a..c4c9ca63ae 100644 --- a/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt +++ b/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt @@ -114,10 +114,10 @@ object ThemeUtils { currentTheme.set(aTheme) context.setTheme( when (aTheme) { - SYSTEM_THEME_VALUE -> if (isSystemDarkTheme(context.resources)) R.style.AppTheme_Dark else R.style.AppTheme_Light - THEME_DARK_VALUE -> R.style.AppTheme_Dark - THEME_BLACK_VALUE -> R.style.AppTheme_Black - else -> R.style.AppTheme_Light + SYSTEM_THEME_VALUE -> if (isSystemDarkTheme(context.resources)) R.style.Theme_Vector_Dark else R.style.Theme_Vector_Light + THEME_DARK_VALUE -> R.style.Theme_Vector_Dark + THEME_BLACK_VALUE -> R.style.Theme_Vector_Black + else -> R.style.Theme_Vector_Light } ) diff --git a/vector/src/main/java/im/vector/app/features/webview/VectorWebViewActivity.kt b/vector/src/main/java/im/vector/app/features/webview/VectorWebViewActivity.kt index e4d2571333..ab8af20063 100644 --- a/vector/src/main/java/im/vector/app/features/webview/VectorWebViewActivity.kt +++ b/vector/src/main/java/im/vector/app/features/webview/VectorWebViewActivity.kt @@ -21,11 +21,9 @@ import android.content.Intent import android.webkit.WebChromeClient import android.webkit.WebView import androidx.annotation.CallSuper -import im.vector.app.R import im.vector.app.core.di.ScreenComponent import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.databinding.ActivityVectorWebViewBinding - import org.matrix.android.sdk.api.session.Session import javax.inject.Inject @@ -48,7 +46,7 @@ class VectorWebViewActivity : VectorBaseActivity<ActivityVectorWebViewBinding>() override fun initUiAndData() { configureToolbar(views.webviewToolbar) - waitingView = findViewById(R.id.simple_webview_loader) + waitingView = views.simpleWebviewLoader views.simpleWebview.settings.apply { // Enable Javascript diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt index df995930c6..9072957a95 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt @@ -19,7 +19,7 @@ package im.vector.app.features.widgets import android.app.Activity import android.content.Context import android.content.Intent -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.isVisible import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.viewModel @@ -150,7 +150,7 @@ class WidgetActivity : VectorBaseActivity<ActivityWidgetBinding>(), finish() } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } } diff --git a/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionBottomSheet.kt b/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionBottomSheet.kt index 68ae11c1bf..4036195b65 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionBottomSheet.kt @@ -64,8 +64,8 @@ class RoomWidgetPermissionBottomSheet : } private fun setupViews() { - views.widgetPermissionDecline.setOnClickListener { doDecline() } - views.widgetPermissionContinue.setOnClickListener { doAccept() } + views.widgetPermissionDecline.debouncedClicks { doDecline() } + views.widgetPermissionContinue.debouncedClicks { doAccept() } } override fun invalidate() = withState(viewModel) { state -> diff --git a/vector/src/main/res/drawable-hdpi/arrow_up_circle.png b/vector/src/main/res/drawable-hdpi/arrow_up_circle.png deleted file mode 100755 index c7fba081c1..0000000000 Binary files a/vector/src/main/res/drawable-hdpi/arrow_up_circle.png and /dev/null differ diff --git a/vector/src/main/res/drawable-mdpi/arrow_up_circle.png b/vector/src/main/res/drawable-mdpi/arrow_up_circle.png deleted file mode 100755 index aad94e9a4e..0000000000 Binary files a/vector/src/main/res/drawable-mdpi/arrow_up_circle.png and /dev/null differ diff --git a/vector/src/main/res/drawable-xhdpi/arrow_up_circle.png b/vector/src/main/res/drawable-xhdpi/arrow_up_circle.png deleted file mode 100755 index 8973128ccc..0000000000 Binary files a/vector/src/main/res/drawable-xhdpi/arrow_up_circle.png and /dev/null differ diff --git a/vector/src/main/res/drawable-xxhdpi/arrow_up_circle.png b/vector/src/main/res/drawable-xxhdpi/arrow_up_circle.png deleted file mode 100755 index c13179d220..0000000000 Binary files a/vector/src/main/res/drawable-xxhdpi/arrow_up_circle.png and /dev/null differ diff --git a/vector/src/main/res/drawable-xxxhdpi/arrow_up_circle.png b/vector/src/main/res/drawable-xxxhdpi/arrow_up_circle.png deleted file mode 100755 index 61fd2b1e48..0000000000 Binary files a/vector/src/main/res/drawable-xxxhdpi/arrow_up_circle.png and /dev/null differ diff --git a/vector/src/main/res/drawable/bg_space_item.xml b/vector/src/main/res/drawable/bg_space_item.xml index 0362a9a8df..158a6769ba 100644 --- a/vector/src/main/res/drawable/bg_space_item.xml +++ b/vector/src/main/res/drawable/bg_space_item.xml @@ -20,7 +20,7 @@ <item> <shape> - <solid android:color="@android:color/transparent" /> + <solid android:color="?android:colorBackground" /> </shape> </item> diff --git a/vector/src/main/res/drawable/bg_voice_play_pause_button.xml b/vector/src/main/res/drawable/bg_voice_play_pause_button.xml index c0b14c77e9..f230d0d4c6 100644 --- a/vector/src/main/res/drawable/bg_voice_play_pause_button.xml +++ b/vector/src/main/res/drawable/bg_voice_play_pause_button.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="32dp" android:height="32dp" /> - <solid android:color="?vctr_voice_message_play_pause_button_background" /> + <!-- Tint color is provided by the theme --> + <solid android:color="@android:color/black" /> </shape> \ No newline at end of file diff --git a/vector/src/main/res/drawable/bg_voice_playback.xml b/vector/src/main/res/drawable/bg_voice_playback.xml index db31e29bc7..4474c00345 100644 --- a/vector/src/main/res/drawable/bg_voice_playback.xml +++ b/vector/src/main/res/drawable/bg_voice_playback.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="?vctr_voice_message_playback_background" /> + <!-- Tint color is provided by the theme --> + <solid android:color="@android:color/black" /> <size android:width="240dp" android:height="44dp" /> diff --git a/vector/src/main/res/drawable/ic_baseline_perm_contact_calendar_24.xml b/vector/src/main/res/drawable/ic_baseline_perm_contact_calendar_24.xml index 6cd8c624a1..73ea3e8746 100644 --- a/vector/src/main/res/drawable/ic_baseline_perm_contact_calendar_24.xml +++ b/vector/src/main/res/drawable/ic_baseline_perm_contact_calendar_24.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> <path - android:fillColor="?colorControlNormal" + android:fillColor="#F00" android:pathData="M19,3h-1L18,1h-2v2L8,3L8,1L6,1v2L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,6c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM18,18L6,18v-1c0,-2 4,-3.1 6,-3.1s6,1.1 6,3.1v1z"/> </vector> diff --git a/vector/src/main/res/drawable/ic_call_answer_video.xml b/vector/src/main/res/drawable/ic_call_answer_video.xml new file mode 100644 index 0000000000..d3af4f7b70 --- /dev/null +++ b/vector/src/main/res/drawable/ic_call_answer_video.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="25dp" + android:height="25dp" + android:viewportWidth="25" + android:viewportHeight="25"> + <path + android:pathData="M0.5,7.5C0.5,5.8432 1.8432,4.5 3.5,4.5H14.5C16.1569,4.5 17.5,5.8432 17.5,7.5V17.5C17.5,19.1569 16.1569,20.5 14.5,20.5H3.5C1.8432,20.5 0.5,19.1569 0.5,17.5V7.5Z" + android:fillColor="#FFFFFF"/> + <path + android:pathData="M19.5,9.5L22.8753,6.7998C23.5301,6.2759 24.5,6.7421 24.5,7.5806V17.4194C24.5,18.2579 23.5301,18.7241 22.8753,18.2002L19.5,15.5V9.5Z" + android:fillColor="#FFFFFF"/> +</vector> diff --git a/vector/src/main/res/drawable/ic_delete_unsent_messages.xml b/vector/src/main/res/drawable/ic_delete_unsent_messages.xml index 24fdbc94c2..8f7beaeb20 100644 --- a/vector/src/main/res/drawable/ic_delete_unsent_messages.xml +++ b/vector/src/main/res/drawable/ic_delete_unsent_messages.xml @@ -5,5 +5,5 @@ android:viewportHeight="30"> <path android:pathData="M8.5714,22.5C8.5714,23.6864 9.5357,25 10.7143,25H19.2857C20.4643,25 21.4286,23.4428 21.4286,22.2564V11.4711C21.4286,10.2848 20.4643,9.3141 19.2857,9.3141H10.7143C9.5357,9.3141 8.5714,10.2848 8.5714,11.4711V22.5ZM21.4286,6.0785H18.75L17.9893,5.3128C17.7964,5.1186 17.5179,5 17.2393,5H12.7607C12.4821,5 12.2036,5.1186 12.0107,5.3128L11.25,6.0785H8.5714C7.9821,6.0785 7.5,6.5639 7.5,7.1571C7.5,7.7502 7.9821,8.2356 8.5714,8.2356H21.4286C22.0179,8.2356 22.5,7.7502 22.5,7.1571C22.5,6.5639 22.0179,6.0785 21.4286,6.0785Z" - android:fillColor="#FE2928"/> + android:fillColor="?colorError"/> </vector> diff --git a/vector/src/main/res/drawable/ic_eye.xml b/vector/src/main/res/drawable/ic_eye.xml deleted file mode 100644 index 976a023268..0000000000 --- a/vector/src/main/res/drawable/ic_eye.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="25dp" - android:height="24dp" - android:viewportWidth="25" - android:viewportHeight="24"> - <path - android:pathData="M22.7361,9.9197C23.6693,11.1729 23.6895,12.8384 22.7728,14.1036C21.0553,16.4739 17.6416,20 12.5317,20C7.4217,20 4.008,16.4739 2.2906,14.1036C1.3738,12.8384 1.394,11.1729 2.3273,9.9197C4.0926,7.5494 7.5651,4 12.5317,4C17.4982,4 20.9708,7.5494 22.7361,9.9197ZM17.8334,12C17.8334,14.9455 15.4456,17.3333 12.5001,17.3333C9.5546,17.3333 7.1668,14.9455 7.1668,12C7.1668,9.0545 9.5546,6.6667 12.5001,6.6667C15.4456,6.6667 17.8334,9.0545 17.8334,12ZM12.5001,14.6667C13.9729,14.6667 15.1668,13.4728 15.1668,12C15.1668,10.5272 13.9729,9.3333 12.5001,9.3333C11.0274,9.3333 9.8335,10.5272 9.8335,12C9.8335,13.4728 11.0274,14.6667 12.5001,14.6667Z" - android:fillColor="#ffffff" - android:fillType="evenOdd"/> -</vector> diff --git a/vector/src/main/res/drawable/ic_eye_closed.xml b/vector/src/main/res/drawable/ic_eye_closed.xml deleted file mode 100644 index 5d13f0615d..0000000000 --- a/vector/src/main/res/drawable/ic_eye_closed.xml +++ /dev/null @@ -1,7 +0,0 @@ -<vector android:autoMirrored="true" android:height="24dp" - android:viewportHeight="24" android:viewportWidth="24" - android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> - <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M5.4447,6.2731C3.8736,7.4199 2.6604,8.8011 1.8273,9.9197C0.894,11.1729 0.8738,12.8384 1.7906,14.1036C3.508,16.4739 6.9217,20 12.0317,20C14.2012,20 16.065,19.3644 17.623,18.4514L15.3344,16.1628C14.4212,16.8952 13.2618,17.3333 12.0002,17.3333C9.0546,17.3333 6.6668,14.9455 6.6668,12C6.6668,10.7383 7.1049,9.5789 7.8373,8.6657L5.4447,6.2731ZM17.3119,12.4834C17.3262,12.3242 17.3335,12.163 17.3335,12C17.3335,9.0545 14.9457,6.6667 12.0002,6.6667C11.8372,6.6667 11.6759,6.674 11.5167,6.6883L9.2201,4.3917C10.0958,4.1434 11.0336,4 12.0317,4C16.9982,4 20.4708,7.5494 22.2361,9.9197C23.1693,11.1729 23.1895,12.8384 22.2728,14.1036C21.8639,14.6678 21.359,15.2975 20.758,15.9296L17.3119,12.4834ZM9.7461,10.5745C9.4848,10.9868 9.3335,11.4757 9.3335,12C9.3335,13.4728 10.5274,14.6667 12.0002,14.6667C12.5244,14.6667 13.0133,14.5154 13.4257,14.2541L9.7461,10.5745Z"/> - <path android:fillColor="#00000000" android:pathData="M1,1L23,23" - android:strokeColor="#ffffff" android:strokeLineCap="round" android:strokeWidth="2"/> -</vector> diff --git a/vector/src/main/res/drawable/ic_jump_to_unread.xml b/vector/src/main/res/drawable/ic_jump_to_unread.xml new file mode 100644 index 0000000000..2c5b8b90c1 --- /dev/null +++ b/vector/src/main/res/drawable/ic_jump_to_unread.xml @@ -0,0 +1,10 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M12,2C6.4771,2 2,6.4771 2,12C2,17.5228 6.4771,22 12,22C17.5228,22 22,17.5228 22,12C22,6.4771 17.5228,2 12,2ZM11.2929,6.2929C11.3888,6.197 11.4993,6.1247 11.6172,6.0759L12.7071,6.2929L12.7075,6.2933L16.7071,10.2929C17.0976,10.6834 17.0976,11.3166 16.7071,11.7071C16.3166,12.0976 15.6834,12.0976 15.2929,11.7071L13,9.4142L13,17C13,17.5523 12.5523,18 12,18C11.4477,18 11,17.5523 11,17L11,9.4142L8.7071,11.7071C8.3166,12.0976 7.6834,12.0976 7.2929,11.7071C6.9024,11.3166 6.9024,10.6834 7.2929,10.2929L11.2929,6.2929ZM11.6172,6.0759L12.705,6.2908C12.5242,6.1111 12.2751,6 12,6C11.8644,6 11.7351,6.027 11.6172,6.0759Z" + android:fillColor="#0DBD8B" + android:fillType="evenOdd"/> +</vector> diff --git a/vector/src/main/res/drawable/ic_pause.xml b/vector/src/main/res/drawable/ic_pause.xml index 1d1f8e634f..19da9bc040 100644 --- a/vector/src/main/res/drawable/ic_pause.xml +++ b/vector/src/main/res/drawable/ic_pause.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> <path - android:fillColor="?colorControlNormal" + android:fillColor="#F00" android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/> </vector> diff --git a/vector/src/main/res/drawable/ic_play_arrow.xml b/vector/src/main/res/drawable/ic_play_arrow.xml index 4bc3ab1d79..d0d9499f1c 100644 --- a/vector/src/main/res/drawable/ic_play_arrow.xml +++ b/vector/src/main/res/drawable/ic_play_arrow.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> <path - android:fillColor="?colorControlNormal" + android:fillColor="#F00" android:pathData="M8,5v14l11,-7z"/> </vector> diff --git a/vector/src/main/res/drawable/ic_recycle_bin.xml b/vector/src/main/res/drawable/ic_recycle_bin.xml new file mode 100644 index 0000000000..acced1f719 --- /dev/null +++ b/vector/src/main/res/drawable/ic_recycle_bin.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="14dp" + android:height="18dp" + android:viewportWidth="14" + android:viewportHeight="18"> + <path + android:pathData="M1,16C1,17.1 1.9,18 3,18H11C12.1,18 13,17.1 13,16V6C13,4.9 12.1,4 11,4H3C1.9,4 1,4.9 1,6V16ZM13,1H10.5L9.79,0.29C9.61,0.11 9.35,0 9.09,0H4.91C4.65,0 4.39,0.11 4.21,0.29L3.5,1H1C0.45,1 0,1.45 0,2C0,2.55 0.45,3 1,3H13C13.55,3 14,2.55 14,2C14,1.45 13.55,1 13,1Z" + android:fillColor="#8D99A5"/> +</vector> diff --git a/vector/src/main/res/drawable/rounded_rect_shape_16.xml b/vector/src/main/res/drawable/rounded_rect_shape_16.xml deleted file mode 100644 index c2fc859525..0000000000 --- a/vector/src/main/res/drawable/rounded_rect_shape_16.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - - <size android:width="40dp" android:height="40dp"/> - - <solid android:color="?vctr_header_background" /> - - <corners android:radius="16dp" /> - -</shape> \ No newline at end of file diff --git a/vector/src/main/res/drawable/rounded_rect_shape_8.xml b/vector/src/main/res/drawable/rounded_rect_shape_8.xml index aa51217152..9933e6192c 100644 --- a/vector/src/main/res/drawable/rounded_rect_shape_8.xml +++ b/vector/src/main/res/drawable/rounded_rect_shape_8.xml @@ -4,7 +4,7 @@ <size android:width="40dp" android:height="40dp"/> - <solid android:color="?vctr_header_background" /> + <solid android:color="?vctr_system" /> <corners android:radius="8dp" /> diff --git a/vector/src/main/res/drawable/rounded_rect_stroke_8.xml b/vector/src/main/res/drawable/rounded_rect_stroke_8.xml deleted file mode 100644 index 93ec91f276..0000000000 --- a/vector/src/main/res/drawable/rounded_rect_stroke_8.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - - <size android:width="40dp" android:height="40dp"/> - - <stroke android:width="1dp" android:color="?vctr_header_background" /> - - <corners android:radius="8dp" /> - -</shape> \ No newline at end of file diff --git a/vector/src/main/res/layout/activity.xml b/vector/src/main/res/layout/activity.xml index f403fcff82..c8dd97cd89 100644 --- a/vector/src/main/res/layout/activity.xml +++ b/vector/src/main/res/layout/activity.xml @@ -9,12 +9,18 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/toolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:elevation="4dp" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + </com.google.android.material.appbar.AppBarLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/container" @@ -23,7 +29,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/toolbar" /> + app:layout_constraintTop_toBottomOf="@id/appBarLayout" /> <include android:id="@+id/waiting_view" diff --git a/vector/src/main/res/layout/activity_big_image_viewer.xml b/vector/src/main/res/layout/activity_big_image_viewer.xml index 124b76f64e..3865e26261 100644 --- a/vector/src/main/res/layout/activity_big_image_viewer.xml +++ b/vector/src/main/res/layout/activity_big_image_viewer.xml @@ -4,14 +4,18 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/bigImageViewerToolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:elevation="4dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/bigImageViewerToolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" /> + + </com.google.android.material.appbar.AppBarLayout> <com.github.piasy.biv.view.BigImageView android:id="@+id/bigImageViewerImageView" @@ -21,7 +25,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/bigImageViewerToolbar" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" app:optimizeDisplay="true" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/activity_bug_report.xml b/vector/src/main/res/layout/activity_bug_report.xml index 69d4d11862..f9e290f29e 100644 --- a/vector/src/main/res/layout/activity_bug_report.xml +++ b/vector/src/main/res/layout/activity_bug_report.xml @@ -6,11 +6,16 @@ android:layout_height="wrap_content" android:orientation="vertical"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/bugReportToolbar" + <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:elevation="4dp" /> + android:layout_height="wrap_content"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/bugReportToolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + </com.google.android.material.appbar.AppBarLayout> <LinearLayout android:id="@+id/bug_report_body_view" @@ -21,6 +26,7 @@ <TextView android:id="@+id/bug_report_progress_text_view" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" @@ -58,6 +64,7 @@ <TextView android:id="@+id/bug_report_first_text" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" @@ -86,16 +93,17 @@ </com.google.android.material.textfield.TextInputLayout> <TextView + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:text="@string/send_bug_report_description_in_english" - android:textColor="?vctr_content_secondary" - android:textSize="12sp" /> + android:textColor="?vctr_content_secondary" /> <TextView android:id="@+id/bug_report_logs_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" diff --git a/vector/src/main/res/layout/activity_call.xml b/vector/src/main/res/layout/activity_call.xml index 7179fc7896..0df28cf16a 100644 --- a/vector/src/main/res/layout/activity_call.xml +++ b/vector/src/main/res/layout/activity_call.xml @@ -9,7 +9,7 @@ android:id="@+id/constraintLayout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/bg_call_screen" + android:background="@color/bg_call_screen_blur" tools:ignore="MergeRootFrame"> <ImageView @@ -37,23 +37,27 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <FrameLayout + <com.google.android.material.card.MaterialCardView android:id="@+id/otherKnownCallLayout" android:layout_width="80dp" android:layout_height="144dp" android:layout_marginTop="32dp" android:layout_marginEnd="16dp" android:background="@color/element_background_light" + android:foreground="?attr/selectableItemBackground" android:visibility="gone" + app:cardBackgroundColor="@color/bg_call_screen" + app:cardCornerRadius="4dp" + app:cardElevation="4dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" tools:visibility="visible"> <ImageView android:id="@+id/otherKnownCallAvatarView" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:foreground="?attr/selectableItemBackground" + android:layout_width="64dp" + android:layout_height="64dp" + android:layout_gravity="center" android:importantForAccessibility="no" android:scaleType="centerCrop" tools:src="@tools:sample/avatars" /> @@ -66,7 +70,7 @@ android:importantForAccessibility="no" android:src="@drawable/ic_call_small_pause" /> - </FrameLayout> + </com.google.android.material.card.MaterialCardView> <ImageView android:id="@+id/otherMemberAvatar" @@ -94,6 +98,7 @@ <TextView android:id="@+id/participantNameText" + style="@style/Widget.Vector.TextView.Title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -101,7 +106,6 @@ android:layout_marginEnd="@dimen/layout_horizontal_margin" android:gravity="center" android:textColor="@android:color/white" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -110,6 +114,7 @@ <TextView android:id="@+id/callStatusText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -118,7 +123,6 @@ android:layout_marginBottom="8dp" android:gravity="center" android:textColor="@android:color/white" - android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/participantNameText" @@ -126,13 +130,12 @@ <Button android:id="@+id/callActionText" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="48dp" android:layout_margin="8dp" android:gravity="center" android:textColor="?colorSecondary" - android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/callStatusText" diff --git a/vector/src/main/res/layout/activity_call_transfer.xml b/vector/src/main/res/layout/activity_call_transfer.xml index 2196fc5faa..046c8ce569 100644 --- a/vector/src/main/res/layout/activity_call_transfer.xml +++ b/vector/src/main/res/layout/activity_call_transfer.xml @@ -9,21 +9,26 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/callTransferToolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:elevation="4dp" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent"> - <com.google.android.material.tabs.TabLayout - android:id="@+id/callTransferTabLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@+id/callTransferToolbar" - app:tabGravity="fill" - app:tabMaxWidth="0dp" - app:tabMode="fixed" /> + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/callTransferToolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + <com.google.android.material.tabs.TabLayout + android:id="@+id/callTransferTabLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:tabGravity="fill" + app:tabMaxWidth="0dp" + app:tabMode="fixed" /> + + </com.google.android.material.appbar.AppBarLayout> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/callTransferViewPager" @@ -33,7 +38,7 @@ app:layout_constraintBottom_toTopOf="@+id/callTransferActionsLayout" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/callTransferTabLayout" /> + app:layout_constraintTop_toBottomOf="@id/appBarLayout" /> <RelativeLayout android:id="@+id/callTransferActionsLayout" @@ -55,6 +60,7 @@ <TextView android:id="@+id/callTransferConsultTitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" @@ -66,7 +72,7 @@ <Button android:id="@+id/callTransferConnectAction" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" diff --git a/vector/src/main/res/layout/activity_emoji_reaction_picker.xml b/vector/src/main/res/layout/activity_emoji_reaction_picker.xml index 1273a0f550..3e8f604d74 100644 --- a/vector/src/main/res/layout/activity_emoji_reaction_picker.xml +++ b/vector/src/main/res/layout/activity_emoji_reaction_picker.xml @@ -26,10 +26,9 @@ <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:elevation="4dp"> + android:layout_height="wrap_content"> - <androidx.appcompat.widget.Toolbar + <com.google.android.material.appbar.MaterialToolbar android:id="@+id/emojiPickerToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" @@ -44,5 +43,4 @@ </com.google.android.material.appbar.AppBarLayout> - </androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/activity_filtered_rooms.xml b/vector/src/main/res/layout/activity_filtered_rooms.xml index 310ad2bfa4..270de8f514 100644 --- a/vector/src/main/res/layout/activity_filtered_rooms.xml +++ b/vector/src/main/res/layout/activity_filtered_rooms.xml @@ -9,25 +9,28 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/filteredRoomsToolbar" - android:layout_width="0dp" - android:layout_height="?attr/actionBarSize" - android:elevation="4dp" - app:contentInsetStart="0dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.appcompat.widget.SearchView - android:id="@+id/filteredRoomsSearchView" - style="@style/VectorSearchView" + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/filteredRoomsToolbar" android:layout_width="match_parent" - android:layout_height="wrap_content" - app:queryHint="@string/room_filtering_filter_hint" - app:searchIcon="@drawable/ic_filter" /> + android:layout_height="?attr/actionBarSize" + app:contentInsetStart="0dp"> - </androidx.appcompat.widget.Toolbar> + <androidx.appcompat.widget.SearchView + android:id="@+id/filteredRoomsSearchView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:queryHint="@string/room_filtering_filter_hint" + app:searchIcon="@drawable/ic_filter" /> + + </com.google.android.material.appbar.MaterialToolbar> + + </com.google.android.material.appbar.AppBarLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/filteredRoomsFragmentContainer" @@ -36,7 +39,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/filteredRoomsToolbar" /> + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/activity_incoming_share.xml b/vector/src/main/res/layout/activity_incoming_share.xml index b85a5d6759..f0e0c0a485 100644 --- a/vector/src/main/res/layout/activity_incoming_share.xml +++ b/vector/src/main/res/layout/activity_incoming_share.xml @@ -9,24 +9,28 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/incomingShareToolbar" - android:layout_width="0dp" - android:layout_height="?attr/actionBarSize" - app:contentInsetStart="0dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.appcompat.widget.SearchView - android:id="@+id/incomingShareSearchView" - style="@style/VectorSearchView" + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/incomingShareToolbar" android:layout_width="match_parent" - android:layout_height="wrap_content" - app:queryHint="@string/room_filtering_filter_hint" - app:searchIcon="@drawable/ic_filter" /> + android:layout_height="?attr/actionBarSize" + app:contentInsetStart="0dp"> - </androidx.appcompat.widget.Toolbar> + <androidx.appcompat.widget.SearchView + android:id="@+id/incomingShareSearchView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:queryHint="@string/room_filtering_filter_hint" + app:searchIcon="@drawable/ic_filter" /> + + </com.google.android.material.appbar.MaterialToolbar> + + </com.google.android.material.appbar.AppBarLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/shareRoomListFragmentContainer" @@ -35,7 +39,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/incomingShareToolbar" /> + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/activity_search.xml b/vector/src/main/res/layout/activity_search.xml index cba8b01f34..7c71217f64 100644 --- a/vector/src/main/res/layout/activity_search.xml +++ b/vector/src/main/res/layout/activity_search.xml @@ -9,25 +9,28 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/searchToolbar" - android:layout_width="0dp" - android:layout_height="?attr/actionBarSize" - android:elevation="4dp" - app:contentInsetStart="0dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.appcompat.widget.SearchView - android:id="@+id/searchView" - style="@style/VectorSearchView" + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/searchToolbar" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:backgroundTint="@color/base_color" - app:queryHint="@string/search_hint" /> + android:layout_height="?attr/actionBarSize" + app:contentInsetStart="0dp"> - </androidx.appcompat.widget.Toolbar> + <androidx.appcompat.widget.SearchView + android:id="@+id/searchView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:backgroundTint="@color/base_color" + app:queryHint="@string/search_hint" /> + + </com.google.android.material.appbar.MaterialToolbar> + + </com.google.android.material.appbar.AppBarLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/searchFragmentContainer" @@ -36,7 +39,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/searchToolbar" /> + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/activity_signed_out.xml b/vector/src/main/res/layout/activity_signed_out.xml index 1e09430254..afbd6fa90f 100644 --- a/vector/src/main/res/layout/activity_signed_out.xml +++ b/vector/src/main/res/layout/activity_signed_out.xml @@ -17,22 +17,24 @@ tools:ignore="ContentDescription" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/signed_out_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="start" android:text="@string/signed_out_notice" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" /> + android:textColor="?vctr_content_secondary" /> <Button android:id="@+id/signedOutSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/activity_simple_loading.xml b/vector/src/main/res/layout/activity_simple_loading.xml index b523d97c92..ac0e64a5b5 100644 --- a/vector/src/main/res/layout/activity_simple_loading.xml +++ b/vector/src/main/res/layout/activity_simple_loading.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:id="@+id/coordinatorLayout" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/vector/src/main/res/layout/activity_vector_settings.xml b/vector/src/main/res/layout/activity_vector_settings.xml index ecd53171af..b24ea8a322 100755 --- a/vector/src/main/res/layout/activity_vector_settings.xml +++ b/vector/src/main/res/layout/activity_vector_settings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:id="@+id/coordinatorLayout" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -9,13 +10,21 @@ android:layout_height="match_parent" android:orientation="vertical"> - <!-- Use VectorToolbarStyleWithPadding on this screen for better alignment with setting items --> - <androidx.appcompat.widget.Toolbar - android:id="@+id/settingsToolbar" - style="@style/VectorToolbarStyleWithPadding" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:elevation="4dp" /> + android:layout_height="wrap_content"> + + <!-- Use Widget.Vector.Toolbar.Settings on this screen for better alignment with setting items --> + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/settingsToolbar" + style="@style/Widget.Vector.Toolbar.Settings" + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:navigationIcon="@drawable/ic_back_24dp" + tools:title="Title" /> + + </com.google.android.material.appbar.AppBarLayout> <FrameLayout android:id="@+id/vector_settings_page" diff --git a/vector/src/main/res/layout/activity_vector_web_view.xml b/vector/src/main/res/layout/activity_vector_web_view.xml index f53f7d41e6..d691f4de5d 100644 --- a/vector/src/main/res/layout/activity_vector_web_view.xml +++ b/vector/src/main/res/layout/activity_vector_web_view.xml @@ -6,30 +6,36 @@ android:layout_height="match_parent" tools:context=".features.webview.VectorWebViewActivity"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/webview_toolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:elevation="4dp" - app:layout_constraintTop_toTopOf="parent" - tools:title="Title of the web page" /> + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/webview_toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + tools:title="Title of the web page" /> + + </com.google.android.material.appbar.AppBarLayout> <WebView android:id="@+id/simple_webview" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintTop_toBottomOf="@+id/webview_toolbar" /> + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" /> <ProgressBar android:id="@+id/simple_webview_loader" - style="@style/Widget.AppCompat.ProgressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:visibility="visible" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/activity_widget.xml b/vector/src/main/res/layout/activity_widget.xml index 06a411331e..b278bb5a1a 100755 --- a/vector/src/main/res/layout/activity_widget.xml +++ b/vector/src/main/res/layout/activity_widget.xml @@ -1,13 +1,22 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/toolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + </com.google.android.material.appbar.AppBarLayout> <FrameLayout android:id="@+id/fragmentContainer" diff --git a/vector/src/main/res/layout/alerter_incoming_call_layout.xml b/vector/src/main/res/layout/alerter_incoming_call_layout.xml index d1d1812d0a..8f737fb085 100644 --- a/vector/src/main/res/layout/alerter_incoming_call_layout.xml +++ b/vector/src/main/res/layout/alerter_incoming_call_layout.xml @@ -22,6 +22,7 @@ <TextView android:id="@+id/incomingCallNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="12dp" @@ -29,7 +30,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/incomingCallRejectView" app:layout_constraintStart_toEndOf="@id/incomingCallAvatar" @@ -38,6 +38,7 @@ <TextView android:id="@+id/incomingCallKindView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="3dp" @@ -46,11 +47,11 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:drawableTint="?vctr_content_secondary" app:layout_constraintEnd_toStartOf="@+id/incomingCallRejectView" app:layout_constraintStart_toStartOf="@id/incomingCallNameView" app:layout_constraintTop_toBottomOf="@id/incomingCallNameView" + tools:drawableStart="@drawable/ic_call_audio_small" tools:text="@string/action_voice_call" /> <ImageView @@ -64,10 +65,12 @@ android:contentDescription="@string/call_notification_answer" android:focusable="true" android:padding="8dp" - android:src="@drawable/ic_call_answer" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:tint="?colorOnPrimary" + tools:ignore="MissingPrefix" + tools:src="@drawable/ic_call_answer" /> <ImageView android:id="@+id/incomingCallRejectView" @@ -83,6 +86,8 @@ android:src="@drawable/ic_call_hangup" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/incomingCallAcceptView" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:tint="?colorOnPrimary" + tools:ignore="MissingPrefix" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/alerter_verification_layout.xml b/vector/src/main/res/layout/alerter_verification_layout.xml index 3db8a3343c..d9c1794a60 100644 --- a/vector/src/main/res/layout/alerter_verification_layout.xml +++ b/vector/src/main/res/layout/alerter_verification_layout.xml @@ -5,24 +5,26 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - tools:background="@android:color/darker_gray" - tools:foreground="?android:attr/selectableItemBackground" + tools:background="?colorPrimary" tools:style="@style/AlertStyle"> - <androidx.appcompat.widget.AppCompatImageView + <ImageView android:id="@+id/ivUserAvatar" android:layout_width="40dp" android:layout_height="40dp" + android:contentDescription="@string/avatar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/alerter_texts" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:src="@sample/user_round_avatars" /> + <!-- Note: this is handled by the Alerter library, it has to be a AppCompatImageView --> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/ivIcon" android:layout_width="24dp" android:layout_height="24dp" + android:importantForAccessibility="no" android:src="@drawable/ic_shield_warning" app:layout_constraintCircle="@+id/ivUserAvatar" app:layout_constraintCircleAngle="135" @@ -40,21 +42,26 @@ app:layout_constraintStart_toEndOf="@id/ivUserAvatar" app:layout_constraintTop_toTopOf="parent"> + <!-- Note: this is handled by the Alerter library, it has to be a AppCompatTextView --> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/tvTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/alerter_padding_half" android:layout_marginEnd="@dimen/alerter_padding_half" android:paddingStart="@dimen/alerter_padding_small" android:paddingEnd="@dimen/alerter_padding_small" - android:textAppearance="@style/AlertTextAppearance.Title" + android:textColor="@android:color/white" + android:textStyle="bold" android:visibility="gone" tools:text="Title" tools:visibility="visible" /> + <!-- Note: this is handled by the Alerter library, it has to be a AppCompatTextView --> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/tvText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/alerter_padding_half" @@ -64,28 +71,11 @@ android:paddingTop="@dimen/alerter_padding_small" android:paddingEnd="@dimen/alerter_padding_small" android:paddingBottom="@dimen/alerter_padding_small" - android:textAppearance="@style/AlertTextAppearance.Text" + android:textColor="@android:color/white" android:visibility="gone" tools:text="Text" tools:visibility="visible" /> </LinearLayout> - <!-- <FrameLayout--> - <!-- android:id="@+id/flRightIconContainer"--> - <!-- android:layout_width="wrap_content"--> - <!-- android:layout_height="wrap_content"--> - <!-- android:layout_gravity="center_vertical">--> - - <!-- <androidx.appcompat.widget.AppCompatImageView--> - <!-- android:id="@+id/ivRightIcon"--> - <!-- android:layout_width="@dimen/alerter_alert_icn_size"--> - <!-- android:layout_height="@dimen/alerter_alert_icn_size"--> - <!-- android:maxWidth="@dimen/alerter_alert_icn_size"--> - <!-- android:maxHeight="@dimen/alerter_alert_icn_size"--> - <!-- android:visibility="gone"--> - <!-- app:srcCompat="@drawable/alerter_ic_notifications"--> - <!-- app:tint="@color/alert_default_icon_color"--> - <!-- tools:visibility="visible" />--> - <!-- </FrameLayout>--> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/bottom_sheet_bootstrap.xml b/vector/src/main/res/layout/bottom_sheet_bootstrap.xml index 08533c5249..52784bc6af 100644 --- a/vector/src/main/res/layout/bottom_sheet_bootstrap.xml +++ b/vector/src/main/res/layout/bottom_sheet_bootstrap.xml @@ -31,17 +31,18 @@ <TextView android:id="@+id/bootstrapTitleText" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:ellipsize="end" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="@id/bootstrapIcon" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/bootstrapIcon" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintTop_toTopOf="@id/bootstrapIcon" tools:text="@string/bottom_sheet_setup_secure_backup_title" /> <androidx.fragment.app.FragmentContainerView diff --git a/vector/src/main/res/layout/bottom_sheet_call_dial_pad.xml b/vector/src/main/res/layout/bottom_sheet_call_dial_pad.xml index 136f98c753..f72fb34bc5 100644 --- a/vector/src/main/res/layout/bottom_sheet_call_dial_pad.xml +++ b/vector/src/main/res/layout/bottom_sheet_call_dial_pad.xml @@ -16,13 +16,13 @@ <TextView android:id="@+id/callDialPadTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center_vertical" android:text="@string/call_dial_pad_title" - android:textColor="?vctr_content_primary" - android:textSize="20sp" /> + android:textColor="?vctr_content_primary" /> <ImageView android:id="@+id/callDialPadClose" diff --git a/vector/src/main/res/layout/bottom_sheet_generic_list_with_title.xml b/vector/src/main/res/layout/bottom_sheet_generic_list_with_title.xml index cb211865b4..065ba48220 100644 --- a/vector/src/main/res/layout/bottom_sheet_generic_list_with_title.xml +++ b/vector/src/main/res/layout/bottom_sheet_generic_list_with_title.xml @@ -9,12 +9,12 @@ <TextView android:id="@+id/bottomSheetTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:padding="8dp" android:textColor="?vctr_content_primary" - android:textSize="16sp" tools:text="@string/reactions" /> <androidx.recyclerview.widget.RecyclerView diff --git a/vector/src/main/res/layout/bottom_sheet_invited_to_space.xml b/vector/src/main/res/layout/bottom_sheet_invited_to_space.xml index dffdfaf1ec..6dbf4d91ee 100644 --- a/vector/src/main/res/layout/bottom_sheet_invited_to_space.xml +++ b/vector/src/main/res/layout/bottom_sheet_invited_to_space.xml @@ -17,9 +17,9 @@ android:orientation="vertical"> <androidx.constraintlayout.widget.ConstraintLayout - android:padding="16dp" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:padding="16dp"> <ImageView android:id="@+id/inviterAvatarImage" @@ -36,6 +36,7 @@ <TextView android:id="@+id/inviterText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -48,6 +49,7 @@ <TextView android:id="@+id/inviterMxid" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" diff --git a/vector/src/main/res/layout/bottom_sheet_logout_and_backup.xml b/vector/src/main/res/layout/bottom_sheet_logout_and_backup.xml index 847fc65837..abda9dfc7c 100644 --- a/vector/src/main/res/layout/bottom_sheet_logout_and_backup.xml +++ b/vector/src/main/res/layout/bottom_sheet_logout_and_backup.xml @@ -11,6 +11,7 @@ android:paddingBottom="8dp"> <TextView + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -18,11 +19,11 @@ android:layout_marginBottom="8dp" android:text="@string/action_sign_out" android:textColor="?vctr_content_primary" - android:textSize="18sp" android:textStyle="bold" /> <TextView android:id="@+id/bottom_sheet_signout_warning_text" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -62,6 +63,7 @@ <TextView android:id="@+id/backupStatusText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" diff --git a/vector/src/main/res/layout/bottom_sheet_room_widget_permission.xml b/vector/src/main/res/layout/bottom_sheet_room_widget_permission.xml index ab61f10f5f..3195877b5b 100644 --- a/vector/src/main/res/layout/bottom_sheet_room_widget_permission.xml +++ b/vector/src/main/res/layout/bottom_sheet_room_widget_permission.xml @@ -11,6 +11,7 @@ <TextView + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -18,19 +19,18 @@ android:layout_marginBottom="8dp" android:text="@string/room_widget_permission_title" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" /> <TextView android:id="@+id/widgetPermissionHeader2" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" android:layout_marginEnd="@dimen/layout_horizontal_margin" android:layout_marginBottom="8dp" android:text="@string/room_widget_permission_added_by" - android:textColor="?vctr_content_secondary" - android:textSize="16sp" /> + android:textColor="?vctr_content_secondary" /> <LinearLayout android:layout_width="match_parent" @@ -57,27 +57,30 @@ <TextView android:id="@+id/widgetPermissionOwnerDisplayName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="18sp" android:textStyle="bold" - tools:text="User name" /> + tools:text="@sample/users.json/data/displayName" /> <TextView android:id="@+id/widgetPermissionOwnerId" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAlignment="center" android:textColor="?vctr_content_secondary" - android:textSize="14sp" - tools:text="\@foo:matrix.org" /> + tools:text="@sample/users.json/data/id" /> + </LinearLayout> + </LinearLayout> <TextView android:id="@+id/widgetPermissionSharedInfo" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -85,7 +88,6 @@ android:layout_marginEnd="@dimen/layout_horizontal_margin" android:layout_marginBottom="8dp" android:textColor="?vctr_content_secondary" - android:textSize="16sp" tools:text="@string/room_widget_permission_shared_info_title" /> <LinearLayout @@ -97,7 +99,7 @@ <Button android:id="@+id/widgetPermissionDecline" - style="@style/VectorButtonStyle.Destructive" + style="@style/Widget.Vector.Button.Destructive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/layout_vertical_margin" @@ -106,7 +108,7 @@ <Button android:id="@+id/widgetPermissionContinue" - style="@style/VectorButtonStyle.Positive" + style="@style/Widget.Vector.Button.Positive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/layout_vertical_margin" diff --git a/vector/src/main/res/layout/bottom_sheet_save_recovery_key.xml b/vector/src/main/res/layout/bottom_sheet_save_recovery_key.xml index 7f1e9be156..5757adea6a 100644 --- a/vector/src/main/res/layout/bottom_sheet_save_recovery_key.xml +++ b/vector/src/main/res/layout/bottom_sheet_save_recovery_key.xml @@ -10,22 +10,22 @@ android:paddingBottom="8dp"> <TextView + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/keys_backup_setup_step3_copy_button_title" android:textAlignment="center" - android:textSize="17sp" android:textStyle="bold" /> <TextView android:id="@+id/keys_backup_recovery_key_text" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="@dimen/layout_horizontal_margin" android:fontFamily="monospace" android:textAlignment="center" - android:textSize="20sp" tools:text="HHWJ Y8DK RDR4\nBQEN FQ4V M4F8\nBQEN FQ4V M4A8" /> <LinearLayout @@ -52,11 +52,12 @@ tools:ignore="MissingPrefix" /> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="@string/keys_backup_setup_step3_share_recovery_file" - android:textSize="17sp" /> + android:textColor="?vctr_content_primary" /> </LinearLayout> @@ -84,11 +85,12 @@ tools:ignore="MissingPrefix" /> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="@string/keys_backup_setup_step3_save_button_title" - android:textSize="17sp" /> + android:textColor="?vctr_content_primary" /> </LinearLayout> diff --git a/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml b/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml new file mode 100644 index 0000000000..6e46c87548 --- /dev/null +++ b/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?colorSurface" + android:orientation="vertical" + android:padding="16dp"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginTop="16dp" + android:layout_marginBottom="12dp" + android:importantForAccessibility="no" + android:src="@drawable/ic_beta_pill" /> + + <TextView + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginBottom="12dp" + android:gravity="center" + android:text="@string/teammate_spaces_arent_quite_ready" + android:textColor="?vctr_content_primary" + android:textStyle="bold" /> + + <TextView + style="@style/Widget.Vector.TextView.Subtitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="20dp" + android:gravity="center" + android:text="@string/teammate_spaces_might_not_join" + android:textColor="?vctr_content_secondary" /> + + <Button + android:id="@+id/continueButton" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/layout_vertical_margin" + android:text="@string/continue_anyway" + android:textAllCaps="true" /> + +</LinearLayout> diff --git a/vector/src/main/res/layout/bottom_sheet_space_invite.xml b/vector/src/main/res/layout/bottom_sheet_space_invite.xml index 10120747cf..03893a45f9 100644 --- a/vector/src/main/res/layout/bottom_sheet_space_invite.xml +++ b/vector/src/main/res/layout/bottom_sheet_space_invite.xml @@ -10,6 +10,7 @@ <TextView android:id="@+id/headerText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" @@ -17,18 +18,17 @@ android:gravity="center" android:text="@string/invite_people_to_your_space" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:textStyle="bold" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/descriptionText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="20dp" android:gravity="center" android:textColor="?vctr_content_secondary" - android:textSize="16sp" app:layout_constraintBottom_toTopOf="@id/joinInfoHelpText" app:layout_constraintTop_toBottomOf="@id/headerText" app:layout_constraintVertical_bias="1" @@ -63,7 +63,7 @@ <!-- <Button--> <!-- android:id="@+id/skipButton"--> - <!-- style="@style/VectorButtonStyleOutlined"--> + <!-- style="@style/Widget.Vector.Button.Outlined"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="wrap_content"--> <!-- android:layout_marginTop="@dimen/layout_vertical_margin"--> diff --git a/vector/src/main/res/layout/bottom_sheet_space_invite_chooser.xml b/vector/src/main/res/layout/bottom_sheet_space_invite_chooser.xml index 5c504bd7c0..d263180521 100644 --- a/vector/src/main/res/layout/bottom_sheet_space_invite_chooser.xml +++ b/vector/src/main/res/layout/bottom_sheet_space_invite_chooser.xml @@ -9,6 +9,7 @@ <TextView android:id="@+id/headerText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" @@ -16,7 +17,6 @@ android:gravity="center" android:text="@string/invite_people_menu" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:textStyle="bold" app:layout_constraintTop_toTopOf="parent" /> diff --git a/vector/src/main/res/layout/bottom_sheet_space_settings.xml b/vector/src/main/res/layout/bottom_sheet_space_settings.xml index c4f2bb924b..2975df65d5 100644 --- a/vector/src/main/res/layout/bottom_sheet_space_settings.xml +++ b/vector/src/main/res/layout/bottom_sheet_space_settings.xml @@ -27,6 +27,7 @@ <TextView android:id="@+id/spaceNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -34,7 +35,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@+id/spaceDescription" @@ -56,6 +56,7 @@ <TextView android:id="@+id/spaceDescription" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -64,7 +65,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/bottom_sheet_verification.xml b/vector/src/main/res/layout/bottom_sheet_verification.xml index f0591c608d..a6c6ded739 100644 --- a/vector/src/main/res/layout/bottom_sheet_verification.xml +++ b/vector/src/main/res/layout/bottom_sheet_verification.xml @@ -38,6 +38,7 @@ <TextView android:id="@+id/otherUserNameText" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -45,8 +46,8 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="@+id/otherUserAvatarImageView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/otherUserAvatarImageView" app:layout_constraintTop_toTopOf="@+id/otherUserAvatarImageView" diff --git a/vector/src/main/res/layout/composer_layout.xml b/vector/src/main/res/layout/composer_layout.xml index 5e40ab275e..2dec5c23c0 100644 --- a/vector/src/main/res/layout/composer_layout.xml +++ b/vector/src/main/res/layout/composer_layout.xml @@ -104,7 +104,7 @@ <im.vector.app.features.home.room.detail.composer.ComposerEditText android:id="@+id/composerEditText" - style="@style/ComposerEditTextStyle" + style="@style/Widget.Vector.EditText.Composer" android:layout_width="0dp" android:layout_height="wrap_content" android:nextFocusLeft="@id/composerEditText" diff --git a/vector/src/main/res/layout/composer_layout_constraint_set_compact.xml b/vector/src/main/res/layout/composer_layout_constraint_set_compact.xml index e429cf7d16..a098606ab9 100644 --- a/vector/src/main/res/layout/composer_layout_constraint_set_compact.xml +++ b/vector/src/main/res/layout/composer_layout_constraint_set_compact.xml @@ -135,7 +135,7 @@ <im.vector.app.features.home.room.detail.composer.ComposerEditText android:id="@+id/composerEditText" - style="@style/ComposerEditTextStyle" + style="@style/Widget.Vector.EditText.Composer" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="@string/room_message_placeholder_not_encrypted" diff --git a/vector/src/main/res/layout/composer_layout_constraint_set_expanded.xml b/vector/src/main/res/layout/composer_layout_constraint_set_expanded.xml index 4c5034ed96..1ef31900f7 100644 --- a/vector/src/main/res/layout/composer_layout_constraint_set_expanded.xml +++ b/vector/src/main/res/layout/composer_layout_constraint_set_expanded.xml @@ -42,6 +42,7 @@ <TextView android:id="@+id/composerRelatedMessageTitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="8dp" @@ -67,6 +68,7 @@ <TextView android:id="@+id/composerRelatedMessageContent" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:ellipsize="end" @@ -145,7 +147,7 @@ <im.vector.app.features.home.room.detail.composer.ComposerEditText android:id="@+id/composerEditText" - style="@style/ComposerEditTextStyle" + style="@style/Widget.Vector.EditText.Composer" android:layout_width="0dp" android:layout_height="wrap_content" android:nextFocusLeft="@id/composerEditText" diff --git a/vector/src/main/res/layout/custom_action_item_layout_badge.xml b/vector/src/main/res/layout/custom_action_item_layout_badge.xml index 05ccbf4c2b..bce8a2ef4e 100644 --- a/vector/src/main/res/layout/custom_action_item_layout_badge.xml +++ b/vector/src/main/res/layout/custom_action_item_layout_badge.xml @@ -24,12 +24,12 @@ <TextView android:id="@+id/cart_badge" - android:layout_width="12dp" - android:layout_height="12dp" + style="@style/Widget.Vector.TextView.Micro" + android:layout_width="14dp" + android:layout_height="14dp" android:background="@drawable/bg_unread_highlight" android:gravity="center" android:textColor="?colorOnError" - android:textSize="8sp" app:layout_constraintCircle="@+id/action_view_icon_image" app:layout_constraintCircleAngle="45" app:layout_constraintCircleRadius="12dp" diff --git a/vector/src/main/res/layout/dialog_background_sync_mode.xml b/vector/src/main/res/layout/dialog_background_sync_mode.xml index 96428ef06f..e065c2d037 100644 --- a/vector/src/main/res/layout/dialog_background_sync_mode.xml +++ b/vector/src/main/res/layout/dialog_background_sync_mode.xml @@ -17,6 +17,7 @@ android:padding="16dp"> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/settings_background_fdroid_sync_mode_battery" @@ -24,6 +25,7 @@ android:textStyle="bold" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="16dp" @@ -41,6 +43,7 @@ android:padding="16dp"> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/settings_background_fdroid_sync_mode_real_time" @@ -48,6 +51,7 @@ android:textStyle="bold" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="16dp" @@ -65,6 +69,7 @@ android:padding="16dp"> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/settings_background_fdroid_sync_mode_disabled" @@ -72,6 +77,7 @@ android:textStyle="bold" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="16dp" diff --git a/vector/src/main/res/layout/dialog_change_password.xml b/vector/src/main/res/layout/dialog_change_password.xml index be58d46bec..b5b7e221bc 100644 --- a/vector/src/main/res/layout/dialog_change_password.xml +++ b/vector/src/main/res/layout/dialog_change_password.xml @@ -9,33 +9,19 @@ android:paddingTop="12dp" android:paddingEnd="?dialogPreferredPadding"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="horizontal"> - - <TextView - style="@style/Base.DialogWindowTitle.AppCompat" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:layout_weight="1" - android:text="@string/settings_change_password" /> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/change_password_show_passwords" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </LinearLayout> + <TextView + style="@style/Base.DialogWindowTitle.AppCompat" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="@string/settings_change_password" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/change_password_old_pwd_til" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/layout_vertical_margin" app:errorEnabled="true"> <com.google.android.material.textfield.TextInputEditText @@ -48,6 +34,7 @@ </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" @@ -62,22 +49,6 @@ </com.google.android.material.textfield.TextInputLayout> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/change_password_confirm_new_pwd_til" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - app:errorEnabled="true"> - - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/change_password_confirm_new_pwd_text" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/settings_confirm_password" - android:inputType="textPassword" /> - - </com.google.android.material.textfield.TextInputLayout> - <ProgressBar android:id="@+id/change_password_loader" android:layout_width="match_parent" diff --git a/vector/src/main/res/layout/dialog_confirmation_with_reason.xml b/vector/src/main/res/layout/dialog_confirmation_with_reason.xml index 677ffe4d7a..421c723d3a 100644 --- a/vector/src/main/res/layout/dialog_confirmation_with_reason.xml +++ b/vector/src/main/res/layout/dialog_confirmation_with_reason.xml @@ -12,6 +12,7 @@ <TextView android:id="@+id/dialogConfirmationText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" diff --git a/vector/src/main/res/layout/dialog_device_verify.xml b/vector/src/main/res/layout/dialog_device_verify.xml index 75255c05d8..bbf346c8dc 100644 --- a/vector/src/main/res/layout/dialog_device_verify.xml +++ b/vector/src/main/res/layout/dialog_device_verify.xml @@ -13,62 +13,64 @@ android:paddingEnd="?dialogPreferredPadding"> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" - android:text="@string/encryption_information_verify_device_warning" - android:textSize="12sp" /> + android:text="@string/encryption_information_verify_device_warning" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="@string/encryption_information_device_name" - android:textSize="12sp" android:textStyle="bold" /> <TextView android:id="@+id/encrypted_device_info_device_name" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textSize="12sp" tools:text="a device name" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="@string/encryption_information_device_id" - android:textSize="12sp" android:textStyle="bold" /> <TextView android:id="@+id/encrypted_device_info_device_id" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textSize="12sp" tools:text="a device id" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="@string/encryption_information_device_key" - android:textSize="12sp" android:textStyle="bold" /> <TextView android:id="@+id/encrypted_device_info_device_key" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textSize="12sp" tools:text="a device key" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" - android:text="@string/encryption_information_verify_device_warning2" - android:textSize="12sp" /> + android:text="@string/encryption_information_verify_device_warning2" /> + </LinearLayout> + </ScrollView> \ No newline at end of file diff --git a/vector/src/main/res/layout/dialog_disclaimer_content.xml b/vector/src/main/res/layout/dialog_disclaimer_content.xml index 7b12194604..38f376e7eb 100644 --- a/vector/src/main/res/layout/dialog_disclaimer_content.xml +++ b/vector/src/main/res/layout/dialog_disclaimer_content.xml @@ -41,17 +41,18 @@ <TextView android:id="@+id/disclaimerTextView" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/disclaimer_title" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/disclaimerIconsLayout" /> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="24dp" @@ -61,7 +62,6 @@ android:paddingBottom="32dp" android:text="@string/disclaimer_content" android:textColor="?vctr_content_secondary" - android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/disclaimerTextView" /> diff --git a/vector/src/main/res/layout/dialog_event_content.xml b/vector/src/main/res/layout/dialog_event_content.xml index c779d37bfc..d3c52a61ed 100644 --- a/vector/src/main/res/layout/dialog_event_content.xml +++ b/vector/src/main/res/layout/dialog_event_content.xml @@ -1,14 +1,18 @@ <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/event_content_text_view" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" - android:textSize="12sp" android:fontFamily="monospace" - android:textIsSelectable="true" /> + android:textColor="?vctr_content_primary" + android:textIsSelectable="true" + tools:text="Event content" /> + </ScrollView> \ No newline at end of file diff --git a/vector/src/main/res/layout/dialog_export_e2e_keys.xml b/vector/src/main/res/layout/dialog_export_e2e_keys.xml index 7a2dafd08e..f9d2f458f2 100644 --- a/vector/src/main/res/layout/dialog_export_e2e_keys.xml +++ b/vector/src/main/res/layout/dialog_export_e2e_keys.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/layout_root" android:layout_width="match_parent" @@ -12,34 +12,19 @@ <TextView android:id="@+id/exportDialogText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/encryption_export_notice" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constraintTop_toTopOf="parent" /> - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/exportDialogShowPassword" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/exportDialogTil" - app:layout_constraintTop_toTopOf="@id/exportDialogTil" - app:tint="?colorSecondary" /> - - <com.google.android.material.textfield.TextInputLayout android:id="@+id/exportDialogTil" - android:layout_width="0dp" + style="@style/Widget.Vector.TextInputLayout.Password" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="8dp" - app:layout_constraintEnd_toStartOf="@+id/exportDialogShowPassword" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/exportDialogText"> + android:layout_marginTop="8dp"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/exportDialogEt" @@ -53,13 +38,11 @@ <com.google.android.material.textfield.TextInputLayout android:id="@+id/exportDialogTilConfirm" - android:layout_width="0dp" + style="@style/Widget.Vector.TextInputLayout.Password" + android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" - app:errorEnabled="true" - app:layout_constraintEnd_toEndOf="@+id/exportDialogTil" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/exportDialogTil"> + app:errorEnabled="true"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/exportDialogEtConfirm" @@ -81,4 +64,4 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/exportDialogTilConfirm" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file +</LinearLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/dialog_import_e2e_keys.xml b/vector/src/main/res/layout/dialog_import_e2e_keys.xml index 3fb9f1bc2c..86de622622 100644 --- a/vector/src/main/res/layout/dialog_import_e2e_keys.xml +++ b/vector/src/main/res/layout/dialog_import_e2e_keys.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/layout_root" android:layout_width="match_parent" android:layout_height="match_parent" + android:orientation="vertical" android:paddingStart="?dialogPreferredPadding" android:paddingTop="12dp" android:paddingEnd="?dialogPreferredPadding" @@ -12,21 +13,20 @@ <TextView android:id="@+id/dialog_e2e_keys_passphrase_filename" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:visibility="gone" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" tools:text="@string/import_e2e_keys_from_file" tools:visibility="visible" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/importDialogTil" - android:layout_width="0dp" + style="@style/Widget.Vector.TextInputLayout.Password" + android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintEnd_toStartOf="@+id/importDialogShowPassword" app:layout_constraintStart_toStartOf="parent" @@ -41,18 +41,6 @@ </com.google.android.material.textfield.TextInputLayout> - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/importDialogShowPassword" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/importDialogTil" - app:layout_constraintTop_toTopOf="@id/importDialogTil" - app:tint="?colorSecondary" /> - <Button android:id="@+id/dialog_e2e_keys_import_button" android:layout_width="wrap_content" @@ -60,8 +48,6 @@ android:layout_gravity="end" android:layout_marginTop="10dp" android:enabled="false" - android:text="@string/encryption_import_import" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/importDialogTil" /> + android:text="@string/encryption_import_import" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file +</LinearLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/dialog_no_sticker_pack.xml b/vector/src/main/res/layout/dialog_no_sticker_pack.xml index 1cf225a30f..27896c070b 100644 --- a/vector/src/main/res/layout/dialog_no_sticker_pack.xml +++ b/vector/src/main/res/layout/dialog_no_sticker_pack.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="match_parent" android:drawablePadding="16dp" diff --git a/vector/src/main/res/layout/dialog_prompt_password.xml b/vector/src/main/res/layout/dialog_prompt_password.xml deleted file mode 100644 index e0e63eebd4..0000000000 --- a/vector/src/main/res/layout/dialog_prompt_password.xml +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingStart="?dialogPreferredPadding" - android:paddingTop="12dp" - android:paddingEnd="?dialogPreferredPadding"> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="6dp" - android:text="@string/devices_delete_dialog_text" - android:textSize="12sp" /> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp"> - - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/promptPasswordTil" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/soft_logout_signin_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> - - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/promptPassword" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" - tools:text="abc" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/promptPasswordPasswordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> - - </LinearLayout> - -</ScrollView> \ No newline at end of file diff --git a/vector/src/main/res/layout/dialog_recovery_key_saved_info.xml b/vector/src/main/res/layout/dialog_recovery_key_saved_info.xml index 85feaf6587..88336b5583 100644 --- a/vector/src/main/res/layout/dialog_recovery_key_saved_info.xml +++ b/vector/src/main/res/layout/dialog_recovery_key_saved_info.xml @@ -34,6 +34,7 @@ <TextView android:id="@+id/bootstrapTitleText" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -42,16 +43,15 @@ android:maxLines="2" android:text="@string/keep_it_safe" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" /> </LinearLayout> <TextView android:id="@+id/keepItSafeText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="?vctr_content_secondary" - android:textSize="16sp" tools:text="@string/bootstrap_crosssigning_save_usb" /> </LinearLayout> diff --git a/vector/src/main/res/layout/dialog_ssl_fingerprint.xml b/vector/src/main/res/layout/dialog_ssl_fingerprint.xml index 0c6fad871e..584db222c0 100644 --- a/vector/src/main/res/layout/dialog_ssl_fingerprint.xml +++ b/vector/src/main/res/layout/dialog_ssl_fingerprint.xml @@ -13,6 +13,7 @@ android:paddingEnd="?dialogPreferredPadding"> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="6dp" @@ -20,6 +21,7 @@ <TextView android:id="@+id/ssl_explanation" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="6dp" @@ -27,6 +29,7 @@ <TextView android:id="@+id/ssl_user_id" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" @@ -34,6 +37,7 @@ <TextView android:id="@+id/ssl_fingerprint_title" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="6dp" @@ -41,12 +45,14 @@ <TextView android:id="@+id/ssl_fingerprint" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="12dp" tools:text="07 89 7A A0 30 82 99 95 E6 17 5D 1F 34 5D 8D 0C 67 82 63 1C 1F 57 20 75 42 91 F7 8B 28 03 54 A2" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="6dp" diff --git a/vector/src/main/res/layout/fragment_attachments_preview.xml b/vector/src/main/res/layout/fragment_attachments_preview.xml index 2eeffb65e1..259ef38924 100644 --- a/vector/src/main/res/layout/fragment_attachments_preview.xml +++ b/vector/src/main/res/layout/fragment_attachments_preview.xml @@ -15,16 +15,24 @@ app:layout_constraintTop_toTopOf="parent" tools:listitem="@layout/item_attachment_big_preview" /> - <androidx.appcompat.widget.Toolbar - android:id="@+id/attachmentPreviewerToolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" + android:layout_height="wrap_content" android:background="#40000000" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:titleTextColor="@android:color/white" - tools:title="Title" /> + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/attachmentPreviewerToolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="@android:color/transparent" + app:titleTextColor="@android:color/white" + tools:title="Title" /> + + </com.google.android.material.appbar.AppBarLayout> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/attachmentPreviewerBottomContainer" diff --git a/vector/src/main/res/layout/fragment_bootstrap_conclusion.xml b/vector/src/main/res/layout/fragment_bootstrap_conclusion.xml index 65de227755..e8d53f3ad5 100644 --- a/vector/src/main/res/layout/fragment_bootstrap_conclusion.xml +++ b/vector/src/main/res/layout/fragment_bootstrap_conclusion.xml @@ -11,6 +11,7 @@ <TextView android:id="@+id/bootstrapConclusionText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -18,7 +19,6 @@ android:layout_marginEnd="16dp" android:text="@string/bootstrap_cross_signing_success" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:layout_constraintTop_toTopOf="parent" /> <Space diff --git a/vector/src/main/res/layout/fragment_bootstrap_enter_account_password.xml b/vector/src/main/res/layout/fragment_bootstrap_enter_account_password.xml index ec42481902..aed72d3183 100644 --- a/vector/src/main/res/layout/fragment_bootstrap_enter_account_password.xml +++ b/vector/src/main/res/layout/fragment_bootstrap_enter_account_password.xml @@ -9,23 +9,24 @@ <TextView android:id="@+id/bootstrapDescriptionText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:layout_constraintBottom_toTopOf="@id/bootstrapAccountPasswordTil" app:layout_constraintTop_toTopOf="parent" tools:text="@string/enter_account_password" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/bootstrapAccountPasswordTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" app:errorEnabled="true" app:layout_constraintBottom_toTopOf="@+id/bootstrapPasswordButton" - app:layout_constraintEnd_toStartOf="@id/ssss_view_show_password" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/bootstrapDescriptionText"> @@ -36,29 +37,13 @@ android:imeOptions="actionDone" android:maxLines="3" android:singleLine="false" - tools:hint="@string/passphrase_enter_passphrase" - tools:inputType="textPassword" /> + tools:hint="@string/passphrase_enter_passphrase" /> </com.google.android.material.textfield.TextInputLayout> - <ImageView - android:id="@+id/ssss_view_show_password" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:contentDescription="@string/a11y_show_password" - android:scaleType="center" - android:src="@drawable/ic_eye" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/bootstrapAccountPasswordTil" - app:layout_constraintTop_toTopOf="@+id/bootstrapAccountPasswordTil" - app:tint="?colorSecondary" - tools:ignore="MissingPrefix" /> - <Button android:id="@+id/bootstrapPasswordButton" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" diff --git a/vector/src/main/res/layout/fragment_bootstrap_enter_passphrase.xml b/vector/src/main/res/layout/fragment_bootstrap_enter_passphrase.xml index 447286f0a4..942a1a7e00 100644 --- a/vector/src/main/res/layout/fragment_bootstrap_enter_passphrase.xml +++ b/vector/src/main/res/layout/fragment_bootstrap_enter_passphrase.xml @@ -8,22 +8,23 @@ <TextView android:id="@+id/bootstrapDescriptionText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="@string/bootstrap_info_text_2" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:layout_constraintBottom_toTopOf="@id/ssss_passphrase_enter_til" app:layout_constraintTop_toTopOf="parent" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/ssss_passphrase_enter_til" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" app:errorEnabled="true" - app:layout_constraintEnd_toStartOf="@id/ssss_view_show_password" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/bootstrapDescriptionText"> @@ -34,8 +35,7 @@ android:imeOptions="actionDone" android:maxLines="3" android:singleLine="false" - tools:hint="@string/passphrase_enter_passphrase" - tools:inputType="textPassword" /> + tools:hint="@string/passphrase_enter_passphrase" /> <!-- This is inside the TIL, if not the keyboard will hide it when in bottomsheet --> @@ -48,6 +48,7 @@ <TextView android:id="@+id/bootstrapWarningInfo" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" @@ -55,27 +56,15 @@ android:drawablePadding="4dp" android:gravity="center_vertical" android:text="@string/bootstrap_dont_reuse_pwd" - android:textSize="12sp" + android:textColor="?vctr_content_primary" app:drawableStartCompat="@drawable/ic_alert_triangle" app:drawableTint="?colorError" /> </com.google.android.material.textfield.TextInputLayout> - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/ssss_view_show_password" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/ssss_passphrase_enter_til" - app:layout_constraintTop_toTopOf="@+id/ssss_passphrase_enter_til" - app:tint="?colorSecondary" /> - <Button android:id="@+id/bootstrapSubmit" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/_continue" diff --git a/vector/src/main/res/layout/fragment_bootstrap_migrate_backup.xml b/vector/src/main/res/layout/fragment_bootstrap_migrate_backup.xml index f3fdc8c7f6..1e6b1b6ddb 100644 --- a/vector/src/main/res/layout/fragment_bootstrap_migrate_backup.xml +++ b/vector/src/main/res/layout/fragment_bootstrap_migrate_backup.xml @@ -9,23 +9,24 @@ <TextView android:id="@+id/bootstrapDescriptionText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:layout_constraintBottom_toTopOf="@id/bootstrapRecoveryKeyEnterTil" app:layout_constraintTop_toTopOf="parent" tools:text="@string/bootstrap_enter_recovery" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/bootstrapRecoveryKeyEnterTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginBottom="8dp" app:errorEnabled="true" - app:layout_constraintEnd_toStartOf="@id/bootstrapMigrateShowPassword" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/bootstrapDescriptionText"> @@ -36,20 +37,21 @@ android:imeOptions="actionDone" android:maxLines="3" android:singleLine="false" - tools:hint="@string/keys_backup_restore_key_enter_hint" - tools:inputType="textPassword" /> + tools:hint="@string/keys_backup_restore_key_enter_hint" /> <Button android:id="@+id/bootstrapMigrateUseFile" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/use_file" app:icon="@drawable/ic_file" + tools:ignore="MissingPrefix" tools:visibility="visible" /> <TextView android:id="@+id/bootstrapMigrateForgotPassphrase" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" @@ -58,21 +60,9 @@ </com.google.android.material.textfield.TextInputLayout> - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/bootstrapMigrateShowPassword" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/bootstrapRecoveryKeyEnterTil" - app:layout_constraintTop_toTopOf="@+id/bootstrapRecoveryKeyEnterTil" - app:tint="?colorSecondary" /> - <Button android:id="@+id/bootstrapMigrateContinueButton" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" diff --git a/vector/src/main/res/layout/fragment_bootstrap_reauth.xml b/vector/src/main/res/layout/fragment_bootstrap_reauth.xml index b5ee58c614..bb527db292 100644 --- a/vector/src/main/res/layout/fragment_bootstrap_reauth.xml +++ b/vector/src/main/res/layout/fragment_bootstrap_reauth.xml @@ -9,11 +9,11 @@ <TextView android:id="@+id/bootstrapDescriptionText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:layout_constraintBottom_toTopOf="@id/waitingProgress" app:layout_constraintTop_toTopOf="parent" tools:text="@string/re_authentication_activity_title" /> @@ -28,19 +28,19 @@ <TextView android:id="@+id/reAuthFailureText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="?colorError" - android:textSize="14sp" app:layout_constraintBottom_toTopOf="@id/buttonFlow" - app:layout_constraintVertical_chainStyle="packed" app:layout_constraintTop_toBottomOf="@id/waitingProgress" + app:layout_constraintVertical_chainStyle="packed" tools:text="Authentication failed" /> <Button android:id="@+id/bootstrapCancelButton" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" @@ -49,7 +49,7 @@ <Button android:id="@+id/bootstrapRetryButton" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" @@ -62,7 +62,7 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" app:constraint_referenced_ids="bootstrapCancelButton, bootstrapRetryButton" - app:layout_constraintTop_toBottomOf="@id/reAuthFailureText" - app:layout_constraintBottom_toBottomOf="parent" /> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/reAuthFailureText" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/fragment_bootstrap_save_key.xml b/vector/src/main/res/layout/fragment_bootstrap_save_key.xml index a4b6ae6b8d..d7c26a316a 100644 --- a/vector/src/main/res/layout/fragment_bootstrap_save_key.xml +++ b/vector/src/main/res/layout/fragment_bootstrap_save_key.xml @@ -10,17 +10,18 @@ <TextView android:id="@+id/bootstrapSaveText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:layout_marginEnd="16dp" android:text="@string/bottom_sheet_save_your_recovery_key_content" - android:textColor="?vctr_content_primary" - android:textSize="14sp" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/bootstrapRecoveryKeyText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" @@ -29,7 +30,6 @@ android:gravity="center_horizontal" android:padding="4dp" android:textColor="?vctr_notice_secondary" - android:textSize="15sp" tools:text="HHWJ Y8DK RDR4\nBQEN FQ4V M4F8\nBQEN FQ4V M4A8" /> diff --git a/vector/src/main/res/layout/fragment_bootstrap_setup_recovery.xml b/vector/src/main/res/layout/fragment_bootstrap_setup_recovery.xml index c05b5f8d1c..32bee53581 100644 --- a/vector/src/main/res/layout/fragment_bootstrap_setup_recovery.xml +++ b/vector/src/main/res/layout/fragment_bootstrap_setup_recovery.xml @@ -10,14 +10,14 @@ <TextView android:id="@+id/bootstrapSetupSecureText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:layout_marginEnd="16dp" android:text="@string/bottom_sheet_setup_secure_backup_subtitle" - android:textColor="?vctr_content_primary" - android:textSize="14sp" /> + android:textColor="?vctr_content_primary" /> <View android:layout_width="match_parent" @@ -43,8 +43,8 @@ app:actionDescription="@string/bottom_sheet_setup_secure_backup_security_key_subtitle" app:actionTitle="@string/bottom_sheet_setup_secure_backup_security_key_title" app:leftIcon="@drawable/ic_security_key_24dp" - app:tint="?vctr_content_primary" app:rightIcon="@drawable/ic_arrow_right" + app:tint="?vctr_content_primary" tools:visibility="visible" /> <View @@ -64,8 +64,8 @@ app:actionDescription="@string/bottom_sheet_setup_secure_backup_security_phrase_subtitle" app:actionTitle="@string/bottom_sheet_setup_secure_backup_security_phrase_title" app:leftIcon="@drawable/ic_security_phrase_24dp" - app:tint="?vctr_content_primary" app:rightIcon="@drawable/ic_arrow_right" + app:tint="?vctr_content_primary" tools:visibility="visible" /> <View @@ -75,16 +75,16 @@ <TextView android:id="@+id/bootstrapSetupWarningTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" - android:layout_marginBottom="16dp" android:layout_marginEnd="16dp" + android:layout_marginBottom="16dp" + android:drawablePadding="4dp" android:text="@string/reset_secure_backup_warning" android:textColor="?colorError" - android:drawablePadding="4dp" - android:textSize="14sp" app:drawableStartCompat="@drawable/ic_warning_badge" /> </LinearLayout> diff --git a/vector/src/main/res/layout/fragment_bootstrap_waiting.xml b/vector/src/main/res/layout/fragment_bootstrap_waiting.xml index 0aad3b1a10..ee411a94d6 100644 --- a/vector/src/main/res/layout/fragment_bootstrap_waiting.xml +++ b/vector/src/main/res/layout/fragment_bootstrap_waiting.xml @@ -10,12 +10,12 @@ <TextView android:id="@+id/bootstrapDescriptionText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="@string/bootstrap_loading_text" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:layout_constraintTop_toTopOf="parent" /> <ProgressBar @@ -28,12 +28,12 @@ <TextView android:id="@+id/bootstrapLoadingStatusText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/bootstrapWaitingProgress" tools:text="Bending the spoon..." /> diff --git a/vector/src/main/res/layout/fragment_contacts_book.xml b/vector/src/main/res/layout/fragment_contacts_book.xml index b4248514eb..9c704f3a42 100644 --- a/vector/src/main/res/layout/fragment_contacts_book.xml +++ b/vector/src/main/res/layout/fragment_contacts_book.xml @@ -10,118 +10,99 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/phoneBookToolbar" - android:layout_width="0dp" - android:layout_height="?actionBarSize" - android:elevation="4dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.constraintlayout.widget.ConstraintLayout + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/phoneBookToolbar" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="?actionBarSize"> - <ImageView - android:id="@+id/phoneBookClose" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:clickable="true" - android:contentDescription="@string/action_close" - android:focusable="true" - android:foreground="?attr/selectableItemBackground" - android:scaleType="center" - android:src="@drawable/ic_x_18dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> - <TextView - android:id="@+id/phoneBookTitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:text="@string/contacts_book_title" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - android:textStyle="bold" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/phoneBookClose" - app:layout_constraintTop_toTopOf="parent" /> + <ImageView + android:id="@+id/phoneBookClose" + android:layout_width="@dimen/layout_touch_size" + android:layout_height="@dimen/layout_touch_size" + android:clickable="true" + android:contentDescription="@string/action_close" + android:focusable="true" + android:foreground="?attr/selectableItemBackground" + android:scaleType="center" + android:src="@drawable/ic_x_18dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/phoneBookTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:text="@string/contacts_book_title" + android:textColor="?vctr_content_primary" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/phoneBookClose" + app:layout_constraintTop_toTopOf="parent" /> - </androidx.appcompat.widget.Toolbar> + </androidx.constraintlayout.widget.ConstraintLayout> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/phoneBookFilterContainer" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:layout_marginTop="16dp" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/phoneBookToolbar"> + </com.google.android.material.appbar.MaterialToolbar> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/phoneBookFilter" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/phoneBookFilterContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/search" /> + android:layout_marginStart="@dimen/layout_horizontal_margin" + android:layout_marginTop="16dp" + android:layout_marginEnd="@dimen/layout_horizontal_margin"> - </com.google.android.material.textfield.TextInputLayout> + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/phoneBookFilter" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/search" /> - <CheckBox - android:id="@+id/phoneBookOnlyBoundContacts" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:layout_marginTop="4dp" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - android:text="@string/matrix_only_filter" - android:visibility="gone" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/phoneBookFilterContainer" - tools:visibility="visible" /> + </com.google.android.material.textfield.TextInputLayout> - <Button - android:id="@+id/phoneBookSearchForMatrixContacts" - style="@style/VectorButtonStyleText" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:layout_marginTop="4dp" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - android:text="@string/phone_book_perform_lookup" - android:visibility="gone" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/phoneBookFilterContainer" - tools:visibility="visible" /> + <CheckBox + android:id="@+id/phoneBookOnlyBoundContacts" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/layout_horizontal_margin" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/layout_horizontal_margin" + android:text="@string/matrix_only_filter" + android:visibility="gone" + tools:visibility="visible" /> - <androidx.constraintlayout.widget.Barrier - android:id="@+id/phoneBookBottomBarrier" - android:layout_width="0dp" - android:layout_height="0dp" - app:barrierDirection="bottom" - app:constraint_referenced_ids="phoneBookSearchForMatrixContacts,phoneBookOnlyBoundContacts" /> + <Button + android:id="@+id/phoneBookSearchForMatrixContacts" + style="@style/Widget.Vector.Button.Text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/layout_horizontal_margin" + android:layout_marginTop="4dp" + android:layout_marginEnd="@dimen/layout_horizontal_margin" + android:text="@string/phone_book_perform_lookup" + android:visibility="gone" + tools:visibility="visible" /> - <View - android:id="@+id/phoneBookFilterDivider" - android:layout_width="0dp" - android:layout_height="1dp" - android:layout_marginTop="4dp" - android:background="?vctr_list_separator" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/phoneBookBottomBarrier" /> + </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/phoneBookRecyclerView" @@ -133,7 +114,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/phoneBookFilterDivider" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" tools:listitem="@layout/item_contact_main" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/fragment_create_direct_room_directory_users.xml b/vector/src/main/res/layout/fragment_create_direct_room_directory_users.xml index 574a191e55..130186deed 100644 --- a/vector/src/main/res/layout/fragment_create_direct_room_directory_users.xml +++ b/vector/src/main/res/layout/fragment_create_direct_room_directory_users.xml @@ -10,96 +10,89 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/createRoomToolbar" - android:layout_width="0dp" - android:layout_height="?actionBarSize" - android:elevation="4dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.constraintlayout.widget.ConstraintLayout + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/createRoomToolbar" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="?actionBarSize"> - <ImageView - android:id="@+id/createDirectRoomClose" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:clickable="true" - android:contentDescription="@string/action_close" - android:focusable="true" - android:foreground="?attr/selectableItemBackground" - android:scaleType="center" - android:src="@drawable/ic_x_18dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> - <TextView - android:id="@+id/createDirectRoomTitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:text="@string/direct_chats_header" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - android:textStyle="bold" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/createDirectRoomClose" - app:layout_constraintTop_toTopOf="parent" /> + <ImageView + android:id="@+id/createDirectRoomClose" + android:layout_width="@dimen/layout_touch_size" + android:layout_height="@dimen/layout_touch_size" + android:clickable="true" + android:contentDescription="@string/action_close" + android:focusable="true" + android:foreground="?attr/selectableItemBackground" + android:scaleType="center" + android:src="@drawable/ic_x_18dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/createDirectRoomTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:text="@string/direct_chats_header" + android:textColor="?vctr_content_primary" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/createDirectRoomClose" + app:layout_constraintTop_toTopOf="parent" /> - </androidx.appcompat.widget.Toolbar> + </androidx.constraintlayout.widget.ConstraintLayout> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/createDirectRoomSearchByIdContainer" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:layout_marginTop="16dp" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/createRoomToolbar"> + </com.google.android.material.appbar.MaterialToolbar> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/createDirectRoomSearchById" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/createDirectRoomSearchByIdContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/add_by_matrix_id" /> + android:layout_marginStart="@dimen/layout_horizontal_margin" + android:layout_marginTop="16dp" + android:layout_marginEnd="@dimen/layout_horizontal_margin" + android:layout_marginBottom="16dp"> - </com.google.android.material.textfield.TextInputLayout> + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/createDirectRoomSearchById" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/add_by_matrix_id" /> - <View - android:id="@+id/createDirectRoomFilterDivider" - android:layout_width="0dp" - android:layout_height="1dp" - android:layout_marginTop="16dp" - android:background="?vctr_list_separator" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/createDirectRoomSearchByIdContainer" /> + </com.google.android.material.textfield.TextInputLayout> + + </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/createDirectRoomRecyclerView" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginTop="16dp" android:fastScrollEnabled="true" android:overScrollMode="always" android:scrollbars="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/createDirectRoomFilterDivider" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" tools:listitem="@layout/item_create_direct_room_user" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/fragment_create_room.xml b/vector/src/main/res/layout/fragment_create_room.xml index 6288273d8c..a41256711e 100644 --- a/vector/src/main/res/layout/fragment_create_room.xml +++ b/vector/src/main/res/layout/fragment_create_room.xml @@ -10,52 +10,57 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - <androidx.appcompat.widget.Toolbar - android:id="@+id/createRoomToolbar" - android:layout_width="0dp" - android:layout_height="?actionBarSize" - android:elevation="4dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.constraintlayout.widget.ConstraintLayout + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/createRoomToolbar" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="?actionBarSize"> - <ImageView - android:id="@+id/createRoomClose" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:contentDescription="@string/action_close" - android:scaleType="center" - android:src="@drawable/ic_x_18dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> - <TextView - android:id="@+id/createRoomTitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:text="@string/create_room_title" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - android:textStyle="bold" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/createRoomClose" - app:layout_constraintTop_toTopOf="parent" /> + <ImageView + android:id="@+id/createRoomClose" + android:layout_width="@dimen/layout_touch_size" + android:layout_height="@dimen/layout_touch_size" + android:contentDescription="@string/action_close" + android:scaleType="center" + android:src="@drawable/ic_x_18dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/createRoomTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:text="@string/create_room_title" + android:textColor="?vctr_content_primary" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/createRoomClose" + app:layout_constraintTop_toTopOf="parent" /> - </androidx.appcompat.widget.Toolbar> + </androidx.constraintlayout.widget.ConstraintLayout> + + </com.google.android.material.appbar.MaterialToolbar> + + </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/createRoomForm" @@ -64,7 +69,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/createRoomToolbar" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" tools:listitem="@layout/item_form_switch" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/fragment_deactivate_account.xml b/vector/src/main/res/layout/fragment_deactivate_account.xml index dcade54896..458d338986 100644 --- a/vector/src/main/res/layout/fragment_deactivate_account.xml +++ b/vector/src/main/res/layout/fragment_deactivate_account.xml @@ -11,6 +11,7 @@ <TextView android:id="@+id/deactivateAccountContent" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/deactivate_account_content" @@ -32,7 +33,7 @@ <Button android:id="@+id/deactivateAccountSubmit" - style="@style/VectorButtonStyle.Destructive" + style="@style/Widget.Vector.Button.Destructive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" diff --git a/vector/src/main/res/layout/fragment_devtool_keyrequests.xml b/vector/src/main/res/layout/fragment_devtool_keyrequests.xml index dd0cbff1b1..67fcfebfa1 100644 --- a/vector/src/main/res/layout/fragment_devtool_keyrequests.xml +++ b/vector/src/main/res/layout/fragment_devtool_keyrequests.xml @@ -15,20 +15,20 @@ app:tabMode="scrollable" /> <androidx.viewpager2.widget.ViewPager2 - app:layout_constraintTop_toBottomOf="@id/devToolKeyRequestTabs" - app:layout_constraintBottom_toBottomOf="parent" android:id="@+id/devToolKeyRequestPager" android:layout_width="match_parent" - android:layout_height="0dp" /> + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/devToolKeyRequestTabs" /> <ProgressBar android:id="@+id/exportWaitingView" - android:visibility="gone" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" android:layout_width="40dp" - android:layout_height="40dp"/> + android:layout_height="40dp" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_devtools_editor.xml b/vector/src/main/res/layout/fragment_devtools_editor.xml index fd657555bc..b3fe9834d7 100644 --- a/vector/src/main/res/layout/fragment_devtools_editor.xml +++ b/vector/src/main/res/layout/fragment_devtools_editor.xml @@ -13,7 +13,6 @@ android:hint="@string/dev_tools_event_content_hint" android:inputType="textMultiLine" android:scrollHorizontally="true" - android:textSize="12sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/vector/src/main/res/layout/fragment_home_detail.xml b/vector/src/main/res/layout/fragment_home_detail.xml index 7ddffb2a77..cf744712ab 100644 --- a/vector/src/main/res/layout/fragment_home_detail.xml +++ b/vector/src/main/res/layout/fragment_home_detail.xml @@ -1,108 +1,112 @@ <?xml version="1.0" encoding="utf-8"?> - <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/groupToolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:elevation="4dp" - app:layout_constraintEnd_toEndOf="parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <LinearLayout + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/groupToolbar" android:layout_width="match_parent" - android:layout_height="match_parent" - android:baselineAligned="false" - android:gravity="center_vertical" - android:orientation="horizontal"> - - <RelativeLayout - android:id="@+id/groupToolbarAvatarImageView" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" - android:contentDescription="@string/a11y_open_drawer" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <ImageView - android:layout_width="28dp" - android:layout_height="28dp" - android:layout_centerVertical="true" - android:layout_marginStart="4dp" - android:importantForAccessibility="no" - android:src="@drawable/ic_space_icons" - app:tint="?vctr_content_secondary" - tools:ignore="MissingPrefix" /> - - <im.vector.app.features.home.room.list.UnreadCounterBadgeView - android:id="@+id/drawerUnreadCounterBadgeView" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:layout_alignParentEnd="true" - android:layout_marginEnd="0dp" - android:gravity="center" - android:minWidth="16dp" - android:minHeight="16dp" - android:paddingStart="4dp" - android:paddingEnd="4dp" - android:textColor="?colorOnError" - android:textSize="10sp" - android:visibility="gone" - tools:background="@drawable/bg_unread_highlight" - tools:text="4" - tools:visibility="visible" /> - </RelativeLayout> + android:layout_height="?attr/actionBarSize"> <LinearLayout - android:id="@+id/homeToolbarContent" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="start" - android:orientation="vertical" - android:paddingStart="8dp" - android:paddingEnd="8dp"> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:baselineAligned="false" + android:gravity="center_vertical" + android:orientation="horizontal"> - <TextView - android:id="@+id/groupToolbarTitleView" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ellipsize="end" - android:gravity="start" - android:maxLines="1" - android:textColor="?vctr_content_primary" - android:textSize="20sp" - android:textStyle="bold" - tools:text="@tools:sample/lorem/random" /> + <RelativeLayout + android:id="@+id/groupToolbarAvatarImageView" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:contentDescription="@string/a11y_open_drawer" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - <TextView - android:id="@+id/groupToolbarSpaceTitleView" - android:layout_width="wrap_content" + <ImageView + android:layout_width="28dp" + android:layout_height="28dp" + android:layout_centerVertical="true" + android:layout_marginStart="4dp" + android:importantForAccessibility="no" + android:src="@drawable/ic_space_icons" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> + + <im.vector.app.features.home.room.list.UnreadCounterBadgeView + android:id="@+id/drawerUnreadCounterBadgeView" + style="@style/Widget.Vector.TextView.Micro" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_alignParentEnd="true" + android:layout_marginEnd="0dp" + android:gravity="center" + android:minWidth="16dp" + android:minHeight="16dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" + android:textColor="?colorOnError" + android:visibility="gone" + tools:background="@drawable/bg_unread_highlight" + tools:text="4" + tools:visibility="visible" /> + + </RelativeLayout> + + <LinearLayout + android:id="@+id/homeToolbarContent" + android:layout_width="0dp" android:layout_height="wrap_content" - android:ellipsize="end" + android:layout_weight="1" android:gravity="start" - android:maxLines="1" - android:textColor="?vctr_content_primary" - android:textSize="14sp" - android:visibility="gone" - tools:text="@tools:sample/lorem/random" - tools:visibility="visible" /> + android:orientation="vertical" + android:paddingStart="8dp" + android:paddingEnd="8dp"> + + <TextView + android:id="@+id/groupToolbarTitleView" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="end" + android:gravity="start" + android:maxLines="1" + android:textColor="?vctr_content_primary" + android:textStyle="bold" + tools:text="@tools:sample/lorem/random" /> + + <TextView + android:id="@+id/groupToolbarSpaceTitleView" + style="@style/Widget.Vector.TextView.Subtitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:ellipsize="end" + android:gravity="start" + android:maxLines="1" + android:textColor="?vctr_content_primary" + android:visibility="gone" + tools:text="@tools:sample/lorem/random" + tools:visibility="visible" /> + + </LinearLayout> </LinearLayout> + </com.google.android.material.appbar.MaterialToolbar> - </LinearLayout> - - </androidx.appcompat.widget.Toolbar> + </com.google.android.material.appbar.AppBarLayout> <im.vector.app.features.sync.widget.SyncStateView android:id="@+id/syncStateView" @@ -110,7 +114,7 @@ android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/groupToolbar" /> + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" /> <im.vector.app.core.ui.views.KeysBackupBanner android:id="@+id/homeKeysBackupBanner" @@ -136,7 +140,6 @@ android:id="@+id/roomListContainer" android:layout_width="match_parent" android:layout_height="0dp" - android:background="?vctr_list_separator_system" app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView" app:layout_constraintTop_toBottomOf="@+id/activeCallView" /> @@ -165,10 +168,6 @@ android:id="@+id/bottomNavigationView" android:layout_width="0dp" android:layout_height="wrap_content" - android:background="?vctr_system" - app:itemIconSize="20dp" - app:itemIconTint="@color/bottom_navigation_icon_tint_selector" - app:labelVisibilityMode="unlabeled" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/layout/fragment_home_drawer.xml b/vector/src/main/res/layout/fragment_home_drawer.xml index 9133dd8d86..d1af004490 100644 --- a/vector/src/main/res/layout/fragment_home_drawer.xml +++ b/vector/src/main/res/layout/fragment_home_drawer.xml @@ -12,28 +12,14 @@ android:id="@+id/homeDrawerHeader" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?vctr_home_drawer_header_background" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - <ImageView - android:id="@+id/homeDrawerHeaderDebugView" - style="@style/VectorDebug" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:importantForAccessibility="no" - android:scaleType="center" - android:src="@drawable/ic_settings_x" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:tint="?colorPrimary" - tools:ignore="MissingPrefix" /> - <ImageView android:id="@+id/homeDrawerHeaderAvatarView" - android:layout_width="50dp" - android:layout_height="50dp" + android:layout_width="40dp" + android:layout_height="40dp" android:layout_marginStart="@dimen/layout_horizontal_margin" android:layout_marginTop="24dp" android:contentDescription="@string/avatar" @@ -44,84 +30,95 @@ <TextView android:id="@+id/homeDrawerUsernameView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="16dp" + android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:maxLines="1" android:singleLine="true" android:textColor="?vctr_content_primary" - android:textSize="15sp" + app:layout_constraintBottom_toTopOf="@+id/homeDrawerUserIdView" app:layout_constraintEnd_toStartOf="@+id/homeDrawerQRCodeButton" - app:layout_constraintStart_toStartOf="@+id/homeDrawerHeaderAvatarView" - app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeaderAvatarView" + app:layout_constraintStart_toEndOf="@+id/homeDrawerHeaderAvatarView" + app:layout_constraintTop_toTopOf="@+id/homeDrawerHeaderAvatarView" + app:layout_constraintVertical_chainStyle="packed" tools:text="@sample/users.json/data/displayName" /> <TextView android:id="@+id/homeDrawerUserIdView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginTop="4dp" android:layout_marginEnd="8dp" android:maxLines="1" android:singleLine="true" android:textColor="?vctr_content_secondary" - android:textSize="15sp" - app:layout_constraintBottom_toTopOf="@+id/homeDrawerInviteFriendButton" + app:layout_constraintBottom_toBottomOf="@+id/homeDrawerHeaderAvatarView" app:layout_constraintEnd_toStartOf="@+id/homeDrawerQRCodeButton" - app:layout_constraintStart_toStartOf="@+id/homeDrawerHeaderAvatarView" + app:layout_constraintStart_toStartOf="@+id/homeDrawerUsernameView" app:layout_constraintTop_toBottomOf="@+id/homeDrawerUsernameView" tools:text="@sample/users.json/data/id" /> - <Button + <ImageView android:id="@+id/homeDrawerQRCodeButton" - style="@style/Widget.MaterialComponents.Button.Icon" - android:layout_width="34dp" - android:layout_height="34dp" - android:layout_marginTop="2dp" + android:layout_width="@dimen/layout_touch_size" + android:layout_height="@dimen/layout_touch_size" android:layout_marginEnd="@dimen/layout_horizontal_margin" - android:backgroundTint="?colorSurface" - android:elevation="0dp" - android:insetLeft="0dp" - android:insetTop="0dp" - android:insetRight="0dp" - android:insetBottom="0dp" - android:padding="0dp" + android:contentDescription="@string/qr_code" android:rotationY="@integer/rtl_mirror_flip" - app:cornerRadius="17dp" - app:icon="@drawable/ic_qr_code_add" - app:iconGravity="textStart" - app:iconPadding="0dp" - app:iconSize="20dp" - app:iconTint="?colorPrimary" + android:scaleType="center" + android:src="@drawable/ic_qr_code_add" + app:layout_constraintBottom_toBottomOf="@id/homeDrawerHeaderAvatarView" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="@id/homeDrawerUsernameView" /> + app:layout_constraintTop_toTopOf="@id/homeDrawerHeaderAvatarView" + app:tint="?vctr_content_tertiary" + tools:ignore="MissingPrefix" /> <Button android:id="@+id/homeDrawerInviteFriendButton" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="36dp" - android:layout_marginStart="@dimen/layout_horizontal_margin" android:layout_marginTop="8dp" - android:layout_marginEnd="@dimen/layout_horizontal_margin" android:layout_marginBottom="8dp" android:gravity="center" android:insetTop="0dp" android:insetBottom="0dp" android:padding="0dp" android:text="@string/invite_friends" - android:textSize="13sp" + android:textAllCaps="false" app:icon="@drawable/ic_share" app:iconGravity="textStart" app:iconSize="20dp" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="@+id/homeDrawerHeaderAvatarView" + app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeaderAvatarView" + tools:ignore="MissingPrefix" /> + + <ImageView + android:id="@+id/homeDrawerHeaderDebugView" + style="@style/VectorDebug" + android:layout_width="@dimen/layout_touch_size" + android:layout_height="@dimen/layout_touch_size" + android:importantForAccessibility="no" + android:scaleType="center" + android:src="@drawable/ic_settings_x" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/homeDrawerUserIdView" /> + app:tint="?colorPrimary" + tools:ignore="MissingPrefix" /> </androidx.constraintlayout.widget.ConstraintLayout> + <View + android:id="@+id/homeDrawerHeaderSeparator" + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="?vctr_list_separator" + app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeader" /> + <androidx.fragment.app.FragmentContainerView android:id="@+id/homeDrawerGroupListContainer" android:layout_width="0dp" @@ -130,17 +127,18 @@ app:layout_constraintBottom_toTopOf="@+id/homeDrawerBottomSeparator" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeader" /> + app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeaderSeparator" /> <View android:id="@+id/homeDrawerBottomSeparator" android:layout_width="match_parent" android:layout_height="1dp" - android:background="?vctr_list_separator_on_surface" + android:background="?vctr_list_separator" app:layout_constraintBottom_toTopOf="@+id/homeDrawerHeaderSettingsView" /> <TextView android:id="@+id/homeDrawerHeaderSettingsView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="?attr/selectableItemBackground" @@ -150,15 +148,16 @@ android:minHeight="52dp" android:padding="16dp" android:text="@string/settings" - android:textSize="14sp" - android:tint="?vctr_content_secondary" app:drawableStartCompat="@drawable/ic_settings_18dp" app:drawableTint="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintStart_toStartOf="parent" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> <TextView android:id="@+id/homeDrawerHeaderSignoutView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="?attr/selectableItemBackground" @@ -168,11 +167,11 @@ android:minHeight="52dp" android:padding="16dp" android:text="@string/logout" - android:textSize="14sp" - android:tint="?vctr_content_secondary" app:drawableStartCompat="@drawable/ic_signout_18dp" app:drawableTint="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_incoming_share.xml b/vector/src/main/res/layout/fragment_incoming_share.xml index a9351b545f..ee92e7c353 100644 --- a/vector/src/main/res/layout/fragment_incoming_share.xml +++ b/vector/src/main/res/layout/fragment_incoming_share.xml @@ -10,24 +10,28 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/incomingShareToolbar" - android:layout_width="0dp" - android:layout_height="?attr/actionBarSize" - app:contentInsetStart="0dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.appcompat.widget.SearchView - android:id="@+id/incomingShareSearchView" - style="@style/VectorSearchView" + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/incomingShareToolbar" android:layout_width="match_parent" - android:layout_height="wrap_content" - app:queryHint="@string/room_filtering_filter_hint" - app:searchIcon="@drawable/ic_filter" /> + android:layout_height="?attr/actionBarSize" + app:contentInsetStart="0dp"> - </androidx.appcompat.widget.Toolbar> + <androidx.appcompat.widget.SearchView + android:id="@+id/incomingShareSearchView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:queryHint="@string/room_filtering_filter_hint" + app:searchIcon="@drawable/ic_filter" /> + + </com.google.android.material.appbar.MaterialToolbar> + + </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/incomingShareRoomList" @@ -36,7 +40,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/incomingShareToolbar" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" tools:listitem="@layout/item_room" /> <com.google.android.material.floatingactionbutton.FloatingActionButton diff --git a/vector/src/main/res/layout/fragment_keys_backup_restore_from_key.xml b/vector/src/main/res/layout/fragment_keys_backup_restore_from_key.xml index 93489d31b9..db4393dccc 100644 --- a/vector/src/main/res/layout/fragment_keys_backup_restore_from_key.xml +++ b/vector/src/main/res/layout/fragment_keys_backup_restore_from_key.xml @@ -26,13 +26,13 @@ <TextView android:id="@+id/keys_restore_with_key" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="16dp" android:text="@string/keys_backup_restore_with_recovery_key" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -77,6 +77,7 @@ <TextView android:id="@+id/keys_restore_key_help_with_link" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="16dp" diff --git a/vector/src/main/res/layout/fragment_keys_backup_restore_from_passphrase.xml b/vector/src/main/res/layout/fragment_keys_backup_restore_from_passphrase.xml index 338874a537..f3061186ef 100644 --- a/vector/src/main/res/layout/fragment_keys_backup_restore_from_passphrase.xml +++ b/vector/src/main/res/layout/fragment_keys_backup_restore_from_passphrase.xml @@ -5,7 +5,9 @@ android:id="@+id/keys_backup_root" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?android:colorBackground"> + android:background="?android:colorBackground" + android:paddingStart="@dimen/layout_horizontal_margin" + android:paddingEnd="@dimen/layout_horizontal_margin"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" @@ -26,13 +28,13 @@ <TextView android:id="@+id/keys_backup_restore_with_passphrase" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_margin="16dp" + android:layout_marginTop="16dp" android:text="@string/keys_backup_restore_with_passphrase" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -40,12 +42,12 @@ <com.google.android.material.textfield.TextInputLayout android:id="@+id/keys_backup_passphrase_enter_til" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" android:layout_marginTop="16dp" app:errorEnabled="true" - app:layout_constraintEnd_toStartOf="@id/keys_backup_view_show_password" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/keys_backup_restore_with_passphrase"> @@ -55,28 +57,16 @@ android:layout_height="wrap_content" android:hint="@string/passphrase_enter_passphrase" android:maxLines="3" - android:singleLine="false" - tools:inputType="textPassword" /> + android:singleLine="false" /> </com.google.android.material.textfield.TextInputLayout> - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/keys_backup_view_show_password" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/keys_backup_passphrase_enter_til" - app:layout_constraintTop_toTopOf="@+id/keys_backup_passphrase_enter_til" - app:tint="?colorSecondary" /> - <TextView android:id="@+id/helperTextWithLink" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_margin="16dp" + android:layout_marginTop="16dp" android:textAlignment="center" android:textColor="?vctr_content_secondary" app:layout_constraintEnd_toEndOf="parent" @@ -89,7 +79,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin_big" - android:layout_marginEnd="@dimen/layout_horizontal_margin" android:layout_marginBottom="@dimen/layout_vertical_margin_big" android:minWidth="200dp" android:text="@string/keys_backup_unlock_button" diff --git a/vector/src/main/res/layout/fragment_keys_backup_restore_success.xml b/vector/src/main/res/layout/fragment_keys_backup_restore_success.xml index fc917f1247..fc69167bc0 100644 --- a/vector/src/main/res/layout/fragment_keys_backup_restore_success.xml +++ b/vector/src/main/res/layout/fragment_keys_backup_restore_success.xml @@ -21,12 +21,12 @@ <TextView android:id="@+id/success_text" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="16dp" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -35,12 +35,12 @@ <TextView android:id="@+id/success_details_text" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="16dp" android:textAlignment="center" android:textColor="?vctr_content_secondary" - android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/success_text" diff --git a/vector/src/main/res/layout/fragment_keys_backup_setup_step1.xml b/vector/src/main/res/layout/fragment_keys_backup_setup_step1.xml index 36bc1a556b..c13175728f 100644 --- a/vector/src/main/res/layout/fragment_keys_backup_setup_step1.xml +++ b/vector/src/main/res/layout/fragment_keys_backup_setup_step1.xml @@ -25,13 +25,13 @@ <TextView android:id="@+id/keys_backup_setup_step1_title" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" android:text="@string/keys_backup_setup_step1_title" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="18sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/keys_backup_setup_step1_description" app:layout_constraintTop_toBottomOf="@+id/keys_backup_setup_step1_image" @@ -39,6 +39,7 @@ <TextView android:id="@+id/keys_backup_setup_step1_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" @@ -65,6 +66,7 @@ <TextView android:id="@+id/keys_backup_setup_step1_advanced_option_text" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -81,7 +83,9 @@ <Button android:id="@+id/keys_backup_setup_step1_manual_export_button" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_margin="16dp" android:layout_marginStart="@dimen/layout_horizontal_margin" android:layout_marginEnd="@dimen/layout_horizontal_margin" diff --git a/vector/src/main/res/layout/fragment_keys_backup_setup_step2.xml b/vector/src/main/res/layout/fragment_keys_backup_setup_step2.xml index 42d8b1f97f..f0fa64426a 100644 --- a/vector/src/main/res/layout/fragment_keys_backup_setup_step2.xml +++ b/vector/src/main/res/layout/fragment_keys_backup_setup_step2.xml @@ -11,20 +11,19 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/keys_backup_setup" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:paddingStart="@dimen/layout_horizontal_margin" + android:paddingEnd="@dimen/layout_horizontal_margin"> <TextView android:id="@+id/keys_backup_setup_step2_text_title" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="20dp" android:layout_marginTop="30dp" - android:layout_marginEnd="20dp" - android:layout_marginBottom="16dp" android:text="@string/keys_backup_setup_step2_text_title" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="17sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -32,28 +31,25 @@ <TextView android:id="@+id/keys_backup_setup_step2_text_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="20dp" android:layout_marginTop="30dp" - android:layout_marginEnd="20dp" - android:layout_marginBottom="16dp" android:text="@string/keys_backup_setup_step2_text_description" android:textAlignment="center" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/keys_backup_setup_step2_text_title" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/keys_backup_setup_step2_passphrase_enter_til" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" android:layout_marginTop="16dp" app:errorEnabled="true" - app:layout_constraintEnd_toStartOf="@id/keys_backup_setup_step2_show_password" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/keys_backup_setup_step2_text_description"> @@ -66,18 +62,6 @@ </com.google.android.material.textfield.TextInputLayout> - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/keys_backup_setup_step2_show_password" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/keys_backup_setup_step2_passphrase_enter_til" - app:layout_constraintTop_toTopOf="@id/keys_backup_setup_step2_passphrase_enter_til" - app:tint="?colorSecondary" /> - <im.vector.app.core.ui.views.PasswordStrengthBar android:id="@+id/keys_backup_setup_step2_passphrase_strength_level" android:layout_width="0dp" @@ -86,16 +70,14 @@ app:layout_constraintStart_toStartOf="@id/keys_backup_setup_step2_passphrase_enter_til" app:layout_constraintTop_toBottomOf="@id/keys_backup_setup_step2_passphrase_enter_til" /> - <com.google.android.material.textfield.TextInputLayout android:id="@+id/keys_backup_setup_step2_passphrase_confirm_til" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginTop="16dp" - android:layout_weight="1" + android:layout_marginTop="4dp" app:errorEnabled="true" - app:layout_constraintEnd_toStartOf="@id/keys_backup_setup_step2_show_password" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/keys_backup_setup_step2_passphrase_strength_level"> @@ -113,18 +95,16 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:layout_marginEnd="16dp" android:text="@string/keys_backup_setup_step2_button_title" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/keys_backup_setup_step2_passphrase_confirm_til" /> <TextView android:id="@+id/keys_backup_setup_step2_recovery_key_alternative" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="16dp" android:layout_marginTop="20dp" - android:layout_marginEnd="16dp" android:text="@string/keys_backup_setup_step1_recovery_key_alternative" android:textAlignment="center" android:textColor="?vctr_content_primary" @@ -132,11 +112,9 @@ <Button android:id="@+id/keys_backup_setup_step2_skip_button" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginEnd="16dp" android:layout_marginBottom="@dimen/layout_vertical_margin" android:maxWidth="@dimen/button_max_width" android:text="@string/keys_backup_setup_step2_skip_button_title" diff --git a/vector/src/main/res/layout/fragment_keys_backup_setup_step3.xml b/vector/src/main/res/layout/fragment_keys_backup_setup_step3.xml index 97c178c932..63fe41b36a 100644 --- a/vector/src/main/res/layout/fragment_keys_backup_setup_step3.xml +++ b/vector/src/main/res/layout/fragment_keys_backup_setup_step3.xml @@ -27,6 +27,7 @@ <TextView android:id="@+id/keys_backup_setup_step3_success_title" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -35,7 +36,6 @@ android:text="@string/keys_backup_setup_step3_success_title" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="17sp" android:textStyle="bold" android:visibility="gone" tools:visibility="visible" /> @@ -43,6 +43,7 @@ <TextView android:id="@+id/keys_backup_setup_step3_line1_text" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -50,11 +51,11 @@ android:layout_marginEnd="@dimen/layout_horizontal_margin" android:text="@string/keys_backup_setup_step3_text_line1" android:textAlignment="center" - android:textColor="?vctr_content_primary" - android:textSize="15sp" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/keys_backup_setup_step3_label2" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -62,19 +63,18 @@ android:layout_marginEnd="@dimen/layout_horizontal_margin" android:textAlignment="center" android:textColor="?vctr_content_secondary" - android:textSize="15sp" tools:text="@string/keys_backup_setup_step3_text_line2" /> <TextView android:id="@+id/keys_backup_setup_step3_recovery_key_text" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/layout_horizontal_margin" android:fontFamily="monospace" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:visibility="gone" tools:text="HHWJ Y8DK RDR4\nBQEN FQ4V M4F8\nBQEN FQ4V M4A8" tools:visibility="visible" /> @@ -82,7 +82,7 @@ <Button android:id="@+id/keys_backup_setup_step3_copy_button" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" diff --git a/vector/src/main/res/layout/fragment_login.xml b/vector/src/main/res/layout/fragment_login.xml index 555e9c7639..b585f6cf9f 100644 --- a/vector/src/main/res/layout/fragment_login.xml +++ b/vector/src/main/res/layout/fragment_login.xml @@ -26,19 +26,21 @@ <TextView android:id="@+id/loginTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:text="@string/login_signin_to" /> <TextView android:id="@+id/loginNotice" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" tools:text="@string/login_server_matrix_org_text" /> <com.google.android.material.textfield.TextInputLayout @@ -58,52 +60,37 @@ </com.google.android.material.textfield.TextInputLayout> - <FrameLayout - android:id="@+id/passwordContainer" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/passwordFieldTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp"> + android:layout_marginTop="16dp" + android:hint="@string/login_signup_password_hint" + app:errorEnabled="true" + app:errorIconDrawable="@null"> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/passwordFieldTil" + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/passwordField" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/login_signup_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> + android:ems="10" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:maxLines="1" + android:paddingEnd="48dp" + tools:ignore="RtlSymmetry" /> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/passwordField" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:imeOptions="actionDone" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/passwordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> + </com.google.android.material.textfield.TextInputLayout> <TextView android:id="@+id/loginPasswordNotice" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:text="@string/login_signin_matrix_id_password_notice" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" android:visibility="gone" tools:visibility="visible" /> @@ -114,7 +101,7 @@ <Button android:id="@+id/forgetPasswordButton" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start" @@ -122,7 +109,7 @@ <Button android:id="@+id/loginSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -144,13 +131,13 @@ <TextView android:id="@+id/loginSocialLoginHeader" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center" android:text="@string/login_social_continue" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" - android:textSize="14sp" /> + android:textColor="?vctr_content_secondary" /> <im.vector.app.features.login.SocialLoginButtonsView android:id="@+id/loginSocialLoginButtons" diff --git a/vector/src/main/res/layout/fragment_login_account_created.xml b/vector/src/main/res/layout/fragment_login_account_created.xml index 87af814769..0ec4881544 100644 --- a/vector/src/main/res/layout/fragment_login_account_created.xml +++ b/vector/src/main/res/layout/fragment_login_account_created.xml @@ -16,33 +16,37 @@ tools:ignore="ContentDescription" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_account_created_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/loginAccountCreatedSubtitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Title.Small" + android:textColor="?vctr_content_primary" tools:text="@string/login_account_created_subtitle" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:text="@string/login_account_created_notice" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" /> + android:textColor="?vctr_content_secondary" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_account_created_notice_2" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" /> + android:textColor="?vctr_content_secondary" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/loginAccountCreatedMessage" @@ -63,6 +67,7 @@ <TextView android:id="@+id/loginAccountCreatedMemberName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -71,7 +76,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/loginAccountCreatedTime" app:layout_constraintStart_toEndOf="@+id/loginAccountCreatedAvatar" @@ -80,23 +84,23 @@ <TextView android:id="@+id/loginAccountCreatedTime" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textColor="?vctr_content_secondary" - android:textSize="12sp" app:layout_constraintBaseline_toBaselineOf="@+id/loginAccountCreatedMemberName" app:layout_constraintEnd_toEndOf="parent" tools:text="@tools:sample/date/hhmm" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/login_account_created_message" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/loginAccountCreatedMemberName" app:layout_constraintTop_toBottomOf="@+id/loginAccountCreatedMemberName" /> @@ -104,11 +108,12 @@ </androidx.constraintlayout.widget.ConstraintLayout> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_account_created_instruction" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" /> + android:textColor="?vctr_content_secondary" /> <FrameLayout android:layout_width="match_parent" @@ -117,7 +122,7 @@ <Button android:id="@+id/loginAccountCreatedLater" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -125,7 +130,7 @@ <Button android:id="@+id/loginAccountCreatedDone" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_captcha.xml b/vector/src/main/res/layout/fragment_login_captcha.xml index 4d7219b0d8..655bd98097 100644 --- a/vector/src/main/res/layout/fragment_login_captcha.xml +++ b/vector/src/main/res/layout/fragment_login_captcha.xml @@ -22,11 +22,12 @@ <TextView android:id="@+id/loginCaptchaNotice" - style="@style/TextAppearance.Vector.Login.Text.Small" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:text="@string/auth_recaptcha_message" /> + android:text="@string/auth_recaptcha_message" + android:textColor="?vctr_content_secondary" /> <!-- contentDescription does not work on WebView? --> <WebView diff --git a/vector/src/main/res/layout/fragment_login_generic_text_input_form.xml b/vector/src/main/res/layout/fragment_login_generic_text_input_form.xml index 4456ade772..0412c4e0cb 100644 --- a/vector/src/main/res/layout/fragment_login_generic_text_input_form.xml +++ b/vector/src/main/res/layout/fragment_login_generic_text_input_form.xml @@ -17,27 +17,30 @@ <TextView android:id="@+id/loginGenericTextInputFormTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:text="@string/login_set_email_title" /> <TextView android:id="@+id/loginGenericTextInputFormNotice" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:layout_marginBottom="26dp" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" tools:text="@string/login_set_email_notice" /> <TextView android:id="@+id/loginGenericTextInputFormNotice2" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" android:visibility="gone" tools:text="@string/login_set_msisdn_notice2" tools:visibility="visible" /> @@ -67,7 +70,7 @@ <Button android:id="@+id/loginGenericTextInputFormOtherButton" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start" @@ -77,7 +80,7 @@ <Button android:id="@+id/loginGenericTextInputFormSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" diff --git a/vector/src/main/res/layout/fragment_login_generic_text_input_form_2.xml b/vector/src/main/res/layout/fragment_login_generic_text_input_form_2.xml index e66995e96c..a5b65d62f5 100644 --- a/vector/src/main/res/layout/fragment_login_generic_text_input_form_2.xml +++ b/vector/src/main/res/layout/fragment_login_generic_text_input_form_2.xml @@ -17,39 +17,43 @@ <TextView android:id="@+id/loginGenericTextInputFormTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:text="@string/login_set_email_title_2" /> <TextView android:id="@+id/loginGenericTextInputFormNotice" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:layout_marginBottom="@dimen/layout_vertical_margin" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" tools:text="@string/login_set_email_notice_2" /> <TextView android:id="@+id/loginGenericTextInputFormMandatoryNotice" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="26dp" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" android:visibility="gone" tools:text="@string/login_set_email_mandatory_notice_2" tools:visibility="visible" /> <TextView android:id="@+id/loginGenericTextInputFormNotice2" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" android:visibility="gone" tools:text="@string/login_set_msisdn_notice2" tools:visibility="visible" /> @@ -78,7 +82,7 @@ <Button android:id="@+id/loginGenericTextInputFormOtherButton" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start" @@ -88,7 +92,7 @@ <Button android:id="@+id/loginGenericTextInputFormLater" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -99,7 +103,7 @@ <Button android:id="@+id/loginGenericTextInputFormSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_reset_password.xml b/vector/src/main/res/layout/fragment_login_reset_password.xml index 147220990b..352d5770d3 100644 --- a/vector/src/main/res/layout/fragment_login_reset_password.xml +++ b/vector/src/main/res/layout/fragment_login_reset_password.xml @@ -16,19 +16,21 @@ <TextView android:id="@+id/resetPasswordTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:text="@string/login_reset_password_on" /> <TextView android:id="@+id/loginNotice" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="start" android:text="@string/login_reset_password_notice" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" /> + android:textColor="?vctr_content_secondary" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/resetPasswordEmailTil" @@ -47,47 +49,33 @@ </com.google.android.material.textfield.TextInputLayout> - <FrameLayout - android:id="@+id/passwordContainer" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/passwordFieldTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp"> + android:layout_marginTop="16dp" + android:hint="@string/login_reset_password_password_hint" + app:endIconContentDescription="" + app:endIconMode="password_toggle" + app:errorEnabled="true" + app:errorIconDrawable="@null"> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/passwordFieldTil" + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/passwordField" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/login_reset_password_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> + android:ems="10" + android:inputType="textPassword" + android:maxLines="1" + android:paddingEnd="48dp" + tools:ignore="RtlSymmetry" /> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/passwordField" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/passwordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> + </com.google.android.material.textfield.TextInputLayout> <Button android:id="@+id/resetPasswordSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_reset_password_2.xml b/vector/src/main/res/layout/fragment_login_reset_password_2.xml index 8ad180b6cd..6a2dad569c 100644 --- a/vector/src/main/res/layout/fragment_login_reset_password_2.xml +++ b/vector/src/main/res/layout/fragment_login_reset_password_2.xml @@ -16,19 +16,21 @@ <TextView android:id="@+id/resetPasswordTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:text="@string/login_reset_password_on" /> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="32dp" android:text="@string/login_enter_your_email" - android:textAppearance="@style/TextAppearance.Vector.Login.Title.Small" /> + android:textColor="?vctr_content_primary" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/resetPasswordEmailTil" @@ -49,63 +51,49 @@ <TextView android:id="@+id/loginNotice" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:gravity="start" android:text="@string/login_reset_password_notice" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" /> + android:textColor="?vctr_content_secondary" /> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="16dp" android:text="@string/login_choose_a_new_password" - android:textAppearance="@style/TextAppearance.Vector.Login.Title.Small" /> + android:textColor="?vctr_content_primary" /> - <FrameLayout - android:id="@+id/passwordContainer" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/passwordFieldTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="8dp"> + android:layout_marginTop="8dp" + android:hint="@string/login_reset_password_password_hint" + app:errorEnabled="true" + app:errorIconDrawable="@null"> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/passwordFieldTil" + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/passwordField" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/login_reset_password_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> + android:ems="10" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:maxLines="1" + android:paddingEnd="48dp" + tools:ignore="RtlSymmetry" /> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/passwordField" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:imeOptions="actionDone" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/passwordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> + </com.google.android.material.textfield.TextInputLayout> <Button android:id="@+id/resetPasswordSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_reset_password_mail_confirmation.xml b/vector/src/main/res/layout/fragment_login_reset_password_mail_confirmation.xml index cbddb32316..8ae0a18b70 100644 --- a/vector/src/main/res/layout/fragment_login_reset_password_mail_confirmation.xml +++ b/vector/src/main/res/layout/fragment_login_reset_password_mail_confirmation.xml @@ -14,29 +14,32 @@ tools:ignore="ContentDescription" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login_reset_password_mail_confirmation_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/resetPasswordMailConfirmationNotice" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" tools:text="@string/login_reset_password_mail_confirmation_notice" /> <TextView + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_reset_password_mail_confirmation_notice_2" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" /> + android:textColor="?vctr_content_secondary" /> <Button android:id="@+id/resetPasswordMailConfirmationSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" diff --git a/vector/src/main/res/layout/fragment_login_reset_password_mail_confirmation_2.xml b/vector/src/main/res/layout/fragment_login_reset_password_mail_confirmation_2.xml index bae1f2f5e6..fa3aa74285 100644 --- a/vector/src/main/res/layout/fragment_login_reset_password_mail_confirmation_2.xml +++ b/vector/src/main/res/layout/fragment_login_reset_password_mail_confirmation_2.xml @@ -14,30 +14,33 @@ tools:ignore="ContentDescription" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_reset_password_mail_confirmation_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/resetPasswordMailConfirmationNotice" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" tools:text="@string/login_reset_password_mail_confirmation_notice" /> <TextView + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_reset_password_mail_confirmation_notice_2" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" /> + android:textColor="?vctr_content_secondary" /> <Button android:id="@+id/resetPasswordMailConfirmationSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_reset_password_success.xml b/vector/src/main/res/layout/fragment_login_reset_password_success.xml index bce973f9e5..8fae21740b 100644 --- a/vector/src/main/res/layout/fragment_login_reset_password_success.xml +++ b/vector/src/main/res/layout/fragment_login_reset_password_success.xml @@ -14,29 +14,32 @@ tools:ignore="ContentDescription" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login_reset_password_success_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/resetPasswordSuccessNotice" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_reset_password_success_notice" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" /> + android:textColor="?vctr_content_secondary" /> <TextView + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_reset_password_success_notice_2" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" /> + android:textColor="?vctr_content_secondary" /> <Button android:id="@+id/resetPasswordSuccessSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" diff --git a/vector/src/main/res/layout/fragment_login_reset_password_success_2.xml b/vector/src/main/res/layout/fragment_login_reset_password_success_2.xml index 6ace2adc20..d0e7a447cc 100644 --- a/vector/src/main/res/layout/fragment_login_reset_password_success_2.xml +++ b/vector/src/main/res/layout/fragment_login_reset_password_success_2.xml @@ -14,30 +14,33 @@ tools:ignore="ContentDescription" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_reset_password_success_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/resetPasswordSuccessNotice" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_reset_password_success_notice" - android:textAppearance="@style/TextAppearance.Vector.Login.Title.Small" /> + android:textColor="?vctr_content_primary" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_reset_password_success_notice_2" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" /> + android:textColor="?vctr_content_secondary" /> <Button android:id="@+id/resetPasswordSuccessSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_server_selection.xml b/vector/src/main/res/layout/fragment_login_server_selection.xml index 812607bc2c..a7b065c29d 100644 --- a/vector/src/main/res/layout/fragment_login_server_selection.xml +++ b/vector/src/main/res/layout/fragment_login_server_selection.xml @@ -19,11 +19,12 @@ <TextView android:id="@+id/loginServerTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="36dp" android:text="@string/login_server_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" android:transitionName="loginTitleTransition" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -31,12 +32,13 @@ <TextView android:id="@+id/loginServerText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="start" android:text="@string/login_server_text" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/loginServerTitle" /> @@ -71,12 +73,13 @@ <TextView android:id="@+id/loginServerChoiceMatrixOrgText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="start" android:text="@string/login_server_matrix_org_text" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -113,12 +116,13 @@ <TextView android:id="@+id/loginServerChoiceEmsText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="7dp" android:gravity="start" android:text="@string/login_server_modular_text" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/loginServerChoiceEmsLearnMore" app:layout_constraintStart_toStartOf="parent" @@ -126,11 +130,11 @@ <TextView android:id="@+id/loginServerChoiceEmsLearnMore" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:padding="16dp" android:text="@string/login_server_modular_learn_more" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" android:textColor="?colorPrimary" app:layout_constraintBottom_toBottomOf="@+id/loginServerChoiceEmsText" app:layout_constraintEnd_toEndOf="parent" @@ -154,13 +158,12 @@ <TextView android:id="@+id/loginServerChoiceOtherTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:text="@string/login_server_other_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constraintBottom_toTopOf="@+id/loginServerChoiceOtherText" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -168,12 +171,13 @@ <TextView android:id="@+id/loginServerChoiceOtherText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:gravity="start" android:text="@string/login_server_other_text" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -183,7 +187,7 @@ <Button android:id="@+id/loginServerIKnowMyIdSubmit" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="32dp" diff --git a/vector/src/main/res/layout/fragment_login_server_selection_2.xml b/vector/src/main/res/layout/fragment_login_server_selection_2.xml index c6f0106da6..6a7f2c43e0 100644 --- a/vector/src/main/res/layout/fragment_login_server_selection_2.xml +++ b/vector/src/main/res/layout/fragment_login_server_selection_2.xml @@ -16,21 +16,23 @@ <TextView android:id="@+id/loginServerTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_please_choose_a_server" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:ignore="UnknownId" /> <TextView android:id="@+id/loginServerText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="start" android:text="@string/login_server_text" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" /> + android:textColor="?vctr_content_secondary" /> <!-- Use a CheckableConstraintLayout to keep the pressed state when retrieving login flow --> <im.vector.app.core.platform.CheckableConstraintLayout @@ -59,12 +61,13 @@ <TextView android:id="@+id/loginServerChoiceMatrixOrgText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="start" android:text="@string/login_server_matrix_org_text" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -74,11 +77,12 @@ <TextView android:id="@+id/loginServerText2" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="@string/login_if_you_re_not_sure_select_this_option" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" android:textStyle="italic" /> <im.vector.app.core.platform.CheckableConstraintLayout @@ -94,13 +98,12 @@ <TextView android:id="@+id/loginServerChoiceOtherTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:text="@string/login_element_matrix_server_and_others" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constraintBottom_toTopOf="@+id/loginServerChoiceOtherText" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -108,12 +111,13 @@ <TextView android:id="@+id/loginServerChoiceOtherText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:gravity="start" android:text="@string/login_server_other_text" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -123,13 +127,14 @@ <TextView android:id="@+id/loginServerChoiceEmsLearnMore" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="32dp" android:paddingTop="16dp" android:paddingBottom="16dp" android:text="@string/login_server_modular_learn_more_about_ems" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="@+id/loginServerChoiceEmsText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/loginServerChoiceEmsText" /> diff --git a/vector/src/main/res/layout/fragment_login_server_url_form.xml b/vector/src/main/res/layout/fragment_login_server_url_form.xml index fc5fc66285..0a5c10935a 100644 --- a/vector/src/main/res/layout/fragment_login_server_url_form.xml +++ b/vector/src/main/res/layout/fragment_login_server_url_form.xml @@ -27,28 +27,30 @@ <TextView android:id="@+id/loginServerUrlFormTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="27dp" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:text="@string/login_connect_to_modular" /> <TextView android:id="@+id/loginServerUrlFormText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" tools:text="@string/login_server_url_form_modular_text" /> <TextView android:id="@+id/loginServerUrlFormLearnMore" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:text="@string/login_server_modular_learn_more" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" android:textColor="?colorPrimary" /> <com.google.android.material.textfield.TextInputLayout @@ -73,27 +75,28 @@ <TextView android:id="@+id/loginServerUrlFormClearHistory" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" android:text="@string/login_clear_homeserver_history" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" android:textColor="?colorPrimary" android:visibility="invisible" tools:visibility="visible" /> <TextView android:id="@+id/loginServerUrlFormNotice" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" tools:text="@string/login_server_url_form_common_notice" /> <Button android:id="@+id/loginServerUrlFormSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_server_url_form_2.xml b/vector/src/main/res/layout/fragment_login_server_url_form_2.xml index 1fad3da4b8..6038cfaedd 100644 --- a/vector/src/main/res/layout/fragment_login_server_url_form_2.xml +++ b/vector/src/main/res/layout/fragment_login_server_url_form_2.xml @@ -17,11 +17,12 @@ <TextView android:id="@+id/loginServerUrlFormTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_server_url_form_common_notice" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/loginServerUrlFormHomeServerUrlTil" @@ -45,6 +46,7 @@ <TextView android:id="@+id/loginServerUrlFormClearHistory" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -52,14 +54,13 @@ android:paddingEnd="0dp" android:paddingBottom="16dp" android:text="@string/login_clear_homeserver_history" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" android:textColor="?colorPrimary" android:visibility="invisible" tools:visibility="visible" /> <Button android:id="@+id/loginServerUrlFormSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_signin_password_2.xml b/vector/src/main/res/layout/fragment_login_signin_password_2.xml index 42a6ca7c67..c70982f209 100644 --- a/vector/src/main/res/layout/fragment_login_signin_password_2.xml +++ b/vector/src/main/res/layout/fragment_login_signin_password_2.xml @@ -16,11 +16,12 @@ tools:ignore="ContentDescription" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_please_enter_your_password" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <ImageView android:id="@+id/loginUserIcon" @@ -33,61 +34,46 @@ <TextView android:id="@+id/loginWelcomeBack" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" tools:text="Welcome back user!" /> <TextView android:id="@+id/loginWelcomeBackWarning" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_unknown_user_warning" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" android:textColor="@color/vector_warning_color_2" android:visibility="gone" tools:visibility="visible" /> - <FrameLayout - android:id="@+id/passwordContainer" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/passwordFieldTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp"> + android:layout_marginTop="16dp" + android:hint="@string/login_signup_password_hint" + app:errorEnabled="true" + app:errorIconDrawable="@null"> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/passwordFieldTil" + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/passwordField" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/login_signup_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> + android:ems="10" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:maxLines="1" + android:paddingEnd="48dp" + tools:ignore="RtlSymmetry" /> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/passwordField" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:imeOptions="actionDone" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/passwordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> + </com.google.android.material.textfield.TextInputLayout> <FrameLayout android:layout_width="match_parent" @@ -96,7 +82,7 @@ <Button android:id="@+id/forgetPasswordButton" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start" @@ -106,7 +92,7 @@ <Button android:id="@+id/loginSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_signin_to_any_2.xml b/vector/src/main/res/layout/fragment_login_signin_to_any_2.xml index bc7ea032fa..61f565e093 100644 --- a/vector/src/main/res/layout/fragment_login_signin_to_any_2.xml +++ b/vector/src/main/res/layout/fragment_login_signin_to_any_2.xml @@ -17,10 +17,11 @@ <TextView android:id="@+id/loginTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:text="@string/login_signin_to" /> <com.google.android.material.textfield.TextInputLayout @@ -40,44 +41,28 @@ </com.google.android.material.textfield.TextInputLayout> - <FrameLayout - android:id="@+id/passwordContainer" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/passwordFieldTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp"> + android:layout_marginTop="16dp" + android:hint="@string/login_signup_password_hint" + app:errorEnabled="true" + app:errorIconDrawable="@null"> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/passwordFieldTil" + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/passwordField" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/login_signup_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> + android:ems="10" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:maxLines="1" + android:paddingEnd="48dp" + tools:ignore="RtlSymmetry" /> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/passwordField" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:imeOptions="actionDone" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/passwordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> + </com.google.android.material.textfield.TextInputLayout> <FrameLayout android:layout_width="match_parent" @@ -86,7 +71,7 @@ <Button android:id="@+id/forgetPasswordButton" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start" @@ -96,7 +81,7 @@ <Button android:id="@+id/loginSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -118,13 +103,13 @@ <TextView android:id="@+id/loginSocialLoginHeader" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center" android:text="@string/login_social_continue" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" - android:textSize="14sp" /> + android:textColor="?vctr_content_secondary" /> <im.vector.app.features.login.SocialLoginButtonsView android:id="@+id/loginSocialLoginButtons" diff --git a/vector/src/main/res/layout/fragment_login_signin_username_2.xml b/vector/src/main/res/layout/fragment_login_signin_username_2.xml index 2b39acb3d6..acba8dd7e1 100644 --- a/vector/src/main/res/layout/fragment_login_signin_username_2.xml +++ b/vector/src/main/res/layout/fragment_login_signin_username_2.xml @@ -17,19 +17,21 @@ <TextView android:id="@+id/loginTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_please_enter_your_matrix_identifier" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/loginSubtitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_please_enter_your_matrix_identifier_help" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" /> + android:textColor="?vctr_content_secondary" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/loginFieldTil" @@ -50,7 +52,7 @@ <Button android:id="@+id/loginSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -59,16 +61,17 @@ <TextView android:id="@+id/loginServerText3" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:gravity="start" android:text="@string/login_enter_identifier_help" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" /> + android:textColor="?vctr_content_secondary" /> <Button android:id="@+id/loginChooseAServer" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_signup_password_2.xml b/vector/src/main/res/layout/fragment_login_signup_password_2.xml index 4087426056..33730e92cb 100644 --- a/vector/src/main/res/layout/fragment_login_signup_password_2.xml +++ b/vector/src/main/res/layout/fragment_login_signup_password_2.xml @@ -16,85 +16,74 @@ tools:ignore="ContentDescription" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_please_choose_a_password" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:text="@string/login_your_matrix_identifier" - android:textAppearance="@style/TextAppearance.Vector.Login.Title.Small" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/loginMatrixIdentifier" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" tools:text="\@user:domain.org" /> <TextView + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="@string/login_press_back_to_change" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" android:textStyle="italic" /> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_choose_a_password" - android:textAppearance="@style/TextAppearance.Vector.Login.Title.Small" /> + android:textColor="?vctr_content_primary" /> - <FrameLayout - android:id="@+id/passwordContainer" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/passwordFieldTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="8dp"> + android:layout_marginTop="8dp" + android:hint="@string/login_signup_password_hint" + app:errorEnabled="true" + app:errorIconDrawable="@null"> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/passwordFieldTil" + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/passwordField" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/login_signup_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> + android:ems="10" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:maxLines="1" + android:paddingEnd="48dp" + tools:ignore="RtlSymmetry" /> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/passwordField" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:imeOptions="actionDone" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/passwordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> + </com.google.android.material.textfield.TextInputLayout> <Button android:id="@+id/loginSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_signup_signin_selection.xml b/vector/src/main/res/layout/fragment_login_signup_signin_selection.xml index 88b8dd37f3..eb3b1b703c 100644 --- a/vector/src/main/res/layout/fragment_login_signup_signin_selection.xml +++ b/vector/src/main/res/layout/fragment_login_signup_signin_selection.xml @@ -33,10 +33,11 @@ <TextView android:id="@+id/loginSignupSigninTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="27dp" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/loginSignupSigninServerIcon" app:layout_goneMarginTop="0dp" @@ -44,11 +45,12 @@ <TextView android:id="@+id/loginSignupSigninText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="27dp" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/loginSignupSigninTitle" @@ -57,7 +59,7 @@ <!-- Sign up or sign in SSO --> <Button android:id="@+id/loginSignupSigninSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="38dp" @@ -69,7 +71,7 @@ <!-- Sign in or gone --> <Button android:id="@+id/loginSignupSigninSignIn" - style="@style/Style.Vector.Login.Button.Outlined" + style="@style/Widget.Vector.Button.Outlined.Login" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="14dp" @@ -97,13 +99,13 @@ <TextView android:id="@+id/loginSignupSigninSocialLoginHeader" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="27dp" android:gravity="center" android:text="@string/login_social_continue" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" - android:textSize="14sp" /> + android:textColor="?vctr_content_secondary" /> <im.vector.app.features.login.SocialLoginButtonsView android:id="@+id/loginSignupSigninSocialLoginButtons" diff --git a/vector/src/main/res/layout/fragment_login_signup_username_2.xml b/vector/src/main/res/layout/fragment_login_signup_username_2.xml index ae2d3dc563..6eeff13d86 100644 --- a/vector/src/main/res/layout/fragment_login_signup_username_2.xml +++ b/vector/src/main/res/layout/fragment_login_signup_username_2.xml @@ -17,18 +17,20 @@ <TextView android:id="@+id/loginTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_please_choose_a_user_name" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/loginSubtitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="32dp" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" tools:text="@string/login_signup_to" /> <com.google.android.material.textfield.TextInputLayout @@ -50,15 +52,16 @@ <TextView android:id="@+id/loginChooseHelp" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/login_please_choose_a_user_name_help_2" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" + android:textColor="?vctr_content_secondary" android:textStyle="italic" /> <Button android:id="@+id/loginSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -79,13 +82,13 @@ <TextView android:id="@+id/loginSocialLoginHeader" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center" android:text="@string/login_social_continue" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" - android:textSize="14sp" /> + android:textColor="?vctr_content_secondary" /> <im.vector.app.features.login.SocialLoginButtonsView android:id="@+id/loginSocialLoginButtons" diff --git a/vector/src/main/res/layout/fragment_login_splash.xml b/vector/src/main/res/layout/fragment_login_splash.xml index 79312e1666..1d69cde723 100644 --- a/vector/src/main/res/layout/fragment_login_splash.xml +++ b/vector/src/main/res/layout/fragment_login_splash.xml @@ -62,11 +62,12 @@ <TextView android:id="@+id/loginSplashTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:text="@string/login_splash_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" android:transitionName="loginTitleTransition" app:layout_constraintBottom_toTopOf="@+id/loginSplashSpace3" app:layout_constraintEnd_toEndOf="parent" @@ -104,12 +105,13 @@ <TextView android:id="@+id/loginSplashText1" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:gravity="start" android:text="@string/login_splash_text1" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toTopOf="@+id/loginSplashText2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/loginSplashPicto1" @@ -128,12 +130,13 @@ <TextView android:id="@+id/loginSplashText2" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="start" android:text="@string/login_splash_text2" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toTopOf="@id/loginSplashText3" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/loginSplashText1" @@ -152,12 +155,13 @@ <TextView android:id="@+id/loginSplashText3" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="start" android:text="@string/login_splash_text3" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/loginSplashText1" @@ -175,7 +179,7 @@ <Button android:id="@+id/loginSplashSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/login_splash_submit" @@ -195,6 +199,7 @@ <TextView android:id="@+id/loginSplashVersion" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="?vctr_content_secondary" diff --git a/vector/src/main/res/layout/fragment_login_splash_2.xml b/vector/src/main/res/layout/fragment_login_splash_2.xml index 0829ae0520..08d3d3b6a4 100644 --- a/vector/src/main/res/layout/fragment_login_splash_2.xml +++ b/vector/src/main/res/layout/fragment_login_splash_2.xml @@ -62,11 +62,12 @@ <TextView android:id="@+id/loginSplashTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:text="@string/login_splash_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" android:transitionName="loginTitleTransition" app:layout_constraintBottom_toTopOf="@+id/loginSplashSpace25" app:layout_constraintEnd_toEndOf="parent" @@ -104,12 +105,13 @@ <TextView android:id="@+id/loginSplashText1" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:gravity="start" android:text="@string/login_splash_text1" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toTopOf="@+id/loginSplashText2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/loginSplashPicto1" @@ -128,12 +130,13 @@ <TextView android:id="@+id/loginSplashText2" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="start" android:text="@string/login_splash_text2" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toTopOf="@id/loginSplashText3" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/loginSplashText1" @@ -152,12 +155,13 @@ <TextView android:id="@+id/loginSplashText3" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="start" android:text="@string/login_splash_text3" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/loginSplashText1" @@ -185,7 +189,7 @@ <Button android:id="@+id/loginSignupSigninSignUp" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -193,7 +197,7 @@ <Button android:id="@+id/loginSignupSigninSignIn" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -212,6 +216,7 @@ <TextView android:id="@+id/loginSplashVersion" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="?vctr_content_secondary" diff --git a/vector/src/main/res/layout/fragment_login_sso_only_2.xml b/vector/src/main/res/layout/fragment_login_sso_only_2.xml index ef6fc12e04..baa05ee30f 100644 --- a/vector/src/main/res/layout/fragment_login_sso_only_2.xml +++ b/vector/src/main/res/layout/fragment_login_sso_only_2.xml @@ -15,16 +15,17 @@ <TextView android:id="@+id/loginSignupSigninTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:ignore="UnknownId" tools:text="@string/login_connect_to" /> <Button android:id="@+id/loginSignupSigninSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_login_terms.xml b/vector/src/main/res/layout/fragment_login_terms.xml index bad4849df9..84ae53ab92 100644 --- a/vector/src/main/res/layout/fragment_login_terms.xml +++ b/vector/src/main/res/layout/fragment_login_terms.xml @@ -20,24 +20,26 @@ <TextView android:id="@+id/loginTermsTitle" - style="@style/TextAppearance.Vector.Login.Title" + style="@style/Widget.Vector.TextView.Title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="36dp" android:paddingStart="36dp" android:paddingEnd="36dp" android:text="@string/login_terms_title" + android:textColor="?vctr_content_primary" app:layout_constraintTop_toBottomOf="@id/loginLogo" /> <TextView android:id="@+id/loginTermsNotice" - style="@style/TextAppearance.Vector.Login.Text.Small" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:paddingStart="36dp" android:paddingEnd="36dp" android:text="@string/auth_accept_policies" + android:textColor="?vctr_content_secondary" app:layout_constraintTop_toBottomOf="@+id/loginTermsTitle" /> <androidx.recyclerview.widget.RecyclerView @@ -52,7 +54,9 @@ <Button android:id="@+id/loginTermsSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_marginEnd="36dp" android:text="@string/accept" app:layout_constraintBottom_toBottomOf="parent" diff --git a/vector/src/main/res/layout/fragment_login_terms_2.xml b/vector/src/main/res/layout/fragment_login_terms_2.xml index 33b369f2f0..b4034b7c7b 100644 --- a/vector/src/main/res/layout/fragment_login_terms_2.xml +++ b/vector/src/main/res/layout/fragment_login_terms_2.xml @@ -21,13 +21,14 @@ <TextView android:id="@+id/loginTermsTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="36dp" android:layout_marginTop="52dp" android:layout_marginEnd="36dp" android:text="@string/login_terms_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/loginLogo" @@ -35,13 +36,14 @@ <TextView android:id="@+id/loginTermsNotice" - style="@style/TextAppearance.Vector.Login.Text.Small" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:paddingStart="36dp" android:paddingEnd="36dp" android:text="@string/auth_accept_policies" + android:textColor="?vctr_content_secondary" app:layout_constraintTop_toBottomOf="@+id/loginTermsTitle" /> <androidx.recyclerview.widget.RecyclerView @@ -56,7 +58,9 @@ <Button android:id="@+id/loginTermsSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_marginEnd="36dp" android:text="@string/accept" app:layout_constraintBottom_toBottomOf="parent" diff --git a/vector/src/main/res/layout/fragment_login_wait_for_email.xml b/vector/src/main/res/layout/fragment_login_wait_for_email.xml index 9b5132f537..9b165c96f4 100644 --- a/vector/src/main/res/layout/fragment_login_wait_for_email.xml +++ b/vector/src/main/res/layout/fragment_login_wait_for_email.xml @@ -16,18 +16,20 @@ <TextView android:id="@+id/loginWaitForEmailTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login_wait_for_email_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/loginWaitForEmailNotice" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" tools:text="@string/login_wait_for_email_notice" /> <ProgressBar diff --git a/vector/src/main/res/layout/fragment_login_wait_for_email_2.xml b/vector/src/main/res/layout/fragment_login_wait_for_email_2.xml index e70f038197..15046afb61 100644 --- a/vector/src/main/res/layout/fragment_login_wait_for_email_2.xml +++ b/vector/src/main/res/layout/fragment_login_wait_for_email_2.xml @@ -15,32 +15,35 @@ <TextView android:id="@+id/loginWaitForEmailTitle" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:text="@string/login_wait_for_email_title" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" /> + android:textColor="?vctr_content_primary" /> <TextView android:id="@+id/loginWaitForEmailNotice" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="start" - android:textAppearance="@style/TextAppearance.Vector.Login.Title.Small" + android:textColor="?vctr_content_primary" tools:text="@string/login_wait_for_email_notice_2" /> <TextView android:id="@+id/loginWaitForEmailHelp" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:gravity="start" android:text="@string/login_wait_for_email_help" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" /> + android:textColor="?vctr_content_secondary" /> <ProgressBar - style="@style/Widget.AppCompat.ProgressBar.Horizontal" + style="@style/Widget.Vector.ProgressBar.Horizontal" android:layout_width="240dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" diff --git a/vector/src/main/res/layout/fragment_login_web.xml b/vector/src/main/res/layout/fragment_login_web.xml index 46a3796e22..b9cbc536b7 100644 --- a/vector/src/main/res/layout/fragment_login_web.xml +++ b/vector/src/main/res/layout/fragment_login_web.xml @@ -1,18 +1,26 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="?android:colorBackground" android:orientation="vertical"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/loginWebToolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:elevation="4dp" - tools:subtitle="https://www.example.org" - tools:title="@string/auth_login" /> + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/loginWebToolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:subtitle="https://www.example.org" + tools:title="@string/auth_login" /> + + </com.google.android.material.appbar.AppBarLayout> <WebView android:id="@+id/loginWebWebView" diff --git a/vector/src/main/res/layout/fragment_matrix_profile.xml b/vector/src/main/res/layout/fragment_matrix_profile.xml index ee4b12b73b..4fb1328abc 100644 --- a/vector/src/main/res/layout/fragment_matrix_profile.xml +++ b/vector/src/main/res/layout/fragment_matrix_profile.xml @@ -16,7 +16,6 @@ android:id="@+id/matrixProfileCollapsingToolbarLayout" android:layout_width="match_parent" android:layout_height="match_parent" - android:theme="@style/Vector.Toolbar.Profile" app:contentScrim="?android:colorBackground" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" app:scrimAnimationDuration="250" @@ -33,7 +32,7 @@ app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.9" /> - <androidx.appcompat.widget.Toolbar + <com.google.android.material.appbar.MaterialToolbar android:id="@+id/matrixProfileToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" @@ -72,6 +71,7 @@ <TextView android:id="@+id/matrixProfileToolbarTitleView" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -80,7 +80,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/matrixProfileToolbarAvatarImageView" @@ -90,7 +89,7 @@ </androidx.constraintlayout.widget.ConstraintLayout> - </androidx.appcompat.widget.Toolbar> + </com.google.android.material.appbar.MaterialToolbar> </com.google.android.material.appbar.CollapsingToolbarLayout> diff --git a/vector/src/main/res/layout/fragment_matrix_to_room_space_card.xml b/vector/src/main/res/layout/fragment_matrix_to_room_space_card.xml index d02ad68bdb..cdbf53b8f9 100644 --- a/vector/src/main/res/layout/fragment_matrix_to_room_space_card.xml +++ b/vector/src/main/res/layout/fragment_matrix_to_room_space_card.xml @@ -42,6 +42,7 @@ <TextView android:id="@+id/matrixToCardNameText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" @@ -49,13 +50,13 @@ android:singleLine="true" android:textAlignment="textStart" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@+id/matrixToCardAvatar" tools:text="@sample/rooms.json/data/name" /> <TextView android:id="@+id/matrixToCardAliasText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" @@ -63,7 +64,6 @@ android:singleLine="true" android:textAlignment="textStart" android:textColor="?vctr_content_secondary" - android:textSize="15sp" android:visibility="gone" app:layout_constraintTop_toBottomOf="@id/matrixToCardNameText" app:layout_goneMarginTop="0dp" @@ -81,11 +81,13 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/matrixToAccessText" app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" tools:src="@drawable/ic_public_room" tools:visibility="visible" /> <TextView android:id="@+id/matrixToAccessText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -131,6 +133,7 @@ <TextView android:id="@+id/spaceChildMemberCountText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -141,6 +144,7 @@ <TextView android:id="@+id/matrixToCardDescText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" @@ -148,7 +152,6 @@ android:maxLines="4" android:textAlignment="textStart" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintTop_toBottomOf="@id/matrixToMemberPills" tools:text="@sample/rooms.json/data/topic" /> @@ -211,11 +214,11 @@ <!-- layout_goneMarginStart: add half the width of the avatar: 15dp --> <TextView android:id="@+id/peopleYouMayKnowText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintBottom_toBottomOf="@id/knownMember1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/knownMember5" @@ -251,7 +254,7 @@ <!-- <Button--> <!-- android:id="@+id/matrixToCardSecondaryButton"--> - <!-- style="@style/VectorButtonStyleOutlined"--> + <!-- style="@style/Widget.Vector.Button.Outlined"--> <!-- android:layout_width="0dp"--> <!-- android:layout_height="wrap_content"--> <!-- android:layout_marginTop="8dp"--> diff --git a/vector/src/main/res/layout/fragment_matrix_to_user_card.xml b/vector/src/main/res/layout/fragment_matrix_to_user_card.xml index 995759dc4b..fbe504a2d6 100644 --- a/vector/src/main/res/layout/fragment_matrix_to_user_card.xml +++ b/vector/src/main/res/layout/fragment_matrix_to_user_card.xml @@ -21,6 +21,7 @@ <TextView android:id="@+id/matrixToCardNameText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -30,12 +31,12 @@ android:singleLine="true" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="15sp" app:layout_constraintTop_toBottomOf="@+id/matrixToCardAvatar" tools:text="@sample/users.json/data/displayName" /> <TextView android:id="@+id/matrixToCardUserIdText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -45,7 +46,6 @@ android:singleLine="true" android:textAlignment="center" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintTop_toBottomOf="@id/matrixToCardNameText" tools:text="@sample/users.json/data/id" /> diff --git a/vector/src/main/res/layout/fragment_public_rooms.xml b/vector/src/main/res/layout/fragment_public_rooms.xml index 2569a8a092..a16d45591c 100644 --- a/vector/src/main/res/layout/fragment_public_rooms.xml +++ b/vector/src/main/res/layout/fragment_public_rooms.xml @@ -17,40 +17,34 @@ <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:elevation="4dp"> + android:layout_height="wrap_content"> - <androidx.appcompat.widget.Toolbar + <com.google.android.material.appbar.MaterialToolbar android:id="@+id/publicRoomsToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:elevation="4dp" android:minHeight="0dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap|enterAlways"> <androidx.appcompat.widget.SearchView android:id="@+id/publicRoomsFilter" - style="@style/VectorSearchView" android:layout_width="match_parent" android:layout_height="wrap_content" app:queryHint="@string/room_directory_search_hint" /> - </androidx.appcompat.widget.Toolbar> + </com.google.android.material.appbar.MaterialToolbar> <Button android:id="@+id/publicRoomsCreateNewRoom" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" + android:icon="@drawable/ic_plus_circle" android:minHeight="@dimen/layout_touch_size" android:text="@string/create_new_room" - app:icon="@drawable/ic_plus_circle" app:iconPadding="13dp" app:iconTint="?colorPrimary" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/layout/fragment_qr_code_scanner.xml b/vector/src/main/res/layout/fragment_qr_code_scanner.xml index b57d945aa3..78003e7032 100644 --- a/vector/src/main/res/layout/fragment_qr_code_scanner.xml +++ b/vector/src/main/res/layout/fragment_qr_code_scanner.xml @@ -16,27 +16,27 @@ <!-- TODO In the future we could add a toggle to switch the flash, and other possible settings --> <!-- TODO add take from album option.. --> -<!-- <Button--> -<!-- android:id="@+id/openAlbumButton"--> -<!-- style="@style/Widget.MaterialComponents.Button.Icon"--> -<!-- android:layout_width="34dp"--> -<!-- android:layout_height="34dp"--> -<!-- android:layout_marginEnd="@dimen/layout_horizontal_margin"--> -<!-- android:layout_marginBottom="@dimen/layout_vertical_margin_big"--> -<!-- android:backgroundTint="?vctr_bottom_nav_background_color"--> -<!-- android:elevation="0dp"--> -<!-- android:insetLeft="0dp"--> -<!-- android:insetTop="0dp"--> -<!-- android:insetRight="0dp"--> -<!-- android:insetBottom="0dp"--> -<!-- android:padding="0dp"--> -<!-- app:cornerRadius="17dp"--> -<!-- app:icon="@drawable/ic_picture_icon"--> -<!-- app:iconGravity="textStart"--> -<!-- app:iconPadding="0dp"--> -<!-- app:iconSize="20dp"--> -<!-- app:iconTint="?colorPrimary"--> -<!-- app:layout_constraintBottom_toBottomOf="parent"--> -<!-- app:layout_constraintEnd_toEndOf="parent"/>--> + <!-- <Button--> + <!-- android:id="@+id/openAlbumButton"--> + <!-- style="@style/Widget.MaterialComponents.Button.Icon"--> + <!-- android:layout_width="34dp"--> + <!-- android:layout_height="34dp"--> + <!-- android:layout_marginEnd="@dimen/layout_horizontal_margin"--> + <!-- android:layout_marginBottom="@dimen/layout_vertical_margin_big"--> + <!-- android:backgroundTint="?vctr_bottom_nav_background_color"--> + <!-- android:elevation="0dp"--> + <!-- android:insetLeft="0dp"--> + <!-- android:insetTop="0dp"--> + <!-- android:insetRight="0dp"--> + <!-- android:insetBottom="0dp"--> + <!-- android:padding="0dp"--> + <!-- app:cornerRadius="17dp"--> + <!-- app:icon="@drawable/ic_picture_icon"--> + <!-- app:iconGravity="textStart"--> + <!-- app:iconPadding="0dp"--> + <!-- app:iconSize="20dp"--> + <!-- app:iconTint="?colorPrimary"--> + <!-- app:layout_constraintBottom_toBottomOf="parent"--> + <!-- app:layout_constraintEnd_toEndOf="parent"/>--> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_reauth_confirm.xml b/vector/src/main/res/layout/fragment_reauth_confirm.xml index 9390edf7a2..7f58c76419 100644 --- a/vector/src/main/res/layout/fragment_reauth_confirm.xml +++ b/vector/src/main/res/layout/fragment_reauth_confirm.xml @@ -11,6 +11,7 @@ <TextView android:id="@+id/reAuthConfirmText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -18,51 +19,34 @@ android:layout_marginEnd="16dp" android:text="@string/re_authentication_default_confirm_text" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constraintBottom_toTopOf="@id/reAuthConfirmButton" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0" app:layout_constraintVertical_chainStyle="packed" /> - <FrameLayout - android:id="@+id/passwordContainer" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/passwordFieldTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" + android:hint="@string/login_signup_password_hint" + app:errorEnabled="true" + app:errorIconDrawable="@null" app:layout_constraintTop_toBottomOf="@id/reAuthConfirmText"> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/passwordFieldTil" + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/passwordField" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/login_signup_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> + android:ems="10" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:maxLines="1" + android:paddingEnd="48dp" + tools:ignore="RtlSymmetry" /> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/passwordField" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:imeOptions="actionDone" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/passwordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> + </com.google.android.material.textfield.TextInputLayout> <!-- <TextView--> <!-- android:id="@+id/loginPasswordNotice"--> @@ -70,7 +54,7 @@ <!-- android:layout_height="wrap_content"--> <!-- android:gravity="start"--> <!-- android:text="@string/login_signin_matrix_id_password_notice"--> - <!-- android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small"--> + <!-- style="@style/Widget.Vector.TextView.Caption"--> <!-- android:visibility="gone"--> <!-- app:layout_constraintEnd_toEndOf="parent"--> <!-- app:layout_constraintStart_toStartOf="parent"--> @@ -79,16 +63,16 @@ <TextView android:id="@+id/genericErrorText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:text="@string/authentication_error" - android:textAppearance="@style/TextAppearance.Vector.Login.Text.Small" android:textColor="?colorError" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/passwordContainer" + app:layout_constraintTop_toBottomOf="@id/passwordFieldTil" tools:visibility="visible" /> <Button diff --git a/vector/src/main/res/layout/fragment_recyclerview_with_search.xml b/vector/src/main/res/layout/fragment_recyclerview_with_search.xml index f40c4352d9..b685044e84 100644 --- a/vector/src/main/res/layout/fragment_recyclerview_with_search.xml +++ b/vector/src/main/res/layout/fragment_recyclerview_with_search.xml @@ -22,15 +22,11 @@ android:elevation="4dp"> <!-- minHeight="0dp" is important to collapse on scroll --> - <androidx.appcompat.widget.Toolbar + <com.google.android.material.appbar.MaterialToolbar android:id="@+id/addRoomToSpaceToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:elevation="4dp" android:minHeight="0dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap|enterAlways"> <LinearLayout @@ -41,6 +37,7 @@ <TextView android:id="@+id/appBarTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="8dp" @@ -48,12 +45,12 @@ android:gravity="start|center" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="18sp" android:textStyle="bold" tools:text="@tools:sample/lorem/random" /> <TextView android:id="@+id/appBarSpaceInfo" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="8dp" @@ -61,17 +58,15 @@ android:gravity="start|center" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="16sp" tools:text="@tools:sample/lorem/random" /> </LinearLayout> - </androidx.appcompat.widget.Toolbar> + </com.google.android.material.appbar.MaterialToolbar> <androidx.appcompat.widget.SearchView android:id="@+id/memberNameFilter" - style="@style/VectorSearchView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" @@ -81,14 +76,6 @@ app:layout_constraintTop_toBottomOf="@+id/addRoomToSpaceToolbar" app:queryHint="@string/search_hint_room_name" /> - <!-- <ProgressBar--> - <!-- android:id="@+id/listBuildingProgress"--> - <!-- android:indeterminate="true"--> - <!-- android:layout_width="match_parent"--> - <!-- android:layout_height="8dp"--> - <!-- style="@style/Widget.AppCompat.ProgressBar.Horizontal"--> - <!-- />--> - </com.google.android.material.appbar.AppBarLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_review_terms.xml b/vector/src/main/res/layout/fragment_review_terms.xml index 2c7fa6c586..58c13262e7 100644 --- a/vector/src/main/res/layout/fragment_review_terms.xml +++ b/vector/src/main/res/layout/fragment_review_terms.xml @@ -30,7 +30,7 @@ <Button android:id="@+id/reviewTermsDecline" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" diff --git a/vector/src/main/res/layout/fragment_room_detail.xml b/vector/src/main/res/layout/fragment_room_detail.xml index 6a5cae4452..e46825dfc6 100644 --- a/vector/src/main/res/layout/fragment_room_detail.xml +++ b/vector/src/main/res/layout/fragment_room_detail.xml @@ -6,79 +6,84 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/roomToolbar" - android:layout_width="0dp" - android:layout_height="?actionBarSize" - android:elevation="4dp" - android:transitionName="toolbar" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/roomToolbarContentView" + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/roomToolbar" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="?actionBarSize" + android:transitionName="toolbar"> - <ImageView - android:id="@+id/roomToolbarAvatarImageView" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" - android:contentDescription="@string/avatar" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:src="@sample/room_round_avatars" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/roomToolbarContentView" + android:layout_width="match_parent" + android:layout_height="match_parent"> - <im.vector.app.core.ui.views.ShieldImageView - android:id="@+id/roomToolbarDecorationImageView" - android:layout_width="20dp" - android:layout_height="20dp" - app:layout_constraintCircle="@+id/roomToolbarAvatarImageView" - app:layout_constraintCircleAngle="135" - app:layout_constraintCircleRadius="20dp" - tools:ignore="MissingConstraints" /> + <ImageView + android:id="@+id/roomToolbarAvatarImageView" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:contentDescription="@string/avatar" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@sample/room_round_avatars" /> - <TextView - android:id="@+id/roomToolbarTitleView" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - app:layout_constraintBottom_toTopOf="@+id/roomToolbarSubtitleView" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/roomToolbarAvatarImageView" - app:layout_constraintTop_toTopOf="parent" - tools:text="@sample/rooms.json/data/name" /> + <im.vector.app.core.ui.views.ShieldImageView + android:id="@+id/roomToolbarDecorationImageView" + android:layout_width="20dp" + android:layout_height="20dp" + app:layout_constraintCircle="@+id/roomToolbarAvatarImageView" + app:layout_constraintCircleAngle="135" + app:layout_constraintCircleRadius="20dp" + tools:ignore="MissingConstraints" /> - <TextView - android:id="@+id/roomToolbarSubtitleView" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:layout_marginBottom="8dp" - android:ellipsize="end" - android:maxLines="1" - android:textColor="?vctr_content_primary" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/roomToolbarAvatarImageView" - app:layout_constraintTop_toBottomOf="@+id/roomToolbarTitleView" - tools:text="@sample/rooms.json/data/topic" /> + <TextView + android:id="@+id/roomToolbarTitleView" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:textColor="?vctr_content_primary" + app:layout_constraintBottom_toTopOf="@+id/roomToolbarSubtitleView" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/roomToolbarAvatarImageView" + app:layout_constraintTop_toTopOf="parent" + tools:text="@sample/rooms.json/data/name" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/roomToolbarSubtitleView" + style="@style/Widget.Vector.TextView.Body" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:layout_marginBottom="8dp" + android:ellipsize="end" + android:maxLines="1" + android:textColor="?vctr_content_primary" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/roomToolbarAvatarImageView" + app:layout_constraintTop_toBottomOf="@+id/roomToolbarTitleView" + tools:text="@sample/rooms.json/data/topic" /> - </androidx.appcompat.widget.Toolbar> + </androidx.constraintlayout.widget.ConstraintLayout> + + </com.google.android.material.appbar.MaterialToolbar> + + </com.google.android.material.appbar.AppBarLayout> <androidx.constraintlayout.widget.Barrier android:id="@+id/timelineRecyclerViewBarrier" @@ -93,7 +98,7 @@ android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/roomToolbar" /> + app:layout_constraintTop_toBottomOf="@id/appBarLayout" /> <im.vector.app.core.ui.views.CurrentCallsView android:id="@+id/activeCallView" @@ -122,32 +127,22 @@ app:layout_constraintTop_toBottomOf="@id/activeConferenceView" tools:listitem="@layout/item_timeline_event_base" /> - <FrameLayout - android:id="@+id/bannersContainer" - android:layout_width="0dp" + <com.google.android.material.chip.Chip + android:id="@+id/jumpToReadMarkerView" + style="?vctr_jump_to_unread_style" + app:chipIcon="@drawable/ic_jump_to_unread" + app:closeIcon="@drawable/ic_close_24dp" + android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginTop="24dp" + android:text="@string/room_jump_to_first_unread" + android:visibility="invisible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/activeConferenceView"> + app:layout_constraintTop_toBottomOf="@id/activeConferenceView" + tools:visibility="visible" /> - <!-- <im.vector.app.features.home.room.detail.widget.RoomWidgetsBannerView--> - <!-- android:id="@+id/roomWidgetsBannerView"--> - <!-- android:layout_width="match_parent"--> - <!-- android:layout_height="wrap_content"--> - <!-- android:layout_marginStart="8dp"--> - <!-- android:layout_marginTop="8dp"--> - <!-- android:layout_marginEnd="8dp"--> - <!-- android:visibility="gone"--> - <!-- tools:visibility="visible" />--> - - <im.vector.app.core.ui.views.JumpToReadMarkerView - android:id="@+id/jumpToReadMarkerView" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:visibility="invisible" - tools:visibility="visible" /> - - </FrameLayout> <im.vector.app.core.ui.views.NotificationAreaView android:id="@+id/notificationAreaView" @@ -188,7 +183,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/roomToolbar" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" tools:visibility="gone" /> <androidx.constraintlayout.widget.Barrier @@ -208,7 +203,7 @@ android:focusable="true" app:cardCornerRadius="16dp" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/activeConferenceView"> + app:layout_constraintTop_toBottomOf="@id/jumpToReadMarkerView"> <org.webrtc.SurfaceViewRenderer android:id="@+id/activeCallPiP" diff --git a/vector/src/main/res/layout/fragment_room_directory_picker.xml b/vector/src/main/res/layout/fragment_room_directory_picker.xml index 28c3c4d184..60dccd6e37 100644 --- a/vector/src/main/res/layout/fragment_room_directory_picker.xml +++ b/vector/src/main/res/layout/fragment_room_directory_picker.xml @@ -7,55 +7,34 @@ android:layout_height="match_parent" android:background="?android:colorBackground"> - <com.google.android.material.appbar.AppBarLayout + <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:elevation="4dp"> + android:layout_height="match_parent"> - <com.google.android.material.appbar.CollapsingToolbarLayout - android:id="@+id/spaceExploreCollapsingToolbarLayout" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="match_parent" - android:theme="@style/Vector.Toolbar.Profile" - app:contentScrim="?android:colorBackground" - app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" - app:scrimAnimationDuration="250" - app:scrimVisibleHeightTrigger="120dp" - app:titleEnabled="false" - app:toolbarId="@+id/toolbar"> + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent"> - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="40dp"> - - <include - android:id="@+id/spaceCard" - layout="@layout/fragment_matrix_to_room_space_card" /> - </FrameLayout> - - <androidx.appcompat.widget.Toolbar + <com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:elevation="4dp" - app:layout_collapseMode="pin" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + tools:title="Title" /> + </com.google.android.material.appbar.AppBarLayout> - </com.google.android.material.appbar.CollapsingToolbarLayout> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/roomDirectoryPickerList" + android:layout_width="match_parent" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" + tools:listitem="@layout/item_room_directory" /> - </com.google.android.material.appbar.AppBarLayout> - - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/roomDirectoryPickerList" - android:background="?android:colorBackground" - android:layout_width="match_parent" - android:layout_height="match_parent" - app:layout_behavior="@string/appbar_scrolling_view_behavior" - tools:listitem="@layout/item_room_directory" /> + </androidx.constraintlayout.widget.ConstraintLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_room_list.xml b/vector/src/main/res/layout/fragment_room_list.xml index 9fe328ab6b..fac0c0f170 100644 --- a/vector/src/main/res/layout/fragment_room_list.xml +++ b/vector/src/main/res/layout/fragment_room_list.xml @@ -5,13 +5,14 @@ android:id="@+id/stateView" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?colorSurface"> + android:background="?android:colorBackground"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/roomListView" android:layout_width="match_parent" android:layout_height="match_parent" android:overScrollMode="always" + tools:itemCount="5" tools:listitem="@layout/item_room" /> <im.vector.app.features.home.room.list.widget.NotifsFabMenuView diff --git a/vector/src/main/res/layout/fragment_room_preview_no_preview.xml b/vector/src/main/res/layout/fragment_room_preview_no_preview.xml index 2fd7644a76..acbd5a1f4f 100644 --- a/vector/src/main/res/layout/fragment_room_preview_no_preview.xml +++ b/vector/src/main/res/layout/fragment_room_preview_no_preview.xml @@ -11,56 +11,62 @@ android:layout_height="match_parent" android:orientation="vertical"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/roomPreviewNoPreviewToolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="?actionBarSize" - android:elevation="4dp"> + android:layout_height="wrap_content"> - <androidx.constraintlayout.widget.ConstraintLayout + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/roomPreviewNoPreviewToolbar" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="?actionBarSize"> - <ImageView - android:id="@+id/roomPreviewNoPreviewToolbarAvatar" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" - android:contentDescription="@string/avatar" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:src="@sample/room_round_avatars" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> - <TextView - android:id="@+id/roomPreviewNoPreviewToolbarTitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/roomPreviewNoPreviewToolbarAvatar" - app:layout_constraintTop_toTopOf="parent" - tools:text="@sample/users.json/data/displayName" /> + <ImageView + android:id="@+id/roomPreviewNoPreviewToolbarAvatar" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:contentDescription="@string/avatar" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@sample/room_round_avatars" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/roomPreviewNoPreviewToolbarTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:textColor="?vctr_content_primary" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/roomPreviewNoPreviewToolbarAvatar" + app:layout_constraintTop_toTopOf="parent" + tools:text="@sample/users.json/data/displayName" /> - </androidx.appcompat.widget.Toolbar> + </androidx.constraintlayout.widget.ConstraintLayout> - <ProgressBar - android:id="@+id/roomPreviewPeekingProgress" - style="@style/Widget.AppCompat.ProgressBar.Horizontal" - android:layout_width="match_parent" - android:layout_height="14dp" - android:layout_gravity="center" - android:indeterminate="true" /> + </com.google.android.material.appbar.MaterialToolbar> + + <ProgressBar + android:id="@+id/roomPreviewPeekingProgress" + style="@style/Widget.Vector.ProgressBar.Horizontal" + android:layout_width="match_parent" + android:layout_height="14dp" + android:layout_gravity="center" + android:indeterminate="true" /> + + </com.google.android.material.appbar.AppBarLayout> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" @@ -84,44 +90,44 @@ <TextView android:id="@+id/roomPreviewNoPreviewName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="56dp" android:gravity="center" - android:textAppearance="@style/TextAppearance.Vector.Title" - android:textSize="15sp" + android:textColor="?vctr_content_primary" android:textStyle="bold" tools:text="@sample/rooms.json/data/name" /> <TextView android:id="@+id/roomPreviewNoPreviewTopic" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:autoLink="web" android:gravity="center" - android:textAppearance="@style/TextAppearance.Vector.Subtitle" - android:textSize="15sp" + android:textColor="?vctr_content_secondary" tools:text="@sample/rooms.json/data/topic" /> <TextView android:id="@+id/roomPreviewNoPreviewLabel" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="28dp" android:gravity="center" - android:textAppearance="@style/TextAppearance.Vector.Subtitle2" - android:textSize="14sp" + android:textColor="?vctr_content_secondary" tools:text="@string/room_preview_no_preview" /> <TextView android:id="@+id/roomPreviewNoPreviewError" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" android:gravity="center" android:textColor="?colorError" - android:textSize="15sp" android:visibility="gone" tools:text="Error" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/fragment_room_setting_generic.xml b/vector/src/main/res/layout/fragment_room_setting_generic.xml index f00e9c425c..7d63c140f3 100644 --- a/vector/src/main/res/layout/fragment_room_setting_generic.xml +++ b/vector/src/main/res/layout/fragment_room_setting_generic.xml @@ -7,60 +7,66 @@ android:layout_height="match_parent" android:background="?android:colorBackground"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/roomSettingsToolbar" - android:layout_width="0dp" - android:layout_height="?actionBarSize" - android:elevation="4dp" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/roomSettingsToolbarContentView" + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/roomSettingsToolbar" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="?actionBarSize"> - <ImageView - android:id="@+id/roomSettingsToolbarAvatarImageView" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" - android:contentDescription="@string/avatar" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:src="@sample/room_round_avatars" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/roomSettingsToolbarContentView" + android:layout_width="match_parent" + android:layout_height="match_parent"> - <im.vector.app.core.ui.views.ShieldImageView - android:id="@+id/roomSettingsDecorationToolbarAvatarImageView" - android:layout_width="24dp" - android:layout_height="24dp" - app:layout_constraintCircle="@+id/roomSettingsToolbarAvatarImageView" - app:layout_constraintCircleAngle="135" - app:layout_constraintCircleRadius="20dp" - tools:ignore="MissingConstraints" /> + <ImageView + android:id="@+id/roomSettingsToolbarAvatarImageView" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:contentDescription="@string/avatar" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@sample/room_round_avatars" /> - <TextView - android:id="@+id/roomSettingsToolbarTitleView" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/roomSettingsToolbarAvatarImageView" - app:layout_constraintTop_toTopOf="parent" - tools:text="@sample/rooms.json/data/name" /> + <im.vector.app.core.ui.views.ShieldImageView + android:id="@+id/roomSettingsDecorationToolbarAvatarImageView" + android:layout_width="24dp" + android:layout_height="24dp" + app:layout_constraintCircle="@+id/roomSettingsToolbarAvatarImageView" + app:layout_constraintCircleAngle="135" + app:layout_constraintCircleRadius="20dp" + tools:ignore="MissingConstraints" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/roomSettingsToolbarTitleView" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:textColor="?vctr_content_primary" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/roomSettingsToolbarAvatarImageView" + app:layout_constraintTop_toTopOf="parent" + tools:text="@sample/rooms.json/data/name" /> - </androidx.appcompat.widget.Toolbar> + </androidx.constraintlayout.widget.ConstraintLayout> + + </com.google.android.material.appbar.MaterialToolbar> + + </com.google.android.material.appbar.AppBarLayout> <androidx.coordinatorlayout.widget.CoordinatorLayout android:id="@+id/coordinatorLayout" @@ -69,7 +75,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/roomSettingsToolbar"> + app:layout_constraintTop_toBottomOf="@+id/appBarLayout"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/roomSettingsRecyclerView" @@ -95,7 +101,6 @@ <androidx.appcompat.widget.SearchView android:id="@+id/searchView" - style="@style/VectorSearchView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="4dp" diff --git a/vector/src/main/res/layout/fragment_room_uploads.xml b/vector/src/main/res/layout/fragment_room_uploads.xml index 3c598a2ac2..9d4155229f 100644 --- a/vector/src/main/res/layout/fragment_room_uploads.xml +++ b/vector/src/main/res/layout/fragment_room_uploads.xml @@ -10,15 +10,12 @@ android:id="@+id/roomUploadsAppBar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:elevation="4dp" android:transitionName="toolbar"> - <androidx.appcompat.widget.Toolbar + <com.google.android.material.appbar.MaterialToolbar android:id="@+id/roomUploadsToolbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@android:color/transparent" - android:elevation="4dp" app:layout_collapseMode="pin"> <androidx.constraintlayout.widget.ConstraintLayout @@ -49,6 +46,7 @@ <TextView android:id="@+id/roomUploadsToolbarTitleView" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -56,7 +54,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/roomUploadsToolbarAvatarImageView" @@ -65,7 +62,7 @@ </androidx.constraintlayout.widget.ConstraintLayout> - </androidx.appcompat.widget.Toolbar> + </com.google.android.material.appbar.MaterialToolbar> <com.google.android.material.tabs.TabLayout android:id="@+id/roomUploadsTabs" diff --git a/vector/src/main/res/layout/fragment_room_widget.xml b/vector/src/main/res/layout/fragment_room_widget.xml index 604e7fc947..7c464caf4c 100644 --- a/vector/src/main/res/layout/fragment_room_widget.xml +++ b/vector/src/main/res/layout/fragment_room_widget.xml @@ -40,6 +40,7 @@ <TextView android:id="@+id/widgetErrorText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" diff --git a/vector/src/main/res/layout/fragment_set_identity_server.xml b/vector/src/main/res/layout/fragment_set_identity_server.xml index 4c3567fedc..2f3444b451 100644 --- a/vector/src/main/res/layout/fragment_set_identity_server.xml +++ b/vector/src/main/res/layout/fragment_set_identity_server.xml @@ -14,17 +14,17 @@ <TextView android:id="@+id/identityServerSetDefaultNotice" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:visibility="gone" tools:text="@string/identity_server_set_default_notice" tools:visibility="visible" /> <Button android:id="@+id/identityServerSetDefaultSubmit" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -37,10 +37,10 @@ <TextView android:id="@+id/identityServerSetDefaultAlternative" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="?vctr_content_primary" - android:textSize="16sp" tools:text="@string/identity_server_set_alternative_notice" /> <com.google.android.material.textfield.TextInputLayout @@ -64,7 +64,7 @@ <Button android:id="@+id/identityServerSetDefaultAlternativeSubmit" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/fragment_settings_notifications_troubleshoot.xml b/vector/src/main/res/layout/fragment_settings_notifications_troubleshoot.xml index 9ddf1b133e..1eab008910 100644 --- a/vector/src/main/res/layout/fragment_settings_notifications_troubleshoot.xml +++ b/vector/src/main/res/layout/fragment_settings_notifications_troubleshoot.xml @@ -30,6 +30,7 @@ <TextView android:id="@+id/troubleshoot_summ_title" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -41,6 +42,7 @@ <TextView android:id="@+id/toubleshoot_summ_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" diff --git a/vector/src/main/res/layout/fragment_space_add_rooms.xml b/vector/src/main/res/layout/fragment_space_add_rooms.xml index 0380b3e740..f2150cb390 100644 --- a/vector/src/main/res/layout/fragment_space_add_rooms.xml +++ b/vector/src/main/res/layout/fragment_space_add_rooms.xml @@ -17,19 +17,14 @@ <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:elevation="4dp"> + android:layout_height="wrap_content"> <!-- minHeight="0dp" is important to collapse on scroll --> - <androidx.appcompat.widget.Toolbar + <com.google.android.material.appbar.MaterialToolbar android:id="@+id/addRoomToSpaceToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:elevation="4dp" android:minHeight="0dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap|enterAlways"> <LinearLayout @@ -40,6 +35,7 @@ <TextView android:id="@+id/appBarTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="8dp" @@ -48,11 +44,11 @@ android:maxLines="1" android:text="@string/space_add_existing_rooms" android:textColor="?vctr_content_primary" - android:textSize="18sp" android:textStyle="bold" /> <TextView android:id="@+id/appBarSpaceInfo" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="8dp" @@ -60,17 +56,15 @@ android:gravity="start|center" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="16sp" tools:text="@sample/spaces.json/data/name" /> </LinearLayout> - </androidx.appcompat.widget.Toolbar> + </com.google.android.material.appbar.MaterialToolbar> <androidx.appcompat.widget.SearchView android:id="@+id/publicRoomsFilter" - style="@style/VectorSearchView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" @@ -82,7 +76,7 @@ <Button android:id="@+id/createNewRoom" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -94,7 +88,8 @@ app:iconPadding="13dp" app:iconTint="?colorPrimary" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/addRoomToSpaceToolbar" /> + app:layout_constraintTop_toBottomOf="@+id/addRoomToSpaceToolbar" + tools:ignore="MissingPrefix" /> </com.google.android.material.appbar.AppBarLayout> diff --git a/vector/src/main/res/layout/fragment_space_create_choose_private_model.xml b/vector/src/main/res/layout/fragment_space_create_choose_private_model.xml index d6709c2994..e1e555eace 100644 --- a/vector/src/main/res/layout/fragment_space_create_choose_private_model.xml +++ b/vector/src/main/res/layout/fragment_space_create_choose_private_model.xml @@ -13,23 +13,23 @@ <TextView android:id="@+id/headerText" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@string/create_spaces_who_are_you_working_with" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/accessInfoHelpText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center" android:textColor="?vctr_content_secondary" - android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/headerText" tools:text="@string/create_spaces_make_sure_access" /> diff --git a/vector/src/main/res/layout/fragment_space_create_choose_type.xml b/vector/src/main/res/layout/fragment_space_create_choose_type.xml index 0aab5b34e6..b675ec9b30 100644 --- a/vector/src/main/res/layout/fragment_space_create_choose_type.xml +++ b/vector/src/main/res/layout/fragment_space_create_choose_type.xml @@ -12,22 +12,22 @@ <TextView android:id="@+id/headerText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@string/create_spaces_type_header" android:textColor="?vctr_content_secondary" - android:textSize="16sp" app:layout_constraintTop_toTopOf="parent" /> <TextView + style="@style/Widget.Vector.TextView.Title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:gravity="center" android:text="@string/create_spaces_choose_type_label" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@id/joinInfoHelpText" app:layout_constraintTop_toBottomOf="@id/headerText" @@ -35,13 +35,13 @@ <TextView android:id="@+id/joinInfoHelpText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="24dp" android:gravity="center" android:text="@string/create_spaces_join_info_help" android:textColor="?vctr_content_secondary" - android:textSize="14sp" app:layout_constraintBottom_toTopOf="@id/publicButton" /> <im.vector.app.features.spaces.create.WizardButtonView @@ -72,13 +72,13 @@ <TextView android:id="@+id/changeLaterText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="24dp" android:gravity="center" android:text="@string/create_spaces_you_can_change_later" android:textColor="?vctr_content_secondary" - android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/fragment_space_directory.xml b/vector/src/main/res/layout/fragment_space_directory.xml new file mode 100644 index 0000000000..3d5932df4a --- /dev/null +++ b/vector/src/main/res/layout/fragment_space_directory.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/coordinatorLayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="?android:colorBackground"> + + <com.google.android.material.appbar.AppBarLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <com.google.android.material.appbar.CollapsingToolbarLayout + android:id="@+id/spaceExploreCollapsingToolbarLayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:contentScrim="?android:colorBackground" + app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" + app:scrimAnimationDuration="250" + app:scrimVisibleHeightTrigger="120dp" + app:titleEnabled="false" + app:toolbarId="@+id/toolbar"> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="40dp"> + + <include + android:id="@+id/spaceCard" + layout="@layout/fragment_matrix_to_room_space_card" /> + + </FrameLayout> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_collapseMode="pin" /> + + </com.google.android.material.appbar.CollapsingToolbarLayout> + + </com.google.android.material.appbar.AppBarLayout> + + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/spaceDirectoryList" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="?android:colorBackground" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:listitem="@layout/item_room_directory" /> + +</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_space_preview.xml b/vector/src/main/res/layout/fragment_space_preview.xml index 05a9d447d2..e5c0a933d7 100644 --- a/vector/src/main/res/layout/fragment_space_preview.xml +++ b/vector/src/main/res/layout/fragment_space_preview.xml @@ -11,70 +11,64 @@ android:layout_height="match_parent" android:orientation="vertical"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/roomPreviewNoPreviewToolbar" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="?actionBarSize" - android:elevation="4dp" - app:navigationIcon="@drawable/ic_x_18dp"> + android:layout_height="wrap_content"> - <androidx.constraintlayout.widget.ConstraintLayout + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/roomPreviewNoPreviewToolbar" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="?actionBarSize" + app:navigationIcon="@drawable/ic_x_18dp" + app:navigationIconTint="?vctr_content_secondary"> - <!-- <ImageView--> - <!-- android:id="@+id/spacePreviewClose"--> - <!-- android:layout_width="@dimen/layout_touch_size"--> - <!-- android:layout_height="@dimen/layout_touch_size"--> - <!-- android:clickable="true"--> - <!-- android:focusable="true"--> - <!-- android:foreground="?attr/selectableItemBackground"--> - <!-- android:scaleType="center"--> - <!-- android:src="@drawable/ic_x_18dp"--> - <!-- app:layout_constraintBottom_toBottomOf="parent"--> - <!-- app:layout_constraintStart_toStartOf="parent"--> - <!-- app:layout_constraintTop_toTopOf="parent" />--> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> - <ImageView - android:id="@+id/spacePreviewToolbarAvatar" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" - android:contentDescription="@string/avatar" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:src="@sample/space_avatars" /> + <ImageView + android:id="@+id/spacePreviewToolbarAvatar" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:contentDescription="@string/avatar" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@sample/space_avatars" /> - <TextView - android:id="@+id/roomPreviewNoPreviewToolbarTitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/spacePreviewToolbarAvatar" - app:layout_constraintTop_toTopOf="parent" - tools:text="@sample/users.json/data/displayName" /> + <TextView + android:id="@+id/roomPreviewNoPreviewToolbarTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:textColor="?vctr_content_primary" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/spacePreviewToolbarAvatar" + app:layout_constraintTop_toTopOf="parent" + tools:text="@sample/users.json/data/displayName" /> - </androidx.constraintlayout.widget.ConstraintLayout> + </androidx.constraintlayout.widget.ConstraintLayout> - </androidx.appcompat.widget.Toolbar> + </com.google.android.material.appbar.MaterialToolbar> - <ProgressBar - android:id="@+id/spacePreviewPeekingProgress" - style="@style/Widget.AppCompat.ProgressBar.Horizontal" - android:layout_width="match_parent" - android:layout_height="14dp" - android:layout_gravity="center" - android:indeterminate="true" /> + <ProgressBar + android:id="@+id/spacePreviewPeekingProgress" + style="@style/Widget.Vector.ProgressBar.Horizontal" + android:layout_width="match_parent" + android:layout_height="14dp" + android:layout_gravity="center" + android:indeterminate="true" /> + + </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/spacePreviewRecyclerView" @@ -107,7 +101,7 @@ <Button android:id="@+id/spacePreviewDeclineInviteButton" - style="@style/VectorButtonStyle.Destructive" + style="@style/Widget.Vector.Button.Destructive" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="16dp" @@ -116,7 +110,7 @@ <Button android:id="@+id/spacePreviewAcceptInviteButton" - style="@style/VectorButtonStyle.Positive" + style="@style/Widget.Vector.Button.Positive" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" diff --git a/vector/src/main/res/layout/fragment_ssss_access_from_key.xml b/vector/src/main/res/layout/fragment_ssss_access_from_key.xml index 31550f5bc7..0b015f65f9 100644 --- a/vector/src/main/res/layout/fragment_ssss_access_from_key.xml +++ b/vector/src/main/res/layout/fragment_ssss_access_from_key.xml @@ -25,6 +25,7 @@ <TextView android:id="@+id/ssss_restore_with_key" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -32,7 +33,6 @@ android:layout_marginEnd="16dp" android:text="@string/recovery_key" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/ssss_shield" @@ -41,11 +41,11 @@ <TextView android:id="@+id/ssss_restore_with_key_text" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="16dp" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/ssss_restore_with_key" @@ -81,7 +81,7 @@ <Button android:id="@+id/ssss_key_use_file" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/use_file" @@ -90,7 +90,7 @@ <Button android:id="@+id/ssss_key_submit" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/_continue" diff --git a/vector/src/main/res/layout/fragment_ssss_access_from_passphrase.xml b/vector/src/main/res/layout/fragment_ssss_access_from_passphrase.xml index e334576659..37aa44af2e 100644 --- a/vector/src/main/res/layout/fragment_ssss_access_from_passphrase.xml +++ b/vector/src/main/res/layout/fragment_ssss_access_from_passphrase.xml @@ -16,7 +16,7 @@ android:id="@+id/ssss_shield" android:layout_width="24dp" android:layout_height="24dp" - android:layout_marginStart="16dp" + android:layout_marginStart="@dimen/layout_horizontal_margin" android:importantForAccessibility="no" android:src="@drawable/ic_security_phrase_24dp" app:layout_constraintBottom_toBottomOf="@+id/ssss_restore_with_passphrase" @@ -27,13 +27,13 @@ <TextView android:id="@+id/ssss_restore_with_passphrase" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="16dp" android:text="@string/recovery_passphrase" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/ssss_shield" @@ -41,11 +41,11 @@ <TextView android:id="@+id/ssss_restore_with_passphrase_warning_text" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="16dp" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/ssss_restore_with_passphrase" @@ -53,12 +53,14 @@ <com.google.android.material.textfield.TextInputLayout android:id="@+id/ssss_passphrase_enter_til" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" + android:layout_marginStart="@dimen/layout_horizontal_margin" android:layout_marginTop="16dp" + android:layout_marginEnd="@dimen/layout_horizontal_margin" app:errorEnabled="true" - app:layout_constraintEnd_toStartOf="@id/ssss_view_show_password" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/ssss_restore_with_passphrase_warning_text"> @@ -74,21 +76,9 @@ </com.google.android.material.textfield.TextInputLayout> - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/ssss_view_show_password" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_marginTop="8dp" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="@+id/ssss_passphrase_enter_til" - app:tint="?colorSecondary" /> - <Button android:id="@+id/ssss_passphrase_submit" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/layout_horizontal_margin" @@ -98,19 +88,19 @@ <TextView android:id="@+id/ssss_passphrase_or" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="@string/or" android:textColor="?vctr_content_primary" - android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/ssss_passphrase_submit" /> <Button android:id="@+id/ssss_passphrase_use_key" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" @@ -119,7 +109,8 @@ app:layout_constraintBottom_toTopOf="@+id/ssss_passphrase_reset" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/ssss_passphrase_or" /> + app:layout_constraintTop_toBottomOf="@+id/ssss_passphrase_or" + tools:ignore="MissingPrefix" /> <im.vector.app.core.ui.views.BottomSheetActionButton android:id="@+id/ssss_passphrase_reset" diff --git a/vector/src/main/res/layout/fragment_ssss_reset_all.xml b/vector/src/main/res/layout/fragment_ssss_reset_all.xml index ce402215a5..e46517e20b 100644 --- a/vector/src/main/res/layout/fragment_ssss_reset_all.xml +++ b/vector/src/main/res/layout/fragment_ssss_reset_all.xml @@ -12,6 +12,7 @@ <TextView android:id="@+id/reset_title" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -19,16 +20,17 @@ android:drawablePadding="8dp" android:text="@string/secure_backup_reset_all" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" - android:tint="?vctr_content_primary" app:drawableStartCompat="@drawable/ic_alert_triangle" app:drawableTint="?vctr_content_primary" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:tint="?vctr_content_primary" + tools:ignore="MissingPrefix" /> <TextView android:id="@+id/ssss_reset_all_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -43,6 +45,7 @@ <TextView android:id="@+id/ssss_reset_other_devices" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="48dp" android:layout_marginStart="16dp" @@ -51,7 +54,6 @@ android:drawablePadding="8dp" android:gravity="center_vertical" android:textColor="?vctr_content_secondary" - android:textSize="17sp" android:visibility="gone" app:drawableStartCompat="@drawable/ic_smartphone" app:drawableTint="?vctr_content_secondary" @@ -61,19 +63,20 @@ <TextView android:id="@+id/ssss_reset_text3" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:text="@string/secure_backup_reset_if_you_reset_all" android:textColor="?colorError" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/ssss_reset_other_devices" /> <TextView android:id="@+id/ssss_reset_text4" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -82,12 +85,11 @@ android:layout_marginBottom="16dp" android:text="@string/secure_backup_reset_no_history" android:textColor="?vctr_content_primary" - android:textSize="15sp" app:layout_constraintTop_toBottomOf="@id/ssss_reset_text3" /> <Button android:id="@+id/ssss_reset_button_cancel" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cancel" @@ -95,7 +97,7 @@ <Button android:id="@+id/ssss_reset_button_reset" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/reset" diff --git a/vector/src/main/res/layout/fragment_user_code_show.xml b/vector/src/main/res/layout/fragment_user_code_show.xml index 29ea47e2ae..10a5998d1d 100644 --- a/vector/src/main/res/layout/fragment_user_code_show.xml +++ b/vector/src/main/res/layout/fragment_user_code_show.xml @@ -5,113 +5,99 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + <!-- Source: https://www.figma.com/file/X4XTH9iS2KGJ2wFKDqkyed/Compound?node-id=2857%3A321 --> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/showUserCodeToolBar" - android:layout_width="0dp" - android:layout_height="?actionBarSize" - android:elevation="4dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <ImageView - android:id="@+id/showUserCodeClose" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:contentDescription="@string/action_close" - android:scaleType="center" - android:src="@drawable/ic_x_18dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/showUserCodeTitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:text="@string/add_by_qr_code" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - android:textStyle="bold" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/showUserCodeClose" - app:layout_constraintTop_toTopOf="parent" /> - - </androidx.constraintlayout.widget.ConstraintLayout> - - </androidx.appcompat.widget.Toolbar> - - - <ImageView - android:id="@+id/showUserCodeAvatar" - android:layout_width="60dp" - android:layout_height="60dp" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:contentDescription="@string/avatar" - android:elevation="4dp" - android:transitionName="profile" - app:layout_constraintBottom_toBottomOf="@id/showUserCodeCardTopBarrier" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@id/showUserCodeCardTopBarrier" - tools:src="@sample/user_round_avatars" /> - - <androidx.constraintlayout.widget.Barrier - android:id="@+id/showUserCodeCardTopBarrier" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - app:barrierDirection="top" - app:constraint_referenced_ids="showUserCodeCard" /> + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/showUserCodeToolBar" + android:layout_width="match_parent" + android:layout_height="?actionBarSize"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ImageView + android:id="@+id/showUserCodeClose" + android:layout_width="@dimen/layout_touch_size" + android:layout_height="@dimen/layout_touch_size" + android:contentDescription="@string/action_close" + android:scaleType="center" + android:src="@drawable/ic_x_18dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> + + <TextView + android:id="@+id/showUserCodeTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:text="@string/add_by_qr_code" + android:textColor="?vctr_content_primary" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/showUserCodeClose" + app:layout_constraintTop_toTopOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + </com.google.android.material.appbar.MaterialToolbar> + + </com.google.android.material.appbar.AppBarLayout> + <com.google.android.material.card.MaterialCardView android:id="@+id/showUserCodeCard" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" - android:layout_marginTop="50dp" + android:layout_marginTop="81dp" android:padding="16dp" - app:cardCornerRadius="20dp" + app:cardCornerRadius="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/showUserCodeToolBar" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" app:layout_constraintWidth_percent="0.8"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minWidth="300dp" - android:paddingTop="40dp"> + android:layout_height="wrap_content"> <TextView android:id="@+id/showUserCodeCardNameText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" + android:layout_marginTop="50dp" android:layout_marginEnd="16dp" android:maxLines="1" android:singleLine="true" android:textAlignment="center" android:textColor="?vctr_content_primary" - android:textSize="15sp" app:layout_constraintTop_toTopOf="parent" tools:text="@sample/users.json/data/displayName" /> <TextView android:id="@+id/showUserCodeCardUserIdText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -120,8 +106,7 @@ android:maxLines="1" android:singleLine="true" android:textAlignment="center" - android:textColor="?vctr_content_secondary" - android:textSize="15sp" + android:textColor="?vctr_content_tertiary" app:layout_constraintTop_toBottomOf="@id/showUserCodeCardNameText" tools:text="@sample/users.json/data/id" /> @@ -133,25 +118,47 @@ <!-- android:contentDescription="@string/a11y_qr_code_for_verification"--> <!-- tools:src="@color/vctr_header_panel_background_black" />--> - <im.vector.app.core.ui.views.QrCodeImageView - android:id="@+id/showUserCodeQRImage" - android:layout_width="260dp" - android:layout_height="260dp" - android:layout_gravity="center" - android:layout_marginTop="10dp" - android:layout_marginBottom="@dimen/layout_vertical_margin" + <com.google.android.material.card.MaterialCardView + android:layout_width="200dp" + android:layout_height="200dp" + android:layout_marginTop="16dp" + android:layout_marginBottom="32dp" + android:backgroundTint="@color/palette_white" + app:cardCornerRadius="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/showUserCodeCardUserIdText" - tools:src="@drawable/ic_qr_code_add" /> + app:layout_constraintWidth_percent="0.8"> + + <im.vector.app.core.ui.views.QrCodeImageView + android:id="@+id/showUserCodeQRImage" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:src="@drawable/ic_qr_code_add" /> + + </com.google.android.material.card.MaterialCardView> </androidx.constraintlayout.widget.ConstraintLayout> </com.google.android.material.card.MaterialCardView> + <ImageView + android:id="@+id/showUserCodeAvatar" + android:layout_width="76dp" + android:layout_height="76dp" + android:contentDescription="@string/avatar" + android:elevation="4dp" + android:transitionName="profile" + app:layout_constraintBottom_toTopOf="@id/showUserCodeCard" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@id/showUserCodeCard" + tools:src="@sample/user_round_avatars" /> + <TextView android:id="@+id/showUserCodeInfoText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -159,8 +166,7 @@ android:layout_marginEnd="16dp" android:text="@string/user_code_info_text" android:textAlignment="center" - android:textColor="?vctr_content_secondary" - android:textSize="15sp" + android:textColor="?vctr_content_primary" app:layout_constraintEnd_toEndOf="@id/showUserCodeCard" app:layout_constraintStart_toStartOf="@id/showUserCodeCard" app:layout_constraintTop_toBottomOf="@id/showUserCodeCard" /> @@ -169,7 +175,7 @@ android:id="@+id/showUserCodeShareButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dp" + android:layout_marginTop="24dp" android:minWidth="130dp" android:text="@string/user_code_share" app:icon="@drawable/ic_share" @@ -178,11 +184,12 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/showUserCodeInfoText" - app:layout_constraintVertical_bias="0" /> + app:layout_constraintVertical_bias="0" + tools:ignore="MissingPrefix" /> <Button android:id="@+id/showUserCodeScanButton" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/layout_vertical_margin" diff --git a/vector/src/main/res/layout/fragment_user_directory.xml b/vector/src/main/res/layout/fragment_user_directory.xml index d8bb517685..1fced84471 100644 --- a/vector/src/main/res/layout/fragment_user_directory.xml +++ b/vector/src/main/res/layout/fragment_user_directory.xml @@ -10,96 +10,92 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/userDirectoryToolbar" - android:layout_width="0dp" - android:layout_height="?actionBarSize" - android:elevation="4dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> - <androidx.constraintlayout.widget.ConstraintLayout + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/userDirectoryToolbar" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="?actionBarSize"> - <ImageView - android:id="@+id/userDirectoryClose" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:clickable="true" - android:contentDescription="@string/action_close" - android:focusable="true" - android:foreground="?attr/selectableItemBackground" - android:scaleType="center" - android:src="@drawable/ic_x_18dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> - <TextView - android:id="@+id/userDirectoryTitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:maxLines="1" - android:text="@string/direct_chats_header" - android:textColor="?vctr_content_primary" - android:textSize="18sp" - android:textStyle="bold" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/userDirectoryClose" - app:layout_constraintTop_toTopOf="parent" /> + <ImageView + android:id="@+id/userDirectoryClose" + android:layout_width="@dimen/layout_touch_size" + android:layout_height="@dimen/layout_touch_size" + android:clickable="true" + android:contentDescription="@string/action_close" + android:focusable="true" + android:foreground="?attr/selectableItemBackground" + android:scaleType="center" + android:src="@drawable/ic_x_18dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/userDirectoryTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" + android:text="@string/direct_chats_header" + android:textColor="?vctr_content_primary" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toEndOf="@+id/userDirectoryClose" + app:layout_constraintTop_toTopOf="parent" /> - </androidx.appcompat.widget.Toolbar> + </androidx.constraintlayout.widget.ConstraintLayout> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/userDirectorySearchByIdContainer" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:layout_marginTop="16dp" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/userDirectoryToolbar"> + </com.google.android.material.appbar.MaterialToolbar> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/userDirectorySearchById" + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/userDirectorySearchByIdContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/add_by_matrix_id" /> + android:layout_marginStart="@dimen/layout_horizontal_margin" + android:layout_marginTop="16dp" + android:layout_marginEnd="@dimen/layout_horizontal_margin" + android:layout_marginBottom="16dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout"> - </com.google.android.material.textfield.TextInputLayout> + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/userDirectorySearchById" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/add_by_matrix_id" /> - <View - android:id="@+id/userDirectoryFilterDivider" - android:layout_width="0dp" - android:layout_height="1dp" - android:layout_marginTop="16dp" - android:background="?vctr_list_separator" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/userDirectorySearchByIdContainer" /> + </com.google.android.material.textfield.TextInputLayout> + + </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/userDirectoryRecyclerView" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginTop="16dp" android:fastScrollEnabled="true" android:overScrollMode="always" android:scrollbars="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/userDirectoryFilterDivider" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" tools:listitem="@layout/item_known_user" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/fragment_user_list.xml b/vector/src/main/res/layout/fragment_user_list.xml index 9b4b19ca7f..96cad5b7e9 100644 --- a/vector/src/main/res/layout/fragment_user_list.xml +++ b/vector/src/main/res/layout/fragment_user_list.xml @@ -5,18 +5,16 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <androidx.constraintlayout.widget.ConstraintLayout + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/appBarLayout" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent"> - <androidx.appcompat.widget.Toolbar + <com.google.android.material.appbar.MaterialToolbar android:id="@+id/userListToolbar" - android:layout_width="0dp" - android:layout_height="?actionBarSize" - android:elevation="4dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> + android:layout_width="match_parent" + android:layout_height="?actionBarSize"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" @@ -34,10 +32,13 @@ android:src="@drawable/ic_x_18dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:tint="?vctr_content_secondary" + tools:ignore="MissingPrefix" /> <TextView android:id="@+id/userListTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -46,7 +47,6 @@ android:maxLines="1" android:text="@string/fab_menu_create_chat" android:textColor="?vctr_content_primary" - android:textSize="18sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -56,84 +56,84 @@ </androidx.constraintlayout.widget.ConstraintLayout> - </androidx.appcompat.widget.Toolbar> + </com.google.android.material.appbar.MaterialToolbar> - <im.vector.app.core.platform.MaxHeightScrollView - android:id="@+id/chipGroupScrollView" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:layout_marginTop="8dp" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/userListToolbar" - app:maxHeight="64dp"> + </com.google.android.material.appbar.AppBarLayout> - <com.google.android.material.chip.ChipGroup - android:id="@+id/chipGroup" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:lineSpacing="2dp" /> + <im.vector.app.core.platform.MaxHeightScrollView + android:id="@+id/chipGroupScrollView" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/layout_horizontal_margin" + android:layout_marginTop="8dp" + android:layout_marginEnd="@dimen/layout_horizontal_margin" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" + app:maxHeight="64dp"> - </im.vector.app.core.platform.MaxHeightScrollView> - - <EditText - android:id="@+id/userListSearch" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - android:background="@null" - android:drawablePadding="8dp" - android:gravity="center_vertical" - android:hint="@string/user_directory_search_hint" - android:importantForAutofill="no" - android:inputType="text" - android:maxHeight="80dp" - android:paddingTop="16dp" - android:paddingBottom="16dp" - android:textSize="16sp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/chipGroupScrollView" /> - - <View - android:id="@+id/userListFilterDivider" - android:layout_width="0dp" - android:layout_height="1dp" - android:background="?vctr_list_separator" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/userListSearch" /> - - - <TextView - android:id="@+id/userListE2EbyDefaultDisabled" + <com.google.android.material.chip.ChipGroup + android:id="@+id/chipGroup" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="16dp" - android:drawablePadding="8dp" - android:text="@string/settings_hs_admin_e2e_disabled" - android:textColor="?vctr_content_secondary" - android:textSize="14sp" - android:visibility="gone" - app:layout_constraintTop_toBottomOf="@id/userListFilterDivider" - tools:visibility="visible" /> + app:lineSpacing="2dp" /> - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/userListRecyclerView" - android:layout_width="0dp" - android:layout_height="0dp" - android:fastScrollEnabled="true" - android:overScrollMode="always" - android:scrollbars="vertical" - app:layout_behavior="@string/appbar_scrolling_view_behavior" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/userListE2EbyDefaultDisabled" - tools:listitem="@layout/item_known_user" /> + </im.vector.app.core.platform.MaxHeightScrollView> + + <EditText + android:id="@+id/userListSearch" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/layout_horizontal_margin" + android:layout_marginEnd="@dimen/layout_horizontal_margin" + android:background="@null" + android:drawablePadding="8dp" + android:gravity="center_vertical" + android:hint="@string/user_directory_search_hint" + android:importantForAutofill="no" + android:inputType="text" + android:maxHeight="80dp" + android:paddingTop="16dp" + android:paddingBottom="16dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/chipGroupScrollView" /> + + <View + android:id="@+id/userListFilterDivider" + android:layout_width="0dp" + android:layout_height="1dp" + android:background="?vctr_list_separator" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/userListSearch" /> + + + <TextView + android:id="@+id/userListE2EbyDefaultDisabled" + style="@style/Widget.Vector.TextView.Body" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="16dp" + android:drawablePadding="8dp" + android:text="@string/settings_hs_admin_e2e_disabled" + android:textColor="?vctr_content_secondary" + android:visibility="gone" + app:layout_constraintTop_toBottomOf="@id/userListFilterDivider" + tools:visibility="visible" /> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/userListRecyclerView" + android:layout_width="0dp" + android:layout_height="0dp" + android:fastScrollEnabled="true" + android:overScrollMode="always" + android:scrollbars="vertical" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/userListE2EbyDefaultDisabled" + tools:listitem="@layout/item_known_user" /> - </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/grid_item_emoji.xml b/vector/src/main/res/layout/grid_item_emoji.xml index 24d2aff598..e302138d55 100644 --- a/vector/src/main/res/layout/grid_item_emoji.xml +++ b/vector/src/main/res/layout/grid_item_emoji.xml @@ -20,12 +20,5 @@ android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center" /> - <!--<TextView--> - <!--android:layout_gravity="center"--> - <!--android:id="@+id/grid_item_emoji_text"--> - <!--android:layout_width="wrap_content"--> - <!--android:layout_height="wrap_content"--> - <!--tools:text="😀"--> - <!--android:textSize="24sp"--> - <!--/>--> + </FrameLayout> diff --git a/vector/src/main/res/layout/grid_section_header.xml b/vector/src/main/res/layout/grid_section_header.xml index 65aa68dab6..f58790deec 100644 --- a/vector/src/main/res/layout/grid_section_header.xml +++ b/vector/src/main/res/layout/grid_section_header.xml @@ -6,6 +6,7 @@ <TextView android:id="@+id/section_header_textview" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" diff --git a/vector/src/main/res/layout/item_attachment_miniature_preview.xml b/vector/src/main/res/layout/item_attachment_miniature_preview.xml index 354b787340..353ff7cbad 100644 --- a/vector/src/main/res/layout/item_attachment_miniature_preview.xml +++ b/vector/src/main/res/layout/item_attachment_miniature_preview.xml @@ -23,6 +23,7 @@ android:layout_width="32dp" android:layout_height="32dp" android:layout_gravity="center" + android:alpha="0.75" android:contentDescription="@string/a11y_video" app:srcCompat="@drawable/ic_play_arrow" app:tint="@android:color/white" diff --git a/vector/src/main/res/layout/item_autocomplete_command.xml b/vector/src/main/res/layout/item_autocomplete_command.xml index 70179ac8b9..1da92a5796 100644 --- a/vector/src/main/res/layout/item_autocomplete_command.xml +++ b/vector/src/main/res/layout/item_autocomplete_command.xml @@ -12,17 +12,18 @@ <TextView android:id="@+id/commandName" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="12sp" android:textStyle="bold" tools:text="/invite" /> <TextView android:id="@+id/commandParameter" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -30,12 +31,12 @@ android:layout_toEndOf="@+id/commandName" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="12sp" android:textStyle="italic" tools:text="<user-id>" /> <TextView android:id="@+id/commandDescription" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/commandName" @@ -43,7 +44,6 @@ android:layout_gravity="center_vertical" android:maxLines="2" android:textColor="?vctr_content_secondary" - android:textSize="12sp" tools:text="@string/command_description_invite_user" /> </RelativeLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_autocomplete_emoji.xml b/vector/src/main/res/layout/item_autocomplete_emoji.xml index f4c2bbf0bc..5ba4faa698 100644 --- a/vector/src/main/res/layout/item_autocomplete_emoji.xml +++ b/vector/src/main/res/layout/item_autocomplete_emoji.xml @@ -10,11 +10,11 @@ <TextView android:id="@+id/itemAutocompleteEmoji" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:textColor="@color/emoji_color" - android:textSize="20dp" tools:ignore="SpUsage" tools:text="@sample/reactions.json/data/reaction" /> @@ -27,17 +27,18 @@ <TextView android:id="@+id/itemAutocompleteEmojiName" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="12sp" android:textStyle="bold" tools:text="name" /> <TextView android:id="@+id/itemAutocompleteEmojiSubname" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -45,7 +46,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="12sp" android:visibility="gone" tools:text="name" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/item_autocomplete_matrix_item.xml b/vector/src/main/res/layout/item_autocomplete_matrix_item.xml index 9203cac6bf..6f4a4e176e 100644 --- a/vector/src/main/res/layout/item_autocomplete_matrix_item.xml +++ b/vector/src/main/res/layout/item_autocomplete_matrix_item.xml @@ -25,24 +25,24 @@ <TextView android:id="@+id/matrixItemAutocompleteName" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="12sp" android:textStyle="bold" tools:text="name" /> <TextView android:id="@+id/matrixItemAutocompleteSubname" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="2dp" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="12sp" android:visibility="gone" tools:text="name" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/item_autocomplete_more_result.xml b/vector/src/main/res/layout/item_autocomplete_more_result.xml index 315af94be2..23addf5fe4 100644 --- a/vector/src/main/res/layout/item_autocomplete_more_result.xml +++ b/vector/src/main/res/layout/item_autocomplete_more_result.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:colorBackground" android:padding="8dp" android:text="@string/autocomplete_limited_results" - android:textColor="?vctr_content_secondary" - android:textSize="12sp" /> + android:textColor="?vctr_content_secondary" /> diff --git a/vector/src/main/res/layout/item_bottom_sheet_action.xml b/vector/src/main/res/layout/item_bottom_sheet_action.xml index 348520b665..483700c41f 100644 --- a/vector/src/main/res/layout/item_bottom_sheet_action.xml +++ b/vector/src/main/res/layout/item_bottom_sheet_action.xml @@ -53,6 +53,7 @@ <TextView android:id="@+id/actionTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" @@ -60,8 +61,7 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_secondary" - android:textSize="17sp" - tools:drawableEnd="@drawable/ic_material_expand_more_black" + tools:drawableEnd="@drawable/ic_expand_more" tools:drawableTint="?vctr_content_secondary" tools:text="kdqsksqdk" /> diff --git a/vector/src/main/res/layout/item_bottom_sheet_message_preview.xml b/vector/src/main/res/layout/item_bottom_sheet_message_preview.xml index 1098cb7ecd..3e2c775643 100644 --- a/vector/src/main/res/layout/item_bottom_sheet_message_preview.xml +++ b/vector/src/main/res/layout/item_bottom_sheet_message_preview.xml @@ -24,6 +24,7 @@ <TextView android:id="@+id/bottom_sheet_message_preview_sender" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -32,7 +33,6 @@ android:fontFamily="sans-serif-bold" android:singleLine="true" android:textColor="?vctr_content_primary" - android:textSize="14sp" android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/bottom_sheet_message_preview_timestamp" app:layout_constraintStart_toEndOf="@id/bottom_sheet_message_preview_avatar" @@ -42,11 +42,11 @@ <TextView android:id="@+id/bottom_sheet_message_preview_timestamp" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/layout_horizontal_margin" android:textColor="?vctr_content_secondary" - android:textSize="12sp" app:layout_constraintBottom_toBottomOf="@id/bottom_sheet_message_preview_sender" app:layout_constraintEnd_toEndOf="parent" tools:text="Friday 8pm" /> @@ -67,6 +67,7 @@ <TextView android:id="@+id/bottom_sheet_message_preview_body" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -76,7 +77,6 @@ android:maxLines="3" android:textColor="?vctr_content_secondary" android:textIsSelectable="false" - android:textSize="14sp" app:layout_constraintBottom_toTopOf="@+id/bottom_sheet_message_preview_body_details" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/bottom_sheet_message_preview_avatar" @@ -86,6 +86,7 @@ <TextView android:id="@+id/bottom_sheet_message_preview_body_details" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -93,7 +94,6 @@ android:maxLines="1" android:textColor="?vctr_content_tertiary" android:textIsSelectable="false" - android:textSize="12sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@id/bottom_sheet_message_preview_body" diff --git a/vector/src/main/res/layout/item_bottom_sheet_message_status.xml b/vector/src/main/res/layout/item_bottom_sheet_message_status.xml index d444c328f0..41a46f58a3 100644 --- a/vector/src/main/res/layout/item_bottom_sheet_message_status.xml +++ b/vector/src/main/res/layout/item_bottom_sheet_message_status.xml @@ -21,6 +21,7 @@ <TextView android:id="@+id/messageStatusText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="16dp" @@ -28,7 +29,7 @@ android:drawablePadding="4dp" android:textColor="?vctr_content_secondary" android:textStyle="bold" - tools:text="@string/unable_to_send_message" - app:drawableStartCompat="@drawable/ic_warning_badge" /> + app:drawableStartCompat="@drawable/ic_warning_badge" + tools:text="@string/unable_to_send_message" /> </LinearLayout> diff --git a/vector/src/main/res/layout/item_bottom_sheet_quick_reaction.xml b/vector/src/main/res/layout/item_bottom_sheet_quick_reaction.xml index 23494c9006..db243184e5 100644 --- a/vector/src/main/res/layout/item_bottom_sheet_quick_reaction.xml +++ b/vector/src/main/res/layout/item_bottom_sheet_quick_reaction.xml @@ -9,83 +9,74 @@ <TextView android:id="@+id/quickReaction0" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="4dp" - android:textColor="?vctr_content_secondary" - android:textSize="24sp" - tools:ignore="MissingConstraints" + android:textColor="@color/emoji_black" tools:text="👍" /> <TextView android:id="@+id/quickReaction1" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="4dp" - android:textColor="?vctr_content_secondary" - android:textSize="24sp" - tools:ignore="MissingConstraints" tools:text="👎" /> <TextView android:id="@+id/quickReaction2" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="4dp" - android:textColor="?vctr_content_secondary" - android:textSize="24sp" - tools:ignore="MissingConstraints" + android:textColor="@color/emoji_black" tools:text="😀" /> <TextView android:id="@+id/quickReaction3" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="4dp" - android:textColor="?vctr_content_secondary" - android:textSize="24sp" - tools:ignore="MissingConstraints" + android:textColor="@color/emoji_black" tools:text="🎉" /> <TextView android:id="@+id/quickReaction4" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="4dp" - android:textColor="?vctr_content_secondary" - android:textSize="24sp" - tools:ignore="MissingConstraints" + android:textColor="@color/emoji_black" tools:text="😕" /> <TextView android:id="@+id/quickReaction5" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="4dp" - android:textColor="?vctr_content_secondary" - android:textSize="24sp" - tools:ignore="MissingConstraints" + android:textColor="@color/emoji_black" tools:text="♥" /> <TextView android:id="@+id/quickReaction6" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="4dp" - android:textColor="?vctr_content_secondary" - android:textSize="24sp" - tools:ignore="MissingConstraints" + android:textColor="@color/emoji_black" tools:text="🍆" /> <TextView android:id="@+id/quickReaction7" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="4dp" - android:textColor="?vctr_content_secondary" - android:textSize="26sp" - tools:ignore="MissingConstraints" + android:textColor="@color/emoji_black" tools:text="👀" /> <androidx.constraintlayout.helper.widget.Flow diff --git a/vector/src/main/res/layout/item_bottom_sheet_radio.xml b/vector/src/main/res/layout/item_bottom_sheet_radio.xml index 0da96725bb..960f7be91c 100644 --- a/vector/src/main/res/layout/item_bottom_sheet_radio.xml +++ b/vector/src/main/res/layout/item_bottom_sheet_radio.xml @@ -26,13 +26,13 @@ <TextView android:id="@+id/actionTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0" @@ -42,12 +42,12 @@ <TextView android:id="@+id/actionDescription" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:maxLines="4" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/actionTitle" diff --git a/vector/src/main/res/layout/item_bottom_sheet_room_preview.xml b/vector/src/main/res/layout/item_bottom_sheet_room_preview.xml index bb652a6890..20899f8075 100644 --- a/vector/src/main/res/layout/item_bottom_sheet_room_preview.xml +++ b/vector/src/main/res/layout/item_bottom_sheet_room_preview.xml @@ -27,6 +27,7 @@ <TextView android:id="@+id/bottomSheetRoomPreviewName" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="start" @@ -35,7 +36,6 @@ android:fontFamily="sans-serif-bold" android:singleLine="true" android:textColor="?vctr_content_primary" - android:textSize="14sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="@+id/bottomSheetRoomPreviewAvatar" app:layout_constraintEnd_toStartOf="@+id/bottomSheetRoomPreviewLowPriority" diff --git a/vector/src/main/res/layout/item_bottom_sheet_title.xml b/vector/src/main/res/layout/item_bottom_sheet_title.xml index 2ee53ee3aa..4e5b4813f3 100644 --- a/vector/src/main/res/layout/item_bottom_sheet_title.xml +++ b/vector/src/main/res/layout/item_bottom_sheet_title.xml @@ -12,10 +12,10 @@ <TextView android:id="@+id/itemBottomSheetTitleTitle" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:textColor="?vctr_content_primary" - android:textSize="18sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/itemBottomSheetTitleSubtitle" app:layout_constraintEnd_toEndOf="parent" @@ -25,11 +25,11 @@ <TextView android:id="@+id/itemBottomSheetTitleSubtitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/item_breadcrumbs.xml b/vector/src/main/res/layout/item_breadcrumbs.xml index a1ca9baa21..ef7b7a4faf 100644 --- a/vector/src/main/res/layout/item_breadcrumbs.xml +++ b/vector/src/main/res/layout/item_breadcrumbs.xml @@ -38,13 +38,13 @@ <im.vector.app.features.home.room.list.UnreadCounterBadgeView android:id="@+id/breadcrumbsUnreadCounterBadgeView" + style="@style/Widget.Vector.TextView.Micro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:minWidth="18dp" android:minHeight="18dp" android:textColor="?colorOnError" - android:textSize="11sp" android:visibility="gone" app:layout_constraintCircle="@+id/breadcrumbsImageView" app:layout_constraintCircleAngle="45" @@ -56,6 +56,7 @@ <TextView android:id="@+id/breadcrumbsTypingView" + style="@style/Widget.Vector.TextView.Micro" android:layout_width="20dp" android:layout_height="20dp" android:background="@drawable/circle" @@ -63,7 +64,6 @@ android:gravity="center" android:text="@string/ellipsis" android:textColor="?colorOnPrimary" - android:textSize="11sp" android:textStyle="bold" android:visibility="gone" app:layout_constraintCircle="@+id/breadcrumbsImageView" diff --git a/vector/src/main/res/layout/item_completion_homeserver.xml b/vector/src/main/res/layout/item_completion_homeserver.xml index ec1cb037eb..d0cb9f74df 100644 --- a/vector/src/main/res/layout/item_completion_homeserver.xml +++ b/vector/src/main/res/layout/item_completion_homeserver.xml @@ -2,6 +2,7 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@android:id/text1" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" @@ -9,7 +10,5 @@ android:minHeight="?android:attr/listPreferredItemHeight" android:paddingStart="16dp" android:paddingEnd="16dp" - android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="?android:attr/textColorAlertDialogListItem" - android:textSize="14sp" tools:text="https://matrix.org" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_contact_action.xml b/vector/src/main/res/layout/item_contact_action.xml index 27c680555f..07e06f0d0c 100644 --- a/vector/src/main/res/layout/item_contact_action.xml +++ b/vector/src/main/res/layout/item_contact_action.xml @@ -18,10 +18,11 @@ android:importantForAccessibility="no" android:padding="10dp" app:tint="?vctr_content_secondary" - tools:src="@drawable/ic_invite_people" /> + tools:src="@drawable/ic_baseline_perm_contact_calendar_24" /> <TextView android:id="@+id/actionTitleText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -29,7 +30,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" tools:text="@string/invite_friends" /> </LinearLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_contact_detail.xml b/vector/src/main/res/layout/item_contact_detail.xml index 59f43472b6..b98adec5e6 100644 --- a/vector/src/main/res/layout/item_contact_detail.xml +++ b/vector/src/main/res/layout/item_contact_detail.xml @@ -11,6 +11,7 @@ <TextView android:id="@+id/contactDetailName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -18,7 +19,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" app:layout_constraintBottom_toTopOf="@id/contactDetailMatrixId" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -28,13 +28,13 @@ <TextView android:id="@+id/contactDetailMatrixId" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/item_contact_main.xml b/vector/src/main/res/layout/item_contact_main.xml index d4300191f7..6df60344fe 100644 --- a/vector/src/main/res/layout/item_contact_main.xml +++ b/vector/src/main/res/layout/item_contact_main.xml @@ -22,6 +22,7 @@ <TextView android:id="@+id/contactDisplayName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -29,7 +30,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/item_create_direct_room_letter_header.xml b/vector/src/main/res/layout/item_create_direct_room_letter_header.xml deleted file mode 100644 index 9dd6642c4f..0000000000 --- a/vector/src/main/res/layout/item_create_direct_room_letter_header.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/createDirectRoomLetterView" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:fontFamily="sans-serif-medium" - android:padding="8dp" - android:textColor="?vctr_content_primary" - android:textSize="20sp" - android:textStyle="normal" - tools:text="C" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_create_direct_room_user.xml b/vector/src/main/res/layout/item_create_direct_room_user.xml index 690b292de8..18e9d1d3ec 100644 --- a/vector/src/main/res/layout/item_create_direct_room_user.xml +++ b/vector/src/main/res/layout/item_create_direct_room_user.xml @@ -41,6 +41,7 @@ <TextView android:id="@+id/createDirectRoomUserName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -48,7 +49,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/createDirectRoomUserID" app:layout_constraintEnd_toEndOf="parent" @@ -59,12 +59,12 @@ <TextView android:id="@+id/createDirectRoomUserID" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" diff --git a/vector/src/main/res/layout/item_device.xml b/vector/src/main/res/layout/item_device.xml index 8ca64665a2..38df3ee0f7 100644 --- a/vector/src/main/res/layout/item_device.xml +++ b/vector/src/main/res/layout/item_device.xml @@ -18,12 +18,12 @@ <!-- In compact mode only this is shown--> <TextView android:id="@+id/itemDeviceSimpleSummary" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:minHeight="40dp" android:textColor="?vctr_content_primary" - android:textSize="16sp" tools:text="Riot X" /> <!--- @@ -31,55 +31,55 @@ --> <TextView android:id="@+id/itemDeviceDisplayNameLabel" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="@string/devices_details_name_title" - android:textColor="?vctr_content_secondary" - android:textSize="12sp" /> + android:textColor="?vctr_content_secondary" /> <TextView android:id="@+id/itemDeviceDisplayName" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="?vctr_content_primary" - android:textSize="16sp" tools:text="Android phone" /> <TextView android:id="@+id/itemDeviceIdLabel" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="@string/devices_details_id_title" - android:textColor="?vctr_content_secondary" - android:textSize="12sp" /> + android:textColor="?vctr_content_secondary" /> <TextView android:id="@+id/itemDeviceId" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" tools:text="XUIDERFZAA" /> <TextView android:id="@+id/itemDeviceLastSeenLabel" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="@string/devices_details_last_seen_title" - android:textColor="?vctr_content_secondary" - android:textSize="12sp" /> + android:textColor="?vctr_content_secondary" /> <TextView android:id="@+id/itemDeviceLastSeen" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="?vctr_content_primary" - android:textSize="15sp" tools:text="x.x.x.x @ 01/01 00:00:00" /> </LinearLayout> diff --git a/vector/src/main/res/layout/item_emoji_result.xml b/vector/src/main/res/layout/item_emoji_result.xml index d74b254e67..26f85d8c97 100644 --- a/vector/src/main/res/layout/item_emoji_result.xml +++ b/vector/src/main/res/layout/item_emoji_result.xml @@ -11,14 +11,13 @@ android:paddingStart="@dimen/layout_horizontal_margin" android:paddingEnd="@dimen/layout_horizontal_margin"> - <!-- size in dp, because we do not want the display to be impacted by font size setting --> <TextView android:id="@+id/item_emoji_tv" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:textColor="@color/emoji_color" - android:textSize="25dp" tools:ignore="SpUsage" tools:text="@sample/reactions.json/data/reaction" /> @@ -30,20 +29,20 @@ <TextView android:id="@+id/item_emoji_name" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:textStyle="bold" tools:text="Smiley Face" /> <TextView android:id="@+id/item_emoji_keyword" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="2" android:textColor="?vctr_content_secondary" - android:textSize="14sp" android:visibility="gone" tools:text="Smile, foo, bar" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/item_emoji_verif.xml b/vector/src/main/res/layout/item_emoji_verif.xml index 23a5b3bda5..0ef46c56a6 100644 --- a/vector/src/main/res/layout/item_emoji_verif.xml +++ b/vector/src/main/res/layout/item_emoji_verif.xml @@ -10,6 +10,7 @@ <!-- size in dp, because we do not want the display to be impacted by font size setting --> <TextView android:id="@+id/item_emoji_tv" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -34,6 +35,7 @@ <TextView android:id="@+id/item_emoji_name_tv" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" diff --git a/vector/src/main/res/layout/item_error_retry.xml b/vector/src/main/res/layout/item_error_retry.xml index f8527b2870..9648ffc5ef 100644 --- a/vector/src/main/res/layout/item_error_retry.xml +++ b/vector/src/main/res/layout/item_error_retry.xml @@ -9,6 +9,7 @@ <TextView android:id="@+id/itemErrorRetryText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="?colorError" diff --git a/vector/src/main/res/layout/item_expandable_textview.xml b/vector/src/main/res/layout/item_expandable_textview.xml index 0fd883fccf..65a04af425 100644 --- a/vector/src/main/res/layout/item_expandable_textview.xml +++ b/vector/src/main/res/layout/item_expandable_textview.xml @@ -9,13 +9,11 @@ <im.vector.app.core.ui.views.NonScrollingTextView android:id="@+id/expandableContent" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:autoLink="web" android:ellipsize="end" - android:fontFamily="sans-serif" - android:textSize="14sp" - android:textStyle="normal" app:layout_constraintBottom_toTopOf="@+id/expandableArrow" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/layout/item_form_advanced_toggle.xml b/vector/src/main/res/layout/item_form_advanced_toggle.xml index 1e2a4df441..00834f054b 100644 --- a/vector/src/main/res/layout/item_form_advanced_toggle.xml +++ b/vector/src/main/res/layout/item_form_advanced_toggle.xml @@ -18,6 +18,7 @@ <TextView android:id="@+id/itemFormAdvancedToggleTitleView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" @@ -25,10 +26,9 @@ android:gravity="center_vertical" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="14sp" android:textStyle="bold" app:drawableTint="?vctr_content_secondary" - tools:drawableEnd="@drawable/ic_expand_more_white" + tools:drawableEnd="@drawable/ic_expand_more" tools:text="@string/show_advanced" /> </LinearLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_form_switch.xml b/vector/src/main/res/layout/item_form_switch.xml index 1db25f4c27..93c14acbac 100644 --- a/vector/src/main/res/layout/item_form_switch.xml +++ b/vector/src/main/res/layout/item_form_switch.xml @@ -10,13 +10,13 @@ <TextView android:id="@+id/formSwitchTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" android:layout_marginEnd="@dimen/layout_horizontal_margin" android:duplicateParentState="true" android:textColor="?vctr_content_primary" - android:textSize="15sp" app:layout_constraintBottom_toTopOf="@+id/formSwitchSummary" app:layout_constraintEnd_toStartOf="@+id/formSwitchSwitch" app:layout_constraintStart_toStartOf="parent" @@ -26,11 +26,11 @@ <TextView android:id="@+id/formSwitchSummary" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:textColor="?vctr_content_secondary" - android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/formSwitchSwitch" app:layout_constraintStart_toStartOf="@+id/formSwitchTitle" diff --git a/vector/src/main/res/layout/item_generic_button.xml b/vector/src/main/res/layout/item_generic_button.xml index 8da17b4eca..d56b53c03c 100644 --- a/vector/src/main/res/layout/item_generic_button.xml +++ b/vector/src/main/res/layout/item_generic_button.xml @@ -1,20 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:padding="16dp"> <Button android:id="@+id/itemGenericItemButton" - style="@style/VectorButtonStyleText" - android:textAllCaps="false" - tools:icon="@drawable/ic_shield_warning" - app:iconGravity="textStart" + style="@style/Widget.Vector.Button.Text" android:layout_width="match_parent" android:layout_height="wrap_content" + android:textAllCaps="false" + app:iconGravity="textStart" + tools:icon="@drawable/ic_shield_warning" tools:text="Action Name" /> </LinearLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_generic_empty_state.xml b/vector/src/main/res/layout/item_generic_empty_state.xml index ef33ec3be7..932f5666c6 100644 --- a/vector/src/main/res/layout/item_generic_empty_state.xml +++ b/vector/src/main/res/layout/item_generic_empty_state.xml @@ -23,13 +23,13 @@ <TextView android:id="@+id/emptyItemTitleView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="30dp" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@id/emptyItemMessageView" app:layout_constraintEnd_toEndOf="parent" @@ -40,6 +40,7 @@ <TextView android:id="@+id/emptyItemMessageView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -49,7 +50,6 @@ android:maxWidth="300dp" android:maxLines="10" android:textColor="?vctr_content_secondary" - android:textSize="14sp" app:layout_constraintBottom_toTopOf="@+id/emptyItemButton" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/layout/item_generic_footer.xml b/vector/src/main/res/layout/item_generic_footer.xml index c5c4e7fcd5..4152cb1371 100644 --- a/vector/src/main/res/layout/item_generic_footer.xml +++ b/vector/src/main/res/layout/item_generic_footer.xml @@ -8,6 +8,7 @@ <TextView android:id="@+id/itemGenericFooterText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" diff --git a/vector/src/main/res/layout/item_generic_header.xml b/vector/src/main/res/layout/item_generic_header.xml index 6dbf68cd11..8ab2c21ec7 100644 --- a/vector/src/main/res/layout/item_generic_header.xml +++ b/vector/src/main/res/layout/item_generic_header.xml @@ -2,6 +2,7 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/itemGenericHeaderText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="16dp" @@ -9,6 +10,5 @@ android:paddingEnd="16dp" android:paddingBottom="4dp" android:textColor="?vctr_notice_text_color" - android:textSize="15sp" android:textStyle="bold" tools:text="Today" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_generic_list.xml b/vector/src/main/res/layout/item_generic_list.xml index 9cc240e557..a23d4e30a7 100644 --- a/vector/src/main/res/layout/item_generic_list.xml +++ b/vector/src/main/res/layout/item_generic_list.xml @@ -24,6 +24,7 @@ <TextView android:id="@+id/item_generic_title_text" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -46,6 +47,7 @@ <TextView android:id="@+id/item_generic_description_text" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -113,7 +115,7 @@ <Button android:id="@+id/item_generic_destructive_action_button" - style="@style/VectorButtonStyle.Destructive" + style="@style/Widget.Vector.Button.Destructive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" diff --git a/vector/src/main/res/layout/item_generic_pill_footer.xml b/vector/src/main/res/layout/item_generic_pill_footer.xml index 2fbda9355a..ba883ebf68 100644 --- a/vector/src/main/res/layout/item_generic_pill_footer.xml +++ b/vector/src/main/res/layout/item_generic_pill_footer.xml @@ -20,6 +20,7 @@ <TextView android:id="@+id/itemGenericPillText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" diff --git a/vector/src/main/res/layout/item_generic_with_value.xml b/vector/src/main/res/layout/item_generic_with_value.xml index 3612be30db..feb5ca788e 100644 --- a/vector/src/main/res/layout/item_generic_with_value.xml +++ b/vector/src/main/res/layout/item_generic_with_value.xml @@ -19,24 +19,24 @@ <TextView android:id="@+id/itemGenericWithValueLabelText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="0dp" android:layout_weight="1" android:textColor="?vctr_content_primary" - android:textSize="16sp" tools:text="Label" /> <TextView android:id="@+id/itemGenericWithValueValueText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="0dp" android:textColor="?vctr_content_primary" - android:textSize="15sp" tools:text="Value" tools:textColor="?colorPrimary" /> diff --git a/vector/src/main/res/layout/item_group.xml b/vector/src/main/res/layout/item_group.xml index f28d399d35..bc17752cbc 100644 --- a/vector/src/main/res/layout/item_group.xml +++ b/vector/src/main/res/layout/item_group.xml @@ -25,6 +25,7 @@ <TextView android:id="@+id/groupNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -32,7 +33,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/groupBottomSeparator" app:layout_constraintEnd_toStartOf="@+id/groupAvatarChevron" diff --git a/vector/src/main/res/layout/item_help_footer.xml b/vector/src/main/res/layout/item_help_footer.xml index befcda4281..bde4f0a4ce 100644 --- a/vector/src/main/res/layout/item_help_footer.xml +++ b/vector/src/main/res/layout/item_help_footer.xml @@ -23,13 +23,13 @@ <TextView android:id="@+id/itemHelpText" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="12dp" android:gravity="start" android:maxWidth="240dp" android:textColor="?vctr_content_secondary" - android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/itemHelpPicto" diff --git a/vector/src/main/res/layout/item_keys_backup_settings_button_footer.xml b/vector/src/main/res/layout/item_keys_backup_settings_button_footer.xml index 3b7c528cbf..0faacd3b49 100644 --- a/vector/src/main/res/layout/item_keys_backup_settings_button_footer.xml +++ b/vector/src/main/res/layout/item_keys_backup_settings_button_footer.xml @@ -18,7 +18,7 @@ <Button android:id="@+id/keys_backup_settings_footer_button2" - style="@style/VectorButtonStyle" + style="@style/Widget.Vector.Button" android:layout_width="@dimen/button_max_width" android:layout_height="wrap_content" android:layout_marginTop="16dp" diff --git a/vector/src/main/res/layout/item_known_user.xml b/vector/src/main/res/layout/item_known_user.xml index 1941aa9cda..48b180de5f 100644 --- a/vector/src/main/res/layout/item_known_user.xml +++ b/vector/src/main/res/layout/item_known_user.xml @@ -40,6 +40,7 @@ <TextView android:id="@+id/knownUserName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -47,7 +48,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/knownUserID" app:layout_constraintEnd_toEndOf="parent" @@ -58,12 +58,12 @@ <TextView android:id="@+id/knownUserID" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" diff --git a/vector/src/main/res/layout/item_loading.xml b/vector/src/main/res/layout/item_loading.xml index c5fddae4a8..95af47f548 100644 --- a/vector/src/main/res/layout/item_loading.xml +++ b/vector/src/main/res/layout/item_loading.xml @@ -3,19 +3,19 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="1dp" android:background="?android:colorBackground" + android:minHeight="1dp" android:orientation="vertical"> <TextView android:id="@+id/loadingText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="@dimen/layout_vertical_margin" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="16sp" tools:text="Waiting message" /> <ProgressBar diff --git a/vector/src/main/res/layout/item_locale.xml b/vector/src/main/res/layout/item_locale.xml index e20e77f2b4..c6c7bfa09d 100644 --- a/vector/src/main/res/layout/item_locale.xml +++ b/vector/src/main/res/layout/item_locale.xml @@ -9,12 +9,12 @@ <TextView android:id="@+id/localeTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="@dimen/layout_horizontal_margin" android:paddingEnd="@dimen/layout_horizontal_margin" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constraintBottom_toTopOf="@+id/localeSubtitle" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -24,12 +24,12 @@ <TextView android:id="@+id/localeSubtitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="@dimen/layout_horizontal_margin" android:paddingEnd="@dimen/layout_horizontal_margin" android:textColor="?vctr_content_secondary" - android:textSize="14sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/item_login_centered_button.xml b/vector/src/main/res/layout/item_login_centered_button.xml index 07f4c379d4..f73b914df2 100644 --- a/vector/src/main/res/layout/item_login_centered_button.xml +++ b/vector/src/main/res/layout/item_login_centered_button.xml @@ -6,7 +6,7 @@ <Button android:id="@+id/itemLoginCenteredButton" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" diff --git a/vector/src/main/res/layout/item_login_error_retry.xml b/vector/src/main/res/layout/item_login_error_retry.xml index b6f8f1fe42..0f0e5a1556 100644 --- a/vector/src/main/res/layout/item_login_error_retry.xml +++ b/vector/src/main/res/layout/item_login_error_retry.xml @@ -11,6 +11,7 @@ <TextView android:id="@+id/itemLoginErrorRetryText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" diff --git a/vector/src/main/res/layout/item_login_password_form.xml b/vector/src/main/res/layout/item_login_password_form.xml index b07687f3a4..fdd1cff3fa 100644 --- a/vector/src/main/res/layout/item_login_password_form.xml +++ b/vector/src/main/res/layout/item_login_password_form.xml @@ -9,41 +9,26 @@ android:paddingStart="36dp" android:paddingEnd="36dp"> - <FrameLayout + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/itemLoginPasswordFormPasswordFieldTil" + style="@style/Widget.Vector.TextInputLayout.Password" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:hint="@string/soft_logout_signin_password_hint" + app:errorEnabled="true" + app:errorIconDrawable="@null"> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/itemLoginPasswordFormPasswordFieldTil" + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/itemLoginPasswordFormPasswordField" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/soft_logout_signin_password_hint" - app:errorEnabled="true" - app:errorIconDrawable="@null"> + android:ems="10" + android:inputType="textPassword" + android:maxLines="1" + android:paddingEnd="48dp" + tools:ignore="RtlSymmetry" /> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/itemLoginPasswordFormPasswordField" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:ems="10" - android:inputType="textPassword" - android:maxLines="1" - android:paddingEnd="48dp" - tools:ignore="RtlSymmetry" /> - - </com.google.android.material.textfield.TextInputLayout> - - <im.vector.app.core.ui.views.RevealPasswordImageView - android:id="@+id/itemLoginPasswordFormPasswordReveal" - android:layout_width="@dimen/layout_touch_size" - android:layout_height="@dimen/layout_touch_size" - android:layout_gravity="end" - android:layout_marginTop="8dp" - android:background="?attr/selectableItemBackground" - android:scaleType="center" - app:tint="?colorSecondary" /> - - </FrameLayout> + </com.google.android.material.textfield.TextInputLayout> <RelativeLayout android:layout_width="match_parent" @@ -53,7 +38,7 @@ <Button android:id="@+id/itemLoginPasswordFormForgetPasswordButton" - style="@style/Style.Vector.Login.Button.Text" + style="@style/Widget.Vector.Button.Text.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start" @@ -63,7 +48,7 @@ <Button android:id="@+id/itemLoginPasswordFormSubmit" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" diff --git a/vector/src/main/res/layout/item_login_red_button.xml b/vector/src/main/res/layout/item_login_red_button.xml index 4a290fa328..f911be5102 100644 --- a/vector/src/main/res/layout/item_login_red_button.xml +++ b/vector/src/main/res/layout/item_login_red_button.xml @@ -7,7 +7,7 @@ <Button android:id="@+id/itemLoginRedButton" - style="@style/Style.Vector.Login.Button" + style="@style/Widget.Vector.Button.Login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/item_login_text.xml b/vector/src/main/res/layout/item_login_text.xml index 436d6465c1..51b47f3721 100644 --- a/vector/src/main/res/layout/item_login_text.xml +++ b/vector/src/main/res/layout/item_login_text.xml @@ -2,11 +2,12 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/itemLoginText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="12dp" android:paddingStart="36dp" android:paddingEnd="36dp" - android:textAppearance="@style/TextAppearance.Vector.Login.Text" + android:textColor="?vctr_content_secondary" tools:text="Login Title" /> diff --git a/vector/src/main/res/layout/item_login_title.xml b/vector/src/main/res/layout/item_login_title.xml index 81b9570e7e..165fc83d7b 100644 --- a/vector/src/main/res/layout/item_login_title.xml +++ b/vector/src/main/res/layout/item_login_title.xml @@ -2,11 +2,12 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/itemLoginTitleText" + style="@style/Widget.Vector.TextView.Title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="32dp" android:paddingStart="36dp" android:paddingEnd="36dp" - android:textAppearance="@style/TextAppearance.Vector.Login.Title" + android:textColor="?vctr_content_primary" tools:text="Login Title" /> diff --git a/vector/src/main/res/layout/item_login_title_small.xml b/vector/src/main/res/layout/item_login_title_small.xml index 16a77ce9cd..342237cdde 100644 --- a/vector/src/main/res/layout/item_login_title_small.xml +++ b/vector/src/main/res/layout/item_login_title_small.xml @@ -2,11 +2,12 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/itemLoginTitleSmallText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="16dp" android:paddingStart="36dp" android:paddingEnd="36dp" - android:textAppearance="@style/TextAppearance.Vector.Login.Title.Small" + android:textColor="?vctr_content_primary" tools:text="Login Title" /> diff --git a/vector/src/main/res/layout/item_no_result.xml b/vector/src/main/res/layout/item_no_result.xml index 5fc43a447a..a46bd1b2f1 100644 --- a/vector/src/main/res/layout/item_no_result.xml +++ b/vector/src/main/res/layout/item_no_result.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/itemNoResultText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:colorBackground" diff --git a/vector/src/main/res/layout/item_notification_troubleshoot.xml b/vector/src/main/res/layout/item_notification_troubleshoot.xml index b3b21e5480..1ec347f685 100644 --- a/vector/src/main/res/layout/item_notification_troubleshoot.xml +++ b/vector/src/main/res/layout/item_notification_troubleshoot.xml @@ -21,6 +21,7 @@ <TextView android:id="@+id/troubleshootTestTitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -28,7 +29,6 @@ android:paddingTop="4dp" android:paddingBottom="4dp" android:textColor="?vctr_content_primary" - android:textSize="14sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/troubleshootTestDescription" app:layout_constraintEnd_toStartOf="@+id/troubleshootStatusIcon" @@ -41,6 +41,7 @@ <TextView android:id="@+id/troubleshootTestDescription" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" diff --git a/vector/src/main/res/layout/item_policy.xml b/vector/src/main/res/layout/item_policy.xml index 12ec6c91aa..a22211711f 100644 --- a/vector/src/main/res/layout/item_policy.xml +++ b/vector/src/main/res/layout/item_policy.xml @@ -19,10 +19,11 @@ <TextView android:id="@+id/adapter_item_policy_title" - style="@style/TextAppearance.Vector.Login.Text" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:drawablePadding="8dp" + android:textColor="?vctr_content_primary" app:layout_constraintBottom_toTopOf="@+id/adapter_item_policy_subtitle" app:layout_constraintEnd_toStartOf="@+id/adapter_item_policy_arrow" app:layout_constraintStart_toEndOf="@+id/adapter_item_policy_checkbox" @@ -32,11 +33,12 @@ <TextView android:id="@+id/adapter_item_policy_subtitle" - style="@style/TextAppearance.Vector.Login.Text.Small" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:drawablePadding="8dp" + android:textColor="?vctr_content_secondary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/adapter_item_policy_arrow" app:layout_constraintStart_toEndOf="@+id/adapter_item_policy_checkbox" diff --git a/vector/src/main/res/layout/item_positive_button.xml b/vector/src/main/res/layout/item_positive_button.xml index 11fb30599f..05fd70f523 100644 --- a/vector/src/main/res/layout/item_positive_button.xml +++ b/vector/src/main/res/layout/item_positive_button.xml @@ -9,7 +9,7 @@ <Button android:id="@+id/itemGenericItemButton" - style="@style/VectorButtonStyle.Positive" + style="@style/Widget.Vector.Button.Positive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" diff --git a/vector/src/main/res/layout/item_profile_action.xml b/vector/src/main/res/layout/item_profile_action.xml index d325ce7efe..72ef166d02 100644 --- a/vector/src/main/res/layout/item_profile_action.xml +++ b/vector/src/main/res/layout/item_profile_action.xml @@ -30,6 +30,7 @@ <TextView android:id="@+id/actionTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -38,7 +39,6 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@+id/actionSubtitle" app:layout_constraintEnd_toStartOf="@+id/actionEditable" @@ -50,6 +50,7 @@ <TextView android:id="@+id/actionSubtitle" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -57,7 +58,6 @@ android:drawablePadding="16dp" android:ellipsize="end" android:textColor="?vctr_content_secondary" - android:textSize="12sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/actionSecondaryAccessory" diff --git a/vector/src/main/res/layout/item_profile_matrix_item.xml b/vector/src/main/res/layout/item_profile_matrix_item.xml index 3b81fb0717..51818250cd 100644 --- a/vector/src/main/res/layout/item_profile_matrix_item.xml +++ b/vector/src/main/res/layout/item_profile_matrix_item.xml @@ -37,6 +37,7 @@ <TextView android:id="@+id/matrixItemTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -44,7 +45,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@+id/matrixItemSubtitle" app:layout_constraintEnd_toStartOf="@+id/matrixItemPowerLevelLabel" @@ -55,6 +55,7 @@ <TextView android:id="@+id/matrixItemSubtitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -62,7 +63,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="12sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/matrixItemPowerLevelLabel" @@ -73,10 +73,11 @@ <TextView android:id="@+id/matrixItemPowerLevelLabel" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" - android:textSize="12sp" + android:textColor="?vctr_content_primary" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/matrixItemEditable" diff --git a/vector/src/main/res/layout/item_profile_matrix_item_progress.xml b/vector/src/main/res/layout/item_profile_matrix_item_progress.xml index 4fa7dc326f..4662cd9e58 100644 --- a/vector/src/main/res/layout/item_profile_matrix_item_progress.xml +++ b/vector/src/main/res/layout/item_profile_matrix_item_progress.xml @@ -37,6 +37,7 @@ <TextView android:id="@+id/matrixItemTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -44,7 +45,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@+id/matrixItemSubtitle" app:layout_constraintEnd_toStartOf="@+id/matrixItemProgress" @@ -55,6 +55,7 @@ <TextView android:id="@+id/matrixItemSubtitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -62,7 +63,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="12sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/matrixItemProgress" diff --git a/vector/src/main/res/layout/item_profile_section.xml b/vector/src/main/res/layout/item_profile_section.xml index 5eecca9da4..8e00a3c8ce 100644 --- a/vector/src/main/res/layout/item_profile_section.xml +++ b/vector/src/main/res/layout/item_profile_section.xml @@ -2,15 +2,15 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/itemProfileSectionView" + style="@style/Widget.Vector.TextView.Title" android:layout_width="match_parent" - tools:text="Security" + android:layout_height="56dp" + android:background="?vctr_header_background" android:gravity="bottom" - android:paddingBottom="8dp" android:paddingStart="16dp" android:paddingEnd="16dp" - android:textSize="20sp" - android:textStyle="bold" + android:paddingBottom="8dp" android:textColor="?vctr_content_primary" - android:background="?vctr_list_separator_system" - android:layout_height="56dp"/> + android:textStyle="bold" + tools:text="Security" /> diff --git a/vector/src/main/res/layout/item_public_room.xml b/vector/src/main/res/layout/item_public_room.xml index d5bd16e5b5..12aaf8a653 100644 --- a/vector/src/main/res/layout/item_public_room.xml +++ b/vector/src/main/res/layout/item_public_room.xml @@ -25,6 +25,7 @@ <TextView android:id="@+id/itemPublicRoomName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="17dp" @@ -32,7 +33,6 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/itemPublicRoomTopic" app:layout_constraintEnd_toStartOf="@+id/itemPublicRoomButtonState" @@ -43,6 +43,7 @@ <TextView android:id="@+id/itemPublicRoomTopic" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="2dp" @@ -51,7 +52,6 @@ android:maxLines="1" android:singleLine="true" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:visibility="gone" app:layout_constraintBottom_toTopOf="@+id/itemPublicRoomMembersCount" app:layout_constraintEnd_toEndOf="parent" @@ -62,6 +62,7 @@ <TextView android:id="@+id/itemPublicRoomMembersCount" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" @@ -70,7 +71,6 @@ android:gravity="center_vertical" android:minWidth="56dp" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:drawableStartCompat="@drawable/ic_user" app:drawableTint="?vctr_content_secondary" app:layout_constraintBottom_toTopOf="@+id/itemPublicRoomBottomSeparator" @@ -80,6 +80,7 @@ <TextView android:id="@+id/itemPublicRoomAlias" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -89,7 +90,6 @@ android:minWidth="40dp" android:singleLine="true" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintBaseline_toBaselineOf="@+id/itemPublicRoomMembersCount" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/itemPublicRoomMembersCount" diff --git a/vector/src/main/res/layout/item_pushgateway.xml b/vector/src/main/res/layout/item_pushgateway.xml index c4a01be169..28bcef1ee2 100644 --- a/vector/src/main/res/layout/item_pushgateway.xml +++ b/vector/src/main/res/layout/item_pushgateway.xml @@ -8,16 +8,17 @@ <TextView android:id="@+id/pushGatewayKind" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" - android:textStyle="bold" - android:textSize="20sp" android:textAllCaps="true" + android:textStyle="bold" tools:text="Http Pusher" /> <TextView android:id="@+id/pushGatewayAppId" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -27,6 +28,7 @@ <TextView android:id="@+id/pushGatewayAppIdValue" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" @@ -35,6 +37,7 @@ <TextView android:id="@+id/pushGatewayKey" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -44,6 +47,7 @@ <TextView android:id="@+id/pushGatewayKeyValue" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" @@ -52,6 +56,7 @@ <TextView android:id="@+id/pushGatewayAppName" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -61,6 +66,7 @@ <TextView android:id="@+id/pushGatewayAppNameValue" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" @@ -69,6 +75,7 @@ <TextView android:id="@+id/pushGatewayDeviceName" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -78,6 +85,7 @@ <TextView android:id="@+id/pushGatewayDeviceNameValue" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" @@ -87,6 +95,7 @@ <TextView android:id="@+id/pushGatewayURL" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -95,6 +104,7 @@ <TextView android:id="@+id/pushGatewayURLValue" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" @@ -103,6 +113,7 @@ <TextView android:id="@+id/pushGatewayFormat" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -112,6 +123,7 @@ <TextView android:id="@+id/pushGatewayFormatValue" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" diff --git a/vector/src/main/res/layout/item_pushrule_raw.xml b/vector/src/main/res/layout/item_pushrule_raw.xml index bc1734e4fd..080e4f4835 100644 --- a/vector/src/main/res/layout/item_pushrule_raw.xml +++ b/vector/src/main/res/layout/item_pushrule_raw.xml @@ -16,6 +16,7 @@ <TextView android:id="@+id/pushRuleId" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -25,6 +26,7 @@ <TextView android:id="@+id/pushRuleDescription" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" diff --git a/vector/src/main/res/layout/item_room.xml b/vector/src/main/res/layout/item_room.xml index c8021126bd..11fe6c5b54 100644 --- a/vector/src/main/res/layout/item_room.xml +++ b/vector/src/main/res/layout/item_room.xml @@ -97,6 +97,7 @@ <TextView android:id="@+id/roomNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -106,7 +107,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constrainedWidth="true" app:layout_constraintEnd_toStartOf="@+id/roomDraftBadge" @@ -135,6 +135,7 @@ <im.vector.app.features.home.room.list.UnreadCounterBadgeView android:id="@+id/roomUnreadCounterBadgeView" + style="@style/Widget.Vector.TextView.Micro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" @@ -144,7 +145,6 @@ android:paddingStart="4dp" android:paddingEnd="4dp" android:textColor="?colorOnError" - android:textSize="10sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="@+id/roomNameView" app:layout_constraintEnd_toStartOf="@+id/roomLastEventTimeView" @@ -156,11 +156,11 @@ <TextView android:id="@+id/roomLastEventTimeView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintBottom_toBottomOf="@+id/roomNameView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/roomNameView" @@ -168,6 +168,7 @@ <TextView android:id="@+id/roomLastEventView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="3dp" @@ -175,7 +176,6 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/roomNameView" app:layout_constraintTop_toBottomOf="@+id/roomNameView" @@ -183,6 +183,7 @@ <TextView android:id="@+id/roomTypingView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="3dp" @@ -190,7 +191,6 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?colorPrimary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/roomNameView" diff --git a/vector/src/main/res/layout/item_room_alias_text_input.xml b/vector/src/main/res/layout/item_room_alias_text_input.xml deleted file mode 100644 index f9ab547907..0000000000 --- a/vector/src/main/res/layout/item_room_alias_text_input.xml +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?android:colorBackground" - android:minHeight="@dimen/item_form_min_height"> - - <TextView - android:id="@+id/itemRoomAliasHash" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/layout_horizontal_margin" - android:text="@string/matrix_room_alias_prefix" - android:textSize="18sp" - app:layout_constraintBaseline_toBaselineOf="@+id/itemRoomAliasTextInputLayout" - app:layout_constraintStart_toStartOf="parent" /> - - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/itemRoomAliasTextInputLayout" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - app:errorEnabled="true" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/itemRoomAliasHomeServer" - app:layout_constraintStart_toEndOf="@+id/itemRoomAliasHash" - app:layout_constraintTop_toTopOf="parent"> - - <!-- android:imeOptions="actionDone" to fix a crash --> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/itemRoomAliasTextInputEditText" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/create_room_alias_hint" - android:imeOptions="actionDone" - android:inputType="text" /> - - </com.google.android.material.textfield.TextInputLayout> - - <TextView - android:id="@+id/itemRoomAliasHomeServer" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/layout_horizontal_margin" - android:maxWidth="200dp" - android:textSize="18sp" - app:layout_constraintBaseline_toBaselineOf="@+id/itemRoomAliasTextInputLayout" - app:layout_constraintEnd_toEndOf="parent" - tools:text=":matrix.org" /> - -</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/item_room_category.xml b/vector/src/main/res/layout/item_room_category.xml index 2e890ec9e3..0fd1e96d4a 100644 --- a/vector/src/main/res/layout/item_room_category.xml +++ b/vector/src/main/res/layout/item_room_category.xml @@ -18,6 +18,7 @@ <TextView android:id="@+id/roomCategoryTitleView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" @@ -25,14 +26,14 @@ android:gravity="center_vertical" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="14sp" android:textStyle="bold" app:drawableTint="?vctr_content_secondary" - tools:drawableEnd="@drawable/ic_expand_more_white" + tools:drawableEnd="@drawable/ic_expand_more" tools:text="@string/room_participants_header_direct_chats" /> <im.vector.app.features.home.room.list.UnreadCounterBadgeView android:id="@+id/roomCategoryUnreadCounterBadgeView" + style="@style/Widget.Vector.TextView.Micro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" @@ -41,7 +42,6 @@ android:paddingStart="4dp" android:paddingEnd="4dp" android:textColor="?colorOnError" - android:textSize="10sp" tools:background="@drawable/bg_unread_highlight" tools:text="24" /> diff --git a/vector/src/main/res/layout/item_room_directory.xml b/vector/src/main/res/layout/item_room_directory.xml index 51b1f4d5f8..355f14cef3 100644 --- a/vector/src/main/res/layout/item_room_directory.xml +++ b/vector/src/main/res/layout/item_room_directory.xml @@ -27,6 +27,7 @@ <TextView android:id="@+id/itemRoomDirectoryName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -35,7 +36,6 @@ android:lines="1" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/itemRoomDirectoryDescription" app:layout_constraintEnd_toStartOf="@+id/itemRoomDirectoryChecked" @@ -47,6 +47,7 @@ <TextView android:id="@+id/itemRoomDirectoryDescription" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -55,7 +56,6 @@ android:lines="1" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="14sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/itemRoomDirectoryChecked" diff --git a/vector/src/main/res/layout/item_room_directory_server.xml b/vector/src/main/res/layout/item_room_directory_server.xml index 83fc66bdd2..63c81c3aab 100644 --- a/vector/src/main/res/layout/item_room_directory_server.xml +++ b/vector/src/main/res/layout/item_room_directory_server.xml @@ -9,6 +9,7 @@ <TextView android:id="@+id/itemRoomDirectoryServerName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -17,7 +18,6 @@ android:lines="1" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/itemRoomDirectoryServerDescription" app:layout_constraintEnd_toStartOf="@id/itemRoomDirectoryServerRemove" @@ -29,6 +29,7 @@ <TextView android:id="@+id/itemRoomDirectoryServerDescription" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -37,7 +38,6 @@ android:lines="1" android:maxLines="2" android:textColor="?vctr_content_secondary" - android:textSize="15sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/itemRoomDirectoryServerRemove" diff --git a/vector/src/main/res/layout/item_room_filter_footer.xml b/vector/src/main/res/layout/item_room_filter_footer.xml index e1a44f91c8..8df6c53032 100644 --- a/vector/src/main/res/layout/item_room_filter_footer.xml +++ b/vector/src/main/res/layout/item_room_filter_footer.xml @@ -6,17 +6,17 @@ android:orientation="vertical"> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="56dp" android:text="@string/room_filtering_footer_title" - android:textColor="?vctr_content_secondary" - android:textSize="15sp" /> + android:textColor="?vctr_content_secondary" /> <Button android:id="@+id/roomFilterFooterCreateRoom" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -25,7 +25,7 @@ <Button android:id="@+id/roomFilterFooterCreateDirect" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -33,7 +33,7 @@ <Button android:id="@+id/roomFilterFooterOpenRoomDirectory" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" diff --git a/vector/src/main/res/layout/item_room_invitation.xml b/vector/src/main/res/layout/item_room_invitation.xml index 3d992b32ad..e526b10c53 100644 --- a/vector/src/main/res/layout/item_room_invitation.xml +++ b/vector/src/main/res/layout/item_room_invitation.xml @@ -32,6 +32,7 @@ <TextView android:id="@+id/roomInvitationNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -42,7 +43,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" app:drawableEndCompat="@drawable/ic_arrow_right" app:layout_constrainedWidth="true" app:layout_constraintEnd_toEndOf="parent" @@ -54,13 +54,13 @@ <TextView android:id="@+id/roomInvitationSubTitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintEnd_toEndOf="@+id/roomInvitationNameView" app:layout_constraintStart_toStartOf="@+id/roomInvitationNameView" app:layout_constraintTop_toBottomOf="@+id/roomInvitationNameView" diff --git a/vector/src/main/res/layout/item_room_to_add_in_space.xml b/vector/src/main/res/layout/item_room_to_add_in_space.xml index 54047e6c4b..5b04d49d81 100644 --- a/vector/src/main/res/layout/item_room_to_add_in_space.xml +++ b/vector/src/main/res/layout/item_room_to_add_in_space.xml @@ -24,6 +24,7 @@ <TextView android:id="@+id/itemAddRoomRoomNameText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="17dp" @@ -31,7 +32,6 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/itemAddRoomRoomCheckBox" diff --git a/vector/src/main/res/layout/item_room_to_manage_in_space.xml b/vector/src/main/res/layout/item_room_to_manage_in_space.xml index 837e81a239..1299fa4440 100644 --- a/vector/src/main/res/layout/item_room_to_manage_in_space.xml +++ b/vector/src/main/res/layout/item_room_to_manage_in_space.xml @@ -24,6 +24,7 @@ <TextView android:id="@+id/itemAddRoomRoomNameText" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="17dp" @@ -31,7 +32,6 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/itemManageRoomSuggested" @@ -42,20 +42,20 @@ <TextView android:id="@+id/itemManageRoomSuggested" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="8dp" android:ellipsize="end" android:maxLines="1" + android:text="@string/space_suggested" android:textColor="?vctr_content_secondary" - android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/itemAddRoomRoomCheckBox" app:layout_constraintStart_toEndOf="@id/itemAddRoomRoomNameText" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_chainStyle="packed" - android:text="@string/space_suggested" /> + app:layout_constraintVertical_chainStyle="packed" /> <ImageView android:id="@+id/itemAddRoomRoomCheckBox" diff --git a/vector/src/main/res/layout/item_room_widget.xml b/vector/src/main/res/layout/item_room_widget.xml index f5e027c527..5a3905bf45 100644 --- a/vector/src/main/res/layout/item_room_widget.xml +++ b/vector/src/main/res/layout/item_room_widget.xml @@ -40,7 +40,6 @@ android:id="@+id/roomWidgetUrl" style="@style/BottomSheetItemTextSecondary" android:layout_marginEnd="8dp" - android:textStyle="normal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/roomWidgetEditable" app:layout_constraintStart_toStartOf="@id/roomWidgetName" diff --git a/vector/src/main/res/layout/item_search_result.xml b/vector/src/main/res/layout/item_search_result.xml index ad8f293d4c..e62be19333 100644 --- a/vector/src/main/res/layout/item_search_result.xml +++ b/vector/src/main/res/layout/item_search_result.xml @@ -19,6 +19,7 @@ <TextView android:id="@+id/messageMemberNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignParentTop="true" @@ -28,7 +29,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/messageTimeView" app:layout_constraintStart_toEndOf="@+id/messageAvatarImageView" @@ -37,19 +37,20 @@ <TextView android:id="@+id/messageTimeView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/messageMemberNameView" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textColor="?vctr_content_secondary" - android:textSize="12sp" app:layout_constraintBottom_toBottomOf="@+id/messageMemberNameView" app:layout_constraintEnd_toEndOf="parent" tools:text="@tools:sample/date/hhmm" /> <TextView android:id="@+id/messageContentView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" diff --git a/vector/src/main/res/layout/item_settings_button.xml b/vector/src/main/res/layout/item_settings_button.xml index dedf04438c..1b3e173b9a 100644 --- a/vector/src/main/res/layout/item_settings_button.xml +++ b/vector/src/main/res/layout/item_settings_button.xml @@ -8,7 +8,7 @@ <Button android:id="@+id/settings_item_button" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" diff --git a/vector/src/main/res/layout/item_settings_button_single_line.xml b/vector/src/main/res/layout/item_settings_button_single_line.xml index 61938c8841..c6a8a220b9 100644 --- a/vector/src/main/res/layout/item_settings_button_single_line.xml +++ b/vector/src/main/res/layout/item_settings_button_single_line.xml @@ -13,12 +13,12 @@ <TextView android:id="@+id/settings_item_text" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:drawablePadding="8dp" android:gravity="center_vertical" android:textColor="?vctr_content_primary" - android:textSize="15sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/settings_item_button" app:layout_constraintStart_toStartOf="parent" @@ -29,7 +29,7 @@ <Button android:id="@+id/settings_item_button" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" diff --git a/vector/src/main/res/layout/item_settings_continue_cancel.xml b/vector/src/main/res/layout/item_settings_continue_cancel.xml index 8f7dadf4a2..5ec5d90756 100644 --- a/vector/src/main/res/layout/item_settings_continue_cancel.xml +++ b/vector/src/main/res/layout/item_settings_continue_cancel.xml @@ -9,7 +9,7 @@ <Button android:id="@+id/settings_item_cancel_button" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cancel" @@ -19,7 +19,7 @@ <Button android:id="@+id/settings_item_continue_button" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/_continue" diff --git a/vector/src/main/res/layout/item_settings_edit_text.xml b/vector/src/main/res/layout/item_settings_edit_text.xml index 82a702cc9e..61cc1e3695 100644 --- a/vector/src/main/res/layout/item_settings_edit_text.xml +++ b/vector/src/main/res/layout/item_settings_edit_text.xml @@ -10,11 +10,11 @@ <TextView android:id="@+id/settings_item_edit_text_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:orientation="vertical" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/vector/src/main/res/layout/item_settings_helper_info.xml b/vector/src/main/res/layout/item_settings_helper_info.xml index 0dbd104135..07901d2a87 100644 --- a/vector/src/main/res/layout/item_settings_helper_info.xml +++ b/vector/src/main/res/layout/item_settings_helper_info.xml @@ -2,6 +2,7 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/settings_helper_text" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" @@ -11,6 +12,5 @@ android:paddingEnd="@dimen/layout_horizontal_margin" android:paddingBottom="8dp" android:textColor="?vctr_content_secondary" - android:textSize="14sp" tools:drawableStart="@drawable/vector_warning_red" tools:text="If you don’t want this, opt out below. You can also manage any of these preferences in Settings." /> diff --git a/vector/src/main/res/layout/item_settings_information.xml b/vector/src/main/res/layout/item_settings_information.xml index ae3e6aa804..9f4cb5742c 100644 --- a/vector/src/main/res/layout/item_settings_information.xml +++ b/vector/src/main/res/layout/item_settings_information.xml @@ -11,11 +11,11 @@ <TextView android:id="@+id/settings_item_information" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:drawablePadding="8dp" android:gravity="center_vertical" - android:textSize="12sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/vector/src/main/res/layout/item_settings_section_title.xml b/vector/src/main/res/layout/item_settings_section_title.xml index 2f11a4657a..acef1ed325 100644 --- a/vector/src/main/res/layout/item_settings_section_title.xml +++ b/vector/src/main/res/layout/item_settings_section_title.xml @@ -2,6 +2,7 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/settings_section_title_text" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?vctr_header_background" @@ -10,6 +11,5 @@ android:paddingEnd="@dimen/layout_horizontal_margin" android:paddingBottom="@dimen/layout_vertical_margin" android:textColor="?vctr_content_primary" - android:textSize="18sp" android:textStyle="bold" tools:text="Title" /> diff --git a/vector/src/main/res/layout/item_settings_simple_item.xml b/vector/src/main/res/layout/item_settings_simple_item.xml index eae4e97864..b4e6e24b2f 100644 --- a/vector/src/main/res/layout/item_settings_simple_item.xml +++ b/vector/src/main/res/layout/item_settings_simple_item.xml @@ -18,22 +18,22 @@ <TextView android:id="@+id/settings_item_title" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" tools:text="Title" /> <TextView android:id="@+id/settings_item_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:orientation="vertical" android:textColor="?vctr_content_secondary" - android:textSize="15sp" tools:text="Description / Value" /> </LinearLayout> diff --git a/vector/src/main/res/layout/item_settings_three_pid.xml b/vector/src/main/res/layout/item_settings_three_pid.xml index 98446b92c7..74ae731b0e 100644 --- a/vector/src/main/res/layout/item_settings_three_pid.xml +++ b/vector/src/main/res/layout/item_settings_three_pid.xml @@ -26,11 +26,11 @@ <TextView android:id="@+id/item_settings_three_pid_title" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:textColor="?vctr_content_primary" - android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/item_settings_three_pid_delete" app:layout_constraintStart_toEndOf="@+id/item_settings_three_pid_icon" diff --git a/vector/src/main/res/layout/item_simple_reaction_info.xml b/vector/src/main/res/layout/item_simple_reaction_info.xml index 74474a0713..6f473c209d 100644 --- a/vector/src/main/res/layout/item_simple_reaction_info.xml +++ b/vector/src/main/res/layout/item_simple_reaction_info.xml @@ -12,13 +12,13 @@ <TextView android:id="@+id/itemSimpleReactionInfoKey" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:gravity="center" android:lines="1" android:textColor="@color/emoji_color" - android:textSize="18sp" tools:text="@sample/reactions.json/data/reaction" /> <TextView diff --git a/vector/src/main/res/layout/item_space.xml b/vector/src/main/res/layout/item_space.xml index 248552bc01..147112ebb1 100644 --- a/vector/src/main/res/layout/item_space.xml +++ b/vector/src/main/res/layout/item_space.xml @@ -35,6 +35,7 @@ <im.vector.app.features.home.room.list.UnreadCounterBadgeView android:id="@+id/groupCounterBadge" + style="@style/Widget.Vector.TextView.Micro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" @@ -45,7 +46,6 @@ android:paddingStart="4dp" android:paddingEnd="4dp" android:textColor="?colorOnError" - android:textSize="10sp" android:visibility="gone" app:layout_constraintCircle="@+id/groupAvatarImageView" app:layout_constraintCircleAngle="45" @@ -57,6 +57,7 @@ <TextView android:id="@+id/groupNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -64,7 +65,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/groupDescView" app:layout_constraintEnd_toStartOf="@+id/groupChildrenCollapse" @@ -75,8 +75,7 @@ <TextView android:id="@+id/groupDescView" - android:visibility="gone" - tools:visibility="visible" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -84,13 +83,14 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" + android:visibility="gone" app:layout_constraintBottom_toTopOf="@+id/groupBottomSeparator" app:layout_constraintEnd_toStartOf="@+id/groupChildrenCollapse" app:layout_constraintStart_toEndOf="@+id/groupAvatarImageView" app:layout_constraintTop_toBottomOf="@id/groupNameView" app:layout_constraintVertical_chainStyle="packed" - tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/lorem/random" + tools:visibility="visible" /> <ImageView diff --git a/vector/src/main/res/layout/item_space_add.xml b/vector/src/main/res/layout/item_space_add.xml index b2892ccf41..538709dfbb 100644 --- a/vector/src/main/res/layout/item_space_add.xml +++ b/vector/src/main/res/layout/item_space_add.xml @@ -29,6 +29,7 @@ <TextView android:id="@+id/groupNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -37,7 +38,6 @@ android:maxLines="1" android:text="@string/add_space" android:textColor="?colorPrimary" - android:textSize="15sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/groupAvatarImageView" diff --git a/vector/src/main/res/layout/item_space_beta_header.xml b/vector/src/main/res/layout/item_space_beta_header.xml index f7ebde6312..4aec314c93 100644 --- a/vector/src/main/res/layout/item_space_beta_header.xml +++ b/vector/src/main/res/layout/item_space_beta_header.xml @@ -9,25 +9,26 @@ android:paddingEnd="16dp"> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="@string/spaces_header" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:drawableEndCompat="@drawable/ic_beta_pill" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="@string/spaces_beta_welcome_to_spaces_desc" - android:textColor="?vctr_content_secondary" - android:textSize="15sp" /> + android:textColor="?vctr_content_secondary" /> <TextView android:id="@+id/spaceBetaFeedbackAction" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawablePadding="8dp" @@ -37,7 +38,6 @@ android:paddingBottom="8dp" android:text="@string/give_feedback" android:textColor="@color/vector_info_color" - android:textSize="15sp" app:drawableStartCompat="@drawable/ic_feedback" /> </LinearLayout> diff --git a/vector/src/main/res/layout/item_space_roomchild.xml b/vector/src/main/res/layout/item_space_roomchild.xml index d87337439e..e1d8b8edd6 100644 --- a/vector/src/main/res/layout/item_space_roomchild.xml +++ b/vector/src/main/res/layout/item_space_roomchild.xml @@ -41,6 +41,7 @@ <TextView android:id="@+id/childRoomName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -50,7 +51,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/childRoomTopic" app:layout_constraintEnd_toStartOf="@id/spaceChildMemberCountIcon" @@ -61,11 +61,11 @@ <TextView android:id="@+id/childRoomTopic" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintBottom_toBottomOf="@id/spaceChildBarrier" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" @@ -87,6 +87,7 @@ <TextView android:id="@+id/spaceChildMemberCountText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" diff --git a/vector/src/main/res/layout/item_space_subspace.xml b/vector/src/main/res/layout/item_space_subspace.xml index 0c231adf03..3931c6c30d 100644 --- a/vector/src/main/res/layout/item_space_subspace.xml +++ b/vector/src/main/res/layout/item_space_subspace.xml @@ -46,6 +46,7 @@ <TextView android:id="@+id/childSpaceName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -56,7 +57,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/item_space_top_summary.xml b/vector/src/main/res/layout/item_space_top_summary.xml index 15a63e6d68..733e9d065f 100644 --- a/vector/src/main/res/layout/item_space_top_summary.xml +++ b/vector/src/main/res/layout/item_space_top_summary.xml @@ -21,6 +21,7 @@ <TextView android:id="@+id/spaceSummaryMemberCountText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -35,12 +36,12 @@ <TextView android:id="@+id/spaceSummaryTopic" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:autoLink="all" android:textColor="?vctr_content_primary" - android:textSize="15sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/spaceSummaryMemberCountIcon" diff --git a/vector/src/main/res/layout/item_sub_space.xml b/vector/src/main/res/layout/item_sub_space.xml index 62f202c8f0..d915ce28aa 100644 --- a/vector/src/main/res/layout/item_sub_space.xml +++ b/vector/src/main/res/layout/item_sub_space.xml @@ -35,6 +35,7 @@ <im.vector.app.features.home.room.list.UnreadCounterBadgeView android:id="@+id/groupCounterBadge" + style="@style/Widget.Vector.TextView.Micro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" @@ -45,7 +46,6 @@ android:paddingStart="4dp" android:paddingEnd="4dp" android:textColor="?colorOnError" - android:textSize="10sp" android:visibility="gone" app:layout_constraintCircle="@+id/groupAvatarImageView" app:layout_constraintCircleAngle="45" @@ -57,6 +57,7 @@ <TextView android:id="@+id/groupNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -64,7 +65,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/groupChildrenCollapse" diff --git a/vector/src/main/res/layout/item_suggested_room.xml b/vector/src/main/res/layout/item_suggested_room.xml index 9a18de06a1..011aea8dae 100644 --- a/vector/src/main/res/layout/item_suggested_room.xml +++ b/vector/src/main/res/layout/item_suggested_room.xml @@ -38,6 +38,7 @@ <TextView android:id="@+id/roomNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -47,7 +48,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constrainedWidth="true" app:layout_constraintEnd_toStartOf="@+id/joinSuggestedRoomButton" @@ -59,6 +59,7 @@ <TextView android:id="@+id/suggestedRoomDescription" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="3dp" @@ -66,7 +67,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" app:layout_constraintEnd_toStartOf="@id/joinSuggestedRoomButton" app:layout_constraintStart_toStartOf="@+id/roomNameView" app:layout_constraintTop_toBottomOf="@+id/roomNameView" @@ -74,13 +74,13 @@ <Button android:id="@+id/joinSuggestedRoomButton" - style="@style/VectorButtonStyleOutlined" + style="@style/Widget.Vector.Button.Outlined" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:maxWidth="@dimen/button_max_width" android:text="@string/join" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@id/inlineErrorText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -102,6 +102,18 @@ app:barrierDirection="bottom" app:constraint_referenced_ids="roomAvatarBottomSpace" /> + <TextView + android:id="@+id/inlineErrorText" + style="@style/Widget.Vector.TextView.Body" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:drawablePadding="8dp" + android:padding="8dp" + android:textColor="?colorError" + app:drawableStartCompat="@drawable/ic_warning_badge" + app:layout_constraintTop_toBottomOf="@+id/roomBottomBarrier" + tools:text="An error occured while joining" /> + <!-- We use vctr_list_separator_system here for a better rendering --> <View android:id="@+id/roomDividerView" @@ -111,6 +123,6 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/roomBottomBarrier" /> + app:layout_constraintTop_toBottomOf="@+id/inlineErrorText" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/vector/src/main/res/layout/item_timeline_event_base.xml b/vector/src/main/res/layout/item_timeline_event_base.xml index f753bc18a9..a4492a539f 100644 --- a/vector/src/main/res/layout/item_timeline_event_base.xml +++ b/vector/src/main/res/layout/item_timeline_event_base.xml @@ -26,6 +26,7 @@ <TextView android:id="@+id/messageMemberNameView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" @@ -37,12 +38,12 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" tools:text="@sample/users.json/data/displayName" /> <TextView android:id="@+id/messageTimeView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/messageMemberNameView" @@ -50,7 +51,6 @@ android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textColor="?vctr_content_secondary" - android:textSize="12sp" tools:text="@tools:sample/date/hhmm" /> <View @@ -166,8 +166,9 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="4dp" android:indeterminateTint="?vctr_content_secondary" - android:tint="?vctr_content_tertiary" android:visibility="gone" + app:tint="?vctr_content_tertiary" + tools:ignore="MissingPrefix" tools:visibility="visible" /> <LinearLayout diff --git a/vector/src/main/res/layout/item_timeline_event_call_tile_stub.xml b/vector/src/main/res/layout/item_timeline_event_call_tile_stub.xml index ab59802145..79e260f605 100644 --- a/vector/src/main/res/layout/item_timeline_event_call_tile_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_call_tile_stub.xml @@ -16,6 +16,7 @@ <TextView android:id="@+id/itemCallCreatorNameTextView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" @@ -23,13 +24,13 @@ android:drawablePadding="6dp" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" tools:text="@sample/users.json/data/displayName" /> <TextView android:id="@+id/itemCallKindTextView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -40,11 +41,11 @@ android:drawablePadding="4dp" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="12sp" tools:text="@string/action_video_call" /> <TextView android:id="@+id/itemCallStatusTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -52,8 +53,7 @@ android:layout_marginTop="12dp" android:layout_marginEnd="8dp" android:layout_marginBottom="12dp" - android:textColor="?vctr_notice_secondary" - android:textSize="13sp" + android:textColor="?vctr_content_secondary" tools:text="@string/video_call_in_progress" /> @@ -64,7 +64,7 @@ <Button android:id="@+id/itemCallAcceptView" - style="@style/VectorButtonStyle.Positive" + style="@style/Widget.Vector.Button.Positive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" @@ -77,7 +77,7 @@ <Button android:id="@+id/itemCallRejectView" - style="@style/VectorButtonStyle.Destructive" + style="@style/Widget.Vector.Button.Destructive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" diff --git a/vector/src/main/res/layout/item_timeline_event_code_block_stub.xml b/vector/src/main/res/layout/item_timeline_event_code_block_stub.xml index 7889efacc4..280dc77d5f 100644 --- a/vector/src/main/res/layout/item_timeline_event_code_block_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_code_block_stub.xml @@ -10,15 +10,16 @@ <TextView android:id="@+id/codeBlockTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:fontFamily="monospace" - android:textSize="14sp" /> + android:fontFamily="monospace" /> </HorizontalScrollView> <TextView android:id="@+id/codeBlockEditedView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" /> diff --git a/vector/src/main/res/layout/item_timeline_event_create.xml b/vector/src/main/res/layout/item_timeline_event_create.xml index 49e9bff53a..ea881ccdd0 100644 --- a/vector/src/main/res/layout/item_timeline_event_create.xml +++ b/vector/src/main/res/layout/item_timeline_event_create.xml @@ -7,6 +7,7 @@ <TextView android:id="@+id/roomCreateItemDescription" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" @@ -17,7 +18,7 @@ android:gravity="center|start" android:minHeight="80dp" android:padding="16dp" - tools:text="This room is continuation…" - app:drawableStartCompat="@drawable/error" /> + app:drawableStartCompat="@drawable/error" + tools:text="This room is continuation…" /> </FrameLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_timeline_event_day_separator.xml b/vector/src/main/res/layout/item_timeline_event_day_separator.xml index 38b03c4159..7b5e62dca2 100644 --- a/vector/src/main/res/layout/item_timeline_event_day_separator.xml +++ b/vector/src/main/res/layout/item_timeline_event_day_separator.xml @@ -15,6 +15,7 @@ <TextView android:id="@+id/itemDayTextView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -22,7 +23,6 @@ android:paddingStart="24dp" android:paddingEnd="24dp" android:textColor="?vctr_content_tertiary" - android:textSize="15sp" tools:text="@tools:sample/date/day_of_week" /> </FrameLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_timeline_event_default_stub.xml b/vector/src/main/res/layout/item_timeline_event_default_stub.xml index f32d9cf813..a5357f2227 100644 --- a/vector/src/main/res/layout/item_timeline_event_default_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_default_stub.xml @@ -17,6 +17,7 @@ <TextView android:id="@+id/itemDefaultTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" @@ -24,7 +25,6 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:textColor="?colorSecondary" - android:textSize="14sp" android:textStyle="italic" tools:text="@string/rendering_event_error_type_of_event_not_handled" /> diff --git a/vector/src/main/res/layout/item_timeline_event_file_stub.xml b/vector/src/main/res/layout/item_timeline_event_file_stub.xml index 3c551bea88..bf6a5b7479 100644 --- a/vector/src/main/res/layout/item_timeline_event_file_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_file_stub.xml @@ -41,6 +41,7 @@ <!-- the media --> <TextView android:id="@+id/messageFilenameView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" diff --git a/vector/src/main/res/layout/item_timeline_event_merged_header_stub.xml b/vector/src/main/res/layout/item_timeline_event_merged_header_stub.xml index 0e38f3be57..cfa5d1d3b9 100644 --- a/vector/src/main/res/layout/item_timeline_event_merged_header_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_merged_header_stub.xml @@ -21,6 +21,7 @@ <TextView android:id="@+id/itemMergedExpandTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" @@ -31,7 +32,6 @@ android:paddingBottom="4dp" android:text="@string/merged_events_expand" android:textColor="?colorSecondary" - android:textSize="14sp" android:textStyle="italic" /> </RelativeLayout> @@ -45,12 +45,12 @@ <TextView android:id="@+id/itemMergedSummaryTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:textColor="?vctr_content_secondary" android:textIsSelectable="false" - android:textSize="14sp" tools:text="3 membership changes" /> </LinearLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_timeline_event_merged_room_creation_stub.xml b/vector/src/main/res/layout/item_timeline_event_merged_room_creation_stub.xml index 289489d98f..c8d635bada 100644 --- a/vector/src/main/res/layout/item_timeline_event_merged_room_creation_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_merged_room_creation_stub.xml @@ -63,12 +63,12 @@ <TextView android:id="@+id/roomNameTileText" + style="@style/Widget.Vector.TextView.Title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginEnd="16dp" android:textColor="?vctr_content_primary" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -77,13 +77,12 @@ <TextView android:id="@+id/roomNameDescriptionText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginEnd="16dp" android:textColor="?vctr_content_secondary" - android:textSize="15sp" - android:textStyle="normal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/roomNameTileText" @@ -91,13 +90,12 @@ <TextView android:id="@+id/roomNameTopicText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:textColor="?vctr_content_secondary" android:textColorLink="?colorPrimary" - android:textSize="15sp" - android:textStyle="normal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/roomNameDescriptionText" @@ -128,6 +126,7 @@ android:src="@drawable/ic_add_people" /> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" @@ -157,6 +156,7 @@ <TextView android:id="@+id/itemNoticeTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" @@ -167,13 +167,13 @@ android:layout_toStartOf="@id/itemMergedExpandTextView" android:layout_toEndOf="@id/itemNoticeAvatarView" android:textColor="?vctr_content_secondary" - android:textSize="14sp" android:textStyle="italic" tools:text="@string/room_created_summary_item" /> <TextView android:id="@+id/itemMergedExpandTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" @@ -184,7 +184,6 @@ android:paddingBottom="4dp" android:text="@string/merged_events_expand" android:textColor="?colorSecondary" - android:textSize="14sp" android:textStyle="italic" /> </RelativeLayout> diff --git a/vector/src/main/res/layout/item_timeline_event_merged_utd_stub.xml b/vector/src/main/res/layout/item_timeline_event_merged_utd_stub.xml index 9a26855396..abcd679dea 100644 --- a/vector/src/main/res/layout/item_timeline_event_merged_utd_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_merged_utd_stub.xml @@ -21,6 +21,7 @@ <TextView android:id="@+id/itemVerificationDoneTitleTextView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -29,13 +30,13 @@ android:gravity="start" android:text="@string/notice_crypto_unable_to_decrypt_merged" android:textColor="?vctr_content_secondary" - android:textSize="15sp" - app:drawableTint="?vctr_content_secondary" - app:drawableStartCompat="@drawable/ic_clock" /> + app:drawableStartCompat="@drawable/ic_clock" + app:drawableTint="?vctr_content_secondary" /> <TextView android:id="@+id/itemVerificationDoneDetailTextView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -45,12 +46,12 @@ android:gravity="center" android:text="@string/notice_crypto_unable_to_decrypt_friendly_desc" android:textColor="?vctr_content_secondary" - android:textSize="12sp" android:textStyle="italic" /> <TextView android:id="@+id/itemMergedExpandTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" @@ -61,7 +62,6 @@ android:paddingBottom="4dp" android:text="@string/merged_events_expand" android:textColor="?colorSecondary" - android:textSize="14sp" android:textStyle="italic" android:visibility="gone" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/item_timeline_event_notice_stub.xml b/vector/src/main/res/layout/item_timeline_event_notice_stub.xml index f924ca6dd5..8b024849cc 100644 --- a/vector/src/main/res/layout/item_timeline_event_notice_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_notice_stub.xml @@ -17,6 +17,7 @@ <TextView android:id="@+id/itemNoticeTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" @@ -24,7 +25,6 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:textColor="?vctr_content_secondary" - android:textSize="14sp" android:textStyle="italic" tools:text="@string/notice_avatar_url_changed" /> diff --git a/vector/src/main/res/layout/item_timeline_event_option_buttons_stub.xml b/vector/src/main/res/layout/item_timeline_event_option_buttons_stub.xml index 9643144d20..e3a8bd7df4 100644 --- a/vector/src/main/res/layout/item_timeline_event_option_buttons_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_option_buttons_stub.xml @@ -7,12 +7,11 @@ <TextView android:id="@+id/optionLabelText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:textColor="?vctr_content_primary" - android:textSize="14sp" - android:textStyle="normal" tools:text="What would you like to do?" /> <LinearLayout @@ -24,7 +23,7 @@ <!-- Filled at runtime with buttons --> <!--Button android:id="@+id/pollButton1" - style="@style/VectorButtonStyleOutlined.Poll" + style="@style/Widget.Vector.Button.Outlined.Poll" android:layout_width="match_parent" android:layout_height="wrap_content" tools:text="Create Github issue" /--> diff --git a/vector/src/main/res/layout/item_timeline_event_poll_stub.xml b/vector/src/main/res/layout/item_timeline_event_poll_stub.xml index 23833d91c9..03504b12d9 100644 --- a/vector/src/main/res/layout/item_timeline_event_poll_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_poll_stub.xml @@ -23,12 +23,12 @@ <TextView android:id="@+id/pollLabelText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginStart="4dp" android:textColor="?vctr_content_primary" - android:textSize="14sp" android:textStyle="bold" tools:text="What would you like to do?" /> @@ -36,7 +36,7 @@ <Button android:id="@+id/pollButton1" - style="@style/VectorButtonStyleOutlined.Poll" + style="@style/Widget.Vector.Button.Outlined.Poll" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" @@ -45,7 +45,7 @@ <Button android:id="@+id/pollButton2" - style="@style/VectorButtonStyleOutlined.Poll" + style="@style/Widget.Vector.Button.Outlined.Poll" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" @@ -54,7 +54,7 @@ <Button android:id="@+id/pollButton3" - style="@style/VectorButtonStyleOutlined.Poll" + style="@style/Widget.Vector.Button.Outlined.Poll" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" @@ -63,7 +63,7 @@ <Button android:id="@+id/pollButton4" - style="@style/VectorButtonStyleOutlined.Poll" + style="@style/Widget.Vector.Button.Outlined.Poll" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" @@ -72,7 +72,7 @@ <Button android:id="@+id/pollButton5" - style="@style/VectorButtonStyleOutlined.Poll" + style="@style/Widget.Vector.Button.Outlined.Poll" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" @@ -134,11 +134,11 @@ <TextView android:id="@+id/pollInfosText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:textColor="?vctr_content_secondary" - android:textSize="12sp" android:visibility="gone" tools:text="12 votes - Final Results" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/item_timeline_event_redacted_stub.xml b/vector/src/main/res/layout/item_timeline_event_redacted_stub.xml index 28bf58bcff..f2dbb3e6c6 100644 --- a/vector/src/main/res/layout/item_timeline_event_redacted_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_redacted_stub.xml @@ -1,11 +1,11 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawablePadding="8dp" android:gravity="center_vertical" android:text="@string/event_redacted" android:textColor="?vctr_content_tertiary" - android:textSize="14sp" app:drawableStartCompat="@drawable/ic_trash_16" app:drawableTint="?vctr_content_tertiary" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_timeline_event_status_tile_stub.xml b/vector/src/main/res/layout/item_timeline_event_status_tile_stub.xml index ff0effcb5f..fb2d8c2057 100644 --- a/vector/src/main/res/layout/item_timeline_event_status_tile_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_status_tile_stub.xml @@ -8,13 +8,13 @@ <TextView android:id="@+id/itemVerificationDoneTitleTextView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:drawablePadding="6dp" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" tools:drawableStart="@drawable/ic_shield_trusted" tools:text="@string/sas_verified" /> @@ -22,6 +22,7 @@ <TextView android:id="@+id/itemVerificationDoneDetailTextView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -30,7 +31,6 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="12dp" android:textColor="?vctr_content_primary" - android:textSize="12sp" tools:text="Alice (@alice:matrix.org)" /> </LinearLayout> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml b/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml index 66373100c1..39df45989c 100644 --- a/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml @@ -8,10 +8,10 @@ <TextView android:id="@+id/messageTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="?vctr_content_primary" - android:textSize="14sp" tools:text="@sample/messages.json/data/message" /> <im.vector.app.features.home.room.detail.timeline.url.PreviewUrlView diff --git a/vector/src/main/res/layout/item_timeline_event_verification_stub.xml b/vector/src/main/res/layout/item_timeline_event_verification_stub.xml index 0b38afd0f5..66d9a71e39 100644 --- a/vector/src/main/res/layout/item_timeline_event_verification_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_verification_stub.xml @@ -9,13 +9,13 @@ <TextView android:id="@+id/itemVerificationTitleTextView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:drawablePadding="6dp" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:drawableStartCompat="@drawable/ic_shield_black" tools:text="@string/verification_request" /> @@ -23,6 +23,7 @@ <TextView android:id="@+id/itemVerificationDetailTextView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -31,7 +32,6 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="12dp" android:textColor="?vctr_content_primary" - android:textSize="12sp" tools:text="Alice (@alice:matrix.org)" /> <LinearLayout @@ -44,7 +44,7 @@ <Button android:id="@+id/sas_verification_verified_decline_button" - style="@style/VectorButtonStyle.Destructive" + style="@style/Widget.Vector.Button.Destructive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" @@ -52,7 +52,7 @@ <Button android:id="@+id/sas_verification_verified_accept_button" - style="@style/VectorButtonStyle.Positive" + style="@style/Widget.Vector.Button.Positive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/accept" /> @@ -61,12 +61,12 @@ <TextView android:id="@+id/itemVerificationStatusText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="@string/verification_request_you_accepted" android:textColor="?vctr_notice_secondary" - android:textSize="13sp" android:visibility="gone" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/item_timeline_event_voice_stub.xml b/vector/src/main/res/layout/item_timeline_event_voice_stub.xml index 6809fa6722..6c8a9ad960 100644 --- a/vector/src/main/res/layout/item_timeline_event_voice_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_voice_stub.xml @@ -8,39 +8,21 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/voicePlaybackLayout" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:background="@drawable/bg_voice_playback" - android:minHeight="48dp" - android:paddingStart="8dp" - android:paddingTop="6dp" - android:paddingEnd="8dp" - android:paddingBottom="6dp" + style="@style/VoiceTimelinePlaybackLayout" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <ImageButton android:id="@+id/voicePlaybackControlButton" - android:layout_width="32dp" - android:layout_height="32dp" - android:background="@drawable/bg_voice_play_pause_button" - android:contentDescription="@string/a11y_play_voice_message" - android:paddingStart="3dp" - android:paddingEnd="0dp" - android:src="@drawable/ic_voice_play" + style="@style/VoiceTimelinePlaybackControlButton" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/voicePlaybackTime" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="6dp" - android:lineSpacingExtra="4sp" - android:textColor="@color/palette_gray_200" - android:textSize="14sp" + style="@style/VoiceTimelinePlaybackTime" app:layout_constraintBottom_toBottomOf="@id/voicePlaybackControlButton" app:layout_constraintStart_toEndOf="@id/voicePlaybackControlButton" app:layout_constraintTop_toTopOf="@id/voicePlaybackControlButton" @@ -48,18 +30,7 @@ <com.visualizer.amplitude.AudioRecordView android:id="@+id/voicePlaybackWaveform" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - app:chunkAlignTo="center" - app:chunkColor="@color/palette_gray_300" - app:chunkMinHeight="1dp" - app:chunkRoundedCorners="true" - app:chunkSoftTransition="true" - app:chunkSpace="2dp" - app:chunkWidth="2dp" - app:direction="leftToRight" + style="@style/VoicePlaybackWaveform" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/voicePlaybackTime" diff --git a/vector/src/main/res/layout/item_timeline_event_widget_stub.xml b/vector/src/main/res/layout/item_timeline_event_widget_stub.xml index 6732e6d121..1e73fc09a7 100644 --- a/vector/src/main/res/layout/item_timeline_event_widget_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_widget_stub.xml @@ -9,12 +9,12 @@ <TextView android:id="@+id/itemWidgetTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawablePadding="6dp" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:drawableTint="?vctr_content_primary" tools:drawableStart="@drawable/ic_video" diff --git a/vector/src/main/res/layout/item_timeline_read_marker.xml b/vector/src/main/res/layout/item_timeline_read_marker.xml index 5ce388c90b..d78547748d 100644 --- a/vector/src/main/res/layout/item_timeline_read_marker.xml +++ b/vector/src/main/res/layout/item_timeline_read_marker.xml @@ -13,6 +13,7 @@ android:background="@color/notification_accent_color" /> <TextView + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" @@ -21,7 +22,6 @@ android:paddingStart="16dp" android:paddingEnd="16dp" android:text="@string/timeline_unread_messages" - android:textColor="@color/notification_accent_color" - android:textSize="15sp" /> + android:textColor="@color/notification_accent_color" /> </FrameLayout> diff --git a/vector/src/main/res/layout/item_tos.xml b/vector/src/main/res/layout/item_tos.xml index 2faab4921f..0a02ff7f54 100644 --- a/vector/src/main/res/layout/item_tos.xml +++ b/vector/src/main/res/layout/item_tos.xml @@ -16,6 +16,7 @@ <TextView android:id="@+id/term_name" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:paddingStart="8dp" @@ -29,6 +30,7 @@ <TextView android:id="@+id/term_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:paddingStart="8dp" diff --git a/vector/src/main/res/layout/item_unknown_room.xml b/vector/src/main/res/layout/item_unknown_room.xml index dc71d0694a..c6428861c3 100644 --- a/vector/src/main/res/layout/item_unknown_room.xml +++ b/vector/src/main/res/layout/item_unknown_room.xml @@ -25,6 +25,7 @@ <TextView android:id="@+id/itemUnknownRoomName" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="17dp" @@ -32,7 +33,6 @@ android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/item_uploads_file.xml b/vector/src/main/res/layout/item_uploads_file.xml index bf3fd9fafc..cc4b43ea92 100644 --- a/vector/src/main/res/layout/item_uploads_file.xml +++ b/vector/src/main/res/layout/item_uploads_file.xml @@ -22,13 +22,13 @@ <TextView android:id="@+id/uploadsFileTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/uploadsFileSubtitle" app:layout_constraintEnd_toStartOf="@+id/uploadsFileActionDownload" @@ -39,12 +39,12 @@ <TextView android:id="@+id/uploadsFileSubtitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:ellipsize="end" android:textColor="?vctr_content_secondary" - android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@+id/uploadsFileTitle" app:layout_constraintStart_toStartOf="@+id/uploadsFileTitle" diff --git a/vector/src/main/res/layout/item_user.xml b/vector/src/main/res/layout/item_user.xml index 407ea7f3cb..5ea46822ac 100644 --- a/vector/src/main/res/layout/item_user.xml +++ b/vector/src/main/res/layout/item_user.xml @@ -23,6 +23,7 @@ <TextView android:id="@+id/itemUserId" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -30,7 +31,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/itemUserName" app:layout_constraintEnd_toEndOf="parent" @@ -41,13 +41,13 @@ <TextView android:id="@+id/itemUserName" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="12dp" android:ellipsize="end" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="15sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/item_user_directory_letter_header.xml b/vector/src/main/res/layout/item_user_directory_letter_header.xml index c63f84f412..9b672238ae 100644 --- a/vector/src/main/res/layout/item_user_directory_letter_header.xml +++ b/vector/src/main/res/layout/item_user_directory_letter_header.xml @@ -1,14 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> - <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/userDirectoryLetterView" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:fontFamily="sans-serif-medium" android:padding="8dp" android:textColor="?vctr_content_primary" - android:textSize="20sp" - android:textStyle="normal" tools:text="C" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_user_list_header.xml b/vector/src/main/res/layout/item_user_list_header.xml index af1d0dec90..6faa957862 100644 --- a/vector/src/main/res/layout/item_user_list_header.xml +++ b/vector/src/main/res/layout/item_user_list_header.xml @@ -1,14 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> - <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/userListHeaderView" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:fontFamily="sans-serif-medium" android:padding="8dp" android:textColor="?vctr_content_primary" - android:textSize="20sp" - android:textStyle="normal" tools:text="Recents | Contacts" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_verification_action.xml b/vector/src/main/res/layout/item_verification_action.xml index 69c513985f..455c5ce9a4 100644 --- a/vector/src/main/res/layout/item_verification_action.xml +++ b/vector/src/main/res/layout/item_verification_action.xml @@ -5,7 +5,7 @@ android:id="@+id/itemVerificationClickableZone" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?colorSurface" + android:background="?android:colorBackground" android:clickable="true" android:focusable="true" android:foreground="?attr/selectableItemBackground" @@ -33,11 +33,11 @@ <TextView android:id="@+id/itemVerificationActionTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:textColor="?colorPrimary" - android:textSize="16sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@+id/itemVerificationActionSubTitle" app:layout_constraintEnd_toStartOf="@+id/itemVerificationActionIcon" @@ -49,11 +49,11 @@ <TextView android:id="@+id/itemVerificationActionSubTitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:textColor="?vctr_content_secondary" - android:textSize="12sp" android:visibility="gone" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" diff --git a/vector/src/main/res/layout/item_verification_decimal_code.xml b/vector/src/main/res/layout/item_verification_decimal_code.xml index 2eeb6902dc..ed6ed767d4 100644 --- a/vector/src/main/res/layout/item_verification_decimal_code.xml +++ b/vector/src/main/res/layout/item_verification_decimal_code.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/itemVerificationDecimalCode" + style="@style/Widget.Vector.TextView.Title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" @@ -11,8 +11,4 @@ android:textColor="?vctr_content_primary" android:textSize="28sp" android:textStyle="bold" - app:layout_constraintBottom_toBottomOf="@+id/sas_emoji_grid" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@+id/sas_emoji_grid" tools:text="1234-4320-3905" /> diff --git a/vector/src/main/res/layout/item_verification_notice.xml b/vector/src/main/res/layout/item_verification_notice.xml index eb4a82a9be..2bc83fc993 100644 --- a/vector/src/main/res/layout/item_verification_notice.xml +++ b/vector/src/main/res/layout/item_verification_notice.xml @@ -2,6 +2,7 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/itemVerificationNoticeText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="@dimen/layout_horizontal_margin" @@ -9,5 +10,4 @@ android:paddingEnd="@dimen/layout_horizontal_margin" android:paddingBottom="8dp" android:textColor="?vctr_content_primary" - android:textSize="14sp" tools:text="todo" /> diff --git a/vector/src/main/res/layout/item_verification_wait.xml b/vector/src/main/res/layout/item_verification_wait.xml index 278a8a8fd0..d406fed84f 100644 --- a/vector/src/main/res/layout/item_verification_wait.xml +++ b/vector/src/main/res/layout/item_verification_wait.xml @@ -12,6 +12,7 @@ <TextView android:id="@+id/use_latest_riot" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="start" @@ -53,6 +54,7 @@ <TextView android:id="@+id/app_desktop_web" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" @@ -65,6 +67,7 @@ <TextView android:id="@+id/app_ios_android" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" @@ -84,13 +87,13 @@ <TextView + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center" android:text="@string/or_other_mx_capabale_client" android:textColor="?vctr_content_secondary" - android:textSize="12sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/labelsBarrier" /> diff --git a/vector/src/main/res/layout/item_verification_waiting.xml b/vector/src/main/res/layout/item_verification_waiting.xml index e2b0566fdb..6a265f4edc 100644 --- a/vector/src/main/res/layout/item_verification_waiting.xml +++ b/vector/src/main/res/layout/item_verification_waiting.xml @@ -12,10 +12,10 @@ <TextView android:id="@+id/itemVerificationWaitingTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:textColor="?vctr_content_secondary" - android:textSize="16sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/itemVerificationWaitingProgress" diff --git a/vector/src/main/res/layout/media_upload_download_progress_layout.xml b/vector/src/main/res/layout/media_upload_download_progress_layout.xml index a110e08135..d62bb65190 100644 --- a/vector/src/main/res/layout/media_upload_download_progress_layout.xml +++ b/vector/src/main/res/layout/media_upload_download_progress_layout.xml @@ -8,10 +8,11 @@ <TextView android:id="@+id/mediaProgressTextView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" - android:textSize="12sp" + android:textColor="?vctr_content_primary" tools:text="Information" /> <ProgressBar diff --git a/vector/src/main/res/layout/merge_image_attachment_overlay.xml b/vector/src/main/res/layout/merge_image_attachment_overlay.xml index 65dd374fc6..af8eb0090d 100644 --- a/vector/src/main/res/layout/merge_image_attachment_overlay.xml +++ b/vector/src/main/res/layout/merge_image_attachment_overlay.xml @@ -37,6 +37,7 @@ <TextView android:id="@+id/overlayCounterText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" @@ -44,7 +45,6 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?colorOnPrimary" - android:textSize="14sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@id/overlayInfoText" app:layout_constraintEnd_toStartOf="@id/overlayShareButton" @@ -55,13 +55,13 @@ <TextView android:id="@+id/overlayInfoText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:ellipsize="end" android:maxLines="1" android:textColor="?colorOnPrimary" - android:textSize="14sp" app:layout_constraintBottom_toBottomOf="@id/overlayTopBackground" app:layout_constraintEnd_toStartOf="@id/overlayShareButton" app:layout_constraintStart_toStartOf="@id/overlayCounterText" diff --git a/vector/src/main/res/layout/merge_overlay_waiting_view.xml b/vector/src/main/res/layout/merge_overlay_waiting_view.xml index e634cf8c83..3288b5bbe5 100644 --- a/vector/src/main/res/layout/merge_overlay_waiting_view.xml +++ b/vector/src/main/res/layout/merge_overlay_waiting_view.xml @@ -43,6 +43,7 @@ <TextView android:id="@+id/waitingStatusText" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" diff --git a/vector/src/main/res/layout/option_buttons.xml b/vector/src/main/res/layout/option_buttons.xml index 6ea394725b..2ec63fd2f5 100644 --- a/vector/src/main/res/layout/option_buttons.xml +++ b/vector/src/main/res/layout/option_buttons.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" - style="@style/VectorButtonStyleUnelevated.Bot" + style="@style/Widget.Vector.Button.Unelevated.Bot" android:layout_width="match_parent" android:layout_height="wrap_content" tools:text="Create Github issue" /> diff --git a/vector/src/main/res/layout/reaction_button.xml b/vector/src/main/res/layout/reaction_button.xml index 72a795db76..f31e86ed96 100644 --- a/vector/src/main/res/layout/reaction_button.xml +++ b/vector/src/main/res/layout/reaction_button.xml @@ -36,6 +36,7 @@ <TextView android:id="@+id/reactionText" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="20dp" android:layout_marginStart="6dp" @@ -45,7 +46,6 @@ android:minWidth="20dp" android:singleLine="true" android:textColor="@color/emoji_color" - android:textSize="13sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/reactionCount" app:layout_constraintHorizontal_chainStyle="packed" @@ -55,6 +55,7 @@ <TextView android:id="@+id/reactionCount" + style="@style/Widget.Vector.TextView.Micro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="2dp" @@ -62,7 +63,6 @@ android:gravity="center" android:maxLines="1" android:textColor="?vctr_content_secondary" - android:textSize="10sp" android:textStyle="bold" app:autoSizeMaxTextSize="14sp" app:autoSizeMinTextSize="8sp" diff --git a/vector/src/main/res/layout/vector_home_badge_unread_layout.xml b/vector/src/main/res/layout/vector_home_badge_unread_layout.xml index a24f36df3a..9ad6be6d69 100644 --- a/vector/src/main/res/layout/vector_home_badge_unread_layout.xml +++ b/vector/src/main/res/layout/vector_home_badge_unread_layout.xml @@ -7,6 +7,7 @@ <im.vector.app.features.home.room.list.UnreadCounterBadgeView android:id="@+id/actionUnreadCounterBadgeView" + style="@style/Widget.Vector.TextView.Micro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top|center_horizontal" @@ -18,7 +19,6 @@ android:paddingStart="4dp" android:paddingEnd="4dp" android:textColor="?colorOnError" - android:textSize="10sp" tools:background="@drawable/bg_unread_highlight" tools:text="4" /> diff --git a/vector/src/main/res/layout/vector_invite_view.xml b/vector/src/main/res/layout/vector_invite_view.xml index 7af3262248..6dc5fd41c7 100644 --- a/vector/src/main/res/layout/vector_invite_view.xml +++ b/vector/src/main/res/layout/vector_invite_view.xml @@ -21,12 +21,13 @@ <TextView android:id="@+id/inviteNameView" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:paddingStart="@dimen/layout_horizontal_margin" android:paddingEnd="@dimen/layout_horizontal_margin" - android:textAppearance="@style/TextAppearance.Vector.Title" + android:textColor="?vctr_content_primary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/inviteAvatarView" @@ -34,12 +35,13 @@ <TextView android:id="@+id/inviteIdentifierView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:paddingStart="@dimen/layout_horizontal_margin" android:paddingEnd="@dimen/layout_horizontal_margin" - android:textAppearance="@style/TextAppearance.Vector.Subtitle" + android:textColor="?vctr_content_secondary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/inviteNameView" @@ -47,11 +49,12 @@ <TextView android:id="@+id/inviteLabelView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:text="@string/send_you_invite" - android:textAppearance="@style/TextAppearance.Vector.Subtitle2" + android:textColor="?vctr_content_secondary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/inviteIdentifierView" /> diff --git a/vector/src/main/res/layout/vector_preference_push_rule.xml b/vector/src/main/res/layout/vector_preference_push_rule.xml index 9df48bbe5d..5242bfdf85 100644 --- a/vector/src/main/res/layout/vector_preference_push_rule.xml +++ b/vector/src/main/res/layout/vector_preference_push_rule.xml @@ -19,25 +19,26 @@ <TextView android:id="@android:id/title" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="marquee" android:singleLine="true" - android:textAppearance="?android:attr/textAppearanceListItem" - android:textSize="16sp" + android:textAppearance="?textAppearanceListItem" + android:textColor="?vctr_content_primary" tools:text="Title" /> <TextView android:id="@android:id/summary" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@android:id/title" android:layout_alignStart="@android:id/title" android:maxLines="2" android:paddingTop="6dp" - android:textAppearance="?android:attr/textAppearanceSmall" + android:textAppearance="?textAppearanceListItemSecondary" android:textColor="?vctr_content_secondary" - android:textSize="14sp" tools:text="Summary" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/view_active_conference_view.xml b/vector/src/main/res/layout/view_active_conference_view.xml index 043736c190..9f26ed9a1a 100644 --- a/vector/src/main/res/layout/view_active_conference_view.xml +++ b/vector/src/main/res/layout/view_active_conference_view.xml @@ -9,6 +9,7 @@ <TextView android:id="@+id/activeConferenceInfo" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toStartOf="@id/deleteWidgetButton" @@ -26,7 +27,7 @@ <Button android:id="@+id/deleteWidgetButton" - style="@style/VectorButtonStyleText.OnPrimary" + style="@style/Widget.Vector.Button.Text.OnPrimary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/activeConferenceInfo" @@ -37,7 +38,6 @@ android:paddingStart="8dp" android:paddingEnd="16dp" android:text="@string/action_close" - android:textSize="15sp" android:textStyle="bold" /> </merge> diff --git a/vector/src/main/res/layout/view_attachment_type_selector.xml b/vector/src/main/res/layout/view_attachment_type_selector.xml index 9fe977e060..648ca91820 100644 --- a/vector/src/main/res/layout/view_attachment_type_selector.xml +++ b/vector/src/main/res/layout/view_attachment_type_selector.xml @@ -2,17 +2,18 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:paddingStart="8dp" + android:paddingEnd="8dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" android:background="@drawable/bg_attachment_type_selector" android:orientation="vertical" android:paddingTop="16dp" - android:paddingBottom="16dp"> + android:paddingBottom="16dp" + tools:ignore="UselessParent"> <LinearLayout android:layout_width="match_parent" @@ -162,7 +163,5 @@ </LinearLayout> </LinearLayout> - </LinearLayout> - </FrameLayout> diff --git a/vector/src/main/res/layout/view_bottom_sheet_action_button.xml b/vector/src/main/res/layout/view_bottom_sheet_action_button.xml index 8a950f17ea..5056f38e09 100644 --- a/vector/src/main/res/layout/view_bottom_sheet_action_button.xml +++ b/vector/src/main/res/layout/view_bottom_sheet_action_button.xml @@ -38,11 +38,11 @@ <TextView android:id="@+id/bottomSheetActionTitle" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:textColor="?colorPrimary" - android:textSize="16sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@+id/bottomSheetActionSubTitle" app:layout_constraintEnd_toStartOf="@+id/bottomSheetActionIcon" @@ -54,11 +54,11 @@ <TextView android:id="@+id/bottomSheetActionSubTitle" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:textColor="?vctr_content_secondary" - android:textSize="12sp" android:visibility="gone" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" diff --git a/vector/src/main/res/layout/view_button_state.xml b/vector/src/main/res/layout/view_button_state.xml index b6ee7864c9..5cc63ca59f 100644 --- a/vector/src/main/res/layout/view_button_state.xml +++ b/vector/src/main/res/layout/view_button_state.xml @@ -7,7 +7,7 @@ <Button android:id="@+id/buttonStateButtonFlat" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" @@ -46,7 +46,7 @@ <Button android:id="@+id/buttonStateRetry" - style="@style/VectorButtonStyleText" + style="@style/Widget.Vector.Button.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" diff --git a/vector/src/main/res/layout/view_call_controls.xml b/vector/src/main/res/layout/view_call_controls.xml index 789df58370..2ef5be5ad0 100644 --- a/vector/src/main/res/layout/view_call_controls.xml +++ b/vector/src/main/res/layout/view_call_controls.xml @@ -25,6 +25,7 @@ android:focusable="true" android:padding="12dp" android:src="@drawable/ic_call_answer" + app:tint="?colorOnPrimary" tools:ignore="MissingConstraints,MissingPrefix" /> <ImageView @@ -38,6 +39,7 @@ android:focusable="true" android:padding="12dp" android:src="@drawable/ic_call_hangup" + app:tint="?colorOnPrimary" tools:ignore="MissingConstraints,MissingPrefix" /> <androidx.constraintlayout.helper.widget.Flow @@ -100,6 +102,7 @@ android:focusable="true" android:padding="12dp" android:src="@drawable/ic_call_hangup" + app:tint="?colorOnPrimary" tools:ignore="MissingConstraints,MissingPrefix" /> <ImageView diff --git a/vector/src/main/res/layout/view_current_calls.xml b/vector/src/main/res/layout/view_current_calls.xml index 7d9765d407..36a999e275 100644 --- a/vector/src/main/res/layout/view_current_calls.xml +++ b/vector/src/main/res/layout/view_current_calls.xml @@ -10,6 +10,7 @@ <TextView android:id="@+id/currentCallsInfo" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toStartOf="@id/returnToCallButton" @@ -21,13 +22,12 @@ android:paddingBottom="12dp" android:text="@string/call_only_active" android:textColor="?colorOnPrimary" - android:textSize="14sp" app:drawableStartCompat="@drawable/ic_call_answer" app:drawableTint="?colorOnPrimary" /> <Button android:id="@+id/returnToCallButton" - style="@style/VectorButtonStyleText.OnPrimary" + style="@style/Widget.Vector.Button.Text.OnPrimary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/currentCallsInfo" @@ -39,7 +39,6 @@ android:paddingStart="8dp" android:paddingEnd="16dp" android:text="@string/action_return" - android:textSize="14sp" android:textStyle="bold" /> </merge> diff --git a/vector/src/main/res/layout/view_failed_messages_warning.xml b/vector/src/main/res/layout/view_failed_messages_warning.xml index 871844a22a..3e0e307dc3 100644 --- a/vector/src/main/res/layout/view_failed_messages_warning.xml +++ b/vector/src/main/res/layout/view_failed_messages_warning.xml @@ -20,6 +20,7 @@ <TextView android:id="@+id/failedMessagesWarningTextView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_horizontal_margin" @@ -28,7 +29,6 @@ android:gravity="center_vertical" android:text="@string/event_status_failed_messages_warning" android:textColor="?vctr_content_primary" - android:textSize="14sp" app:drawableStartCompat="@drawable/ic_sending_message_failed" app:layout_constraintBottom_toBottomOf="@id/failedMessagesRetryButton" app:layout_constraintEnd_toStartOf="@+id/failedMessagesDeleteAllButton" @@ -49,12 +49,12 @@ <Button android:id="@+id/failedMessagesRetryButton" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="48dp" android:layout_marginTop="8dp" android:layout_marginEnd="@dimen/layout_horizontal_margin" android:text="@string/global_retry" - android:textSize="14sp" app:icon="@drawable/ic_retry_sending_messages" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/view_file_icon.xml b/vector/src/main/res/layout/view_file_icon.xml index 2d1331a83a..1c5268a50b 100644 --- a/vector/src/main/res/layout/view_file_icon.xml +++ b/vector/src/main/res/layout/view_file_icon.xml @@ -8,7 +8,7 @@ <ProgressBar android:id="@+id/messageFileProgressbar" - style="@style/FileProgressBar" + style="@style/Widget.Vector.ProgressBar.Horizontal.File" android:layout_width="match_parent" android:layout_height="match_parent" android:progress="40" /> diff --git a/vector/src/main/res/layout/view_jump_to_read_marker.xml b/vector/src/main/res/layout/view_jump_to_read_marker.xml deleted file mode 100644 index 5f5944fa17..0000000000 --- a/vector/src/main/res/layout/view_jump_to_read_marker.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/notification_accent_color" - tools:parentTag="android.widget.RelativeLayout"> - - <TextView - android:id="@+id/jumpToReadMarkerLabelView" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_toStartOf="@+id/closeJumpToReadMarkerView" - android:background="?attr/selectableItemBackground" - android:drawablePadding="10dp" - android:gravity="center_vertical" - android:paddingStart="16dp" - android:paddingTop="12dp" - android:paddingEnd="16dp" - android:paddingBottom="12dp" - android:text="@string/room_jump_to_first_unread" - android:textColor="?colorOnPrimary" - app:drawableStartCompat="@drawable/arrow_up_circle" /> - - <ImageView - android:id="@+id/closeJumpToReadMarkerView" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_alignTop="@+id/jumpToReadMarkerLabelView" - android:layout_alignBottom="@+id/jumpToReadMarkerLabelView" - android:layout_alignParentEnd="true" - android:background="?attr/selectableItemBackground" - android:contentDescription="@string/action_close" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:src="@drawable/ic_close_24dp" - app:tint="?colorOnPrimary" /> - -</merge> diff --git a/vector/src/main/res/layout/view_keys_backup_banner.xml b/vector/src/main/res/layout/view_keys_backup_banner.xml index 63ec310ce6..7dcb3d223a 100644 --- a/vector/src/main/res/layout/view_keys_backup_banner.xml +++ b/vector/src/main/res/layout/view_keys_backup_banner.xml @@ -31,12 +31,12 @@ <TextView android:id="@+id/view_keys_backup_banner_text_1" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="27dp" android:text="@string/secure_backup_banner_setup_line1" android:textColor="?vctr_content_primary" - android:textSize="18sp" app:layout_constraintBottom_toTopOf="@id/view_keys_backup_banner_text_2" app:layout_constraintEnd_toStartOf="@id/view_keys_backup_banner_barrier" app:layout_constraintStart_toEndOf="@id/view_keys_backup_banner_picto" @@ -44,12 +44,12 @@ <TextView android:id="@+id/view_keys_backup_banner_text_2" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="27dp" android:text="@string/secure_backup_banner_setup_line2" android:textColor="?vctr_content_secondary" - android:textSize="14sp" android:visibility="gone" app:layout_constraintBottom_toTopOf="@+id/view_keys_backup_banner_space2" app:layout_constraintEnd_toStartOf="@id/view_keys_backup_banner_barrier" diff --git a/vector/src/main/res/layout/view_notification_area.xml b/vector/src/main/res/layout/view_notification_area.xml index e8a4600544..5e3a79291c 100644 --- a/vector/src/main/res/layout/view_notification_area.xml +++ b/vector/src/main/res/layout/view_notification_area.xml @@ -24,6 +24,7 @@ <TextView android:id="@+id/roomNotificationMessage" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" diff --git a/vector/src/main/res/layout/view_poll_result_line.xml b/vector/src/main/res/layout/view_poll_result_line.xml index 4718f59af3..6238aa1b05 100644 --- a/vector/src/main/res/layout/view_poll_result_line.xml +++ b/vector/src/main/res/layout/view_poll_result_line.xml @@ -21,21 +21,21 @@ <TextView android:id="@+id/pollResultItemLabel" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:textColor="?vctr_content_primary" - android:textSize="14sp" tools:text="Open a Github Issue" /> <TextView android:id="@+id/pollResultItemPercent" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:textColor="?vctr_content_primary" - android:textSize="14sp" tools:text="47%" /> </merge> \ No newline at end of file diff --git a/vector/src/main/res/layout/view_read_marker.xml b/vector/src/main/res/layout/view_read_marker.xml index bea00fbb15..65eb02e95c 100644 --- a/vector/src/main/res/layout/view_read_marker.xml +++ b/vector/src/main/res/layout/view_read_marker.xml @@ -7,11 +7,12 @@ <TextView android:id="@+id/receiptMore" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginEnd="8dp" android:gravity="center" - android:textSize="12sp" + android:textColor="?vctr_content_primary" tools:text="999+" /> <ImageView diff --git a/vector/src/main/res/layout/view_read_receipts.xml b/vector/src/main/res/layout/view_read_receipts.xml index 6e674406fa..06f73c0db4 100644 --- a/vector/src/main/res/layout/view_read_receipts.xml +++ b/vector/src/main/res/layout/view_read_receipts.xml @@ -8,6 +8,7 @@ <TextView android:id="@+id/receiptMore" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="@dimen/item_event_message_state_size" android:background="@drawable/pill_receipt" @@ -15,7 +16,7 @@ android:importantForAccessibility="no" android:paddingStart="4dp" android:paddingEnd="4dp" - android:textSize="12sp" + android:textColor="?vctr_content_primary" tools:text="999+" /> <ImageView diff --git a/vector/src/main/res/layout/view_room_widgets_banner.xml b/vector/src/main/res/layout/view_room_widgets_banner.xml index 6575078626..f0184d0144 100644 --- a/vector/src/main/res/layout/view_room_widgets_banner.xml +++ b/vector/src/main/res/layout/view_room_widgets_banner.xml @@ -8,6 +8,7 @@ <TextView android:id="@+id/activeWidgetsLabel" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" @@ -17,12 +18,12 @@ android:paddingTop="8dp" android:paddingEnd="12dp" android:paddingBottom="8dp" - android:textAppearance="@style/TextAppearance.Vector.Title" android:textColor="?vctr_room_active_widgets_banner_text" tools:text="2 active widgets" /> <TextView android:id="@+id/activeWidgetsViewAction" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" diff --git a/vector/src/main/res/layout/view_sign_out_bottom_sheet_action_button.xml b/vector/src/main/res/layout/view_sign_out_bottom_sheet_action_button.xml index 2a9c374f2d..46361f24b0 100644 --- a/vector/src/main/res/layout/view_sign_out_bottom_sheet_action_button.xml +++ b/vector/src/main/res/layout/view_sign_out_bottom_sheet_action_button.xml @@ -32,12 +32,12 @@ <TextView android:id="@+id/actionTitleText" + style="@style/Widget.Vector.TextView.HeadlineMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="@string/secure_backup_setup" - android:textColor="?vctr_content_secondary" - android:textSize="17sp" /> + android:textColor="?vctr_content_primary" /> </LinearLayout> diff --git a/vector/src/main/res/layout/view_space_type_button.xml b/vector/src/main/res/layout/view_space_type_button.xml index 67b23f9a94..fa4aa887be 100644 --- a/vector/src/main/res/layout/view_space_type_button.xml +++ b/vector/src/main/res/layout/view_space_type_button.xml @@ -23,13 +23,13 @@ <TextView android:id="@+id/title" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="4dp" android:gravity="start" android:textColor="?vctr_content_primary" - android:textSize="16sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@id/subTitle" app:layout_constraintEnd_toStartOf="@id/rightChevron" @@ -40,14 +40,13 @@ <TextView android:id="@+id/subTitle" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="4dp" android:gravity="start" android:textColor="?vctr_content_secondary" - android:textSize="12sp" - android:textStyle="normal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/rightChevron" app:layout_constraintStart_toEndOf="@id/buttonImageView" diff --git a/vector/src/main/res/layout/view_state.xml b/vector/src/main/res/layout/view_state.xml index 606ed12e43..782bba6588 100644 --- a/vector/src/main/res/layout/view_state.xml +++ b/vector/src/main/res/layout/view_state.xml @@ -26,12 +26,12 @@ <TextView android:id="@+id/errorMessageView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="16sp" tools:text="Une erreur est survenue" /> <Button @@ -75,12 +75,12 @@ <TextView android:id="@+id/emptyTitleView" + style="@style/Widget.Vector.TextView.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center" android:textColor="?vctr_content_primary" - android:textSize="15sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@id/emptyMessageView" app:layout_constraintEnd_toEndOf="parent" @@ -91,13 +91,13 @@ <TextView android:id="@+id/emptyMessageView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="220dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="20dp" android:gravity="center" android:textColor="?vctr_content_secondary" - android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/layout/view_stub_room_member_profile_header.xml b/vector/src/main/res/layout/view_stub_room_member_profile_header.xml index dcdf9e4bcc..e7d930b070 100644 --- a/vector/src/main/res/layout/view_stub_room_member_profile_header.xml +++ b/vector/src/main/res/layout/view_stub_room_member_profile_header.xml @@ -41,11 +41,10 @@ <TextView android:id="@+id/memberProfileNameView" + style="@style/Widget.Vector.TextView.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:textAppearance="@style/Vector.Toolbar.Title" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/memberProfileIdView" app:layout_constraintEnd_toEndOf="parent" @@ -55,13 +54,12 @@ <TextView android:id="@+id/memberProfileIdView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="16dp" android:gravity="center" - android:textAppearance="@style/Vector.Toolbar.Title" - android:textSize="14sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/memberProfilePowerLevelView" app:layout_constraintEnd_toEndOf="parent" @@ -71,11 +69,12 @@ <TextView android:id="@+id/memberProfilePowerLevelView" + style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:gravity="center" - android:textSize="12sp" + android:textColor="?vctr_content_primary" app:layout_constraintBottom_toTopOf="@+id/memberProfileStatusView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -84,10 +83,10 @@ <TextView android:id="@+id/memberProfileStatusView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:textSize="14sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/view_stub_room_profile_header.xml b/vector/src/main/res/layout/view_stub_room_profile_header.xml index 15135294ea..7308e8a207 100644 --- a/vector/src/main/res/layout/view_stub_room_profile_header.xml +++ b/vector/src/main/res/layout/view_stub_room_profile_header.xml @@ -31,11 +31,10 @@ <TextView android:id="@+id/roomProfileNameView" + style="@style/Widget.Vector.TextView.Title" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" - android:textAppearance="@style/Vector.Toolbar.Title" - android:textSize="20sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/roomProfileAliasView" app:layout_constraintEnd_toEndOf="parent" @@ -45,14 +44,13 @@ <TextView android:id="@+id/roomProfileAliasView" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="16dp" android:gravity="center" android:singleLine="true" - android:textAppearance="@style/Vector.Toolbar.Title" - android:textSize="14sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/layout/view_sync_state.xml b/vector/src/main/res/layout/view_sync_state.xml index 3d8720da99..55b8d4524a 100644 --- a/vector/src/main/res/layout/view_sync_state.xml +++ b/vector/src/main/res/layout/view_sync_state.xml @@ -16,7 +16,7 @@ tools:visibility="visible"> <ProgressBar - style="@style/Widget.AppCompat.ProgressBar.Horizontal" + style="@style/Widget.Vector.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="14dp" android:layout_gravity="center" @@ -26,6 +26,7 @@ <TextView android:id="@+id/syncStateNoNetwork" + style="@style/Widget.Vector.TextView.Body" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?colorError" @@ -46,6 +47,7 @@ tools:visibility="visible"> <TextView + style="@style/Widget.Vector.TextView.Body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" diff --git a/vector/src/main/res/layout/view_url_preview.xml b/vector/src/main/res/layout/view_url_preview.xml index c99d1b42f5..72030384f6 100644 --- a/vector/src/main/res/layout/view_url_preview.xml +++ b/vector/src/main/res/layout/view_url_preview.xml @@ -18,13 +18,13 @@ <TextView android:id="@+id/url_preview_title" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="7dp" android:ellipsize="end" android:maxLines="2" android:textColor="?vctr_content_primary" - android:textSize="14sp" android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/url_preview_close" app:layout_constraintStart_toStartOf="@+id/url_preview_left_border" @@ -45,6 +45,7 @@ <TextView android:id="@+id/url_preview_description" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="7dp" @@ -52,7 +53,6 @@ android:ellipsize="end" android:maxLines="4" android:textColor="?vctr_content_secondary" - android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/url_preview_left_border" app:layout_constraintTop_toBottomOf="@+id/url_preview_image" @@ -60,6 +60,7 @@ <TextView android:id="@+id/url_preview_site" + style="@style/Widget.Vector.TextView.Body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="7dp" @@ -68,7 +69,6 @@ android:maxLines="1" android:singleLine="true" android:textColor="?vctr_content_tertiary" - android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/url_preview_left_border" app:layout_constraintTop_toBottomOf="@+id/url_preview_description" diff --git a/vector/src/main/res/layout/view_voice_message_recorder.xml b/vector/src/main/res/layout/view_voice_message_recorder.xml index bf48ee1513..1a6fee8528 100644 --- a/vector/src/main/res/layout/view_voice_message_recorder.xml +++ b/vector/src/main/res/layout/view_voice_message_recorder.xml @@ -3,115 +3,85 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/voice_message_recording_layout" - android:minHeight="200dp" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:minHeight="200dp"> <View android:id="@+id/voiceMessageLockBackground" - android:layout_width="52dp" - android:layout_height="160dp" - android:background="@drawable/bg_voice_message_lock" + style="@style/VoiceMessageLockBackground" android:visibility="gone" - tools:visibility="visible" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/voiceMessageMicButton" /> + app:layout_constraintTop_toBottomOf="@id/voiceMessageMicButton" + tools:visibility="visible" /> <ImageButton android:id="@+id/voiceMessageMicButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="?android:attr/selectableItemBackground" + style="@style/VoiceMessageMicButton" android:contentDescription="@string/a11y_start_voice_message" - android:layout_marginBottom="12dp" - android:layout_marginEnd="12dp" - android:src="@drawable/ic_voice_mic" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <ImageButton android:id="@+id/voiceMessageSendButton" - android:layout_width="56dp" - android:layout_height="56dp" + style="@style/VoiceMessageSendButton" android:contentDescription="@string/send" - android:background="@drawable/bg_send" - android:scaleType="center" android:visibility="gone" - tools:visibility="visible" - android:src="@drawable/ic_send" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + tools:visibility="visible" /> <ImageView android:id="@+id/voiceMessageTimerIndicator" - android:layout_width="10dp" - android:layout_height="10dp" - android:layout_marginStart="20dp" + style="@style/VoiceMessageTimerIndicator" android:contentDescription="@string/a11y_recording_voice_message" - android:src="@drawable/circle" android:visibility="gone" - tools:visibility="visible" app:layout_constraintBottom_toBottomOf="@id/voiceMessageMicButton" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/voiceMessageMicButton" - app:tint="@color/palette_vermilion" - tools:ignore="MissingPrefix" /> + tools:ignore="MissingPrefix" + tools:visibility="visible" /> <TextView android:id="@+id/voiceMessageTimer" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="4dp" - android:lineSpacingExtra="4dp" - android:textColor="@color/palette_gray_200" - android:textSize="14sp" + style="@style/VoiceMessageTimer" android:visibility="gone" - tools:visibility="visible" app:layout_constraintBottom_toBottomOf="@id/voiceMessageMicButton" app:layout_constraintStart_toEndOf="@id/voiceMessageTimerIndicator" app:layout_constraintTop_toTopOf="@id/voiceMessageMicButton" - tools:text="00:03" /> + tools:text="00:03" + tools:visibility="visible" /> <TextView android:id="@+id/voiceMessageSlideToCancel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="center" + style="@style/VoiceMessageSlideToCancel" android:text="@string/voice_message_slide_to_cancel" - android:textColor="@color/palette_gray_300" - android:textSize="14sp" android:visibility="gone" - tools:visibility="visible" - app:drawableStartCompat="@drawable/ic_voice_slide_to_cancel_arrow" app:layout_constraintBottom_toBottomOf="@id/voiceMessageMicButton" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@id/voiceMessageMicButton" /> + app:layout_constraintTop_toTopOf="@id/voiceMessageMicButton" + tools:visibility="visible" /> <ImageView android:id="@+id/voiceMessageLockImage" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" + style="@style/VoiceMessageLockImage" android:contentDescription="@string/a11y_lock_voice_message" - android:src="@drawable/ic_voice_message_unlocked" android:visibility="gone" - tools:visibility="visible" app:layout_constraintEnd_toEndOf="@id/voiceMessageLockBackground" app:layout_constraintStart_toStartOf="@id/voiceMessageLockBackground" - app:layout_constraintTop_toTopOf="@id/voiceMessageLockBackground" /> + app:layout_constraintTop_toTopOf="@id/voiceMessageLockBackground" + tools:visibility="visible" /> <ImageView android:id="@+id/voiceMessageLockArrow" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_voice_lock_arrow" + style="@style/VoiceMessageLockArrow" android:visibility="gone" - tools:visibility="visible" app:layout_constraintBottom_toTopOf="@id/voiceMessageMicButton" app:layout_constraintEnd_toEndOf="@id/voiceMessageLockBackground" app:layout_constraintStart_toStartOf="@id/voiceMessageLockBackground" - tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription" + tools:visibility="visible" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/voiceMessagePlaybackLayout" @@ -119,74 +89,49 @@ android:layout_height="44dp" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - android:visibility="gone" - tools:visibility="visible" android:layout_marginBottom="4dp" + android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/voiceMessageMicButton" - app:layout_constraintStart_toStartOf="parent" > + app:layout_constraintStart_toStartOf="parent" + tools:visibility="visible"> <ImageButton android:id="@+id/voiceMessageDeletePlayback" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="?android:attr/selectableItemBackground" + style="@style/VoiceMessageDeletePlayback" android:contentDescription="@string/a11y_delete_recorded_voice_message" - android:src="@drawable/recv_ic_delete" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:tint="@color/palette_gray_200" tools:ignore="MissingPrefix" /> <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="0dp" - android:layout_height="0dp" - app:layout_constraintStart_toEndOf="@id/voiceMessageDeletePlayback" + style="@style/VoiceMessageRecordingPlaybackLayout" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - android:backgroundTint="?vctr_voice_message_recording_playback_background" - android:background="@drawable/bg_voice_playback" - android:layout_marginStart="16dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent"> + app:layout_constraintStart_toEndOf="@id/voiceMessageDeletePlayback" + app:layout_constraintTop_toTopOf="parent"> <ImageView android:id="@+id/voiceMessagePlaybackTimerIndicator" - android:layout_width="10dp" - android:layout_height="10dp" - android:layout_marginStart="8dp" + style="@style/VoiceMessagePlaybackTimerIndicator" android:contentDescription="@string/a11y_recording_voice_message" - android:src="@drawable/circle" - app:layout_goneMarginStart="24dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:tint="@color/palette_vermilion" tools:ignore="MissingPrefix" /> <ImageButton android:id="@+id/voicePlaybackControlButton" - android:layout_width="32dp" - android:layout_height="32dp" - android:background="@drawable/bg_voice_play_pause_button" + style="@style/VoicePlaybackControlButton" android:contentDescription="@string/a11y_play_voice_message" - android:paddingStart="3dp" - android:layout_marginStart="8dp" - android:paddingEnd="0dp" - android:src="@drawable/ic_voice_play" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/voicePlaybackTime" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="6dp" - android:lineSpacingExtra="4sp" - android:textColor="@color/palette_gray_200" - app:layout_goneMarginStart="24dp" - android:textSize="14sp" + style="@style/VoicePlaybackTime" app:layout_constraintBottom_toBottomOf="@id/voicePlaybackControlButton" app:layout_constraintStart_toEndOf="@id/voicePlaybackControlButton" app:layout_constraintTop_toTopOf="@id/voicePlaybackControlButton" @@ -194,18 +139,7 @@ <com.visualizer.amplitude.AudioRecordView android:id="@+id/voicePlaybackWaveform" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - app:chunkAlignTo="center" - app:chunkColor="@color/palette_gray_300" - app:chunkMinHeight="1dp" - app:chunkRoundedCorners="true" - app:chunkSoftTransition="true" - app:chunkSpace="2dp" - app:chunkWidth="2dp" - app:direction="leftToRight" + style="@style/VoicePlaybackWaveform" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/voicePlaybackTime" diff --git a/vector/src/main/res/menu/bug_report.xml b/vector/src/main/res/menu/bug_report.xml index e35028be35..a6420432cf 100755 --- a/vector/src/main/res/menu/bug_report.xml +++ b/vector/src/main/res/menu/bug_report.xml @@ -8,5 +8,6 @@ android:id="@+id/ic_action_send_bug_report" android:icon="@drawable/ic_send" android:title="@string/send_bug_report" + app:iconTint="?colorPrimary" app:showAsAction="always" /> </menu> diff --git a/vector/src/main/res/menu/home_bottom_navigation.xml b/vector/src/main/res/menu/home_bottom_navigation.xml index d52c8afab3..f9f966003a 100644 --- a/vector/src/main/res/menu/home_bottom_navigation.xml +++ b/vector/src/main/res/menu/home_bottom_navigation.xml @@ -20,4 +20,11 @@ android:title="@string/bottom_action_notification" android:visible="false" /> + <item + android:id="@+id/bottom_action_dial_pad" + android:enabled="true" + android:icon="@drawable/ic_call_dial_pad" + android:title="@string/call_dial_pad_title" + android:visible="false" /> + </menu> diff --git a/vector/src/main/res/menu/menu_manage_space.xml b/vector/src/main/res/menu/menu_manage_space.xml index 858c3bc9c3..ac657e0df2 100644 --- a/vector/src/main/res/menu/menu_manage_space.xml +++ b/vector/src/main/res/menu/menu_manage_space.xml @@ -4,18 +4,18 @@ <item android:id="@+id/action_delete" - android:title="@string/delete" android:icon="@drawable/ic_delete_unsent_messages" + android:title="@string/delete" app:showAsAction="always" /> <item android:id="@+id/action_mark_as_suggested" android:title="@string/space_mark_as_suggested" - app:showAsAction="ifRoom" /> + app:showAsAction="never" /> <item android:id="@+id/action_mark_as_not_suggested" android:title="@string/space_mark_as_not_suggested" - app:showAsAction="ifRoom" /> + app:showAsAction="never" /> </menu> \ No newline at end of file diff --git a/vector/src/main/res/menu/menu_push_gateways.xml b/vector/src/main/res/menu/menu_push_gateways.xml index 15709a1f1e..99b2bca963 100644 --- a/vector/src/main/res/menu/menu_push_gateways.xml +++ b/vector/src/main/res/menu/menu_push_gateways.xml @@ -6,6 +6,7 @@ android:id="@+id/refresh" android:icon="@drawable/ic_refresh_cw" android:title="@string/refresh" + app:iconTint="?colorPrimary" app:showAsAction="always" /> </menu> \ No newline at end of file diff --git a/vector/src/main/res/menu/menu_space_add_room.xml b/vector/src/main/res/menu/menu_space_add_room.xml index b11844673e..048b89892c 100644 --- a/vector/src/main/res/menu/menu_space_add_room.xml +++ b/vector/src/main/res/menu/menu_space_add_room.xml @@ -4,6 +4,5 @@ <item android:id="@+id/spaceAddRoomSaveItem" android:title="@string/save" - app:iconTint="?colorSecondary" app:showAsAction="always" /> </menu> \ No newline at end of file diff --git a/vector/src/main/res/menu/vector_room_profile.xml b/vector/src/main/res/menu/vector_room_profile.xml index 0ac3412497..ef1bbbc7d8 100644 --- a/vector/src/main/res/menu/vector_room_profile.xml +++ b/vector/src/main/res/menu/vector_room_profile.xml @@ -5,6 +5,6 @@ android:id="@+id/roomProfileShareAction" android:icon="@drawable/ic_material_share" android:title="@string/share" - app:iconTint="?vctr_content_secondary" + app:iconTint="?colorSecondary" app:showAsAction="ifRoom" /> </menu> \ No newline at end of file diff --git a/vector/src/main/res/raw/emoji_picker_datasource.json b/vector/src/main/res/raw/emoji_picker_datasource.json index 6aa3799cf0..c2def98ebc 100644 --- a/vector/src/main/res/raw/emoji_picker_datasource.json +++ b/vector/src/main/res/raw/emoji_picker_datasource.json @@ -1 +1 @@ -{"compressed":true,"categories":[{"id":"smileys_&_emotion","name":"Smileys & Emotion","emojis":["grinning-face","grinning-face-with-big-eyes","grinning-face-with-smiling-eyes","beaming-face-with-smiling-eyes","grinning-squinting-face","grinning-face-with-sweat","rolling-on-the-floor-laughing","face-with-tears-of-joy","slightly-smiling-face","upsidedown-face","winking-face","smiling-face-with-smiling-eyes","smiling-face-with-halo","smiling-face-with-hearts","smiling-face-with-hearteyes","starstruck","face-blowing-a-kiss","kissing-face","smiling-face","kissing-face-with-closed-eyes","kissing-face-with-smiling-eyes","smiling-face-with-tear","face-savoring-food","face-with-tongue","winking-face-with-tongue","zany-face","squinting-face-with-tongue","moneymouth-face","hugging-face","face-with-hand-over-mouth","shushing-face","thinking-face","zippermouth-face","face-with-raised-eyebrow","neutral-face","expressionless-face","face-without-mouth","face-in-clouds","smirking-face","unamused-face","face-with-rolling-eyes","grimacing-face","face-exhaling","lying-face","relieved-face","pensive-face","sleepy-face","drooling-face","sleeping-face","face-with-medical-mask","face-with-thermometer","face-with-headbandage","nauseated-face","face-vomiting","sneezing-face","hot-face","cold-face","woozy-face","knockedout-face","face-with-spiral-eyes","exploding-head","cowboy-hat-face","partying-face","disguised-face","smiling-face-with-sunglasses","nerd-face","face-with-monocle","confused-face","worried-face","slightly-frowning-face","frowning-face","face-with-open-mouth","hushed-face","astonished-face","flushed-face","pleading-face","frowning-face-with-open-mouth","anguished-face","fearful-face","anxious-face-with-sweat","sad-but-relieved-face","crying-face","loudly-crying-face","face-screaming-in-fear","confounded-face","persevering-face","disappointed-face","downcast-face-with-sweat","weary-face","tired-face","yawning-face","face-with-steam-from-nose","pouting-face","angry-face","face-with-symbols-on-mouth","smiling-face-with-horns","angry-face-with-horns","skull","skull-and-crossbones","pile-of-poo","clown-face","ogre","goblin","ghost","alien","alien-monster","robot","grinning-cat","grinning-cat-with-smiling-eyes","cat-with-tears-of-joy","smiling-cat-with-hearteyes","cat-with-wry-smile","kissing-cat","weary-cat","crying-cat","pouting-cat","seenoevil-monkey","hearnoevil-monkey","speaknoevil-monkey","kiss-mark","love-letter","heart-with-arrow","heart-with-ribbon","sparkling-heart","growing-heart","beating-heart","revolving-hearts","two-hearts","heart-decoration","heart-exclamation","broken-heart","heart-on-fire","mending-heart","red-heart","orange-heart","yellow-heart","green-heart","blue-heart","purple-heart","brown-heart","black-heart","white-heart","hundred-points","anger-symbol","collision","dizzy","sweat-droplets","dashing-away","hole","bomb","speech-balloon","eye-in-speech-bubble","left-speech-bubble","right-anger-bubble","thought-balloon","zzz"]},{"id":"people_&_body","name":"People & Body","emojis":["waving-hand","raised-back-of-hand","hand-with-fingers-splayed","raised-hand","vulcan-salute","ok-hand","pinched-fingers","pinching-hand","victory-hand","crossed-fingers","loveyou-gesture","sign-of-the-horns","call-me-hand","backhand-index-pointing-left","backhand-index-pointing-right","backhand-index-pointing-up","middle-finger","backhand-index-pointing-down","index-pointing-up","thumbs-up","thumbs-down","raised-fist","oncoming-fist","leftfacing-fist","rightfacing-fist","clapping-hands","raising-hands","open-hands","palms-up-together","handshake","folded-hands","writing-hand","nail-polish","selfie","flexed-biceps","mechanical-arm","mechanical-leg","leg","foot","ear","ear-with-hearing-aid","nose","brain","anatomical-heart","lungs","tooth","bone","eyes","eye","tongue","mouth","baby","child","boy","girl","person","person-blond-hair","man","person-beard","man-beard","woman-beard","man-red-hair","man-curly-hair","man-white-hair","man-bald","woman","woman-red-hair","person-red-hair","woman-curly-hair","person-curly-hair","woman-white-hair","person-white-hair","woman-bald","person-bald","woman-blond-hair","man-blond-hair","older-person","old-man","old-woman","person-frowning","man-frowning","woman-frowning","person-pouting","man-pouting","woman-pouting","person-gesturing-no","man-gesturing-no","woman-gesturing-no","person-gesturing-ok","man-gesturing-ok","woman-gesturing-ok","person-tipping-hand","man-tipping-hand","woman-tipping-hand","person-raising-hand","man-raising-hand","woman-raising-hand","deaf-person","deaf-man","deaf-woman","person-bowing","man-bowing","woman-bowing","person-facepalming","man-facepalming","woman-facepalming","person-shrugging","man-shrugging","woman-shrugging","health-worker","man-health-worker","woman-health-worker","student","man-student","woman-student","teacher","man-teacher","woman-teacher","judge","man-judge","woman-judge","farmer","man-farmer","woman-farmer","cook","man-cook","woman-cook","mechanic","man-mechanic","woman-mechanic","factory-worker","man-factory-worker","woman-factory-worker","office-worker","man-office-worker","woman-office-worker","scientist","man-scientist","woman-scientist","technologist","man-technologist","woman-technologist","singer","man-singer","woman-singer","artist","man-artist","woman-artist","pilot","man-pilot","woman-pilot","astronaut","man-astronaut","woman-astronaut","firefighter","man-firefighter","woman-firefighter","police-officer","man-police-officer","woman-police-officer","detective","man-detective","woman-detective","guard","man-guard","woman-guard","ninja","construction-worker","man-construction-worker","woman-construction-worker","prince","princess","person-wearing-turban","man-wearing-turban","woman-wearing-turban","person-with-skullcap","woman-with-headscarf","person-in-tuxedo","man-in-tuxedo","woman-in-tuxedo","person-with-veil","man-with-veil","woman-with-veil","pregnant-woman","breastfeeding","woman-feeding-baby","man-feeding-baby","person-feeding-baby","baby-angel","santa-claus","mrs-claus","mx-claus","superhero","man-superhero","woman-superhero","supervillain","man-supervillain","woman-supervillain","mage","man-mage","woman-mage","fairy","man-fairy","woman-fairy","vampire","man-vampire","woman-vampire","merperson","merman","mermaid","elf","man-elf","woman-elf","genie","man-genie","woman-genie","zombie","man-zombie","woman-zombie","person-getting-massage","man-getting-massage","woman-getting-massage","person-getting-haircut","man-getting-haircut","woman-getting-haircut","person-walking","man-walking","woman-walking","person-standing","man-standing","woman-standing","person-kneeling","man-kneeling","woman-kneeling","person-with-white-cane","man-with-white-cane","woman-with-white-cane","person-in-motorized-wheelchair","man-in-motorized-wheelchair","woman-in-motorized-wheelchair","person-in-manual-wheelchair","man-in-manual-wheelchair","woman-in-manual-wheelchair","person-running","man-running","woman-running","woman-dancing","man-dancing","person-in-suit-levitating","people-with-bunny-ears","men-with-bunny-ears","women-with-bunny-ears","person-in-steamy-room","man-in-steamy-room","woman-in-steamy-room","person-climbing","man-climbing","woman-climbing","person-fencing","horse-racing","skier","snowboarder","person-golfing","man-golfing","woman-golfing","person-surfing","man-surfing","woman-surfing","person-rowing-boat","man-rowing-boat","woman-rowing-boat","person-swimming","man-swimming","woman-swimming","person-bouncing-ball","man-bouncing-ball","woman-bouncing-ball","person-lifting-weights","man-lifting-weights","woman-lifting-weights","person-biking","man-biking","woman-biking","person-mountain-biking","man-mountain-biking","woman-mountain-biking","person-cartwheeling","man-cartwheeling","woman-cartwheeling","people-wrestling","men-wrestling","women-wrestling","person-playing-water-polo","man-playing-water-polo","woman-playing-water-polo","person-playing-handball","man-playing-handball","woman-playing-handball","person-juggling","man-juggling","woman-juggling","person-in-lotus-position","man-in-lotus-position","woman-in-lotus-position","person-taking-bath","person-in-bed","people-holding-hands","women-holding-hands","woman-and-man-holding-hands","men-holding-hands","kiss","kiss-woman-man","kiss-man-man","kiss-woman-woman","couple-with-heart","couple-with-heart-woman-man","couple-with-heart-man-man","couple-with-heart-woman-woman","family","family-man-woman-boy","family-man-woman-girl","family-man-woman-girl-boy","family-man-woman-boy-boy","family-man-woman-girl-girl","family-man-man-boy","family-man-man-girl","family-man-man-girl-boy","family-man-man-boy-boy","family-man-man-girl-girl","family-woman-woman-boy","family-woman-woman-girl","family-woman-woman-girl-boy","family-woman-woman-boy-boy","family-woman-woman-girl-girl","family-man-boy","family-man-boy-boy","family-man-girl","family-man-girl-boy","family-man-girl-girl","family-woman-boy","family-woman-boy-boy","family-woman-girl","family-woman-girl-boy","family-woman-girl-girl","speaking-head","bust-in-silhouette","busts-in-silhouette","people-hugging","footprints"]},{"id":"animals_&_nature","name":"Animals & Nature","emojis":["monkey-face","monkey","gorilla","orangutan","dog-face","dog","guide-dog","service-dog","poodle","wolf","fox","raccoon","cat-face","cat","black-cat","lion","tiger-face","tiger","leopard","horse-face","horse","unicorn","zebra","deer","bison","cow-face","ox","water-buffalo","cow","pig-face","pig","boar","pig-nose","ram","ewe","goat","camel","twohump-camel","llama","giraffe","elephant","mammoth","rhinoceros","hippopotamus","mouse-face","mouse","rat","hamster","rabbit-face","rabbit","chipmunk","beaver","hedgehog","bat","bear","polar-bear","koala","panda","sloth","otter","skunk","kangaroo","badger","paw-prints","turkey","chicken","rooster","hatching-chick","baby-chick","frontfacing-baby-chick","bird","penguin","dove","eagle","duck","swan","owl","dodo","feather","flamingo","peacock","parrot","frog","crocodile","turtle","lizard","snake","dragon-face","dragon","sauropod","trex","spouting-whale","whale","dolphin","seal","fish","tropical-fish","blowfish","shark","octopus","spiral-shell","snail","butterfly","bug","ant","honeybee","beetle","lady-beetle","cricket","cockroach","spider","spider-web","scorpion","mosquito","fly","worm","microbe","bouquet","cherry-blossom","white-flower","rosette","rose","wilted-flower","hibiscus","sunflower","blossom","tulip","seedling","potted-plant","evergreen-tree","deciduous-tree","palm-tree","cactus","sheaf-of-rice","herb","shamrock","four-leaf-clover","maple-leaf","fallen-leaf","leaf-fluttering-in-wind"]},{"id":"food_&_drink","name":"Food & Drink","emojis":["grapes","melon","watermelon","tangerine","lemon","banana","pineapple","mango","red-apple","green-apple","pear","peach","cherries","strawberry","blueberries","kiwi-fruit","tomato","olive","coconut","avocado","eggplant","potato","carrot","ear-of-corn","hot-pepper","bell-pepper","cucumber","leafy-green","broccoli","garlic","onion","mushroom","peanuts","chestnut","bread","croissant","baguette-bread","flatbread","pretzel","bagel","pancakes","waffle","cheese-wedge","meat-on-bone","poultry-leg","cut-of-meat","bacon","hamburger","french-fries","pizza","hot-dog","sandwich","taco","burrito","tamale","stuffed-flatbread","falafel","egg","cooking","shallow-pan-of-food","pot-of-food","fondue","bowl-with-spoon","green-salad","popcorn","butter","salt","canned-food","bento-box","rice-cracker","rice-ball","cooked-rice","curry-rice","steaming-bowl","spaghetti","roasted-sweet-potato","oden","sushi","fried-shrimp","fish-cake-with-swirl","moon-cake","dango","dumpling","fortune-cookie","takeout-box","crab","lobster","shrimp","squid","oyster","soft-ice-cream","shaved-ice","ice-cream","doughnut","cookie","birthday-cake","shortcake","cupcake","pie","chocolate-bar","candy","lollipop","custard","honey-pot","baby-bottle","glass-of-milk","hot-beverage","teapot","teacup-without-handle","sake","bottle-with-popping-cork","wine-glass","cocktail-glass","tropical-drink","beer-mug","clinking-beer-mugs","clinking-glasses","tumbler-glass","cup-with-straw","bubble-tea","beverage-box","mate","ice","chopsticks","fork-and-knife-with-plate","fork-and-knife","spoon","kitchen-knife","amphora"]},{"id":"travel_&_places","name":"Travel & Places","emojis":["globe-showing-europeafrica","globe-showing-americas","globe-showing-asiaaustralia","globe-with-meridians","world-map","map-of-japan","compass","snowcapped-mountain","mountain","volcano","mount-fuji","camping","beach-with-umbrella","desert","desert-island","national-park","stadium","classical-building","building-construction","brick","rock","wood","hut","houses","derelict-house","house","house-with-garden","office-building","japanese-post-office","post-office","hospital","bank","hotel","love-hotel","convenience-store","school","department-store","factory","japanese-castle","castle","wedding","tokyo-tower","statue-of-liberty","church","mosque","hindu-temple","synagogue","shinto-shrine","kaaba","fountain","tent","foggy","night-with-stars","cityscape","sunrise-over-mountains","sunrise","cityscape-at-dusk","sunset","bridge-at-night","hot-springs","carousel-horse","ferris-wheel","roller-coaster","barber-pole","circus-tent","locomotive","railway-car","highspeed-train","bullet-train","train","metro","light-rail","station","tram","monorail","mountain-railway","tram-car","bus","oncoming-bus","trolleybus","minibus","ambulance","fire-engine","police-car","oncoming-police-car","taxi","oncoming-taxi","automobile","oncoming-automobile","sport-utility-vehicle","pickup-truck","delivery-truck","articulated-lorry","tractor","racing-car","motorcycle","motor-scooter","manual-wheelchair","motorized-wheelchair","auto-rickshaw","bicycle","kick-scooter","skateboard","roller-skate","bus-stop","motorway","railway-track","oil-drum","fuel-pump","police-car-light","horizontal-traffic-light","vertical-traffic-light","stop-sign","construction","anchor","sailboat","canoe","speedboat","passenger-ship","ferry","motor-boat","ship","airplane","small-airplane","airplane-departure","airplane-arrival","parachute","seat","helicopter","suspension-railway","mountain-cableway","aerial-tramway","satellite","rocket","flying-saucer","bellhop-bell","luggage","hourglass-done","hourglass-not-done","watch","alarm-clock","stopwatch","timer-clock","mantelpiece-clock","twelve-oclock","twelvethirty","one-oclock","onethirty","two-oclock","twothirty","three-oclock","threethirty","four-oclock","fourthirty","five-oclock","fivethirty","six-oclock","sixthirty","seven-oclock","seventhirty","eight-oclock","eightthirty","nine-oclock","ninethirty","ten-oclock","tenthirty","eleven-oclock","eleventhirty","new-moon","waxing-crescent-moon","first-quarter-moon","waxing-gibbous-moon","full-moon","waning-gibbous-moon","last-quarter-moon","waning-crescent-moon","crescent-moon","new-moon-face","first-quarter-moon-face","last-quarter-moon-face","thermometer","sun","full-moon-face","sun-with-face","ringed-planet","star","glowing-star","shooting-star","milky-way","cloud","sun-behind-cloud","cloud-with-lightning-and-rain","sun-behind-small-cloud","sun-behind-large-cloud","sun-behind-rain-cloud","cloud-with-rain","cloud-with-snow","cloud-with-lightning","tornado","fog","wind-face","cyclone","rainbow","closed-umbrella","umbrella","umbrella-with-rain-drops","umbrella-on-ground","high-voltage","snowflake","snowman","snowman-without-snow","comet","fire","droplet","water-wave"]},{"id":"activities","name":"Activities","emojis":["jackolantern","christmas-tree","fireworks","sparkler","firecracker","sparkles","balloon","party-popper","confetti-ball","tanabata-tree","pine-decoration","japanese-dolls","carp-streamer","wind-chime","moon-viewing-ceremony","red-envelope","ribbon","wrapped-gift","reminder-ribbon","admission-tickets","ticket","military-medal","trophy","sports-medal","1st-place-medal","2nd-place-medal","3rd-place-medal","soccer-ball","baseball","softball","basketball","volleyball","american-football","rugby-football","tennis","flying-disc","bowling","cricket-game","field-hockey","ice-hockey","lacrosse","ping-pong","badminton","boxing-glove","martial-arts-uniform","goal-net","flag-in-hole","ice-skate","fishing-pole","diving-mask","running-shirt","skis","sled","curling-stone","bullseye","yoyo","kite","pool-8-ball","crystal-ball","magic-wand","nazar-amulet","video-game","joystick","slot-machine","game-die","puzzle-piece","teddy-bear","piata","nesting-dolls","spade-suit","heart-suit","diamond-suit","club-suit","chess-pawn","joker","mahjong-red-dragon","flower-playing-cards","performing-arts","framed-picture","artist-palette","thread","sewing-needle","yarn","knot"]},{"id":"objects","name":"Objects","emojis":["glasses","sunglasses","goggles","lab-coat","safety-vest","necktie","tshirt","jeans","scarf","gloves","coat","socks","dress","kimono","sari","onepiece-swimsuit","briefs","shorts","bikini","womans-clothes","purse","handbag","clutch-bag","shopping-bags","backpack","thong-sandal","mans-shoe","running-shoe","hiking-boot","flat-shoe","highheeled-shoe","womans-sandal","ballet-shoes","womans-boot","crown","womans-hat","top-hat","graduation-cap","billed-cap","military-helmet","rescue-workers-helmet","prayer-beads","lipstick","ring","gem-stone","muted-speaker","speaker-low-volume","speaker-medium-volume","speaker-high-volume","loudspeaker","megaphone","postal-horn","bell","bell-with-slash","musical-score","musical-note","musical-notes","studio-microphone","level-slider","control-knobs","microphone","headphone","radio","saxophone","accordion","guitar","musical-keyboard","trumpet","violin","banjo","drum","long-drum","mobile-phone","mobile-phone-with-arrow","telephone","telephone-receiver","pager","fax-machine","battery","electric-plug","laptop","desktop-computer","printer","keyboard","computer-mouse","trackball","computer-disk","floppy-disk","optical-disk","dvd","abacus","movie-camera","film-frames","film-projector","clapper-board","television","camera","camera-with-flash","video-camera","videocassette","magnifying-glass-tilted-left","magnifying-glass-tilted-right","candle","light-bulb","flashlight","red-paper-lantern","diya-lamp","notebook-with-decorative-cover","closed-book","open-book","green-book","blue-book","orange-book","books","notebook","ledger","page-with-curl","scroll","page-facing-up","newspaper","rolledup-newspaper","bookmark-tabs","bookmark","label","money-bag","coin","yen-banknote","dollar-banknote","euro-banknote","pound-banknote","money-with-wings","credit-card","receipt","chart-increasing-with-yen","envelope","email","incoming-envelope","envelope-with-arrow","outbox-tray","inbox-tray","package","closed-mailbox-with-raised-flag","closed-mailbox-with-lowered-flag","open-mailbox-with-raised-flag","open-mailbox-with-lowered-flag","postbox","ballot-box-with-ballot","pencil","black-nib","fountain-pen","pen","paintbrush","crayon","memo","briefcase","file-folder","open-file-folder","card-index-dividers","calendar","tearoff-calendar","spiral-notepad","spiral-calendar","card-index","chart-increasing","chart-decreasing","bar-chart","clipboard","pushpin","round-pushpin","paperclip","linked-paperclips","straight-ruler","triangular-ruler","scissors","card-file-box","file-cabinet","wastebasket","locked","unlocked","locked-with-pen","locked-with-key","key","old-key","hammer","axe","pick","hammer-and-pick","hammer-and-wrench","dagger","crossed-swords","water-pistol","boomerang","bow-and-arrow","shield","carpentry-saw","wrench","screwdriver","nut-and-bolt","gear","clamp","balance-scale","white-cane","link","chains","hook","toolbox","magnet","ladder","alembic","test-tube","petri-dish","dna","microscope","telescope","satellite-antenna","syringe","drop-of-blood","pill","adhesive-bandage","stethoscope","door","elevator","mirror","window","bed","couch-and-lamp","chair","toilet","plunger","shower","bathtub","mouse-trap","razor","lotion-bottle","safety-pin","broom","basket","roll-of-paper","bucket","soap","toothbrush","sponge","fire-extinguisher","shopping-cart","cigarette","coffin","headstone","funeral-urn","moai","placard"]},{"id":"symbols","name":"Symbols","emojis":["atm-sign","litter-in-bin-sign","potable-water","wheelchair-symbol","mens-room","womens-room","restroom","baby-symbol","water-closet","passport-control","customs","baggage-claim","left-luggage","warning","children-crossing","no-entry","prohibited","no-bicycles","no-smoking","no-littering","nonpotable-water","no-pedestrians","no-mobile-phones","no-one-under-eighteen","radioactive","biohazard","up-arrow","upright-arrow","right-arrow","downright-arrow","down-arrow","downleft-arrow","left-arrow","upleft-arrow","updown-arrow","leftright-arrow","right-arrow-curving-left","left-arrow-curving-right","right-arrow-curving-up","right-arrow-curving-down","clockwise-vertical-arrows","counterclockwise-arrows-button","back-arrow","end-arrow","on-arrow","soon-arrow","top-arrow","place-of-worship","atom-symbol","om","star-of-david","wheel-of-dharma","yin-yang","latin-cross","orthodox-cross","star-and-crescent","peace-symbol","menorah","dotted-sixpointed-star","aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces","ophiuchus","shuffle-tracks-button","repeat-button","repeat-single-button","play-button","fastforward-button","next-track-button","play-or-pause-button","reverse-button","fast-reverse-button","last-track-button","upwards-button","fast-up-button","downwards-button","fast-down-button","pause-button","stop-button","record-button","eject-button","cinema","dim-button","bright-button","antenna-bars","vibration-mode","mobile-phone-off","female-sign","male-sign","transgender-symbol","multiply","plus","minus","divide","infinity","double-exclamation-mark","exclamation-question-mark","red-question-mark","white-question-mark","white-exclamation-mark","red-exclamation-mark","wavy-dash","currency-exchange","heavy-dollar-sign","medical-symbol","recycling-symbol","fleurdelis","trident-emblem","name-badge","japanese-symbol-for-beginner","hollow-red-circle","check-mark-button","check-box-with-check","check-mark","cross-mark","cross-mark-button","curly-loop","double-curly-loop","part-alternation-mark","eightspoked-asterisk","eightpointed-star","sparkle","copyright","registered","trade-mark","keycap","keycap","keycap-0","keycap-1","keycap-2","keycap-3","keycap-4","keycap-5","keycap-6","keycap-7","keycap-8","keycap-9","keycap-10","input-latin-uppercase","input-latin-lowercase","input-numbers","input-symbols","input-latin-letters","a-button-blood-type","ab-button-blood-type","b-button-blood-type","cl-button","cool-button","free-button","information","id-button","circled-m","new-button","ng-button","o-button-blood-type","ok-button","p-button","sos-button","up-button","vs-button","japanese-here-button","japanese-service-charge-button","japanese-monthly-amount-button","japanese-not-free-of-charge-button","japanese-reserved-button","japanese-bargain-button","japanese-discount-button","japanese-free-of-charge-button","japanese-prohibited-button","japanese-acceptable-button","japanese-application-button","japanese-passing-grade-button","japanese-vacancy-button","japanese-congratulations-button","japanese-secret-button","japanese-open-for-business-button","japanese-no-vacancy-button","red-circle","orange-circle","yellow-circle","green-circle","blue-circle","purple-circle","brown-circle","black-circle","white-circle","red-square","orange-square","yellow-square","green-square","blue-square","purple-square","brown-square","black-large-square","white-large-square","black-medium-square","white-medium-square","black-mediumsmall-square","white-mediumsmall-square","black-small-square","white-small-square","large-orange-diamond","large-blue-diamond","small-orange-diamond","small-blue-diamond","red-triangle-pointed-up","red-triangle-pointed-down","diamond-with-a-dot","radio-button","white-square-button","black-square-button"]},{"id":"flags","name":"Flags","emojis":["chequered-flag","triangular-flag","crossed-flags","black-flag","white-flag","rainbow-flag","transgender-flag","pirate-flag","flag-ascension-island","flag-andorra","flag-united-arab-emirates","flag-afghanistan","flag-antigua--barbuda","flag-anguilla","flag-albania","flag-armenia","flag-angola","flag-antarctica","flag-argentina","flag-american-samoa","flag-austria","flag-australia","flag-aruba","flag-land-islands","flag-azerbaijan","flag-bosnia--herzegovina","flag-barbados","flag-bangladesh","flag-belgium","flag-burkina-faso","flag-bulgaria","flag-bahrain","flag-burundi","flag-benin","flag-st-barthlemy","flag-bermuda","flag-brunei","flag-bolivia","flag-caribbean-netherlands","flag-brazil","flag-bahamas","flag-bhutan","flag-bouvet-island","flag-botswana","flag-belarus","flag-belize","flag-canada","flag-cocos-keeling-islands","flag-congo--kinshasa","flag-central-african-republic","flag-congo--brazzaville","flag-switzerland","flag-cte-divoire","flag-cook-islands","flag-chile","flag-cameroon","flag-china","flag-colombia","flag-clipperton-island","flag-costa-rica","flag-cuba","flag-cape-verde","flag-curaao","flag-christmas-island","flag-cyprus","flag-czechia","flag-germany","flag-diego-garcia","flag-djibouti","flag-denmark","flag-dominica","flag-dominican-republic","flag-algeria","flag-ceuta--melilla","flag-ecuador","flag-estonia","flag-egypt","flag-western-sahara","flag-eritrea","flag-spain","flag-ethiopia","flag-european-union","flag-finland","flag-fiji","flag-falkland-islands","flag-micronesia","flag-faroe-islands","flag-france","flag-gabon","flag-united-kingdom","flag-grenada","flag-georgia","flag-french-guiana","flag-guernsey","flag-ghana","flag-gibraltar","flag-greenland","flag-gambia","flag-guinea","flag-guadeloupe","flag-equatorial-guinea","flag-greece","flag-south-georgia--south-sandwich-islands","flag-guatemala","flag-guam","flag-guineabissau","flag-guyana","flag-hong-kong-sar-china","flag-heard--mcdonald-islands","flag-honduras","flag-croatia","flag-haiti","flag-hungary","flag-canary-islands","flag-indonesia","flag-ireland","flag-israel","flag-isle-of-man","flag-india","flag-british-indian-ocean-territory","flag-iraq","flag-iran","flag-iceland","flag-italy","flag-jersey","flag-jamaica","flag-jordan","flag-japan","flag-kenya","flag-kyrgyzstan","flag-cambodia","flag-kiribati","flag-comoros","flag-st-kitts--nevis","flag-north-korea","flag-south-korea","flag-kuwait","flag-cayman-islands","flag-kazakhstan","flag-laos","flag-lebanon","flag-st-lucia","flag-liechtenstein","flag-sri-lanka","flag-liberia","flag-lesotho","flag-lithuania","flag-luxembourg","flag-latvia","flag-libya","flag-morocco","flag-monaco","flag-moldova","flag-montenegro","flag-st-martin","flag-madagascar","flag-marshall-islands","flag-north-macedonia","flag-mali","flag-myanmar-burma","flag-mongolia","flag-macao-sar-china","flag-northern-mariana-islands","flag-martinique","flag-mauritania","flag-montserrat","flag-malta","flag-mauritius","flag-maldives","flag-malawi","flag-mexico","flag-malaysia","flag-mozambique","flag-namibia","flag-new-caledonia","flag-niger","flag-norfolk-island","flag-nigeria","flag-nicaragua","flag-netherlands","flag-norway","flag-nepal","flag-nauru","flag-niue","flag-new-zealand","flag-oman","flag-panama","flag-peru","flag-french-polynesia","flag-papua-new-guinea","flag-philippines","flag-pakistan","flag-poland","flag-st-pierre--miquelon","flag-pitcairn-islands","flag-puerto-rico","flag-palestinian-territories","flag-portugal","flag-palau","flag-paraguay","flag-qatar","flag-runion","flag-romania","flag-serbia","flag-russia","flag-rwanda","flag-saudi-arabia","flag-solomon-islands","flag-seychelles","flag-sudan","flag-sweden","flag-singapore","flag-st-helena","flag-slovenia","flag-svalbard--jan-mayen","flag-slovakia","flag-sierra-leone","flag-san-marino","flag-senegal","flag-somalia","flag-suriname","flag-south-sudan","flag-so-tom--prncipe","flag-el-salvador","flag-sint-maarten","flag-syria","flag-eswatini","flag-tristan-da-cunha","flag-turks--caicos-islands","flag-chad","flag-french-southern-territories","flag-togo","flag-thailand","flag-tajikistan","flag-tokelau","flag-timorleste","flag-turkmenistan","flag-tunisia","flag-tonga","flag-turkey","flag-trinidad--tobago","flag-tuvalu","flag-taiwan","flag-tanzania","flag-ukraine","flag-uganda","flag-us-outlying-islands","flag-united-nations","flag-united-states","flag-uruguay","flag-uzbekistan","flag-vatican-city","flag-st-vincent--grenadines","flag-venezuela","flag-british-virgin-islands","flag-us-virgin-islands","flag-vietnam","flag-vanuatu","flag-wallis--futuna","flag-samoa","flag-kosovo","flag-yemen","flag-mayotte","flag-south-africa","flag-zambia","flag-zimbabwe","flag-england","flag-scotland","flag-wales"]}],"emojis":{"grinning-face":{"a":"Grinning Face","b":"1F600","j":["face","grin","smile","happy","joy",":D"]},"grinning-face-with-big-eyes":{"a":"Grinning Face with Big Eyes","b":"1F603","j":["face","mouth","open","smile","happy","joy","haha",":D",":)","funny"]},"grinning-face-with-smiling-eyes":{"a":"Grinning Face with Smiling Eyes","b":"1F604","j":["eye","face","mouth","open","smile","happy","joy","funny","haha","laugh","like",":D",":)"]},"beaming-face-with-smiling-eyes":{"a":"Beaming Face with Smiling Eyes","b":"1F601","j":["eye","face","grin","smile","happy","joy","kawaii"]},"grinning-squinting-face":{"a":"Grinning Squinting Face","b":"1F606","j":["face","laugh","mouth","satisfied","smile","happy","joy","lol","haha","glad","XD"]},"grinning-face-with-sweat":{"a":"Grinning Face with Sweat","b":"1F605","j":["cold","face","open","smile","sweat","hot","happy","laugh","relief"]},"rolling-on-the-floor-laughing":{"a":"Rolling on the Floor Laughing","b":"1F923","j":["face","floor","laugh","rofl","rolling","rotfl","laughing","lol","haha"]},"face-with-tears-of-joy":{"a":"Face with Tears of Joy","b":"1F602","j":["face","joy","laugh","tear","cry","tears","weep","happy","happytears","haha"]},"slightly-smiling-face":{"a":"Slightly Smiling Face","b":"1F642","j":["face","smile"]},"upsidedown-face":{"a":"Upside-Down Face","b":"1F643","j":["face","upside-down","upside_down_face","flipped","silly","smile"]},"winking-face":{"a":"Winking Face","b":"1F609","j":["face","wink","happy","mischievous","secret",";)","smile","eye"]},"smiling-face-with-smiling-eyes":{"a":"Smiling Face with Smiling Eyes","b":"1F60A","j":["blush","eye","face","smile","happy","flushed","crush","embarrassed","shy","joy"]},"smiling-face-with-halo":{"a":"Smiling Face with Halo","b":"1F607","j":["angel","face","fantasy","halo","innocent","heaven"]},"smiling-face-with-hearts":{"a":"Smiling Face with Hearts","b":"1F970","j":["adore","crush","hearts","in love","face","love","like","affection","valentines","infatuation"]},"smiling-face-with-hearteyes":{"a":"Smiling Face with Heart-Eyes","b":"1F60D","j":["eye","face","love","smile","smiling face with heart-eyes","smiling_face_with_heart_eyes","like","affection","valentines","infatuation","crush","heart"]},"starstruck":{"a":"Star-Struck","b":"1F929","j":["eyes","face","grinning","star","star-struck","starry-eyed","star_struck","smile","starry"]},"face-blowing-a-kiss":{"a":"Face Blowing a Kiss","b":"1F618","j":["face","kiss","love","like","affection","valentines","infatuation"]},"kissing-face":{"a":"Kissing Face","b":"1F617","j":["face","kiss","love","like","3","valentines","infatuation"]},"smiling-face":{"a":"Smiling Face","b":"263A","j":["face","outlined","relaxed","smile","blush","massage","happiness"]},"kissing-face-with-closed-eyes":{"a":"Kissing Face with Closed Eyes","b":"1F61A","j":["closed","eye","face","kiss","love","like","affection","valentines","infatuation"]},"kissing-face-with-smiling-eyes":{"a":"Kissing Face with Smiling Eyes","b":"1F619","j":["eye","face","kiss","smile","affection","valentines","infatuation"]},"smiling-face-with-tear":{"a":"Smiling Face with Tear","b":"1F972","j":["grateful","proud","relieved","smiling","tear","touched","sad","cry","pretend"]},"face-savoring-food":{"a":"Face Savoring Food","b":"1F60B","j":["delicious","face","savouring","smile","yum","happy","joy","tongue","silly","yummy","nom"]},"face-with-tongue":{"a":"Face with Tongue","b":"1F61B","j":["face","tongue","prank","childish","playful","mischievous","smile"]},"winking-face-with-tongue":{"a":"Winking Face with Tongue","b":"1F61C","j":["eye","face","joke","tongue","wink","prank","childish","playful","mischievous","smile"]},"zany-face":{"a":"Zany Face","b":"1F92A","j":["eye","goofy","large","small","face","crazy"]},"squinting-face-with-tongue":{"a":"Squinting Face with Tongue","b":"1F61D","j":["eye","face","horrible","taste","tongue","prank","playful","mischievous","smile"]},"moneymouth-face":{"a":"Money-Mouth Face","b":"1F911","j":["face","money","money-mouth face","mouth","money_mouth_face","rich","dollar"]},"hugging-face":{"a":"Hugging Face","b":"1F917","j":["face","hug","hugging","smile"]},"face-with-hand-over-mouth":{"a":"Face with Hand over Mouth","b":"1F92D","j":["whoops","shock","sudden realization","surprise","face"]},"shushing-face":{"a":"Shushing Face","b":"1F92B","j":["quiet","shush","face","shhh"]},"thinking-face":{"a":"Thinking Face","b":"1F914","j":["face","thinking","hmmm","think","consider"]},"zippermouth-face":{"a":"Zipper-Mouth Face","b":"1F910","j":["face","mouth","zipper","zipper-mouth face","zipper_mouth_face","sealed","secret"]},"face-with-raised-eyebrow":{"a":"Face with Raised Eyebrow","b":"1F928","j":["distrust","skeptic","disapproval","disbelief","mild surprise","scepticism","face","surprise"]},"neutral-face":{"a":"Neutral Face","b":"1F610","j":["deadpan","face","meh","neutral","indifference",":|"]},"expressionless-face":{"a":"Expressionless Face","b":"1F611","j":["expressionless","face","inexpressive","meh","unexpressive","indifferent","-_-","deadpan"]},"face-without-mouth":{"a":"Face Without Mouth","b":"1F636","j":["face","mouth","quiet","silent","hellokitty"]},"face-in-clouds":{"a":"⊛ Face in Clouds","b":"1F636-200D-1F32B-FE0F","j":["absentminded","face in clouds","face in the fog","head in clouds"]},"smirking-face":{"a":"Smirking Face","b":"1F60F","j":["face","smirk","smile","mean","prank","smug","sarcasm"]},"unamused-face":{"a":"Unamused Face","b":"1F612","j":["face","unamused","unhappy","indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"]},"face-with-rolling-eyes":{"a":"Face with Rolling Eyes","b":"1F644","j":["eyeroll","eyes","face","rolling","frustrated"]},"grimacing-face":{"a":"Grimacing Face","b":"1F62C","j":["face","grimace","teeth"]},"face-exhaling":{"a":"⊛ Face Exhaling","b":"1F62E-200D-1F4A8","j":["exhale","face exhaling","gasp","groan","relief","whisper","whistle"]},"lying-face":{"a":"Lying Face","b":"1F925","j":["face","lie","pinocchio"]},"relieved-face":{"a":"Relieved Face","b":"1F60C","j":["face","relieved","relaxed","phew","massage","happiness"]},"pensive-face":{"a":"Pensive Face","b":"1F614","j":["dejected","face","pensive","sad","depressed","upset"]},"sleepy-face":{"a":"Sleepy Face","b":"1F62A","j":["face","sleep","tired","rest","nap"]},"drooling-face":{"a":"Drooling Face","b":"1F924","j":["drooling","face"]},"sleeping-face":{"a":"Sleeping Face","b":"1F634","j":["face","sleep","zzz","tired","sleepy","night"]},"face-with-medical-mask":{"a":"Face with Medical Mask","b":"1F637","j":["cold","doctor","face","mask","sick","ill","disease"]},"face-with-thermometer":{"a":"Face with Thermometer","b":"1F912","j":["face","ill","sick","thermometer","temperature","cold","fever"]},"face-with-headbandage":{"a":"Face with Head-Bandage","b":"1F915","j":["bandage","face","face with head-bandage","hurt","injury","face_with_head_bandage","injured","clumsy"]},"nauseated-face":{"a":"Nauseated Face","b":"1F922","j":["face","nauseated","vomit","gross","green","sick","throw up","ill"]},"face-vomiting":{"a":"Face Vomiting","b":"1F92E","j":["puke","sick","vomit","face"]},"sneezing-face":{"a":"Sneezing Face","b":"1F927","j":["face","gesundheit","sneeze","sick","allergy"]},"hot-face":{"a":"Hot Face","b":"1F975","j":["feverish","heat stroke","hot","red-faced","sweating","face","heat","red"]},"cold-face":{"a":"Cold Face","b":"1F976","j":["blue-faced","cold","freezing","frostbite","icicles","face","blue","frozen"]},"woozy-face":{"a":"Woozy Face","b":"1F974","j":["dizzy","intoxicated","tipsy","uneven eyes","wavy mouth","face","wavy"]},"knockedout-face":{"a":"Knocked-out Face","b":"1F635","j":["dead","face","knocked out","knocked-out face","dizzy_face","spent","unconscious","xox","dizzy"]},"face-with-spiral-eyes":{"a":"⊛ Face with Spiral Eyes","b":"1F635-200D-1F4AB","j":["dizzy","face with spiral eyes","hypnotized","spiral","trouble","whoa"]},"exploding-head":{"a":"Exploding Head","b":"1F92F","j":["mind blown","shocked","face","mind","blown"]},"cowboy-hat-face":{"a":"Cowboy Hat Face","b":"1F920","j":["cowboy","cowgirl","face","hat"]},"partying-face":{"a":"Partying Face","b":"1F973","j":["celebration","hat","horn","party","face","woohoo"]},"disguised-face":{"a":"Disguised Face","b":"1F978","j":["disguise","face","glasses","incognito","nose","pretent","brows","moustache"]},"smiling-face-with-sunglasses":{"a":"Smiling Face with Sunglasses","b":"1F60E","j":["bright","cool","face","sun","sunglasses","smile","summer","beach","sunglass"]},"nerd-face":{"a":"Nerd Face","b":"1F913","j":["face","geek","nerd","nerdy","dork"]},"face-with-monocle":{"a":"Face with Monocle","b":"1F9D0","j":["stuffy","wealthy","face"]},"confused-face":{"a":"Confused Face","b":"1F615","j":["confused","face","meh","indifference","huh","weird","hmmm",":/"]},"worried-face":{"a":"Worried Face","b":"1F61F","j":["face","worried","concern","nervous",":("]},"slightly-frowning-face":{"a":"Slightly Frowning Face","b":"1F641","j":["face","frown","frowning","disappointed","sad","upset"]},"frowning-face":{"a":"Frowning Face","b":"2639","j":["face","frown","sad","upset"]},"face-with-open-mouth":{"a":"Face with Open Mouth","b":"1F62E","j":["face","mouth","open","sympathy","surprise","impressed","wow","whoa",":O"]},"hushed-face":{"a":"Hushed Face","b":"1F62F","j":["face","hushed","stunned","surprised","woo","shh"]},"astonished-face":{"a":"Astonished Face","b":"1F632","j":["astonished","face","shocked","totally","xox","surprised","poisoned"]},"flushed-face":{"a":"Flushed Face","b":"1F633","j":["dazed","face","flushed","blush","shy","flattered"]},"pleading-face":{"a":"Pleading Face","b":"1F97A","j":["begging","mercy","puppy eyes","face"]},"frowning-face-with-open-mouth":{"a":"Frowning Face with Open Mouth","b":"1F626","j":["face","frown","mouth","open","aw","what"]},"anguished-face":{"a":"Anguished Face","b":"1F627","j":["anguished","face","stunned","nervous"]},"fearful-face":{"a":"Fearful Face","b":"1F628","j":["face","fear","fearful","scared","terrified","nervous","oops","huh"]},"anxious-face-with-sweat":{"a":"Anxious Face with Sweat","b":"1F630","j":["blue","cold","face","rushed","sweat","nervous"]},"sad-but-relieved-face":{"a":"Sad but Relieved Face","b":"1F625","j":["disappointed","face","relieved","whew","phew","sweat","nervous"]},"crying-face":{"a":"Crying Face","b":"1F622","j":["cry","face","sad","tear","tears","depressed","upset",":'("]},"loudly-crying-face":{"a":"Loudly Crying Face","b":"1F62D","j":["cry","face","sad","sob","tear","tears","upset","depressed"]},"face-screaming-in-fear":{"a":"Face Screaming in Fear","b":"1F631","j":["face","fear","munch","scared","scream","omg"]},"confounded-face":{"a":"Confounded Face","b":"1F616","j":["confounded","face","confused","sick","unwell","oops",":S"]},"persevering-face":{"a":"Persevering Face","b":"1F623","j":["face","persevere","sick","no","upset","oops"]},"disappointed-face":{"a":"Disappointed Face","b":"1F61E","j":["disappointed","face","sad","upset","depressed",":("]},"downcast-face-with-sweat":{"a":"Downcast Face with Sweat","b":"1F613","j":["cold","face","sweat","hot","sad","tired","exercise"]},"weary-face":{"a":"Weary Face","b":"1F629","j":["face","tired","weary","sleepy","sad","frustrated","upset"]},"tired-face":{"a":"Tired Face","b":"1F62B","j":["face","tired","sick","whine","upset","frustrated"]},"yawning-face":{"a":"Yawning Face","b":"1F971","j":["bored","tired","yawn","sleepy",""]},"face-with-steam-from-nose":{"a":"Face with Steam From Nose","b":"1F624","j":["face","triumph","won","gas","phew","proud","pride"]},"pouting-face":{"a":"Pouting Face","b":"1F621","j":["angry","face","mad","pouting","rage","red","hate","despise"]},"angry-face":{"a":"Angry Face","b":"1F620","j":["anger","angry","face","mad","annoyed","frustrated"]},"face-with-symbols-on-mouth":{"a":"Face with Symbols on Mouth","b":"1F92C","j":["swearing","cursing","face","cussing","profanity","expletive"]},"smiling-face-with-horns":{"a":"Smiling Face with Horns","b":"1F608","j":["face","fairy tale","fantasy","horns","smile","devil"]},"angry-face-with-horns":{"a":"Angry Face with Horns","b":"1F47F","j":["demon","devil","face","fantasy","imp","angry","horns"]},"skull":{"a":"Skull","b":"1F480","j":["death","face","fairy tale","monster","dead","skeleton","creepy"]},"skull-and-crossbones":{"a":"Skull and Crossbones","b":"2620","j":["crossbones","death","face","monster","skull","poison","danger","deadly","scary","pirate","evil"]},"pile-of-poo":{"a":"Pile of Poo","b":"1F4A9","j":["dung","face","monster","poo","poop","hankey","shitface","fail","turd","shit"]},"clown-face":{"a":"Clown Face","b":"1F921","j":["clown","face"]},"ogre":{"a":"Ogre","b":"1F479","j":["creature","face","fairy tale","fantasy","monster","troll","red","mask","halloween","scary","creepy","devil","demon","japanese"]},"goblin":{"a":"Goblin","b":"1F47A","j":["creature","face","fairy tale","fantasy","monster","red","evil","mask","scary","creepy","japanese"]},"ghost":{"a":"Ghost","b":"1F47B","j":["creature","face","fairy tale","fantasy","monster","halloween","spooky","scary"]},"alien":{"a":"Alien","b":"1F47D","j":["creature","extraterrestrial","face","fantasy","ufo","UFO","paul","weird","outer_space"]},"alien-monster":{"a":"Alien Monster","b":"1F47E","j":["alien","creature","extraterrestrial","face","monster","ufo","game","arcade","play"]},"robot":{"a":"Robot","b":"1F916","j":["face","monster","computer","machine","bot"]},"grinning-cat":{"a":"Grinning Cat","b":"1F63A","j":["cat","face","grinning","mouth","open","smile","animal","cats","happy"]},"grinning-cat-with-smiling-eyes":{"a":"Grinning Cat with Smiling Eyes","b":"1F638","j":["cat","eye","face","grin","smile","animal","cats"]},"cat-with-tears-of-joy":{"a":"Cat with Tears of Joy","b":"1F639","j":["cat","face","joy","tear","animal","cats","haha","happy","tears"]},"smiling-cat-with-hearteyes":{"a":"Smiling Cat with Heart-Eyes","b":"1F63B","j":["cat","eye","face","heart","love","smile","smiling cat with heart-eyes","smiling_cat_with_heart_eyes","animal","like","affection","cats","valentines"]},"cat-with-wry-smile":{"a":"Cat with Wry Smile","b":"1F63C","j":["cat","face","ironic","smile","wry","animal","cats","smirk"]},"kissing-cat":{"a":"Kissing Cat","b":"1F63D","j":["cat","eye","face","kiss","animal","cats"]},"weary-cat":{"a":"Weary Cat","b":"1F640","j":["cat","face","oh","surprised","weary","animal","cats","munch","scared","scream"]},"crying-cat":{"a":"Crying Cat","b":"1F63F","j":["cat","cry","face","sad","tear","animal","tears","weep","cats","upset"]},"pouting-cat":{"a":"Pouting Cat","b":"1F63E","j":["cat","face","pouting","animal","cats"]},"seenoevil-monkey":{"a":"See-No-Evil Monkey","b":"1F648","j":["evil","face","forbidden","monkey","see","see-no-evil monkey","see_no_evil_monkey","animal","nature","haha"]},"hearnoevil-monkey":{"a":"Hear-No-Evil Monkey","b":"1F649","j":["evil","face","forbidden","hear","hear-no-evil monkey","monkey","hear_no_evil_monkey","animal","nature"]},"speaknoevil-monkey":{"a":"Speak-No-Evil Monkey","b":"1F64A","j":["evil","face","forbidden","monkey","speak","speak-no-evil monkey","speak_no_evil_monkey","animal","nature","omg"]},"kiss-mark":{"a":"Kiss Mark","b":"1F48B","j":["kiss","lips","face","love","like","affection","valentines"]},"love-letter":{"a":"Love Letter","b":"1F48C","j":["heart","letter","love","mail","email","like","affection","envelope","valentines"]},"heart-with-arrow":{"a":"Heart with Arrow","b":"1F498","j":["arrow","cupid","love","like","heart","affection","valentines"]},"heart-with-ribbon":{"a":"Heart with Ribbon","b":"1F49D","j":["ribbon","valentine","love","valentines"]},"sparkling-heart":{"a":"Sparkling Heart","b":"1F496","j":["excited","sparkle","love","like","affection","valentines"]},"growing-heart":{"a":"Growing Heart","b":"1F497","j":["excited","growing","nervous","pulse","like","love","affection","valentines","pink"]},"beating-heart":{"a":"Beating Heart","b":"1F493","j":["beating","heartbeat","pulsating","love","like","affection","valentines","pink","heart"]},"revolving-hearts":{"a":"Revolving Hearts","b":"1F49E","j":["revolving","love","like","affection","valentines"]},"two-hearts":{"a":"Two Hearts","b":"1F495","j":["love","like","affection","valentines","heart"]},"heart-decoration":{"a":"Heart Decoration","b":"1F49F","j":["heart","purple-square","love","like"]},"heart-exclamation":{"a":"Heart Exclamation","b":"2763","j":["exclamation","mark","punctuation","decoration","love"]},"broken-heart":{"a":"Broken Heart","b":"1F494","j":["break","broken","sad","sorry","heart","heartbreak"]},"heart-on-fire":{"a":"⊛ Heart on Fire","b":"2764-FE0F-200D-1F525","j":["burn","heart","heart on fire","love","lust","sacred heart"]},"mending-heart":{"a":"⊛ Mending Heart","b":"2764-FE0F-200D-1FA79","j":["healthier","improving","mending","mending heart","recovering","recuperating","well"]},"red-heart":{"a":"Red Heart","b":"2764","j":["heart","love","like","valentines"]},"orange-heart":{"a":"Orange Heart","b":"1F9E1","j":["orange","love","like","affection","valentines"]},"yellow-heart":{"a":"Yellow Heart","b":"1F49B","j":["yellow","love","like","affection","valentines"]},"green-heart":{"a":"Green Heart","b":"1F49A","j":["green","love","like","affection","valentines"]},"blue-heart":{"a":"Blue Heart","b":"1F499","j":["blue","love","like","affection","valentines"]},"purple-heart":{"a":"Purple Heart","b":"1F49C","j":["purple","love","like","affection","valentines"]},"brown-heart":{"a":"Brown Heart","b":"1F90E","j":["brown","heart","coffee"]},"black-heart":{"a":"Black Heart","b":"1F5A4","j":["black","evil","wicked"]},"white-heart":{"a":"White Heart","b":"1F90D","j":["heart","white","pure"]},"hundred-points":{"a":"Hundred Points","b":"1F4AF","j":["100","full","hundred","score","perfect","numbers","century","exam","quiz","test","pass"]},"anger-symbol":{"a":"Anger Symbol","b":"1F4A2","j":["angry","comic","mad"]},"collision":{"a":"Collision","b":"1F4A5","j":["boom","comic","bomb","explode","explosion","blown"]},"dizzy":{"a":"Dizzy","b":"1F4AB","j":["comic","star","sparkle","shoot","magic"]},"sweat-droplets":{"a":"Sweat Droplets","b":"1F4A6","j":["comic","splashing","sweat","water","drip","oops"]},"dashing-away":{"a":"Dashing Away","b":"1F4A8","j":["comic","dash","running","wind","air","fast","shoo","fart","smoke","puff"]},"hole":{"a":"Hole","b":"1F573","j":["embarrassing"]},"bomb":{"a":"Bomb","b":"1F4A3","j":["comic","boom","explode","explosion","terrorism"]},"speech-balloon":{"a":"Speech Balloon","b":"1F4AC","j":["balloon","bubble","comic","dialog","speech","words","message","talk","chatting"]},"eye-in-speech-bubble":{"a":"Eye in Speech Bubble","b":"1F441-FE0F-200D-1F5E8-FE0F","j":["eye","speech bubble","witness","info"]},"left-speech-bubble":{"a":"Left Speech Bubble","b":"1F5E8","j":["dialog","speech","words","message","talk","chatting"]},"right-anger-bubble":{"a":"Right Anger Bubble","b":"1F5EF","j":["angry","balloon","bubble","mad","caption","speech","thinking"]},"thought-balloon":{"a":"Thought Balloon","b":"1F4AD","j":["balloon","bubble","comic","thought","cloud","speech","thinking","dream"]},"zzz":{"a":"Zzz","b":"1F4A4","j":["comic","sleep","sleepy","tired","dream"]},"waving-hand":{"a":"Waving Hand","b":"1F44B","j":["hand","wave","waving","hands","gesture","goodbye","solong","farewell","hello","hi","palm"]},"raised-back-of-hand":{"a":"Raised Back of Hand","b":"1F91A","j":["backhand","raised","fingers"]},"hand-with-fingers-splayed":{"a":"Hand with Fingers Splayed","b":"1F590","j":["finger","hand","splayed","fingers","palm"]},"raised-hand":{"a":"Raised Hand","b":"270B","j":["hand","high 5","high five","fingers","stop","highfive","palm","ban"]},"vulcan-salute":{"a":"Vulcan Salute","b":"1F596","j":["finger","hand","spock","vulcan","fingers","star trek"]},"ok-hand":{"a":"Ok Hand","b":"1F44C","j":["hand","OK","fingers","limbs","perfect","ok","okay"]},"pinched-fingers":{"a":"Pinched Fingers","b":"1F90C","j":["fingers","hand gesture","interrogation","pinched","sarcastic","size","tiny","small"]},"pinching-hand":{"a":"Pinching Hand","b":"1F90F","j":["small amount","tiny","small","size"]},"victory-hand":{"a":"Victory Hand","b":"270C","j":["hand","v","victory","fingers","ohyeah","peace","two"]},"crossed-fingers":{"a":"Crossed Fingers","b":"1F91E","j":["cross","finger","hand","luck","good","lucky"]},"loveyou-gesture":{"a":"Love-You Gesture","b":"1F91F","j":["hand","ILY","love-you gesture","love_you_gesture","fingers","gesture"]},"sign-of-the-horns":{"a":"Sign of the Horns","b":"1F918","j":["finger","hand","horns","rock-on","fingers","evil_eye","sign_of_horns","rock_on"]},"call-me-hand":{"a":"Call Me Hand","b":"1F919","j":["call","hand","hands","gesture"]},"backhand-index-pointing-left":{"a":"Backhand Index Pointing Left","b":"1F448","j":["backhand","finger","hand","index","point","direction","fingers","left"]},"backhand-index-pointing-right":{"a":"Backhand Index Pointing Right","b":"1F449","j":["backhand","finger","hand","index","point","fingers","direction","right"]},"backhand-index-pointing-up":{"a":"Backhand Index Pointing Up","b":"1F446","j":["backhand","finger","hand","point","up","fingers","direction"]},"middle-finger":{"a":"Middle Finger","b":"1F595","j":["finger","hand","fingers","rude","middle","flipping"]},"backhand-index-pointing-down":{"a":"Backhand Index Pointing Down","b":"1F447","j":["backhand","down","finger","hand","point","fingers","direction"]},"index-pointing-up":{"a":"Index Pointing Up","b":"261D","j":["finger","hand","index","point","up","fingers","direction"]},"thumbs-up":{"a":"Thumbs Up","b":"1F44D","j":["+1","hand","thumb","up","thumbsup","yes","awesome","good","agree","accept","cool","like"]},"thumbs-down":{"a":"Thumbs Down","b":"1F44E","j":["-1","down","hand","thumb","thumbsdown","no","dislike"]},"raised-fist":{"a":"Raised Fist","b":"270A","j":["clenched","fist","hand","punch","fingers","grasp"]},"oncoming-fist":{"a":"Oncoming Fist","b":"1F44A","j":["clenched","fist","hand","punch","angry","violence","hit","attack"]},"leftfacing-fist":{"a":"Left-Facing Fist","b":"1F91B","j":["fist","left-facing fist","leftwards","left_facing_fist","hand","fistbump"]},"rightfacing-fist":{"a":"Right-Facing Fist","b":"1F91C","j":["fist","right-facing fist","rightwards","right_facing_fist","hand","fistbump"]},"clapping-hands":{"a":"Clapping Hands","b":"1F44F","j":["clap","hand","hands","praise","applause","congrats","yay"]},"raising-hands":{"a":"Raising Hands","b":"1F64C","j":["celebration","gesture","hand","hooray","raised","yea","hands"]},"open-hands":{"a":"Open Hands","b":"1F450","j":["hand","open","fingers","butterfly","hands"]},"palms-up-together":{"a":"Palms Up Together","b":"1F932","j":["prayer","cupped hands","hands","gesture","cupped"]},"handshake":{"a":"Handshake","b":"1F91D","j":["agreement","hand","meeting","shake"]},"folded-hands":{"a":"Folded Hands","b":"1F64F","j":["ask","hand","high 5","high five","please","pray","thanks","hope","wish","namaste","highfive"]},"writing-hand":{"a":"Writing Hand","b":"270D","j":["hand","write","lower_left_ballpoint_pen","stationery","compose"]},"nail-polish":{"a":"Nail Polish","b":"1F485","j":["care","cosmetics","manicure","nail","polish","beauty","finger","fashion"]},"selfie":{"a":"Selfie","b":"1F933","j":["camera","phone"]},"flexed-biceps":{"a":"Flexed Biceps","b":"1F4AA","j":["biceps","comic","flex","muscle","arm","hand","summer","strong"]},"mechanical-arm":{"a":"Mechanical Arm","b":"1F9BE","j":["accessibility","prosthetic"]},"mechanical-leg":{"a":"Mechanical Leg","b":"1F9BF","j":["accessibility","prosthetic"]},"leg":{"a":"Leg","b":"1F9B5","j":["kick","limb"]},"foot":{"a":"Foot","b":"1F9B6","j":["kick","stomp"]},"ear":{"a":"Ear","b":"1F442","j":["body","face","hear","sound","listen"]},"ear-with-hearing-aid":{"a":"Ear with Hearing Aid","b":"1F9BB","j":["accessibility","hard of hearing"]},"nose":{"a":"Nose","b":"1F443","j":["body","smell","sniff"]},"brain":{"a":"Brain","b":"1F9E0","j":["intelligent","smart"]},"anatomical-heart":{"a":"Anatomical Heart","b":"1FAC0","j":["anatomical","cardiology","heart","organ","pulse","health","heartbeat"]},"lungs":{"a":"Lungs","b":"1FAC1","j":["breath","exhalation","inhalation","organ","respiration","breathe"]},"tooth":{"a":"Tooth","b":"1F9B7","j":["dentist","teeth"]},"bone":{"a":"Bone","b":"1F9B4","j":["skeleton"]},"eyes":{"a":"Eyes","b":"1F440","j":["eye","face","look","watch","stalk","peek","see"]},"eye":{"a":"Eye","b":"1F441","j":["body","face","look","see","watch","stare"]},"tongue":{"a":"Tongue","b":"1F445","j":["body","mouth","playful"]},"mouth":{"a":"Mouth","b":"1F444","j":["lips","kiss"]},"baby":{"a":"Baby","b":"1F476","j":["young","child","boy","girl","toddler"]},"child":{"a":"Child","b":"1F9D2","j":["gender-neutral","unspecified gender","young"]},"boy":{"a":"Boy","b":"1F466","j":["young","man","male","guy","teenager"]},"girl":{"a":"Girl","b":"1F467","j":["Virgo","young","zodiac","female","woman","teenager"]},"person":{"a":"Person","b":"1F9D1","j":["adult","gender-neutral","unspecified gender"]},"person-blond-hair":{"a":"Person: Blond Hair","b":"1F471","j":["blond","blond-haired person","hair","person: blond hair","hairstyle"]},"man":{"a":"Man","b":"1F468","j":["adult","mustache","father","dad","guy","classy","sir","moustache"]},"person-beard":{"a":"Person: Beard","b":"1F9D4","j":["beard","person","person: beard","bewhiskered","man_beard"]},"man-beard":{"a":"⊛ Man: Beard","b":"1F9D4-200D-2642-FE0F","j":["beard","man","man: beard"]},"woman-beard":{"a":"⊛ Woman: Beard","b":"1F9D4-200D-2640-FE0F","j":["beard","woman","woman: beard"]},"man-red-hair":{"a":"Man: Red Hair","b":"1F468-200D-1F9B0","j":["adult","man","red hair","hairstyle"]},"man-curly-hair":{"a":"Man: Curly Hair","b":"1F468-200D-1F9B1","j":["adult","curly hair","man","hairstyle"]},"man-white-hair":{"a":"Man: White Hair","b":"1F468-200D-1F9B3","j":["adult","man","white hair","old","elder"]},"man-bald":{"a":"Man: Bald","b":"1F468-200D-1F9B2","j":["adult","bald","man","hairless"]},"woman":{"a":"Woman","b":"1F469","j":["adult","female","girls","lady"]},"woman-red-hair":{"a":"Woman: Red Hair","b":"1F469-200D-1F9B0","j":["adult","red hair","woman","hairstyle"]},"person-red-hair":{"a":"Person: Red Hair","b":"1F9D1-200D-1F9B0","j":["adult","gender-neutral","person","red hair","unspecified gender","hairstyle"]},"woman-curly-hair":{"a":"Woman: Curly Hair","b":"1F469-200D-1F9B1","j":["adult","curly hair","woman","hairstyle"]},"person-curly-hair":{"a":"Person: Curly Hair","b":"1F9D1-200D-1F9B1","j":["adult","curly hair","gender-neutral","person","unspecified gender","hairstyle"]},"woman-white-hair":{"a":"Woman: White Hair","b":"1F469-200D-1F9B3","j":["adult","white hair","woman","old","elder"]},"person-white-hair":{"a":"Person: White Hair","b":"1F9D1-200D-1F9B3","j":["adult","gender-neutral","person","unspecified gender","white hair","elder","old"]},"woman-bald":{"a":"Woman: Bald","b":"1F469-200D-1F9B2","j":["adult","bald","woman","hairless"]},"person-bald":{"a":"Person: Bald","b":"1F9D1-200D-1F9B2","j":["adult","bald","gender-neutral","person","unspecified gender","hairless"]},"woman-blond-hair":{"a":"Woman: Blond Hair","b":"1F471-200D-2640-FE0F","j":["blond-haired woman","blonde","hair","woman","woman: blond hair","female","girl","person"]},"man-blond-hair":{"a":"Man: Blond Hair","b":"1F471-200D-2642-FE0F","j":["blond","blond-haired man","hair","man","man: blond hair","male","boy","blonde","guy","person"]},"older-person":{"a":"Older Person","b":"1F9D3","j":["adult","gender-neutral","old","unspecified gender","human","elder","senior"]},"old-man":{"a":"Old Man","b":"1F474","j":["adult","man","old","human","male","men","elder","senior"]},"old-woman":{"a":"Old Woman","b":"1F475","j":["adult","old","woman","human","female","women","lady","elder","senior"]},"person-frowning":{"a":"Person Frowning","b":"1F64D","j":["frown","gesture","worried"]},"man-frowning":{"a":"Man Frowning","b":"1F64D-200D-2642-FE0F","j":["frowning","gesture","man","male","boy","sad","depressed","discouraged","unhappy"]},"woman-frowning":{"a":"Woman Frowning","b":"1F64D-200D-2640-FE0F","j":["frowning","gesture","woman","female","girl","sad","depressed","discouraged","unhappy"]},"person-pouting":{"a":"Person Pouting","b":"1F64E","j":["gesture","pouting","upset"]},"man-pouting":{"a":"Man Pouting","b":"1F64E-200D-2642-FE0F","j":["gesture","man","pouting","male","boy"]},"woman-pouting":{"a":"Woman Pouting","b":"1F64E-200D-2640-FE0F","j":["gesture","pouting","woman","female","girl"]},"person-gesturing-no":{"a":"Person Gesturing No","b":"1F645","j":["forbidden","gesture","hand","person gesturing NO","prohibited","decline"]},"man-gesturing-no":{"a":"Man Gesturing No","b":"1F645-200D-2642-FE0F","j":["forbidden","gesture","hand","man","man gesturing NO","prohibited","male","boy","nope"]},"woman-gesturing-no":{"a":"Woman Gesturing No","b":"1F645-200D-2640-FE0F","j":["forbidden","gesture","hand","prohibited","woman","woman gesturing NO","female","girl","nope"]},"person-gesturing-ok":{"a":"Person Gesturing Ok","b":"1F646","j":["gesture","hand","OK","person gesturing OK","agree"]},"man-gesturing-ok":{"a":"Man Gesturing Ok","b":"1F646-200D-2642-FE0F","j":["gesture","hand","man","man gesturing OK","OK","men","boy","male","blue","human"]},"woman-gesturing-ok":{"a":"Woman Gesturing Ok","b":"1F646-200D-2640-FE0F","j":["gesture","hand","OK","woman","woman gesturing OK","women","girl","female","pink","human"]},"person-tipping-hand":{"a":"Person Tipping Hand","b":"1F481","j":["hand","help","information","sassy","tipping"]},"man-tipping-hand":{"a":"Man Tipping Hand","b":"1F481-200D-2642-FE0F","j":["man","sassy","tipping hand","male","boy","human","information"]},"woman-tipping-hand":{"a":"Woman Tipping Hand","b":"1F481-200D-2640-FE0F","j":["sassy","tipping hand","woman","female","girl","human","information"]},"person-raising-hand":{"a":"Person Raising Hand","b":"1F64B","j":["gesture","hand","happy","raised","question"]},"man-raising-hand":{"a":"Man Raising Hand","b":"1F64B-200D-2642-FE0F","j":["gesture","man","raising hand","male","boy"]},"woman-raising-hand":{"a":"Woman Raising Hand","b":"1F64B-200D-2640-FE0F","j":["gesture","raising hand","woman","female","girl"]},"deaf-person":{"a":"Deaf Person","b":"1F9CF","j":["accessibility","deaf","ear","hear"]},"deaf-man":{"a":"Deaf Man","b":"1F9CF-200D-2642-FE0F","j":["deaf","man","accessibility"]},"deaf-woman":{"a":"Deaf Woman","b":"1F9CF-200D-2640-FE0F","j":["deaf","woman","accessibility"]},"person-bowing":{"a":"Person Bowing","b":"1F647","j":["apology","bow","gesture","sorry","respectiful"]},"man-bowing":{"a":"Man Bowing","b":"1F647-200D-2642-FE0F","j":["apology","bowing","favor","gesture","man","sorry","male","boy"]},"woman-bowing":{"a":"Woman Bowing","b":"1F647-200D-2640-FE0F","j":["apology","bowing","favor","gesture","sorry","woman","female","girl"]},"person-facepalming":{"a":"Person Facepalming","b":"1F926","j":["disbelief","exasperation","face","palm","disappointed"]},"man-facepalming":{"a":"Man Facepalming","b":"1F926-200D-2642-FE0F","j":["disbelief","exasperation","facepalm","man","male","boy"]},"woman-facepalming":{"a":"Woman Facepalming","b":"1F926-200D-2640-FE0F","j":["disbelief","exasperation","facepalm","woman","female","girl"]},"person-shrugging":{"a":"Person Shrugging","b":"1F937","j":["doubt","ignorance","indifference","shrug","regardless"]},"man-shrugging":{"a":"Man Shrugging","b":"1F937-200D-2642-FE0F","j":["doubt","ignorance","indifference","man","shrug","male","boy","confused","indifferent"]},"woman-shrugging":{"a":"Woman Shrugging","b":"1F937-200D-2640-FE0F","j":["doubt","ignorance","indifference","shrug","woman","female","girl","confused","indifferent"]},"health-worker":{"a":"Health Worker","b":"1F9D1-200D-2695-FE0F","j":["doctor","healthcare","nurse","therapist","hospital"]},"man-health-worker":{"a":"Man Health Worker","b":"1F468-200D-2695-FE0F","j":["doctor","healthcare","man","nurse","therapist","human"]},"woman-health-worker":{"a":"Woman Health Worker","b":"1F469-200D-2695-FE0F","j":["doctor","healthcare","nurse","therapist","woman","human"]},"student":{"a":"Student","b":"1F9D1-200D-1F393","j":["graduate","learn"]},"man-student":{"a":"Man Student","b":"1F468-200D-1F393","j":["graduate","man","student","human"]},"woman-student":{"a":"Woman Student","b":"1F469-200D-1F393","j":["graduate","student","woman","human"]},"teacher":{"a":"Teacher","b":"1F9D1-200D-1F3EB","j":["instructor","professor"]},"man-teacher":{"a":"Man Teacher","b":"1F468-200D-1F3EB","j":["instructor","man","professor","teacher","human"]},"woman-teacher":{"a":"Woman Teacher","b":"1F469-200D-1F3EB","j":["instructor","professor","teacher","woman","human"]},"judge":{"a":"Judge","b":"1F9D1-200D-2696-FE0F","j":["justice","scales","law"]},"man-judge":{"a":"Man Judge","b":"1F468-200D-2696-FE0F","j":["judge","justice","man","scales","court","human"]},"woman-judge":{"a":"Woman Judge","b":"1F469-200D-2696-FE0F","j":["judge","justice","scales","woman","court","human"]},"farmer":{"a":"Farmer","b":"1F9D1-200D-1F33E","j":["gardener","rancher","crops"]},"man-farmer":{"a":"Man Farmer","b":"1F468-200D-1F33E","j":["farmer","gardener","man","rancher","human"]},"woman-farmer":{"a":"Woman Farmer","b":"1F469-200D-1F33E","j":["farmer","gardener","rancher","woman","human"]},"cook":{"a":"Cook","b":"1F9D1-200D-1F373","j":["chef","food","kitchen","culinary"]},"man-cook":{"a":"Man Cook","b":"1F468-200D-1F373","j":["chef","cook","man","human"]},"woman-cook":{"a":"Woman Cook","b":"1F469-200D-1F373","j":["chef","cook","woman","human"]},"mechanic":{"a":"Mechanic","b":"1F9D1-200D-1F527","j":["electrician","plumber","tradesperson","worker","technician"]},"man-mechanic":{"a":"Man Mechanic","b":"1F468-200D-1F527","j":["electrician","man","mechanic","plumber","tradesperson","human","wrench"]},"woman-mechanic":{"a":"Woman Mechanic","b":"1F469-200D-1F527","j":["electrician","mechanic","plumber","tradesperson","woman","human","wrench"]},"factory-worker":{"a":"Factory Worker","b":"1F9D1-200D-1F3ED","j":["assembly","factory","industrial","worker","labor"]},"man-factory-worker":{"a":"Man Factory Worker","b":"1F468-200D-1F3ED","j":["assembly","factory","industrial","man","worker","human"]},"woman-factory-worker":{"a":"Woman Factory Worker","b":"1F469-200D-1F3ED","j":["assembly","factory","industrial","woman","worker","human"]},"office-worker":{"a":"Office Worker","b":"1F9D1-200D-1F4BC","j":["architect","business","manager","white-collar"]},"man-office-worker":{"a":"Man Office Worker","b":"1F468-200D-1F4BC","j":["architect","business","man","manager","white-collar","human"]},"woman-office-worker":{"a":"Woman Office Worker","b":"1F469-200D-1F4BC","j":["architect","business","manager","white-collar","woman","human"]},"scientist":{"a":"Scientist","b":"1F9D1-200D-1F52C","j":["biologist","chemist","engineer","physicist","chemistry"]},"man-scientist":{"a":"Man Scientist","b":"1F468-200D-1F52C","j":["biologist","chemist","engineer","man","physicist","scientist","human"]},"woman-scientist":{"a":"Woman Scientist","b":"1F469-200D-1F52C","j":["biologist","chemist","engineer","physicist","scientist","woman","human"]},"technologist":{"a":"Technologist","b":"1F9D1-200D-1F4BB","j":["coder","developer","inventor","software","computer"]},"man-technologist":{"a":"Man Technologist","b":"1F468-200D-1F4BB","j":["coder","developer","inventor","man","software","technologist","engineer","programmer","human","laptop","computer"]},"woman-technologist":{"a":"Woman Technologist","b":"1F469-200D-1F4BB","j":["coder","developer","inventor","software","technologist","woman","engineer","programmer","human","laptop","computer"]},"singer":{"a":"Singer","b":"1F9D1-200D-1F3A4","j":["actor","entertainer","rock","star","song","artist","performer"]},"man-singer":{"a":"Man Singer","b":"1F468-200D-1F3A4","j":["actor","entertainer","man","rock","singer","star","rockstar","human"]},"woman-singer":{"a":"Woman Singer","b":"1F469-200D-1F3A4","j":["actor","entertainer","rock","singer","star","woman","rockstar","human"]},"artist":{"a":"Artist","b":"1F9D1-200D-1F3A8","j":["palette","painting","draw","creativity"]},"man-artist":{"a":"Man Artist","b":"1F468-200D-1F3A8","j":["artist","man","palette","painter","human"]},"woman-artist":{"a":"Woman Artist","b":"1F469-200D-1F3A8","j":["artist","palette","woman","painter","human"]},"pilot":{"a":"Pilot","b":"1F9D1-200D-2708-FE0F","j":["plane","fly","airplane"]},"man-pilot":{"a":"Man Pilot","b":"1F468-200D-2708-FE0F","j":["man","pilot","plane","aviator","human"]},"woman-pilot":{"a":"Woman Pilot","b":"1F469-200D-2708-FE0F","j":["pilot","plane","woman","aviator","human"]},"astronaut":{"a":"Astronaut","b":"1F9D1-200D-1F680","j":["rocket","outerspace"]},"man-astronaut":{"a":"Man Astronaut","b":"1F468-200D-1F680","j":["astronaut","man","rocket","space","human"]},"woman-astronaut":{"a":"Woman Astronaut","b":"1F469-200D-1F680","j":["astronaut","rocket","woman","space","human"]},"firefighter":{"a":"Firefighter","b":"1F9D1-200D-1F692","j":["firetruck","fire"]},"man-firefighter":{"a":"Man Firefighter","b":"1F468-200D-1F692","j":["firefighter","firetruck","man","fireman","human"]},"woman-firefighter":{"a":"Woman Firefighter","b":"1F469-200D-1F692","j":["firefighter","firetruck","woman","fireman","human"]},"police-officer":{"a":"Police Officer","b":"1F46E","j":["cop","officer","police"]},"man-police-officer":{"a":"Man Police Officer","b":"1F46E-200D-2642-FE0F","j":["cop","man","officer","police","law","legal","enforcement","arrest","911"]},"woman-police-officer":{"a":"Woman Police Officer","b":"1F46E-200D-2640-FE0F","j":["cop","officer","police","woman","law","legal","enforcement","arrest","911","female"]},"detective":{"a":"Detective","b":"1F575","j":["sleuth","spy","human"]},"man-detective":{"a":"Man Detective","b":"1F575-FE0F-200D-2642-FE0F","j":["detective","man","sleuth","spy","crime"]},"woman-detective":{"a":"Woman Detective","b":"1F575-FE0F-200D-2640-FE0F","j":["detective","sleuth","spy","woman","human","female"]},"guard":{"a":"Guard","b":"1F482","j":["protect"]},"man-guard":{"a":"Man Guard","b":"1F482-200D-2642-FE0F","j":["guard","man","uk","gb","british","male","guy","royal"]},"woman-guard":{"a":"Woman Guard","b":"1F482-200D-2640-FE0F","j":["guard","woman","uk","gb","british","female","royal"]},"ninja":{"a":"Ninja","b":"1F977","j":["fighter","hidden","stealth","ninjutsu","skills","japanese"]},"construction-worker":{"a":"Construction Worker","b":"1F477","j":["construction","hat","worker","labor","build"]},"man-construction-worker":{"a":"Man Construction Worker","b":"1F477-200D-2642-FE0F","j":["construction","man","worker","male","human","wip","guy","build","labor"]},"woman-construction-worker":{"a":"Woman Construction Worker","b":"1F477-200D-2640-FE0F","j":["construction","woman","worker","female","human","wip","build","labor"]},"prince":{"a":"Prince","b":"1F934","j":["boy","man","male","crown","royal","king"]},"princess":{"a":"Princess","b":"1F478","j":["fairy tale","fantasy","girl","woman","female","blond","crown","royal","queen"]},"person-wearing-turban":{"a":"Person Wearing Turban","b":"1F473","j":["turban","headdress"]},"man-wearing-turban":{"a":"Man Wearing Turban","b":"1F473-200D-2642-FE0F","j":["man","turban","male","indian","hinduism","arabs"]},"woman-wearing-turban":{"a":"Woman Wearing Turban","b":"1F473-200D-2640-FE0F","j":["turban","woman","female","indian","hinduism","arabs"]},"person-with-skullcap":{"a":"Person with Skullcap","b":"1F472","j":["cap","gua pi mao","hat","person","skullcap","man_with_skullcap","male","boy","chinese"]},"woman-with-headscarf":{"a":"Woman with Headscarf","b":"1F9D5","j":["headscarf","hijab","mantilla","tichel","bandana","head kerchief","female"]},"person-in-tuxedo":{"a":"Person in Tuxedo","b":"1F935","j":["groom","person","tuxedo","man_in_tuxedo","couple","marriage","wedding"]},"man-in-tuxedo":{"a":"Man in Tuxedo","b":"1F935-200D-2642-FE0F","j":["man","tuxedo","formal","fashion"]},"woman-in-tuxedo":{"a":"Woman in Tuxedo","b":"1F935-200D-2640-FE0F","j":["tuxedo","woman","formal","fashion"]},"person-with-veil":{"a":"Person with Veil","b":"1F470","j":["bride","person","veil","wedding","bride_with_veil","couple","marriage","woman"]},"man-with-veil":{"a":"Man with Veil","b":"1F470-200D-2642-FE0F","j":["man","veil","wedding","marriage"]},"woman-with-veil":{"a":"Woman with Veil","b":"1F470-200D-2640-FE0F","j":["veil","woman","wedding","marriage"]},"pregnant-woman":{"a":"Pregnant Woman","b":"1F930","j":["pregnant","woman","baby"]},"breastfeeding":{"a":"Breast-Feeding","b":"1F931","j":["baby","breast","breast-feeding","nursing","breast_feeding"]},"woman-feeding-baby":{"a":"Woman Feeding Baby","b":"1F469-200D-1F37C","j":["baby","feeding","nursing","woman","birth","food"]},"man-feeding-baby":{"a":"Man Feeding Baby","b":"1F468-200D-1F37C","j":["baby","feeding","man","nursing","birth","food"]},"person-feeding-baby":{"a":"Person Feeding Baby","b":"1F9D1-200D-1F37C","j":["baby","feeding","nursing","person","birth","food"]},"baby-angel":{"a":"Baby Angel","b":"1F47C","j":["angel","baby","face","fairy tale","fantasy","heaven","wings","halo"]},"santa-claus":{"a":"Santa Claus","b":"1F385","j":["celebration","Christmas","claus","father","santa","festival","man","male","xmas","father christmas"]},"mrs-claus":{"a":"Mrs. Claus","b":"1F936","j":["celebration","Christmas","claus","mother","Mrs.","woman","female","xmas","mother christmas"]},"mx-claus":{"a":"Mx Claus","b":"1F9D1-200D-1F384","j":["Claus, christmas","christmas"]},"superhero":{"a":"Superhero","b":"1F9B8","j":["good","hero","heroine","superpower","marvel"]},"man-superhero":{"a":"Man Superhero","b":"1F9B8-200D-2642-FE0F","j":["good","hero","man","superpower","male","superpowers"]},"woman-superhero":{"a":"Woman Superhero","b":"1F9B8-200D-2640-FE0F","j":["good","hero","heroine","superpower","woman","female","superpowers"]},"supervillain":{"a":"Supervillain","b":"1F9B9","j":["criminal","evil","superpower","villain","marvel"]},"man-supervillain":{"a":"Man Supervillain","b":"1F9B9-200D-2642-FE0F","j":["criminal","evil","man","superpower","villain","male","bad","hero","superpowers"]},"woman-supervillain":{"a":"Woman Supervillain","b":"1F9B9-200D-2640-FE0F","j":["criminal","evil","superpower","villain","woman","female","bad","heroine","superpowers"]},"mage":{"a":"Mage","b":"1F9D9","j":["sorcerer","sorceress","witch","wizard","magic"]},"man-mage":{"a":"Man Mage","b":"1F9D9-200D-2642-FE0F","j":["sorcerer","wizard","man","male","mage"]},"woman-mage":{"a":"Woman Mage","b":"1F9D9-200D-2640-FE0F","j":["sorceress","witch","woman","female","mage"]},"fairy":{"a":"Fairy","b":"1F9DA","j":["Oberon","Puck","Titania","wings","magical"]},"man-fairy":{"a":"Man Fairy","b":"1F9DA-200D-2642-FE0F","j":["Oberon","Puck","man","male"]},"woman-fairy":{"a":"Woman Fairy","b":"1F9DA-200D-2640-FE0F","j":["Titania","woman","female"]},"vampire":{"a":"Vampire","b":"1F9DB","j":["Dracula","undead","blood","twilight"]},"man-vampire":{"a":"Man Vampire","b":"1F9DB-200D-2642-FE0F","j":["Dracula","undead","man","male","dracula"]},"woman-vampire":{"a":"Woman Vampire","b":"1F9DB-200D-2640-FE0F","j":["undead","woman","female"]},"merperson":{"a":"Merperson","b":"1F9DC","j":["mermaid","merman","merwoman","sea"]},"merman":{"a":"Merman","b":"1F9DC-200D-2642-FE0F","j":["Triton","man","male","triton"]},"mermaid":{"a":"Mermaid","b":"1F9DC-200D-2640-FE0F","j":["merwoman","woman","female","ariel"]},"elf":{"a":"Elf","b":"1F9DD","j":["magical","LOTR style"]},"man-elf":{"a":"Man Elf","b":"1F9DD-200D-2642-FE0F","j":["magical","man","male"]},"woman-elf":{"a":"Woman Elf","b":"1F9DD-200D-2640-FE0F","j":["magical","woman","female"]},"genie":{"a":"Genie","b":"1F9DE","j":["djinn","(non-human color)","magical","wishes"]},"man-genie":{"a":"Man Genie","b":"1F9DE-200D-2642-FE0F","j":["djinn","man","male"]},"woman-genie":{"a":"Woman Genie","b":"1F9DE-200D-2640-FE0F","j":["djinn","woman","female"]},"zombie":{"a":"Zombie","b":"1F9DF","j":["undead","walking dead","(non-human color)","dead"]},"man-zombie":{"a":"Man Zombie","b":"1F9DF-200D-2642-FE0F","j":["undead","walking dead","man","male","dracula"]},"woman-zombie":{"a":"Woman Zombie","b":"1F9DF-200D-2640-FE0F","j":["undead","walking dead","woman","female"]},"person-getting-massage":{"a":"Person Getting Massage","b":"1F486","j":["face","massage","salon","relax"]},"man-getting-massage":{"a":"Man Getting Massage","b":"1F486-200D-2642-FE0F","j":["face","man","massage","male","boy","head"]},"woman-getting-massage":{"a":"Woman Getting Massage","b":"1F486-200D-2640-FE0F","j":["face","massage","woman","female","girl","head"]},"person-getting-haircut":{"a":"Person Getting Haircut","b":"1F487","j":["barber","beauty","haircut","parlor","hairstyle"]},"man-getting-haircut":{"a":"Man Getting Haircut","b":"1F487-200D-2642-FE0F","j":["haircut","man","male","boy"]},"woman-getting-haircut":{"a":"Woman Getting Haircut","b":"1F487-200D-2640-FE0F","j":["haircut","woman","female","girl"]},"person-walking":{"a":"Person Walking","b":"1F6B6","j":["hike","walk","walking","move"]},"man-walking":{"a":"Man Walking","b":"1F6B6-200D-2642-FE0F","j":["hike","man","walk","human","feet","steps"]},"woman-walking":{"a":"Woman Walking","b":"1F6B6-200D-2640-FE0F","j":["hike","walk","woman","human","feet","steps","female"]},"person-standing":{"a":"Person Standing","b":"1F9CD","j":["stand","standing","still"]},"man-standing":{"a":"Man Standing","b":"1F9CD-200D-2642-FE0F","j":["man","standing","still"]},"woman-standing":{"a":"Woman Standing","b":"1F9CD-200D-2640-FE0F","j":["standing","woman","still"]},"person-kneeling":{"a":"Person Kneeling","b":"1F9CE","j":["kneel","kneeling","pray","respectful"]},"man-kneeling":{"a":"Man Kneeling","b":"1F9CE-200D-2642-FE0F","j":["kneeling","man","pray","respectful"]},"woman-kneeling":{"a":"Woman Kneeling","b":"1F9CE-200D-2640-FE0F","j":["kneeling","woman","respectful","pray"]},"person-with-white-cane":{"a":"Person with White Cane","b":"1F9D1-200D-1F9AF","j":["accessibility","blind","person_with_probing_cane"]},"man-with-white-cane":{"a":"Man with White Cane","b":"1F468-200D-1F9AF","j":["accessibility","blind","man","man_with_probing_cane"]},"woman-with-white-cane":{"a":"Woman with White Cane","b":"1F469-200D-1F9AF","j":["accessibility","blind","woman","woman_with_probing_cane"]},"person-in-motorized-wheelchair":{"a":"Person in Motorized Wheelchair","b":"1F9D1-200D-1F9BC","j":["accessibility","wheelchair","disability"]},"man-in-motorized-wheelchair":{"a":"Man in Motorized Wheelchair","b":"1F468-200D-1F9BC","j":["accessibility","man","wheelchair","disability"]},"woman-in-motorized-wheelchair":{"a":"Woman in Motorized Wheelchair","b":"1F469-200D-1F9BC","j":["accessibility","wheelchair","woman","disability"]},"person-in-manual-wheelchair":{"a":"Person in Manual Wheelchair","b":"1F9D1-200D-1F9BD","j":["accessibility","wheelchair","disability"]},"man-in-manual-wheelchair":{"a":"Man in Manual Wheelchair","b":"1F468-200D-1F9BD","j":["accessibility","man","wheelchair","disability"]},"woman-in-manual-wheelchair":{"a":"Woman in Manual Wheelchair","b":"1F469-200D-1F9BD","j":["accessibility","wheelchair","woman","disability"]},"person-running":{"a":"Person Running","b":"1F3C3","j":["marathon","running","move"]},"man-running":{"a":"Man Running","b":"1F3C3-200D-2642-FE0F","j":["man","marathon","racing","running","walking","exercise","race"]},"woman-running":{"a":"Woman Running","b":"1F3C3-200D-2640-FE0F","j":["marathon","racing","running","woman","walking","exercise","race","female"]},"woman-dancing":{"a":"Woman Dancing","b":"1F483","j":["dance","dancing","woman","female","girl","fun"]},"man-dancing":{"a":"Man Dancing","b":"1F57A","j":["dance","dancing","man","male","boy","fun","dancer"]},"person-in-suit-levitating":{"a":"Person in Suit Levitating","b":"1F574","j":["business","person","suit","man_in_suit_levitating","levitate","hover","jump"]},"people-with-bunny-ears":{"a":"People with Bunny Ears","b":"1F46F","j":["bunny ear","dancer","partying","perform","costume"]},"men-with-bunny-ears":{"a":"Men with Bunny Ears","b":"1F46F-200D-2642-FE0F","j":["bunny ear","dancer","men","partying","male","bunny","boys"]},"women-with-bunny-ears":{"a":"Women with Bunny Ears","b":"1F46F-200D-2640-FE0F","j":["bunny ear","dancer","partying","women","female","bunny","girls"]},"person-in-steamy-room":{"a":"Person in Steamy Room","b":"1F9D6","j":["sauna","steam room","hamam","steambath","relax","spa"]},"man-in-steamy-room":{"a":"Man in Steamy Room","b":"1F9D6-200D-2642-FE0F","j":["sauna","steam room","male","man","spa","steamroom"]},"woman-in-steamy-room":{"a":"Woman in Steamy Room","b":"1F9D6-200D-2640-FE0F","j":["sauna","steam room","female","woman","spa","steamroom"]},"person-climbing":{"a":"Person Climbing","b":"1F9D7","j":["climber","sport"]},"man-climbing":{"a":"Man Climbing","b":"1F9D7-200D-2642-FE0F","j":["climber","sports","hobby","man","male","rock"]},"woman-climbing":{"a":"Woman Climbing","b":"1F9D7-200D-2640-FE0F","j":["climber","sports","hobby","woman","female","rock"]},"person-fencing":{"a":"Person Fencing","b":"1F93A","j":["fencer","fencing","sword","sports"]},"horse-racing":{"a":"Horse Racing","b":"1F3C7","j":["horse","jockey","racehorse","racing","animal","betting","competition","gambling","luck"]},"skier":{"a":"Skier","b":"26F7","j":["ski","snow","sports","winter"]},"snowboarder":{"a":"Snowboarder","b":"1F3C2","j":["ski","snow","snowboard","sports","winter"]},"person-golfing":{"a":"Person Golfing","b":"1F3CC","j":["ball","golf","sports","business"]},"man-golfing":{"a":"Man Golfing","b":"1F3CC-FE0F-200D-2642-FE0F","j":["golf","man","sport"]},"woman-golfing":{"a":"Woman Golfing","b":"1F3CC-FE0F-200D-2640-FE0F","j":["golf","woman","sports","business","female"]},"person-surfing":{"a":"Person Surfing","b":"1F3C4","j":["surfing","sport","sea"]},"man-surfing":{"a":"Man Surfing","b":"1F3C4-200D-2642-FE0F","j":["man","surfing","sports","ocean","sea","summer","beach"]},"woman-surfing":{"a":"Woman Surfing","b":"1F3C4-200D-2640-FE0F","j":["surfing","woman","sports","ocean","sea","summer","beach","female"]},"person-rowing-boat":{"a":"Person Rowing Boat","b":"1F6A3","j":["boat","rowboat","sport","move"]},"man-rowing-boat":{"a":"Man Rowing Boat","b":"1F6A3-200D-2642-FE0F","j":["boat","man","rowboat","sports","hobby","water","ship"]},"woman-rowing-boat":{"a":"Woman Rowing Boat","b":"1F6A3-200D-2640-FE0F","j":["boat","rowboat","woman","sports","hobby","water","ship","female"]},"person-swimming":{"a":"Person Swimming","b":"1F3CA","j":["swim","sport","pool"]},"man-swimming":{"a":"Man Swimming","b":"1F3CA-200D-2642-FE0F","j":["man","swim","sports","exercise","human","athlete","water","summer"]},"woman-swimming":{"a":"Woman Swimming","b":"1F3CA-200D-2640-FE0F","j":["swim","woman","sports","exercise","human","athlete","water","summer","female"]},"person-bouncing-ball":{"a":"Person Bouncing Ball","b":"26F9","j":["ball","sports","human"]},"man-bouncing-ball":{"a":"Man Bouncing Ball","b":"26F9-FE0F-200D-2642-FE0F","j":["ball","man","sport"]},"woman-bouncing-ball":{"a":"Woman Bouncing Ball","b":"26F9-FE0F-200D-2640-FE0F","j":["ball","woman","sports","human","female"]},"person-lifting-weights":{"a":"Person Lifting Weights","b":"1F3CB","j":["lifter","weight","sports","training","exercise"]},"man-lifting-weights":{"a":"Man Lifting Weights","b":"1F3CB-FE0F-200D-2642-FE0F","j":["man","weight lifter","sport"]},"woman-lifting-weights":{"a":"Woman Lifting Weights","b":"1F3CB-FE0F-200D-2640-FE0F","j":["weight lifter","woman","sports","training","exercise","female"]},"person-biking":{"a":"Person Biking","b":"1F6B4","j":["bicycle","biking","cyclist","sport","move"]},"man-biking":{"a":"Man Biking","b":"1F6B4-200D-2642-FE0F","j":["bicycle","biking","cyclist","man","sports","bike","exercise","hipster"]},"woman-biking":{"a":"Woman Biking","b":"1F6B4-200D-2640-FE0F","j":["bicycle","biking","cyclist","woman","sports","bike","exercise","hipster","female"]},"person-mountain-biking":{"a":"Person Mountain Biking","b":"1F6B5","j":["bicycle","bicyclist","bike","cyclist","mountain","sport","move"]},"man-mountain-biking":{"a":"Man Mountain Biking","b":"1F6B5-200D-2642-FE0F","j":["bicycle","bike","cyclist","man","mountain","transportation","sports","human","race"]},"woman-mountain-biking":{"a":"Woman Mountain Biking","b":"1F6B5-200D-2640-FE0F","j":["bicycle","bike","biking","cyclist","mountain","woman","transportation","sports","human","race","female"]},"person-cartwheeling":{"a":"Person Cartwheeling","b":"1F938","j":["cartwheel","gymnastics","sport","gymnastic"]},"man-cartwheeling":{"a":"Man Cartwheeling","b":"1F938-200D-2642-FE0F","j":["cartwheel","gymnastics","man"]},"woman-cartwheeling":{"a":"Woman Cartwheeling","b":"1F938-200D-2640-FE0F","j":["cartwheel","gymnastics","woman"]},"people-wrestling":{"a":"People Wrestling","b":"1F93C","j":["wrestle","wrestler","sport"]},"men-wrestling":{"a":"Men Wrestling","b":"1F93C-200D-2642-FE0F","j":["men","wrestle","sports","wrestlers"]},"women-wrestling":{"a":"Women Wrestling","b":"1F93C-200D-2640-FE0F","j":["women","wrestle","sports","wrestlers"]},"person-playing-water-polo":{"a":"Person Playing Water Polo","b":"1F93D","j":["polo","water","sport"]},"man-playing-water-polo":{"a":"Man Playing Water Polo","b":"1F93D-200D-2642-FE0F","j":["man","water polo","sports","pool"]},"woman-playing-water-polo":{"a":"Woman Playing Water Polo","b":"1F93D-200D-2640-FE0F","j":["water polo","woman","sports","pool"]},"person-playing-handball":{"a":"Person Playing Handball","b":"1F93E","j":["ball","handball","sport"]},"man-playing-handball":{"a":"Man Playing Handball","b":"1F93E-200D-2642-FE0F","j":["handball","man","sports"]},"woman-playing-handball":{"a":"Woman Playing Handball","b":"1F93E-200D-2640-FE0F","j":["handball","woman","sports"]},"person-juggling":{"a":"Person Juggling","b":"1F939","j":["balance","juggle","multitask","skill","performance"]},"man-juggling":{"a":"Man Juggling","b":"1F939-200D-2642-FE0F","j":["juggling","man","multitask","juggle","balance","skill"]},"woman-juggling":{"a":"Woman Juggling","b":"1F939-200D-2640-FE0F","j":["juggling","multitask","woman","juggle","balance","skill"]},"person-in-lotus-position":{"a":"Person in Lotus Position","b":"1F9D8","j":["meditation","yoga","serenity","meditate"]},"man-in-lotus-position":{"a":"Man in Lotus Position","b":"1F9D8-200D-2642-FE0F","j":["meditation","yoga","man","male","serenity","zen","mindfulness"]},"woman-in-lotus-position":{"a":"Woman in Lotus Position","b":"1F9D8-200D-2640-FE0F","j":["meditation","yoga","woman","female","serenity","zen","mindfulness"]},"person-taking-bath":{"a":"Person Taking Bath","b":"1F6C0","j":["bath","bathtub","clean","shower","bathroom"]},"person-in-bed":{"a":"Person in Bed","b":"1F6CC","j":["hotel","sleep","bed","rest"]},"people-holding-hands":{"a":"People Holding Hands","b":"1F9D1-200D-1F91D-200D-1F9D1","j":["couple","hand","hold","holding hands","person","friendship"]},"women-holding-hands":{"a":"Women Holding Hands","b":"1F46D","j":["couple","hand","holding hands","women","pair","friendship","love","like","female","people","human"]},"woman-and-man-holding-hands":{"a":"Woman and Man Holding Hands","b":"1F46B","j":["couple","hand","hold","holding hands","man","woman","pair","people","human","love","date","dating","like","affection","valentines","marriage"]},"men-holding-hands":{"a":"Men Holding Hands","b":"1F46C","j":["couple","Gemini","holding hands","man","men","twins","zodiac","pair","love","like","bromance","friendship","people","human"]},"kiss":{"a":"Kiss","b":"1F48F","j":["couple","pair","valentines","love","like","dating","marriage"]},"kiss-woman-man":{"a":"Kiss: Woman, Man","b":"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468","j":["couple","kiss","man","woman","love"]},"kiss-man-man":{"a":"Kiss: Man, Man","b":"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468","j":["couple","kiss","man","pair","valentines","love","like","dating","marriage"]},"kiss-woman-woman":{"a":"Kiss: Woman, Woman","b":"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469","j":["couple","kiss","woman","pair","valentines","love","like","dating","marriage"]},"couple-with-heart":{"a":"Couple with Heart","b":"1F491","j":["couple","love","pair","like","affection","human","dating","valentines","marriage"]},"couple-with-heart-woman-man":{"a":"Couple with Heart: Woman, Man","b":"1F469-200D-2764-FE0F-200D-1F468","j":["couple","couple with heart","love","man","woman"]},"couple-with-heart-man-man":{"a":"Couple with Heart: Man, Man","b":"1F468-200D-2764-FE0F-200D-1F468","j":["couple","couple with heart","love","man","pair","like","affection","human","dating","valentines","marriage"]},"couple-with-heart-woman-woman":{"a":"Couple with Heart: Woman, Woman","b":"1F469-200D-2764-FE0F-200D-1F469","j":["couple","couple with heart","love","woman","pair","like","affection","human","dating","valentines","marriage"]},"family":{"a":"Family","b":"1F46A","j":["home","parents","child","mom","dad","father","mother","people","human"]},"family-man-woman-boy":{"a":"Family: Man, Woman, Boy","b":"1F468-200D-1F469-200D-1F466","j":["boy","family","man","woman","love"]},"family-man-woman-girl":{"a":"Family: Man, Woman, Girl","b":"1F468-200D-1F469-200D-1F467","j":["family","girl","man","woman","home","parents","people","human","child"]},"family-man-woman-girl-boy":{"a":"Family: Man, Woman, Girl, Boy","b":"1F468-200D-1F469-200D-1F467-200D-1F466","j":["boy","family","girl","man","woman","home","parents","people","human","children"]},"family-man-woman-boy-boy":{"a":"Family: Man, Woman, Boy, Boy","b":"1F468-200D-1F469-200D-1F466-200D-1F466","j":["boy","family","man","woman","home","parents","people","human","children"]},"family-man-woman-girl-girl":{"a":"Family: Man, Woman, Girl, Girl","b":"1F468-200D-1F469-200D-1F467-200D-1F467","j":["family","girl","man","woman","home","parents","people","human","children"]},"family-man-man-boy":{"a":"Family: Man, Man, Boy","b":"1F468-200D-1F468-200D-1F466","j":["boy","family","man","home","parents","people","human","children"]},"family-man-man-girl":{"a":"Family: Man, Man, Girl","b":"1F468-200D-1F468-200D-1F467","j":["family","girl","man","home","parents","people","human","children"]},"family-man-man-girl-boy":{"a":"Family: Man, Man, Girl, Boy","b":"1F468-200D-1F468-200D-1F467-200D-1F466","j":["boy","family","girl","man","home","parents","people","human","children"]},"family-man-man-boy-boy":{"a":"Family: Man, Man, Boy, Boy","b":"1F468-200D-1F468-200D-1F466-200D-1F466","j":["boy","family","man","home","parents","people","human","children"]},"family-man-man-girl-girl":{"a":"Family: Man, Man, Girl, Girl","b":"1F468-200D-1F468-200D-1F467-200D-1F467","j":["family","girl","man","home","parents","people","human","children"]},"family-woman-woman-boy":{"a":"Family: Woman, Woman, Boy","b":"1F469-200D-1F469-200D-1F466","j":["boy","family","woman","home","parents","people","human","children"]},"family-woman-woman-girl":{"a":"Family: Woman, Woman, Girl","b":"1F469-200D-1F469-200D-1F467","j":["family","girl","woman","home","parents","people","human","children"]},"family-woman-woman-girl-boy":{"a":"Family: Woman, Woman, Girl, Boy","b":"1F469-200D-1F469-200D-1F467-200D-1F466","j":["boy","family","girl","woman","home","parents","people","human","children"]},"family-woman-woman-boy-boy":{"a":"Family: Woman, Woman, Boy, Boy","b":"1F469-200D-1F469-200D-1F466-200D-1F466","j":["boy","family","woman","home","parents","people","human","children"]},"family-woman-woman-girl-girl":{"a":"Family: Woman, Woman, Girl, Girl","b":"1F469-200D-1F469-200D-1F467-200D-1F467","j":["family","girl","woman","home","parents","people","human","children"]},"family-man-boy":{"a":"Family: Man, Boy","b":"1F468-200D-1F466","j":["boy","family","man","home","parent","people","human","child"]},"family-man-boy-boy":{"a":"Family: Man, Boy, Boy","b":"1F468-200D-1F466-200D-1F466","j":["boy","family","man","home","parent","people","human","children"]},"family-man-girl":{"a":"Family: Man, Girl","b":"1F468-200D-1F467","j":["family","girl","man","home","parent","people","human","child"]},"family-man-girl-boy":{"a":"Family: Man, Girl, Boy","b":"1F468-200D-1F467-200D-1F466","j":["boy","family","girl","man","home","parent","people","human","children"]},"family-man-girl-girl":{"a":"Family: Man, Girl, Girl","b":"1F468-200D-1F467-200D-1F467","j":["family","girl","man","home","parent","people","human","children"]},"family-woman-boy":{"a":"Family: Woman, Boy","b":"1F469-200D-1F466","j":["boy","family","woman","home","parent","people","human","child"]},"family-woman-boy-boy":{"a":"Family: Woman, Boy, Boy","b":"1F469-200D-1F466-200D-1F466","j":["boy","family","woman","home","parent","people","human","children"]},"family-woman-girl":{"a":"Family: Woman, Girl","b":"1F469-200D-1F467","j":["family","girl","woman","home","parent","people","human","child"]},"family-woman-girl-boy":{"a":"Family: Woman, Girl, Boy","b":"1F469-200D-1F467-200D-1F466","j":["boy","family","girl","woman","home","parent","people","human","children"]},"family-woman-girl-girl":{"a":"Family: Woman, Girl, Girl","b":"1F469-200D-1F467-200D-1F467","j":["family","girl","woman","home","parent","people","human","children"]},"speaking-head":{"a":"Speaking Head","b":"1F5E3","j":["face","head","silhouette","speak","speaking","user","person","human","sing","say","talk"]},"bust-in-silhouette":{"a":"Bust in Silhouette","b":"1F464","j":["bust","silhouette","user","person","human"]},"busts-in-silhouette":{"a":"Busts in Silhouette","b":"1F465","j":["bust","silhouette","user","person","human","group","team"]},"people-hugging":{"a":"People Hugging","b":"1FAC2","j":["goodbye","hello","hug","thanks","care"]},"footprints":{"a":"Footprints","b":"1F463","j":["clothing","footprint","print","feet","tracking","walking","beach"]},"red-hair":{"a":"Red Hair","b":"1F9B0","j":["ginger","red hair","redhead"]},"curly-hair":{"a":"Curly Hair","b":"1F9B1","j":["afro","curly","curly hair","ringlets"]},"white-hair":{"a":"White Hair","b":"1F9B3","j":["gray","hair","old","white"]},"bald":{"a":"Bald","b":"1F9B2","j":["bald","chemotherapy","hairless","no hair","shaven"]},"monkey-face":{"a":"Monkey Face","b":"1F435","j":["face","monkey","animal","nature","circus"]},"monkey":{"a":"Monkey","b":"1F412","j":["animal","nature","banana","circus"]},"gorilla":{"a":"Gorilla","b":"1F98D","j":["animal","nature","circus"]},"orangutan":{"a":"Orangutan","b":"1F9A7","j":["ape","animal"]},"dog-face":{"a":"Dog Face","b":"1F436","j":["dog","face","pet","animal","friend","nature","woof","puppy","faithful"]},"dog":{"a":"Dog","b":"1F415","j":["pet","animal","nature","friend","doge","faithful"]},"guide-dog":{"a":"Guide Dog","b":"1F9AE","j":["accessibility","blind","guide","animal"]},"service-dog":{"a":"Service Dog","b":"1F415-200D-1F9BA","j":["accessibility","assistance","dog","service","blind","animal"]},"poodle":{"a":"Poodle","b":"1F429","j":["dog","animal","101","nature","pet"]},"wolf":{"a":"Wolf","b":"1F43A","j":["face","animal","nature","wild"]},"fox":{"a":"Fox","b":"1F98A","j":["face","animal","nature"]},"raccoon":{"a":"Raccoon","b":"1F99D","j":["curious","sly","animal","nature"]},"cat-face":{"a":"Cat Face","b":"1F431","j":["cat","face","pet","animal","meow","nature","kitten"]},"cat":{"a":"Cat","b":"1F408","j":["pet","animal","meow","cats"]},"black-cat":{"a":"Black Cat","b":"1F408-200D-2B1B","j":["black","cat","unlucky","superstition","luck"]},"lion":{"a":"Lion","b":"1F981","j":["face","Leo","zodiac","animal","nature"]},"tiger-face":{"a":"Tiger Face","b":"1F42F","j":["face","tiger","animal","cat","danger","wild","nature","roar"]},"tiger":{"a":"Tiger","b":"1F405","j":["animal","nature","roar"]},"leopard":{"a":"Leopard","b":"1F406","j":["animal","nature"]},"horse-face":{"a":"Horse Face","b":"1F434","j":["face","horse","animal","brown","nature"]},"horse":{"a":"Horse","b":"1F40E","j":["equestrian","racehorse","racing","animal","gamble","luck"]},"unicorn":{"a":"Unicorn","b":"1F984","j":["face","animal","nature","mystical"]},"zebra":{"a":"Zebra","b":"1F993","j":["stripe","animal","nature","stripes","safari"]},"deer":{"a":"Deer","b":"1F98C","j":["animal","nature","horns","venison"]},"bison":{"a":"Bison","b":"1F9AC","j":["buffalo","herd","wisent","ox"]},"cow-face":{"a":"Cow Face","b":"1F42E","j":["cow","face","beef","ox","animal","nature","moo","milk"]},"ox":{"a":"Ox","b":"1F402","j":["bull","Taurus","zodiac","animal","cow","beef"]},"water-buffalo":{"a":"Water Buffalo","b":"1F403","j":["buffalo","water","animal","nature","ox","cow"]},"cow":{"a":"Cow","b":"1F404","j":["beef","ox","animal","nature","moo","milk"]},"pig-face":{"a":"Pig Face","b":"1F437","j":["face","pig","animal","oink","nature"]},"pig":{"a":"Pig","b":"1F416","j":["sow","animal","nature"]},"boar":{"a":"Boar","b":"1F417","j":["pig","animal","nature"]},"pig-nose":{"a":"Pig Nose","b":"1F43D","j":["face","nose","pig","animal","oink"]},"ram":{"a":"Ram","b":"1F40F","j":["Aries","male","sheep","zodiac","animal","nature"]},"ewe":{"a":"Ewe","b":"1F411","j":["female","sheep","animal","nature","wool","shipit"]},"goat":{"a":"Goat","b":"1F410","j":["Capricorn","zodiac","animal","nature"]},"camel":{"a":"Camel","b":"1F42A","j":["dromedary","hump","animal","hot","desert"]},"twohump-camel":{"a":"Two-Hump Camel","b":"1F42B","j":["bactrian","camel","hump","two-hump camel","two_hump_camel","animal","nature","hot","desert"]},"llama":{"a":"Llama","b":"1F999","j":["alpaca","guanaco","vicuña","wool","animal","nature"]},"giraffe":{"a":"Giraffe","b":"1F992","j":["spots","animal","nature","safari"]},"elephant":{"a":"Elephant","b":"1F418","j":["animal","nature","nose","th","circus"]},"mammoth":{"a":"Mammoth","b":"1F9A3","j":["extinction","large","tusk","woolly","elephant","tusks"]},"rhinoceros":{"a":"Rhinoceros","b":"1F98F","j":["animal","nature","horn"]},"hippopotamus":{"a":"Hippopotamus","b":"1F99B","j":["hippo","animal","nature"]},"mouse-face":{"a":"Mouse Face","b":"1F42D","j":["face","mouse","animal","nature","cheese_wedge","rodent"]},"mouse":{"a":"Mouse","b":"1F401","j":["animal","nature","rodent"]},"rat":{"a":"Rat","b":"1F400","j":["animal","mouse","rodent"]},"hamster":{"a":"Hamster","b":"1F439","j":["face","pet","animal","nature"]},"rabbit-face":{"a":"Rabbit Face","b":"1F430","j":["bunny","face","pet","rabbit","animal","nature","spring","magic"]},"rabbit":{"a":"Rabbit","b":"1F407","j":["bunny","pet","animal","nature","magic","spring"]},"chipmunk":{"a":"Chipmunk","b":"1F43F","j":["squirrel","animal","nature","rodent"]},"beaver":{"a":"Beaver","b":"1F9AB","j":["dam","animal","rodent"]},"hedgehog":{"a":"Hedgehog","b":"1F994","j":["spiny","animal","nature"]},"bat":{"a":"Bat","b":"1F987","j":["vampire","animal","nature","blind"]},"bear":{"a":"Bear","b":"1F43B","j":["face","animal","nature","wild"]},"polar-bear":{"a":"Polar Bear","b":"1F43B-200D-2744-FE0F","j":["arctic","bear","white","animal"]},"koala":{"a":"Koala","b":"1F428","j":["bear","animal","nature"]},"panda":{"a":"Panda","b":"1F43C","j":["face","animal","nature"]},"sloth":{"a":"Sloth","b":"1F9A5","j":["lazy","slow","animal"]},"otter":{"a":"Otter","b":"1F9A6","j":["fishing","playful","animal"]},"skunk":{"a":"Skunk","b":"1F9A8","j":["stink","animal"]},"kangaroo":{"a":"Kangaroo","b":"1F998","j":["Australia","joey","jump","marsupial","animal","nature","australia","hop"]},"badger":{"a":"Badger","b":"1F9A1","j":["honey badger","pester","animal","nature","honey"]},"paw-prints":{"a":"Paw Prints","b":"1F43E","j":["feet","paw","print","animal","tracking","footprints","dog","cat","pet"]},"turkey":{"a":"Turkey","b":"1F983","j":["bird","animal"]},"chicken":{"a":"Chicken","b":"1F414","j":["bird","animal","cluck","nature"]},"rooster":{"a":"Rooster","b":"1F413","j":["bird","animal","nature","chicken"]},"hatching-chick":{"a":"Hatching Chick","b":"1F423","j":["baby","bird","chick","hatching","animal","chicken","egg","born"]},"baby-chick":{"a":"Baby Chick","b":"1F424","j":["baby","bird","chick","animal","chicken"]},"frontfacing-baby-chick":{"a":"Front-Facing Baby Chick","b":"1F425","j":["baby","bird","chick","front-facing baby chick","front_facing_baby_chick","animal","chicken"]},"bird":{"a":"Bird","b":"1F426","j":["animal","nature","fly","tweet","spring"]},"penguin":{"a":"Penguin","b":"1F427","j":["bird","animal","nature"]},"dove":{"a":"Dove","b":"1F54A","j":["bird","fly","peace","animal"]},"eagle":{"a":"Eagle","b":"1F985","j":["bird","animal","nature"]},"duck":{"a":"Duck","b":"1F986","j":["bird","animal","nature","mallard"]},"swan":{"a":"Swan","b":"1F9A2","j":["bird","cygnet","ugly duckling","animal","nature"]},"owl":{"a":"Owl","b":"1F989","j":["bird","wise","animal","nature","hoot"]},"dodo":{"a":"Dodo","b":"1F9A4","j":["extinction","large","Mauritius","animal","bird"]},"feather":{"a":"Feather","b":"1FAB6","j":["bird","flight","light","plumage","fly"]},"flamingo":{"a":"Flamingo","b":"1F9A9","j":["flamboyant","tropical","animal"]},"peacock":{"a":"Peacock","b":"1F99A","j":["bird","ostentatious","peahen","proud","animal","nature"]},"parrot":{"a":"Parrot","b":"1F99C","j":["bird","pirate","talk","animal","nature"]},"frog":{"a":"Frog","b":"1F438","j":["face","animal","nature","croak","toad"]},"crocodile":{"a":"Crocodile","b":"1F40A","j":["animal","nature","reptile","lizard","alligator"]},"turtle":{"a":"Turtle","b":"1F422","j":["terrapin","tortoise","animal","slow","nature"]},"lizard":{"a":"Lizard","b":"1F98E","j":["reptile","animal","nature"]},"snake":{"a":"Snake","b":"1F40D","j":["bearer","Ophiuchus","serpent","zodiac","animal","evil","nature","hiss","python"]},"dragon-face":{"a":"Dragon Face","b":"1F432","j":["dragon","face","fairy tale","animal","myth","nature","chinese","green"]},"dragon":{"a":"Dragon","b":"1F409","j":["fairy tale","animal","myth","nature","chinese","green"]},"sauropod":{"a":"Sauropod","b":"1F995","j":["brachiosaurus","brontosaurus","diplodocus","animal","nature","dinosaur","extinct"]},"trex":{"a":"T-Rex","b":"1F996","j":["Tyrannosaurus Rex","t_rex","animal","nature","dinosaur","tyrannosaurus","extinct"]},"spouting-whale":{"a":"Spouting Whale","b":"1F433","j":["face","spouting","whale","animal","nature","sea","ocean"]},"whale":{"a":"Whale","b":"1F40B","j":["animal","nature","sea","ocean"]},"dolphin":{"a":"Dolphin","b":"1F42C","j":["flipper","animal","nature","fish","sea","ocean","fins","beach"]},"seal":{"a":"Seal","b":"1F9AD","j":["sea lion","animal","creature","sea"]},"fish":{"a":"Fish","b":"1F41F","j":["Pisces","zodiac","animal","food","nature"]},"tropical-fish":{"a":"Tropical Fish","b":"1F420","j":["fish","tropical","animal","swim","ocean","beach","nemo"]},"blowfish":{"a":"Blowfish","b":"1F421","j":["fish","animal","nature","food","sea","ocean"]},"shark":{"a":"Shark","b":"1F988","j":["fish","animal","nature","sea","ocean","jaws","fins","beach"]},"octopus":{"a":"Octopus","b":"1F419","j":["animal","creature","ocean","sea","nature","beach"]},"spiral-shell":{"a":"Spiral Shell","b":"1F41A","j":["shell","spiral","nature","sea","beach"]},"snail":{"a":"Snail","b":"1F40C","j":["slow","animal","shell"]},"butterfly":{"a":"Butterfly","b":"1F98B","j":["insect","pretty","animal","nature","caterpillar"]},"bug":{"a":"Bug","b":"1F41B","j":["insect","animal","nature","worm"]},"ant":{"a":"Ant","b":"1F41C","j":["insect","animal","nature","bug"]},"honeybee":{"a":"Honeybee","b":"1F41D","j":["bee","insect","animal","nature","bug","spring","honey"]},"beetle":{"a":"Beetle","b":"1FAB2","j":["bug","insect"]},"lady-beetle":{"a":"Lady Beetle","b":"1F41E","j":["beetle","insect","ladybird","ladybug","animal","nature"]},"cricket":{"a":"Cricket","b":"1F997","j":["grasshopper","Orthoptera","animal","chirp"]},"cockroach":{"a":"Cockroach","b":"1FAB3","j":["insect","pest","roach","pests"]},"spider":{"a":"Spider","b":"1F577","j":["insect","animal","arachnid"]},"spider-web":{"a":"Spider Web","b":"1F578","j":["spider","web","animal","insect","arachnid","silk"]},"scorpion":{"a":"Scorpion","b":"1F982","j":["scorpio","Scorpio","zodiac","animal","arachnid"]},"mosquito":{"a":"Mosquito","b":"1F99F","j":["disease","fever","malaria","pest","virus","animal","nature","insect"]},"fly":{"a":"Fly","b":"1FAB0","j":["disease","maggot","pest","rotting","insect"]},"worm":{"a":"Worm","b":"1FAB1","j":["annelid","earthworm","parasite","animal"]},"microbe":{"a":"Microbe","b":"1F9A0","j":["amoeba","bacteria","virus","germs"]},"bouquet":{"a":"Bouquet","b":"1F490","j":["flower","flowers","nature","spring"]},"cherry-blossom":{"a":"Cherry Blossom","b":"1F338","j":["blossom","cherry","flower","nature","plant","spring"]},"white-flower":{"a":"White Flower","b":"1F4AE","j":["flower","japanese","spring"]},"rosette":{"a":"Rosette","b":"1F3F5","j":["plant","flower","decoration","military"]},"rose":{"a":"Rose","b":"1F339","j":["flower","flowers","valentines","love","spring"]},"wilted-flower":{"a":"Wilted Flower","b":"1F940","j":["flower","wilted","plant","nature"]},"hibiscus":{"a":"Hibiscus","b":"1F33A","j":["flower","plant","vegetable","flowers","beach"]},"sunflower":{"a":"Sunflower","b":"1F33B","j":["flower","sun","nature","plant","fall"]},"blossom":{"a":"Blossom","b":"1F33C","j":["flower","nature","flowers","yellow"]},"tulip":{"a":"Tulip","b":"1F337","j":["flower","flowers","plant","nature","summer","spring"]},"seedling":{"a":"Seedling","b":"1F331","j":["young","plant","nature","grass","lawn","spring"]},"potted-plant":{"a":"Potted Plant","b":"1FAB4","j":["boring","grow","house","nurturing","plant","useless","greenery"]},"evergreen-tree":{"a":"Evergreen Tree","b":"1F332","j":["tree","plant","nature"]},"deciduous-tree":{"a":"Deciduous Tree","b":"1F333","j":["deciduous","shedding","tree","plant","nature"]},"palm-tree":{"a":"Palm Tree","b":"1F334","j":["palm","tree","plant","vegetable","nature","summer","beach","mojito","tropical"]},"cactus":{"a":"Cactus","b":"1F335","j":["plant","vegetable","nature"]},"sheaf-of-rice":{"a":"Sheaf of Rice","b":"1F33E","j":["ear","grain","rice","nature","plant"]},"herb":{"a":"Herb","b":"1F33F","j":["leaf","vegetable","plant","medicine","weed","grass","lawn"]},"shamrock":{"a":"Shamrock","b":"2618","j":["plant","vegetable","nature","irish","clover"]},"four-leaf-clover":{"a":"Four Leaf Clover","b":"1F340","j":["4","clover","four","four-leaf clover","leaf","vegetable","plant","nature","lucky","irish"]},"maple-leaf":{"a":"Maple Leaf","b":"1F341","j":["falling","leaf","maple","nature","plant","vegetable","ca","fall"]},"fallen-leaf":{"a":"Fallen Leaf","b":"1F342","j":["falling","leaf","nature","plant","vegetable","leaves"]},"leaf-fluttering-in-wind":{"a":"Leaf Fluttering in Wind","b":"1F343","j":["blow","flutter","leaf","wind","nature","plant","tree","vegetable","grass","lawn","spring"]},"grapes":{"a":"Grapes","b":"1F347","j":["fruit","grape","food","wine"]},"melon":{"a":"Melon","b":"1F348","j":["fruit","nature","food"]},"watermelon":{"a":"Watermelon","b":"1F349","j":["fruit","food","picnic","summer"]},"tangerine":{"a":"Tangerine","b":"1F34A","j":["fruit","orange","food","nature"]},"lemon":{"a":"Lemon","b":"1F34B","j":["citrus","fruit","nature"]},"banana":{"a":"Banana","b":"1F34C","j":["fruit","food","monkey"]},"pineapple":{"a":"Pineapple","b":"1F34D","j":["fruit","nature","food"]},"mango":{"a":"Mango","b":"1F96D","j":["fruit","tropical","food"]},"red-apple":{"a":"Red Apple","b":"1F34E","j":["apple","fruit","red","mac","school"]},"green-apple":{"a":"Green Apple","b":"1F34F","j":["apple","fruit","green","nature"]},"pear":{"a":"Pear","b":"1F350","j":["fruit","nature","food"]},"peach":{"a":"Peach","b":"1F351","j":["fruit","nature","food"]},"cherries":{"a":"Cherries","b":"1F352","j":["berries","cherry","fruit","red","food"]},"strawberry":{"a":"Strawberry","b":"1F353","j":["berry","fruit","food","nature"]},"blueberries":{"a":"Blueberries","b":"1FAD0","j":["berry","bilberry","blue","blueberry","fruit"]},"kiwi-fruit":{"a":"Kiwi Fruit","b":"1F95D","j":["food","fruit","kiwi"]},"tomato":{"a":"Tomato","b":"1F345","j":["fruit","vegetable","nature","food"]},"olive":{"a":"Olive","b":"1FAD2","j":["food","fruit"]},"coconut":{"a":"Coconut","b":"1F965","j":["palm","piña colada","fruit","nature","food"]},"avocado":{"a":"Avocado","b":"1F951","j":["food","fruit"]},"eggplant":{"a":"Eggplant","b":"1F346","j":["aubergine","vegetable","nature","food"]},"potato":{"a":"Potato","b":"1F954","j":["food","vegetable","tuber","vegatable","starch"]},"carrot":{"a":"Carrot","b":"1F955","j":["food","vegetable","orange"]},"ear-of-corn":{"a":"Ear of Corn","b":"1F33D","j":["corn","ear","maize","maze","food","vegetable","plant"]},"hot-pepper":{"a":"Hot Pepper","b":"1F336","j":["hot","pepper","food","spicy","chilli","chili"]},"bell-pepper":{"a":"Bell Pepper","b":"1FAD1","j":["capsicum","pepper","vegetable","fruit","plant"]},"cucumber":{"a":"Cucumber","b":"1F952","j":["food","pickle","vegetable","fruit"]},"leafy-green":{"a":"Leafy Green","b":"1F96C","j":["bok choy","cabbage","kale","lettuce","food","vegetable","plant"]},"broccoli":{"a":"Broccoli","b":"1F966","j":["wild cabbage","fruit","food","vegetable"]},"garlic":{"a":"Garlic","b":"1F9C4","j":["flavoring","food","spice","cook"]},"onion":{"a":"Onion","b":"1F9C5","j":["flavoring","cook","food","spice"]},"mushroom":{"a":"Mushroom","b":"1F344","j":["toadstool","plant","vegetable"]},"peanuts":{"a":"Peanuts","b":"1F95C","j":["food","nut","peanut","vegetable"]},"chestnut":{"a":"Chestnut","b":"1F330","j":["plant","food","squirrel"]},"bread":{"a":"Bread","b":"1F35E","j":["loaf","food","wheat","breakfast","toast"]},"croissant":{"a":"Croissant","b":"1F950","j":["bread","breakfast","food","french","roll"]},"baguette-bread":{"a":"Baguette Bread","b":"1F956","j":["baguette","bread","food","french"]},"flatbread":{"a":"Flatbread","b":"1FAD3","j":["arepa","lavash","naan","pita","flour","food"]},"pretzel":{"a":"Pretzel","b":"1F968","j":["twisted","convoluted","food","bread"]},"bagel":{"a":"Bagel","b":"1F96F","j":["bakery","breakfast","schmear","food","bread"]},"pancakes":{"a":"Pancakes","b":"1F95E","j":["breakfast","crêpe","food","hotcake","pancake","flapjacks","hotcakes"]},"waffle":{"a":"Waffle","b":"1F9C7","j":["breakfast","indecisive","iron","food"]},"cheese-wedge":{"a":"Cheese Wedge","b":"1F9C0","j":["cheese","food","chadder"]},"meat-on-bone":{"a":"Meat on Bone","b":"1F356","j":["bone","meat","good","food","drumstick"]},"poultry-leg":{"a":"Poultry Leg","b":"1F357","j":["bone","chicken","drumstick","leg","poultry","food","meat","bird","turkey"]},"cut-of-meat":{"a":"Cut of Meat","b":"1F969","j":["chop","lambchop","porkchop","steak","food","cow","meat","cut"]},"bacon":{"a":"Bacon","b":"1F953","j":["breakfast","food","meat","pork","pig"]},"hamburger":{"a":"Hamburger","b":"1F354","j":["burger","meat","fast food","beef","cheeseburger","mcdonalds","burger king"]},"french-fries":{"a":"French Fries","b":"1F35F","j":["french","fries","chips","snack","fast food"]},"pizza":{"a":"Pizza","b":"1F355","j":["cheese","slice","food","party"]},"hot-dog":{"a":"Hot Dog","b":"1F32D","j":["frankfurter","hotdog","sausage","food"]},"sandwich":{"a":"Sandwich","b":"1F96A","j":["bread","food","lunch"]},"taco":{"a":"Taco","b":"1F32E","j":["mexican","food"]},"burrito":{"a":"Burrito","b":"1F32F","j":["mexican","wrap","food"]},"tamale":{"a":"Tamale","b":"1FAD4","j":["mexican","wrapped","food","masa"]},"stuffed-flatbread":{"a":"Stuffed Flatbread","b":"1F959","j":["falafel","flatbread","food","gyro","kebab","stuffed"]},"falafel":{"a":"Falafel","b":"1F9C6","j":["chickpea","meatball","food"]},"egg":{"a":"Egg","b":"1F95A","j":["breakfast","food","chicken"]},"cooking":{"a":"Cooking","b":"1F373","j":["breakfast","egg","frying","pan","food","kitchen"]},"shallow-pan-of-food":{"a":"Shallow Pan of Food","b":"1F958","j":["casserole","food","paella","pan","shallow","cooking"]},"pot-of-food":{"a":"Pot of Food","b":"1F372","j":["pot","stew","food","meat","soup"]},"fondue":{"a":"Fondue","b":"1FAD5","j":["cheese","chocolate","melted","pot","Swiss","food"]},"bowl-with-spoon":{"a":"Bowl with Spoon","b":"1F963","j":["breakfast","cereal","congee","oatmeal","porridge","food"]},"green-salad":{"a":"Green Salad","b":"1F957","j":["food","green","salad","healthy","lettuce"]},"popcorn":{"a":"Popcorn","b":"1F37F","j":["food","movie theater","films","snack"]},"butter":{"a":"Butter","b":"1F9C8","j":["dairy","food","cook"]},"salt":{"a":"Salt","b":"1F9C2","j":["condiment","shaker"]},"canned-food":{"a":"Canned Food","b":"1F96B","j":["can","food","soup"]},"bento-box":{"a":"Bento Box","b":"1F371","j":["bento","box","food","japanese"]},"rice-cracker":{"a":"Rice Cracker","b":"1F358","j":["cracker","rice","food","japanese"]},"rice-ball":{"a":"Rice Ball","b":"1F359","j":["ball","Japanese","rice","food","japanese"]},"cooked-rice":{"a":"Cooked Rice","b":"1F35A","j":["cooked","rice","food","china","asian"]},"curry-rice":{"a":"Curry Rice","b":"1F35B","j":["curry","rice","food","spicy","hot","indian"]},"steaming-bowl":{"a":"Steaming Bowl","b":"1F35C","j":["bowl","noodle","ramen","steaming","food","japanese","chopsticks"]},"spaghetti":{"a":"Spaghetti","b":"1F35D","j":["pasta","food","italian","noodle"]},"roasted-sweet-potato":{"a":"Roasted Sweet Potato","b":"1F360","j":["potato","roasted","sweet","food","nature"]},"oden":{"a":"Oden","b":"1F362","j":["kebab","seafood","skewer","stick","food","japanese"]},"sushi":{"a":"Sushi","b":"1F363","j":["food","fish","japanese","rice"]},"fried-shrimp":{"a":"Fried Shrimp","b":"1F364","j":["fried","prawn","shrimp","tempura","food","animal","appetizer","summer"]},"fish-cake-with-swirl":{"a":"Fish Cake with Swirl","b":"1F365","j":["cake","fish","pastry","swirl","food","japan","sea","beach","narutomaki","pink","kamaboko","surimi","ramen"]},"moon-cake":{"a":"Moon Cake","b":"1F96E","j":["autumn","festival","yuèbǐng","food"]},"dango":{"a":"Dango","b":"1F361","j":["dessert","Japanese","skewer","stick","sweet","food","japanese","barbecue","meat"]},"dumpling":{"a":"Dumpling","b":"1F95F","j":["empanada","gyōza","jiaozi","pierogi","potsticker","food"]},"fortune-cookie":{"a":"Fortune Cookie","b":"1F960","j":["prophecy","food"]},"takeout-box":{"a":"Takeout Box","b":"1F961","j":["oyster pail","food","leftovers"]},"crab":{"a":"Crab","b":"1F980","j":["Cancer","zodiac","animal","crustacean"]},"lobster":{"a":"Lobster","b":"1F99E","j":["bisque","claws","seafood","animal","nature"]},"shrimp":{"a":"Shrimp","b":"1F990","j":["food","shellfish","small","animal","ocean","nature","seafood"]},"squid":{"a":"Squid","b":"1F991","j":["food","molusc","animal","nature","ocean","sea"]},"oyster":{"a":"Oyster","b":"1F9AA","j":["diving","pearl","food"]},"soft-ice-cream":{"a":"Soft Ice Cream","b":"1F366","j":["cream","dessert","ice","icecream","soft","sweet","food","hot","summer"]},"shaved-ice":{"a":"Shaved Ice","b":"1F367","j":["dessert","ice","shaved","sweet","hot","summer"]},"ice-cream":{"a":"Ice Cream","b":"1F368","j":["cream","dessert","ice","sweet","food","hot"]},"doughnut":{"a":"Doughnut","b":"1F369","j":["breakfast","dessert","donut","sweet","food","snack"]},"cookie":{"a":"Cookie","b":"1F36A","j":["dessert","sweet","food","snack","oreo","chocolate"]},"birthday-cake":{"a":"Birthday Cake","b":"1F382","j":["birthday","cake","celebration","dessert","pastry","sweet","food"]},"shortcake":{"a":"Shortcake","b":"1F370","j":["cake","dessert","pastry","slice","sweet","food"]},"cupcake":{"a":"Cupcake","b":"1F9C1","j":["bakery","sweet","food","dessert"]},"pie":{"a":"Pie","b":"1F967","j":["filling","pastry","fruit","meat","food","dessert"]},"chocolate-bar":{"a":"Chocolate Bar","b":"1F36B","j":["bar","chocolate","dessert","sweet","food","snack"]},"candy":{"a":"Candy","b":"1F36C","j":["dessert","sweet","snack","lolly"]},"lollipop":{"a":"Lollipop","b":"1F36D","j":["candy","dessert","sweet","food","snack"]},"custard":{"a":"Custard","b":"1F36E","j":["dessert","pudding","sweet","food"]},"honey-pot":{"a":"Honey Pot","b":"1F36F","j":["honey","honeypot","pot","sweet","bees","kitchen"]},"baby-bottle":{"a":"Baby Bottle","b":"1F37C","j":["baby","bottle","drink","milk","food","container"]},"glass-of-milk":{"a":"Glass of Milk","b":"1F95B","j":["drink","glass","milk","beverage","cow"]},"hot-beverage":{"a":"Hot Beverage","b":"2615","j":["beverage","coffee","drink","hot","steaming","tea","caffeine","latte","espresso"]},"teapot":{"a":"Teapot","b":"1FAD6","j":["drink","pot","tea","hot"]},"teacup-without-handle":{"a":"Teacup Without Handle","b":"1F375","j":["beverage","cup","drink","tea","teacup","bowl","breakfast","green","british"]},"sake":{"a":"Sake","b":"1F376","j":["bar","beverage","bottle","cup","drink","wine","drunk","japanese","alcohol","booze"]},"bottle-with-popping-cork":{"a":"Bottle with Popping Cork","b":"1F37E","j":["bar","bottle","cork","drink","popping","wine","celebration"]},"wine-glass":{"a":"Wine Glass","b":"1F377","j":["bar","beverage","drink","glass","wine","drunk","alcohol","booze"]},"cocktail-glass":{"a":"Cocktail Glass","b":"1F378","j":["bar","cocktail","drink","glass","drunk","alcohol","beverage","booze","mojito"]},"tropical-drink":{"a":"Tropical Drink","b":"1F379","j":["bar","drink","tropical","beverage","cocktail","summer","beach","alcohol","booze","mojito"]},"beer-mug":{"a":"Beer Mug","b":"1F37A","j":["bar","beer","drink","mug","relax","beverage","drunk","party","pub","summer","alcohol","booze"]},"clinking-beer-mugs":{"a":"Clinking Beer Mugs","b":"1F37B","j":["bar","beer","clink","drink","mug","relax","beverage","drunk","party","pub","summer","alcohol","booze"]},"clinking-glasses":{"a":"Clinking Glasses","b":"1F942","j":["celebrate","clink","drink","glass","beverage","party","alcohol","cheers","wine","champagne","toast"]},"tumbler-glass":{"a":"Tumbler Glass","b":"1F943","j":["glass","liquor","shot","tumbler","whisky","drink","beverage","drunk","alcohol","booze","bourbon","scotch"]},"cup-with-straw":{"a":"Cup with Straw","b":"1F964","j":["juice","soda","malt","soft drink","water","drink"]},"bubble-tea":{"a":"Bubble Tea","b":"1F9CB","j":["bubble","milk","pearl","tea","taiwan","boba","milk tea","straw"]},"beverage-box":{"a":"Beverage Box","b":"1F9C3","j":["beverage","box","juice","straw","sweet","drink"]},"mate":{"a":"Mate","b":"1F9C9","j":["drink","tea","beverage"]},"ice":{"a":"Ice","b":"1F9CA","j":["cold","ice cube","iceberg","water"]},"chopsticks":{"a":"Chopsticks","b":"1F962","j":["hashi","jeotgarak","kuaizi","food"]},"fork-and-knife-with-plate":{"a":"Fork and Knife with Plate","b":"1F37D","j":["cooking","fork","knife","plate","food","eat","meal","lunch","dinner","restaurant"]},"fork-and-knife":{"a":"Fork and Knife","b":"1F374","j":["cooking","cutlery","fork","knife","kitchen"]},"spoon":{"a":"Spoon","b":"1F944","j":["tableware","cutlery","kitchen"]},"kitchen-knife":{"a":"Kitchen Knife","b":"1F52A","j":["cooking","hocho","knife","tool","weapon","blade","cutlery","kitchen"]},"amphora":{"a":"Amphora","b":"1F3FA","j":["Aquarius","cooking","drink","jug","zodiac","vase","jar"]},"globe-showing-europeafrica":{"a":"Globe Showing Europe-Africa","b":"1F30D","j":["Africa","earth","Europe","globe","globe showing Europe-Africa","world","globe_showing_europe_africa","international"]},"globe-showing-americas":{"a":"Globe Showing Americas","b":"1F30E","j":["Americas","earth","globe","globe showing Americas","world","USA","international"]},"globe-showing-asiaaustralia":{"a":"Globe Showing Asia-Australia","b":"1F30F","j":["Asia","Australia","earth","globe","globe showing Asia-Australia","world","globe_showing_asia_australia","east","international"]},"globe-with-meridians":{"a":"Globe with Meridians","b":"1F310","j":["earth","globe","meridians","world","international","internet","interweb","i18n"]},"world-map":{"a":"World Map","b":"1F5FA","j":["map","world","location","direction"]},"map-of-japan":{"a":"Map of Japan","b":"1F5FE","j":["Japan","map","map of Japan","nation","country","japanese","asia"]},"compass":{"a":"Compass","b":"1F9ED","j":["magnetic","navigation","orienteering"]},"snowcapped-mountain":{"a":"Snow-Capped Mountain","b":"1F3D4","j":["cold","mountain","snow","snow-capped mountain","snow_capped_mountain","photo","nature","environment","winter"]},"mountain":{"a":"Mountain","b":"26F0","j":["photo","nature","environment"]},"volcano":{"a":"Volcano","b":"1F30B","j":["eruption","mountain","photo","nature","disaster"]},"mount-fuji":{"a":"Mount Fuji","b":"1F5FB","j":["fuji","mountain","photo","nature","japanese"]},"camping":{"a":"Camping","b":"1F3D5","j":["photo","outdoors","tent"]},"beach-with-umbrella":{"a":"Beach with Umbrella","b":"1F3D6","j":["beach","umbrella","weather","summer","sunny","sand","mojito"]},"desert":{"a":"Desert","b":"1F3DC","j":["photo","warm","saharah"]},"desert-island":{"a":"Desert Island","b":"1F3DD","j":["desert","island","photo","tropical","mojito"]},"national-park":{"a":"National Park","b":"1F3DE","j":["park","photo","environment","nature"]},"stadium":{"a":"Stadium","b":"1F3DF","j":["photo","place","sports","concert","venue"]},"classical-building":{"a":"Classical Building","b":"1F3DB","j":["classical","art","culture","history"]},"building-construction":{"a":"Building Construction","b":"1F3D7","j":["construction","wip","working","progress"]},"brick":{"a":"Brick","b":"1F9F1","j":["bricks","clay","mortar","wall"]},"rock":{"a":"Rock","b":"1FAA8","j":["boulder","heavy","solid","stone"]},"wood":{"a":"Wood","b":"1FAB5","j":["log","lumber","timber","nature","trunk"]},"hut":{"a":"Hut","b":"1F6D6","j":["house","roundhouse","yurt","structure"]},"houses":{"a":"Houses","b":"1F3D8","j":["buildings","photo"]},"derelict-house":{"a":"Derelict House","b":"1F3DA","j":["derelict","house","abandon","evict","broken","building"]},"house":{"a":"House","b":"1F3E0","j":["home","building"]},"house-with-garden":{"a":"House with Garden","b":"1F3E1","j":["garden","home","house","plant","nature"]},"office-building":{"a":"Office Building","b":"1F3E2","j":["building","bureau","work"]},"japanese-post-office":{"a":"Japanese Post Office","b":"1F3E3","j":["Japanese","Japanese post office","post","building","envelope","communication"]},"post-office":{"a":"Post Office","b":"1F3E4","j":["European","post","building","email"]},"hospital":{"a":"Hospital","b":"1F3E5","j":["doctor","medicine","building","health","surgery"]},"bank":{"a":"Bank","b":"1F3E6","j":["building","money","sales","cash","business","enterprise"]},"hotel":{"a":"Hotel","b":"1F3E8","j":["building","accomodation","checkin"]},"love-hotel":{"a":"Love Hotel","b":"1F3E9","j":["hotel","love","like","affection","dating"]},"convenience-store":{"a":"Convenience Store","b":"1F3EA","j":["convenience","store","building","shopping","groceries"]},"school":{"a":"School","b":"1F3EB","j":["building","student","education","learn","teach"]},"department-store":{"a":"Department Store","b":"1F3EC","j":["department","store","building","shopping","mall"]},"factory":{"a":"Factory","b":"1F3ED","j":["building","industry","pollution","smoke"]},"japanese-castle":{"a":"Japanese Castle","b":"1F3EF","j":["castle","Japanese","photo","building"]},"castle":{"a":"Castle","b":"1F3F0","j":["European","building","royalty","history"]},"wedding":{"a":"Wedding","b":"1F492","j":["chapel","romance","love","like","affection","couple","marriage","bride","groom"]},"tokyo-tower":{"a":"Tokyo Tower","b":"1F5FC","j":["Tokyo","tower","photo","japanese"]},"statue-of-liberty":{"a":"Statue of Liberty","b":"1F5FD","j":["liberty","statue","american","newyork"]},"church":{"a":"Church","b":"26EA","j":["Christian","cross","religion","building","christ"]},"mosque":{"a":"Mosque","b":"1F54C","j":["islam","Muslim","religion","worship","minaret"]},"hindu-temple":{"a":"Hindu Temple","b":"1F6D5","j":["hindu","temple","religion"]},"synagogue":{"a":"Synagogue","b":"1F54D","j":["Jew","Jewish","religion","temple","judaism","worship","jewish"]},"shinto-shrine":{"a":"Shinto Shrine","b":"26E9","j":["religion","shinto","shrine","temple","japan","kyoto"]},"kaaba":{"a":"Kaaba","b":"1F54B","j":["islam","Muslim","religion","mecca","mosque"]},"fountain":{"a":"Fountain","b":"26F2","j":["photo","summer","water","fresh"]},"tent":{"a":"Tent","b":"26FA","j":["camping","photo","outdoors"]},"foggy":{"a":"Foggy","b":"1F301","j":["fog","photo","mountain"]},"night-with-stars":{"a":"Night with Stars","b":"1F303","j":["night","star","evening","city","downtown"]},"cityscape":{"a":"Cityscape","b":"1F3D9","j":["city","photo","night life","urban"]},"sunrise-over-mountains":{"a":"Sunrise over Mountains","b":"1F304","j":["morning","mountain","sun","sunrise","view","vacation","photo"]},"sunrise":{"a":"Sunrise","b":"1F305","j":["morning","sun","view","vacation","photo"]},"cityscape-at-dusk":{"a":"Cityscape at Dusk","b":"1F306","j":["city","dusk","evening","landscape","sunset","photo","sky","buildings"]},"sunset":{"a":"Sunset","b":"1F307","j":["dusk","sun","photo","good morning","dawn"]},"bridge-at-night":{"a":"Bridge at Night","b":"1F309","j":["bridge","night","photo","sanfrancisco"]},"hot-springs":{"a":"Hot Springs","b":"2668","j":["hot","hotsprings","springs","steaming","bath","warm","relax"]},"carousel-horse":{"a":"Carousel Horse","b":"1F3A0","j":["carousel","horse","photo","carnival"]},"ferris-wheel":{"a":"Ferris Wheel","b":"1F3A1","j":["amusement park","ferris","wheel","photo","carnival","londoneye"]},"roller-coaster":{"a":"Roller Coaster","b":"1F3A2","j":["amusement park","coaster","roller","carnival","playground","photo","fun"]},"barber-pole":{"a":"Barber Pole","b":"1F488","j":["barber","haircut","pole","hair","salon","style"]},"circus-tent":{"a":"Circus Tent","b":"1F3AA","j":["circus","tent","festival","carnival","party"]},"locomotive":{"a":"Locomotive","b":"1F682","j":["engine","railway","steam","train","transportation","vehicle"]},"railway-car":{"a":"Railway Car","b":"1F683","j":["car","electric","railway","train","tram","trolleybus","transportation","vehicle"]},"highspeed-train":{"a":"High-Speed Train","b":"1F684","j":["high-speed train","railway","shinkansen","speed","train","high_speed_train","transportation","vehicle"]},"bullet-train":{"a":"Bullet Train","b":"1F685","j":["bullet","railway","shinkansen","speed","train","transportation","vehicle","fast","public","travel"]},"train":{"a":"Train","b":"1F686","j":["railway","transportation","vehicle"]},"metro":{"a":"Metro","b":"1F687","j":["subway","transportation","blue-square","mrt","underground","tube"]},"light-rail":{"a":"Light Rail","b":"1F688","j":["railway","transportation","vehicle"]},"station":{"a":"Station","b":"1F689","j":["railway","train","transportation","vehicle","public"]},"tram":{"a":"Tram","b":"1F68A","j":["trolleybus","transportation","vehicle"]},"monorail":{"a":"Monorail","b":"1F69D","j":["vehicle","transportation"]},"mountain-railway":{"a":"Mountain Railway","b":"1F69E","j":["car","mountain","railway","transportation","vehicle"]},"tram-car":{"a":"Tram Car","b":"1F68B","j":["car","tram","trolleybus","transportation","vehicle","carriage","public","travel"]},"bus":{"a":"Bus","b":"1F68C","j":["vehicle","car","transportation"]},"oncoming-bus":{"a":"Oncoming Bus","b":"1F68D","j":["bus","oncoming","vehicle","transportation"]},"trolleybus":{"a":"Trolleybus","b":"1F68E","j":["bus","tram","trolley","bart","transportation","vehicle"]},"minibus":{"a":"Minibus","b":"1F690","j":["bus","vehicle","car","transportation"]},"ambulance":{"a":"Ambulance","b":"1F691","j":["vehicle","health","911","hospital"]},"fire-engine":{"a":"Fire Engine","b":"1F692","j":["engine","fire","truck","transportation","cars","vehicle"]},"police-car":{"a":"Police Car","b":"1F693","j":["car","patrol","police","vehicle","cars","transportation","law","legal","enforcement"]},"oncoming-police-car":{"a":"Oncoming Police Car","b":"1F694","j":["car","oncoming","police","vehicle","law","legal","enforcement","911"]},"taxi":{"a":"Taxi","b":"1F695","j":["vehicle","uber","cars","transportation"]},"oncoming-taxi":{"a":"Oncoming Taxi","b":"1F696","j":["oncoming","taxi","vehicle","cars","uber"]},"automobile":{"a":"Automobile","b":"1F697","j":["car","red","transportation","vehicle"]},"oncoming-automobile":{"a":"Oncoming Automobile","b":"1F698","j":["automobile","car","oncoming","vehicle","transportation"]},"sport-utility-vehicle":{"a":"Sport Utility Vehicle","b":"1F699","j":["recreational","sport utility","transportation","vehicle"]},"pickup-truck":{"a":"Pickup Truck","b":"1F6FB","j":["pick-up","pickup","truck","car","transportation"]},"delivery-truck":{"a":"Delivery Truck","b":"1F69A","j":["delivery","truck","cars","transportation"]},"articulated-lorry":{"a":"Articulated Lorry","b":"1F69B","j":["lorry","semi","truck","vehicle","cars","transportation","express"]},"tractor":{"a":"Tractor","b":"1F69C","j":["vehicle","car","farming","agriculture"]},"racing-car":{"a":"Racing Car","b":"1F3CE","j":["car","racing","sports","race","fast","formula","f1"]},"motorcycle":{"a":"Motorcycle","b":"1F3CD","j":["racing","race","sports","fast"]},"motor-scooter":{"a":"Motor Scooter","b":"1F6F5","j":["motor","scooter","vehicle","vespa","sasha"]},"manual-wheelchair":{"a":"Manual Wheelchair","b":"1F9BD","j":["accessibility"]},"motorized-wheelchair":{"a":"Motorized Wheelchair","b":"1F9BC","j":["accessibility"]},"auto-rickshaw":{"a":"Auto Rickshaw","b":"1F6FA","j":["tuk tuk","move","transportation"]},"bicycle":{"a":"Bicycle","b":"1F6B2","j":["bike","sports","exercise","hipster"]},"kick-scooter":{"a":"Kick Scooter","b":"1F6F4","j":["kick","scooter","vehicle","razor"]},"skateboard":{"a":"Skateboard","b":"1F6F9","j":["board"]},"roller-skate":{"a":"Roller Skate","b":"1F6FC","j":["roller","skate","footwear","sports"]},"bus-stop":{"a":"Bus Stop","b":"1F68F","j":["bus","busstop","stop","transportation","wait"]},"motorway":{"a":"Motorway","b":"1F6E3","j":["highway","road","cupertino","interstate"]},"railway-track":{"a":"Railway Track","b":"1F6E4","j":["railway","train","transportation"]},"oil-drum":{"a":"Oil Drum","b":"1F6E2","j":["drum","oil","barrell"]},"fuel-pump":{"a":"Fuel Pump","b":"26FD","j":["diesel","fuel","fuelpump","gas","pump","station","gas station","petroleum"]},"police-car-light":{"a":"Police Car Light","b":"1F6A8","j":["beacon","car","light","police","revolving","ambulance","911","emergency","alert","error","pinged","law","legal"]},"horizontal-traffic-light":{"a":"Horizontal Traffic Light","b":"1F6A5","j":["light","signal","traffic","transportation"]},"vertical-traffic-light":{"a":"Vertical Traffic Light","b":"1F6A6","j":["light","signal","traffic","transportation","driving"]},"stop-sign":{"a":"Stop Sign","b":"1F6D1","j":["octagonal","sign","stop"]},"construction":{"a":"Construction","b":"1F6A7","j":["barrier","wip","progress","caution","warning"]},"anchor":{"a":"Anchor","b":"2693","j":["ship","tool","ferry","sea","boat"]},"sailboat":{"a":"Sailboat","b":"26F5","j":["boat","resort","sea","yacht","ship","summer","transportation","water","sailing"]},"canoe":{"a":"Canoe","b":"1F6F6","j":["boat","paddle","water","ship"]},"speedboat":{"a":"Speedboat","b":"1F6A4","j":["boat","ship","transportation","vehicle","summer"]},"passenger-ship":{"a":"Passenger Ship","b":"1F6F3","j":["passenger","ship","yacht","cruise","ferry"]},"ferry":{"a":"Ferry","b":"26F4","j":["boat","passenger","ship","yacht"]},"motor-boat":{"a":"Motor Boat","b":"1F6E5","j":["boat","motorboat","ship"]},"ship":{"a":"Ship","b":"1F6A2","j":["boat","passenger","transportation","titanic","deploy"]},"airplane":{"a":"Airplane","b":"2708","j":["aeroplane","vehicle","transportation","flight","fly"]},"small-airplane":{"a":"Small Airplane","b":"1F6E9","j":["aeroplane","airplane","flight","transportation","fly","vehicle"]},"airplane-departure":{"a":"Airplane Departure","b":"1F6EB","j":["aeroplane","airplane","check-in","departure","departures","airport","flight","landing"]},"airplane-arrival":{"a":"Airplane Arrival","b":"1F6EC","j":["aeroplane","airplane","arrivals","arriving","landing","airport","flight","boarding"]},"parachute":{"a":"Parachute","b":"1FA82","j":["hang-glide","parasail","skydive","fly","glide"]},"seat":{"a":"Seat","b":"1F4BA","j":["chair","sit","airplane","transport","bus","flight","fly"]},"helicopter":{"a":"Helicopter","b":"1F681","j":["vehicle","transportation","fly"]},"suspension-railway":{"a":"Suspension Railway","b":"1F69F","j":["railway","suspension","vehicle","transportation"]},"mountain-cableway":{"a":"Mountain Cableway","b":"1F6A0","j":["cable","gondola","mountain","transportation","vehicle","ski"]},"aerial-tramway":{"a":"Aerial Tramway","b":"1F6A1","j":["aerial","cable","car","gondola","tramway","transportation","vehicle","ski"]},"satellite":{"a":"Satellite","b":"1F6F0","j":["space","communication","gps","orbit","spaceflight","NASA","ISS"]},"rocket":{"a":"Rocket","b":"1F680","j":["space","launch","ship","staffmode","NASA","outer space","outer_space","fly"]},"flying-saucer":{"a":"Flying Saucer","b":"1F6F8","j":["UFO","transportation","vehicle","ufo"]},"bellhop-bell":{"a":"Bellhop Bell","b":"1F6CE","j":["bell","bellhop","hotel","service"]},"luggage":{"a":"Luggage","b":"1F9F3","j":["packing","travel"]},"hourglass-done":{"a":"Hourglass Done","b":"231B","j":["sand","timer","time","clock","oldschool","limit","exam","quiz","test"]},"hourglass-not-done":{"a":"Hourglass Not Done","b":"23F3","j":["hourglass","sand","timer","oldschool","time","countdown"]},"watch":{"a":"Watch","b":"231A","j":["clock","time","accessories"]},"alarm-clock":{"a":"Alarm Clock","b":"23F0","j":["alarm","clock","time","wake"]},"stopwatch":{"a":"Stopwatch","b":"23F1","j":["clock","time","deadline"]},"timer-clock":{"a":"Timer Clock","b":"23F2","j":["clock","timer","alarm"]},"mantelpiece-clock":{"a":"Mantelpiece Clock","b":"1F570","j":["clock","time"]},"twelve-oclock":{"a":"Twelve O’Clock","b":"1F55B","j":["00","12","12:00","clock","o’clock","twelve","twelve_o_clock","time","noon","midnight","midday","late","early","schedule"]},"twelvethirty":{"a":"Twelve-Thirty","b":"1F567","j":["12","12:30","clock","thirty","twelve","twelve-thirty","twelve_thirty","time","late","early","schedule"]},"one-oclock":{"a":"One O’Clock","b":"1F550","j":["00","1","1:00","clock","o’clock","one","one_o_clock","time","late","early","schedule"]},"onethirty":{"a":"One-Thirty","b":"1F55C","j":["1","1:30","clock","one","one-thirty","thirty","one_thirty","time","late","early","schedule"]},"two-oclock":{"a":"Two O’Clock","b":"1F551","j":["00","2","2:00","clock","o’clock","two","two_o_clock","time","late","early","schedule"]},"twothirty":{"a":"Two-Thirty","b":"1F55D","j":["2","2:30","clock","thirty","two","two-thirty","two_thirty","time","late","early","schedule"]},"three-oclock":{"a":"Three O’Clock","b":"1F552","j":["00","3","3:00","clock","o’clock","three","three_o_clock","time","late","early","schedule"]},"threethirty":{"a":"Three-Thirty","b":"1F55E","j":["3","3:30","clock","thirty","three","three-thirty","three_thirty","time","late","early","schedule"]},"four-oclock":{"a":"Four O’Clock","b":"1F553","j":["00","4","4:00","clock","four","o’clock","four_o_clock","time","late","early","schedule"]},"fourthirty":{"a":"Four-Thirty","b":"1F55F","j":["4","4:30","clock","four","four-thirty","thirty","four_thirty","time","late","early","schedule"]},"five-oclock":{"a":"Five O’Clock","b":"1F554","j":["00","5","5:00","clock","five","o’clock","five_o_clock","time","late","early","schedule"]},"fivethirty":{"a":"Five-Thirty","b":"1F560","j":["5","5:30","clock","five","five-thirty","thirty","five_thirty","time","late","early","schedule"]},"six-oclock":{"a":"Six O’Clock","b":"1F555","j":["00","6","6:00","clock","o’clock","six","six_o_clock","time","late","early","schedule","dawn","dusk"]},"sixthirty":{"a":"Six-Thirty","b":"1F561","j":["6","6:30","clock","six","six-thirty","thirty","six_thirty","time","late","early","schedule"]},"seven-oclock":{"a":"Seven O’Clock","b":"1F556","j":["00","7","7:00","clock","o’clock","seven","seven_o_clock","time","late","early","schedule"]},"seventhirty":{"a":"Seven-Thirty","b":"1F562","j":["7","7:30","clock","seven","seven-thirty","thirty","seven_thirty","time","late","early","schedule"]},"eight-oclock":{"a":"Eight O’Clock","b":"1F557","j":["00","8","8:00","clock","eight","o’clock","eight_o_clock","time","late","early","schedule"]},"eightthirty":{"a":"Eight-Thirty","b":"1F563","j":["8","8:30","clock","eight","eight-thirty","thirty","eight_thirty","time","late","early","schedule"]},"nine-oclock":{"a":"Nine O’Clock","b":"1F558","j":["00","9","9:00","clock","nine","o’clock","nine_o_clock","time","late","early","schedule"]},"ninethirty":{"a":"Nine-Thirty","b":"1F564","j":["9","9:30","clock","nine","nine-thirty","thirty","nine_thirty","time","late","early","schedule"]},"ten-oclock":{"a":"Ten O’Clock","b":"1F559","j":["00","10","10:00","clock","o’clock","ten","ten_o_clock","time","late","early","schedule"]},"tenthirty":{"a":"Ten-Thirty","b":"1F565","j":["10","10:30","clock","ten","ten-thirty","thirty","ten_thirty","time","late","early","schedule"]},"eleven-oclock":{"a":"Eleven O’Clock","b":"1F55A","j":["00","11","11:00","clock","eleven","o’clock","eleven_o_clock","time","late","early","schedule"]},"eleventhirty":{"a":"Eleven-Thirty","b":"1F566","j":["11","11:30","clock","eleven","eleven-thirty","thirty","eleven_thirty","time","late","early","schedule"]},"new-moon":{"a":"New Moon","b":"1F311","j":["dark","moon","nature","twilight","planet","space","night","evening","sleep"]},"waxing-crescent-moon":{"a":"Waxing Crescent Moon","b":"1F312","j":["crescent","moon","waxing","nature","twilight","planet","space","night","evening","sleep"]},"first-quarter-moon":{"a":"First Quarter Moon","b":"1F313","j":["moon","quarter","nature","twilight","planet","space","night","evening","sleep"]},"waxing-gibbous-moon":{"a":"Waxing Gibbous Moon","b":"1F314","j":["gibbous","moon","waxing","nature","night","sky","gray","twilight","planet","space","evening","sleep"]},"full-moon":{"a":"Full Moon","b":"1F315","j":["full","moon","nature","yellow","twilight","planet","space","night","evening","sleep"]},"waning-gibbous-moon":{"a":"Waning Gibbous Moon","b":"1F316","j":["gibbous","moon","waning","nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"]},"last-quarter-moon":{"a":"Last Quarter Moon","b":"1F317","j":["moon","quarter","nature","twilight","planet","space","night","evening","sleep"]},"waning-crescent-moon":{"a":"Waning Crescent Moon","b":"1F318","j":["crescent","moon","waning","nature","twilight","planet","space","night","evening","sleep"]},"crescent-moon":{"a":"Crescent Moon","b":"1F319","j":["crescent","moon","night","sleep","sky","evening","magic"]},"new-moon-face":{"a":"New Moon Face","b":"1F31A","j":["face","moon","nature","twilight","planet","space","night","evening","sleep"]},"first-quarter-moon-face":{"a":"First Quarter Moon Face","b":"1F31B","j":["face","moon","quarter","nature","twilight","planet","space","night","evening","sleep"]},"last-quarter-moon-face":{"a":"Last Quarter Moon Face","b":"1F31C","j":["face","moon","quarter","nature","twilight","planet","space","night","evening","sleep"]},"thermometer":{"a":"Thermometer","b":"1F321","j":["weather","temperature","hot","cold"]},"sun":{"a":"Sun","b":"2600","j":["bright","rays","sunny","weather","nature","brightness","summer","beach","spring"]},"full-moon-face":{"a":"Full Moon Face","b":"1F31D","j":["bright","face","full","moon","nature","twilight","planet","space","night","evening","sleep"]},"sun-with-face":{"a":"Sun with Face","b":"1F31E","j":["bright","face","sun","nature","morning","sky"]},"ringed-planet":{"a":"Ringed Planet","b":"1FA90","j":["saturn","saturnine","outerspace"]},"star":{"a":"Star","b":"2B50","j":["night","yellow"]},"glowing-star":{"a":"Glowing Star","b":"1F31F","j":["glittery","glow","shining","sparkle","star","night","awesome","good","magic"]},"shooting-star":{"a":"Shooting Star","b":"1F320","j":["falling","shooting","star","night","photo"]},"milky-way":{"a":"Milky Way","b":"1F30C","j":["space","photo","stars"]},"cloud":{"a":"Cloud","b":"2601","j":["weather","sky"]},"sun-behind-cloud":{"a":"Sun Behind Cloud","b":"26C5","j":["cloud","sun","weather","nature","cloudy","morning","fall","spring"]},"cloud-with-lightning-and-rain":{"a":"Cloud with Lightning and Rain","b":"26C8","j":["cloud","rain","thunder","weather","lightning"]},"sun-behind-small-cloud":{"a":"Sun Behind Small Cloud","b":"1F324","j":["cloud","sun","weather"]},"sun-behind-large-cloud":{"a":"Sun Behind Large Cloud","b":"1F325","j":["cloud","sun","weather"]},"sun-behind-rain-cloud":{"a":"Sun Behind Rain Cloud","b":"1F326","j":["cloud","rain","sun","weather"]},"cloud-with-rain":{"a":"Cloud with Rain","b":"1F327","j":["cloud","rain","weather"]},"cloud-with-snow":{"a":"Cloud with Snow","b":"1F328","j":["cloud","cold","snow","weather"]},"cloud-with-lightning":{"a":"Cloud with Lightning","b":"1F329","j":["cloud","lightning","weather","thunder"]},"tornado":{"a":"Tornado","b":"1F32A","j":["cloud","whirlwind","weather","cyclone","twister"]},"fog":{"a":"Fog","b":"1F32B","j":["cloud","weather"]},"wind-face":{"a":"Wind Face","b":"1F32C","j":["blow","cloud","face","wind","gust","air"]},"cyclone":{"a":"Cyclone","b":"1F300","j":["dizzy","hurricane","twister","typhoon","weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado"]},"rainbow":{"a":"Rainbow","b":"1F308","j":["rain","nature","happy","unicorn_face","photo","sky","spring"]},"closed-umbrella":{"a":"Closed Umbrella","b":"1F302","j":["clothing","rain","umbrella","weather","drizzle"]},"umbrella":{"a":"Umbrella","b":"2602","j":["clothing","rain","weather","spring"]},"umbrella-with-rain-drops":{"a":"Umbrella with Rain Drops","b":"2614","j":["clothing","drop","rain","umbrella","rainy","weather","spring"]},"umbrella-on-ground":{"a":"Umbrella on Ground","b":"26F1","j":["rain","sun","umbrella","weather","summer"]},"high-voltage":{"a":"High Voltage","b":"26A1","j":["danger","electric","lightning","voltage","zap","thunder","weather","lightning bolt","fast"]},"snowflake":{"a":"Snowflake","b":"2744","j":["cold","snow","winter","season","weather","christmas","xmas"]},"snowman":{"a":"Snowman","b":"2603","j":["cold","snow","winter","season","weather","christmas","xmas","frozen"]},"snowman-without-snow":{"a":"Snowman Without Snow","b":"26C4","j":["cold","snow","snowman","winter","season","weather","christmas","xmas","frozen","without_snow"]},"comet":{"a":"Comet","b":"2604","j":["space"]},"fire":{"a":"Fire","b":"1F525","j":["flame","tool","hot","cook"]},"droplet":{"a":"Droplet","b":"1F4A7","j":["cold","comic","drop","sweat","water","drip","faucet","spring"]},"water-wave":{"a":"Water Wave","b":"1F30A","j":["ocean","water","wave","sea","nature","tsunami","disaster"]},"jackolantern":{"a":"Jack-O-Lantern","b":"1F383","j":["celebration","halloween","jack","jack-o-lantern","lantern","jack_o_lantern","light","pumpkin","creepy","fall"]},"christmas-tree":{"a":"Christmas Tree","b":"1F384","j":["celebration","Christmas","tree","festival","vacation","december","xmas"]},"fireworks":{"a":"Fireworks","b":"1F386","j":["celebration","photo","festival","carnival","congratulations"]},"sparkler":{"a":"Sparkler","b":"1F387","j":["celebration","fireworks","sparkle","stars","night","shine"]},"firecracker":{"a":"Firecracker","b":"1F9E8","j":["dynamite","explosive","fireworks","boom","explode","explosion"]},"sparkles":{"a":"Sparkles","b":"2728","j":["*","sparkle","star","stars","shine","shiny","cool","awesome","good","magic"]},"balloon":{"a":"Balloon","b":"1F388","j":["celebration","party","birthday","circus"]},"party-popper":{"a":"Party Popper","b":"1F389","j":["celebration","party","popper","tada","congratulations","birthday","magic","circus"]},"confetti-ball":{"a":"Confetti Ball","b":"1F38A","j":["ball","celebration","confetti","festival","party","birthday","circus"]},"tanabata-tree":{"a":"Tanabata Tree","b":"1F38B","j":["banner","celebration","Japanese","tree","plant","nature","branch","summer"]},"pine-decoration":{"a":"Pine Decoration","b":"1F38D","j":["bamboo","celebration","Japanese","pine","plant","nature","vegetable","panda"]},"japanese-dolls":{"a":"Japanese Dolls","b":"1F38E","j":["celebration","doll","festival","Japanese","Japanese dolls","japanese","toy","kimono"]},"carp-streamer":{"a":"Carp Streamer","b":"1F38F","j":["carp","celebration","streamer","fish","japanese","koinobori","banner"]},"wind-chime":{"a":"Wind Chime","b":"1F390","j":["bell","celebration","chime","wind","nature","ding","spring"]},"moon-viewing-ceremony":{"a":"Moon Viewing Ceremony","b":"1F391","j":["celebration","ceremony","moon","photo","japan","asia","tsukimi"]},"red-envelope":{"a":"Red Envelope","b":"1F9E7","j":["gift","good luck","hóngbāo","lai see","money"]},"ribbon":{"a":"Ribbon","b":"1F380","j":["celebration","decoration","pink","girl","bowtie"]},"wrapped-gift":{"a":"Wrapped Gift","b":"1F381","j":["box","celebration","gift","present","wrapped","birthday","christmas","xmas"]},"reminder-ribbon":{"a":"Reminder Ribbon","b":"1F397","j":["celebration","reminder","ribbon","sports","cause","support","awareness"]},"admission-tickets":{"a":"Admission Tickets","b":"1F39F","j":["admission","ticket","sports","concert","entrance"]},"ticket":{"a":"Ticket","b":"1F3AB","j":["admission","event","concert","pass"]},"military-medal":{"a":"Military Medal","b":"1F396","j":["celebration","medal","military","award","winning","army"]},"trophy":{"a":"Trophy","b":"1F3C6","j":["prize","win","award","contest","place","ftw","ceremony"]},"sports-medal":{"a":"Sports Medal","b":"1F3C5","j":["medal","award","winning"]},"1st-place-medal":{"a":"1st Place Medal","b":"1F947","j":["first","gold","medal","award","winning"]},"2nd-place-medal":{"a":"2nd Place Medal","b":"1F948","j":["medal","second","silver","award"]},"3rd-place-medal":{"a":"3rd Place Medal","b":"1F949","j":["bronze","medal","third","award"]},"soccer-ball":{"a":"Soccer Ball","b":"26BD","j":["ball","football","soccer","sports"]},"baseball":{"a":"Baseball","b":"26BE","j":["ball","sports","balls"]},"softball":{"a":"Softball","b":"1F94E","j":["ball","glove","underarm","sports","balls"]},"basketball":{"a":"Basketball","b":"1F3C0","j":["ball","hoop","sports","balls","NBA"]},"volleyball":{"a":"Volleyball","b":"1F3D0","j":["ball","game","sports","balls"]},"american-football":{"a":"American Football","b":"1F3C8","j":["american","ball","football","sports","balls","NFL"]},"rugby-football":{"a":"Rugby Football","b":"1F3C9","j":["ball","football","rugby","sports","team"]},"tennis":{"a":"Tennis","b":"1F3BE","j":["ball","racquet","sports","balls","green"]},"flying-disc":{"a":"Flying Disc","b":"1F94F","j":["ultimate","sports","frisbee"]},"bowling":{"a":"Bowling","b":"1F3B3","j":["ball","game","sports","fun","play"]},"cricket-game":{"a":"Cricket Game","b":"1F3CF","j":["ball","bat","game","sports"]},"field-hockey":{"a":"Field Hockey","b":"1F3D1","j":["ball","field","game","hockey","stick","sports"]},"ice-hockey":{"a":"Ice Hockey","b":"1F3D2","j":["game","hockey","ice","puck","stick","sports"]},"lacrosse":{"a":"Lacrosse","b":"1F94D","j":["ball","goal","stick","sports"]},"ping-pong":{"a":"Ping Pong","b":"1F3D3","j":["ball","bat","game","paddle","table tennis","sports","pingpong"]},"badminton":{"a":"Badminton","b":"1F3F8","j":["birdie","game","racquet","shuttlecock","sports"]},"boxing-glove":{"a":"Boxing Glove","b":"1F94A","j":["boxing","glove","sports","fighting"]},"martial-arts-uniform":{"a":"Martial Arts Uniform","b":"1F94B","j":["judo","karate","martial arts","taekwondo","uniform"]},"goal-net":{"a":"Goal Net","b":"1F945","j":["goal","net","sports"]},"flag-in-hole":{"a":"Flag in Hole","b":"26F3","j":["golf","hole","sports","business","flag","summer"]},"ice-skate":{"a":"Ice Skate","b":"26F8","j":["ice","skate","sports"]},"fishing-pole":{"a":"Fishing Pole","b":"1F3A3","j":["fish","pole","food","hobby","summer"]},"diving-mask":{"a":"Diving Mask","b":"1F93F","j":["diving","scuba","snorkeling","sport","ocean"]},"running-shirt":{"a":"Running Shirt","b":"1F3BD","j":["athletics","running","sash","shirt","play","pageant"]},"skis":{"a":"Skis","b":"1F3BF","j":["ski","snow","sports","winter","cold"]},"sled":{"a":"Sled","b":"1F6F7","j":["sledge","sleigh","luge","toboggan"]},"curling-stone":{"a":"Curling Stone","b":"1F94C","j":["game","rock","sports"]},"bullseye":{"a":"Bullseye","b":"1F3AF","j":["dart","direct hit","game","hit","target","direct_hit","play","bar"]},"yoyo":{"a":"Yo-Yo","b":"1FA80","j":["fluctuate","toy","yo-yo","yo_yo"]},"kite":{"a":"Kite","b":"1FA81","j":["fly","soar","wind"]},"pool-8-ball":{"a":"Pool 8 Ball","b":"1F3B1","j":["8","ball","billiard","eight","game","pool","hobby","luck","magic"]},"crystal-ball":{"a":"Crystal Ball","b":"1F52E","j":["ball","crystal","fairy tale","fantasy","fortune","tool","disco","party","magic","circus","fortune_teller"]},"magic-wand":{"a":"Magic Wand","b":"1FA84","j":["magic","witch","wizard","supernature","power"]},"nazar-amulet":{"a":"Nazar Amulet","b":"1F9FF","j":["bead","charm","evil-eye","nazar","talisman"]},"video-game":{"a":"Video Game","b":"1F3AE","j":["controller","game","play","console","PS4"]},"joystick":{"a":"Joystick","b":"1F579","j":["game","video game","play"]},"slot-machine":{"a":"Slot Machine","b":"1F3B0","j":["game","slot","bet","gamble","vegas","fruit machine","luck","casino"]},"game-die":{"a":"Game Die","b":"1F3B2","j":["dice","die","game","random","tabletop","play","luck"]},"puzzle-piece":{"a":"Puzzle Piece","b":"1F9E9","j":["clue","interlocking","jigsaw","piece","puzzle"]},"teddy-bear":{"a":"Teddy Bear","b":"1F9F8","j":["plaything","plush","stuffed","toy"]},"piata":{"a":"Piñata","b":"1FA85","j":["celebration","party","piñata","pinata","mexico","candy"]},"nesting-dolls":{"a":"Nesting Dolls","b":"1FA86","j":["doll","nesting","russia","matryoshka","toy"]},"spade-suit":{"a":"Spade Suit","b":"2660","j":["card","game","poker","cards","suits","magic"]},"heart-suit":{"a":"Heart Suit","b":"2665","j":["card","game","poker","cards","magic","suits"]},"diamond-suit":{"a":"Diamond Suit","b":"2666","j":["card","game","poker","cards","magic","suits"]},"club-suit":{"a":"Club Suit","b":"2663","j":["card","game","poker","cards","magic","suits"]},"chess-pawn":{"a":"Chess Pawn","b":"265F","j":["chess","dupe","expendable"]},"joker":{"a":"Joker","b":"1F0CF","j":["card","game","wildcard","poker","cards","play","magic"]},"mahjong-red-dragon":{"a":"Mahjong Red Dragon","b":"1F004","j":["game","mahjong","red","play","chinese","kanji"]},"flower-playing-cards":{"a":"Flower Playing Cards","b":"1F3B4","j":["card","flower","game","Japanese","playing","sunset","red"]},"performing-arts":{"a":"Performing Arts","b":"1F3AD","j":["art","mask","performing","theater","theatre","acting","drama"]},"framed-picture":{"a":"Framed Picture","b":"1F5BC","j":["art","frame","museum","painting","picture","photography"]},"artist-palette":{"a":"Artist Palette","b":"1F3A8","j":["art","museum","painting","palette","design","paint","draw","colors"]},"thread":{"a":"Thread","b":"1F9F5","j":["needle","sewing","spool","string"]},"sewing-needle":{"a":"Sewing Needle","b":"1FAA1","j":["embroidery","needle","sewing","stitches","sutures","tailoring"]},"yarn":{"a":"Yarn","b":"1F9F6","j":["ball","crochet","knit"]},"knot":{"a":"Knot","b":"1FAA2","j":["rope","tangled","tie","twine","twist","scout"]},"glasses":{"a":"Glasses","b":"1F453","j":["clothing","eye","eyeglasses","eyewear","fashion","accessories","eyesight","nerdy","dork","geek"]},"sunglasses":{"a":"Sunglasses","b":"1F576","j":["dark","eye","eyewear","glasses","face","cool","accessories"]},"goggles":{"a":"Goggles","b":"1F97D","j":["eye protection","swimming","welding","eyes","protection","safety"]},"lab-coat":{"a":"Lab Coat","b":"1F97C","j":["doctor","experiment","scientist","chemist"]},"safety-vest":{"a":"Safety Vest","b":"1F9BA","j":["emergency","safety","vest","protection"]},"necktie":{"a":"Necktie","b":"1F454","j":["clothing","tie","shirt","suitup","formal","fashion","cloth","business"]},"tshirt":{"a":"T-Shirt","b":"1F455","j":["clothing","shirt","t-shirt","t_shirt","fashion","cloth","casual","tee"]},"jeans":{"a":"Jeans","b":"1F456","j":["clothing","pants","trousers","fashion","shopping"]},"scarf":{"a":"Scarf","b":"1F9E3","j":["neck","winter","clothes"]},"gloves":{"a":"Gloves","b":"1F9E4","j":["hand","hands","winter","clothes"]},"coat":{"a":"Coat","b":"1F9E5","j":["jacket"]},"socks":{"a":"Socks","b":"1F9E6","j":["stocking","stockings","clothes"]},"dress":{"a":"Dress","b":"1F457","j":["clothing","clothes","fashion","shopping"]},"kimono":{"a":"Kimono","b":"1F458","j":["clothing","dress","fashion","women","female","japanese"]},"sari":{"a":"Sari","b":"1F97B","j":["clothing","dress"]},"onepiece-swimsuit":{"a":"One-Piece Swimsuit","b":"1FA71","j":["bathing suit","one-piece swimsuit","one_piece_swimsuit","fashion"]},"briefs":{"a":"Briefs","b":"1FA72","j":["bathing suit","one-piece","swimsuit","underwear","clothing"]},"shorts":{"a":"Shorts","b":"1FA73","j":["bathing suit","pants","underwear","clothing"]},"bikini":{"a":"Bikini","b":"1F459","j":["clothing","swim","swimming","female","woman","girl","fashion","beach","summer"]},"womans-clothes":{"a":"Woman’S Clothes","b":"1F45A","j":["clothing","woman","woman’s clothes","woman_s_clothes","fashion","shopping_bags","female"]},"purse":{"a":"Purse","b":"1F45B","j":["clothing","coin","fashion","accessories","money","sales","shopping"]},"handbag":{"a":"Handbag","b":"1F45C","j":["bag","clothing","purse","fashion","accessory","accessories","shopping"]},"clutch-bag":{"a":"Clutch Bag","b":"1F45D","j":["bag","clothing","pouch","accessories","shopping"]},"shopping-bags":{"a":"Shopping Bags","b":"1F6CD","j":["bag","hotel","shopping","mall","buy","purchase"]},"backpack":{"a":"Backpack","b":"1F392","j":["bag","rucksack","satchel","school","student","education"]},"thong-sandal":{"a":"Thong Sandal","b":"1FA74","j":["beach sandals","sandals","thong sandals","thongs","zōri","footwear","summer"]},"mans-shoe":{"a":"Man’S Shoe","b":"1F45E","j":["clothing","man","man’s shoe","shoe","man_s_shoe","fashion","male"]},"running-shoe":{"a":"Running Shoe","b":"1F45F","j":["athletic","clothing","shoe","sneaker","shoes","sports","sneakers"]},"hiking-boot":{"a":"Hiking Boot","b":"1F97E","j":["backpacking","boot","camping","hiking"]},"flat-shoe":{"a":"Flat Shoe","b":"1F97F","j":["ballet flat","slip-on","slipper","ballet"]},"highheeled-shoe":{"a":"High-Heeled Shoe","b":"1F460","j":["clothing","heel","high-heeled shoe","shoe","woman","high_heeled_shoe","fashion","shoes","female","pumps","stiletto"]},"womans-sandal":{"a":"Woman’S Sandal","b":"1F461","j":["clothing","sandal","shoe","woman","woman’s sandal","woman_s_sandal","shoes","fashion","flip flops"]},"ballet-shoes":{"a":"Ballet Shoes","b":"1FA70","j":["ballet","dance"]},"womans-boot":{"a":"Woman’S Boot","b":"1F462","j":["boot","clothing","shoe","woman","woman’s boot","woman_s_boot","shoes","fashion"]},"crown":{"a":"Crown","b":"1F451","j":["clothing","king","queen","kod","leader","royalty","lord"]},"womans-hat":{"a":"Woman’S Hat","b":"1F452","j":["clothing","hat","woman","woman’s hat","woman_s_hat","fashion","accessories","female","lady","spring"]},"top-hat":{"a":"Top Hat","b":"1F3A9","j":["clothing","hat","top","tophat","magic","gentleman","classy","circus"]},"graduation-cap":{"a":"Graduation Cap","b":"1F393","j":["cap","celebration","clothing","graduation","hat","school","college","degree","university","legal","learn","education"]},"billed-cap":{"a":"Billed Cap","b":"1F9E2","j":["baseball cap","cap","baseball"]},"military-helmet":{"a":"Military Helmet","b":"1FA96","j":["army","helmet","military","soldier","warrior","protection"]},"rescue-workers-helmet":{"a":"Rescue Worker’S Helmet","b":"26D1","j":["aid","cross","face","hat","helmet","rescue worker’s helmet","rescue_worker_s_helmet","construction","build"]},"prayer-beads":{"a":"Prayer Beads","b":"1F4FF","j":["beads","clothing","necklace","prayer","religion","dhikr","religious"]},"lipstick":{"a":"Lipstick","b":"1F484","j":["cosmetics","makeup","female","girl","fashion","woman"]},"ring":{"a":"Ring","b":"1F48D","j":["diamond","wedding","propose","marriage","valentines","fashion","jewelry","gem","engagement"]},"gem-stone":{"a":"Gem Stone","b":"1F48E","j":["diamond","gem","jewel","blue","ruby","jewelry"]},"muted-speaker":{"a":"Muted Speaker","b":"1F507","j":["mute","quiet","silent","speaker","sound","volume","silence"]},"speaker-low-volume":{"a":"Speaker Low Volume","b":"1F508","j":["soft","sound","volume","silence","broadcast"]},"speaker-medium-volume":{"a":"Speaker Medium Volume","b":"1F509","j":["medium","volume","speaker","broadcast"]},"speaker-high-volume":{"a":"Speaker High Volume","b":"1F50A","j":["loud","volume","noise","noisy","speaker","broadcast"]},"loudspeaker":{"a":"Loudspeaker","b":"1F4E2","j":["loud","public address","volume","sound"]},"megaphone":{"a":"Megaphone","b":"1F4E3","j":["cheering","sound","speaker","volume"]},"postal-horn":{"a":"Postal Horn","b":"1F4EF","j":["horn","post","postal","instrument","music"]},"bell":{"a":"Bell","b":"1F514","j":["sound","notification","christmas","xmas","chime"]},"bell-with-slash":{"a":"Bell with Slash","b":"1F515","j":["bell","forbidden","mute","quiet","silent","sound","volume"]},"musical-score":{"a":"Musical Score","b":"1F3BC","j":["music","score","treble","clef","compose"]},"musical-note":{"a":"Musical Note","b":"1F3B5","j":["music","note","score","tone","sound"]},"musical-notes":{"a":"Musical Notes","b":"1F3B6","j":["music","note","notes","score"]},"studio-microphone":{"a":"Studio Microphone","b":"1F399","j":["mic","microphone","music","studio","sing","recording","artist","talkshow"]},"level-slider":{"a":"Level Slider","b":"1F39A","j":["level","music","slider","scale"]},"control-knobs":{"a":"Control Knobs","b":"1F39B","j":["control","knobs","music","dial"]},"microphone":{"a":"Microphone","b":"1F3A4","j":["karaoke","mic","sound","music","PA","sing","talkshow"]},"headphone":{"a":"Headphone","b":"1F3A7","j":["earbud","music","score","gadgets"]},"radio":{"a":"Radio","b":"1F4FB","j":["video","communication","music","podcast","program"]},"saxophone":{"a":"Saxophone","b":"1F3B7","j":["instrument","music","sax","jazz","blues"]},"accordion":{"a":"Accordion","b":"1FA97","j":["concertina","squeeze box","music"]},"guitar":{"a":"Guitar","b":"1F3B8","j":["instrument","music"]},"musical-keyboard":{"a":"Musical Keyboard","b":"1F3B9","j":["instrument","keyboard","music","piano","compose"]},"trumpet":{"a":"Trumpet","b":"1F3BA","j":["instrument","music","brass"]},"violin":{"a":"Violin","b":"1F3BB","j":["instrument","music","orchestra","symphony"]},"banjo":{"a":"Banjo","b":"1FA95","j":["music","stringed","instructment"]},"drum":{"a":"Drum","b":"1F941","j":["drumsticks","music","instrument","snare"]},"long-drum":{"a":"Long Drum","b":"1FA98","j":["beat","conga","drum","rhythm","music"]},"mobile-phone":{"a":"Mobile Phone","b":"1F4F1","j":["cell","mobile","phone","telephone","technology","apple","gadgets","dial"]},"mobile-phone-with-arrow":{"a":"Mobile Phone with Arrow","b":"1F4F2","j":["arrow","cell","mobile","phone","receive","iphone","incoming"]},"telephone":{"a":"Telephone","b":"260E","j":["phone","technology","communication","dial"]},"telephone-receiver":{"a":"Telephone Receiver","b":"1F4DE","j":["phone","receiver","telephone","technology","communication","dial"]},"pager":{"a":"Pager","b":"1F4DF","j":["bbcall","oldschool","90s"]},"fax-machine":{"a":"Fax Machine","b":"1F4E0","j":["fax","communication","technology"]},"battery":{"a":"Battery","b":"1F50B","j":["power","energy","sustain"]},"electric-plug":{"a":"Electric Plug","b":"1F50C","j":["electric","electricity","plug","charger","power"]},"laptop":{"a":"Laptop","b":"1F4BB","j":["computer","pc","personal","technology","screen","display","monitor"]},"desktop-computer":{"a":"Desktop Computer","b":"1F5A5","j":["computer","desktop","technology","computing","screen"]},"printer":{"a":"Printer","b":"1F5A8","j":["computer","paper","ink"]},"keyboard":{"a":"Keyboard","b":"2328","j":["computer","technology","type","input","text"]},"computer-mouse":{"a":"Computer Mouse","b":"1F5B1","j":["computer","click"]},"trackball":{"a":"Trackball","b":"1F5B2","j":["computer","technology","trackpad"]},"computer-disk":{"a":"Computer Disk","b":"1F4BD","j":["computer","disk","minidisk","optical","technology","record","data","90s"]},"floppy-disk":{"a":"Floppy Disk","b":"1F4BE","j":["computer","disk","floppy","oldschool","technology","save","90s","80s"]},"optical-disk":{"a":"Optical Disk","b":"1F4BF","j":["cd","computer","disk","optical","technology","dvd","disc","90s"]},"dvd":{"a":"Dvd","b":"1F4C0","j":["blu-ray","computer","disk","optical","cd","disc"]},"abacus":{"a":"Abacus","b":"1F9EE","j":["calculation"]},"movie-camera":{"a":"Movie Camera","b":"1F3A5","j":["camera","cinema","movie","film","record"]},"film-frames":{"a":"Film Frames","b":"1F39E","j":["cinema","film","frames","movie"]},"film-projector":{"a":"Film Projector","b":"1F4FD","j":["cinema","film","movie","projector","video","tape","record"]},"clapper-board":{"a":"Clapper Board","b":"1F3AC","j":["clapper","movie","film","record"]},"television":{"a":"Television","b":"1F4FA","j":["tv","video","technology","program","oldschool","show"]},"camera":{"a":"Camera","b":"1F4F7","j":["video","gadgets","photography"]},"camera-with-flash":{"a":"Camera with Flash","b":"1F4F8","j":["camera","flash","video","photography","gadgets"]},"video-camera":{"a":"Video Camera","b":"1F4F9","j":["camera","video","film","record"]},"videocassette":{"a":"Videocassette","b":"1F4FC","j":["tape","vhs","video","record","oldschool","90s","80s"]},"magnifying-glass-tilted-left":{"a":"Magnifying Glass Tilted Left","b":"1F50D","j":["glass","magnifying","search","tool","zoom","find","detective"]},"magnifying-glass-tilted-right":{"a":"Magnifying Glass Tilted Right","b":"1F50E","j":["glass","magnifying","search","tool","zoom","find","detective"]},"candle":{"a":"Candle","b":"1F56F","j":["light","fire","wax"]},"light-bulb":{"a":"Light Bulb","b":"1F4A1","j":["bulb","comic","electric","idea","light","electricity"]},"flashlight":{"a":"Flashlight","b":"1F526","j":["electric","light","tool","torch","dark","camping","sight","night"]},"red-paper-lantern":{"a":"Red Paper Lantern","b":"1F3EE","j":["bar","lantern","light","red","paper","halloween","spooky"]},"diya-lamp":{"a":"Diya Lamp","b":"1FA94","j":["diya","lamp","oil","lighting"]},"notebook-with-decorative-cover":{"a":"Notebook with Decorative Cover","b":"1F4D4","j":["book","cover","decorated","notebook","classroom","notes","record","paper","study"]},"closed-book":{"a":"Closed Book","b":"1F4D5","j":["book","closed","read","library","knowledge","textbook","learn"]},"open-book":{"a":"Open Book","b":"1F4D6","j":["book","open","read","library","knowledge","literature","learn","study"]},"green-book":{"a":"Green Book","b":"1F4D7","j":["book","green","read","library","knowledge","study"]},"blue-book":{"a":"Blue Book","b":"1F4D8","j":["blue","book","read","library","knowledge","learn","study"]},"orange-book":{"a":"Orange Book","b":"1F4D9","j":["book","orange","read","library","knowledge","textbook","study"]},"books":{"a":"Books","b":"1F4DA","j":["book","literature","library","study"]},"notebook":{"a":"Notebook","b":"1F4D3","j":["stationery","record","notes","paper","study"]},"ledger":{"a":"Ledger","b":"1F4D2","j":["notebook","notes","paper"]},"page-with-curl":{"a":"Page with Curl","b":"1F4C3","j":["curl","document","page","documents","office","paper"]},"scroll":{"a":"Scroll","b":"1F4DC","j":["paper","documents","ancient","history"]},"page-facing-up":{"a":"Page Facing Up","b":"1F4C4","j":["document","page","documents","office","paper","information"]},"newspaper":{"a":"Newspaper","b":"1F4F0","j":["news","paper","press","headline"]},"rolledup-newspaper":{"a":"Rolled-Up Newspaper","b":"1F5DE","j":["news","newspaper","paper","rolled","rolled-up newspaper","rolled_up_newspaper","press","headline"]},"bookmark-tabs":{"a":"Bookmark Tabs","b":"1F4D1","j":["bookmark","mark","marker","tabs","favorite","save","order","tidy"]},"bookmark":{"a":"Bookmark","b":"1F516","j":["mark","favorite","label","save"]},"label":{"a":"Label","b":"1F3F7","j":["sale","tag"]},"money-bag":{"a":"Money Bag","b":"1F4B0","j":["bag","dollar","money","moneybag","payment","coins","sale"]},"coin":{"a":"Coin","b":"1FA99","j":["gold","metal","money","silver","treasure","currency"]},"yen-banknote":{"a":"Yen Banknote","b":"1F4B4","j":["banknote","bill","currency","money","note","yen","sales","japanese","dollar"]},"dollar-banknote":{"a":"Dollar Banknote","b":"1F4B5","j":["banknote","bill","currency","dollar","money","note","sales"]},"euro-banknote":{"a":"Euro Banknote","b":"1F4B6","j":["banknote","bill","currency","euro","money","note","sales","dollar"]},"pound-banknote":{"a":"Pound Banknote","b":"1F4B7","j":["banknote","bill","currency","money","note","pound","british","sterling","sales","bills","uk","england"]},"money-with-wings":{"a":"Money with Wings","b":"1F4B8","j":["banknote","bill","fly","money","wings","dollar","bills","payment","sale"]},"credit-card":{"a":"Credit Card","b":"1F4B3","j":["card","credit","money","sales","dollar","bill","payment","shopping"]},"receipt":{"a":"Receipt","b":"1F9FE","j":["accounting","bookkeeping","evidence","proof","expenses"]},"chart-increasing-with-yen":{"a":"Chart Increasing with Yen","b":"1F4B9","j":["chart","graph","growth","money","yen","green-square","presentation","stats"]},"envelope":{"a":"Envelope","b":"2709","j":["email","letter","postal","inbox","communication"]},"email":{"a":"E-Mail","b":"1F4E7","j":["e-mail","letter","mail","e_mail","communication","inbox"]},"incoming-envelope":{"a":"Incoming Envelope","b":"1F4E8","j":["e-mail","email","envelope","incoming","letter","receive","inbox"]},"envelope-with-arrow":{"a":"Envelope with Arrow","b":"1F4E9","j":["arrow","e-mail","email","envelope","outgoing","communication"]},"outbox-tray":{"a":"Outbox Tray","b":"1F4E4","j":["box","letter","mail","outbox","sent","tray","inbox","email"]},"inbox-tray":{"a":"Inbox Tray","b":"1F4E5","j":["box","inbox","letter","mail","receive","tray","email","documents"]},"package":{"a":"Package","b":"1F4E6","j":["box","parcel","mail","gift","cardboard","moving"]},"closed-mailbox-with-raised-flag":{"a":"Closed Mailbox with Raised Flag","b":"1F4EB","j":["closed","mail","mailbox","postbox","email","inbox","communication"]},"closed-mailbox-with-lowered-flag":{"a":"Closed Mailbox with Lowered Flag","b":"1F4EA","j":["closed","lowered","mail","mailbox","postbox","email","communication","inbox"]},"open-mailbox-with-raised-flag":{"a":"Open Mailbox with Raised Flag","b":"1F4EC","j":["mail","mailbox","open","postbox","email","inbox","communication"]},"open-mailbox-with-lowered-flag":{"a":"Open Mailbox with Lowered Flag","b":"1F4ED","j":["lowered","mail","mailbox","open","postbox","email","inbox"]},"postbox":{"a":"Postbox","b":"1F4EE","j":["mail","mailbox","email","letter","envelope"]},"ballot-box-with-ballot":{"a":"Ballot Box with Ballot","b":"1F5F3","j":["ballot","box","election","vote"]},"pencil":{"a":"Pencil","b":"270F","j":["stationery","write","paper","writing","school","study"]},"black-nib":{"a":"Black Nib","b":"2712","j":["nib","pen","stationery","writing","write"]},"fountain-pen":{"a":"Fountain Pen","b":"1F58B","j":["fountain","pen","stationery","writing","write"]},"pen":{"a":"Pen","b":"1F58A","j":["ballpoint","stationery","writing","write"]},"paintbrush":{"a":"Paintbrush","b":"1F58C","j":["painting","drawing","creativity","art"]},"crayon":{"a":"Crayon","b":"1F58D","j":["drawing","creativity"]},"memo":{"a":"Memo","b":"1F4DD","j":["pencil","write","documents","stationery","paper","writing","legal","exam","quiz","test","study","compose"]},"briefcase":{"a":"Briefcase","b":"1F4BC","j":["business","documents","work","law","legal","job","career"]},"file-folder":{"a":"File Folder","b":"1F4C1","j":["file","folder","documents","business","office"]},"open-file-folder":{"a":"Open File Folder","b":"1F4C2","j":["file","folder","open","documents","load"]},"card-index-dividers":{"a":"Card Index Dividers","b":"1F5C2","j":["card","dividers","index","organizing","business","stationery"]},"calendar":{"a":"Calendar","b":"1F4C5","j":["date","schedule"]},"tearoff-calendar":{"a":"Tear-off Calendar","b":"1F4C6","j":["calendar","tear-off calendar","tear_off_calendar","schedule","date","planning"]},"spiral-notepad":{"a":"Spiral Notepad","b":"1F5D2","j":["note","pad","spiral","memo","stationery"]},"spiral-calendar":{"a":"Spiral Calendar","b":"1F5D3","j":["calendar","pad","spiral","date","schedule","planning"]},"card-index":{"a":"Card Index","b":"1F4C7","j":["card","index","rolodex","business","stationery"]},"chart-increasing":{"a":"Chart Increasing","b":"1F4C8","j":["chart","graph","growth","trend","upward","presentation","stats","recovery","business","economics","money","sales","good","success"]},"chart-decreasing":{"a":"Chart Decreasing","b":"1F4C9","j":["chart","down","graph","trend","presentation","stats","recession","business","economics","money","sales","bad","failure"]},"bar-chart":{"a":"Bar Chart","b":"1F4CA","j":["bar","chart","graph","presentation","stats"]},"clipboard":{"a":"Clipboard","b":"1F4CB","j":["stationery","documents"]},"pushpin":{"a":"Pushpin","b":"1F4CC","j":["pin","stationery","mark","here"]},"round-pushpin":{"a":"Round Pushpin","b":"1F4CD","j":["pin","pushpin","stationery","location","map","here"]},"paperclip":{"a":"Paperclip","b":"1F4CE","j":["documents","stationery"]},"linked-paperclips":{"a":"Linked Paperclips","b":"1F587","j":["link","paperclip","documents","stationery"]},"straight-ruler":{"a":"Straight Ruler","b":"1F4CF","j":["ruler","straight edge","stationery","calculate","length","math","school","drawing","architect","sketch"]},"triangular-ruler":{"a":"Triangular Ruler","b":"1F4D0","j":["ruler","set","triangle","stationery","math","architect","sketch"]},"scissors":{"a":"Scissors","b":"2702","j":["cutting","tool","stationery","cut"]},"card-file-box":{"a":"Card File Box","b":"1F5C3","j":["box","card","file","business","stationery"]},"file-cabinet":{"a":"File Cabinet","b":"1F5C4","j":["cabinet","file","filing","organizing"]},"wastebasket":{"a":"Wastebasket","b":"1F5D1","j":["bin","trash","rubbish","garbage","toss"]},"locked":{"a":"Locked","b":"1F512","j":["closed","security","password","padlock"]},"unlocked":{"a":"Unlocked","b":"1F513","j":["lock","open","unlock","privacy","security"]},"locked-with-pen":{"a":"Locked with Pen","b":"1F50F","j":["ink","lock","nib","pen","privacy","security","secret"]},"locked-with-key":{"a":"Locked with Key","b":"1F510","j":["closed","key","lock","secure","security","privacy"]},"key":{"a":"Key","b":"1F511","j":["lock","password","door"]},"old-key":{"a":"Old Key","b":"1F5DD","j":["clue","key","lock","old","door","password"]},"hammer":{"a":"Hammer","b":"1F528","j":["tool","tools","build","create"]},"axe":{"a":"Axe","b":"1FA93","j":["chop","hatchet","split","wood","tool","cut"]},"pick":{"a":"Pick","b":"26CF","j":["mining","tool","tools","dig"]},"hammer-and-pick":{"a":"Hammer and Pick","b":"2692","j":["hammer","pick","tool","tools","build","create"]},"hammer-and-wrench":{"a":"Hammer and Wrench","b":"1F6E0","j":["hammer","spanner","tool","wrench","tools","build","create"]},"dagger":{"a":"Dagger","b":"1F5E1","j":["knife","weapon"]},"crossed-swords":{"a":"Crossed Swords","b":"2694","j":["crossed","swords","weapon"]},"water-pistol":{"a":"Water Pistol","b":"1F52B","j":["gun","handgun","pistol","revolver","tool","water","weapon","violence"]},"boomerang":{"a":"Boomerang","b":"1FA83","j":["australia","rebound","repercussion","weapon"]},"bow-and-arrow":{"a":"Bow and Arrow","b":"1F3F9","j":["archer","arrow","bow","Sagittarius","zodiac","sports"]},"shield":{"a":"Shield","b":"1F6E1","j":["weapon","protection","security"]},"carpentry-saw":{"a":"Carpentry Saw","b":"1FA9A","j":["carpenter","lumber","saw","tool","cut","chop"]},"wrench":{"a":"Wrench","b":"1F527","j":["spanner","tool","tools","diy","ikea","fix","maintainer"]},"screwdriver":{"a":"Screwdriver","b":"1FA9B","j":["screw","tool","tools"]},"nut-and-bolt":{"a":"Nut and Bolt","b":"1F529","j":["bolt","nut","tool","handy","tools","fix"]},"gear":{"a":"Gear","b":"2699","j":["cog","cogwheel","tool"]},"clamp":{"a":"Clamp","b":"1F5DC","j":["compress","tool","vice"]},"balance-scale":{"a":"Balance Scale","b":"2696","j":["balance","justice","Libra","scale","zodiac","law","fairness","weight"]},"white-cane":{"a":"White Cane","b":"1F9AF","j":["accessibility","blind","probing_cane"]},"link":{"a":"Link","b":"1F517","j":["rings","url"]},"chains":{"a":"Chains","b":"26D3","j":["chain","lock","arrest"]},"hook":{"a":"Hook","b":"1FA9D","j":["catch","crook","curve","ensnare","selling point","tools"]},"toolbox":{"a":"Toolbox","b":"1F9F0","j":["chest","mechanic","tool","tools","diy","fix","maintainer"]},"magnet":{"a":"Magnet","b":"1F9F2","j":["attraction","horseshoe","magnetic"]},"ladder":{"a":"Ladder","b":"1FA9C","j":["climb","rung","step","tools"]},"alembic":{"a":"Alembic","b":"2697","j":["chemistry","tool","distilling","science","experiment"]},"test-tube":{"a":"Test Tube","b":"1F9EA","j":["chemist","chemistry","experiment","lab","science"]},"petri-dish":{"a":"Petri Dish","b":"1F9EB","j":["bacteria","biologist","biology","culture","lab"]},"dna":{"a":"Dna","b":"1F9EC","j":["biologist","evolution","gene","genetics","life"]},"microscope":{"a":"Microscope","b":"1F52C","j":["science","tool","laboratory","experiment","zoomin","study"]},"telescope":{"a":"Telescope","b":"1F52D","j":["science","tool","stars","space","zoom","astronomy"]},"satellite-antenna":{"a":"Satellite Antenna","b":"1F4E1","j":["antenna","dish","satellite","communication","future","radio","space"]},"syringe":{"a":"Syringe","b":"1F489","j":["medicine","needle","shot","sick","health","hospital","drugs","blood","doctor","nurse"]},"drop-of-blood":{"a":"Drop of Blood","b":"1FA78","j":["bleed","blood donation","injury","medicine","menstruation","period","hurt","harm","wound"]},"pill":{"a":"Pill","b":"1F48A","j":["doctor","medicine","sick","health","pharmacy","drug"]},"adhesive-bandage":{"a":"Adhesive Bandage","b":"1FA79","j":["bandage","heal"]},"stethoscope":{"a":"Stethoscope","b":"1FA7A","j":["doctor","heart","medicine","health"]},"door":{"a":"Door","b":"1F6AA","j":["house","entry","exit"]},"elevator":{"a":"Elevator","b":"1F6D7","j":["accessibility","hoist","lift"]},"mirror":{"a":"Mirror","b":"1FA9E","j":["reflection","reflector","speculum"]},"window":{"a":"Window","b":"1FA9F","j":["frame","fresh air","opening","transparent","view","scenery"]},"bed":{"a":"Bed","b":"1F6CF","j":["hotel","sleep","rest"]},"couch-and-lamp":{"a":"Couch and Lamp","b":"1F6CB","j":["couch","hotel","lamp","read","chill"]},"chair":{"a":"Chair","b":"1FA91","j":["seat","sit","furniture"]},"toilet":{"a":"Toilet","b":"1F6BD","j":["restroom","wc","washroom","bathroom","potty"]},"plunger":{"a":"Plunger","b":"1FAA0","j":["force cup","plumber","suction","toilet"]},"shower":{"a":"Shower","b":"1F6BF","j":["water","clean","bathroom"]},"bathtub":{"a":"Bathtub","b":"1F6C1","j":["bath","clean","shower","bathroom"]},"mouse-trap":{"a":"Mouse Trap","b":"1FAA4","j":["bait","mousetrap","snare","trap","cheese"]},"razor":{"a":"Razor","b":"1FA92","j":["sharp","shave","cut"]},"lotion-bottle":{"a":"Lotion Bottle","b":"1F9F4","j":["lotion","moisturizer","shampoo","sunscreen"]},"safety-pin":{"a":"Safety Pin","b":"1F9F7","j":["diaper","punk rock"]},"broom":{"a":"Broom","b":"1F9F9","j":["cleaning","sweeping","witch"]},"basket":{"a":"Basket","b":"1F9FA","j":["farming","laundry","picnic"]},"roll-of-paper":{"a":"Roll of Paper","b":"1F9FB","j":["paper towels","toilet paper","roll"]},"bucket":{"a":"Bucket","b":"1FAA3","j":["cask","pail","vat","water","container"]},"soap":{"a":"Soap","b":"1F9FC","j":["bar","bathing","cleaning","lather","soapdish"]},"toothbrush":{"a":"Toothbrush","b":"1FAA5","j":["bathroom","brush","clean","dental","hygiene","teeth"]},"sponge":{"a":"Sponge","b":"1F9FD","j":["absorbing","cleaning","porous"]},"fire-extinguisher":{"a":"Fire Extinguisher","b":"1F9EF","j":["extinguish","fire","quench"]},"shopping-cart":{"a":"Shopping Cart","b":"1F6D2","j":["cart","shopping","trolley"]},"cigarette":{"a":"Cigarette","b":"1F6AC","j":["smoking","kills","tobacco","joint","smoke"]},"coffin":{"a":"Coffin","b":"26B0","j":["death","vampire","dead","die","rip","graveyard","cemetery","casket","funeral","box"]},"headstone":{"a":"Headstone","b":"1FAA6","j":["cemetery","grave","graveyard","tombstone","death","rip"]},"funeral-urn":{"a":"Funeral Urn","b":"26B1","j":["ashes","death","funeral","urn","dead","die","rip"]},"moai":{"a":"Moai","b":"1F5FF","j":["face","moyai","statue","rock","easter island"]},"placard":{"a":"Placard","b":"1FAA7","j":["demonstration","picket","protest","sign","announcement"]},"atm-sign":{"a":"Atm Sign","b":"1F3E7","j":["atm","ATM sign","automated","bank","teller","money","sales","cash","blue-square","payment"]},"litter-in-bin-sign":{"a":"Litter in Bin Sign","b":"1F6AE","j":["litter","litter bin","blue-square","sign","human","info"]},"potable-water":{"a":"Potable Water","b":"1F6B0","j":["drinking","potable","water","blue-square","liquid","restroom","cleaning","faucet"]},"wheelchair-symbol":{"a":"Wheelchair Symbol","b":"267F","j":["access","blue-square","disabled","accessibility"]},"mens-room":{"a":"Men’S Room","b":"1F6B9","j":["lavatory","man","men’s room","restroom","wc","men_s_room","toilet","blue-square","gender","male"]},"womens-room":{"a":"Women’S Room","b":"1F6BA","j":["lavatory","restroom","wc","woman","women’s room","women_s_room","purple-square","female","toilet","loo","gender"]},"restroom":{"a":"Restroom","b":"1F6BB","j":["lavatory","WC","blue-square","toilet","refresh","wc","gender"]},"baby-symbol":{"a":"Baby Symbol","b":"1F6BC","j":["baby","changing","orange-square","child"]},"water-closet":{"a":"Water Closet","b":"1F6BE","j":["closet","lavatory","restroom","water","wc","toilet","blue-square"]},"passport-control":{"a":"Passport Control","b":"1F6C2","j":["control","passport","custom","blue-square"]},"customs":{"a":"Customs","b":"1F6C3","j":["passport","border","blue-square"]},"baggage-claim":{"a":"Baggage Claim","b":"1F6C4","j":["baggage","claim","blue-square","airport","transport"]},"left-luggage":{"a":"Left Luggage","b":"1F6C5","j":["baggage","locker","luggage","blue-square","travel"]},"warning":{"a":"Warning","b":"26A0","j":["exclamation","wip","alert","error","problem","issue"]},"children-crossing":{"a":"Children Crossing","b":"1F6B8","j":["child","crossing","pedestrian","traffic","school","warning","danger","sign","driving","yellow-diamond"]},"no-entry":{"a":"No Entry","b":"26D4","j":["entry","forbidden","no","not","prohibited","traffic","limit","security","privacy","bad","denied","stop","circle"]},"prohibited":{"a":"Prohibited","b":"1F6AB","j":["entry","forbidden","no","not","forbid","stop","limit","denied","disallow","circle"]},"no-bicycles":{"a":"No Bicycles","b":"1F6B3","j":["bicycle","bike","forbidden","no","prohibited","cyclist","circle"]},"no-smoking":{"a":"No Smoking","b":"1F6AD","j":["forbidden","no","not","prohibited","smoking","cigarette","blue-square","smell","smoke"]},"no-littering":{"a":"No Littering","b":"1F6AF","j":["forbidden","litter","no","not","prohibited","trash","bin","garbage","circle"]},"nonpotable-water":{"a":"Non-Potable Water","b":"1F6B1","j":["non-drinking","non-potable","water","non_potable_water","drink","faucet","tap","circle"]},"no-pedestrians":{"a":"No Pedestrians","b":"1F6B7","j":["forbidden","no","not","pedestrian","prohibited","rules","crossing","walking","circle"]},"no-mobile-phones":{"a":"No Mobile Phones","b":"1F4F5","j":["cell","forbidden","mobile","no","phone","iphone","mute","circle"]},"no-one-under-eighteen":{"a":"No One Under Eighteen","b":"1F51E","j":["18","age restriction","eighteen","prohibited","underage","drink","pub","night","minor","circle"]},"radioactive":{"a":"Radioactive","b":"2622","j":["sign","nuclear","danger"]},"biohazard":{"a":"Biohazard","b":"2623","j":["sign","danger"]},"up-arrow":{"a":"Up Arrow","b":"2B06","j":["arrow","cardinal","direction","north","blue-square","continue","top"]},"upright-arrow":{"a":"Up-Right Arrow","b":"2197","j":["arrow","direction","intercardinal","northeast","up-right arrow","up_right_arrow","blue-square","point","diagonal"]},"right-arrow":{"a":"Right Arrow","b":"27A1","j":["arrow","cardinal","direction","east","blue-square","next"]},"downright-arrow":{"a":"Down-Right Arrow","b":"2198","j":["arrow","direction","down-right arrow","intercardinal","southeast","down_right_arrow","blue-square","diagonal"]},"down-arrow":{"a":"Down Arrow","b":"2B07","j":["arrow","cardinal","direction","down","south","blue-square","bottom"]},"downleft-arrow":{"a":"Down-Left Arrow","b":"2199","j":["arrow","direction","down-left arrow","intercardinal","southwest","down_left_arrow","blue-square","diagonal"]},"left-arrow":{"a":"Left Arrow","b":"2B05","j":["arrow","cardinal","direction","west","blue-square","previous","back"]},"upleft-arrow":{"a":"Up-Left Arrow","b":"2196","j":["arrow","direction","intercardinal","northwest","up-left arrow","up_left_arrow","blue-square","point","diagonal"]},"updown-arrow":{"a":"Up-Down Arrow","b":"2195","j":["arrow","up-down arrow","up_down_arrow","blue-square","direction","way","vertical"]},"leftright-arrow":{"a":"Left-Right Arrow","b":"2194","j":["arrow","left-right arrow","left_right_arrow","shape","direction","horizontal","sideways"]},"right-arrow-curving-left":{"a":"Right Arrow Curving Left","b":"21A9","j":["arrow","back","return","blue-square","undo","enter"]},"left-arrow-curving-right":{"a":"Left Arrow Curving Right","b":"21AA","j":["arrow","blue-square","return","rotate","direction"]},"right-arrow-curving-up":{"a":"Right Arrow Curving Up","b":"2934","j":["arrow","blue-square","direction","top"]},"right-arrow-curving-down":{"a":"Right Arrow Curving Down","b":"2935","j":["arrow","down","blue-square","direction","bottom"]},"clockwise-vertical-arrows":{"a":"Clockwise Vertical Arrows","b":"1F503","j":["arrow","clockwise","reload","sync","cycle","round","repeat"]},"counterclockwise-arrows-button":{"a":"Counterclockwise Arrows Button","b":"1F504","j":["anticlockwise","arrow","counterclockwise","withershins","blue-square","sync","cycle"]},"back-arrow":{"a":"Back Arrow","b":"1F519","j":["arrow","back","BACK arrow","words","return"]},"end-arrow":{"a":"End Arrow","b":"1F51A","j":["arrow","end","END arrow","words"]},"on-arrow":{"a":"On! Arrow","b":"1F51B","j":["arrow","mark","on","ON! arrow","words"]},"soon-arrow":{"a":"Soon Arrow","b":"1F51C","j":["arrow","soon","SOON arrow","words"]},"top-arrow":{"a":"Top Arrow","b":"1F51D","j":["arrow","top","TOP arrow","up","words","blue-square"]},"place-of-worship":{"a":"Place of Worship","b":"1F6D0","j":["religion","worship","church","temple","prayer"]},"atom-symbol":{"a":"Atom Symbol","b":"269B","j":["atheist","atom","science","physics","chemistry"]},"om":{"a":"Om","b":"1F549","j":["Hindu","religion","hinduism","buddhism","sikhism","jainism"]},"star-of-david":{"a":"Star of David","b":"2721","j":["David","Jew","Jewish","religion","star","star of David","judaism"]},"wheel-of-dharma":{"a":"Wheel of Dharma","b":"2638","j":["Buddhist","dharma","religion","wheel","hinduism","buddhism","sikhism","jainism"]},"yin-yang":{"a":"Yin Yang","b":"262F","j":["religion","tao","taoist","yang","yin","balance"]},"latin-cross":{"a":"Latin Cross","b":"271D","j":["Christian","cross","religion","christianity"]},"orthodox-cross":{"a":"Orthodox Cross","b":"2626","j":["Christian","cross","religion","suppedaneum"]},"star-and-crescent":{"a":"Star and Crescent","b":"262A","j":["islam","Muslim","religion"]},"peace-symbol":{"a":"Peace Symbol","b":"262E","j":["peace","hippie"]},"menorah":{"a":"Menorah","b":"1F54E","j":["candelabrum","candlestick","religion","hanukkah","candles","jewish"]},"dotted-sixpointed-star":{"a":"Dotted Six-Pointed Star","b":"1F52F","j":["dotted six-pointed star","fortune","star","dotted_six_pointed_star","purple-square","religion","jewish","hexagram"]},"aries":{"a":"Aries","b":"2648","j":["ram","zodiac","sign","purple-square","astrology"]},"taurus":{"a":"Taurus","b":"2649","j":["bull","ox","zodiac","purple-square","sign","astrology"]},"gemini":{"a":"Gemini","b":"264A","j":["twins","zodiac","sign","purple-square","astrology"]},"cancer":{"a":"Cancer","b":"264B","j":["crab","zodiac","sign","purple-square","astrology"]},"leo":{"a":"Leo","b":"264C","j":["lion","zodiac","sign","purple-square","astrology"]},"virgo":{"a":"Virgo","b":"264D","j":["zodiac","sign","purple-square","astrology"]},"libra":{"a":"Libra","b":"264E","j":["balance","justice","scales","zodiac","sign","purple-square","astrology"]},"scorpio":{"a":"Scorpio","b":"264F","j":["scorpion","scorpius","zodiac","sign","purple-square","astrology"]},"sagittarius":{"a":"Sagittarius","b":"2650","j":["archer","zodiac","sign","purple-square","astrology"]},"capricorn":{"a":"Capricorn","b":"2651","j":["goat","zodiac","sign","purple-square","astrology"]},"aquarius":{"a":"Aquarius","b":"2652","j":["bearer","water","zodiac","sign","purple-square","astrology"]},"pisces":{"a":"Pisces","b":"2653","j":["fish","zodiac","purple-square","sign","astrology"]},"ophiuchus":{"a":"Ophiuchus","b":"26CE","j":["bearer","serpent","snake","zodiac","sign","purple-square","constellation","astrology"]},"shuffle-tracks-button":{"a":"Shuffle Tracks Button","b":"1F500","j":["arrow","crossed","blue-square","shuffle","music","random"]},"repeat-button":{"a":"Repeat Button","b":"1F501","j":["arrow","clockwise","repeat","loop","record"]},"repeat-single-button":{"a":"Repeat Single Button","b":"1F502","j":["arrow","clockwise","once","blue-square","loop"]},"play-button":{"a":"Play Button","b":"25B6","j":["arrow","play","right","triangle","blue-square","direction"]},"fastforward-button":{"a":"Fast-Forward Button","b":"23E9","j":["arrow","double","fast","fast-forward button","forward","fast_forward_button","blue-square","play","speed","continue"]},"next-track-button":{"a":"Next Track Button","b":"23ED","j":["arrow","next scene","next track","triangle","forward","next","blue-square"]},"play-or-pause-button":{"a":"Play or Pause Button","b":"23EF","j":["arrow","pause","play","right","triangle","blue-square"]},"reverse-button":{"a":"Reverse Button","b":"25C0","j":["arrow","left","reverse","triangle","blue-square","direction"]},"fast-reverse-button":{"a":"Fast Reverse Button","b":"23EA","j":["arrow","double","rewind","play","blue-square"]},"last-track-button":{"a":"Last Track Button","b":"23EE","j":["arrow","previous scene","previous track","triangle","backward"]},"upwards-button":{"a":"Upwards Button","b":"1F53C","j":["arrow","button","red","blue-square","triangle","direction","point","forward","top"]},"fast-up-button":{"a":"Fast Up Button","b":"23EB","j":["arrow","double","blue-square","direction","top"]},"downwards-button":{"a":"Downwards Button","b":"1F53D","j":["arrow","button","down","red","blue-square","direction","bottom"]},"fast-down-button":{"a":"Fast Down Button","b":"23EC","j":["arrow","double","down","blue-square","direction","bottom"]},"pause-button":{"a":"Pause Button","b":"23F8","j":["bar","double","pause","vertical","blue-square"]},"stop-button":{"a":"Stop Button","b":"23F9","j":["square","stop","blue-square"]},"record-button":{"a":"Record Button","b":"23FA","j":["circle","record","blue-square"]},"eject-button":{"a":"Eject Button","b":"23CF","j":["eject","blue-square"]},"cinema":{"a":"Cinema","b":"1F3A6","j":["camera","film","movie","blue-square","record","curtain","stage","theater"]},"dim-button":{"a":"Dim Button","b":"1F505","j":["brightness","dim","low","sun","afternoon","warm","summer"]},"bright-button":{"a":"Bright Button","b":"1F506","j":["bright","brightness","sun","light"]},"antenna-bars":{"a":"Antenna Bars","b":"1F4F6","j":["antenna","bar","cell","mobile","phone","blue-square","reception","internet","connection","wifi","bluetooth","bars"]},"vibration-mode":{"a":"Vibration Mode","b":"1F4F3","j":["cell","mobile","mode","phone","telephone","vibration","orange-square"]},"mobile-phone-off":{"a":"Mobile Phone off","b":"1F4F4","j":["cell","mobile","off","phone","telephone","mute","orange-square","silence","quiet"]},"female-sign":{"a":"Female Sign","b":"2640","j":["woman","women","lady","girl"]},"male-sign":{"a":"Male Sign","b":"2642","j":["man","boy","men"]},"transgender-symbol":{"a":"Transgender Symbol","b":"26A7","j":["transgender","lgbtq"]},"multiply":{"a":"Multiply","b":"2716","j":["×","cancel","multiplication","sign","x","multiplication_sign","math","calculation"]},"plus":{"a":"Plus","b":"2795","j":["+","math","sign","plus_sign","calculation","addition","more","increase"]},"minus":{"a":"Minus","b":"2796","j":["-","−","math","sign","minus_sign","calculation","subtract","less"]},"divide":{"a":"Divide","b":"2797","j":["÷","division","math","sign","division_sign","calculation"]},"infinity":{"a":"Infinity","b":"267E","j":["forever","unbounded","universal"]},"double-exclamation-mark":{"a":"Double Exclamation Mark","b":"203C","j":["!","!!","bangbang","exclamation","mark","surprise"]},"exclamation-question-mark":{"a":"Exclamation Question Mark","b":"2049","j":["!","!?","?","exclamation","interrobang","mark","punctuation","question","wat","surprise"]},"red-question-mark":{"a":"Red Question Mark","b":"2753","j":["?","mark","punctuation","question","question_mark","doubt","confused"]},"white-question-mark":{"a":"White Question Mark","b":"2754","j":["?","mark","outlined","punctuation","question","doubts","gray","huh","confused"]},"white-exclamation-mark":{"a":"White Exclamation Mark","b":"2755","j":["!","exclamation","mark","outlined","punctuation","surprise","gray","wow","warning"]},"red-exclamation-mark":{"a":"Red Exclamation Mark","b":"2757","j":["!","exclamation","mark","punctuation","exclamation_mark","heavy_exclamation_mark","danger","surprise","wow","warning"]},"wavy-dash":{"a":"Wavy Dash","b":"3030","j":["dash","punctuation","wavy","draw","line","moustache","mustache","squiggle","scribble"]},"currency-exchange":{"a":"Currency Exchange","b":"1F4B1","j":["bank","currency","exchange","money","sales","dollar","travel"]},"heavy-dollar-sign":{"a":"Heavy Dollar Sign","b":"1F4B2","j":["currency","dollar","money","sales","payment","buck"]},"medical-symbol":{"a":"Medical Symbol","b":"2695","j":["aesculapius","medicine","staff","health","hospital"]},"recycling-symbol":{"a":"Recycling Symbol","b":"267B","j":["recycle","arrow","environment","garbage","trash"]},"fleurdelis":{"a":"Fleur-De-Lis","b":"269C","j":["fleur-de-lis","fleur_de_lis","decorative","scout"]},"trident-emblem":{"a":"Trident Emblem","b":"1F531","j":["anchor","emblem","ship","tool","trident","weapon","spear"]},"name-badge":{"a":"Name Badge","b":"1F4DB","j":["badge","name","fire","forbid"]},"japanese-symbol-for-beginner":{"a":"Japanese Symbol for Beginner","b":"1F530","j":["beginner","chevron","Japanese","Japanese symbol for beginner","leaf","badge","shield"]},"hollow-red-circle":{"a":"Hollow Red Circle","b":"2B55","j":["circle","large","o","red","round"]},"check-mark-button":{"a":"Check Mark Button","b":"2705","j":["✓","button","check","mark","green-square","ok","agree","vote","election","answer","tick"]},"check-box-with-check":{"a":"Check Box with Check","b":"2611","j":["✓","box","check","ok","agree","confirm","black-square","vote","election","yes","tick"]},"check-mark":{"a":"Check Mark","b":"2714","j":["✓","check","mark","ok","nike","answer","yes","tick"]},"cross-mark":{"a":"Cross Mark","b":"274C","j":["×","cancel","cross","mark","multiplication","multiply","x","no","delete","remove","red"]},"cross-mark-button":{"a":"Cross Mark Button","b":"274E","j":["×","mark","square","x","green-square","no","deny"]},"curly-loop":{"a":"Curly Loop","b":"27B0","j":["curl","loop","scribble","draw","shape","squiggle"]},"double-curly-loop":{"a":"Double Curly Loop","b":"27BF","j":["curl","double","loop","tape","cassette"]},"part-alternation-mark":{"a":"Part Alternation Mark","b":"303D","j":["mark","part","graph","presentation","stats","business","economics","bad"]},"eightspoked-asterisk":{"a":"Eight-Spoked Asterisk","b":"2733","j":["*","asterisk","eight-spoked asterisk","eight_spoked_asterisk","star","sparkle","green-square"]},"eightpointed-star":{"a":"Eight-Pointed Star","b":"2734","j":["*","eight-pointed star","star","eight_pointed_star","orange-square","shape","polygon"]},"sparkle":{"a":"Sparkle","b":"2747","j":["*","stars","green-square","awesome","good","fireworks"]},"copyright":{"a":"Copyright","b":"00A9","j":["c","ip","license","circle","law","legal"]},"registered":{"a":"Registered","b":"00AE","j":["r","alphabet","circle"]},"trade-mark":{"a":"Trade Mark","b":"2122","j":["mark","tm","trademark","brand","law","legal"]},"keycap":{"a":"Keycap: *","b":"002A-FE0F-20E3","j":["keycap_","star"]},"keycap-0":{"a":"Keycap: 0","b":"0030-FE0F-20E3","j":["keycap","0","numbers","blue-square","null"]},"keycap-1":{"a":"Keycap: 1","b":"0031-FE0F-20E3","j":["keycap","blue-square","numbers","1"]},"keycap-2":{"a":"Keycap: 2","b":"0032-FE0F-20E3","j":["keycap","numbers","2","prime","blue-square"]},"keycap-3":{"a":"Keycap: 3","b":"0033-FE0F-20E3","j":["keycap","3","numbers","prime","blue-square"]},"keycap-4":{"a":"Keycap: 4","b":"0034-FE0F-20E3","j":["keycap","4","numbers","blue-square"]},"keycap-5":{"a":"Keycap: 5","b":"0035-FE0F-20E3","j":["keycap","5","numbers","blue-square","prime"]},"keycap-6":{"a":"Keycap: 6","b":"0036-FE0F-20E3","j":["keycap","6","numbers","blue-square"]},"keycap-7":{"a":"Keycap: 7","b":"0037-FE0F-20E3","j":["keycap","7","numbers","blue-square","prime"]},"keycap-8":{"a":"Keycap: 8","b":"0038-FE0F-20E3","j":["keycap","8","blue-square","numbers"]},"keycap-9":{"a":"Keycap: 9","b":"0039-FE0F-20E3","j":["keycap","blue-square","numbers","9"]},"keycap-10":{"a":"Keycap: 10","b":"1F51F","j":["keycap","numbers","10","blue-square"]},"input-latin-uppercase":{"a":"Input Latin Uppercase","b":"1F520","j":["ABCD","input","latin","letters","uppercase","alphabet","words","blue-square"]},"input-latin-lowercase":{"a":"Input Latin Lowercase","b":"1F521","j":["abcd","input","latin","letters","lowercase","blue-square","alphabet"]},"input-numbers":{"a":"Input Numbers","b":"1F522","j":["1234","input","numbers","blue-square"]},"input-symbols":{"a":"Input Symbols","b":"1F523","j":["〒♪&%","input","blue-square","music","note","ampersand","percent","glyphs","characters"]},"input-latin-letters":{"a":"Input Latin Letters","b":"1F524","j":["abc","alphabet","input","latin","letters","blue-square"]},"a-button-blood-type":{"a":"A Button (Blood Type)","b":"1F170","j":["a","A button (blood type)","blood type","a_button","red-square","alphabet","letter"]},"ab-button-blood-type":{"a":"Ab Button (Blood Type)","b":"1F18E","j":["ab","AB button (blood type)","blood type","ab_button","red-square","alphabet"]},"b-button-blood-type":{"a":"B Button (Blood Type)","b":"1F171","j":["b","B button (blood type)","blood type","b_button","red-square","alphabet","letter"]},"cl-button":{"a":"Cl Button","b":"1F191","j":["cl","CL button","alphabet","words","red-square"]},"cool-button":{"a":"Cool Button","b":"1F192","j":["cool","COOL button","words","blue-square"]},"free-button":{"a":"Free Button","b":"1F193","j":["free","FREE button","blue-square","words"]},"information":{"a":"Information","b":"2139","j":["i","blue-square","alphabet","letter"]},"id-button":{"a":"Id Button","b":"1F194","j":["id","ID button","identity","purple-square","words"]},"circled-m":{"a":"Circled M","b":"24C2","j":["circle","circled M","m","alphabet","blue-circle","letter"]},"new-button":{"a":"New Button","b":"1F195","j":["new","NEW button","blue-square","words","start"]},"ng-button":{"a":"Ng Button","b":"1F196","j":["ng","NG button","blue-square","words","shape","icon"]},"o-button-blood-type":{"a":"O Button (Blood Type)","b":"1F17E","j":["blood type","o","O button (blood type)","o_button","alphabet","red-square","letter"]},"ok-button":{"a":"Ok Button","b":"1F197","j":["OK","OK button","good","agree","yes","blue-square"]},"p-button":{"a":"P Button","b":"1F17F","j":["P button","parking","cars","blue-square","alphabet","letter"]},"sos-button":{"a":"Sos Button","b":"1F198","j":["help","sos","SOS button","red-square","words","emergency","911"]},"up-button":{"a":"Up! Button","b":"1F199","j":["mark","up","UP! button","blue-square","above","high"]},"vs-button":{"a":"Vs Button","b":"1F19A","j":["versus","vs","VS button","words","orange-square"]},"japanese-here-button":{"a":"Japanese “Here” Button","b":"1F201","j":["“here”","Japanese","Japanese “here” button","katakana","ココ","blue-square","here","japanese","destination"]},"japanese-service-charge-button":{"a":"Japanese “Service Charge” Button","b":"1F202","j":["“service charge”","Japanese","Japanese “service charge” button","katakana","サ","japanese","blue-square"]},"japanese-monthly-amount-button":{"a":"Japanese “Monthly Amount” Button","b":"1F237","j":["“monthly amount”","ideograph","Japanese","Japanese “monthly amount” button","月","chinese","month","moon","japanese","orange-square","kanji"]},"japanese-not-free-of-charge-button":{"a":"Japanese “Not Free of Charge” Button","b":"1F236","j":["“not free of charge”","ideograph","Japanese","Japanese “not free of charge” button","有","orange-square","chinese","have","kanji"]},"japanese-reserved-button":{"a":"Japanese “Reserved” Button","b":"1F22F","j":["“reserved”","ideograph","Japanese","Japanese “reserved” button","指","chinese","point","green-square","kanji"]},"japanese-bargain-button":{"a":"Japanese “Bargain” Button","b":"1F250","j":["“bargain”","ideograph","Japanese","Japanese “bargain” button","得","chinese","kanji","obtain","get","circle"]},"japanese-discount-button":{"a":"Japanese “Discount” Button","b":"1F239","j":["“discount”","ideograph","Japanese","Japanese “discount” button","割","cut","divide","chinese","kanji","pink-square"]},"japanese-free-of-charge-button":{"a":"Japanese “Free of Charge” Button","b":"1F21A","j":["“free of charge”","ideograph","Japanese","Japanese “free of charge” button","無","nothing","chinese","kanji","japanese","orange-square"]},"japanese-prohibited-button":{"a":"Japanese “Prohibited” Button","b":"1F232","j":["“prohibited”","ideograph","Japanese","Japanese “prohibited” button","禁","kanji","japanese","chinese","forbidden","limit","restricted","red-square"]},"japanese-acceptable-button":{"a":"Japanese “Acceptable” Button","b":"1F251","j":["“acceptable”","ideograph","Japanese","Japanese “acceptable” button","可","ok","good","chinese","kanji","agree","yes","orange-circle"]},"japanese-application-button":{"a":"Japanese “Application” Button","b":"1F238","j":["“application”","ideograph","Japanese","Japanese “application” button","申","chinese","japanese","kanji","orange-square"]},"japanese-passing-grade-button":{"a":"Japanese “Passing Grade” Button","b":"1F234","j":["“passing grade”","ideograph","Japanese","Japanese “passing grade” button","合","japanese","chinese","join","kanji","red-square"]},"japanese-vacancy-button":{"a":"Japanese “Vacancy” Button","b":"1F233","j":["“vacancy”","ideograph","Japanese","Japanese “vacancy” button","空","kanji","japanese","chinese","empty","sky","blue-square"]},"japanese-congratulations-button":{"a":"Japanese “Congratulations” Button","b":"3297","j":["“congratulations”","ideograph","Japanese","Japanese “congratulations” button","祝","chinese","kanji","japanese","red-circle"]},"japanese-secret-button":{"a":"Japanese “Secret” Button","b":"3299","j":["“secret”","ideograph","Japanese","Japanese “secret” button","秘","privacy","chinese","sshh","kanji","red-circle"]},"japanese-open-for-business-button":{"a":"Japanese “Open for Business” Button","b":"1F23A","j":["“open for business”","ideograph","Japanese","Japanese “open for business” button","営","japanese","opening hours","orange-square"]},"japanese-no-vacancy-button":{"a":"Japanese “No Vacancy” Button","b":"1F235","j":["“no vacancy”","ideograph","Japanese","Japanese “no vacancy” button","満","full","chinese","japanese","red-square","kanji"]},"red-circle":{"a":"Red Circle","b":"1F534","j":["circle","geometric","red","shape","error","danger"]},"orange-circle":{"a":"Orange Circle","b":"1F7E0","j":["circle","orange","round"]},"yellow-circle":{"a":"Yellow Circle","b":"1F7E1","j":["circle","yellow","round"]},"green-circle":{"a":"Green Circle","b":"1F7E2","j":["circle","green","round"]},"blue-circle":{"a":"Blue Circle","b":"1F535","j":["blue","circle","geometric","shape","icon","button"]},"purple-circle":{"a":"Purple Circle","b":"1F7E3","j":["circle","purple","round"]},"brown-circle":{"a":"Brown Circle","b":"1F7E4","j":["brown","circle","round"]},"black-circle":{"a":"Black Circle","b":"26AB","j":["circle","geometric","shape","button","round"]},"white-circle":{"a":"White Circle","b":"26AA","j":["circle","geometric","shape","round"]},"red-square":{"a":"Red Square","b":"1F7E5","j":["red","square"]},"orange-square":{"a":"Orange Square","b":"1F7E7","j":["orange","square"]},"yellow-square":{"a":"Yellow Square","b":"1F7E8","j":["square","yellow"]},"green-square":{"a":"Green Square","b":"1F7E9","j":["green","square"]},"blue-square":{"a":"Blue Square","b":"1F7E6","j":["blue","square"]},"purple-square":{"a":"Purple Square","b":"1F7EA","j":["purple","square"]},"brown-square":{"a":"Brown Square","b":"1F7EB","j":["brown","square"]},"black-large-square":{"a":"Black Large Square","b":"2B1B","j":["geometric","square","shape","icon","button"]},"white-large-square":{"a":"White Large Square","b":"2B1C","j":["geometric","square","shape","icon","stone","button"]},"black-medium-square":{"a":"Black Medium Square","b":"25FC","j":["geometric","square","shape","button","icon"]},"white-medium-square":{"a":"White Medium Square","b":"25FB","j":["geometric","square","shape","stone","icon"]},"black-mediumsmall-square":{"a":"Black Medium-Small Square","b":"25FE","j":["black medium-small square","geometric","square","black_medium_small_square","icon","shape","button"]},"white-mediumsmall-square":{"a":"White Medium-Small Square","b":"25FD","j":["geometric","square","white medium-small square","white_medium_small_square","shape","stone","icon","button"]},"black-small-square":{"a":"Black Small Square","b":"25AA","j":["geometric","square","shape","icon"]},"white-small-square":{"a":"White Small Square","b":"25AB","j":["geometric","square","shape","icon"]},"large-orange-diamond":{"a":"Large Orange Diamond","b":"1F536","j":["diamond","geometric","orange","shape","jewel","gem"]},"large-blue-diamond":{"a":"Large Blue Diamond","b":"1F537","j":["blue","diamond","geometric","shape","jewel","gem"]},"small-orange-diamond":{"a":"Small Orange Diamond","b":"1F538","j":["diamond","geometric","orange","shape","jewel","gem"]},"small-blue-diamond":{"a":"Small Blue Diamond","b":"1F539","j":["blue","diamond","geometric","shape","jewel","gem"]},"red-triangle-pointed-up":{"a":"Red Triangle Pointed Up","b":"1F53A","j":["geometric","red","shape","direction","up","top"]},"red-triangle-pointed-down":{"a":"Red Triangle Pointed Down","b":"1F53B","j":["down","geometric","red","shape","direction","bottom"]},"diamond-with-a-dot":{"a":"Diamond with a Dot","b":"1F4A0","j":["comic","diamond","geometric","inside","jewel","blue","gem","crystal","fancy"]},"radio-button":{"a":"Radio Button","b":"1F518","j":["button","geometric","radio","input","old","music","circle"]},"white-square-button":{"a":"White Square Button","b":"1F533","j":["button","geometric","outlined","square","shape","input"]},"black-square-button":{"a":"Black Square Button","b":"1F532","j":["button","geometric","square","shape","input","frame"]},"chequered-flag":{"a":"Chequered Flag","b":"1F3C1","j":["checkered","chequered","racing","contest","finishline","race","gokart"]},"triangular-flag":{"a":"Triangular Flag","b":"1F6A9","j":["post","mark","milestone","place"]},"crossed-flags":{"a":"Crossed Flags","b":"1F38C","j":["celebration","cross","crossed","Japanese","japanese","nation","country","border"]},"black-flag":{"a":"Black Flag","b":"1F3F4","j":["waving","pirate"]},"white-flag":{"a":"White Flag","b":"1F3F3","j":["waving","losing","loser","lost","surrender","give up","fail"]},"rainbow-flag":{"a":"Rainbow Flag","b":"1F3F3-FE0F-200D-1F308","j":["pride","rainbow","flag","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"]},"transgender-flag":{"a":"Transgender Flag","b":"1F3F3-FE0F-200D-26A7-FE0F","j":["flag","light blue","pink","transgender","white","lgbtq"]},"pirate-flag":{"a":"Pirate Flag","b":"1F3F4-200D-2620-FE0F","j":["Jolly Roger","pirate","plunder","treasure","skull","crossbones","flag","banner"]},"flag-ascension-island":{"a":"Flag: Ascension Island","b":"1F1E6-1F1E8","j":["flag"]},"flag-andorra":{"a":"Flag: Andorra","b":"1F1E6-1F1E9","j":["flag","ad","nation","country","banner"]},"flag-united-arab-emirates":{"a":"Flag: United Arab Emirates","b":"1F1E6-1F1EA","j":["flag","united","arab","emirates","nation","country","banner"]},"flag-afghanistan":{"a":"Flag: Afghanistan","b":"1F1E6-1F1EB","j":["flag","af","nation","country","banner"]},"flag-antigua--barbuda":{"a":"Flag: Antigua & Barbuda","b":"1F1E6-1F1EC","j":["flag","flag_antigua_barbuda","antigua","barbuda","nation","country","banner"]},"flag-anguilla":{"a":"Flag: Anguilla","b":"1F1E6-1F1EE","j":["flag","ai","nation","country","banner"]},"flag-albania":{"a":"Flag: Albania","b":"1F1E6-1F1F1","j":["flag","al","nation","country","banner"]},"flag-armenia":{"a":"Flag: Armenia","b":"1F1E6-1F1F2","j":["flag","am","nation","country","banner"]},"flag-angola":{"a":"Flag: Angola","b":"1F1E6-1F1F4","j":["flag","ao","nation","country","banner"]},"flag-antarctica":{"a":"Flag: Antarctica","b":"1F1E6-1F1F6","j":["flag","aq","nation","country","banner"]},"flag-argentina":{"a":"Flag: Argentina","b":"1F1E6-1F1F7","j":["flag","ar","nation","country","banner"]},"flag-american-samoa":{"a":"Flag: American Samoa","b":"1F1E6-1F1F8","j":["flag","american","ws","nation","country","banner"]},"flag-austria":{"a":"Flag: Austria","b":"1F1E6-1F1F9","j":["flag","at","nation","country","banner"]},"flag-australia":{"a":"Flag: Australia","b":"1F1E6-1F1FA","j":["flag","au","nation","country","banner"]},"flag-aruba":{"a":"Flag: Aruba","b":"1F1E6-1F1FC","j":["flag","aw","nation","country","banner"]},"flag-land-islands":{"a":"Flag: Åland Islands","b":"1F1E6-1F1FD","j":["flag","flag_aland_islands","Åland","islands","nation","country","banner"]},"flag-azerbaijan":{"a":"Flag: Azerbaijan","b":"1F1E6-1F1FF","j":["flag","az","nation","country","banner"]},"flag-bosnia--herzegovina":{"a":"Flag: Bosnia & Herzegovina","b":"1F1E7-1F1E6","j":["flag","flag_bosnia_herzegovina","bosnia","herzegovina","nation","country","banner"]},"flag-barbados":{"a":"Flag: Barbados","b":"1F1E7-1F1E7","j":["flag","bb","nation","country","banner"]},"flag-bangladesh":{"a":"Flag: Bangladesh","b":"1F1E7-1F1E9","j":["flag","bd","nation","country","banner"]},"flag-belgium":{"a":"Flag: Belgium","b":"1F1E7-1F1EA","j":["flag","be","nation","country","banner"]},"flag-burkina-faso":{"a":"Flag: Burkina Faso","b":"1F1E7-1F1EB","j":["flag","burkina","faso","nation","country","banner"]},"flag-bulgaria":{"a":"Flag: Bulgaria","b":"1F1E7-1F1EC","j":["flag","bg","nation","country","banner"]},"flag-bahrain":{"a":"Flag: Bahrain","b":"1F1E7-1F1ED","j":["flag","bh","nation","country","banner"]},"flag-burundi":{"a":"Flag: Burundi","b":"1F1E7-1F1EE","j":["flag","bi","nation","country","banner"]},"flag-benin":{"a":"Flag: Benin","b":"1F1E7-1F1EF","j":["flag","bj","nation","country","banner"]},"flag-st-barthlemy":{"a":"Flag: St. Barthélemy","b":"1F1E7-1F1F1","j":["flag","flag_st_barthelemy","saint","barthélemy","nation","country","banner"]},"flag-bermuda":{"a":"Flag: Bermuda","b":"1F1E7-1F1F2","j":["flag","bm","nation","country","banner"]},"flag-brunei":{"a":"Flag: Brunei","b":"1F1E7-1F1F3","j":["flag","bn","darussalam","nation","country","banner"]},"flag-bolivia":{"a":"Flag: Bolivia","b":"1F1E7-1F1F4","j":["flag","bo","nation","country","banner"]},"flag-caribbean-netherlands":{"a":"Flag: Caribbean Netherlands","b":"1F1E7-1F1F6","j":["flag","bonaire","nation","country","banner"]},"flag-brazil":{"a":"Flag: Brazil","b":"1F1E7-1F1F7","j":["flag","br","nation","country","banner"]},"flag-bahamas":{"a":"Flag: Bahamas","b":"1F1E7-1F1F8","j":["flag","bs","nation","country","banner"]},"flag-bhutan":{"a":"Flag: Bhutan","b":"1F1E7-1F1F9","j":["flag","bt","nation","country","banner"]},"flag-bouvet-island":{"a":"Flag: Bouvet Island","b":"1F1E7-1F1FB","j":["flag","norway"]},"flag-botswana":{"a":"Flag: Botswana","b":"1F1E7-1F1FC","j":["flag","bw","nation","country","banner"]},"flag-belarus":{"a":"Flag: Belarus","b":"1F1E7-1F1FE","j":["flag","by","nation","country","banner"]},"flag-belize":{"a":"Flag: Belize","b":"1F1E7-1F1FF","j":["flag","bz","nation","country","banner"]},"flag-canada":{"a":"Flag: Canada","b":"1F1E8-1F1E6","j":["flag","ca","nation","country","banner"]},"flag-cocos-keeling-islands":{"a":"Flag: Cocos (Keeling) Islands","b":"1F1E8-1F1E8","j":["flag","flag_cocos_islands","cocos","keeling","islands","nation","country","banner"]},"flag-congo--kinshasa":{"a":"Flag: Congo - Kinshasa","b":"1F1E8-1F1E9","j":["flag","flag_congo_kinshasa","congo","democratic","republic","nation","country","banner"]},"flag-central-african-republic":{"a":"Flag: Central African Republic","b":"1F1E8-1F1EB","j":["flag","central","african","republic","nation","country","banner"]},"flag-congo--brazzaville":{"a":"Flag: Congo - Brazzaville","b":"1F1E8-1F1EC","j":["flag","flag_congo_brazzaville","congo","nation","country","banner"]},"flag-switzerland":{"a":"Flag: Switzerland","b":"1F1E8-1F1ED","j":["flag","ch","nation","country","banner"]},"flag-cte-divoire":{"a":"Flag: Côte D’Ivoire","b":"1F1E8-1F1EE","j":["flag","flag_cote_d_ivoire","ivory","coast","nation","country","banner"]},"flag-cook-islands":{"a":"Flag: Cook Islands","b":"1F1E8-1F1F0","j":["flag","cook","islands","nation","country","banner"]},"flag-chile":{"a":"Flag: Chile","b":"1F1E8-1F1F1","j":["flag","nation","country","banner"]},"flag-cameroon":{"a":"Flag: Cameroon","b":"1F1E8-1F1F2","j":["flag","cm","nation","country","banner"]},"flag-china":{"a":"Flag: China","b":"1F1E8-1F1F3","j":["flag","china","chinese","prc","country","nation","banner"]},"flag-colombia":{"a":"Flag: Colombia","b":"1F1E8-1F1F4","j":["flag","co","nation","country","banner"]},"flag-clipperton-island":{"a":"Flag: Clipperton Island","b":"1F1E8-1F1F5","j":["flag"]},"flag-costa-rica":{"a":"Flag: Costa Rica","b":"1F1E8-1F1F7","j":["flag","costa","rica","nation","country","banner"]},"flag-cuba":{"a":"Flag: Cuba","b":"1F1E8-1F1FA","j":["flag","cu","nation","country","banner"]},"flag-cape-verde":{"a":"Flag: Cape Verde","b":"1F1E8-1F1FB","j":["flag","cabo","verde","nation","country","banner"]},"flag-curaao":{"a":"Flag: Curaçao","b":"1F1E8-1F1FC","j":["flag","flag_curacao","curaçao","nation","country","banner"]},"flag-christmas-island":{"a":"Flag: Christmas Island","b":"1F1E8-1F1FD","j":["flag","christmas","island","nation","country","banner"]},"flag-cyprus":{"a":"Flag: Cyprus","b":"1F1E8-1F1FE","j":["flag","cy","nation","country","banner"]},"flag-czechia":{"a":"Flag: Czechia","b":"1F1E8-1F1FF","j":["flag","cz","nation","country","banner"]},"flag-germany":{"a":"Flag: Germany","b":"1F1E9-1F1EA","j":["flag","german","nation","country","banner"]},"flag-diego-garcia":{"a":"Flag: Diego Garcia","b":"1F1E9-1F1EC","j":["flag"]},"flag-djibouti":{"a":"Flag: Djibouti","b":"1F1E9-1F1EF","j":["flag","dj","nation","country","banner"]},"flag-denmark":{"a":"Flag: Denmark","b":"1F1E9-1F1F0","j":["flag","dk","nation","country","banner"]},"flag-dominica":{"a":"Flag: Dominica","b":"1F1E9-1F1F2","j":["flag","dm","nation","country","banner"]},"flag-dominican-republic":{"a":"Flag: Dominican Republic","b":"1F1E9-1F1F4","j":["flag","dominican","republic","nation","country","banner"]},"flag-algeria":{"a":"Flag: Algeria","b":"1F1E9-1F1FF","j":["flag","dz","nation","country","banner"]},"flag-ceuta--melilla":{"a":"Flag: Ceuta & Melilla","b":"1F1EA-1F1E6","j":["flag","flag_ceuta_melilla"]},"flag-ecuador":{"a":"Flag: Ecuador","b":"1F1EA-1F1E8","j":["flag","ec","nation","country","banner"]},"flag-estonia":{"a":"Flag: Estonia","b":"1F1EA-1F1EA","j":["flag","ee","nation","country","banner"]},"flag-egypt":{"a":"Flag: Egypt","b":"1F1EA-1F1EC","j":["flag","eg","nation","country","banner"]},"flag-western-sahara":{"a":"Flag: Western Sahara","b":"1F1EA-1F1ED","j":["flag","western","sahara","nation","country","banner"]},"flag-eritrea":{"a":"Flag: Eritrea","b":"1F1EA-1F1F7","j":["flag","er","nation","country","banner"]},"flag-spain":{"a":"Flag: Spain","b":"1F1EA-1F1F8","j":["flag","spain","nation","country","banner"]},"flag-ethiopia":{"a":"Flag: Ethiopia","b":"1F1EA-1F1F9","j":["flag","et","nation","country","banner"]},"flag-european-union":{"a":"Flag: European Union","b":"1F1EA-1F1FA","j":["flag","european","union","banner"]},"flag-finland":{"a":"Flag: Finland","b":"1F1EB-1F1EE","j":["flag","fi","nation","country","banner"]},"flag-fiji":{"a":"Flag: Fiji","b":"1F1EB-1F1EF","j":["flag","fj","nation","country","banner"]},"flag-falkland-islands":{"a":"Flag: Falkland Islands","b":"1F1EB-1F1F0","j":["flag","falkland","islands","malvinas","nation","country","banner"]},"flag-micronesia":{"a":"Flag: Micronesia","b":"1F1EB-1F1F2","j":["flag","micronesia","federated","states","nation","country","banner"]},"flag-faroe-islands":{"a":"Flag: Faroe Islands","b":"1F1EB-1F1F4","j":["flag","faroe","islands","nation","country","banner"]},"flag-france":{"a":"Flag: France","b":"1F1EB-1F1F7","j":["flag","banner","nation","france","french","country"]},"flag-gabon":{"a":"Flag: Gabon","b":"1F1EC-1F1E6","j":["flag","ga","nation","country","banner"]},"flag-united-kingdom":{"a":"Flag: United Kingdom","b":"1F1EC-1F1E7","j":["flag","united","kingdom","great","britain","northern","ireland","nation","country","banner","british","UK","english","england","union jack"]},"flag-grenada":{"a":"Flag: Grenada","b":"1F1EC-1F1E9","j":["flag","gd","nation","country","banner"]},"flag-georgia":{"a":"Flag: Georgia","b":"1F1EC-1F1EA","j":["flag","ge","nation","country","banner"]},"flag-french-guiana":{"a":"Flag: French Guiana","b":"1F1EC-1F1EB","j":["flag","french","guiana","nation","country","banner"]},"flag-guernsey":{"a":"Flag: Guernsey","b":"1F1EC-1F1EC","j":["flag","gg","nation","country","banner"]},"flag-ghana":{"a":"Flag: Ghana","b":"1F1EC-1F1ED","j":["flag","gh","nation","country","banner"]},"flag-gibraltar":{"a":"Flag: Gibraltar","b":"1F1EC-1F1EE","j":["flag","gi","nation","country","banner"]},"flag-greenland":{"a":"Flag: Greenland","b":"1F1EC-1F1F1","j":["flag","gl","nation","country","banner"]},"flag-gambia":{"a":"Flag: Gambia","b":"1F1EC-1F1F2","j":["flag","gm","nation","country","banner"]},"flag-guinea":{"a":"Flag: Guinea","b":"1F1EC-1F1F3","j":["flag","gn","nation","country","banner"]},"flag-guadeloupe":{"a":"Flag: Guadeloupe","b":"1F1EC-1F1F5","j":["flag","gp","nation","country","banner"]},"flag-equatorial-guinea":{"a":"Flag: Equatorial Guinea","b":"1F1EC-1F1F6","j":["flag","equatorial","gn","nation","country","banner"]},"flag-greece":{"a":"Flag: Greece","b":"1F1EC-1F1F7","j":["flag","gr","nation","country","banner"]},"flag-south-georgia--south-sandwich-islands":{"a":"Flag: South Georgia & South Sandwich Islands","b":"1F1EC-1F1F8","j":["flag","flag_south_georgia_south_sandwich_islands","south","georgia","sandwich","islands","nation","country","banner"]},"flag-guatemala":{"a":"Flag: Guatemala","b":"1F1EC-1F1F9","j":["flag","gt","nation","country","banner"]},"flag-guam":{"a":"Flag: Guam","b":"1F1EC-1F1FA","j":["flag","gu","nation","country","banner"]},"flag-guineabissau":{"a":"Flag: Guinea-Bissau","b":"1F1EC-1F1FC","j":["flag","flag_guinea_bissau","gw","bissau","nation","country","banner"]},"flag-guyana":{"a":"Flag: Guyana","b":"1F1EC-1F1FE","j":["flag","gy","nation","country","banner"]},"flag-hong-kong-sar-china":{"a":"Flag: Hong Kong Sar China","b":"1F1ED-1F1F0","j":["flag","hong","kong","nation","country","banner"]},"flag-heard--mcdonald-islands":{"a":"Flag: Heard & Mcdonald Islands","b":"1F1ED-1F1F2","j":["flag","flag_heard_mcdonald_islands"]},"flag-honduras":{"a":"Flag: Honduras","b":"1F1ED-1F1F3","j":["flag","hn","nation","country","banner"]},"flag-croatia":{"a":"Flag: Croatia","b":"1F1ED-1F1F7","j":["flag","hr","nation","country","banner"]},"flag-haiti":{"a":"Flag: Haiti","b":"1F1ED-1F1F9","j":["flag","ht","nation","country","banner"]},"flag-hungary":{"a":"Flag: Hungary","b":"1F1ED-1F1FA","j":["flag","hu","nation","country","banner"]},"flag-canary-islands":{"a":"Flag: Canary Islands","b":"1F1EE-1F1E8","j":["flag","canary","islands","nation","country","banner"]},"flag-indonesia":{"a":"Flag: Indonesia","b":"1F1EE-1F1E9","j":["flag","nation","country","banner"]},"flag-ireland":{"a":"Flag: Ireland","b":"1F1EE-1F1EA","j":["flag","ie","nation","country","banner"]},"flag-israel":{"a":"Flag: Israel","b":"1F1EE-1F1F1","j":["flag","il","nation","country","banner"]},"flag-isle-of-man":{"a":"Flag: Isle of Man","b":"1F1EE-1F1F2","j":["flag","isle","man","nation","country","banner"]},"flag-india":{"a":"Flag: India","b":"1F1EE-1F1F3","j":["flag","in","nation","country","banner"]},"flag-british-indian-ocean-territory":{"a":"Flag: British Indian Ocean Territory","b":"1F1EE-1F1F4","j":["flag","british","indian","ocean","territory","nation","country","banner"]},"flag-iraq":{"a":"Flag: Iraq","b":"1F1EE-1F1F6","j":["flag","iq","nation","country","banner"]},"flag-iran":{"a":"Flag: Iran","b":"1F1EE-1F1F7","j":["flag","iran","islamic","republic","nation","country","banner"]},"flag-iceland":{"a":"Flag: Iceland","b":"1F1EE-1F1F8","j":["flag","is","nation","country","banner"]},"flag-italy":{"a":"Flag: Italy","b":"1F1EE-1F1F9","j":["flag","italy","nation","country","banner"]},"flag-jersey":{"a":"Flag: Jersey","b":"1F1EF-1F1EA","j":["flag","je","nation","country","banner"]},"flag-jamaica":{"a":"Flag: Jamaica","b":"1F1EF-1F1F2","j":["flag","jm","nation","country","banner"]},"flag-jordan":{"a":"Flag: Jordan","b":"1F1EF-1F1F4","j":["flag","jo","nation","country","banner"]},"flag-japan":{"a":"Flag: Japan","b":"1F1EF-1F1F5","j":["flag","japanese","nation","country","banner"]},"flag-kenya":{"a":"Flag: Kenya","b":"1F1F0-1F1EA","j":["flag","ke","nation","country","banner"]},"flag-kyrgyzstan":{"a":"Flag: Kyrgyzstan","b":"1F1F0-1F1EC","j":["flag","kg","nation","country","banner"]},"flag-cambodia":{"a":"Flag: Cambodia","b":"1F1F0-1F1ED","j":["flag","kh","nation","country","banner"]},"flag-kiribati":{"a":"Flag: Kiribati","b":"1F1F0-1F1EE","j":["flag","ki","nation","country","banner"]},"flag-comoros":{"a":"Flag: Comoros","b":"1F1F0-1F1F2","j":["flag","km","nation","country","banner"]},"flag-st-kitts--nevis":{"a":"Flag: St. Kitts & Nevis","b":"1F1F0-1F1F3","j":["flag","flag_st_kitts_nevis","saint","kitts","nevis","nation","country","banner"]},"flag-north-korea":{"a":"Flag: North Korea","b":"1F1F0-1F1F5","j":["flag","north","korea","nation","country","banner"]},"flag-south-korea":{"a":"Flag: South Korea","b":"1F1F0-1F1F7","j":["flag","south","korea","nation","country","banner"]},"flag-kuwait":{"a":"Flag: Kuwait","b":"1F1F0-1F1FC","j":["flag","kw","nation","country","banner"]},"flag-cayman-islands":{"a":"Flag: Cayman Islands","b":"1F1F0-1F1FE","j":["flag","cayman","islands","nation","country","banner"]},"flag-kazakhstan":{"a":"Flag: Kazakhstan","b":"1F1F0-1F1FF","j":["flag","kz","nation","country","banner"]},"flag-laos":{"a":"Flag: Laos","b":"1F1F1-1F1E6","j":["flag","lao","democratic","republic","nation","country","banner"]},"flag-lebanon":{"a":"Flag: Lebanon","b":"1F1F1-1F1E7","j":["flag","lb","nation","country","banner"]},"flag-st-lucia":{"a":"Flag: St. Lucia","b":"1F1F1-1F1E8","j":["flag","saint","lucia","nation","country","banner"]},"flag-liechtenstein":{"a":"Flag: Liechtenstein","b":"1F1F1-1F1EE","j":["flag","li","nation","country","banner"]},"flag-sri-lanka":{"a":"Flag: Sri Lanka","b":"1F1F1-1F1F0","j":["flag","sri","lanka","nation","country","banner"]},"flag-liberia":{"a":"Flag: Liberia","b":"1F1F1-1F1F7","j":["flag","lr","nation","country","banner"]},"flag-lesotho":{"a":"Flag: Lesotho","b":"1F1F1-1F1F8","j":["flag","ls","nation","country","banner"]},"flag-lithuania":{"a":"Flag: Lithuania","b":"1F1F1-1F1F9","j":["flag","lt","nation","country","banner"]},"flag-luxembourg":{"a":"Flag: Luxembourg","b":"1F1F1-1F1FA","j":["flag","lu","nation","country","banner"]},"flag-latvia":{"a":"Flag: Latvia","b":"1F1F1-1F1FB","j":["flag","lv","nation","country","banner"]},"flag-libya":{"a":"Flag: Libya","b":"1F1F1-1F1FE","j":["flag","ly","nation","country","banner"]},"flag-morocco":{"a":"Flag: Morocco","b":"1F1F2-1F1E6","j":["flag","ma","nation","country","banner"]},"flag-monaco":{"a":"Flag: Monaco","b":"1F1F2-1F1E8","j":["flag","mc","nation","country","banner"]},"flag-moldova":{"a":"Flag: Moldova","b":"1F1F2-1F1E9","j":["flag","moldova","republic","nation","country","banner"]},"flag-montenegro":{"a":"Flag: Montenegro","b":"1F1F2-1F1EA","j":["flag","me","nation","country","banner"]},"flag-st-martin":{"a":"Flag: St. Martin","b":"1F1F2-1F1EB","j":["flag"]},"flag-madagascar":{"a":"Flag: Madagascar","b":"1F1F2-1F1EC","j":["flag","mg","nation","country","banner"]},"flag-marshall-islands":{"a":"Flag: Marshall Islands","b":"1F1F2-1F1ED","j":["flag","marshall","islands","nation","country","banner"]},"flag-north-macedonia":{"a":"Flag: North Macedonia","b":"1F1F2-1F1F0","j":["flag","macedonia","nation","country","banner"]},"flag-mali":{"a":"Flag: Mali","b":"1F1F2-1F1F1","j":["flag","ml","nation","country","banner"]},"flag-myanmar-burma":{"a":"Flag: Myanmar (Burma)","b":"1F1F2-1F1F2","j":["flag","flag_myanmar","mm","nation","country","banner"]},"flag-mongolia":{"a":"Flag: Mongolia","b":"1F1F2-1F1F3","j":["flag","mn","nation","country","banner"]},"flag-macao-sar-china":{"a":"Flag: Macao Sar China","b":"1F1F2-1F1F4","j":["flag","macao","nation","country","banner"]},"flag-northern-mariana-islands":{"a":"Flag: Northern Mariana Islands","b":"1F1F2-1F1F5","j":["flag","northern","mariana","islands","nation","country","banner"]},"flag-martinique":{"a":"Flag: Martinique","b":"1F1F2-1F1F6","j":["flag","mq","nation","country","banner"]},"flag-mauritania":{"a":"Flag: Mauritania","b":"1F1F2-1F1F7","j":["flag","mr","nation","country","banner"]},"flag-montserrat":{"a":"Flag: Montserrat","b":"1F1F2-1F1F8","j":["flag","ms","nation","country","banner"]},"flag-malta":{"a":"Flag: Malta","b":"1F1F2-1F1F9","j":["flag","mt","nation","country","banner"]},"flag-mauritius":{"a":"Flag: Mauritius","b":"1F1F2-1F1FA","j":["flag","mu","nation","country","banner"]},"flag-maldives":{"a":"Flag: Maldives","b":"1F1F2-1F1FB","j":["flag","mv","nation","country","banner"]},"flag-malawi":{"a":"Flag: Malawi","b":"1F1F2-1F1FC","j":["flag","mw","nation","country","banner"]},"flag-mexico":{"a":"Flag: Mexico","b":"1F1F2-1F1FD","j":["flag","mx","nation","country","banner"]},"flag-malaysia":{"a":"Flag: Malaysia","b":"1F1F2-1F1FE","j":["flag","my","nation","country","banner"]},"flag-mozambique":{"a":"Flag: Mozambique","b":"1F1F2-1F1FF","j":["flag","mz","nation","country","banner"]},"flag-namibia":{"a":"Flag: Namibia","b":"1F1F3-1F1E6","j":["flag","na","nation","country","banner"]},"flag-new-caledonia":{"a":"Flag: New Caledonia","b":"1F1F3-1F1E8","j":["flag","new","caledonia","nation","country","banner"]},"flag-niger":{"a":"Flag: Niger","b":"1F1F3-1F1EA","j":["flag","ne","nation","country","banner"]},"flag-norfolk-island":{"a":"Flag: Norfolk Island","b":"1F1F3-1F1EB","j":["flag","norfolk","island","nation","country","banner"]},"flag-nigeria":{"a":"Flag: Nigeria","b":"1F1F3-1F1EC","j":["flag","nation","country","banner"]},"flag-nicaragua":{"a":"Flag: Nicaragua","b":"1F1F3-1F1EE","j":["flag","ni","nation","country","banner"]},"flag-netherlands":{"a":"Flag: Netherlands","b":"1F1F3-1F1F1","j":["flag","nl","nation","country","banner"]},"flag-norway":{"a":"Flag: Norway","b":"1F1F3-1F1F4","j":["flag","no","nation","country","banner"]},"flag-nepal":{"a":"Flag: Nepal","b":"1F1F3-1F1F5","j":["flag","np","nation","country","banner"]},"flag-nauru":{"a":"Flag: Nauru","b":"1F1F3-1F1F7","j":["flag","nr","nation","country","banner"]},"flag-niue":{"a":"Flag: Niue","b":"1F1F3-1F1FA","j":["flag","nu","nation","country","banner"]},"flag-new-zealand":{"a":"Flag: New Zealand","b":"1F1F3-1F1FF","j":["flag","new","zealand","nation","country","banner"]},"flag-oman":{"a":"Flag: Oman","b":"1F1F4-1F1F2","j":["flag","om_symbol","nation","country","banner"]},"flag-panama":{"a":"Flag: Panama","b":"1F1F5-1F1E6","j":["flag","pa","nation","country","banner"]},"flag-peru":{"a":"Flag: Peru","b":"1F1F5-1F1EA","j":["flag","pe","nation","country","banner"]},"flag-french-polynesia":{"a":"Flag: French Polynesia","b":"1F1F5-1F1EB","j":["flag","french","polynesia","nation","country","banner"]},"flag-papua-new-guinea":{"a":"Flag: Papua New Guinea","b":"1F1F5-1F1EC","j":["flag","papua","new","guinea","nation","country","banner"]},"flag-philippines":{"a":"Flag: Philippines","b":"1F1F5-1F1ED","j":["flag","ph","nation","country","banner"]},"flag-pakistan":{"a":"Flag: Pakistan","b":"1F1F5-1F1F0","j":["flag","pk","nation","country","banner"]},"flag-poland":{"a":"Flag: Poland","b":"1F1F5-1F1F1","j":["flag","pl","nation","country","banner"]},"flag-st-pierre--miquelon":{"a":"Flag: St. Pierre & Miquelon","b":"1F1F5-1F1F2","j":["flag","flag_st_pierre_miquelon","saint","pierre","miquelon","nation","country","banner"]},"flag-pitcairn-islands":{"a":"Flag: Pitcairn Islands","b":"1F1F5-1F1F3","j":["flag","pitcairn","nation","country","banner"]},"flag-puerto-rico":{"a":"Flag: Puerto Rico","b":"1F1F5-1F1F7","j":["flag","puerto","rico","nation","country","banner"]},"flag-palestinian-territories":{"a":"Flag: Palestinian Territories","b":"1F1F5-1F1F8","j":["flag","palestine","palestinian","territories","nation","country","banner"]},"flag-portugal":{"a":"Flag: Portugal","b":"1F1F5-1F1F9","j":["flag","pt","nation","country","banner"]},"flag-palau":{"a":"Flag: Palau","b":"1F1F5-1F1FC","j":["flag","pw","nation","country","banner"]},"flag-paraguay":{"a":"Flag: Paraguay","b":"1F1F5-1F1FE","j":["flag","py","nation","country","banner"]},"flag-qatar":{"a":"Flag: Qatar","b":"1F1F6-1F1E6","j":["flag","qa","nation","country","banner"]},"flag-runion":{"a":"Flag: Réunion","b":"1F1F7-1F1EA","j":["flag","flag_reunion","réunion","nation","country","banner"]},"flag-romania":{"a":"Flag: Romania","b":"1F1F7-1F1F4","j":["flag","ro","nation","country","banner"]},"flag-serbia":{"a":"Flag: Serbia","b":"1F1F7-1F1F8","j":["flag","rs","nation","country","banner"]},"flag-russia":{"a":"Flag: Russia","b":"1F1F7-1F1FA","j":["flag","russian","federation","nation","country","banner"]},"flag-rwanda":{"a":"Flag: Rwanda","b":"1F1F7-1F1FC","j":["flag","rw","nation","country","banner"]},"flag-saudi-arabia":{"a":"Flag: Saudi Arabia","b":"1F1F8-1F1E6","j":["flag","nation","country","banner"]},"flag-solomon-islands":{"a":"Flag: Solomon Islands","b":"1F1F8-1F1E7","j":["flag","solomon","islands","nation","country","banner"]},"flag-seychelles":{"a":"Flag: Seychelles","b":"1F1F8-1F1E8","j":["flag","sc","nation","country","banner"]},"flag-sudan":{"a":"Flag: Sudan","b":"1F1F8-1F1E9","j":["flag","sd","nation","country","banner"]},"flag-sweden":{"a":"Flag: Sweden","b":"1F1F8-1F1EA","j":["flag","se","nation","country","banner"]},"flag-singapore":{"a":"Flag: Singapore","b":"1F1F8-1F1EC","j":["flag","sg","nation","country","banner"]},"flag-st-helena":{"a":"Flag: St. Helena","b":"1F1F8-1F1ED","j":["flag","saint","helena","ascension","tristan","cunha","nation","country","banner"]},"flag-slovenia":{"a":"Flag: Slovenia","b":"1F1F8-1F1EE","j":["flag","si","nation","country","banner"]},"flag-svalbard--jan-mayen":{"a":"Flag: Svalbard & Jan Mayen","b":"1F1F8-1F1EF","j":["flag","flag_svalbard_jan_mayen"]},"flag-slovakia":{"a":"Flag: Slovakia","b":"1F1F8-1F1F0","j":["flag","sk","nation","country","banner"]},"flag-sierra-leone":{"a":"Flag: Sierra Leone","b":"1F1F8-1F1F1","j":["flag","sierra","leone","nation","country","banner"]},"flag-san-marino":{"a":"Flag: San Marino","b":"1F1F8-1F1F2","j":["flag","san","marino","nation","country","banner"]},"flag-senegal":{"a":"Flag: Senegal","b":"1F1F8-1F1F3","j":["flag","sn","nation","country","banner"]},"flag-somalia":{"a":"Flag: Somalia","b":"1F1F8-1F1F4","j":["flag","so","nation","country","banner"]},"flag-suriname":{"a":"Flag: Suriname","b":"1F1F8-1F1F7","j":["flag","sr","nation","country","banner"]},"flag-south-sudan":{"a":"Flag: South Sudan","b":"1F1F8-1F1F8","j":["flag","south","sd","nation","country","banner"]},"flag-so-tom--prncipe":{"a":"Flag: São Tomé & Príncipe","b":"1F1F8-1F1F9","j":["flag","flag_sao_tome_principe","sao","tome","principe","nation","country","banner"]},"flag-el-salvador":{"a":"Flag: El Salvador","b":"1F1F8-1F1FB","j":["flag","el","salvador","nation","country","banner"]},"flag-sint-maarten":{"a":"Flag: Sint Maarten","b":"1F1F8-1F1FD","j":["flag","sint","maarten","dutch","nation","country","banner"]},"flag-syria":{"a":"Flag: Syria","b":"1F1F8-1F1FE","j":["flag","syrian","arab","republic","nation","country","banner"]},"flag-eswatini":{"a":"Flag: Eswatini","b":"1F1F8-1F1FF","j":["flag","sz","nation","country","banner"]},"flag-tristan-da-cunha":{"a":"Flag: Tristan Da Cunha","b":"1F1F9-1F1E6","j":["flag"]},"flag-turks--caicos-islands":{"a":"Flag: Turks & Caicos Islands","b":"1F1F9-1F1E8","j":["flag","flag_turks_caicos_islands","turks","caicos","islands","nation","country","banner"]},"flag-chad":{"a":"Flag: Chad","b":"1F1F9-1F1E9","j":["flag","td","nation","country","banner"]},"flag-french-southern-territories":{"a":"Flag: French Southern Territories","b":"1F1F9-1F1EB","j":["flag","french","southern","territories","nation","country","banner"]},"flag-togo":{"a":"Flag: Togo","b":"1F1F9-1F1EC","j":["flag","tg","nation","country","banner"]},"flag-thailand":{"a":"Flag: Thailand","b":"1F1F9-1F1ED","j":["flag","th","nation","country","banner"]},"flag-tajikistan":{"a":"Flag: Tajikistan","b":"1F1F9-1F1EF","j":["flag","tj","nation","country","banner"]},"flag-tokelau":{"a":"Flag: Tokelau","b":"1F1F9-1F1F0","j":["flag","tk","nation","country","banner"]},"flag-timorleste":{"a":"Flag: Timor-Leste","b":"1F1F9-1F1F1","j":["flag","flag_timor_leste","timor","leste","nation","country","banner"]},"flag-turkmenistan":{"a":"Flag: Turkmenistan","b":"1F1F9-1F1F2","j":["flag","nation","country","banner"]},"flag-tunisia":{"a":"Flag: Tunisia","b":"1F1F9-1F1F3","j":["flag","tn","nation","country","banner"]},"flag-tonga":{"a":"Flag: Tonga","b":"1F1F9-1F1F4","j":["flag","to","nation","country","banner"]},"flag-turkey":{"a":"Flag: Turkey","b":"1F1F9-1F1F7","j":["flag","turkey","nation","country","banner"]},"flag-trinidad--tobago":{"a":"Flag: Trinidad & Tobago","b":"1F1F9-1F1F9","j":["flag","flag_trinidad_tobago","trinidad","tobago","nation","country","banner"]},"flag-tuvalu":{"a":"Flag: Tuvalu","b":"1F1F9-1F1FB","j":["flag","nation","country","banner"]},"flag-taiwan":{"a":"Flag: Taiwan","b":"1F1F9-1F1FC","j":["flag","tw","nation","country","banner"]},"flag-tanzania":{"a":"Flag: Tanzania","b":"1F1F9-1F1FF","j":["flag","tanzania","united","republic","nation","country","banner"]},"flag-ukraine":{"a":"Flag: Ukraine","b":"1F1FA-1F1E6","j":["flag","ua","nation","country","banner"]},"flag-uganda":{"a":"Flag: Uganda","b":"1F1FA-1F1EC","j":["flag","ug","nation","country","banner"]},"flag-us-outlying-islands":{"a":"Flag: U.S. Outlying Islands","b":"1F1FA-1F1F2","j":["flag","flag_u_s_outlying_islands"]},"flag-united-nations":{"a":"Flag: United Nations","b":"1F1FA-1F1F3","j":["flag","un","banner"]},"flag-united-states":{"a":"Flag: United States","b":"1F1FA-1F1F8","j":["flag","united","states","america","nation","country","banner"]},"flag-uruguay":{"a":"Flag: Uruguay","b":"1F1FA-1F1FE","j":["flag","uy","nation","country","banner"]},"flag-uzbekistan":{"a":"Flag: Uzbekistan","b":"1F1FA-1F1FF","j":["flag","uz","nation","country","banner"]},"flag-vatican-city":{"a":"Flag: Vatican City","b":"1F1FB-1F1E6","j":["flag","vatican","city","nation","country","banner"]},"flag-st-vincent--grenadines":{"a":"Flag: St. Vincent & Grenadines","b":"1F1FB-1F1E8","j":["flag","flag_st_vincent_grenadines","saint","vincent","grenadines","nation","country","banner"]},"flag-venezuela":{"a":"Flag: Venezuela","b":"1F1FB-1F1EA","j":["flag","ve","bolivarian","republic","nation","country","banner"]},"flag-british-virgin-islands":{"a":"Flag: British Virgin Islands","b":"1F1FB-1F1EC","j":["flag","british","virgin","islands","bvi","nation","country","banner"]},"flag-us-virgin-islands":{"a":"Flag: U.S. Virgin Islands","b":"1F1FB-1F1EE","j":["flag","flag_u_s_virgin_islands","virgin","islands","us","nation","country","banner"]},"flag-vietnam":{"a":"Flag: Vietnam","b":"1F1FB-1F1F3","j":["flag","viet","nam","nation","country","banner"]},"flag-vanuatu":{"a":"Flag: Vanuatu","b":"1F1FB-1F1FA","j":["flag","vu","nation","country","banner"]},"flag-wallis--futuna":{"a":"Flag: Wallis & Futuna","b":"1F1FC-1F1EB","j":["flag","flag_wallis_futuna","wallis","futuna","nation","country","banner"]},"flag-samoa":{"a":"Flag: Samoa","b":"1F1FC-1F1F8","j":["flag","ws","nation","country","banner"]},"flag-kosovo":{"a":"Flag: Kosovo","b":"1F1FD-1F1F0","j":["flag","xk","nation","country","banner"]},"flag-yemen":{"a":"Flag: Yemen","b":"1F1FE-1F1EA","j":["flag","ye","nation","country","banner"]},"flag-mayotte":{"a":"Flag: Mayotte","b":"1F1FE-1F1F9","j":["flag","yt","nation","country","banner"]},"flag-south-africa":{"a":"Flag: South Africa","b":"1F1FF-1F1E6","j":["flag","south","africa","nation","country","banner"]},"flag-zambia":{"a":"Flag: Zambia","b":"1F1FF-1F1F2","j":["flag","zm","nation","country","banner"]},"flag-zimbabwe":{"a":"Flag: Zimbabwe","b":"1F1FF-1F1FC","j":["flag","zw","nation","country","banner"]},"flag-england":{"a":"Flag: England","b":"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F","j":["flag","english"]},"flag-scotland":{"a":"Flag: Scotland","b":"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F","j":["flag","scottish"]},"flag-wales":{"a":"Flag: Wales","b":"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F","j":["flag","welsh"]}},"aliases":{}} \ No newline at end of file +{"compressed":true,"categories":[{"id":"smileys_&_emotion","name":"Smileys & Emotion","emojis":["grinning-face","grinning-face-with-big-eyes","grinning-face-with-smiling-eyes","beaming-face-with-smiling-eyes","grinning-squinting-face","grinning-face-with-sweat","rolling-on-the-floor-laughing","face-with-tears-of-joy","slightly-smiling-face","upsidedown-face","winking-face","smiling-face-with-smiling-eyes","smiling-face-with-halo","smiling-face-with-hearts","smiling-face-with-hearteyes","starstruck","face-blowing-a-kiss","kissing-face","smiling-face","kissing-face-with-closed-eyes","kissing-face-with-smiling-eyes","smiling-face-with-tear","face-savoring-food","face-with-tongue","winking-face-with-tongue","zany-face","squinting-face-with-tongue","moneymouth-face","hugging-face","face-with-hand-over-mouth","shushing-face","thinking-face","zippermouth-face","face-with-raised-eyebrow","neutral-face","expressionless-face","face-without-mouth","face-in-clouds","smirking-face","unamused-face","face-with-rolling-eyes","grimacing-face","face-exhaling","lying-face","relieved-face","pensive-face","sleepy-face","drooling-face","sleeping-face","face-with-medical-mask","face-with-thermometer","face-with-headbandage","nauseated-face","face-vomiting","sneezing-face","hot-face","cold-face","woozy-face","knockedout-face","face-with-spiral-eyes","exploding-head","cowboy-hat-face","partying-face","disguised-face","smiling-face-with-sunglasses","nerd-face","face-with-monocle","confused-face","worried-face","slightly-frowning-face","frowning-face","face-with-open-mouth","hushed-face","astonished-face","flushed-face","pleading-face","frowning-face-with-open-mouth","anguished-face","fearful-face","anxious-face-with-sweat","sad-but-relieved-face","crying-face","loudly-crying-face","face-screaming-in-fear","confounded-face","persevering-face","disappointed-face","downcast-face-with-sweat","weary-face","tired-face","yawning-face","face-with-steam-from-nose","pouting-face","angry-face","face-with-symbols-on-mouth","smiling-face-with-horns","angry-face-with-horns","skull","skull-and-crossbones","pile-of-poo","clown-face","ogre","goblin","ghost","alien","alien-monster","robot","grinning-cat","grinning-cat-with-smiling-eyes","cat-with-tears-of-joy","smiling-cat-with-hearteyes","cat-with-wry-smile","kissing-cat","weary-cat","crying-cat","pouting-cat","seenoevil-monkey","hearnoevil-monkey","speaknoevil-monkey","kiss-mark","love-letter","heart-with-arrow","heart-with-ribbon","sparkling-heart","growing-heart","beating-heart","revolving-hearts","two-hearts","heart-decoration","heart-exclamation","broken-heart","heart-on-fire","mending-heart","red-heart","orange-heart","yellow-heart","green-heart","blue-heart","purple-heart","brown-heart","black-heart","white-heart","hundred-points","anger-symbol","collision","dizzy","sweat-droplets","dashing-away","hole","bomb","speech-balloon","eye-in-speech-bubble","left-speech-bubble","right-anger-bubble","thought-balloon","zzz"]},{"id":"people_&_body","name":"People & Body","emojis":["waving-hand","raised-back-of-hand","hand-with-fingers-splayed","raised-hand","vulcan-salute","ok-hand","pinched-fingers","pinching-hand","victory-hand","crossed-fingers","loveyou-gesture","sign-of-the-horns","call-me-hand","backhand-index-pointing-left","backhand-index-pointing-right","backhand-index-pointing-up","middle-finger","backhand-index-pointing-down","index-pointing-up","thumbs-up","thumbs-down","raised-fist","oncoming-fist","leftfacing-fist","rightfacing-fist","clapping-hands","raising-hands","open-hands","palms-up-together","handshake","folded-hands","writing-hand","nail-polish","selfie","flexed-biceps","mechanical-arm","mechanical-leg","leg","foot","ear","ear-with-hearing-aid","nose","brain","anatomical-heart","lungs","tooth","bone","eyes","eye","tongue","mouth","baby","child","boy","girl","person","person-blond-hair","man","person-beard","man-beard","woman-beard","man-red-hair","man-curly-hair","man-white-hair","man-bald","woman","woman-red-hair","person-red-hair","woman-curly-hair","person-curly-hair","woman-white-hair","person-white-hair","woman-bald","person-bald","woman-blond-hair","man-blond-hair","older-person","old-man","old-woman","person-frowning","man-frowning","woman-frowning","person-pouting","man-pouting","woman-pouting","person-gesturing-no","man-gesturing-no","woman-gesturing-no","person-gesturing-ok","man-gesturing-ok","woman-gesturing-ok","person-tipping-hand","man-tipping-hand","woman-tipping-hand","person-raising-hand","man-raising-hand","woman-raising-hand","deaf-person","deaf-man","deaf-woman","person-bowing","man-bowing","woman-bowing","person-facepalming","man-facepalming","woman-facepalming","person-shrugging","man-shrugging","woman-shrugging","health-worker","man-health-worker","woman-health-worker","student","man-student","woman-student","teacher","man-teacher","woman-teacher","judge","man-judge","woman-judge","farmer","man-farmer","woman-farmer","cook","man-cook","woman-cook","mechanic","man-mechanic","woman-mechanic","factory-worker","man-factory-worker","woman-factory-worker","office-worker","man-office-worker","woman-office-worker","scientist","man-scientist","woman-scientist","technologist","man-technologist","woman-technologist","singer","man-singer","woman-singer","artist","man-artist","woman-artist","pilot","man-pilot","woman-pilot","astronaut","man-astronaut","woman-astronaut","firefighter","man-firefighter","woman-firefighter","police-officer","man-police-officer","woman-police-officer","detective","man-detective","woman-detective","guard","man-guard","woman-guard","ninja","construction-worker","man-construction-worker","woman-construction-worker","prince","princess","person-wearing-turban","man-wearing-turban","woman-wearing-turban","person-with-skullcap","woman-with-headscarf","person-in-tuxedo","man-in-tuxedo","woman-in-tuxedo","person-with-veil","man-with-veil","woman-with-veil","pregnant-woman","breastfeeding","woman-feeding-baby","man-feeding-baby","person-feeding-baby","baby-angel","santa-claus","mrs-claus","mx-claus","superhero","man-superhero","woman-superhero","supervillain","man-supervillain","woman-supervillain","mage","man-mage","woman-mage","fairy","man-fairy","woman-fairy","vampire","man-vampire","woman-vampire","merperson","merman","mermaid","elf","man-elf","woman-elf","genie","man-genie","woman-genie","zombie","man-zombie","woman-zombie","person-getting-massage","man-getting-massage","woman-getting-massage","person-getting-haircut","man-getting-haircut","woman-getting-haircut","person-walking","man-walking","woman-walking","person-standing","man-standing","woman-standing","person-kneeling","man-kneeling","woman-kneeling","person-with-white-cane","man-with-white-cane","woman-with-white-cane","person-in-motorized-wheelchair","man-in-motorized-wheelchair","woman-in-motorized-wheelchair","person-in-manual-wheelchair","man-in-manual-wheelchair","woman-in-manual-wheelchair","person-running","man-running","woman-running","woman-dancing","man-dancing","person-in-suit-levitating","people-with-bunny-ears","men-with-bunny-ears","women-with-bunny-ears","person-in-steamy-room","man-in-steamy-room","woman-in-steamy-room","person-climbing","man-climbing","woman-climbing","person-fencing","horse-racing","skier","snowboarder","person-golfing","man-golfing","woman-golfing","person-surfing","man-surfing","woman-surfing","person-rowing-boat","man-rowing-boat","woman-rowing-boat","person-swimming","man-swimming","woman-swimming","person-bouncing-ball","man-bouncing-ball","woman-bouncing-ball","person-lifting-weights","man-lifting-weights","woman-lifting-weights","person-biking","man-biking","woman-biking","person-mountain-biking","man-mountain-biking","woman-mountain-biking","person-cartwheeling","man-cartwheeling","woman-cartwheeling","people-wrestling","men-wrestling","women-wrestling","person-playing-water-polo","man-playing-water-polo","woman-playing-water-polo","person-playing-handball","man-playing-handball","woman-playing-handball","person-juggling","man-juggling","woman-juggling","person-in-lotus-position","man-in-lotus-position","woman-in-lotus-position","person-taking-bath","person-in-bed","people-holding-hands","women-holding-hands","woman-and-man-holding-hands","men-holding-hands","kiss","kiss-woman-man","kiss-man-man","kiss-woman-woman","couple-with-heart","couple-with-heart-woman-man","couple-with-heart-man-man","couple-with-heart-woman-woman","family","family-man-woman-boy","family-man-woman-girl","family-man-woman-girl-boy","family-man-woman-boy-boy","family-man-woman-girl-girl","family-man-man-boy","family-man-man-girl","family-man-man-girl-boy","family-man-man-boy-boy","family-man-man-girl-girl","family-woman-woman-boy","family-woman-woman-girl","family-woman-woman-girl-boy","family-woman-woman-boy-boy","family-woman-woman-girl-girl","family-man-boy","family-man-boy-boy","family-man-girl","family-man-girl-boy","family-man-girl-girl","family-woman-boy","family-woman-boy-boy","family-woman-girl","family-woman-girl-boy","family-woman-girl-girl","speaking-head","bust-in-silhouette","busts-in-silhouette","people-hugging","footprints"]},{"id":"animals_&_nature","name":"Animals & Nature","emojis":["monkey-face","monkey","gorilla","orangutan","dog-face","dog","guide-dog","service-dog","poodle","wolf","fox","raccoon","cat-face","cat","black-cat","lion","tiger-face","tiger","leopard","horse-face","horse","unicorn","zebra","deer","bison","cow-face","ox","water-buffalo","cow","pig-face","pig","boar","pig-nose","ram","ewe","goat","camel","twohump-camel","llama","giraffe","elephant","mammoth","rhinoceros","hippopotamus","mouse-face","mouse","rat","hamster","rabbit-face","rabbit","chipmunk","beaver","hedgehog","bat","bear","polar-bear","koala","panda","sloth","otter","skunk","kangaroo","badger","paw-prints","turkey","chicken","rooster","hatching-chick","baby-chick","frontfacing-baby-chick","bird","penguin","dove","eagle","duck","swan","owl","dodo","feather","flamingo","peacock","parrot","frog","crocodile","turtle","lizard","snake","dragon-face","dragon","sauropod","trex","spouting-whale","whale","dolphin","seal","fish","tropical-fish","blowfish","shark","octopus","spiral-shell","snail","butterfly","bug","ant","honeybee","beetle","lady-beetle","cricket","cockroach","spider","spider-web","scorpion","mosquito","fly","worm","microbe","bouquet","cherry-blossom","white-flower","rosette","rose","wilted-flower","hibiscus","sunflower","blossom","tulip","seedling","potted-plant","evergreen-tree","deciduous-tree","palm-tree","cactus","sheaf-of-rice","herb","shamrock","four-leaf-clover","maple-leaf","fallen-leaf","leaf-fluttering-in-wind"]},{"id":"food_&_drink","name":"Food & Drink","emojis":["grapes","melon","watermelon","tangerine","lemon","banana","pineapple","mango","red-apple","green-apple","pear","peach","cherries","strawberry","blueberries","kiwi-fruit","tomato","olive","coconut","avocado","eggplant","potato","carrot","ear-of-corn","hot-pepper","bell-pepper","cucumber","leafy-green","broccoli","garlic","onion","mushroom","peanuts","chestnut","bread","croissant","baguette-bread","flatbread","pretzel","bagel","pancakes","waffle","cheese-wedge","meat-on-bone","poultry-leg","cut-of-meat","bacon","hamburger","french-fries","pizza","hot-dog","sandwich","taco","burrito","tamale","stuffed-flatbread","falafel","egg","cooking","shallow-pan-of-food","pot-of-food","fondue","bowl-with-spoon","green-salad","popcorn","butter","salt","canned-food","bento-box","rice-cracker","rice-ball","cooked-rice","curry-rice","steaming-bowl","spaghetti","roasted-sweet-potato","oden","sushi","fried-shrimp","fish-cake-with-swirl","moon-cake","dango","dumpling","fortune-cookie","takeout-box","crab","lobster","shrimp","squid","oyster","soft-ice-cream","shaved-ice","ice-cream","doughnut","cookie","birthday-cake","shortcake","cupcake","pie","chocolate-bar","candy","lollipop","custard","honey-pot","baby-bottle","glass-of-milk","hot-beverage","teapot","teacup-without-handle","sake","bottle-with-popping-cork","wine-glass","cocktail-glass","tropical-drink","beer-mug","clinking-beer-mugs","clinking-glasses","tumbler-glass","cup-with-straw","bubble-tea","beverage-box","mate","ice","chopsticks","fork-and-knife-with-plate","fork-and-knife","spoon","kitchen-knife","amphora"]},{"id":"travel_&_places","name":"Travel & Places","emojis":["globe-showing-europeafrica","globe-showing-americas","globe-showing-asiaaustralia","globe-with-meridians","world-map","map-of-japan","compass","snowcapped-mountain","mountain","volcano","mount-fuji","camping","beach-with-umbrella","desert","desert-island","national-park","stadium","classical-building","building-construction","brick","rock","wood","hut","houses","derelict-house","house","house-with-garden","office-building","japanese-post-office","post-office","hospital","bank","hotel","love-hotel","convenience-store","school","department-store","factory","japanese-castle","castle","wedding","tokyo-tower","statue-of-liberty","church","mosque","hindu-temple","synagogue","shinto-shrine","kaaba","fountain","tent","foggy","night-with-stars","cityscape","sunrise-over-mountains","sunrise","cityscape-at-dusk","sunset","bridge-at-night","hot-springs","carousel-horse","ferris-wheel","roller-coaster","barber-pole","circus-tent","locomotive","railway-car","highspeed-train","bullet-train","train","metro","light-rail","station","tram","monorail","mountain-railway","tram-car","bus","oncoming-bus","trolleybus","minibus","ambulance","fire-engine","police-car","oncoming-police-car","taxi","oncoming-taxi","automobile","oncoming-automobile","sport-utility-vehicle","pickup-truck","delivery-truck","articulated-lorry","tractor","racing-car","motorcycle","motor-scooter","manual-wheelchair","motorized-wheelchair","auto-rickshaw","bicycle","kick-scooter","skateboard","roller-skate","bus-stop","motorway","railway-track","oil-drum","fuel-pump","police-car-light","horizontal-traffic-light","vertical-traffic-light","stop-sign","construction","anchor","sailboat","canoe","speedboat","passenger-ship","ferry","motor-boat","ship","airplane","small-airplane","airplane-departure","airplane-arrival","parachute","seat","helicopter","suspension-railway","mountain-cableway","aerial-tramway","satellite","rocket","flying-saucer","bellhop-bell","luggage","hourglass-done","hourglass-not-done","watch","alarm-clock","stopwatch","timer-clock","mantelpiece-clock","twelve-oclock","twelvethirty","one-oclock","onethirty","two-oclock","twothirty","three-oclock","threethirty","four-oclock","fourthirty","five-oclock","fivethirty","six-oclock","sixthirty","seven-oclock","seventhirty","eight-oclock","eightthirty","nine-oclock","ninethirty","ten-oclock","tenthirty","eleven-oclock","eleventhirty","new-moon","waxing-crescent-moon","first-quarter-moon","waxing-gibbous-moon","full-moon","waning-gibbous-moon","last-quarter-moon","waning-crescent-moon","crescent-moon","new-moon-face","first-quarter-moon-face","last-quarter-moon-face","thermometer","sun","full-moon-face","sun-with-face","ringed-planet","star","glowing-star","shooting-star","milky-way","cloud","sun-behind-cloud","cloud-with-lightning-and-rain","sun-behind-small-cloud","sun-behind-large-cloud","sun-behind-rain-cloud","cloud-with-rain","cloud-with-snow","cloud-with-lightning","tornado","fog","wind-face","cyclone","rainbow","closed-umbrella","umbrella","umbrella-with-rain-drops","umbrella-on-ground","high-voltage","snowflake","snowman","snowman-without-snow","comet","fire","droplet","water-wave"]},{"id":"activities","name":"Activities","emojis":["jackolantern","christmas-tree","fireworks","sparkler","firecracker","sparkles","balloon","party-popper","confetti-ball","tanabata-tree","pine-decoration","japanese-dolls","carp-streamer","wind-chime","moon-viewing-ceremony","red-envelope","ribbon","wrapped-gift","reminder-ribbon","admission-tickets","ticket","military-medal","trophy","sports-medal","1st-place-medal","2nd-place-medal","3rd-place-medal","soccer-ball","baseball","softball","basketball","volleyball","american-football","rugby-football","tennis","flying-disc","bowling","cricket-game","field-hockey","ice-hockey","lacrosse","ping-pong","badminton","boxing-glove","martial-arts-uniform","goal-net","flag-in-hole","ice-skate","fishing-pole","diving-mask","running-shirt","skis","sled","curling-stone","bullseye","yoyo","kite","pool-8-ball","crystal-ball","magic-wand","nazar-amulet","video-game","joystick","slot-machine","game-die","puzzle-piece","teddy-bear","piata","nesting-dolls","spade-suit","heart-suit","diamond-suit","club-suit","chess-pawn","joker","mahjong-red-dragon","flower-playing-cards","performing-arts","framed-picture","artist-palette","thread","sewing-needle","yarn","knot"]},{"id":"objects","name":"Objects","emojis":["glasses","sunglasses","goggles","lab-coat","safety-vest","necktie","tshirt","jeans","scarf","gloves","coat","socks","dress","kimono","sari","onepiece-swimsuit","briefs","shorts","bikini","womans-clothes","purse","handbag","clutch-bag","shopping-bags","backpack","thong-sandal","mans-shoe","running-shoe","hiking-boot","flat-shoe","highheeled-shoe","womans-sandal","ballet-shoes","womans-boot","crown","womans-hat","top-hat","graduation-cap","billed-cap","military-helmet","rescue-workers-helmet","prayer-beads","lipstick","ring","gem-stone","muted-speaker","speaker-low-volume","speaker-medium-volume","speaker-high-volume","loudspeaker","megaphone","postal-horn","bell","bell-with-slash","musical-score","musical-note","musical-notes","studio-microphone","level-slider","control-knobs","microphone","headphone","radio","saxophone","accordion","guitar","musical-keyboard","trumpet","violin","banjo","drum","long-drum","mobile-phone","mobile-phone-with-arrow","telephone","telephone-receiver","pager","fax-machine","battery","electric-plug","laptop","desktop-computer","printer","keyboard","computer-mouse","trackball","computer-disk","floppy-disk","optical-disk","dvd","abacus","movie-camera","film-frames","film-projector","clapper-board","television","camera","camera-with-flash","video-camera","videocassette","magnifying-glass-tilted-left","magnifying-glass-tilted-right","candle","light-bulb","flashlight","red-paper-lantern","diya-lamp","notebook-with-decorative-cover","closed-book","open-book","green-book","blue-book","orange-book","books","notebook","ledger","page-with-curl","scroll","page-facing-up","newspaper","rolledup-newspaper","bookmark-tabs","bookmark","label","money-bag","coin","yen-banknote","dollar-banknote","euro-banknote","pound-banknote","money-with-wings","credit-card","receipt","chart-increasing-with-yen","envelope","email","incoming-envelope","envelope-with-arrow","outbox-tray","inbox-tray","package","closed-mailbox-with-raised-flag","closed-mailbox-with-lowered-flag","open-mailbox-with-raised-flag","open-mailbox-with-lowered-flag","postbox","ballot-box-with-ballot","pencil","black-nib","fountain-pen","pen","paintbrush","crayon","memo","briefcase","file-folder","open-file-folder","card-index-dividers","calendar","tearoff-calendar","spiral-notepad","spiral-calendar","card-index","chart-increasing","chart-decreasing","bar-chart","clipboard","pushpin","round-pushpin","paperclip","linked-paperclips","straight-ruler","triangular-ruler","scissors","card-file-box","file-cabinet","wastebasket","locked","unlocked","locked-with-pen","locked-with-key","key","old-key","hammer","axe","pick","hammer-and-pick","hammer-and-wrench","dagger","crossed-swords","water-pistol","boomerang","bow-and-arrow","shield","carpentry-saw","wrench","screwdriver","nut-and-bolt","gear","clamp","balance-scale","white-cane","link","chains","hook","toolbox","magnet","ladder","alembic","test-tube","petri-dish","dna","microscope","telescope","satellite-antenna","syringe","drop-of-blood","pill","adhesive-bandage","stethoscope","door","elevator","mirror","window","bed","couch-and-lamp","chair","toilet","plunger","shower","bathtub","mouse-trap","razor","lotion-bottle","safety-pin","broom","basket","roll-of-paper","bucket","soap","toothbrush","sponge","fire-extinguisher","shopping-cart","cigarette","coffin","headstone","funeral-urn","moai","placard"]},{"id":"symbols","name":"Symbols","emojis":["atm-sign","litter-in-bin-sign","potable-water","wheelchair-symbol","mens-room","womens-room","restroom","baby-symbol","water-closet","passport-control","customs","baggage-claim","left-luggage","warning","children-crossing","no-entry","prohibited","no-bicycles","no-smoking","no-littering","nonpotable-water","no-pedestrians","no-mobile-phones","no-one-under-eighteen","radioactive","biohazard","up-arrow","upright-arrow","right-arrow","downright-arrow","down-arrow","downleft-arrow","left-arrow","upleft-arrow","updown-arrow","leftright-arrow","right-arrow-curving-left","left-arrow-curving-right","right-arrow-curving-up","right-arrow-curving-down","clockwise-vertical-arrows","counterclockwise-arrows-button","back-arrow","end-arrow","on-arrow","soon-arrow","top-arrow","place-of-worship","atom-symbol","om","star-of-david","wheel-of-dharma","yin-yang","latin-cross","orthodox-cross","star-and-crescent","peace-symbol","menorah","dotted-sixpointed-star","aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces","ophiuchus","shuffle-tracks-button","repeat-button","repeat-single-button","play-button","fastforward-button","next-track-button","play-or-pause-button","reverse-button","fast-reverse-button","last-track-button","upwards-button","fast-up-button","downwards-button","fast-down-button","pause-button","stop-button","record-button","eject-button","cinema","dim-button","bright-button","antenna-bars","vibration-mode","mobile-phone-off","female-sign","male-sign","transgender-symbol","multiply","plus","minus","divide","infinity","double-exclamation-mark","exclamation-question-mark","red-question-mark","white-question-mark","white-exclamation-mark","red-exclamation-mark","wavy-dash","currency-exchange","heavy-dollar-sign","medical-symbol","recycling-symbol","fleurdelis","trident-emblem","name-badge","japanese-symbol-for-beginner","hollow-red-circle","check-mark-button","check-box-with-check","check-mark","cross-mark","cross-mark-button","curly-loop","double-curly-loop","part-alternation-mark","eightspoked-asterisk","eightpointed-star","sparkle","copyright","registered","trade-mark","keycap","keycap","keycap-0","keycap-1","keycap-2","keycap-3","keycap-4","keycap-5","keycap-6","keycap-7","keycap-8","keycap-9","keycap-10","input-latin-uppercase","input-latin-lowercase","input-numbers","input-symbols","input-latin-letters","a-button-blood-type","ab-button-blood-type","b-button-blood-type","cl-button","cool-button","free-button","information","id-button","circled-m","new-button","ng-button","o-button-blood-type","ok-button","p-button","sos-button","up-button","vs-button","japanese-here-button","japanese-service-charge-button","japanese-monthly-amount-button","japanese-not-free-of-charge-button","japanese-reserved-button","japanese-bargain-button","japanese-discount-button","japanese-free-of-charge-button","japanese-prohibited-button","japanese-acceptable-button","japanese-application-button","japanese-passing-grade-button","japanese-vacancy-button","japanese-congratulations-button","japanese-secret-button","japanese-open-for-business-button","japanese-no-vacancy-button","red-circle","orange-circle","yellow-circle","green-circle","blue-circle","purple-circle","brown-circle","black-circle","white-circle","red-square","orange-square","yellow-square","green-square","blue-square","purple-square","brown-square","black-large-square","white-large-square","black-medium-square","white-medium-square","black-mediumsmall-square","white-mediumsmall-square","black-small-square","white-small-square","large-orange-diamond","large-blue-diamond","small-orange-diamond","small-blue-diamond","red-triangle-pointed-up","red-triangle-pointed-down","diamond-with-a-dot","radio-button","white-square-button","black-square-button"]},{"id":"flags","name":"Flags","emojis":["chequered-flag","triangular-flag","crossed-flags","black-flag","white-flag","rainbow-flag","transgender-flag","pirate-flag","flag-ascension-island","flag-andorra","flag-united-arab-emirates","flag-afghanistan","flag-antigua--barbuda","flag-anguilla","flag-albania","flag-armenia","flag-angola","flag-antarctica","flag-argentina","flag-american-samoa","flag-austria","flag-australia","flag-aruba","flag-land-islands","flag-azerbaijan","flag-bosnia--herzegovina","flag-barbados","flag-bangladesh","flag-belgium","flag-burkina-faso","flag-bulgaria","flag-bahrain","flag-burundi","flag-benin","flag-st-barthlemy","flag-bermuda","flag-brunei","flag-bolivia","flag-caribbean-netherlands","flag-brazil","flag-bahamas","flag-bhutan","flag-bouvet-island","flag-botswana","flag-belarus","flag-belize","flag-canada","flag-cocos-keeling-islands","flag-congo--kinshasa","flag-central-african-republic","flag-congo--brazzaville","flag-switzerland","flag-cte-divoire","flag-cook-islands","flag-chile","flag-cameroon","flag-china","flag-colombia","flag-clipperton-island","flag-costa-rica","flag-cuba","flag-cape-verde","flag-curaao","flag-christmas-island","flag-cyprus","flag-czechia","flag-germany","flag-diego-garcia","flag-djibouti","flag-denmark","flag-dominica","flag-dominican-republic","flag-algeria","flag-ceuta--melilla","flag-ecuador","flag-estonia","flag-egypt","flag-western-sahara","flag-eritrea","flag-spain","flag-ethiopia","flag-european-union","flag-finland","flag-fiji","flag-falkland-islands","flag-micronesia","flag-faroe-islands","flag-france","flag-gabon","flag-united-kingdom","flag-grenada","flag-georgia","flag-french-guiana","flag-guernsey","flag-ghana","flag-gibraltar","flag-greenland","flag-gambia","flag-guinea","flag-guadeloupe","flag-equatorial-guinea","flag-greece","flag-south-georgia--south-sandwich-islands","flag-guatemala","flag-guam","flag-guineabissau","flag-guyana","flag-hong-kong-sar-china","flag-heard--mcdonald-islands","flag-honduras","flag-croatia","flag-haiti","flag-hungary","flag-canary-islands","flag-indonesia","flag-ireland","flag-israel","flag-isle-of-man","flag-india","flag-british-indian-ocean-territory","flag-iraq","flag-iran","flag-iceland","flag-italy","flag-jersey","flag-jamaica","flag-jordan","flag-japan","flag-kenya","flag-kyrgyzstan","flag-cambodia","flag-kiribati","flag-comoros","flag-st-kitts--nevis","flag-north-korea","flag-south-korea","flag-kuwait","flag-cayman-islands","flag-kazakhstan","flag-laos","flag-lebanon","flag-st-lucia","flag-liechtenstein","flag-sri-lanka","flag-liberia","flag-lesotho","flag-lithuania","flag-luxembourg","flag-latvia","flag-libya","flag-morocco","flag-monaco","flag-moldova","flag-montenegro","flag-st-martin","flag-madagascar","flag-marshall-islands","flag-north-macedonia","flag-mali","flag-myanmar-burma","flag-mongolia","flag-macao-sar-china","flag-northern-mariana-islands","flag-martinique","flag-mauritania","flag-montserrat","flag-malta","flag-mauritius","flag-maldives","flag-malawi","flag-mexico","flag-malaysia","flag-mozambique","flag-namibia","flag-new-caledonia","flag-niger","flag-norfolk-island","flag-nigeria","flag-nicaragua","flag-netherlands","flag-norway","flag-nepal","flag-nauru","flag-niue","flag-new-zealand","flag-oman","flag-panama","flag-peru","flag-french-polynesia","flag-papua-new-guinea","flag-philippines","flag-pakistan","flag-poland","flag-st-pierre--miquelon","flag-pitcairn-islands","flag-puerto-rico","flag-palestinian-territories","flag-portugal","flag-palau","flag-paraguay","flag-qatar","flag-runion","flag-romania","flag-serbia","flag-russia","flag-rwanda","flag-saudi-arabia","flag-solomon-islands","flag-seychelles","flag-sudan","flag-sweden","flag-singapore","flag-st-helena","flag-slovenia","flag-svalbard--jan-mayen","flag-slovakia","flag-sierra-leone","flag-san-marino","flag-senegal","flag-somalia","flag-suriname","flag-south-sudan","flag-so-tom--prncipe","flag-el-salvador","flag-sint-maarten","flag-syria","flag-eswatini","flag-tristan-da-cunha","flag-turks--caicos-islands","flag-chad","flag-french-southern-territories","flag-togo","flag-thailand","flag-tajikistan","flag-tokelau","flag-timorleste","flag-turkmenistan","flag-tunisia","flag-tonga","flag-turkey","flag-trinidad--tobago","flag-tuvalu","flag-taiwan","flag-tanzania","flag-ukraine","flag-uganda","flag-us-outlying-islands","flag-united-nations","flag-united-states","flag-uruguay","flag-uzbekistan","flag-vatican-city","flag-st-vincent--grenadines","flag-venezuela","flag-british-virgin-islands","flag-us-virgin-islands","flag-vietnam","flag-vanuatu","flag-wallis--futuna","flag-samoa","flag-kosovo","flag-yemen","flag-mayotte","flag-south-africa","flag-zambia","flag-zimbabwe","flag-england","flag-scotland","flag-wales"]}],"emojis":{"grinning-face":{"a":"Grinning Face","b":"1F600","j":["face","grin","smile","happy","joy",":D"]},"grinning-face-with-big-eyes":{"a":"Grinning Face with Big Eyes","b":"1F603","j":["face","mouth","open","smile","happy","joy","haha",":D",":)","funny"]},"grinning-face-with-smiling-eyes":{"a":"Grinning Face with Smiling Eyes","b":"1F604","j":["eye","face","mouth","open","smile","happy","joy","funny","haha","laugh","like",":D",":)"]},"beaming-face-with-smiling-eyes":{"a":"Beaming Face with Smiling Eyes","b":"1F601","j":["eye","face","grin","smile","happy","joy","kawaii"]},"grinning-squinting-face":{"a":"Grinning Squinting Face","b":"1F606","j":["face","laugh","mouth","satisfied","smile","happy","joy","lol","haha","glad","XD"]},"grinning-face-with-sweat":{"a":"Grinning Face with Sweat","b":"1F605","j":["cold","face","open","smile","sweat","hot","happy","laugh","relief"]},"rolling-on-the-floor-laughing":{"a":"Rolling on the Floor Laughing","b":"1F923","j":["face","floor","laugh","rofl","rolling","rotfl","laughing","lol","haha"]},"face-with-tears-of-joy":{"a":"Face with Tears of Joy","b":"1F602","j":["face","joy","laugh","tear","cry","tears","weep","happy","happytears","haha"]},"slightly-smiling-face":{"a":"Slightly Smiling Face","b":"1F642","j":["face","smile"]},"upsidedown-face":{"a":"Upside-Down Face","b":"1F643","j":["face","upside-down","upside_down_face","flipped","silly","smile"]},"winking-face":{"a":"Winking Face","b":"1F609","j":["face","wink","happy","mischievous","secret",";)","smile","eye"]},"smiling-face-with-smiling-eyes":{"a":"Smiling Face with Smiling Eyes","b":"1F60A","j":["blush","eye","face","smile","happy","flushed","crush","embarrassed","shy","joy"]},"smiling-face-with-halo":{"a":"Smiling Face with Halo","b":"1F607","j":["angel","face","fantasy","halo","innocent","heaven"]},"smiling-face-with-hearts":{"a":"Smiling Face with Hearts","b":"1F970","j":["adore","crush","hearts","in love","face","love","like","affection","valentines","infatuation"]},"smiling-face-with-hearteyes":{"a":"Smiling Face with Heart-Eyes","b":"1F60D","j":["eye","face","love","smile","smiling face with heart-eyes","smiling_face_with_heart_eyes","like","affection","valentines","infatuation","crush","heart"]},"starstruck":{"a":"Star-Struck","b":"1F929","j":["eyes","face","grinning","star","star-struck","starry-eyed","star_struck","smile","starry"]},"face-blowing-a-kiss":{"a":"Face Blowing a Kiss","b":"1F618","j":["face","kiss","love","like","affection","valentines","infatuation"]},"kissing-face":{"a":"Kissing Face","b":"1F617","j":["face","kiss","love","like","3","valentines","infatuation"]},"smiling-face":{"a":"Smiling Face","b":"263A","j":["face","outlined","relaxed","smile","blush","massage","happiness"]},"kissing-face-with-closed-eyes":{"a":"Kissing Face with Closed Eyes","b":"1F61A","j":["closed","eye","face","kiss","love","like","affection","valentines","infatuation"]},"kissing-face-with-smiling-eyes":{"a":"Kissing Face with Smiling Eyes","b":"1F619","j":["eye","face","kiss","smile","affection","valentines","infatuation"]},"smiling-face-with-tear":{"a":"Smiling Face with Tear","b":"1F972","j":["grateful","proud","relieved","smiling","tear","touched","sad","cry","pretend"]},"face-savoring-food":{"a":"Face Savoring Food","b":"1F60B","j":["delicious","face","savouring","smile","yum","happy","joy","tongue","silly","yummy","nom"]},"face-with-tongue":{"a":"Face with Tongue","b":"1F61B","j":["face","tongue","prank","childish","playful","mischievous","smile"]},"winking-face-with-tongue":{"a":"Winking Face with Tongue","b":"1F61C","j":["eye","face","joke","tongue","wink","prank","childish","playful","mischievous","smile"]},"zany-face":{"a":"Zany Face","b":"1F92A","j":["eye","goofy","large","small","face","crazy"]},"squinting-face-with-tongue":{"a":"Squinting Face with Tongue","b":"1F61D","j":["eye","face","horrible","taste","tongue","prank","playful","mischievous","smile"]},"moneymouth-face":{"a":"Money-Mouth Face","b":"1F911","j":["face","money","money-mouth face","mouth","money_mouth_face","rich","dollar"]},"hugging-face":{"a":"Hugging Face","b":"1F917","j":["face","hug","hugging","smile"]},"face-with-hand-over-mouth":{"a":"Face with Hand over Mouth","b":"1F92D","j":["whoops","shock","sudden realization","surprise","face"]},"shushing-face":{"a":"Shushing Face","b":"1F92B","j":["quiet","shush","face","shhh"]},"thinking-face":{"a":"Thinking Face","b":"1F914","j":["face","thinking","hmmm","think","consider"]},"zippermouth-face":{"a":"Zipper-Mouth Face","b":"1F910","j":["face","mouth","zipper","zipper-mouth face","zipper_mouth_face","sealed","secret"]},"face-with-raised-eyebrow":{"a":"Face with Raised Eyebrow","b":"1F928","j":["distrust","skeptic","disapproval","disbelief","mild surprise","scepticism","face","surprise"]},"neutral-face":{"a":"Neutral Face","b":"1F610","j":["deadpan","face","meh","neutral","indifference",":|"]},"expressionless-face":{"a":"Expressionless Face","b":"1F611","j":["expressionless","face","inexpressive","meh","unexpressive","indifferent","-_-","deadpan"]},"face-without-mouth":{"a":"Face Without Mouth","b":"1F636","j":["face","mouth","quiet","silent","hellokitty"]},"face-in-clouds":{"a":"⊛ Face in Clouds","b":"1F636-200D-1F32B-FE0F","j":["absentminded","face in clouds","face in the fog","head in clouds"]},"smirking-face":{"a":"Smirking Face","b":"1F60F","j":["face","smirk","smile","mean","prank","smug","sarcasm"]},"unamused-face":{"a":"Unamused Face","b":"1F612","j":["face","unamused","unhappy","indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"]},"face-with-rolling-eyes":{"a":"Face with Rolling Eyes","b":"1F644","j":["eyeroll","eyes","face","rolling","frustrated"]},"grimacing-face":{"a":"Grimacing Face","b":"1F62C","j":["face","grimace","teeth"]},"face-exhaling":{"a":"⊛ Face Exhaling","b":"1F62E-200D-1F4A8","j":["exhale","face exhaling","gasp","groan","relief","whisper","whistle"]},"lying-face":{"a":"Lying Face","b":"1F925","j":["face","lie","pinocchio"]},"relieved-face":{"a":"Relieved Face","b":"1F60C","j":["face","relieved","relaxed","phew","massage","happiness"]},"pensive-face":{"a":"Pensive Face","b":"1F614","j":["dejected","face","pensive","sad","depressed","upset"]},"sleepy-face":{"a":"Sleepy Face","b":"1F62A","j":["face","sleep","tired","rest","nap"]},"drooling-face":{"a":"Drooling Face","b":"1F924","j":["drooling","face"]},"sleeping-face":{"a":"Sleeping Face","b":"1F634","j":["face","sleep","zzz","tired","sleepy","night"]},"face-with-medical-mask":{"a":"Face with Medical Mask","b":"1F637","j":["cold","doctor","face","mask","sick","ill","disease"]},"face-with-thermometer":{"a":"Face with Thermometer","b":"1F912","j":["face","ill","sick","thermometer","temperature","cold","fever"]},"face-with-headbandage":{"a":"Face with Head-Bandage","b":"1F915","j":["bandage","face","face with head-bandage","hurt","injury","face_with_head_bandage","injured","clumsy"]},"nauseated-face":{"a":"Nauseated Face","b":"1F922","j":["face","nauseated","vomit","gross","green","sick","throw up","ill"]},"face-vomiting":{"a":"Face Vomiting","b":"1F92E","j":["puke","sick","vomit","face"]},"sneezing-face":{"a":"Sneezing Face","b":"1F927","j":["face","gesundheit","sneeze","sick","allergy"]},"hot-face":{"a":"Hot Face","b":"1F975","j":["feverish","heat stroke","hot","red-faced","sweating","face","heat","red"]},"cold-face":{"a":"Cold Face","b":"1F976","j":["blue-faced","cold","freezing","frostbite","icicles","face","blue","frozen"]},"woozy-face":{"a":"Woozy Face","b":"1F974","j":["dizzy","intoxicated","tipsy","uneven eyes","wavy mouth","face","wavy"]},"knockedout-face":{"a":"Knocked-out Face","b":"1F635","j":["dead","face","knocked out","knocked-out face","dizzy_face","spent","unconscious","xox","dizzy"]},"face-with-spiral-eyes":{"a":"⊛ Face with Spiral Eyes","b":"1F635-200D-1F4AB","j":["dizzy","face with spiral eyes","hypnotized","spiral","trouble","whoa"]},"exploding-head":{"a":"Exploding Head","b":"1F92F","j":["mind blown","shocked","face","mind","blown"]},"cowboy-hat-face":{"a":"Cowboy Hat Face","b":"1F920","j":["cowboy","cowgirl","face","hat"]},"partying-face":{"a":"Partying Face","b":"1F973","j":["celebration","hat","horn","party","face","woohoo"]},"disguised-face":{"a":"Disguised Face","b":"1F978","j":["disguise","face","glasses","incognito","nose","pretent","brows","moustache"]},"smiling-face-with-sunglasses":{"a":"Smiling Face with Sunglasses","b":"1F60E","j":["bright","cool","face","sun","sunglasses","smile","summer","beach","sunglass"]},"nerd-face":{"a":"Nerd Face","b":"1F913","j":["face","geek","nerd","nerdy","dork"]},"face-with-monocle":{"a":"Face with Monocle","b":"1F9D0","j":["stuffy","wealthy","face"]},"confused-face":{"a":"Confused Face","b":"1F615","j":["confused","face","meh","indifference","huh","weird","hmmm",":/"]},"worried-face":{"a":"Worried Face","b":"1F61F","j":["face","worried","concern","nervous",":("]},"slightly-frowning-face":{"a":"Slightly Frowning Face","b":"1F641","j":["face","frown","frowning","disappointed","sad","upset"]},"frowning-face":{"a":"Frowning Face","b":"2639","j":["face","frown","sad","upset"]},"face-with-open-mouth":{"a":"Face with Open Mouth","b":"1F62E","j":["face","mouth","open","sympathy","surprise","impressed","wow","whoa",":O"]},"hushed-face":{"a":"Hushed Face","b":"1F62F","j":["face","hushed","stunned","surprised","woo","shh"]},"astonished-face":{"a":"Astonished Face","b":"1F632","j":["astonished","face","shocked","totally","xox","surprised","poisoned"]},"flushed-face":{"a":"Flushed Face","b":"1F633","j":["dazed","face","flushed","blush","shy","flattered"]},"pleading-face":{"a":"Pleading Face","b":"1F97A","j":["begging","mercy","puppy eyes","face"]},"frowning-face-with-open-mouth":{"a":"Frowning Face with Open Mouth","b":"1F626","j":["face","frown","mouth","open","aw","what"]},"anguished-face":{"a":"Anguished Face","b":"1F627","j":["anguished","face","stunned","nervous"]},"fearful-face":{"a":"Fearful Face","b":"1F628","j":["face","fear","fearful","scared","terrified","nervous","oops","huh"]},"anxious-face-with-sweat":{"a":"Anxious Face with Sweat","b":"1F630","j":["blue","cold","face","rushed","sweat","nervous"]},"sad-but-relieved-face":{"a":"Sad but Relieved Face","b":"1F625","j":["disappointed","face","relieved","whew","phew","sweat","nervous"]},"crying-face":{"a":"Crying Face","b":"1F622","j":["cry","face","sad","tear","tears","depressed","upset",":'("]},"loudly-crying-face":{"a":"Loudly Crying Face","b":"1F62D","j":["cry","face","sad","sob","tear","tears","upset","depressed"]},"face-screaming-in-fear":{"a":"Face Screaming in Fear","b":"1F631","j":["face","fear","munch","scared","scream","omg"]},"confounded-face":{"a":"Confounded Face","b":"1F616","j":["confounded","face","confused","sick","unwell","oops",":S"]},"persevering-face":{"a":"Persevering Face","b":"1F623","j":["face","persevere","sick","no","upset","oops"]},"disappointed-face":{"a":"Disappointed Face","b":"1F61E","j":["disappointed","face","sad","upset","depressed",":("]},"downcast-face-with-sweat":{"a":"Downcast Face with Sweat","b":"1F613","j":["cold","face","sweat","hot","sad","tired","exercise"]},"weary-face":{"a":"Weary Face","b":"1F629","j":["face","tired","weary","sleepy","sad","frustrated","upset"]},"tired-face":{"a":"Tired Face","b":"1F62B","j":["face","tired","sick","whine","upset","frustrated"]},"yawning-face":{"a":"Yawning Face","b":"1F971","j":["bored","tired","yawn","sleepy"]},"face-with-steam-from-nose":{"a":"Face with Steam From Nose","b":"1F624","j":["face","triumph","won","gas","phew","proud","pride"]},"pouting-face":{"a":"Pouting Face","b":"1F621","j":["angry","face","mad","pouting","rage","red","hate","despise"]},"angry-face":{"a":"Angry Face","b":"1F620","j":["anger","angry","face","mad","annoyed","frustrated"]},"face-with-symbols-on-mouth":{"a":"Face with Symbols on Mouth","b":"1F92C","j":["swearing","cursing","face","cussing","profanity","expletive"]},"smiling-face-with-horns":{"a":"Smiling Face with Horns","b":"1F608","j":["face","fairy tale","fantasy","horns","smile","devil"]},"angry-face-with-horns":{"a":"Angry Face with Horns","b":"1F47F","j":["demon","devil","face","fantasy","imp","angry","horns"]},"skull":{"a":"Skull","b":"1F480","j":["death","face","fairy tale","monster","dead","skeleton","creepy"]},"skull-and-crossbones":{"a":"Skull and Crossbones","b":"2620","j":["crossbones","death","face","monster","skull","poison","danger","deadly","scary","pirate","evil"]},"pile-of-poo":{"a":"Pile of Poo","b":"1F4A9","j":["dung","face","monster","poo","poop","hankey","shitface","fail","turd","shit"]},"clown-face":{"a":"Clown Face","b":"1F921","j":["clown","face"]},"ogre":{"a":"Ogre","b":"1F479","j":["creature","face","fairy tale","fantasy","monster","troll","red","mask","halloween","scary","creepy","devil","demon","japanese"]},"goblin":{"a":"Goblin","b":"1F47A","j":["creature","face","fairy tale","fantasy","monster","red","evil","mask","scary","creepy","japanese"]},"ghost":{"a":"Ghost","b":"1F47B","j":["creature","face","fairy tale","fantasy","monster","halloween","spooky","scary"]},"alien":{"a":"Alien","b":"1F47D","j":["creature","extraterrestrial","face","fantasy","ufo","UFO","paul","weird","outer_space"]},"alien-monster":{"a":"Alien Monster","b":"1F47E","j":["alien","creature","extraterrestrial","face","monster","ufo","game","arcade","play"]},"robot":{"a":"Robot","b":"1F916","j":["face","monster","computer","machine","bot"]},"grinning-cat":{"a":"Grinning Cat","b":"1F63A","j":["cat","face","grinning","mouth","open","smile","animal","cats","happy"]},"grinning-cat-with-smiling-eyes":{"a":"Grinning Cat with Smiling Eyes","b":"1F638","j":["cat","eye","face","grin","smile","animal","cats"]},"cat-with-tears-of-joy":{"a":"Cat with Tears of Joy","b":"1F639","j":["cat","face","joy","tear","animal","cats","haha","happy","tears"]},"smiling-cat-with-hearteyes":{"a":"Smiling Cat with Heart-Eyes","b":"1F63B","j":["cat","eye","face","heart","love","smile","smiling cat with heart-eyes","smiling_cat_with_heart_eyes","animal","like","affection","cats","valentines"]},"cat-with-wry-smile":{"a":"Cat with Wry Smile","b":"1F63C","j":["cat","face","ironic","smile","wry","animal","cats","smirk"]},"kissing-cat":{"a":"Kissing Cat","b":"1F63D","j":["cat","eye","face","kiss","animal","cats"]},"weary-cat":{"a":"Weary Cat","b":"1F640","j":["cat","face","oh","surprised","weary","animal","cats","munch","scared","scream"]},"crying-cat":{"a":"Crying Cat","b":"1F63F","j":["cat","cry","face","sad","tear","animal","tears","weep","cats","upset"]},"pouting-cat":{"a":"Pouting Cat","b":"1F63E","j":["cat","face","pouting","animal","cats"]},"seenoevil-monkey":{"a":"See-No-Evil Monkey","b":"1F648","j":["evil","face","forbidden","monkey","see","see-no-evil monkey","see_no_evil_monkey","animal","nature","haha"]},"hearnoevil-monkey":{"a":"Hear-No-Evil Monkey","b":"1F649","j":["evil","face","forbidden","hear","hear-no-evil monkey","monkey","hear_no_evil_monkey","animal","nature"]},"speaknoevil-monkey":{"a":"Speak-No-Evil Monkey","b":"1F64A","j":["evil","face","forbidden","monkey","speak","speak-no-evil monkey","speak_no_evil_monkey","animal","nature","omg"]},"kiss-mark":{"a":"Kiss Mark","b":"1F48B","j":["kiss","lips","face","love","like","affection","valentines"]},"love-letter":{"a":"Love Letter","b":"1F48C","j":["heart","letter","love","mail","email","like","affection","envelope","valentines"]},"heart-with-arrow":{"a":"Heart with Arrow","b":"1F498","j":["arrow","cupid","love","like","heart","affection","valentines"]},"heart-with-ribbon":{"a":"Heart with Ribbon","b":"1F49D","j":["ribbon","valentine","love","valentines"]},"sparkling-heart":{"a":"Sparkling Heart","b":"1F496","j":["excited","sparkle","love","like","affection","valentines"]},"growing-heart":{"a":"Growing Heart","b":"1F497","j":["excited","growing","nervous","pulse","like","love","affection","valentines","pink"]},"beating-heart":{"a":"Beating Heart","b":"1F493","j":["beating","heartbeat","pulsating","love","like","affection","valentines","pink","heart"]},"revolving-hearts":{"a":"Revolving Hearts","b":"1F49E","j":["revolving","love","like","affection","valentines"]},"two-hearts":{"a":"Two Hearts","b":"1F495","j":["love","like","affection","valentines","heart"]},"heart-decoration":{"a":"Heart Decoration","b":"1F49F","j":["heart","purple-square","love","like"]},"heart-exclamation":{"a":"Heart Exclamation","b":"2763","j":["exclamation","mark","punctuation","decoration","love"]},"broken-heart":{"a":"Broken Heart","b":"1F494","j":["break","broken","sad","sorry","heart","heartbreak"]},"heart-on-fire":{"a":"⊛ Heart on Fire","b":"2764-FE0F-200D-1F525","j":["burn","heart","heart on fire","love","lust","sacred heart"]},"mending-heart":{"a":"⊛ Mending Heart","b":"2764-FE0F-200D-1FA79","j":["healthier","improving","mending","mending heart","recovering","recuperating","well"]},"red-heart":{"a":"Red Heart","b":"2764","j":["heart","love","like","valentines"]},"orange-heart":{"a":"Orange Heart","b":"1F9E1","j":["orange","love","like","affection","valentines"]},"yellow-heart":{"a":"Yellow Heart","b":"1F49B","j":["yellow","love","like","affection","valentines"]},"green-heart":{"a":"Green Heart","b":"1F49A","j":["green","love","like","affection","valentines"]},"blue-heart":{"a":"Blue Heart","b":"1F499","j":["blue","love","like","affection","valentines"]},"purple-heart":{"a":"Purple Heart","b":"1F49C","j":["purple","love","like","affection","valentines"]},"brown-heart":{"a":"Brown Heart","b":"1F90E","j":["brown","heart","coffee"]},"black-heart":{"a":"Black Heart","b":"1F5A4","j":["black","evil","wicked"]},"white-heart":{"a":"White Heart","b":"1F90D","j":["heart","white","pure"]},"hundred-points":{"a":"Hundred Points","b":"1F4AF","j":["100","full","hundred","score","perfect","numbers","century","exam","quiz","test","pass"]},"anger-symbol":{"a":"Anger Symbol","b":"1F4A2","j":["angry","comic","mad"]},"collision":{"a":"Collision","b":"1F4A5","j":["boom","comic","bomb","explode","explosion","blown"]},"dizzy":{"a":"Dizzy","b":"1F4AB","j":["comic","star","sparkle","shoot","magic"]},"sweat-droplets":{"a":"Sweat Droplets","b":"1F4A6","j":["comic","splashing","sweat","water","drip","oops"]},"dashing-away":{"a":"Dashing Away","b":"1F4A8","j":["comic","dash","running","wind","air","fast","shoo","fart","smoke","puff"]},"hole":{"a":"Hole","b":"1F573","j":["embarrassing"]},"bomb":{"a":"Bomb","b":"1F4A3","j":["comic","boom","explode","explosion","terrorism"]},"speech-balloon":{"a":"Speech Balloon","b":"1F4AC","j":["balloon","bubble","comic","dialog","speech","words","message","talk","chatting"]},"eye-in-speech-bubble":{"a":"Eye in Speech Bubble","b":"1F441-FE0F-200D-1F5E8-FE0F","j":["eye","speech bubble","witness","info"]},"left-speech-bubble":{"a":"Left Speech Bubble","b":"1F5E8","j":["dialog","speech","words","message","talk","chatting"]},"right-anger-bubble":{"a":"Right Anger Bubble","b":"1F5EF","j":["angry","balloon","bubble","mad","caption","speech","thinking"]},"thought-balloon":{"a":"Thought Balloon","b":"1F4AD","j":["balloon","bubble","comic","thought","cloud","speech","thinking","dream"]},"zzz":{"a":"Zzz","b":"1F4A4","j":["comic","sleep","sleepy","tired","dream"]},"waving-hand":{"a":"Waving Hand","b":"1F44B","j":["hand","wave","waving","hands","gesture","goodbye","solong","farewell","hello","hi","palm"]},"raised-back-of-hand":{"a":"Raised Back of Hand","b":"1F91A","j":["backhand","raised","fingers"]},"hand-with-fingers-splayed":{"a":"Hand with Fingers Splayed","b":"1F590","j":["finger","hand","splayed","fingers","palm"]},"raised-hand":{"a":"Raised Hand","b":"270B","j":["hand","high 5","high five","fingers","stop","highfive","palm","ban"]},"vulcan-salute":{"a":"Vulcan Salute","b":"1F596","j":["finger","hand","spock","vulcan","fingers","star trek"]},"ok-hand":{"a":"Ok Hand","b":"1F44C","j":["hand","OK","fingers","limbs","perfect","ok","okay"]},"pinched-fingers":{"a":"Pinched Fingers","b":"1F90C","j":["fingers","hand gesture","interrogation","pinched","sarcastic","size","tiny","small"]},"pinching-hand":{"a":"Pinching Hand","b":"1F90F","j":["small amount","tiny","small","size"]},"victory-hand":{"a":"Victory Hand","b":"270C","j":["hand","v","victory","fingers","ohyeah","peace","two"]},"crossed-fingers":{"a":"Crossed Fingers","b":"1F91E","j":["cross","finger","hand","luck","good","lucky"]},"loveyou-gesture":{"a":"Love-You Gesture","b":"1F91F","j":["hand","ILY","love-you gesture","love_you_gesture","fingers","gesture"]},"sign-of-the-horns":{"a":"Sign of the Horns","b":"1F918","j":["finger","hand","horns","rock-on","fingers","evil_eye","sign_of_horns","rock_on"]},"call-me-hand":{"a":"Call Me Hand","b":"1F919","j":["call","hand","hands","gesture"]},"backhand-index-pointing-left":{"a":"Backhand Index Pointing Left","b":"1F448","j":["backhand","finger","hand","index","point","direction","fingers","left"]},"backhand-index-pointing-right":{"a":"Backhand Index Pointing Right","b":"1F449","j":["backhand","finger","hand","index","point","fingers","direction","right"]},"backhand-index-pointing-up":{"a":"Backhand Index Pointing Up","b":"1F446","j":["backhand","finger","hand","point","up","fingers","direction"]},"middle-finger":{"a":"Middle Finger","b":"1F595","j":["finger","hand","fingers","rude","middle","flipping"]},"backhand-index-pointing-down":{"a":"Backhand Index Pointing Down","b":"1F447","j":["backhand","down","finger","hand","point","fingers","direction"]},"index-pointing-up":{"a":"Index Pointing Up","b":"261D","j":["finger","hand","index","point","up","fingers","direction"]},"thumbs-up":{"a":"Thumbs Up","b":"1F44D","j":["+1","hand","thumb","up","thumbsup","yes","awesome","good","agree","accept","cool","like"]},"thumbs-down":{"a":"Thumbs Down","b":"1F44E","j":["-1","down","hand","thumb","thumbsdown","no","dislike"]},"raised-fist":{"a":"Raised Fist","b":"270A","j":["clenched","fist","hand","punch","fingers","grasp"]},"oncoming-fist":{"a":"Oncoming Fist","b":"1F44A","j":["clenched","fist","hand","punch","angry","violence","hit","attack"]},"leftfacing-fist":{"a":"Left-Facing Fist","b":"1F91B","j":["fist","left-facing fist","leftwards","left_facing_fist","hand","fistbump"]},"rightfacing-fist":{"a":"Right-Facing Fist","b":"1F91C","j":["fist","right-facing fist","rightwards","right_facing_fist","hand","fistbump"]},"clapping-hands":{"a":"Clapping Hands","b":"1F44F","j":["clap","hand","hands","praise","applause","congrats","yay"]},"raising-hands":{"a":"Raising Hands","b":"1F64C","j":["celebration","gesture","hand","hooray","raised","yea","hands"]},"open-hands":{"a":"Open Hands","b":"1F450","j":["hand","open","fingers","butterfly","hands"]},"palms-up-together":{"a":"Palms Up Together","b":"1F932","j":["prayer","cupped hands","hands","gesture","cupped"]},"handshake":{"a":"Handshake","b":"1F91D","j":["agreement","hand","meeting","shake"]},"folded-hands":{"a":"Folded Hands","b":"1F64F","j":["ask","hand","high 5","high five","please","pray","thanks","hope","wish","namaste","highfive"]},"writing-hand":{"a":"Writing Hand","b":"270D","j":["hand","write","lower_left_ballpoint_pen","stationery","compose"]},"nail-polish":{"a":"Nail Polish","b":"1F485","j":["care","cosmetics","manicure","nail","polish","beauty","finger","fashion"]},"selfie":{"a":"Selfie","b":"1F933","j":["camera","phone"]},"flexed-biceps":{"a":"Flexed Biceps","b":"1F4AA","j":["biceps","comic","flex","muscle","arm","hand","summer","strong"]},"mechanical-arm":{"a":"Mechanical Arm","b":"1F9BE","j":["accessibility","prosthetic"]},"mechanical-leg":{"a":"Mechanical Leg","b":"1F9BF","j":["accessibility","prosthetic"]},"leg":{"a":"Leg","b":"1F9B5","j":["kick","limb"]},"foot":{"a":"Foot","b":"1F9B6","j":["kick","stomp"]},"ear":{"a":"Ear","b":"1F442","j":["body","face","hear","sound","listen"]},"ear-with-hearing-aid":{"a":"Ear with Hearing Aid","b":"1F9BB","j":["accessibility","hard of hearing"]},"nose":{"a":"Nose","b":"1F443","j":["body","smell","sniff"]},"brain":{"a":"Brain","b":"1F9E0","j":["intelligent","smart"]},"anatomical-heart":{"a":"Anatomical Heart","b":"1FAC0","j":["anatomical","cardiology","heart","organ","pulse","health","heartbeat"]},"lungs":{"a":"Lungs","b":"1FAC1","j":["breath","exhalation","inhalation","organ","respiration","breathe"]},"tooth":{"a":"Tooth","b":"1F9B7","j":["dentist","teeth"]},"bone":{"a":"Bone","b":"1F9B4","j":["skeleton"]},"eyes":{"a":"Eyes","b":"1F440","j":["eye","face","look","watch","stalk","peek","see"]},"eye":{"a":"Eye","b":"1F441","j":["body","face","look","see","watch","stare"]},"tongue":{"a":"Tongue","b":"1F445","j":["body","mouth","playful"]},"mouth":{"a":"Mouth","b":"1F444","j":["lips","kiss"]},"baby":{"a":"Baby","b":"1F476","j":["young","child","boy","girl","toddler"]},"child":{"a":"Child","b":"1F9D2","j":["gender-neutral","unspecified gender","young"]},"boy":{"a":"Boy","b":"1F466","j":["young","man","male","guy","teenager"]},"girl":{"a":"Girl","b":"1F467","j":["Virgo","young","zodiac","female","woman","teenager"]},"person":{"a":"Person","b":"1F9D1","j":["adult","gender-neutral","unspecified gender"]},"person-blond-hair":{"a":"Person: Blond Hair","b":"1F471","j":["blond","blond-haired person","hair","person: blond hair","hairstyle"]},"man":{"a":"Man","b":"1F468","j":["adult","mustache","father","dad","guy","classy","sir","moustache"]},"person-beard":{"a":"Person: Beard","b":"1F9D4","j":["beard","person","person: beard","bewhiskered","man_beard"]},"man-beard":{"a":"⊛ Man: Beard","b":"1F9D4-200D-2642-FE0F","j":["beard","man","man: beard"]},"woman-beard":{"a":"⊛ Woman: Beard","b":"1F9D4-200D-2640-FE0F","j":["beard","woman","woman: beard"]},"man-red-hair":{"a":"Man: Red Hair","b":"1F468-200D-1F9B0","j":["adult","man","red hair","hairstyle"]},"man-curly-hair":{"a":"Man: Curly Hair","b":"1F468-200D-1F9B1","j":["adult","curly hair","man","hairstyle"]},"man-white-hair":{"a":"Man: White Hair","b":"1F468-200D-1F9B3","j":["adult","man","white hair","old","elder"]},"man-bald":{"a":"Man: Bald","b":"1F468-200D-1F9B2","j":["adult","bald","man","hairless"]},"woman":{"a":"Woman","b":"1F469","j":["adult","female","girls","lady"]},"woman-red-hair":{"a":"Woman: Red Hair","b":"1F469-200D-1F9B0","j":["adult","red hair","woman","hairstyle"]},"person-red-hair":{"a":"Person: Red Hair","b":"1F9D1-200D-1F9B0","j":["adult","gender-neutral","person","red hair","unspecified gender","hairstyle"]},"woman-curly-hair":{"a":"Woman: Curly Hair","b":"1F469-200D-1F9B1","j":["adult","curly hair","woman","hairstyle"]},"person-curly-hair":{"a":"Person: Curly Hair","b":"1F9D1-200D-1F9B1","j":["adult","curly hair","gender-neutral","person","unspecified gender","hairstyle"]},"woman-white-hair":{"a":"Woman: White Hair","b":"1F469-200D-1F9B3","j":["adult","white hair","woman","old","elder"]},"person-white-hair":{"a":"Person: White Hair","b":"1F9D1-200D-1F9B3","j":["adult","gender-neutral","person","unspecified gender","white hair","elder","old"]},"woman-bald":{"a":"Woman: Bald","b":"1F469-200D-1F9B2","j":["adult","bald","woman","hairless"]},"person-bald":{"a":"Person: Bald","b":"1F9D1-200D-1F9B2","j":["adult","bald","gender-neutral","person","unspecified gender","hairless"]},"woman-blond-hair":{"a":"Woman: Blond Hair","b":"1F471-200D-2640-FE0F","j":["blond-haired woman","blonde","hair","woman","woman: blond hair","female","girl","person"]},"man-blond-hair":{"a":"Man: Blond Hair","b":"1F471-200D-2642-FE0F","j":["blond","blond-haired man","hair","man","man: blond hair","male","boy","blonde","guy","person"]},"older-person":{"a":"Older Person","b":"1F9D3","j":["adult","gender-neutral","old","unspecified gender","human","elder","senior"]},"old-man":{"a":"Old Man","b":"1F474","j":["adult","man","old","human","male","men","elder","senior"]},"old-woman":{"a":"Old Woman","b":"1F475","j":["adult","old","woman","human","female","women","lady","elder","senior"]},"person-frowning":{"a":"Person Frowning","b":"1F64D","j":["frown","gesture","worried"]},"man-frowning":{"a":"Man Frowning","b":"1F64D-200D-2642-FE0F","j":["frowning","gesture","man","male","boy","sad","depressed","discouraged","unhappy"]},"woman-frowning":{"a":"Woman Frowning","b":"1F64D-200D-2640-FE0F","j":["frowning","gesture","woman","female","girl","sad","depressed","discouraged","unhappy"]},"person-pouting":{"a":"Person Pouting","b":"1F64E","j":["gesture","pouting","upset"]},"man-pouting":{"a":"Man Pouting","b":"1F64E-200D-2642-FE0F","j":["gesture","man","pouting","male","boy"]},"woman-pouting":{"a":"Woman Pouting","b":"1F64E-200D-2640-FE0F","j":["gesture","pouting","woman","female","girl"]},"person-gesturing-no":{"a":"Person Gesturing No","b":"1F645","j":["forbidden","gesture","hand","person gesturing NO","prohibited","decline"]},"man-gesturing-no":{"a":"Man Gesturing No","b":"1F645-200D-2642-FE0F","j":["forbidden","gesture","hand","man","man gesturing NO","prohibited","male","boy","nope"]},"woman-gesturing-no":{"a":"Woman Gesturing No","b":"1F645-200D-2640-FE0F","j":["forbidden","gesture","hand","prohibited","woman","woman gesturing NO","female","girl","nope"]},"person-gesturing-ok":{"a":"Person Gesturing Ok","b":"1F646","j":["gesture","hand","OK","person gesturing OK","agree"]},"man-gesturing-ok":{"a":"Man Gesturing Ok","b":"1F646-200D-2642-FE0F","j":["gesture","hand","man","man gesturing OK","OK","men","boy","male","blue","human"]},"woman-gesturing-ok":{"a":"Woman Gesturing Ok","b":"1F646-200D-2640-FE0F","j":["gesture","hand","OK","woman","woman gesturing OK","women","girl","female","pink","human"]},"person-tipping-hand":{"a":"Person Tipping Hand","b":"1F481","j":["hand","help","information","sassy","tipping"]},"man-tipping-hand":{"a":"Man Tipping Hand","b":"1F481-200D-2642-FE0F","j":["man","sassy","tipping hand","male","boy","human","information"]},"woman-tipping-hand":{"a":"Woman Tipping Hand","b":"1F481-200D-2640-FE0F","j":["sassy","tipping hand","woman","female","girl","human","information"]},"person-raising-hand":{"a":"Person Raising Hand","b":"1F64B","j":["gesture","hand","happy","raised","question"]},"man-raising-hand":{"a":"Man Raising Hand","b":"1F64B-200D-2642-FE0F","j":["gesture","man","raising hand","male","boy"]},"woman-raising-hand":{"a":"Woman Raising Hand","b":"1F64B-200D-2640-FE0F","j":["gesture","raising hand","woman","female","girl"]},"deaf-person":{"a":"Deaf Person","b":"1F9CF","j":["accessibility","deaf","ear","hear"]},"deaf-man":{"a":"Deaf Man","b":"1F9CF-200D-2642-FE0F","j":["deaf","man","accessibility"]},"deaf-woman":{"a":"Deaf Woman","b":"1F9CF-200D-2640-FE0F","j":["deaf","woman","accessibility"]},"person-bowing":{"a":"Person Bowing","b":"1F647","j":["apology","bow","gesture","sorry","respectiful"]},"man-bowing":{"a":"Man Bowing","b":"1F647-200D-2642-FE0F","j":["apology","bowing","favor","gesture","man","sorry","male","boy"]},"woman-bowing":{"a":"Woman Bowing","b":"1F647-200D-2640-FE0F","j":["apology","bowing","favor","gesture","sorry","woman","female","girl"]},"person-facepalming":{"a":"Person Facepalming","b":"1F926","j":["disbelief","exasperation","face","palm","disappointed"]},"man-facepalming":{"a":"Man Facepalming","b":"1F926-200D-2642-FE0F","j":["disbelief","exasperation","facepalm","man","male","boy"]},"woman-facepalming":{"a":"Woman Facepalming","b":"1F926-200D-2640-FE0F","j":["disbelief","exasperation","facepalm","woman","female","girl"]},"person-shrugging":{"a":"Person Shrugging","b":"1F937","j":["doubt","ignorance","indifference","shrug","regardless"]},"man-shrugging":{"a":"Man Shrugging","b":"1F937-200D-2642-FE0F","j":["doubt","ignorance","indifference","man","shrug","male","boy","confused","indifferent"]},"woman-shrugging":{"a":"Woman Shrugging","b":"1F937-200D-2640-FE0F","j":["doubt","ignorance","indifference","shrug","woman","female","girl","confused","indifferent"]},"health-worker":{"a":"Health Worker","b":"1F9D1-200D-2695-FE0F","j":["doctor","healthcare","nurse","therapist","hospital"]},"man-health-worker":{"a":"Man Health Worker","b":"1F468-200D-2695-FE0F","j":["doctor","healthcare","man","nurse","therapist","human"]},"woman-health-worker":{"a":"Woman Health Worker","b":"1F469-200D-2695-FE0F","j":["doctor","healthcare","nurse","therapist","woman","human"]},"student":{"a":"Student","b":"1F9D1-200D-1F393","j":["graduate","learn"]},"man-student":{"a":"Man Student","b":"1F468-200D-1F393","j":["graduate","man","student","human"]},"woman-student":{"a":"Woman Student","b":"1F469-200D-1F393","j":["graduate","student","woman","human"]},"teacher":{"a":"Teacher","b":"1F9D1-200D-1F3EB","j":["instructor","professor"]},"man-teacher":{"a":"Man Teacher","b":"1F468-200D-1F3EB","j":["instructor","man","professor","teacher","human"]},"woman-teacher":{"a":"Woman Teacher","b":"1F469-200D-1F3EB","j":["instructor","professor","teacher","woman","human"]},"judge":{"a":"Judge","b":"1F9D1-200D-2696-FE0F","j":["justice","scales","law"]},"man-judge":{"a":"Man Judge","b":"1F468-200D-2696-FE0F","j":["judge","justice","man","scales","court","human"]},"woman-judge":{"a":"Woman Judge","b":"1F469-200D-2696-FE0F","j":["judge","justice","scales","woman","court","human"]},"farmer":{"a":"Farmer","b":"1F9D1-200D-1F33E","j":["gardener","rancher","crops"]},"man-farmer":{"a":"Man Farmer","b":"1F468-200D-1F33E","j":["farmer","gardener","man","rancher","human"]},"woman-farmer":{"a":"Woman Farmer","b":"1F469-200D-1F33E","j":["farmer","gardener","rancher","woman","human"]},"cook":{"a":"Cook","b":"1F9D1-200D-1F373","j":["chef","food","kitchen","culinary"]},"man-cook":{"a":"Man Cook","b":"1F468-200D-1F373","j":["chef","cook","man","human"]},"woman-cook":{"a":"Woman Cook","b":"1F469-200D-1F373","j":["chef","cook","woman","human"]},"mechanic":{"a":"Mechanic","b":"1F9D1-200D-1F527","j":["electrician","plumber","tradesperson","worker","technician"]},"man-mechanic":{"a":"Man Mechanic","b":"1F468-200D-1F527","j":["electrician","man","mechanic","plumber","tradesperson","human","wrench"]},"woman-mechanic":{"a":"Woman Mechanic","b":"1F469-200D-1F527","j":["electrician","mechanic","plumber","tradesperson","woman","human","wrench"]},"factory-worker":{"a":"Factory Worker","b":"1F9D1-200D-1F3ED","j":["assembly","factory","industrial","worker","labor"]},"man-factory-worker":{"a":"Man Factory Worker","b":"1F468-200D-1F3ED","j":["assembly","factory","industrial","man","worker","human"]},"woman-factory-worker":{"a":"Woman Factory Worker","b":"1F469-200D-1F3ED","j":["assembly","factory","industrial","woman","worker","human"]},"office-worker":{"a":"Office Worker","b":"1F9D1-200D-1F4BC","j":["architect","business","manager","white-collar"]},"man-office-worker":{"a":"Man Office Worker","b":"1F468-200D-1F4BC","j":["architect","business","man","manager","white-collar","human"]},"woman-office-worker":{"a":"Woman Office Worker","b":"1F469-200D-1F4BC","j":["architect","business","manager","white-collar","woman","human"]},"scientist":{"a":"Scientist","b":"1F9D1-200D-1F52C","j":["biologist","chemist","engineer","physicist","chemistry"]},"man-scientist":{"a":"Man Scientist","b":"1F468-200D-1F52C","j":["biologist","chemist","engineer","man","physicist","scientist","human"]},"woman-scientist":{"a":"Woman Scientist","b":"1F469-200D-1F52C","j":["biologist","chemist","engineer","physicist","scientist","woman","human"]},"technologist":{"a":"Technologist","b":"1F9D1-200D-1F4BB","j":["coder","developer","inventor","software","computer"]},"man-technologist":{"a":"Man Technologist","b":"1F468-200D-1F4BB","j":["coder","developer","inventor","man","software","technologist","engineer","programmer","human","laptop","computer"]},"woman-technologist":{"a":"Woman Technologist","b":"1F469-200D-1F4BB","j":["coder","developer","inventor","software","technologist","woman","engineer","programmer","human","laptop","computer"]},"singer":{"a":"Singer","b":"1F9D1-200D-1F3A4","j":["actor","entertainer","rock","star","song","artist","performer"]},"man-singer":{"a":"Man Singer","b":"1F468-200D-1F3A4","j":["actor","entertainer","man","rock","singer","star","rockstar","human"]},"woman-singer":{"a":"Woman Singer","b":"1F469-200D-1F3A4","j":["actor","entertainer","rock","singer","star","woman","rockstar","human"]},"artist":{"a":"Artist","b":"1F9D1-200D-1F3A8","j":["palette","painting","draw","creativity"]},"man-artist":{"a":"Man Artist","b":"1F468-200D-1F3A8","j":["artist","man","palette","painter","human"]},"woman-artist":{"a":"Woman Artist","b":"1F469-200D-1F3A8","j":["artist","palette","woman","painter","human"]},"pilot":{"a":"Pilot","b":"1F9D1-200D-2708-FE0F","j":["plane","fly","airplane"]},"man-pilot":{"a":"Man Pilot","b":"1F468-200D-2708-FE0F","j":["man","pilot","plane","aviator","human"]},"woman-pilot":{"a":"Woman Pilot","b":"1F469-200D-2708-FE0F","j":["pilot","plane","woman","aviator","human"]},"astronaut":{"a":"Astronaut","b":"1F9D1-200D-1F680","j":["rocket","outerspace"]},"man-astronaut":{"a":"Man Astronaut","b":"1F468-200D-1F680","j":["astronaut","man","rocket","space","human"]},"woman-astronaut":{"a":"Woman Astronaut","b":"1F469-200D-1F680","j":["astronaut","rocket","woman","space","human"]},"firefighter":{"a":"Firefighter","b":"1F9D1-200D-1F692","j":["firetruck","fire"]},"man-firefighter":{"a":"Man Firefighter","b":"1F468-200D-1F692","j":["firefighter","firetruck","man","fireman","human"]},"woman-firefighter":{"a":"Woman Firefighter","b":"1F469-200D-1F692","j":["firefighter","firetruck","woman","fireman","human"]},"police-officer":{"a":"Police Officer","b":"1F46E","j":["cop","officer","police"]},"man-police-officer":{"a":"Man Police Officer","b":"1F46E-200D-2642-FE0F","j":["cop","man","officer","police","law","legal","enforcement","arrest","911"]},"woman-police-officer":{"a":"Woman Police Officer","b":"1F46E-200D-2640-FE0F","j":["cop","officer","police","woman","law","legal","enforcement","arrest","911","female"]},"detective":{"a":"Detective","b":"1F575","j":["sleuth","spy","human"]},"man-detective":{"a":"Man Detective","b":"1F575-FE0F-200D-2642-FE0F","j":["detective","man","sleuth","spy","crime"]},"woman-detective":{"a":"Woman Detective","b":"1F575-FE0F-200D-2640-FE0F","j":["detective","sleuth","spy","woman","human","female"]},"guard":{"a":"Guard","b":"1F482","j":["protect"]},"man-guard":{"a":"Man Guard","b":"1F482-200D-2642-FE0F","j":["guard","man","uk","gb","british","male","guy","royal"]},"woman-guard":{"a":"Woman Guard","b":"1F482-200D-2640-FE0F","j":["guard","woman","uk","gb","british","female","royal"]},"ninja":{"a":"Ninja","b":"1F977","j":["fighter","hidden","stealth","ninjutsu","skills","japanese"]},"construction-worker":{"a":"Construction Worker","b":"1F477","j":["construction","hat","worker","labor","build"]},"man-construction-worker":{"a":"Man Construction Worker","b":"1F477-200D-2642-FE0F","j":["construction","man","worker","male","human","wip","guy","build","labor"]},"woman-construction-worker":{"a":"Woman Construction Worker","b":"1F477-200D-2640-FE0F","j":["construction","woman","worker","female","human","wip","build","labor"]},"prince":{"a":"Prince","b":"1F934","j":["boy","man","male","crown","royal","king"]},"princess":{"a":"Princess","b":"1F478","j":["fairy tale","fantasy","girl","woman","female","blond","crown","royal","queen"]},"person-wearing-turban":{"a":"Person Wearing Turban","b":"1F473","j":["turban","headdress"]},"man-wearing-turban":{"a":"Man Wearing Turban","b":"1F473-200D-2642-FE0F","j":["man","turban","male","indian","hinduism","arabs"]},"woman-wearing-turban":{"a":"Woman Wearing Turban","b":"1F473-200D-2640-FE0F","j":["turban","woman","female","indian","hinduism","arabs"]},"person-with-skullcap":{"a":"Person with Skullcap","b":"1F472","j":["cap","gua pi mao","hat","person","skullcap","man_with_skullcap","male","boy","chinese"]},"woman-with-headscarf":{"a":"Woman with Headscarf","b":"1F9D5","j":["headscarf","hijab","mantilla","tichel","bandana","head kerchief","female"]},"person-in-tuxedo":{"a":"Person in Tuxedo","b":"1F935","j":["groom","person","tuxedo","man_in_tuxedo","couple","marriage","wedding"]},"man-in-tuxedo":{"a":"Man in Tuxedo","b":"1F935-200D-2642-FE0F","j":["man","tuxedo","formal","fashion"]},"woman-in-tuxedo":{"a":"Woman in Tuxedo","b":"1F935-200D-2640-FE0F","j":["tuxedo","woman","formal","fashion"]},"person-with-veil":{"a":"Person with Veil","b":"1F470","j":["bride","person","veil","wedding","bride_with_veil","couple","marriage","woman"]},"man-with-veil":{"a":"Man with Veil","b":"1F470-200D-2642-FE0F","j":["man","veil","wedding","marriage"]},"woman-with-veil":{"a":"Woman with Veil","b":"1F470-200D-2640-FE0F","j":["veil","woman","wedding","marriage"]},"pregnant-woman":{"a":"Pregnant Woman","b":"1F930","j":["pregnant","woman","baby"]},"breastfeeding":{"a":"Breast-Feeding","b":"1F931","j":["baby","breast","breast-feeding","nursing","breast_feeding"]},"woman-feeding-baby":{"a":"Woman Feeding Baby","b":"1F469-200D-1F37C","j":["baby","feeding","nursing","woman","birth","food"]},"man-feeding-baby":{"a":"Man Feeding Baby","b":"1F468-200D-1F37C","j":["baby","feeding","man","nursing","birth","food"]},"person-feeding-baby":{"a":"Person Feeding Baby","b":"1F9D1-200D-1F37C","j":["baby","feeding","nursing","person","birth","food"]},"baby-angel":{"a":"Baby Angel","b":"1F47C","j":["angel","baby","face","fairy tale","fantasy","heaven","wings","halo"]},"santa-claus":{"a":"Santa Claus","b":"1F385","j":["celebration","Christmas","claus","father","santa","festival","man","male","xmas","father christmas"]},"mrs-claus":{"a":"Mrs. Claus","b":"1F936","j":["celebration","Christmas","claus","mother","Mrs.","woman","female","xmas","mother christmas"]},"mx-claus":{"a":"Mx Claus","b":"1F9D1-200D-1F384","j":["Claus, christmas","christmas"]},"superhero":{"a":"Superhero","b":"1F9B8","j":["good","hero","heroine","superpower","marvel"]},"man-superhero":{"a":"Man Superhero","b":"1F9B8-200D-2642-FE0F","j":["good","hero","man","superpower","male","superpowers"]},"woman-superhero":{"a":"Woman Superhero","b":"1F9B8-200D-2640-FE0F","j":["good","hero","heroine","superpower","woman","female","superpowers"]},"supervillain":{"a":"Supervillain","b":"1F9B9","j":["criminal","evil","superpower","villain","marvel"]},"man-supervillain":{"a":"Man Supervillain","b":"1F9B9-200D-2642-FE0F","j":["criminal","evil","man","superpower","villain","male","bad","hero","superpowers"]},"woman-supervillain":{"a":"Woman Supervillain","b":"1F9B9-200D-2640-FE0F","j":["criminal","evil","superpower","villain","woman","female","bad","heroine","superpowers"]},"mage":{"a":"Mage","b":"1F9D9","j":["sorcerer","sorceress","witch","wizard","magic"]},"man-mage":{"a":"Man Mage","b":"1F9D9-200D-2642-FE0F","j":["sorcerer","wizard","man","male","mage"]},"woman-mage":{"a":"Woman Mage","b":"1F9D9-200D-2640-FE0F","j":["sorceress","witch","woman","female","mage"]},"fairy":{"a":"Fairy","b":"1F9DA","j":["Oberon","Puck","Titania","wings","magical"]},"man-fairy":{"a":"Man Fairy","b":"1F9DA-200D-2642-FE0F","j":["Oberon","Puck","man","male"]},"woman-fairy":{"a":"Woman Fairy","b":"1F9DA-200D-2640-FE0F","j":["Titania","woman","female"]},"vampire":{"a":"Vampire","b":"1F9DB","j":["Dracula","undead","blood","twilight"]},"man-vampire":{"a":"Man Vampire","b":"1F9DB-200D-2642-FE0F","j":["Dracula","undead","man","male","dracula"]},"woman-vampire":{"a":"Woman Vampire","b":"1F9DB-200D-2640-FE0F","j":["undead","woman","female"]},"merperson":{"a":"Merperson","b":"1F9DC","j":["mermaid","merman","merwoman","sea"]},"merman":{"a":"Merman","b":"1F9DC-200D-2642-FE0F","j":["Triton","man","male","triton"]},"mermaid":{"a":"Mermaid","b":"1F9DC-200D-2640-FE0F","j":["merwoman","woman","female","ariel"]},"elf":{"a":"Elf","b":"1F9DD","j":["magical","LOTR style"]},"man-elf":{"a":"Man Elf","b":"1F9DD-200D-2642-FE0F","j":["magical","man","male"]},"woman-elf":{"a":"Woman Elf","b":"1F9DD-200D-2640-FE0F","j":["magical","woman","female"]},"genie":{"a":"Genie","b":"1F9DE","j":["djinn","(non-human color)","magical","wishes"]},"man-genie":{"a":"Man Genie","b":"1F9DE-200D-2642-FE0F","j":["djinn","man","male"]},"woman-genie":{"a":"Woman Genie","b":"1F9DE-200D-2640-FE0F","j":["djinn","woman","female"]},"zombie":{"a":"Zombie","b":"1F9DF","j":["undead","walking dead","(non-human color)","dead"]},"man-zombie":{"a":"Man Zombie","b":"1F9DF-200D-2642-FE0F","j":["undead","walking dead","man","male","dracula"]},"woman-zombie":{"a":"Woman Zombie","b":"1F9DF-200D-2640-FE0F","j":["undead","walking dead","woman","female"]},"person-getting-massage":{"a":"Person Getting Massage","b":"1F486","j":["face","massage","salon","relax"]},"man-getting-massage":{"a":"Man Getting Massage","b":"1F486-200D-2642-FE0F","j":["face","man","massage","male","boy","head"]},"woman-getting-massage":{"a":"Woman Getting Massage","b":"1F486-200D-2640-FE0F","j":["face","massage","woman","female","girl","head"]},"person-getting-haircut":{"a":"Person Getting Haircut","b":"1F487","j":["barber","beauty","haircut","parlor","hairstyle"]},"man-getting-haircut":{"a":"Man Getting Haircut","b":"1F487-200D-2642-FE0F","j":["haircut","man","male","boy"]},"woman-getting-haircut":{"a":"Woman Getting Haircut","b":"1F487-200D-2640-FE0F","j":["haircut","woman","female","girl"]},"person-walking":{"a":"Person Walking","b":"1F6B6","j":["hike","walk","walking","move"]},"man-walking":{"a":"Man Walking","b":"1F6B6-200D-2642-FE0F","j":["hike","man","walk","human","feet","steps"]},"woman-walking":{"a":"Woman Walking","b":"1F6B6-200D-2640-FE0F","j":["hike","walk","woman","human","feet","steps","female"]},"person-standing":{"a":"Person Standing","b":"1F9CD","j":["stand","standing","still"]},"man-standing":{"a":"Man Standing","b":"1F9CD-200D-2642-FE0F","j":["man","standing","still"]},"woman-standing":{"a":"Woman Standing","b":"1F9CD-200D-2640-FE0F","j":["standing","woman","still"]},"person-kneeling":{"a":"Person Kneeling","b":"1F9CE","j":["kneel","kneeling","pray","respectful"]},"man-kneeling":{"a":"Man Kneeling","b":"1F9CE-200D-2642-FE0F","j":["kneeling","man","pray","respectful"]},"woman-kneeling":{"a":"Woman Kneeling","b":"1F9CE-200D-2640-FE0F","j":["kneeling","woman","respectful","pray"]},"person-with-white-cane":{"a":"Person with White Cane","b":"1F9D1-200D-1F9AF","j":["accessibility","blind","person_with_probing_cane"]},"man-with-white-cane":{"a":"Man with White Cane","b":"1F468-200D-1F9AF","j":["accessibility","blind","man","man_with_probing_cane"]},"woman-with-white-cane":{"a":"Woman with White Cane","b":"1F469-200D-1F9AF","j":["accessibility","blind","woman","woman_with_probing_cane"]},"person-in-motorized-wheelchair":{"a":"Person in Motorized Wheelchair","b":"1F9D1-200D-1F9BC","j":["accessibility","wheelchair","disability"]},"man-in-motorized-wheelchair":{"a":"Man in Motorized Wheelchair","b":"1F468-200D-1F9BC","j":["accessibility","man","wheelchair","disability"]},"woman-in-motorized-wheelchair":{"a":"Woman in Motorized Wheelchair","b":"1F469-200D-1F9BC","j":["accessibility","wheelchair","woman","disability"]},"person-in-manual-wheelchair":{"a":"Person in Manual Wheelchair","b":"1F9D1-200D-1F9BD","j":["accessibility","wheelchair","disability"]},"man-in-manual-wheelchair":{"a":"Man in Manual Wheelchair","b":"1F468-200D-1F9BD","j":["accessibility","man","wheelchair","disability"]},"woman-in-manual-wheelchair":{"a":"Woman in Manual Wheelchair","b":"1F469-200D-1F9BD","j":["accessibility","wheelchair","woman","disability"]},"person-running":{"a":"Person Running","b":"1F3C3","j":["marathon","running","move"]},"man-running":{"a":"Man Running","b":"1F3C3-200D-2642-FE0F","j":["man","marathon","racing","running","walking","exercise","race"]},"woman-running":{"a":"Woman Running","b":"1F3C3-200D-2640-FE0F","j":["marathon","racing","running","woman","walking","exercise","race","female"]},"woman-dancing":{"a":"Woman Dancing","b":"1F483","j":["dance","dancing","woman","female","girl","fun"]},"man-dancing":{"a":"Man Dancing","b":"1F57A","j":["dance","dancing","man","male","boy","fun","dancer"]},"person-in-suit-levitating":{"a":"Person in Suit Levitating","b":"1F574","j":["business","person","suit","man_in_suit_levitating","levitate","hover","jump"]},"people-with-bunny-ears":{"a":"People with Bunny Ears","b":"1F46F","j":["bunny ear","dancer","partying","perform","costume"]},"men-with-bunny-ears":{"a":"Men with Bunny Ears","b":"1F46F-200D-2642-FE0F","j":["bunny ear","dancer","men","partying","male","bunny","boys"]},"women-with-bunny-ears":{"a":"Women with Bunny Ears","b":"1F46F-200D-2640-FE0F","j":["bunny ear","dancer","partying","women","female","bunny","girls"]},"person-in-steamy-room":{"a":"Person in Steamy Room","b":"1F9D6","j":["sauna","steam room","hamam","steambath","relax","spa"]},"man-in-steamy-room":{"a":"Man in Steamy Room","b":"1F9D6-200D-2642-FE0F","j":["sauna","steam room","male","man","spa","steamroom"]},"woman-in-steamy-room":{"a":"Woman in Steamy Room","b":"1F9D6-200D-2640-FE0F","j":["sauna","steam room","female","woman","spa","steamroom"]},"person-climbing":{"a":"Person Climbing","b":"1F9D7","j":["climber","sport"]},"man-climbing":{"a":"Man Climbing","b":"1F9D7-200D-2642-FE0F","j":["climber","sports","hobby","man","male","rock"]},"woman-climbing":{"a":"Woman Climbing","b":"1F9D7-200D-2640-FE0F","j":["climber","sports","hobby","woman","female","rock"]},"person-fencing":{"a":"Person Fencing","b":"1F93A","j":["fencer","fencing","sword","sports"]},"horse-racing":{"a":"Horse Racing","b":"1F3C7","j":["horse","jockey","racehorse","racing","animal","betting","competition","gambling","luck"]},"skier":{"a":"Skier","b":"26F7","j":["ski","snow","sports","winter"]},"snowboarder":{"a":"Snowboarder","b":"1F3C2","j":["ski","snow","snowboard","sports","winter"]},"person-golfing":{"a":"Person Golfing","b":"1F3CC","j":["ball","golf","sports","business"]},"man-golfing":{"a":"Man Golfing","b":"1F3CC-FE0F-200D-2642-FE0F","j":["golf","man","sport"]},"woman-golfing":{"a":"Woman Golfing","b":"1F3CC-FE0F-200D-2640-FE0F","j":["golf","woman","sports","business","female"]},"person-surfing":{"a":"Person Surfing","b":"1F3C4","j":["surfing","sport","sea"]},"man-surfing":{"a":"Man Surfing","b":"1F3C4-200D-2642-FE0F","j":["man","surfing","sports","ocean","sea","summer","beach"]},"woman-surfing":{"a":"Woman Surfing","b":"1F3C4-200D-2640-FE0F","j":["surfing","woman","sports","ocean","sea","summer","beach","female"]},"person-rowing-boat":{"a":"Person Rowing Boat","b":"1F6A3","j":["boat","rowboat","sport","move"]},"man-rowing-boat":{"a":"Man Rowing Boat","b":"1F6A3-200D-2642-FE0F","j":["boat","man","rowboat","sports","hobby","water","ship"]},"woman-rowing-boat":{"a":"Woman Rowing Boat","b":"1F6A3-200D-2640-FE0F","j":["boat","rowboat","woman","sports","hobby","water","ship","female"]},"person-swimming":{"a":"Person Swimming","b":"1F3CA","j":["swim","sport","pool"]},"man-swimming":{"a":"Man Swimming","b":"1F3CA-200D-2642-FE0F","j":["man","swim","sports","exercise","human","athlete","water","summer"]},"woman-swimming":{"a":"Woman Swimming","b":"1F3CA-200D-2640-FE0F","j":["swim","woman","sports","exercise","human","athlete","water","summer","female"]},"person-bouncing-ball":{"a":"Person Bouncing Ball","b":"26F9","j":["ball","sports","human"]},"man-bouncing-ball":{"a":"Man Bouncing Ball","b":"26F9-FE0F-200D-2642-FE0F","j":["ball","man","sport"]},"woman-bouncing-ball":{"a":"Woman Bouncing Ball","b":"26F9-FE0F-200D-2640-FE0F","j":["ball","woman","sports","human","female"]},"person-lifting-weights":{"a":"Person Lifting Weights","b":"1F3CB","j":["lifter","weight","sports","training","exercise"]},"man-lifting-weights":{"a":"Man Lifting Weights","b":"1F3CB-FE0F-200D-2642-FE0F","j":["man","weight lifter","sport"]},"woman-lifting-weights":{"a":"Woman Lifting Weights","b":"1F3CB-FE0F-200D-2640-FE0F","j":["weight lifter","woman","sports","training","exercise","female"]},"person-biking":{"a":"Person Biking","b":"1F6B4","j":["bicycle","biking","cyclist","sport","move"]},"man-biking":{"a":"Man Biking","b":"1F6B4-200D-2642-FE0F","j":["bicycle","biking","cyclist","man","sports","bike","exercise","hipster"]},"woman-biking":{"a":"Woman Biking","b":"1F6B4-200D-2640-FE0F","j":["bicycle","biking","cyclist","woman","sports","bike","exercise","hipster","female"]},"person-mountain-biking":{"a":"Person Mountain Biking","b":"1F6B5","j":["bicycle","bicyclist","bike","cyclist","mountain","sport","move"]},"man-mountain-biking":{"a":"Man Mountain Biking","b":"1F6B5-200D-2642-FE0F","j":["bicycle","bike","cyclist","man","mountain","transportation","sports","human","race"]},"woman-mountain-biking":{"a":"Woman Mountain Biking","b":"1F6B5-200D-2640-FE0F","j":["bicycle","bike","biking","cyclist","mountain","woman","transportation","sports","human","race","female"]},"person-cartwheeling":{"a":"Person Cartwheeling","b":"1F938","j":["cartwheel","gymnastics","sport","gymnastic"]},"man-cartwheeling":{"a":"Man Cartwheeling","b":"1F938-200D-2642-FE0F","j":["cartwheel","gymnastics","man"]},"woman-cartwheeling":{"a":"Woman Cartwheeling","b":"1F938-200D-2640-FE0F","j":["cartwheel","gymnastics","woman"]},"people-wrestling":{"a":"People Wrestling","b":"1F93C","j":["wrestle","wrestler","sport"]},"men-wrestling":{"a":"Men Wrestling","b":"1F93C-200D-2642-FE0F","j":["men","wrestle","sports","wrestlers"]},"women-wrestling":{"a":"Women Wrestling","b":"1F93C-200D-2640-FE0F","j":["women","wrestle","sports","wrestlers"]},"person-playing-water-polo":{"a":"Person Playing Water Polo","b":"1F93D","j":["polo","water","sport"]},"man-playing-water-polo":{"a":"Man Playing Water Polo","b":"1F93D-200D-2642-FE0F","j":["man","water polo","sports","pool"]},"woman-playing-water-polo":{"a":"Woman Playing Water Polo","b":"1F93D-200D-2640-FE0F","j":["water polo","woman","sports","pool"]},"person-playing-handball":{"a":"Person Playing Handball","b":"1F93E","j":["ball","handball","sport"]},"man-playing-handball":{"a":"Man Playing Handball","b":"1F93E-200D-2642-FE0F","j":["handball","man","sports"]},"woman-playing-handball":{"a":"Woman Playing Handball","b":"1F93E-200D-2640-FE0F","j":["handball","woman","sports"]},"person-juggling":{"a":"Person Juggling","b":"1F939","j":["balance","juggle","multitask","skill","performance"]},"man-juggling":{"a":"Man Juggling","b":"1F939-200D-2642-FE0F","j":["juggling","man","multitask","juggle","balance","skill"]},"woman-juggling":{"a":"Woman Juggling","b":"1F939-200D-2640-FE0F","j":["juggling","multitask","woman","juggle","balance","skill"]},"person-in-lotus-position":{"a":"Person in Lotus Position","b":"1F9D8","j":["meditation","yoga","serenity","meditate"]},"man-in-lotus-position":{"a":"Man in Lotus Position","b":"1F9D8-200D-2642-FE0F","j":["meditation","yoga","man","male","serenity","zen","mindfulness"]},"woman-in-lotus-position":{"a":"Woman in Lotus Position","b":"1F9D8-200D-2640-FE0F","j":["meditation","yoga","woman","female","serenity","zen","mindfulness"]},"person-taking-bath":{"a":"Person Taking Bath","b":"1F6C0","j":["bath","bathtub","clean","shower","bathroom"]},"person-in-bed":{"a":"Person in Bed","b":"1F6CC","j":["hotel","sleep","bed","rest"]},"people-holding-hands":{"a":"People Holding Hands","b":"1F9D1-200D-1F91D-200D-1F9D1","j":["couple","hand","hold","holding hands","person","friendship"]},"women-holding-hands":{"a":"Women Holding Hands","b":"1F46D","j":["couple","hand","holding hands","women","pair","friendship","love","like","female","people","human"]},"woman-and-man-holding-hands":{"a":"Woman and Man Holding Hands","b":"1F46B","j":["couple","hand","hold","holding hands","man","woman","pair","people","human","love","date","dating","like","affection","valentines","marriage"]},"men-holding-hands":{"a":"Men Holding Hands","b":"1F46C","j":["couple","Gemini","holding hands","man","men","twins","zodiac","pair","love","like","bromance","friendship","people","human"]},"kiss":{"a":"Kiss","b":"1F48F","j":["couple","pair","valentines","love","like","dating","marriage"]},"kiss-woman-man":{"a":"Kiss: Woman, Man","b":"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468","j":["couple","kiss","man","woman","love"]},"kiss-man-man":{"a":"Kiss: Man, Man","b":"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468","j":["couple","kiss","man","pair","valentines","love","like","dating","marriage"]},"kiss-woman-woman":{"a":"Kiss: Woman, Woman","b":"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469","j":["couple","kiss","woman","pair","valentines","love","like","dating","marriage"]},"couple-with-heart":{"a":"Couple with Heart","b":"1F491","j":["couple","love","pair","like","affection","human","dating","valentines","marriage"]},"couple-with-heart-woman-man":{"a":"Couple with Heart: Woman, Man","b":"1F469-200D-2764-FE0F-200D-1F468","j":["couple","couple with heart","love","man","woman"]},"couple-with-heart-man-man":{"a":"Couple with Heart: Man, Man","b":"1F468-200D-2764-FE0F-200D-1F468","j":["couple","couple with heart","love","man","pair","like","affection","human","dating","valentines","marriage"]},"couple-with-heart-woman-woman":{"a":"Couple with Heart: Woman, Woman","b":"1F469-200D-2764-FE0F-200D-1F469","j":["couple","couple with heart","love","woman","pair","like","affection","human","dating","valentines","marriage"]},"family":{"a":"Family","b":"1F46A","j":["home","parents","child","mom","dad","father","mother","people","human"]},"family-man-woman-boy":{"a":"Family: Man, Woman, Boy","b":"1F468-200D-1F469-200D-1F466","j":["boy","family","man","woman","love"]},"family-man-woman-girl":{"a":"Family: Man, Woman, Girl","b":"1F468-200D-1F469-200D-1F467","j":["family","girl","man","woman","home","parents","people","human","child"]},"family-man-woman-girl-boy":{"a":"Family: Man, Woman, Girl, Boy","b":"1F468-200D-1F469-200D-1F467-200D-1F466","j":["boy","family","girl","man","woman","home","parents","people","human","children"]},"family-man-woman-boy-boy":{"a":"Family: Man, Woman, Boy, Boy","b":"1F468-200D-1F469-200D-1F466-200D-1F466","j":["boy","family","man","woman","home","parents","people","human","children"]},"family-man-woman-girl-girl":{"a":"Family: Man, Woman, Girl, Girl","b":"1F468-200D-1F469-200D-1F467-200D-1F467","j":["family","girl","man","woman","home","parents","people","human","children"]},"family-man-man-boy":{"a":"Family: Man, Man, Boy","b":"1F468-200D-1F468-200D-1F466","j":["boy","family","man","home","parents","people","human","children"]},"family-man-man-girl":{"a":"Family: Man, Man, Girl","b":"1F468-200D-1F468-200D-1F467","j":["family","girl","man","home","parents","people","human","children"]},"family-man-man-girl-boy":{"a":"Family: Man, Man, Girl, Boy","b":"1F468-200D-1F468-200D-1F467-200D-1F466","j":["boy","family","girl","man","home","parents","people","human","children"]},"family-man-man-boy-boy":{"a":"Family: Man, Man, Boy, Boy","b":"1F468-200D-1F468-200D-1F466-200D-1F466","j":["boy","family","man","home","parents","people","human","children"]},"family-man-man-girl-girl":{"a":"Family: Man, Man, Girl, Girl","b":"1F468-200D-1F468-200D-1F467-200D-1F467","j":["family","girl","man","home","parents","people","human","children"]},"family-woman-woman-boy":{"a":"Family: Woman, Woman, Boy","b":"1F469-200D-1F469-200D-1F466","j":["boy","family","woman","home","parents","people","human","children"]},"family-woman-woman-girl":{"a":"Family: Woman, Woman, Girl","b":"1F469-200D-1F469-200D-1F467","j":["family","girl","woman","home","parents","people","human","children"]},"family-woman-woman-girl-boy":{"a":"Family: Woman, Woman, Girl, Boy","b":"1F469-200D-1F469-200D-1F467-200D-1F466","j":["boy","family","girl","woman","home","parents","people","human","children"]},"family-woman-woman-boy-boy":{"a":"Family: Woman, Woman, Boy, Boy","b":"1F469-200D-1F469-200D-1F466-200D-1F466","j":["boy","family","woman","home","parents","people","human","children"]},"family-woman-woman-girl-girl":{"a":"Family: Woman, Woman, Girl, Girl","b":"1F469-200D-1F469-200D-1F467-200D-1F467","j":["family","girl","woman","home","parents","people","human","children"]},"family-man-boy":{"a":"Family: Man, Boy","b":"1F468-200D-1F466","j":["boy","family","man","home","parent","people","human","child"]},"family-man-boy-boy":{"a":"Family: Man, Boy, Boy","b":"1F468-200D-1F466-200D-1F466","j":["boy","family","man","home","parent","people","human","children"]},"family-man-girl":{"a":"Family: Man, Girl","b":"1F468-200D-1F467","j":["family","girl","man","home","parent","people","human","child"]},"family-man-girl-boy":{"a":"Family: Man, Girl, Boy","b":"1F468-200D-1F467-200D-1F466","j":["boy","family","girl","man","home","parent","people","human","children"]},"family-man-girl-girl":{"a":"Family: Man, Girl, Girl","b":"1F468-200D-1F467-200D-1F467","j":["family","girl","man","home","parent","people","human","children"]},"family-woman-boy":{"a":"Family: Woman, Boy","b":"1F469-200D-1F466","j":["boy","family","woman","home","parent","people","human","child"]},"family-woman-boy-boy":{"a":"Family: Woman, Boy, Boy","b":"1F469-200D-1F466-200D-1F466","j":["boy","family","woman","home","parent","people","human","children"]},"family-woman-girl":{"a":"Family: Woman, Girl","b":"1F469-200D-1F467","j":["family","girl","woman","home","parent","people","human","child"]},"family-woman-girl-boy":{"a":"Family: Woman, Girl, Boy","b":"1F469-200D-1F467-200D-1F466","j":["boy","family","girl","woman","home","parent","people","human","children"]},"family-woman-girl-girl":{"a":"Family: Woman, Girl, Girl","b":"1F469-200D-1F467-200D-1F467","j":["family","girl","woman","home","parent","people","human","children"]},"speaking-head":{"a":"Speaking Head","b":"1F5E3","j":["face","head","silhouette","speak","speaking","user","person","human","sing","say","talk"]},"bust-in-silhouette":{"a":"Bust in Silhouette","b":"1F464","j":["bust","silhouette","user","person","human"]},"busts-in-silhouette":{"a":"Busts in Silhouette","b":"1F465","j":["bust","silhouette","user","person","human","group","team"]},"people-hugging":{"a":"People Hugging","b":"1FAC2","j":["goodbye","hello","hug","thanks","care"]},"footprints":{"a":"Footprints","b":"1F463","j":["clothing","footprint","print","feet","tracking","walking","beach"]},"red-hair":{"a":"Red Hair","b":"1F9B0","j":["ginger","red hair","redhead"]},"curly-hair":{"a":"Curly Hair","b":"1F9B1","j":["afro","curly","curly hair","ringlets"]},"white-hair":{"a":"White Hair","b":"1F9B3","j":["gray","hair","old","white"]},"bald":{"a":"Bald","b":"1F9B2","j":["bald","chemotherapy","hairless","no hair","shaven"]},"monkey-face":{"a":"Monkey Face","b":"1F435","j":["face","monkey","animal","nature","circus"]},"monkey":{"a":"Monkey","b":"1F412","j":["animal","nature","banana","circus"]},"gorilla":{"a":"Gorilla","b":"1F98D","j":["animal","nature","circus"]},"orangutan":{"a":"Orangutan","b":"1F9A7","j":["ape","animal"]},"dog-face":{"a":"Dog Face","b":"1F436","j":["dog","face","pet","animal","friend","nature","woof","puppy","faithful"]},"dog":{"a":"Dog","b":"1F415","j":["pet","animal","nature","friend","doge","faithful"]},"guide-dog":{"a":"Guide Dog","b":"1F9AE","j":["accessibility","blind","guide","animal"]},"service-dog":{"a":"Service Dog","b":"1F415-200D-1F9BA","j":["accessibility","assistance","dog","service","blind","animal"]},"poodle":{"a":"Poodle","b":"1F429","j":["dog","animal","101","nature","pet"]},"wolf":{"a":"Wolf","b":"1F43A","j":["face","animal","nature","wild"]},"fox":{"a":"Fox","b":"1F98A","j":["face","animal","nature"]},"raccoon":{"a":"Raccoon","b":"1F99D","j":["curious","sly","animal","nature"]},"cat-face":{"a":"Cat Face","b":"1F431","j":["cat","face","pet","animal","meow","nature","kitten"]},"cat":{"a":"Cat","b":"1F408","j":["pet","animal","meow","cats"]},"black-cat":{"a":"Black Cat","b":"1F408-200D-2B1B","j":["black","cat","unlucky","superstition","luck"]},"lion":{"a":"Lion","b":"1F981","j":["face","Leo","zodiac","animal","nature"]},"tiger-face":{"a":"Tiger Face","b":"1F42F","j":["face","tiger","animal","cat","danger","wild","nature","roar"]},"tiger":{"a":"Tiger","b":"1F405","j":["animal","nature","roar"]},"leopard":{"a":"Leopard","b":"1F406","j":["animal","nature"]},"horse-face":{"a":"Horse Face","b":"1F434","j":["face","horse","animal","brown","nature"]},"horse":{"a":"Horse","b":"1F40E","j":["equestrian","racehorse","racing","animal","gamble","luck"]},"unicorn":{"a":"Unicorn","b":"1F984","j":["face","animal","nature","mystical"]},"zebra":{"a":"Zebra","b":"1F993","j":["stripe","animal","nature","stripes","safari"]},"deer":{"a":"Deer","b":"1F98C","j":["animal","nature","horns","venison"]},"bison":{"a":"Bison","b":"1F9AC","j":["buffalo","herd","wisent","ox"]},"cow-face":{"a":"Cow Face","b":"1F42E","j":["cow","face","beef","ox","animal","nature","moo","milk"]},"ox":{"a":"Ox","b":"1F402","j":["bull","Taurus","zodiac","animal","cow","beef"]},"water-buffalo":{"a":"Water Buffalo","b":"1F403","j":["buffalo","water","animal","nature","ox","cow"]},"cow":{"a":"Cow","b":"1F404","j":["beef","ox","animal","nature","moo","milk"]},"pig-face":{"a":"Pig Face","b":"1F437","j":["face","pig","animal","oink","nature"]},"pig":{"a":"Pig","b":"1F416","j":["sow","animal","nature"]},"boar":{"a":"Boar","b":"1F417","j":["pig","animal","nature"]},"pig-nose":{"a":"Pig Nose","b":"1F43D","j":["face","nose","pig","animal","oink"]},"ram":{"a":"Ram","b":"1F40F","j":["Aries","male","sheep","zodiac","animal","nature"]},"ewe":{"a":"Ewe","b":"1F411","j":["female","sheep","animal","nature","wool","shipit"]},"goat":{"a":"Goat","b":"1F410","j":["Capricorn","zodiac","animal","nature"]},"camel":{"a":"Camel","b":"1F42A","j":["dromedary","hump","animal","hot","desert"]},"twohump-camel":{"a":"Two-Hump Camel","b":"1F42B","j":["bactrian","camel","hump","two-hump camel","two_hump_camel","animal","nature","hot","desert"]},"llama":{"a":"Llama","b":"1F999","j":["alpaca","guanaco","vicuña","wool","animal","nature"]},"giraffe":{"a":"Giraffe","b":"1F992","j":["spots","animal","nature","safari"]},"elephant":{"a":"Elephant","b":"1F418","j":["animal","nature","nose","th","circus"]},"mammoth":{"a":"Mammoth","b":"1F9A3","j":["extinction","large","tusk","woolly","elephant","tusks"]},"rhinoceros":{"a":"Rhinoceros","b":"1F98F","j":["animal","nature","horn"]},"hippopotamus":{"a":"Hippopotamus","b":"1F99B","j":["hippo","animal","nature"]},"mouse-face":{"a":"Mouse Face","b":"1F42D","j":["face","mouse","animal","nature","cheese_wedge","rodent"]},"mouse":{"a":"Mouse","b":"1F401","j":["animal","nature","rodent"]},"rat":{"a":"Rat","b":"1F400","j":["animal","mouse","rodent"]},"hamster":{"a":"Hamster","b":"1F439","j":["face","pet","animal","nature"]},"rabbit-face":{"a":"Rabbit Face","b":"1F430","j":["bunny","face","pet","rabbit","animal","nature","spring","magic"]},"rabbit":{"a":"Rabbit","b":"1F407","j":["bunny","pet","animal","nature","magic","spring"]},"chipmunk":{"a":"Chipmunk","b":"1F43F","j":["squirrel","animal","nature","rodent"]},"beaver":{"a":"Beaver","b":"1F9AB","j":["dam","animal","rodent"]},"hedgehog":{"a":"Hedgehog","b":"1F994","j":["spiny","animal","nature"]},"bat":{"a":"Bat","b":"1F987","j":["vampire","animal","nature","blind"]},"bear":{"a":"Bear","b":"1F43B","j":["face","animal","nature","wild"]},"polar-bear":{"a":"Polar Bear","b":"1F43B-200D-2744-FE0F","j":["arctic","bear","white","animal"]},"koala":{"a":"Koala","b":"1F428","j":["bear","animal","nature"]},"panda":{"a":"Panda","b":"1F43C","j":["face","animal","nature"]},"sloth":{"a":"Sloth","b":"1F9A5","j":["lazy","slow","animal"]},"otter":{"a":"Otter","b":"1F9A6","j":["fishing","playful","animal"]},"skunk":{"a":"Skunk","b":"1F9A8","j":["stink","animal"]},"kangaroo":{"a":"Kangaroo","b":"1F998","j":["Australia","joey","jump","marsupial","animal","nature","australia","hop"]},"badger":{"a":"Badger","b":"1F9A1","j":["honey badger","pester","animal","nature","honey"]},"paw-prints":{"a":"Paw Prints","b":"1F43E","j":["feet","paw","print","animal","tracking","footprints","dog","cat","pet"]},"turkey":{"a":"Turkey","b":"1F983","j":["bird","animal"]},"chicken":{"a":"Chicken","b":"1F414","j":["bird","animal","cluck","nature"]},"rooster":{"a":"Rooster","b":"1F413","j":["bird","animal","nature","chicken"]},"hatching-chick":{"a":"Hatching Chick","b":"1F423","j":["baby","bird","chick","hatching","animal","chicken","egg","born"]},"baby-chick":{"a":"Baby Chick","b":"1F424","j":["baby","bird","chick","animal","chicken"]},"frontfacing-baby-chick":{"a":"Front-Facing Baby Chick","b":"1F425","j":["baby","bird","chick","front-facing baby chick","front_facing_baby_chick","animal","chicken"]},"bird":{"a":"Bird","b":"1F426","j":["animal","nature","fly","tweet","spring"]},"penguin":{"a":"Penguin","b":"1F427","j":["bird","animal","nature"]},"dove":{"a":"Dove","b":"1F54A","j":["bird","fly","peace","animal"]},"eagle":{"a":"Eagle","b":"1F985","j":["bird","animal","nature"]},"duck":{"a":"Duck","b":"1F986","j":["bird","animal","nature","mallard"]},"swan":{"a":"Swan","b":"1F9A2","j":["bird","cygnet","ugly duckling","animal","nature"]},"owl":{"a":"Owl","b":"1F989","j":["bird","wise","animal","nature","hoot"]},"dodo":{"a":"Dodo","b":"1F9A4","j":["extinction","large","Mauritius","animal","bird"]},"feather":{"a":"Feather","b":"1FAB6","j":["bird","flight","light","plumage","fly"]},"flamingo":{"a":"Flamingo","b":"1F9A9","j":["flamboyant","tropical","animal"]},"peacock":{"a":"Peacock","b":"1F99A","j":["bird","ostentatious","peahen","proud","animal","nature"]},"parrot":{"a":"Parrot","b":"1F99C","j":["bird","pirate","talk","animal","nature"]},"frog":{"a":"Frog","b":"1F438","j":["face","animal","nature","croak","toad"]},"crocodile":{"a":"Crocodile","b":"1F40A","j":["animal","nature","reptile","lizard","alligator"]},"turtle":{"a":"Turtle","b":"1F422","j":["terrapin","tortoise","animal","slow","nature"]},"lizard":{"a":"Lizard","b":"1F98E","j":["reptile","animal","nature"]},"snake":{"a":"Snake","b":"1F40D","j":["bearer","Ophiuchus","serpent","zodiac","animal","evil","nature","hiss","python"]},"dragon-face":{"a":"Dragon Face","b":"1F432","j":["dragon","face","fairy tale","animal","myth","nature","chinese","green"]},"dragon":{"a":"Dragon","b":"1F409","j":["fairy tale","animal","myth","nature","chinese","green"]},"sauropod":{"a":"Sauropod","b":"1F995","j":["brachiosaurus","brontosaurus","diplodocus","animal","nature","dinosaur","extinct"]},"trex":{"a":"T-Rex","b":"1F996","j":["Tyrannosaurus Rex","t_rex","animal","nature","dinosaur","tyrannosaurus","extinct"]},"spouting-whale":{"a":"Spouting Whale","b":"1F433","j":["face","spouting","whale","animal","nature","sea","ocean"]},"whale":{"a":"Whale","b":"1F40B","j":["animal","nature","sea","ocean"]},"dolphin":{"a":"Dolphin","b":"1F42C","j":["flipper","animal","nature","fish","sea","ocean","fins","beach"]},"seal":{"a":"Seal","b":"1F9AD","j":["sea lion","animal","creature","sea"]},"fish":{"a":"Fish","b":"1F41F","j":["Pisces","zodiac","animal","food","nature"]},"tropical-fish":{"a":"Tropical Fish","b":"1F420","j":["fish","tropical","animal","swim","ocean","beach","nemo"]},"blowfish":{"a":"Blowfish","b":"1F421","j":["fish","animal","nature","food","sea","ocean"]},"shark":{"a":"Shark","b":"1F988","j":["fish","animal","nature","sea","ocean","jaws","fins","beach"]},"octopus":{"a":"Octopus","b":"1F419","j":["animal","creature","ocean","sea","nature","beach"]},"spiral-shell":{"a":"Spiral Shell","b":"1F41A","j":["shell","spiral","nature","sea","beach"]},"snail":{"a":"Snail","b":"1F40C","j":["slow","animal","shell"]},"butterfly":{"a":"Butterfly","b":"1F98B","j":["insect","pretty","animal","nature","caterpillar"]},"bug":{"a":"Bug","b":"1F41B","j":["insect","animal","nature","worm"]},"ant":{"a":"Ant","b":"1F41C","j":["insect","animal","nature","bug"]},"honeybee":{"a":"Honeybee","b":"1F41D","j":["bee","insect","animal","nature","bug","spring","honey"]},"beetle":{"a":"Beetle","b":"1FAB2","j":["bug","insect"]},"lady-beetle":{"a":"Lady Beetle","b":"1F41E","j":["beetle","insect","ladybird","ladybug","animal","nature"]},"cricket":{"a":"Cricket","b":"1F997","j":["grasshopper","Orthoptera","animal","chirp"]},"cockroach":{"a":"Cockroach","b":"1FAB3","j":["insect","pest","roach","pests"]},"spider":{"a":"Spider","b":"1F577","j":["insect","animal","arachnid"]},"spider-web":{"a":"Spider Web","b":"1F578","j":["spider","web","animal","insect","arachnid","silk"]},"scorpion":{"a":"Scorpion","b":"1F982","j":["scorpio","Scorpio","zodiac","animal","arachnid"]},"mosquito":{"a":"Mosquito","b":"1F99F","j":["disease","fever","malaria","pest","virus","animal","nature","insect"]},"fly":{"a":"Fly","b":"1FAB0","j":["disease","maggot","pest","rotting","insect"]},"worm":{"a":"Worm","b":"1FAB1","j":["annelid","earthworm","parasite","animal"]},"microbe":{"a":"Microbe","b":"1F9A0","j":["amoeba","bacteria","virus","germs"]},"bouquet":{"a":"Bouquet","b":"1F490","j":["flower","flowers","nature","spring"]},"cherry-blossom":{"a":"Cherry Blossom","b":"1F338","j":["blossom","cherry","flower","nature","plant","spring"]},"white-flower":{"a":"White Flower","b":"1F4AE","j":["flower","japanese","spring"]},"rosette":{"a":"Rosette","b":"1F3F5","j":["plant","flower","decoration","military"]},"rose":{"a":"Rose","b":"1F339","j":["flower","flowers","valentines","love","spring"]},"wilted-flower":{"a":"Wilted Flower","b":"1F940","j":["flower","wilted","plant","nature"]},"hibiscus":{"a":"Hibiscus","b":"1F33A","j":["flower","plant","vegetable","flowers","beach"]},"sunflower":{"a":"Sunflower","b":"1F33B","j":["flower","sun","nature","plant","fall"]},"blossom":{"a":"Blossom","b":"1F33C","j":["flower","nature","flowers","yellow"]},"tulip":{"a":"Tulip","b":"1F337","j":["flower","flowers","plant","nature","summer","spring"]},"seedling":{"a":"Seedling","b":"1F331","j":["young","plant","nature","grass","lawn","spring"]},"potted-plant":{"a":"Potted Plant","b":"1FAB4","j":["boring","grow","house","nurturing","plant","useless","greenery"]},"evergreen-tree":{"a":"Evergreen Tree","b":"1F332","j":["tree","plant","nature"]},"deciduous-tree":{"a":"Deciduous Tree","b":"1F333","j":["deciduous","shedding","tree","plant","nature"]},"palm-tree":{"a":"Palm Tree","b":"1F334","j":["palm","tree","plant","vegetable","nature","summer","beach","mojito","tropical"]},"cactus":{"a":"Cactus","b":"1F335","j":["plant","vegetable","nature"]},"sheaf-of-rice":{"a":"Sheaf of Rice","b":"1F33E","j":["ear","grain","rice","nature","plant"]},"herb":{"a":"Herb","b":"1F33F","j":["leaf","vegetable","plant","medicine","weed","grass","lawn"]},"shamrock":{"a":"Shamrock","b":"2618","j":["plant","vegetable","nature","irish","clover"]},"four-leaf-clover":{"a":"Four Leaf Clover","b":"1F340","j":["4","clover","four","four-leaf clover","leaf","vegetable","plant","nature","lucky","irish"]},"maple-leaf":{"a":"Maple Leaf","b":"1F341","j":["falling","leaf","maple","nature","plant","vegetable","ca","fall"]},"fallen-leaf":{"a":"Fallen Leaf","b":"1F342","j":["falling","leaf","nature","plant","vegetable","leaves"]},"leaf-fluttering-in-wind":{"a":"Leaf Fluttering in Wind","b":"1F343","j":["blow","flutter","leaf","wind","nature","plant","tree","vegetable","grass","lawn","spring"]},"grapes":{"a":"Grapes","b":"1F347","j":["fruit","grape","food","wine"]},"melon":{"a":"Melon","b":"1F348","j":["fruit","nature","food"]},"watermelon":{"a":"Watermelon","b":"1F349","j":["fruit","food","picnic","summer"]},"tangerine":{"a":"Tangerine","b":"1F34A","j":["fruit","orange","food","nature"]},"lemon":{"a":"Lemon","b":"1F34B","j":["citrus","fruit","nature"]},"banana":{"a":"Banana","b":"1F34C","j":["fruit","food","monkey"]},"pineapple":{"a":"Pineapple","b":"1F34D","j":["fruit","nature","food"]},"mango":{"a":"Mango","b":"1F96D","j":["fruit","tropical","food"]},"red-apple":{"a":"Red Apple","b":"1F34E","j":["apple","fruit","red","mac","school"]},"green-apple":{"a":"Green Apple","b":"1F34F","j":["apple","fruit","green","nature"]},"pear":{"a":"Pear","b":"1F350","j":["fruit","nature","food"]},"peach":{"a":"Peach","b":"1F351","j":["fruit","nature","food"]},"cherries":{"a":"Cherries","b":"1F352","j":["berries","cherry","fruit","red","food"]},"strawberry":{"a":"Strawberry","b":"1F353","j":["berry","fruit","food","nature"]},"blueberries":{"a":"Blueberries","b":"1FAD0","j":["berry","bilberry","blue","blueberry","fruit"]},"kiwi-fruit":{"a":"Kiwi Fruit","b":"1F95D","j":["food","fruit","kiwi"]},"tomato":{"a":"Tomato","b":"1F345","j":["fruit","vegetable","nature","food"]},"olive":{"a":"Olive","b":"1FAD2","j":["food","fruit"]},"coconut":{"a":"Coconut","b":"1F965","j":["palm","piña colada","fruit","nature","food"]},"avocado":{"a":"Avocado","b":"1F951","j":["food","fruit"]},"eggplant":{"a":"Eggplant","b":"1F346","j":["aubergine","vegetable","nature","food"]},"potato":{"a":"Potato","b":"1F954","j":["food","vegetable","tuber","vegatable","starch"]},"carrot":{"a":"Carrot","b":"1F955","j":["food","vegetable","orange"]},"ear-of-corn":{"a":"Ear of Corn","b":"1F33D","j":["corn","ear","maize","maze","food","vegetable","plant"]},"hot-pepper":{"a":"Hot Pepper","b":"1F336","j":["hot","pepper","food","spicy","chilli","chili"]},"bell-pepper":{"a":"Bell Pepper","b":"1FAD1","j":["capsicum","pepper","vegetable","fruit","plant"]},"cucumber":{"a":"Cucumber","b":"1F952","j":["food","pickle","vegetable","fruit"]},"leafy-green":{"a":"Leafy Green","b":"1F96C","j":["bok choy","cabbage","kale","lettuce","food","vegetable","plant"]},"broccoli":{"a":"Broccoli","b":"1F966","j":["wild cabbage","fruit","food","vegetable"]},"garlic":{"a":"Garlic","b":"1F9C4","j":["flavoring","food","spice","cook"]},"onion":{"a":"Onion","b":"1F9C5","j":["flavoring","cook","food","spice"]},"mushroom":{"a":"Mushroom","b":"1F344","j":["toadstool","plant","vegetable"]},"peanuts":{"a":"Peanuts","b":"1F95C","j":["food","nut","peanut","vegetable"]},"chestnut":{"a":"Chestnut","b":"1F330","j":["plant","food","squirrel"]},"bread":{"a":"Bread","b":"1F35E","j":["loaf","food","wheat","breakfast","toast"]},"croissant":{"a":"Croissant","b":"1F950","j":["bread","breakfast","food","french","roll"]},"baguette-bread":{"a":"Baguette Bread","b":"1F956","j":["baguette","bread","food","french"]},"flatbread":{"a":"Flatbread","b":"1FAD3","j":["arepa","lavash","naan","pita","flour","food"]},"pretzel":{"a":"Pretzel","b":"1F968","j":["twisted","convoluted","food","bread"]},"bagel":{"a":"Bagel","b":"1F96F","j":["bakery","breakfast","schmear","food","bread"]},"pancakes":{"a":"Pancakes","b":"1F95E","j":["breakfast","crêpe","food","hotcake","pancake","flapjacks","hotcakes"]},"waffle":{"a":"Waffle","b":"1F9C7","j":["breakfast","indecisive","iron","food"]},"cheese-wedge":{"a":"Cheese Wedge","b":"1F9C0","j":["cheese","food","chadder"]},"meat-on-bone":{"a":"Meat on Bone","b":"1F356","j":["bone","meat","good","food","drumstick"]},"poultry-leg":{"a":"Poultry Leg","b":"1F357","j":["bone","chicken","drumstick","leg","poultry","food","meat","bird","turkey"]},"cut-of-meat":{"a":"Cut of Meat","b":"1F969","j":["chop","lambchop","porkchop","steak","food","cow","meat","cut"]},"bacon":{"a":"Bacon","b":"1F953","j":["breakfast","food","meat","pork","pig"]},"hamburger":{"a":"Hamburger","b":"1F354","j":["burger","meat","fast food","beef","cheeseburger","mcdonalds","burger king"]},"french-fries":{"a":"French Fries","b":"1F35F","j":["french","fries","chips","snack","fast food"]},"pizza":{"a":"Pizza","b":"1F355","j":["cheese","slice","food","party"]},"hot-dog":{"a":"Hot Dog","b":"1F32D","j":["frankfurter","hotdog","sausage","food"]},"sandwich":{"a":"Sandwich","b":"1F96A","j":["bread","food","lunch"]},"taco":{"a":"Taco","b":"1F32E","j":["mexican","food"]},"burrito":{"a":"Burrito","b":"1F32F","j":["mexican","wrap","food"]},"tamale":{"a":"Tamale","b":"1FAD4","j":["mexican","wrapped","food","masa"]},"stuffed-flatbread":{"a":"Stuffed Flatbread","b":"1F959","j":["falafel","flatbread","food","gyro","kebab","stuffed"]},"falafel":{"a":"Falafel","b":"1F9C6","j":["chickpea","meatball","food"]},"egg":{"a":"Egg","b":"1F95A","j":["breakfast","food","chicken"]},"cooking":{"a":"Cooking","b":"1F373","j":["breakfast","egg","frying","pan","food","kitchen"]},"shallow-pan-of-food":{"a":"Shallow Pan of Food","b":"1F958","j":["casserole","food","paella","pan","shallow","cooking"]},"pot-of-food":{"a":"Pot of Food","b":"1F372","j":["pot","stew","food","meat","soup"]},"fondue":{"a":"Fondue","b":"1FAD5","j":["cheese","chocolate","melted","pot","Swiss","food"]},"bowl-with-spoon":{"a":"Bowl with Spoon","b":"1F963","j":["breakfast","cereal","congee","oatmeal","porridge","food"]},"green-salad":{"a":"Green Salad","b":"1F957","j":["food","green","salad","healthy","lettuce"]},"popcorn":{"a":"Popcorn","b":"1F37F","j":["food","movie theater","films","snack"]},"butter":{"a":"Butter","b":"1F9C8","j":["dairy","food","cook"]},"salt":{"a":"Salt","b":"1F9C2","j":["condiment","shaker"]},"canned-food":{"a":"Canned Food","b":"1F96B","j":["can","food","soup"]},"bento-box":{"a":"Bento Box","b":"1F371","j":["bento","box","food","japanese"]},"rice-cracker":{"a":"Rice Cracker","b":"1F358","j":["cracker","rice","food","japanese"]},"rice-ball":{"a":"Rice Ball","b":"1F359","j":["ball","Japanese","rice","food","japanese"]},"cooked-rice":{"a":"Cooked Rice","b":"1F35A","j":["cooked","rice","food","china","asian"]},"curry-rice":{"a":"Curry Rice","b":"1F35B","j":["curry","rice","food","spicy","hot","indian"]},"steaming-bowl":{"a":"Steaming Bowl","b":"1F35C","j":["bowl","noodle","ramen","steaming","food","japanese","chopsticks"]},"spaghetti":{"a":"Spaghetti","b":"1F35D","j":["pasta","food","italian","noodle"]},"roasted-sweet-potato":{"a":"Roasted Sweet Potato","b":"1F360","j":["potato","roasted","sweet","food","nature"]},"oden":{"a":"Oden","b":"1F362","j":["kebab","seafood","skewer","stick","food","japanese"]},"sushi":{"a":"Sushi","b":"1F363","j":["food","fish","japanese","rice"]},"fried-shrimp":{"a":"Fried Shrimp","b":"1F364","j":["fried","prawn","shrimp","tempura","food","animal","appetizer","summer"]},"fish-cake-with-swirl":{"a":"Fish Cake with Swirl","b":"1F365","j":["cake","fish","pastry","swirl","food","japan","sea","beach","narutomaki","pink","kamaboko","surimi","ramen"]},"moon-cake":{"a":"Moon Cake","b":"1F96E","j":["autumn","festival","yuèbǐng","food"]},"dango":{"a":"Dango","b":"1F361","j":["dessert","Japanese","skewer","stick","sweet","food","japanese","barbecue","meat"]},"dumpling":{"a":"Dumpling","b":"1F95F","j":["empanada","gyōza","jiaozi","pierogi","potsticker","food"]},"fortune-cookie":{"a":"Fortune Cookie","b":"1F960","j":["prophecy","food"]},"takeout-box":{"a":"Takeout Box","b":"1F961","j":["oyster pail","food","leftovers"]},"crab":{"a":"Crab","b":"1F980","j":["Cancer","zodiac","animal","crustacean"]},"lobster":{"a":"Lobster","b":"1F99E","j":["bisque","claws","seafood","animal","nature"]},"shrimp":{"a":"Shrimp","b":"1F990","j":["food","shellfish","small","animal","ocean","nature","seafood"]},"squid":{"a":"Squid","b":"1F991","j":["food","molusc","animal","nature","ocean","sea"]},"oyster":{"a":"Oyster","b":"1F9AA","j":["diving","pearl","food"]},"soft-ice-cream":{"a":"Soft Ice Cream","b":"1F366","j":["cream","dessert","ice","icecream","soft","sweet","food","hot","summer"]},"shaved-ice":{"a":"Shaved Ice","b":"1F367","j":["dessert","ice","shaved","sweet","hot","summer"]},"ice-cream":{"a":"Ice Cream","b":"1F368","j":["cream","dessert","ice","sweet","food","hot"]},"doughnut":{"a":"Doughnut","b":"1F369","j":["breakfast","dessert","donut","sweet","food","snack"]},"cookie":{"a":"Cookie","b":"1F36A","j":["dessert","sweet","food","snack","oreo","chocolate"]},"birthday-cake":{"a":"Birthday Cake","b":"1F382","j":["birthday","cake","celebration","dessert","pastry","sweet","food"]},"shortcake":{"a":"Shortcake","b":"1F370","j":["cake","dessert","pastry","slice","sweet","food"]},"cupcake":{"a":"Cupcake","b":"1F9C1","j":["bakery","sweet","food","dessert"]},"pie":{"a":"Pie","b":"1F967","j":["filling","pastry","fruit","meat","food","dessert"]},"chocolate-bar":{"a":"Chocolate Bar","b":"1F36B","j":["bar","chocolate","dessert","sweet","food","snack"]},"candy":{"a":"Candy","b":"1F36C","j":["dessert","sweet","snack","lolly"]},"lollipop":{"a":"Lollipop","b":"1F36D","j":["candy","dessert","sweet","food","snack"]},"custard":{"a":"Custard","b":"1F36E","j":["dessert","pudding","sweet","food"]},"honey-pot":{"a":"Honey Pot","b":"1F36F","j":["honey","honeypot","pot","sweet","bees","kitchen"]},"baby-bottle":{"a":"Baby Bottle","b":"1F37C","j":["baby","bottle","drink","milk","food","container"]},"glass-of-milk":{"a":"Glass of Milk","b":"1F95B","j":["drink","glass","milk","beverage","cow"]},"hot-beverage":{"a":"Hot Beverage","b":"2615","j":["beverage","coffee","drink","hot","steaming","tea","caffeine","latte","espresso"]},"teapot":{"a":"Teapot","b":"1FAD6","j":["drink","pot","tea","hot"]},"teacup-without-handle":{"a":"Teacup Without Handle","b":"1F375","j":["beverage","cup","drink","tea","teacup","bowl","breakfast","green","british"]},"sake":{"a":"Sake","b":"1F376","j":["bar","beverage","bottle","cup","drink","wine","drunk","japanese","alcohol","booze"]},"bottle-with-popping-cork":{"a":"Bottle with Popping Cork","b":"1F37E","j":["bar","bottle","cork","drink","popping","wine","celebration"]},"wine-glass":{"a":"Wine Glass","b":"1F377","j":["bar","beverage","drink","glass","wine","drunk","alcohol","booze"]},"cocktail-glass":{"a":"Cocktail Glass","b":"1F378","j":["bar","cocktail","drink","glass","drunk","alcohol","beverage","booze","mojito"]},"tropical-drink":{"a":"Tropical Drink","b":"1F379","j":["bar","drink","tropical","beverage","cocktail","summer","beach","alcohol","booze","mojito"]},"beer-mug":{"a":"Beer Mug","b":"1F37A","j":["bar","beer","drink","mug","relax","beverage","drunk","party","pub","summer","alcohol","booze"]},"clinking-beer-mugs":{"a":"Clinking Beer Mugs","b":"1F37B","j":["bar","beer","clink","drink","mug","relax","beverage","drunk","party","pub","summer","alcohol","booze"]},"clinking-glasses":{"a":"Clinking Glasses","b":"1F942","j":["celebrate","clink","drink","glass","beverage","party","alcohol","cheers","wine","champagne","toast"]},"tumbler-glass":{"a":"Tumbler Glass","b":"1F943","j":["glass","liquor","shot","tumbler","whisky","drink","beverage","drunk","alcohol","booze","bourbon","scotch"]},"cup-with-straw":{"a":"Cup with Straw","b":"1F964","j":["juice","soda","malt","soft drink","water","drink"]},"bubble-tea":{"a":"Bubble Tea","b":"1F9CB","j":["bubble","milk","pearl","tea","taiwan","boba","milk tea","straw"]},"beverage-box":{"a":"Beverage Box","b":"1F9C3","j":["beverage","box","juice","straw","sweet","drink"]},"mate":{"a":"Mate","b":"1F9C9","j":["drink","tea","beverage"]},"ice":{"a":"Ice","b":"1F9CA","j":["cold","ice cube","iceberg","water"]},"chopsticks":{"a":"Chopsticks","b":"1F962","j":["hashi","jeotgarak","kuaizi","food"]},"fork-and-knife-with-plate":{"a":"Fork and Knife with Plate","b":"1F37D","j":["cooking","fork","knife","plate","food","eat","meal","lunch","dinner","restaurant"]},"fork-and-knife":{"a":"Fork and Knife","b":"1F374","j":["cooking","cutlery","fork","knife","kitchen"]},"spoon":{"a":"Spoon","b":"1F944","j":["tableware","cutlery","kitchen"]},"kitchen-knife":{"a":"Kitchen Knife","b":"1F52A","j":["cooking","hocho","knife","tool","weapon","blade","cutlery","kitchen"]},"amphora":{"a":"Amphora","b":"1F3FA","j":["Aquarius","cooking","drink","jug","zodiac","vase","jar"]},"globe-showing-europeafrica":{"a":"Globe Showing Europe-Africa","b":"1F30D","j":["Africa","earth","Europe","globe","globe showing Europe-Africa","world","globe_showing_europe_africa","international"]},"globe-showing-americas":{"a":"Globe Showing Americas","b":"1F30E","j":["Americas","earth","globe","globe showing Americas","world","USA","international"]},"globe-showing-asiaaustralia":{"a":"Globe Showing Asia-Australia","b":"1F30F","j":["Asia","Australia","earth","globe","globe showing Asia-Australia","world","globe_showing_asia_australia","east","international"]},"globe-with-meridians":{"a":"Globe with Meridians","b":"1F310","j":["earth","globe","meridians","world","international","internet","interweb","i18n"]},"world-map":{"a":"World Map","b":"1F5FA","j":["map","world","location","direction"]},"map-of-japan":{"a":"Map of Japan","b":"1F5FE","j":["Japan","map","map of Japan","nation","country","japanese","asia"]},"compass":{"a":"Compass","b":"1F9ED","j":["magnetic","navigation","orienteering"]},"snowcapped-mountain":{"a":"Snow-Capped Mountain","b":"1F3D4","j":["cold","mountain","snow","snow-capped mountain","snow_capped_mountain","photo","nature","environment","winter"]},"mountain":{"a":"Mountain","b":"26F0","j":["photo","nature","environment"]},"volcano":{"a":"Volcano","b":"1F30B","j":["eruption","mountain","photo","nature","disaster"]},"mount-fuji":{"a":"Mount Fuji","b":"1F5FB","j":["fuji","mountain","photo","nature","japanese"]},"camping":{"a":"Camping","b":"1F3D5","j":["photo","outdoors","tent"]},"beach-with-umbrella":{"a":"Beach with Umbrella","b":"1F3D6","j":["beach","umbrella","weather","summer","sunny","sand","mojito"]},"desert":{"a":"Desert","b":"1F3DC","j":["photo","warm","saharah"]},"desert-island":{"a":"Desert Island","b":"1F3DD","j":["desert","island","photo","tropical","mojito"]},"national-park":{"a":"National Park","b":"1F3DE","j":["park","photo","environment","nature"]},"stadium":{"a":"Stadium","b":"1F3DF","j":["photo","place","sports","concert","venue"]},"classical-building":{"a":"Classical Building","b":"1F3DB","j":["classical","art","culture","history"]},"building-construction":{"a":"Building Construction","b":"1F3D7","j":["construction","wip","working","progress"]},"brick":{"a":"Brick","b":"1F9F1","j":["bricks","clay","mortar","wall"]},"rock":{"a":"Rock","b":"1FAA8","j":["boulder","heavy","solid","stone"]},"wood":{"a":"Wood","b":"1FAB5","j":["log","lumber","timber","nature","trunk"]},"hut":{"a":"Hut","b":"1F6D6","j":["house","roundhouse","yurt","structure"]},"houses":{"a":"Houses","b":"1F3D8","j":["buildings","photo"]},"derelict-house":{"a":"Derelict House","b":"1F3DA","j":["derelict","house","abandon","evict","broken","building"]},"house":{"a":"House","b":"1F3E0","j":["home","building"]},"house-with-garden":{"a":"House with Garden","b":"1F3E1","j":["garden","home","house","plant","nature"]},"office-building":{"a":"Office Building","b":"1F3E2","j":["building","bureau","work"]},"japanese-post-office":{"a":"Japanese Post Office","b":"1F3E3","j":["Japanese","Japanese post office","post","building","envelope","communication"]},"post-office":{"a":"Post Office","b":"1F3E4","j":["European","post","building","email"]},"hospital":{"a":"Hospital","b":"1F3E5","j":["doctor","medicine","building","health","surgery"]},"bank":{"a":"Bank","b":"1F3E6","j":["building","money","sales","cash","business","enterprise"]},"hotel":{"a":"Hotel","b":"1F3E8","j":["building","accomodation","checkin"]},"love-hotel":{"a":"Love Hotel","b":"1F3E9","j":["hotel","love","like","affection","dating"]},"convenience-store":{"a":"Convenience Store","b":"1F3EA","j":["convenience","store","building","shopping","groceries"]},"school":{"a":"School","b":"1F3EB","j":["building","student","education","learn","teach"]},"department-store":{"a":"Department Store","b":"1F3EC","j":["department","store","building","shopping","mall"]},"factory":{"a":"Factory","b":"1F3ED","j":["building","industry","pollution","smoke"]},"japanese-castle":{"a":"Japanese Castle","b":"1F3EF","j":["castle","Japanese","photo","building"]},"castle":{"a":"Castle","b":"1F3F0","j":["European","building","royalty","history"]},"wedding":{"a":"Wedding","b":"1F492","j":["chapel","romance","love","like","affection","couple","marriage","bride","groom"]},"tokyo-tower":{"a":"Tokyo Tower","b":"1F5FC","j":["Tokyo","tower","photo","japanese"]},"statue-of-liberty":{"a":"Statue of Liberty","b":"1F5FD","j":["liberty","statue","american","newyork"]},"church":{"a":"Church","b":"26EA","j":["Christian","cross","religion","building","christ"]},"mosque":{"a":"Mosque","b":"1F54C","j":["islam","Muslim","religion","worship","minaret"]},"hindu-temple":{"a":"Hindu Temple","b":"1F6D5","j":["hindu","temple","religion"]},"synagogue":{"a":"Synagogue","b":"1F54D","j":["Jew","Jewish","religion","temple","judaism","worship","jewish"]},"shinto-shrine":{"a":"Shinto Shrine","b":"26E9","j":["religion","shinto","shrine","temple","japan","kyoto"]},"kaaba":{"a":"Kaaba","b":"1F54B","j":["islam","Muslim","religion","mecca","mosque"]},"fountain":{"a":"Fountain","b":"26F2","j":["photo","summer","water","fresh"]},"tent":{"a":"Tent","b":"26FA","j":["camping","photo","outdoors"]},"foggy":{"a":"Foggy","b":"1F301","j":["fog","photo","mountain"]},"night-with-stars":{"a":"Night with Stars","b":"1F303","j":["night","star","evening","city","downtown"]},"cityscape":{"a":"Cityscape","b":"1F3D9","j":["city","photo","night life","urban"]},"sunrise-over-mountains":{"a":"Sunrise over Mountains","b":"1F304","j":["morning","mountain","sun","sunrise","view","vacation","photo"]},"sunrise":{"a":"Sunrise","b":"1F305","j":["morning","sun","view","vacation","photo"]},"cityscape-at-dusk":{"a":"Cityscape at Dusk","b":"1F306","j":["city","dusk","evening","landscape","sunset","photo","sky","buildings"]},"sunset":{"a":"Sunset","b":"1F307","j":["dusk","sun","photo","good morning","dawn"]},"bridge-at-night":{"a":"Bridge at Night","b":"1F309","j":["bridge","night","photo","sanfrancisco"]},"hot-springs":{"a":"Hot Springs","b":"2668","j":["hot","hotsprings","springs","steaming","bath","warm","relax"]},"carousel-horse":{"a":"Carousel Horse","b":"1F3A0","j":["carousel","horse","photo","carnival"]},"ferris-wheel":{"a":"Ferris Wheel","b":"1F3A1","j":["amusement park","ferris","wheel","photo","carnival","londoneye"]},"roller-coaster":{"a":"Roller Coaster","b":"1F3A2","j":["amusement park","coaster","roller","carnival","playground","photo","fun"]},"barber-pole":{"a":"Barber Pole","b":"1F488","j":["barber","haircut","pole","hair","salon","style"]},"circus-tent":{"a":"Circus Tent","b":"1F3AA","j":["circus","tent","festival","carnival","party"]},"locomotive":{"a":"Locomotive","b":"1F682","j":["engine","railway","steam","train","transportation","vehicle"]},"railway-car":{"a":"Railway Car","b":"1F683","j":["car","electric","railway","train","tram","trolleybus","transportation","vehicle"]},"highspeed-train":{"a":"High-Speed Train","b":"1F684","j":["high-speed train","railway","shinkansen","speed","train","high_speed_train","transportation","vehicle"]},"bullet-train":{"a":"Bullet Train","b":"1F685","j":["bullet","railway","shinkansen","speed","train","transportation","vehicle","fast","public","travel"]},"train":{"a":"Train","b":"1F686","j":["railway","transportation","vehicle"]},"metro":{"a":"Metro","b":"1F687","j":["subway","transportation","blue-square","mrt","underground","tube"]},"light-rail":{"a":"Light Rail","b":"1F688","j":["railway","transportation","vehicle"]},"station":{"a":"Station","b":"1F689","j":["railway","train","transportation","vehicle","public"]},"tram":{"a":"Tram","b":"1F68A","j":["trolleybus","transportation","vehicle"]},"monorail":{"a":"Monorail","b":"1F69D","j":["vehicle","transportation"]},"mountain-railway":{"a":"Mountain Railway","b":"1F69E","j":["car","mountain","railway","transportation","vehicle"]},"tram-car":{"a":"Tram Car","b":"1F68B","j":["car","tram","trolleybus","transportation","vehicle","carriage","public","travel"]},"bus":{"a":"Bus","b":"1F68C","j":["vehicle","car","transportation"]},"oncoming-bus":{"a":"Oncoming Bus","b":"1F68D","j":["bus","oncoming","vehicle","transportation"]},"trolleybus":{"a":"Trolleybus","b":"1F68E","j":["bus","tram","trolley","bart","transportation","vehicle"]},"minibus":{"a":"Minibus","b":"1F690","j":["bus","vehicle","car","transportation"]},"ambulance":{"a":"Ambulance","b":"1F691","j":["vehicle","health","911","hospital"]},"fire-engine":{"a":"Fire Engine","b":"1F692","j":["engine","fire","truck","transportation","cars","vehicle"]},"police-car":{"a":"Police Car","b":"1F693","j":["car","patrol","police","vehicle","cars","transportation","law","legal","enforcement"]},"oncoming-police-car":{"a":"Oncoming Police Car","b":"1F694","j":["car","oncoming","police","vehicle","law","legal","enforcement","911"]},"taxi":{"a":"Taxi","b":"1F695","j":["vehicle","uber","cars","transportation"]},"oncoming-taxi":{"a":"Oncoming Taxi","b":"1F696","j":["oncoming","taxi","vehicle","cars","uber"]},"automobile":{"a":"Automobile","b":"1F697","j":["car","red","transportation","vehicle"]},"oncoming-automobile":{"a":"Oncoming Automobile","b":"1F698","j":["automobile","car","oncoming","vehicle","transportation"]},"sport-utility-vehicle":{"a":"Sport Utility Vehicle","b":"1F699","j":["recreational","sport utility","transportation","vehicle"]},"pickup-truck":{"a":"Pickup Truck","b":"1F6FB","j":["pick-up","pickup","truck","car","transportation"]},"delivery-truck":{"a":"Delivery Truck","b":"1F69A","j":["delivery","truck","cars","transportation"]},"articulated-lorry":{"a":"Articulated Lorry","b":"1F69B","j":["lorry","semi","truck","vehicle","cars","transportation","express"]},"tractor":{"a":"Tractor","b":"1F69C","j":["vehicle","car","farming","agriculture"]},"racing-car":{"a":"Racing Car","b":"1F3CE","j":["car","racing","sports","race","fast","formula","f1"]},"motorcycle":{"a":"Motorcycle","b":"1F3CD","j":["racing","race","sports","fast"]},"motor-scooter":{"a":"Motor Scooter","b":"1F6F5","j":["motor","scooter","vehicle","vespa","sasha"]},"manual-wheelchair":{"a":"Manual Wheelchair","b":"1F9BD","j":["accessibility"]},"motorized-wheelchair":{"a":"Motorized Wheelchair","b":"1F9BC","j":["accessibility"]},"auto-rickshaw":{"a":"Auto Rickshaw","b":"1F6FA","j":["tuk tuk","move","transportation"]},"bicycle":{"a":"Bicycle","b":"1F6B2","j":["bike","sports","exercise","hipster"]},"kick-scooter":{"a":"Kick Scooter","b":"1F6F4","j":["kick","scooter","vehicle","razor"]},"skateboard":{"a":"Skateboard","b":"1F6F9","j":["board"]},"roller-skate":{"a":"Roller Skate","b":"1F6FC","j":["roller","skate","footwear","sports"]},"bus-stop":{"a":"Bus Stop","b":"1F68F","j":["bus","busstop","stop","transportation","wait"]},"motorway":{"a":"Motorway","b":"1F6E3","j":["highway","road","cupertino","interstate"]},"railway-track":{"a":"Railway Track","b":"1F6E4","j":["railway","train","transportation"]},"oil-drum":{"a":"Oil Drum","b":"1F6E2","j":["drum","oil","barrell"]},"fuel-pump":{"a":"Fuel Pump","b":"26FD","j":["diesel","fuel","fuelpump","gas","pump","station","gas station","petroleum"]},"police-car-light":{"a":"Police Car Light","b":"1F6A8","j":["beacon","car","light","police","revolving","ambulance","911","emergency","alert","error","pinged","law","legal"]},"horizontal-traffic-light":{"a":"Horizontal Traffic Light","b":"1F6A5","j":["light","signal","traffic","transportation"]},"vertical-traffic-light":{"a":"Vertical Traffic Light","b":"1F6A6","j":["light","signal","traffic","transportation","driving"]},"stop-sign":{"a":"Stop Sign","b":"1F6D1","j":["octagonal","sign","stop"]},"construction":{"a":"Construction","b":"1F6A7","j":["barrier","wip","progress","caution","warning"]},"anchor":{"a":"Anchor","b":"2693","j":["ship","tool","ferry","sea","boat"]},"sailboat":{"a":"Sailboat","b":"26F5","j":["boat","resort","sea","yacht","ship","summer","transportation","water","sailing"]},"canoe":{"a":"Canoe","b":"1F6F6","j":["boat","paddle","water","ship"]},"speedboat":{"a":"Speedboat","b":"1F6A4","j":["boat","ship","transportation","vehicle","summer"]},"passenger-ship":{"a":"Passenger Ship","b":"1F6F3","j":["passenger","ship","yacht","cruise","ferry"]},"ferry":{"a":"Ferry","b":"26F4","j":["boat","passenger","ship","yacht"]},"motor-boat":{"a":"Motor Boat","b":"1F6E5","j":["boat","motorboat","ship"]},"ship":{"a":"Ship","b":"1F6A2","j":["boat","passenger","transportation","titanic","deploy"]},"airplane":{"a":"Airplane","b":"2708","j":["aeroplane","vehicle","transportation","flight","fly"]},"small-airplane":{"a":"Small Airplane","b":"1F6E9","j":["aeroplane","airplane","flight","transportation","fly","vehicle"]},"airplane-departure":{"a":"Airplane Departure","b":"1F6EB","j":["aeroplane","airplane","check-in","departure","departures","airport","flight","landing"]},"airplane-arrival":{"a":"Airplane Arrival","b":"1F6EC","j":["aeroplane","airplane","arrivals","arriving","landing","airport","flight","boarding"]},"parachute":{"a":"Parachute","b":"1FA82","j":["hang-glide","parasail","skydive","fly","glide"]},"seat":{"a":"Seat","b":"1F4BA","j":["chair","sit","airplane","transport","bus","flight","fly"]},"helicopter":{"a":"Helicopter","b":"1F681","j":["vehicle","transportation","fly"]},"suspension-railway":{"a":"Suspension Railway","b":"1F69F","j":["railway","suspension","vehicle","transportation"]},"mountain-cableway":{"a":"Mountain Cableway","b":"1F6A0","j":["cable","gondola","mountain","transportation","vehicle","ski"]},"aerial-tramway":{"a":"Aerial Tramway","b":"1F6A1","j":["aerial","cable","car","gondola","tramway","transportation","vehicle","ski"]},"satellite":{"a":"Satellite","b":"1F6F0","j":["space","communication","gps","orbit","spaceflight","NASA","ISS"]},"rocket":{"a":"Rocket","b":"1F680","j":["space","launch","ship","staffmode","NASA","outer space","outer_space","fly"]},"flying-saucer":{"a":"Flying Saucer","b":"1F6F8","j":["UFO","transportation","vehicle","ufo"]},"bellhop-bell":{"a":"Bellhop Bell","b":"1F6CE","j":["bell","bellhop","hotel","service"]},"luggage":{"a":"Luggage","b":"1F9F3","j":["packing","travel"]},"hourglass-done":{"a":"Hourglass Done","b":"231B","j":["sand","timer","time","clock","oldschool","limit","exam","quiz","test"]},"hourglass-not-done":{"a":"Hourglass Not Done","b":"23F3","j":["hourglass","sand","timer","oldschool","time","countdown"]},"watch":{"a":"Watch","b":"231A","j":["clock","time","accessories"]},"alarm-clock":{"a":"Alarm Clock","b":"23F0","j":["alarm","clock","time","wake"]},"stopwatch":{"a":"Stopwatch","b":"23F1","j":["clock","time","deadline"]},"timer-clock":{"a":"Timer Clock","b":"23F2","j":["clock","timer","alarm"]},"mantelpiece-clock":{"a":"Mantelpiece Clock","b":"1F570","j":["clock","time"]},"twelve-oclock":{"a":"Twelve O’Clock","b":"1F55B","j":["00","12","12:00","clock","o’clock","twelve","twelve_o_clock","time","noon","midnight","midday","late","early","schedule"]},"twelvethirty":{"a":"Twelve-Thirty","b":"1F567","j":["12","12:30","clock","thirty","twelve","twelve-thirty","twelve_thirty","time","late","early","schedule"]},"one-oclock":{"a":"One O’Clock","b":"1F550","j":["00","1","1:00","clock","o’clock","one","one_o_clock","time","late","early","schedule"]},"onethirty":{"a":"One-Thirty","b":"1F55C","j":["1","1:30","clock","one","one-thirty","thirty","one_thirty","time","late","early","schedule"]},"two-oclock":{"a":"Two O’Clock","b":"1F551","j":["00","2","2:00","clock","o’clock","two","two_o_clock","time","late","early","schedule"]},"twothirty":{"a":"Two-Thirty","b":"1F55D","j":["2","2:30","clock","thirty","two","two-thirty","two_thirty","time","late","early","schedule"]},"three-oclock":{"a":"Three O’Clock","b":"1F552","j":["00","3","3:00","clock","o’clock","three","three_o_clock","time","late","early","schedule"]},"threethirty":{"a":"Three-Thirty","b":"1F55E","j":["3","3:30","clock","thirty","three","three-thirty","three_thirty","time","late","early","schedule"]},"four-oclock":{"a":"Four O’Clock","b":"1F553","j":["00","4","4:00","clock","four","o’clock","four_o_clock","time","late","early","schedule"]},"fourthirty":{"a":"Four-Thirty","b":"1F55F","j":["4","4:30","clock","four","four-thirty","thirty","four_thirty","time","late","early","schedule"]},"five-oclock":{"a":"Five O’Clock","b":"1F554","j":["00","5","5:00","clock","five","o’clock","five_o_clock","time","late","early","schedule"]},"fivethirty":{"a":"Five-Thirty","b":"1F560","j":["5","5:30","clock","five","five-thirty","thirty","five_thirty","time","late","early","schedule"]},"six-oclock":{"a":"Six O’Clock","b":"1F555","j":["00","6","6:00","clock","o’clock","six","six_o_clock","time","late","early","schedule","dawn","dusk"]},"sixthirty":{"a":"Six-Thirty","b":"1F561","j":["6","6:30","clock","six","six-thirty","thirty","six_thirty","time","late","early","schedule"]},"seven-oclock":{"a":"Seven O’Clock","b":"1F556","j":["00","7","7:00","clock","o’clock","seven","seven_o_clock","time","late","early","schedule"]},"seventhirty":{"a":"Seven-Thirty","b":"1F562","j":["7","7:30","clock","seven","seven-thirty","thirty","seven_thirty","time","late","early","schedule"]},"eight-oclock":{"a":"Eight O’Clock","b":"1F557","j":["00","8","8:00","clock","eight","o’clock","eight_o_clock","time","late","early","schedule"]},"eightthirty":{"a":"Eight-Thirty","b":"1F563","j":["8","8:30","clock","eight","eight-thirty","thirty","eight_thirty","time","late","early","schedule"]},"nine-oclock":{"a":"Nine O’Clock","b":"1F558","j":["00","9","9:00","clock","nine","o’clock","nine_o_clock","time","late","early","schedule"]},"ninethirty":{"a":"Nine-Thirty","b":"1F564","j":["9","9:30","clock","nine","nine-thirty","thirty","nine_thirty","time","late","early","schedule"]},"ten-oclock":{"a":"Ten O’Clock","b":"1F559","j":["00","10","10:00","clock","o’clock","ten","ten_o_clock","time","late","early","schedule"]},"tenthirty":{"a":"Ten-Thirty","b":"1F565","j":["10","10:30","clock","ten","ten-thirty","thirty","ten_thirty","time","late","early","schedule"]},"eleven-oclock":{"a":"Eleven O’Clock","b":"1F55A","j":["00","11","11:00","clock","eleven","o’clock","eleven_o_clock","time","late","early","schedule"]},"eleventhirty":{"a":"Eleven-Thirty","b":"1F566","j":["11","11:30","clock","eleven","eleven-thirty","thirty","eleven_thirty","time","late","early","schedule"]},"new-moon":{"a":"New Moon","b":"1F311","j":["dark","moon","nature","twilight","planet","space","night","evening","sleep"]},"waxing-crescent-moon":{"a":"Waxing Crescent Moon","b":"1F312","j":["crescent","moon","waxing","nature","twilight","planet","space","night","evening","sleep"]},"first-quarter-moon":{"a":"First Quarter Moon","b":"1F313","j":["moon","quarter","nature","twilight","planet","space","night","evening","sleep"]},"waxing-gibbous-moon":{"a":"Waxing Gibbous Moon","b":"1F314","j":["gibbous","moon","waxing","nature","night","sky","gray","twilight","planet","space","evening","sleep"]},"full-moon":{"a":"Full Moon","b":"1F315","j":["full","moon","nature","yellow","twilight","planet","space","night","evening","sleep"]},"waning-gibbous-moon":{"a":"Waning Gibbous Moon","b":"1F316","j":["gibbous","moon","waning","nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"]},"last-quarter-moon":{"a":"Last Quarter Moon","b":"1F317","j":["moon","quarter","nature","twilight","planet","space","night","evening","sleep"]},"waning-crescent-moon":{"a":"Waning Crescent Moon","b":"1F318","j":["crescent","moon","waning","nature","twilight","planet","space","night","evening","sleep"]},"crescent-moon":{"a":"Crescent Moon","b":"1F319","j":["crescent","moon","night","sleep","sky","evening","magic"]},"new-moon-face":{"a":"New Moon Face","b":"1F31A","j":["face","moon","nature","twilight","planet","space","night","evening","sleep"]},"first-quarter-moon-face":{"a":"First Quarter Moon Face","b":"1F31B","j":["face","moon","quarter","nature","twilight","planet","space","night","evening","sleep"]},"last-quarter-moon-face":{"a":"Last Quarter Moon Face","b":"1F31C","j":["face","moon","quarter","nature","twilight","planet","space","night","evening","sleep"]},"thermometer":{"a":"Thermometer","b":"1F321","j":["weather","temperature","hot","cold"]},"sun":{"a":"Sun","b":"2600","j":["bright","rays","sunny","weather","nature","brightness","summer","beach","spring"]},"full-moon-face":{"a":"Full Moon Face","b":"1F31D","j":["bright","face","full","moon","nature","twilight","planet","space","night","evening","sleep"]},"sun-with-face":{"a":"Sun with Face","b":"1F31E","j":["bright","face","sun","nature","morning","sky"]},"ringed-planet":{"a":"Ringed Planet","b":"1FA90","j":["saturn","saturnine","outerspace"]},"star":{"a":"Star","b":"2B50","j":["night","yellow"]},"glowing-star":{"a":"Glowing Star","b":"1F31F","j":["glittery","glow","shining","sparkle","star","night","awesome","good","magic"]},"shooting-star":{"a":"Shooting Star","b":"1F320","j":["falling","shooting","star","night","photo"]},"milky-way":{"a":"Milky Way","b":"1F30C","j":["space","photo","stars"]},"cloud":{"a":"Cloud","b":"2601","j":["weather","sky"]},"sun-behind-cloud":{"a":"Sun Behind Cloud","b":"26C5","j":["cloud","sun","weather","nature","cloudy","morning","fall","spring"]},"cloud-with-lightning-and-rain":{"a":"Cloud with Lightning and Rain","b":"26C8","j":["cloud","rain","thunder","weather","lightning"]},"sun-behind-small-cloud":{"a":"Sun Behind Small Cloud","b":"1F324","j":["cloud","sun","weather"]},"sun-behind-large-cloud":{"a":"Sun Behind Large Cloud","b":"1F325","j":["cloud","sun","weather"]},"sun-behind-rain-cloud":{"a":"Sun Behind Rain Cloud","b":"1F326","j":["cloud","rain","sun","weather"]},"cloud-with-rain":{"a":"Cloud with Rain","b":"1F327","j":["cloud","rain","weather"]},"cloud-with-snow":{"a":"Cloud with Snow","b":"1F328","j":["cloud","cold","snow","weather"]},"cloud-with-lightning":{"a":"Cloud with Lightning","b":"1F329","j":["cloud","lightning","weather","thunder"]},"tornado":{"a":"Tornado","b":"1F32A","j":["cloud","whirlwind","weather","cyclone","twister"]},"fog":{"a":"Fog","b":"1F32B","j":["cloud","weather"]},"wind-face":{"a":"Wind Face","b":"1F32C","j":["blow","cloud","face","wind","gust","air"]},"cyclone":{"a":"Cyclone","b":"1F300","j":["dizzy","hurricane","twister","typhoon","weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado"]},"rainbow":{"a":"Rainbow","b":"1F308","j":["rain","nature","happy","unicorn_face","photo","sky","spring"]},"closed-umbrella":{"a":"Closed Umbrella","b":"1F302","j":["clothing","rain","umbrella","weather","drizzle"]},"umbrella":{"a":"Umbrella","b":"2602","j":["clothing","rain","weather","spring"]},"umbrella-with-rain-drops":{"a":"Umbrella with Rain Drops","b":"2614","j":["clothing","drop","rain","umbrella","rainy","weather","spring"]},"umbrella-on-ground":{"a":"Umbrella on Ground","b":"26F1","j":["rain","sun","umbrella","weather","summer"]},"high-voltage":{"a":"High Voltage","b":"26A1","j":["danger","electric","lightning","voltage","zap","thunder","weather","lightning bolt","fast"]},"snowflake":{"a":"Snowflake","b":"2744","j":["cold","snow","winter","season","weather","christmas","xmas"]},"snowman":{"a":"Snowman","b":"2603","j":["cold","snow","winter","season","weather","christmas","xmas","frozen"]},"snowman-without-snow":{"a":"Snowman Without Snow","b":"26C4","j":["cold","snow","snowman","winter","season","weather","christmas","xmas","frozen","without_snow"]},"comet":{"a":"Comet","b":"2604","j":["space"]},"fire":{"a":"Fire","b":"1F525","j":["flame","tool","hot","cook"]},"droplet":{"a":"Droplet","b":"1F4A7","j":["cold","comic","drop","sweat","water","drip","faucet","spring"]},"water-wave":{"a":"Water Wave","b":"1F30A","j":["ocean","water","wave","sea","nature","tsunami","disaster"]},"jackolantern":{"a":"Jack-O-Lantern","b":"1F383","j":["celebration","halloween","jack","jack-o-lantern","lantern","jack_o_lantern","light","pumpkin","creepy","fall"]},"christmas-tree":{"a":"Christmas Tree","b":"1F384","j":["celebration","Christmas","tree","festival","vacation","december","xmas"]},"fireworks":{"a":"Fireworks","b":"1F386","j":["celebration","photo","festival","carnival","congratulations"]},"sparkler":{"a":"Sparkler","b":"1F387","j":["celebration","fireworks","sparkle","stars","night","shine"]},"firecracker":{"a":"Firecracker","b":"1F9E8","j":["dynamite","explosive","fireworks","boom","explode","explosion"]},"sparkles":{"a":"Sparkles","b":"2728","j":["*","sparkle","star","stars","shine","shiny","cool","awesome","good","magic"]},"balloon":{"a":"Balloon","b":"1F388","j":["celebration","party","birthday","circus"]},"party-popper":{"a":"Party Popper","b":"1F389","j":["celebration","party","popper","tada","congratulations","birthday","magic","circus"]},"confetti-ball":{"a":"Confetti Ball","b":"1F38A","j":["ball","celebration","confetti","festival","party","birthday","circus"]},"tanabata-tree":{"a":"Tanabata Tree","b":"1F38B","j":["banner","celebration","Japanese","tree","plant","nature","branch","summer"]},"pine-decoration":{"a":"Pine Decoration","b":"1F38D","j":["bamboo","celebration","Japanese","pine","plant","nature","vegetable","panda"]},"japanese-dolls":{"a":"Japanese Dolls","b":"1F38E","j":["celebration","doll","festival","Japanese","Japanese dolls","japanese","toy","kimono"]},"carp-streamer":{"a":"Carp Streamer","b":"1F38F","j":["carp","celebration","streamer","fish","japanese","koinobori","banner"]},"wind-chime":{"a":"Wind Chime","b":"1F390","j":["bell","celebration","chime","wind","nature","ding","spring"]},"moon-viewing-ceremony":{"a":"Moon Viewing Ceremony","b":"1F391","j":["celebration","ceremony","moon","photo","japan","asia","tsukimi"]},"red-envelope":{"a":"Red Envelope","b":"1F9E7","j":["gift","good luck","hóngbāo","lai see","money"]},"ribbon":{"a":"Ribbon","b":"1F380","j":["celebration","decoration","pink","girl","bowtie"]},"wrapped-gift":{"a":"Wrapped Gift","b":"1F381","j":["box","celebration","gift","present","wrapped","birthday","christmas","xmas"]},"reminder-ribbon":{"a":"Reminder Ribbon","b":"1F397","j":["celebration","reminder","ribbon","sports","cause","support","awareness"]},"admission-tickets":{"a":"Admission Tickets","b":"1F39F","j":["admission","ticket","sports","concert","entrance"]},"ticket":{"a":"Ticket","b":"1F3AB","j":["admission","event","concert","pass"]},"military-medal":{"a":"Military Medal","b":"1F396","j":["celebration","medal","military","award","winning","army"]},"trophy":{"a":"Trophy","b":"1F3C6","j":["prize","win","award","contest","place","ftw","ceremony"]},"sports-medal":{"a":"Sports Medal","b":"1F3C5","j":["medal","award","winning"]},"1st-place-medal":{"a":"1st Place Medal","b":"1F947","j":["first","gold","medal","award","winning"]},"2nd-place-medal":{"a":"2nd Place Medal","b":"1F948","j":["medal","second","silver","award"]},"3rd-place-medal":{"a":"3rd Place Medal","b":"1F949","j":["bronze","medal","third","award"]},"soccer-ball":{"a":"Soccer Ball","b":"26BD","j":["ball","football","soccer","sports"]},"baseball":{"a":"Baseball","b":"26BE","j":["ball","sports","balls"]},"softball":{"a":"Softball","b":"1F94E","j":["ball","glove","underarm","sports","balls"]},"basketball":{"a":"Basketball","b":"1F3C0","j":["ball","hoop","sports","balls","NBA"]},"volleyball":{"a":"Volleyball","b":"1F3D0","j":["ball","game","sports","balls"]},"american-football":{"a":"American Football","b":"1F3C8","j":["american","ball","football","sports","balls","NFL"]},"rugby-football":{"a":"Rugby Football","b":"1F3C9","j":["ball","football","rugby","sports","team"]},"tennis":{"a":"Tennis","b":"1F3BE","j":["ball","racquet","sports","balls","green"]},"flying-disc":{"a":"Flying Disc","b":"1F94F","j":["ultimate","sports","frisbee"]},"bowling":{"a":"Bowling","b":"1F3B3","j":["ball","game","sports","fun","play"]},"cricket-game":{"a":"Cricket Game","b":"1F3CF","j":["ball","bat","game","sports"]},"field-hockey":{"a":"Field Hockey","b":"1F3D1","j":["ball","field","game","hockey","stick","sports"]},"ice-hockey":{"a":"Ice Hockey","b":"1F3D2","j":["game","hockey","ice","puck","stick","sports"]},"lacrosse":{"a":"Lacrosse","b":"1F94D","j":["ball","goal","stick","sports"]},"ping-pong":{"a":"Ping Pong","b":"1F3D3","j":["ball","bat","game","paddle","table tennis","sports","pingpong"]},"badminton":{"a":"Badminton","b":"1F3F8","j":["birdie","game","racquet","shuttlecock","sports"]},"boxing-glove":{"a":"Boxing Glove","b":"1F94A","j":["boxing","glove","sports","fighting"]},"martial-arts-uniform":{"a":"Martial Arts Uniform","b":"1F94B","j":["judo","karate","martial arts","taekwondo","uniform"]},"goal-net":{"a":"Goal Net","b":"1F945","j":["goal","net","sports"]},"flag-in-hole":{"a":"Flag in Hole","b":"26F3","j":["golf","hole","sports","business","flag","summer"]},"ice-skate":{"a":"Ice Skate","b":"26F8","j":["ice","skate","sports"]},"fishing-pole":{"a":"Fishing Pole","b":"1F3A3","j":["fish","pole","food","hobby","summer"]},"diving-mask":{"a":"Diving Mask","b":"1F93F","j":["diving","scuba","snorkeling","sport","ocean"]},"running-shirt":{"a":"Running Shirt","b":"1F3BD","j":["athletics","running","sash","shirt","play","pageant"]},"skis":{"a":"Skis","b":"1F3BF","j":["ski","snow","sports","winter","cold"]},"sled":{"a":"Sled","b":"1F6F7","j":["sledge","sleigh","luge","toboggan"]},"curling-stone":{"a":"Curling Stone","b":"1F94C","j":["game","rock","sports"]},"bullseye":{"a":"Bullseye","b":"1F3AF","j":["dart","direct hit","game","hit","target","direct_hit","play","bar"]},"yoyo":{"a":"Yo-Yo","b":"1FA80","j":["fluctuate","toy","yo-yo","yo_yo"]},"kite":{"a":"Kite","b":"1FA81","j":["fly","soar","wind"]},"pool-8-ball":{"a":"Pool 8 Ball","b":"1F3B1","j":["8","ball","billiard","eight","game","pool","hobby","luck","magic"]},"crystal-ball":{"a":"Crystal Ball","b":"1F52E","j":["ball","crystal","fairy tale","fantasy","fortune","tool","disco","party","magic","circus","fortune_teller"]},"magic-wand":{"a":"Magic Wand","b":"1FA84","j":["magic","witch","wizard","supernature","power"]},"nazar-amulet":{"a":"Nazar Amulet","b":"1F9FF","j":["bead","charm","evil-eye","nazar","talisman"]},"video-game":{"a":"Video Game","b":"1F3AE","j":["controller","game","play","console","PS4"]},"joystick":{"a":"Joystick","b":"1F579","j":["game","video game","play"]},"slot-machine":{"a":"Slot Machine","b":"1F3B0","j":["game","slot","bet","gamble","vegas","fruit machine","luck","casino"]},"game-die":{"a":"Game Die","b":"1F3B2","j":["dice","die","game","random","tabletop","play","luck"]},"puzzle-piece":{"a":"Puzzle Piece","b":"1F9E9","j":["clue","interlocking","jigsaw","piece","puzzle"]},"teddy-bear":{"a":"Teddy Bear","b":"1F9F8","j":["plaything","plush","stuffed","toy"]},"piata":{"a":"Piñata","b":"1FA85","j":["celebration","party","piñata","pinata","mexico","candy"]},"nesting-dolls":{"a":"Nesting Dolls","b":"1FA86","j":["doll","nesting","russia","matryoshka","toy"]},"spade-suit":{"a":"Spade Suit","b":"2660","j":["card","game","poker","cards","suits","magic"]},"heart-suit":{"a":"Heart Suit","b":"2665","j":["card","game","poker","cards","magic","suits"]},"diamond-suit":{"a":"Diamond Suit","b":"2666","j":["card","game","poker","cards","magic","suits"]},"club-suit":{"a":"Club Suit","b":"2663","j":["card","game","poker","cards","magic","suits"]},"chess-pawn":{"a":"Chess Pawn","b":"265F","j":["chess","dupe","expendable"]},"joker":{"a":"Joker","b":"1F0CF","j":["card","game","wildcard","poker","cards","play","magic"]},"mahjong-red-dragon":{"a":"Mahjong Red Dragon","b":"1F004","j":["game","mahjong","red","play","chinese","kanji"]},"flower-playing-cards":{"a":"Flower Playing Cards","b":"1F3B4","j":["card","flower","game","Japanese","playing","sunset","red"]},"performing-arts":{"a":"Performing Arts","b":"1F3AD","j":["art","mask","performing","theater","theatre","acting","drama"]},"framed-picture":{"a":"Framed Picture","b":"1F5BC","j":["art","frame","museum","painting","picture","photography"]},"artist-palette":{"a":"Artist Palette","b":"1F3A8","j":["art","museum","painting","palette","design","paint","draw","colors"]},"thread":{"a":"Thread","b":"1F9F5","j":["needle","sewing","spool","string"]},"sewing-needle":{"a":"Sewing Needle","b":"1FAA1","j":["embroidery","needle","sewing","stitches","sutures","tailoring"]},"yarn":{"a":"Yarn","b":"1F9F6","j":["ball","crochet","knit"]},"knot":{"a":"Knot","b":"1FAA2","j":["rope","tangled","tie","twine","twist","scout"]},"glasses":{"a":"Glasses","b":"1F453","j":["clothing","eye","eyeglasses","eyewear","fashion","accessories","eyesight","nerdy","dork","geek"]},"sunglasses":{"a":"Sunglasses","b":"1F576","j":["dark","eye","eyewear","glasses","face","cool","accessories"]},"goggles":{"a":"Goggles","b":"1F97D","j":["eye protection","swimming","welding","eyes","protection","safety"]},"lab-coat":{"a":"Lab Coat","b":"1F97C","j":["doctor","experiment","scientist","chemist"]},"safety-vest":{"a":"Safety Vest","b":"1F9BA","j":["emergency","safety","vest","protection"]},"necktie":{"a":"Necktie","b":"1F454","j":["clothing","tie","shirt","suitup","formal","fashion","cloth","business"]},"tshirt":{"a":"T-Shirt","b":"1F455","j":["clothing","shirt","t-shirt","t_shirt","fashion","cloth","casual","tee"]},"jeans":{"a":"Jeans","b":"1F456","j":["clothing","pants","trousers","fashion","shopping"]},"scarf":{"a":"Scarf","b":"1F9E3","j":["neck","winter","clothes"]},"gloves":{"a":"Gloves","b":"1F9E4","j":["hand","hands","winter","clothes"]},"coat":{"a":"Coat","b":"1F9E5","j":["jacket"]},"socks":{"a":"Socks","b":"1F9E6","j":["stocking","stockings","clothes"]},"dress":{"a":"Dress","b":"1F457","j":["clothing","clothes","fashion","shopping"]},"kimono":{"a":"Kimono","b":"1F458","j":["clothing","dress","fashion","women","female","japanese"]},"sari":{"a":"Sari","b":"1F97B","j":["clothing","dress"]},"onepiece-swimsuit":{"a":"One-Piece Swimsuit","b":"1FA71","j":["bathing suit","one-piece swimsuit","one_piece_swimsuit","fashion"]},"briefs":{"a":"Briefs","b":"1FA72","j":["bathing suit","one-piece","swimsuit","underwear","clothing"]},"shorts":{"a":"Shorts","b":"1FA73","j":["bathing suit","pants","underwear","clothing"]},"bikini":{"a":"Bikini","b":"1F459","j":["clothing","swim","swimming","female","woman","girl","fashion","beach","summer"]},"womans-clothes":{"a":"Woman’S Clothes","b":"1F45A","j":["clothing","woman","woman’s clothes","woman_s_clothes","fashion","shopping_bags","female"]},"purse":{"a":"Purse","b":"1F45B","j":["clothing","coin","fashion","accessories","money","sales","shopping"]},"handbag":{"a":"Handbag","b":"1F45C","j":["bag","clothing","purse","fashion","accessory","accessories","shopping"]},"clutch-bag":{"a":"Clutch Bag","b":"1F45D","j":["bag","clothing","pouch","accessories","shopping"]},"shopping-bags":{"a":"Shopping Bags","b":"1F6CD","j":["bag","hotel","shopping","mall","buy","purchase"]},"backpack":{"a":"Backpack","b":"1F392","j":["bag","rucksack","satchel","school","student","education"]},"thong-sandal":{"a":"Thong Sandal","b":"1FA74","j":["beach sandals","sandals","thong sandals","thongs","zōri","footwear","summer"]},"mans-shoe":{"a":"Man’S Shoe","b":"1F45E","j":["clothing","man","man’s shoe","shoe","man_s_shoe","fashion","male"]},"running-shoe":{"a":"Running Shoe","b":"1F45F","j":["athletic","clothing","shoe","sneaker","shoes","sports","sneakers"]},"hiking-boot":{"a":"Hiking Boot","b":"1F97E","j":["backpacking","boot","camping","hiking"]},"flat-shoe":{"a":"Flat Shoe","b":"1F97F","j":["ballet flat","slip-on","slipper","ballet"]},"highheeled-shoe":{"a":"High-Heeled Shoe","b":"1F460","j":["clothing","heel","high-heeled shoe","shoe","woman","high_heeled_shoe","fashion","shoes","female","pumps","stiletto"]},"womans-sandal":{"a":"Woman’S Sandal","b":"1F461","j":["clothing","sandal","shoe","woman","woman’s sandal","woman_s_sandal","shoes","fashion","flip flops"]},"ballet-shoes":{"a":"Ballet Shoes","b":"1FA70","j":["ballet","dance"]},"womans-boot":{"a":"Woman’S Boot","b":"1F462","j":["boot","clothing","shoe","woman","woman’s boot","woman_s_boot","shoes","fashion"]},"crown":{"a":"Crown","b":"1F451","j":["clothing","king","queen","kod","leader","royalty","lord"]},"womans-hat":{"a":"Woman’S Hat","b":"1F452","j":["clothing","hat","woman","woman’s hat","woman_s_hat","fashion","accessories","female","lady","spring"]},"top-hat":{"a":"Top Hat","b":"1F3A9","j":["clothing","hat","top","tophat","magic","gentleman","classy","circus"]},"graduation-cap":{"a":"Graduation Cap","b":"1F393","j":["cap","celebration","clothing","graduation","hat","school","college","degree","university","legal","learn","education"]},"billed-cap":{"a":"Billed Cap","b":"1F9E2","j":["baseball cap","cap","baseball"]},"military-helmet":{"a":"Military Helmet","b":"1FA96","j":["army","helmet","military","soldier","warrior","protection"]},"rescue-workers-helmet":{"a":"Rescue Worker’S Helmet","b":"26D1","j":["aid","cross","face","hat","helmet","rescue worker’s helmet","rescue_worker_s_helmet","construction","build"]},"prayer-beads":{"a":"Prayer Beads","b":"1F4FF","j":["beads","clothing","necklace","prayer","religion","dhikr","religious"]},"lipstick":{"a":"Lipstick","b":"1F484","j":["cosmetics","makeup","female","girl","fashion","woman"]},"ring":{"a":"Ring","b":"1F48D","j":["diamond","wedding","propose","marriage","valentines","fashion","jewelry","gem","engagement"]},"gem-stone":{"a":"Gem Stone","b":"1F48E","j":["diamond","gem","jewel","blue","ruby","jewelry"]},"muted-speaker":{"a":"Muted Speaker","b":"1F507","j":["mute","quiet","silent","speaker","sound","volume","silence"]},"speaker-low-volume":{"a":"Speaker Low Volume","b":"1F508","j":["soft","sound","volume","silence","broadcast"]},"speaker-medium-volume":{"a":"Speaker Medium Volume","b":"1F509","j":["medium","volume","speaker","broadcast"]},"speaker-high-volume":{"a":"Speaker High Volume","b":"1F50A","j":["loud","volume","noise","noisy","speaker","broadcast"]},"loudspeaker":{"a":"Loudspeaker","b":"1F4E2","j":["loud","public address","volume","sound"]},"megaphone":{"a":"Megaphone","b":"1F4E3","j":["cheering","sound","speaker","volume"]},"postal-horn":{"a":"Postal Horn","b":"1F4EF","j":["horn","post","postal","instrument","music"]},"bell":{"a":"Bell","b":"1F514","j":["sound","notification","christmas","xmas","chime"]},"bell-with-slash":{"a":"Bell with Slash","b":"1F515","j":["bell","forbidden","mute","quiet","silent","sound","volume"]},"musical-score":{"a":"Musical Score","b":"1F3BC","j":["music","score","treble","clef","compose"]},"musical-note":{"a":"Musical Note","b":"1F3B5","j":["music","note","score","tone","sound"]},"musical-notes":{"a":"Musical Notes","b":"1F3B6","j":["music","note","notes","score"]},"studio-microphone":{"a":"Studio Microphone","b":"1F399","j":["mic","microphone","music","studio","sing","recording","artist","talkshow"]},"level-slider":{"a":"Level Slider","b":"1F39A","j":["level","music","slider","scale"]},"control-knobs":{"a":"Control Knobs","b":"1F39B","j":["control","knobs","music","dial"]},"microphone":{"a":"Microphone","b":"1F3A4","j":["karaoke","mic","sound","music","PA","sing","talkshow"]},"headphone":{"a":"Headphone","b":"1F3A7","j":["earbud","music","score","gadgets"]},"radio":{"a":"Radio","b":"1F4FB","j":["video","communication","music","podcast","program"]},"saxophone":{"a":"Saxophone","b":"1F3B7","j":["instrument","music","sax","jazz","blues"]},"accordion":{"a":"Accordion","b":"1FA97","j":["concertina","squeeze box","music"]},"guitar":{"a":"Guitar","b":"1F3B8","j":["instrument","music"]},"musical-keyboard":{"a":"Musical Keyboard","b":"1F3B9","j":["instrument","keyboard","music","piano","compose"]},"trumpet":{"a":"Trumpet","b":"1F3BA","j":["instrument","music","brass"]},"violin":{"a":"Violin","b":"1F3BB","j":["instrument","music","orchestra","symphony"]},"banjo":{"a":"Banjo","b":"1FA95","j":["music","stringed","instructment"]},"drum":{"a":"Drum","b":"1F941","j":["drumsticks","music","instrument","snare"]},"long-drum":{"a":"Long Drum","b":"1FA98","j":["beat","conga","drum","rhythm","music"]},"mobile-phone":{"a":"Mobile Phone","b":"1F4F1","j":["cell","mobile","phone","telephone","technology","apple","gadgets","dial"]},"mobile-phone-with-arrow":{"a":"Mobile Phone with Arrow","b":"1F4F2","j":["arrow","cell","mobile","phone","receive","iphone","incoming"]},"telephone":{"a":"Telephone","b":"260E","j":["phone","technology","communication","dial"]},"telephone-receiver":{"a":"Telephone Receiver","b":"1F4DE","j":["phone","receiver","telephone","technology","communication","dial"]},"pager":{"a":"Pager","b":"1F4DF","j":["bbcall","oldschool","90s"]},"fax-machine":{"a":"Fax Machine","b":"1F4E0","j":["fax","communication","technology"]},"battery":{"a":"Battery","b":"1F50B","j":["power","energy","sustain"]},"electric-plug":{"a":"Electric Plug","b":"1F50C","j":["electric","electricity","plug","charger","power"]},"laptop":{"a":"Laptop","b":"1F4BB","j":["computer","pc","personal","technology","screen","display","monitor"]},"desktop-computer":{"a":"Desktop Computer","b":"1F5A5","j":["computer","desktop","technology","computing","screen"]},"printer":{"a":"Printer","b":"1F5A8","j":["computer","paper","ink"]},"keyboard":{"a":"Keyboard","b":"2328","j":["computer","technology","type","input","text"]},"computer-mouse":{"a":"Computer Mouse","b":"1F5B1","j":["computer","click"]},"trackball":{"a":"Trackball","b":"1F5B2","j":["computer","technology","trackpad"]},"computer-disk":{"a":"Computer Disk","b":"1F4BD","j":["computer","disk","minidisk","optical","technology","record","data","90s"]},"floppy-disk":{"a":"Floppy Disk","b":"1F4BE","j":["computer","disk","floppy","oldschool","technology","save","90s","80s"]},"optical-disk":{"a":"Optical Disk","b":"1F4BF","j":["cd","computer","disk","optical","technology","dvd","disc","90s"]},"dvd":{"a":"Dvd","b":"1F4C0","j":["blu-ray","computer","disk","optical","cd","disc"]},"abacus":{"a":"Abacus","b":"1F9EE","j":["calculation"]},"movie-camera":{"a":"Movie Camera","b":"1F3A5","j":["camera","cinema","movie","film","record"]},"film-frames":{"a":"Film Frames","b":"1F39E","j":["cinema","film","frames","movie"]},"film-projector":{"a":"Film Projector","b":"1F4FD","j":["cinema","film","movie","projector","video","tape","record"]},"clapper-board":{"a":"Clapper Board","b":"1F3AC","j":["clapper","movie","film","record"]},"television":{"a":"Television","b":"1F4FA","j":["tv","video","technology","program","oldschool","show"]},"camera":{"a":"Camera","b":"1F4F7","j":["video","gadgets","photography"]},"camera-with-flash":{"a":"Camera with Flash","b":"1F4F8","j":["camera","flash","video","photography","gadgets"]},"video-camera":{"a":"Video Camera","b":"1F4F9","j":["camera","video","film","record"]},"videocassette":{"a":"Videocassette","b":"1F4FC","j":["tape","vhs","video","record","oldschool","90s","80s"]},"magnifying-glass-tilted-left":{"a":"Magnifying Glass Tilted Left","b":"1F50D","j":["glass","magnifying","search","tool","zoom","find","detective"]},"magnifying-glass-tilted-right":{"a":"Magnifying Glass Tilted Right","b":"1F50E","j":["glass","magnifying","search","tool","zoom","find","detective"]},"candle":{"a":"Candle","b":"1F56F","j":["light","fire","wax"]},"light-bulb":{"a":"Light Bulb","b":"1F4A1","j":["bulb","comic","electric","idea","light","electricity"]},"flashlight":{"a":"Flashlight","b":"1F526","j":["electric","light","tool","torch","dark","camping","sight","night"]},"red-paper-lantern":{"a":"Red Paper Lantern","b":"1F3EE","j":["bar","lantern","light","red","paper","halloween","spooky"]},"diya-lamp":{"a":"Diya Lamp","b":"1FA94","j":["diya","lamp","oil","lighting"]},"notebook-with-decorative-cover":{"a":"Notebook with Decorative Cover","b":"1F4D4","j":["book","cover","decorated","notebook","classroom","notes","record","paper","study"]},"closed-book":{"a":"Closed Book","b":"1F4D5","j":["book","closed","read","library","knowledge","textbook","learn"]},"open-book":{"a":"Open Book","b":"1F4D6","j":["book","open","read","library","knowledge","literature","learn","study"]},"green-book":{"a":"Green Book","b":"1F4D7","j":["book","green","read","library","knowledge","study"]},"blue-book":{"a":"Blue Book","b":"1F4D8","j":["blue","book","read","library","knowledge","learn","study"]},"orange-book":{"a":"Orange Book","b":"1F4D9","j":["book","orange","read","library","knowledge","textbook","study"]},"books":{"a":"Books","b":"1F4DA","j":["book","literature","library","study"]},"notebook":{"a":"Notebook","b":"1F4D3","j":["stationery","record","notes","paper","study"]},"ledger":{"a":"Ledger","b":"1F4D2","j":["notebook","notes","paper"]},"page-with-curl":{"a":"Page with Curl","b":"1F4C3","j":["curl","document","page","documents","office","paper"]},"scroll":{"a":"Scroll","b":"1F4DC","j":["paper","documents","ancient","history"]},"page-facing-up":{"a":"Page Facing Up","b":"1F4C4","j":["document","page","documents","office","paper","information"]},"newspaper":{"a":"Newspaper","b":"1F4F0","j":["news","paper","press","headline"]},"rolledup-newspaper":{"a":"Rolled-Up Newspaper","b":"1F5DE","j":["news","newspaper","paper","rolled","rolled-up newspaper","rolled_up_newspaper","press","headline"]},"bookmark-tabs":{"a":"Bookmark Tabs","b":"1F4D1","j":["bookmark","mark","marker","tabs","favorite","save","order","tidy"]},"bookmark":{"a":"Bookmark","b":"1F516","j":["mark","favorite","label","save"]},"label":{"a":"Label","b":"1F3F7","j":["sale","tag"]},"money-bag":{"a":"Money Bag","b":"1F4B0","j":["bag","dollar","money","moneybag","payment","coins","sale"]},"coin":{"a":"Coin","b":"1FA99","j":["gold","metal","money","silver","treasure","currency"]},"yen-banknote":{"a":"Yen Banknote","b":"1F4B4","j":["banknote","bill","currency","money","note","yen","sales","japanese","dollar"]},"dollar-banknote":{"a":"Dollar Banknote","b":"1F4B5","j":["banknote","bill","currency","dollar","money","note","sales"]},"euro-banknote":{"a":"Euro Banknote","b":"1F4B6","j":["banknote","bill","currency","euro","money","note","sales","dollar"]},"pound-banknote":{"a":"Pound Banknote","b":"1F4B7","j":["banknote","bill","currency","money","note","pound","british","sterling","sales","bills","uk","england"]},"money-with-wings":{"a":"Money with Wings","b":"1F4B8","j":["banknote","bill","fly","money","wings","dollar","bills","payment","sale"]},"credit-card":{"a":"Credit Card","b":"1F4B3","j":["card","credit","money","sales","dollar","bill","payment","shopping"]},"receipt":{"a":"Receipt","b":"1F9FE","j":["accounting","bookkeeping","evidence","proof","expenses"]},"chart-increasing-with-yen":{"a":"Chart Increasing with Yen","b":"1F4B9","j":["chart","graph","growth","money","yen","green-square","presentation","stats"]},"envelope":{"a":"Envelope","b":"2709","j":["email","letter","postal","inbox","communication"]},"email":{"a":"E-Mail","b":"1F4E7","j":["e-mail","letter","mail","e_mail","communication","inbox"]},"incoming-envelope":{"a":"Incoming Envelope","b":"1F4E8","j":["e-mail","email","envelope","incoming","letter","receive","inbox"]},"envelope-with-arrow":{"a":"Envelope with Arrow","b":"1F4E9","j":["arrow","e-mail","email","envelope","outgoing","communication"]},"outbox-tray":{"a":"Outbox Tray","b":"1F4E4","j":["box","letter","mail","outbox","sent","tray","inbox","email"]},"inbox-tray":{"a":"Inbox Tray","b":"1F4E5","j":["box","inbox","letter","mail","receive","tray","email","documents"]},"package":{"a":"Package","b":"1F4E6","j":["box","parcel","mail","gift","cardboard","moving"]},"closed-mailbox-with-raised-flag":{"a":"Closed Mailbox with Raised Flag","b":"1F4EB","j":["closed","mail","mailbox","postbox","email","inbox","communication"]},"closed-mailbox-with-lowered-flag":{"a":"Closed Mailbox with Lowered Flag","b":"1F4EA","j":["closed","lowered","mail","mailbox","postbox","email","communication","inbox"]},"open-mailbox-with-raised-flag":{"a":"Open Mailbox with Raised Flag","b":"1F4EC","j":["mail","mailbox","open","postbox","email","inbox","communication"]},"open-mailbox-with-lowered-flag":{"a":"Open Mailbox with Lowered Flag","b":"1F4ED","j":["lowered","mail","mailbox","open","postbox","email","inbox"]},"postbox":{"a":"Postbox","b":"1F4EE","j":["mail","mailbox","email","letter","envelope"]},"ballot-box-with-ballot":{"a":"Ballot Box with Ballot","b":"1F5F3","j":["ballot","box","election","vote"]},"pencil":{"a":"Pencil","b":"270F","j":["stationery","write","paper","writing","school","study"]},"black-nib":{"a":"Black Nib","b":"2712","j":["nib","pen","stationery","writing","write"]},"fountain-pen":{"a":"Fountain Pen","b":"1F58B","j":["fountain","pen","stationery","writing","write"]},"pen":{"a":"Pen","b":"1F58A","j":["ballpoint","stationery","writing","write"]},"paintbrush":{"a":"Paintbrush","b":"1F58C","j":["painting","drawing","creativity","art"]},"crayon":{"a":"Crayon","b":"1F58D","j":["drawing","creativity"]},"memo":{"a":"Memo","b":"1F4DD","j":["pencil","write","documents","stationery","paper","writing","legal","exam","quiz","test","study","compose"]},"briefcase":{"a":"Briefcase","b":"1F4BC","j":["business","documents","work","law","legal","job","career"]},"file-folder":{"a":"File Folder","b":"1F4C1","j":["file","folder","documents","business","office"]},"open-file-folder":{"a":"Open File Folder","b":"1F4C2","j":["file","folder","open","documents","load"]},"card-index-dividers":{"a":"Card Index Dividers","b":"1F5C2","j":["card","dividers","index","organizing","business","stationery"]},"calendar":{"a":"Calendar","b":"1F4C5","j":["date","schedule"]},"tearoff-calendar":{"a":"Tear-off Calendar","b":"1F4C6","j":["calendar","tear-off calendar","tear_off_calendar","schedule","date","planning"]},"spiral-notepad":{"a":"Spiral Notepad","b":"1F5D2","j":["note","pad","spiral","memo","stationery"]},"spiral-calendar":{"a":"Spiral Calendar","b":"1F5D3","j":["calendar","pad","spiral","date","schedule","planning"]},"card-index":{"a":"Card Index","b":"1F4C7","j":["card","index","rolodex","business","stationery"]},"chart-increasing":{"a":"Chart Increasing","b":"1F4C8","j":["chart","graph","growth","trend","upward","presentation","stats","recovery","business","economics","money","sales","good","success"]},"chart-decreasing":{"a":"Chart Decreasing","b":"1F4C9","j":["chart","down","graph","trend","presentation","stats","recession","business","economics","money","sales","bad","failure"]},"bar-chart":{"a":"Bar Chart","b":"1F4CA","j":["bar","chart","graph","presentation","stats"]},"clipboard":{"a":"Clipboard","b":"1F4CB","j":["stationery","documents"]},"pushpin":{"a":"Pushpin","b":"1F4CC","j":["pin","stationery","mark","here"]},"round-pushpin":{"a":"Round Pushpin","b":"1F4CD","j":["pin","pushpin","stationery","location","map","here"]},"paperclip":{"a":"Paperclip","b":"1F4CE","j":["documents","stationery"]},"linked-paperclips":{"a":"Linked Paperclips","b":"1F587","j":["link","paperclip","documents","stationery"]},"straight-ruler":{"a":"Straight Ruler","b":"1F4CF","j":["ruler","straight edge","stationery","calculate","length","math","school","drawing","architect","sketch"]},"triangular-ruler":{"a":"Triangular Ruler","b":"1F4D0","j":["ruler","set","triangle","stationery","math","architect","sketch"]},"scissors":{"a":"Scissors","b":"2702","j":["cutting","tool","stationery","cut"]},"card-file-box":{"a":"Card File Box","b":"1F5C3","j":["box","card","file","business","stationery"]},"file-cabinet":{"a":"File Cabinet","b":"1F5C4","j":["cabinet","file","filing","organizing"]},"wastebasket":{"a":"Wastebasket","b":"1F5D1","j":["bin","trash","rubbish","garbage","toss"]},"locked":{"a":"Locked","b":"1F512","j":["closed","security","password","padlock"]},"unlocked":{"a":"Unlocked","b":"1F513","j":["lock","open","unlock","privacy","security"]},"locked-with-pen":{"a":"Locked with Pen","b":"1F50F","j":["ink","lock","nib","pen","privacy","security","secret"]},"locked-with-key":{"a":"Locked with Key","b":"1F510","j":["closed","key","lock","secure","security","privacy"]},"key":{"a":"Key","b":"1F511","j":["lock","password","door"]},"old-key":{"a":"Old Key","b":"1F5DD","j":["clue","key","lock","old","door","password"]},"hammer":{"a":"Hammer","b":"1F528","j":["tool","tools","build","create"]},"axe":{"a":"Axe","b":"1FA93","j":["chop","hatchet","split","wood","tool","cut"]},"pick":{"a":"Pick","b":"26CF","j":["mining","tool","tools","dig"]},"hammer-and-pick":{"a":"Hammer and Pick","b":"2692","j":["hammer","pick","tool","tools","build","create"]},"hammer-and-wrench":{"a":"Hammer and Wrench","b":"1F6E0","j":["hammer","spanner","tool","wrench","tools","build","create"]},"dagger":{"a":"Dagger","b":"1F5E1","j":["knife","weapon"]},"crossed-swords":{"a":"Crossed Swords","b":"2694","j":["crossed","swords","weapon"]},"water-pistol":{"a":"Water Pistol","b":"1F52B","j":["gun","handgun","pistol","revolver","tool","water","weapon","violence"]},"boomerang":{"a":"Boomerang","b":"1FA83","j":["australia","rebound","repercussion","weapon"]},"bow-and-arrow":{"a":"Bow and Arrow","b":"1F3F9","j":["archer","arrow","bow","Sagittarius","zodiac","sports"]},"shield":{"a":"Shield","b":"1F6E1","j":["weapon","protection","security"]},"carpentry-saw":{"a":"Carpentry Saw","b":"1FA9A","j":["carpenter","lumber","saw","tool","cut","chop"]},"wrench":{"a":"Wrench","b":"1F527","j":["spanner","tool","tools","diy","ikea","fix","maintainer"]},"screwdriver":{"a":"Screwdriver","b":"1FA9B","j":["screw","tool","tools"]},"nut-and-bolt":{"a":"Nut and Bolt","b":"1F529","j":["bolt","nut","tool","handy","tools","fix"]},"gear":{"a":"Gear","b":"2699","j":["cog","cogwheel","tool"]},"clamp":{"a":"Clamp","b":"1F5DC","j":["compress","tool","vice"]},"balance-scale":{"a":"Balance Scale","b":"2696","j":["balance","justice","Libra","scale","zodiac","law","fairness","weight"]},"white-cane":{"a":"White Cane","b":"1F9AF","j":["accessibility","blind","probing_cane"]},"link":{"a":"Link","b":"1F517","j":["rings","url"]},"chains":{"a":"Chains","b":"26D3","j":["chain","lock","arrest"]},"hook":{"a":"Hook","b":"1FA9D","j":["catch","crook","curve","ensnare","selling point","tools"]},"toolbox":{"a":"Toolbox","b":"1F9F0","j":["chest","mechanic","tool","tools","diy","fix","maintainer"]},"magnet":{"a":"Magnet","b":"1F9F2","j":["attraction","horseshoe","magnetic"]},"ladder":{"a":"Ladder","b":"1FA9C","j":["climb","rung","step","tools"]},"alembic":{"a":"Alembic","b":"2697","j":["chemistry","tool","distilling","science","experiment"]},"test-tube":{"a":"Test Tube","b":"1F9EA","j":["chemist","chemistry","experiment","lab","science"]},"petri-dish":{"a":"Petri Dish","b":"1F9EB","j":["bacteria","biologist","biology","culture","lab"]},"dna":{"a":"Dna","b":"1F9EC","j":["biologist","evolution","gene","genetics","life"]},"microscope":{"a":"Microscope","b":"1F52C","j":["science","tool","laboratory","experiment","zoomin","study"]},"telescope":{"a":"Telescope","b":"1F52D","j":["science","tool","stars","space","zoom","astronomy"]},"satellite-antenna":{"a":"Satellite Antenna","b":"1F4E1","j":["antenna","dish","satellite","communication","future","radio","space"]},"syringe":{"a":"Syringe","b":"1F489","j":["medicine","needle","shot","sick","health","hospital","drugs","blood","doctor","nurse"]},"drop-of-blood":{"a":"Drop of Blood","b":"1FA78","j":["bleed","blood donation","injury","medicine","menstruation","period","hurt","harm","wound"]},"pill":{"a":"Pill","b":"1F48A","j":["doctor","medicine","sick","health","pharmacy","drug"]},"adhesive-bandage":{"a":"Adhesive Bandage","b":"1FA79","j":["bandage","heal"]},"stethoscope":{"a":"Stethoscope","b":"1FA7A","j":["doctor","heart","medicine","health"]},"door":{"a":"Door","b":"1F6AA","j":["house","entry","exit"]},"elevator":{"a":"Elevator","b":"1F6D7","j":["accessibility","hoist","lift"]},"mirror":{"a":"Mirror","b":"1FA9E","j":["reflection","reflector","speculum"]},"window":{"a":"Window","b":"1FA9F","j":["frame","fresh air","opening","transparent","view","scenery"]},"bed":{"a":"Bed","b":"1F6CF","j":["hotel","sleep","rest"]},"couch-and-lamp":{"a":"Couch and Lamp","b":"1F6CB","j":["couch","hotel","lamp","read","chill"]},"chair":{"a":"Chair","b":"1FA91","j":["seat","sit","furniture"]},"toilet":{"a":"Toilet","b":"1F6BD","j":["restroom","wc","washroom","bathroom","potty"]},"plunger":{"a":"Plunger","b":"1FAA0","j":["force cup","plumber","suction","toilet"]},"shower":{"a":"Shower","b":"1F6BF","j":["water","clean","bathroom"]},"bathtub":{"a":"Bathtub","b":"1F6C1","j":["bath","clean","shower","bathroom"]},"mouse-trap":{"a":"Mouse Trap","b":"1FAA4","j":["bait","mousetrap","snare","trap","cheese"]},"razor":{"a":"Razor","b":"1FA92","j":["sharp","shave","cut"]},"lotion-bottle":{"a":"Lotion Bottle","b":"1F9F4","j":["lotion","moisturizer","shampoo","sunscreen"]},"safety-pin":{"a":"Safety Pin","b":"1F9F7","j":["diaper","punk rock"]},"broom":{"a":"Broom","b":"1F9F9","j":["cleaning","sweeping","witch"]},"basket":{"a":"Basket","b":"1F9FA","j":["farming","laundry","picnic"]},"roll-of-paper":{"a":"Roll of Paper","b":"1F9FB","j":["paper towels","toilet paper","roll"]},"bucket":{"a":"Bucket","b":"1FAA3","j":["cask","pail","vat","water","container"]},"soap":{"a":"Soap","b":"1F9FC","j":["bar","bathing","cleaning","lather","soapdish"]},"toothbrush":{"a":"Toothbrush","b":"1FAA5","j":["bathroom","brush","clean","dental","hygiene","teeth"]},"sponge":{"a":"Sponge","b":"1F9FD","j":["absorbing","cleaning","porous"]},"fire-extinguisher":{"a":"Fire Extinguisher","b":"1F9EF","j":["extinguish","fire","quench"]},"shopping-cart":{"a":"Shopping Cart","b":"1F6D2","j":["cart","shopping","trolley"]},"cigarette":{"a":"Cigarette","b":"1F6AC","j":["smoking","kills","tobacco","joint","smoke"]},"coffin":{"a":"Coffin","b":"26B0","j":["death","vampire","dead","die","rip","graveyard","cemetery","casket","funeral","box"]},"headstone":{"a":"Headstone","b":"1FAA6","j":["cemetery","grave","graveyard","tombstone","death","rip"]},"funeral-urn":{"a":"Funeral Urn","b":"26B1","j":["ashes","death","funeral","urn","dead","die","rip"]},"moai":{"a":"Moai","b":"1F5FF","j":["face","moyai","statue","rock","easter island"]},"placard":{"a":"Placard","b":"1FAA7","j":["demonstration","picket","protest","sign","announcement"]},"atm-sign":{"a":"Atm Sign","b":"1F3E7","j":["atm","ATM sign","automated","bank","teller","money","sales","cash","blue-square","payment"]},"litter-in-bin-sign":{"a":"Litter in Bin Sign","b":"1F6AE","j":["litter","litter bin","blue-square","sign","human","info"]},"potable-water":{"a":"Potable Water","b":"1F6B0","j":["drinking","potable","water","blue-square","liquid","restroom","cleaning","faucet"]},"wheelchair-symbol":{"a":"Wheelchair Symbol","b":"267F","j":["access","blue-square","disabled","accessibility"]},"mens-room":{"a":"Men’S Room","b":"1F6B9","j":["lavatory","man","men’s room","restroom","wc","men_s_room","toilet","blue-square","gender","male"]},"womens-room":{"a":"Women’S Room","b":"1F6BA","j":["lavatory","restroom","wc","woman","women’s room","women_s_room","purple-square","female","toilet","loo","gender"]},"restroom":{"a":"Restroom","b":"1F6BB","j":["lavatory","WC","blue-square","toilet","refresh","wc","gender"]},"baby-symbol":{"a":"Baby Symbol","b":"1F6BC","j":["baby","changing","orange-square","child"]},"water-closet":{"a":"Water Closet","b":"1F6BE","j":["closet","lavatory","restroom","water","wc","toilet","blue-square"]},"passport-control":{"a":"Passport Control","b":"1F6C2","j":["control","passport","custom","blue-square"]},"customs":{"a":"Customs","b":"1F6C3","j":["passport","border","blue-square"]},"baggage-claim":{"a":"Baggage Claim","b":"1F6C4","j":["baggage","claim","blue-square","airport","transport"]},"left-luggage":{"a":"Left Luggage","b":"1F6C5","j":["baggage","locker","luggage","blue-square","travel"]},"warning":{"a":"Warning","b":"26A0","j":["exclamation","wip","alert","error","problem","issue"]},"children-crossing":{"a":"Children Crossing","b":"1F6B8","j":["child","crossing","pedestrian","traffic","school","warning","danger","sign","driving","yellow-diamond"]},"no-entry":{"a":"No Entry","b":"26D4","j":["entry","forbidden","no","not","prohibited","traffic","limit","security","privacy","bad","denied","stop","circle"]},"prohibited":{"a":"Prohibited","b":"1F6AB","j":["entry","forbidden","no","not","forbid","stop","limit","denied","disallow","circle"]},"no-bicycles":{"a":"No Bicycles","b":"1F6B3","j":["bicycle","bike","forbidden","no","prohibited","cyclist","circle"]},"no-smoking":{"a":"No Smoking","b":"1F6AD","j":["forbidden","no","not","prohibited","smoking","cigarette","blue-square","smell","smoke"]},"no-littering":{"a":"No Littering","b":"1F6AF","j":["forbidden","litter","no","not","prohibited","trash","bin","garbage","circle"]},"nonpotable-water":{"a":"Non-Potable Water","b":"1F6B1","j":["non-drinking","non-potable","water","non_potable_water","drink","faucet","tap","circle"]},"no-pedestrians":{"a":"No Pedestrians","b":"1F6B7","j":["forbidden","no","not","pedestrian","prohibited","rules","crossing","walking","circle"]},"no-mobile-phones":{"a":"No Mobile Phones","b":"1F4F5","j":["cell","forbidden","mobile","no","phone","iphone","mute","circle"]},"no-one-under-eighteen":{"a":"No One Under Eighteen","b":"1F51E","j":["18","age restriction","eighteen","prohibited","underage","drink","pub","night","minor","circle"]},"radioactive":{"a":"Radioactive","b":"2622","j":["sign","nuclear","danger"]},"biohazard":{"a":"Biohazard","b":"2623","j":["sign","danger"]},"up-arrow":{"a":"Up Arrow","b":"2B06","j":["arrow","cardinal","direction","north","blue-square","continue","top"]},"upright-arrow":{"a":"Up-Right Arrow","b":"2197","j":["arrow","direction","intercardinal","northeast","up-right arrow","up_right_arrow","blue-square","point","diagonal"]},"right-arrow":{"a":"Right Arrow","b":"27A1","j":["arrow","cardinal","direction","east","blue-square","next"]},"downright-arrow":{"a":"Down-Right Arrow","b":"2198","j":["arrow","direction","down-right arrow","intercardinal","southeast","down_right_arrow","blue-square","diagonal"]},"down-arrow":{"a":"Down Arrow","b":"2B07","j":["arrow","cardinal","direction","down","south","blue-square","bottom"]},"downleft-arrow":{"a":"Down-Left Arrow","b":"2199","j":["arrow","direction","down-left arrow","intercardinal","southwest","down_left_arrow","blue-square","diagonal"]},"left-arrow":{"a":"Left Arrow","b":"2B05","j":["arrow","cardinal","direction","west","blue-square","previous","back"]},"upleft-arrow":{"a":"Up-Left Arrow","b":"2196","j":["arrow","direction","intercardinal","northwest","up-left arrow","up_left_arrow","blue-square","point","diagonal"]},"updown-arrow":{"a":"Up-Down Arrow","b":"2195","j":["arrow","up-down arrow","up_down_arrow","blue-square","direction","way","vertical"]},"leftright-arrow":{"a":"Left-Right Arrow","b":"2194","j":["arrow","left-right arrow","left_right_arrow","shape","direction","horizontal","sideways"]},"right-arrow-curving-left":{"a":"Right Arrow Curving Left","b":"21A9","j":["arrow","back","return","blue-square","undo","enter"]},"left-arrow-curving-right":{"a":"Left Arrow Curving Right","b":"21AA","j":["arrow","blue-square","return","rotate","direction"]},"right-arrow-curving-up":{"a":"Right Arrow Curving Up","b":"2934","j":["arrow","blue-square","direction","top"]},"right-arrow-curving-down":{"a":"Right Arrow Curving Down","b":"2935","j":["arrow","down","blue-square","direction","bottom"]},"clockwise-vertical-arrows":{"a":"Clockwise Vertical Arrows","b":"1F503","j":["arrow","clockwise","reload","sync","cycle","round","repeat"]},"counterclockwise-arrows-button":{"a":"Counterclockwise Arrows Button","b":"1F504","j":["anticlockwise","arrow","counterclockwise","withershins","blue-square","sync","cycle"]},"back-arrow":{"a":"Back Arrow","b":"1F519","j":["arrow","back","BACK arrow","words","return"]},"end-arrow":{"a":"End Arrow","b":"1F51A","j":["arrow","end","END arrow","words"]},"on-arrow":{"a":"On! Arrow","b":"1F51B","j":["arrow","mark","on","ON! arrow","words"]},"soon-arrow":{"a":"Soon Arrow","b":"1F51C","j":["arrow","soon","SOON arrow","words"]},"top-arrow":{"a":"Top Arrow","b":"1F51D","j":["arrow","top","TOP arrow","up","words","blue-square"]},"place-of-worship":{"a":"Place of Worship","b":"1F6D0","j":["religion","worship","church","temple","prayer"]},"atom-symbol":{"a":"Atom Symbol","b":"269B","j":["atheist","atom","science","physics","chemistry"]},"om":{"a":"Om","b":"1F549","j":["Hindu","religion","hinduism","buddhism","sikhism","jainism"]},"star-of-david":{"a":"Star of David","b":"2721","j":["David","Jew","Jewish","religion","star","star of David","judaism"]},"wheel-of-dharma":{"a":"Wheel of Dharma","b":"2638","j":["Buddhist","dharma","religion","wheel","hinduism","buddhism","sikhism","jainism"]},"yin-yang":{"a":"Yin Yang","b":"262F","j":["religion","tao","taoist","yang","yin","balance"]},"latin-cross":{"a":"Latin Cross","b":"271D","j":["Christian","cross","religion","christianity"]},"orthodox-cross":{"a":"Orthodox Cross","b":"2626","j":["Christian","cross","religion","suppedaneum"]},"star-and-crescent":{"a":"Star and Crescent","b":"262A","j":["islam","Muslim","religion"]},"peace-symbol":{"a":"Peace Symbol","b":"262E","j":["peace","hippie"]},"menorah":{"a":"Menorah","b":"1F54E","j":["candelabrum","candlestick","religion","hanukkah","candles","jewish"]},"dotted-sixpointed-star":{"a":"Dotted Six-Pointed Star","b":"1F52F","j":["dotted six-pointed star","fortune","star","dotted_six_pointed_star","purple-square","religion","jewish","hexagram"]},"aries":{"a":"Aries","b":"2648","j":["ram","zodiac","sign","purple-square","astrology"]},"taurus":{"a":"Taurus","b":"2649","j":["bull","ox","zodiac","purple-square","sign","astrology"]},"gemini":{"a":"Gemini","b":"264A","j":["twins","zodiac","sign","purple-square","astrology"]},"cancer":{"a":"Cancer","b":"264B","j":["crab","zodiac","sign","purple-square","astrology"]},"leo":{"a":"Leo","b":"264C","j":["lion","zodiac","sign","purple-square","astrology"]},"virgo":{"a":"Virgo","b":"264D","j":["zodiac","sign","purple-square","astrology"]},"libra":{"a":"Libra","b":"264E","j":["balance","justice","scales","zodiac","sign","purple-square","astrology"]},"scorpio":{"a":"Scorpio","b":"264F","j":["scorpion","scorpius","zodiac","sign","purple-square","astrology"]},"sagittarius":{"a":"Sagittarius","b":"2650","j":["archer","zodiac","sign","purple-square","astrology"]},"capricorn":{"a":"Capricorn","b":"2651","j":["goat","zodiac","sign","purple-square","astrology"]},"aquarius":{"a":"Aquarius","b":"2652","j":["bearer","water","zodiac","sign","purple-square","astrology"]},"pisces":{"a":"Pisces","b":"2653","j":["fish","zodiac","purple-square","sign","astrology"]},"ophiuchus":{"a":"Ophiuchus","b":"26CE","j":["bearer","serpent","snake","zodiac","sign","purple-square","constellation","astrology"]},"shuffle-tracks-button":{"a":"Shuffle Tracks Button","b":"1F500","j":["arrow","crossed","blue-square","shuffle","music","random"]},"repeat-button":{"a":"Repeat Button","b":"1F501","j":["arrow","clockwise","repeat","loop","record"]},"repeat-single-button":{"a":"Repeat Single Button","b":"1F502","j":["arrow","clockwise","once","blue-square","loop"]},"play-button":{"a":"Play Button","b":"25B6","j":["arrow","play","right","triangle","blue-square","direction"]},"fastforward-button":{"a":"Fast-Forward Button","b":"23E9","j":["arrow","double","fast","fast-forward button","forward","fast_forward_button","blue-square","play","speed","continue"]},"next-track-button":{"a":"Next Track Button","b":"23ED","j":["arrow","next scene","next track","triangle","forward","next","blue-square"]},"play-or-pause-button":{"a":"Play or Pause Button","b":"23EF","j":["arrow","pause","play","right","triangle","blue-square"]},"reverse-button":{"a":"Reverse Button","b":"25C0","j":["arrow","left","reverse","triangle","blue-square","direction"]},"fast-reverse-button":{"a":"Fast Reverse Button","b":"23EA","j":["arrow","double","rewind","play","blue-square"]},"last-track-button":{"a":"Last Track Button","b":"23EE","j":["arrow","previous scene","previous track","triangle","backward"]},"upwards-button":{"a":"Upwards Button","b":"1F53C","j":["arrow","button","red","blue-square","triangle","direction","point","forward","top"]},"fast-up-button":{"a":"Fast Up Button","b":"23EB","j":["arrow","double","blue-square","direction","top"]},"downwards-button":{"a":"Downwards Button","b":"1F53D","j":["arrow","button","down","red","blue-square","direction","bottom"]},"fast-down-button":{"a":"Fast Down Button","b":"23EC","j":["arrow","double","down","blue-square","direction","bottom"]},"pause-button":{"a":"Pause Button","b":"23F8","j":["bar","double","pause","vertical","blue-square"]},"stop-button":{"a":"Stop Button","b":"23F9","j":["square","stop","blue-square"]},"record-button":{"a":"Record Button","b":"23FA","j":["circle","record","blue-square"]},"eject-button":{"a":"Eject Button","b":"23CF","j":["eject","blue-square"]},"cinema":{"a":"Cinema","b":"1F3A6","j":["camera","film","movie","blue-square","record","curtain","stage","theater"]},"dim-button":{"a":"Dim Button","b":"1F505","j":["brightness","dim","low","sun","afternoon","warm","summer"]},"bright-button":{"a":"Bright Button","b":"1F506","j":["bright","brightness","sun","light"]},"antenna-bars":{"a":"Antenna Bars","b":"1F4F6","j":["antenna","bar","cell","mobile","phone","blue-square","reception","internet","connection","wifi","bluetooth","bars"]},"vibration-mode":{"a":"Vibration Mode","b":"1F4F3","j":["cell","mobile","mode","phone","telephone","vibration","orange-square"]},"mobile-phone-off":{"a":"Mobile Phone off","b":"1F4F4","j":["cell","mobile","off","phone","telephone","mute","orange-square","silence","quiet"]},"female-sign":{"a":"Female Sign","b":"2640","j":["woman","women","lady","girl"]},"male-sign":{"a":"Male Sign","b":"2642","j":["man","boy","men"]},"transgender-symbol":{"a":"Transgender Symbol","b":"26A7","j":["transgender","lgbtq"]},"multiply":{"a":"Multiply","b":"2716","j":["×","cancel","multiplication","sign","x","multiplication_sign","math","calculation"]},"plus":{"a":"Plus","b":"2795","j":["+","math","sign","plus_sign","calculation","addition","more","increase"]},"minus":{"a":"Minus","b":"2796","j":["-","−","math","sign","minus_sign","calculation","subtract","less"]},"divide":{"a":"Divide","b":"2797","j":["÷","division","math","sign","division_sign","calculation"]},"infinity":{"a":"Infinity","b":"267E","j":["forever","unbounded","universal"]},"double-exclamation-mark":{"a":"Double Exclamation Mark","b":"203C","j":["!","!!","bangbang","exclamation","mark","surprise"]},"exclamation-question-mark":{"a":"Exclamation Question Mark","b":"2049","j":["!","!?","?","exclamation","interrobang","mark","punctuation","question","wat","surprise"]},"red-question-mark":{"a":"Red Question Mark","b":"2753","j":["?","mark","punctuation","question","question_mark","doubt","confused"]},"white-question-mark":{"a":"White Question Mark","b":"2754","j":["?","mark","outlined","punctuation","question","doubts","gray","huh","confused"]},"white-exclamation-mark":{"a":"White Exclamation Mark","b":"2755","j":["!","exclamation","mark","outlined","punctuation","surprise","gray","wow","warning"]},"red-exclamation-mark":{"a":"Red Exclamation Mark","b":"2757","j":["!","exclamation","mark","punctuation","exclamation_mark","heavy_exclamation_mark","danger","surprise","wow","warning"]},"wavy-dash":{"a":"Wavy Dash","b":"3030","j":["dash","punctuation","wavy","draw","line","moustache","mustache","squiggle","scribble"]},"currency-exchange":{"a":"Currency Exchange","b":"1F4B1","j":["bank","currency","exchange","money","sales","dollar","travel"]},"heavy-dollar-sign":{"a":"Heavy Dollar Sign","b":"1F4B2","j":["currency","dollar","money","sales","payment","buck"]},"medical-symbol":{"a":"Medical Symbol","b":"2695","j":["aesculapius","medicine","staff","health","hospital"]},"recycling-symbol":{"a":"Recycling Symbol","b":"267B","j":["recycle","arrow","environment","garbage","trash"]},"fleurdelis":{"a":"Fleur-De-Lis","b":"269C","j":["fleur-de-lis","fleur_de_lis","decorative","scout"]},"trident-emblem":{"a":"Trident Emblem","b":"1F531","j":["anchor","emblem","ship","tool","trident","weapon","spear"]},"name-badge":{"a":"Name Badge","b":"1F4DB","j":["badge","name","fire","forbid"]},"japanese-symbol-for-beginner":{"a":"Japanese Symbol for Beginner","b":"1F530","j":["beginner","chevron","Japanese","Japanese symbol for beginner","leaf","badge","shield"]},"hollow-red-circle":{"a":"Hollow Red Circle","b":"2B55","j":["circle","large","o","red","round"]},"check-mark-button":{"a":"Check Mark Button","b":"2705","j":["✓","button","check","mark","green-square","ok","agree","vote","election","answer","tick"]},"check-box-with-check":{"a":"Check Box with Check","b":"2611","j":["✓","box","check","ok","agree","confirm","black-square","vote","election","yes","tick"]},"check-mark":{"a":"Check Mark","b":"2714","j":["✓","check","mark","ok","nike","answer","yes","tick"]},"cross-mark":{"a":"Cross Mark","b":"274C","j":["×","cancel","cross","mark","multiplication","multiply","x","no","delete","remove","red"]},"cross-mark-button":{"a":"Cross Mark Button","b":"274E","j":["×","mark","square","x","green-square","no","deny"]},"curly-loop":{"a":"Curly Loop","b":"27B0","j":["curl","loop","scribble","draw","shape","squiggle"]},"double-curly-loop":{"a":"Double Curly Loop","b":"27BF","j":["curl","double","loop","tape","cassette"]},"part-alternation-mark":{"a":"Part Alternation Mark","b":"303D","j":["mark","part","graph","presentation","stats","business","economics","bad"]},"eightspoked-asterisk":{"a":"Eight-Spoked Asterisk","b":"2733","j":["*","asterisk","eight-spoked asterisk","eight_spoked_asterisk","star","sparkle","green-square"]},"eightpointed-star":{"a":"Eight-Pointed Star","b":"2734","j":["*","eight-pointed star","star","eight_pointed_star","orange-square","shape","polygon"]},"sparkle":{"a":"Sparkle","b":"2747","j":["*","stars","green-square","awesome","good","fireworks"]},"copyright":{"a":"Copyright","b":"00A9","j":["c","ip","license","circle","law","legal"]},"registered":{"a":"Registered","b":"00AE","j":["r","alphabet","circle"]},"trade-mark":{"a":"Trade Mark","b":"2122","j":["mark","tm","trademark","brand","law","legal"]},"keycap":{"a":"Keycap: *","b":"002A-FE0F-20E3","j":["keycap_","star"]},"keycap-0":{"a":"Keycap: 0","b":"0030-FE0F-20E3","j":["keycap","0","numbers","blue-square","null"]},"keycap-1":{"a":"Keycap: 1","b":"0031-FE0F-20E3","j":["keycap","blue-square","numbers","1"]},"keycap-2":{"a":"Keycap: 2","b":"0032-FE0F-20E3","j":["keycap","numbers","2","prime","blue-square"]},"keycap-3":{"a":"Keycap: 3","b":"0033-FE0F-20E3","j":["keycap","3","numbers","prime","blue-square"]},"keycap-4":{"a":"Keycap: 4","b":"0034-FE0F-20E3","j":["keycap","4","numbers","blue-square"]},"keycap-5":{"a":"Keycap: 5","b":"0035-FE0F-20E3","j":["keycap","5","numbers","blue-square","prime"]},"keycap-6":{"a":"Keycap: 6","b":"0036-FE0F-20E3","j":["keycap","6","numbers","blue-square"]},"keycap-7":{"a":"Keycap: 7","b":"0037-FE0F-20E3","j":["keycap","7","numbers","blue-square","prime"]},"keycap-8":{"a":"Keycap: 8","b":"0038-FE0F-20E3","j":["keycap","8","blue-square","numbers"]},"keycap-9":{"a":"Keycap: 9","b":"0039-FE0F-20E3","j":["keycap","blue-square","numbers","9"]},"keycap-10":{"a":"Keycap: 10","b":"1F51F","j":["keycap","numbers","10","blue-square"]},"input-latin-uppercase":{"a":"Input Latin Uppercase","b":"1F520","j":["ABCD","input","latin","letters","uppercase","alphabet","words","blue-square"]},"input-latin-lowercase":{"a":"Input Latin Lowercase","b":"1F521","j":["abcd","input","latin","letters","lowercase","blue-square","alphabet"]},"input-numbers":{"a":"Input Numbers","b":"1F522","j":["1234","input","numbers","blue-square"]},"input-symbols":{"a":"Input Symbols","b":"1F523","j":["〒♪&%","input","blue-square","music","note","ampersand","percent","glyphs","characters"]},"input-latin-letters":{"a":"Input Latin Letters","b":"1F524","j":["abc","alphabet","input","latin","letters","blue-square"]},"a-button-blood-type":{"a":"A Button (Blood Type)","b":"1F170","j":["a","A button (blood type)","blood type","a_button","red-square","alphabet","letter"]},"ab-button-blood-type":{"a":"Ab Button (Blood Type)","b":"1F18E","j":["ab","AB button (blood type)","blood type","ab_button","red-square","alphabet"]},"b-button-blood-type":{"a":"B Button (Blood Type)","b":"1F171","j":["b","B button (blood type)","blood type","b_button","red-square","alphabet","letter"]},"cl-button":{"a":"Cl Button","b":"1F191","j":["cl","CL button","alphabet","words","red-square"]},"cool-button":{"a":"Cool Button","b":"1F192","j":["cool","COOL button","words","blue-square"]},"free-button":{"a":"Free Button","b":"1F193","j":["free","FREE button","blue-square","words"]},"information":{"a":"Information","b":"2139","j":["i","blue-square","alphabet","letter"]},"id-button":{"a":"Id Button","b":"1F194","j":["id","ID button","identity","purple-square","words"]},"circled-m":{"a":"Circled M","b":"24C2","j":["circle","circled M","m","alphabet","blue-circle","letter"]},"new-button":{"a":"New Button","b":"1F195","j":["new","NEW button","blue-square","words","start"]},"ng-button":{"a":"Ng Button","b":"1F196","j":["ng","NG button","blue-square","words","shape","icon"]},"o-button-blood-type":{"a":"O Button (Blood Type)","b":"1F17E","j":["blood type","o","O button (blood type)","o_button","alphabet","red-square","letter"]},"ok-button":{"a":"Ok Button","b":"1F197","j":["OK","OK button","good","agree","yes","blue-square"]},"p-button":{"a":"P Button","b":"1F17F","j":["P button","parking","cars","blue-square","alphabet","letter"]},"sos-button":{"a":"Sos Button","b":"1F198","j":["help","sos","SOS button","red-square","words","emergency","911"]},"up-button":{"a":"Up! Button","b":"1F199","j":["mark","up","UP! button","blue-square","above","high"]},"vs-button":{"a":"Vs Button","b":"1F19A","j":["versus","vs","VS button","words","orange-square"]},"japanese-here-button":{"a":"Japanese “Here” Button","b":"1F201","j":["“here”","Japanese","Japanese “here” button","katakana","ココ","blue-square","here","japanese","destination"]},"japanese-service-charge-button":{"a":"Japanese “Service Charge” Button","b":"1F202","j":["“service charge”","Japanese","Japanese “service charge” button","katakana","サ","japanese","blue-square"]},"japanese-monthly-amount-button":{"a":"Japanese “Monthly Amount” Button","b":"1F237","j":["“monthly amount”","ideograph","Japanese","Japanese “monthly amount” button","月","chinese","month","moon","japanese","orange-square","kanji"]},"japanese-not-free-of-charge-button":{"a":"Japanese “Not Free of Charge” Button","b":"1F236","j":["“not free of charge”","ideograph","Japanese","Japanese “not free of charge” button","有","orange-square","chinese","have","kanji"]},"japanese-reserved-button":{"a":"Japanese “Reserved” Button","b":"1F22F","j":["“reserved”","ideograph","Japanese","Japanese “reserved” button","指","chinese","point","green-square","kanji"]},"japanese-bargain-button":{"a":"Japanese “Bargain” Button","b":"1F250","j":["“bargain”","ideograph","Japanese","Japanese “bargain” button","得","chinese","kanji","obtain","get","circle"]},"japanese-discount-button":{"a":"Japanese “Discount” Button","b":"1F239","j":["“discount”","ideograph","Japanese","Japanese “discount” button","割","cut","divide","chinese","kanji","pink-square"]},"japanese-free-of-charge-button":{"a":"Japanese “Free of Charge” Button","b":"1F21A","j":["“free of charge”","ideograph","Japanese","Japanese “free of charge” button","無","nothing","chinese","kanji","japanese","orange-square"]},"japanese-prohibited-button":{"a":"Japanese “Prohibited” Button","b":"1F232","j":["“prohibited”","ideograph","Japanese","Japanese “prohibited” button","禁","kanji","japanese","chinese","forbidden","limit","restricted","red-square"]},"japanese-acceptable-button":{"a":"Japanese “Acceptable” Button","b":"1F251","j":["“acceptable”","ideograph","Japanese","Japanese “acceptable” button","可","ok","good","chinese","kanji","agree","yes","orange-circle"]},"japanese-application-button":{"a":"Japanese “Application” Button","b":"1F238","j":["“application”","ideograph","Japanese","Japanese “application” button","申","chinese","japanese","kanji","orange-square"]},"japanese-passing-grade-button":{"a":"Japanese “Passing Grade” Button","b":"1F234","j":["“passing grade”","ideograph","Japanese","Japanese “passing grade” button","合","japanese","chinese","join","kanji","red-square"]},"japanese-vacancy-button":{"a":"Japanese “Vacancy” Button","b":"1F233","j":["“vacancy”","ideograph","Japanese","Japanese “vacancy” button","空","kanji","japanese","chinese","empty","sky","blue-square"]},"japanese-congratulations-button":{"a":"Japanese “Congratulations” Button","b":"3297","j":["“congratulations”","ideograph","Japanese","Japanese “congratulations” button","祝","chinese","kanji","japanese","red-circle"]},"japanese-secret-button":{"a":"Japanese “Secret” Button","b":"3299","j":["“secret”","ideograph","Japanese","Japanese “secret” button","秘","privacy","chinese","sshh","kanji","red-circle"]},"japanese-open-for-business-button":{"a":"Japanese “Open for Business” Button","b":"1F23A","j":["“open for business”","ideograph","Japanese","Japanese “open for business” button","営","japanese","opening hours","orange-square"]},"japanese-no-vacancy-button":{"a":"Japanese “No Vacancy” Button","b":"1F235","j":["“no vacancy”","ideograph","Japanese","Japanese “no vacancy” button","満","full","chinese","japanese","red-square","kanji"]},"red-circle":{"a":"Red Circle","b":"1F534","j":["circle","geometric","red","shape","error","danger"]},"orange-circle":{"a":"Orange Circle","b":"1F7E0","j":["circle","orange","round"]},"yellow-circle":{"a":"Yellow Circle","b":"1F7E1","j":["circle","yellow","round"]},"green-circle":{"a":"Green Circle","b":"1F7E2","j":["circle","green","round"]},"blue-circle":{"a":"Blue Circle","b":"1F535","j":["blue","circle","geometric","shape","icon","button"]},"purple-circle":{"a":"Purple Circle","b":"1F7E3","j":["circle","purple","round"]},"brown-circle":{"a":"Brown Circle","b":"1F7E4","j":["brown","circle","round"]},"black-circle":{"a":"Black Circle","b":"26AB","j":["circle","geometric","shape","button","round"]},"white-circle":{"a":"White Circle","b":"26AA","j":["circle","geometric","shape","round"]},"red-square":{"a":"Red Square","b":"1F7E5","j":["red","square"]},"orange-square":{"a":"Orange Square","b":"1F7E7","j":["orange","square"]},"yellow-square":{"a":"Yellow Square","b":"1F7E8","j":["square","yellow"]},"green-square":{"a":"Green Square","b":"1F7E9","j":["green","square"]},"blue-square":{"a":"Blue Square","b":"1F7E6","j":["blue","square"]},"purple-square":{"a":"Purple Square","b":"1F7EA","j":["purple","square"]},"brown-square":{"a":"Brown Square","b":"1F7EB","j":["brown","square"]},"black-large-square":{"a":"Black Large Square","b":"2B1B","j":["geometric","square","shape","icon","button"]},"white-large-square":{"a":"White Large Square","b":"2B1C","j":["geometric","square","shape","icon","stone","button"]},"black-medium-square":{"a":"Black Medium Square","b":"25FC","j":["geometric","square","shape","button","icon"]},"white-medium-square":{"a":"White Medium Square","b":"25FB","j":["geometric","square","shape","stone","icon"]},"black-mediumsmall-square":{"a":"Black Medium-Small Square","b":"25FE","j":["black medium-small square","geometric","square","black_medium_small_square","icon","shape","button"]},"white-mediumsmall-square":{"a":"White Medium-Small Square","b":"25FD","j":["geometric","square","white medium-small square","white_medium_small_square","shape","stone","icon","button"]},"black-small-square":{"a":"Black Small Square","b":"25AA","j":["geometric","square","shape","icon"]},"white-small-square":{"a":"White Small Square","b":"25AB","j":["geometric","square","shape","icon"]},"large-orange-diamond":{"a":"Large Orange Diamond","b":"1F536","j":["diamond","geometric","orange","shape","jewel","gem"]},"large-blue-diamond":{"a":"Large Blue Diamond","b":"1F537","j":["blue","diamond","geometric","shape","jewel","gem"]},"small-orange-diamond":{"a":"Small Orange Diamond","b":"1F538","j":["diamond","geometric","orange","shape","jewel","gem"]},"small-blue-diamond":{"a":"Small Blue Diamond","b":"1F539","j":["blue","diamond","geometric","shape","jewel","gem"]},"red-triangle-pointed-up":{"a":"Red Triangle Pointed Up","b":"1F53A","j":["geometric","red","shape","direction","up","top"]},"red-triangle-pointed-down":{"a":"Red Triangle Pointed Down","b":"1F53B","j":["down","geometric","red","shape","direction","bottom"]},"diamond-with-a-dot":{"a":"Diamond with a Dot","b":"1F4A0","j":["comic","diamond","geometric","inside","jewel","blue","gem","crystal","fancy"]},"radio-button":{"a":"Radio Button","b":"1F518","j":["button","geometric","radio","input","old","music","circle"]},"white-square-button":{"a":"White Square Button","b":"1F533","j":["button","geometric","outlined","square","shape","input"]},"black-square-button":{"a":"Black Square Button","b":"1F532","j":["button","geometric","square","shape","input","frame"]},"chequered-flag":{"a":"Chequered Flag","b":"1F3C1","j":["checkered","chequered","racing","contest","finishline","race","gokart"]},"triangular-flag":{"a":"Triangular Flag","b":"1F6A9","j":["post","mark","milestone","place"]},"crossed-flags":{"a":"Crossed Flags","b":"1F38C","j":["celebration","cross","crossed","Japanese","japanese","nation","country","border"]},"black-flag":{"a":"Black Flag","b":"1F3F4","j":["waving","pirate"]},"white-flag":{"a":"White Flag","b":"1F3F3","j":["waving","losing","loser","lost","surrender","give up","fail"]},"rainbow-flag":{"a":"Rainbow Flag","b":"1F3F3-FE0F-200D-1F308","j":["pride","rainbow","flag","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"]},"transgender-flag":{"a":"Transgender Flag","b":"1F3F3-FE0F-200D-26A7-FE0F","j":["flag","light blue","pink","transgender","white","lgbtq"]},"pirate-flag":{"a":"Pirate Flag","b":"1F3F4-200D-2620-FE0F","j":["Jolly Roger","pirate","plunder","treasure","skull","crossbones","flag","banner"]},"flag-ascension-island":{"a":"Flag: Ascension Island","b":"1F1E6-1F1E8","j":["flag"]},"flag-andorra":{"a":"Flag: Andorra","b":"1F1E6-1F1E9","j":["flag","ad","nation","country","banner"]},"flag-united-arab-emirates":{"a":"Flag: United Arab Emirates","b":"1F1E6-1F1EA","j":["flag","united","arab","emirates","nation","country","banner"]},"flag-afghanistan":{"a":"Flag: Afghanistan","b":"1F1E6-1F1EB","j":["flag","af","nation","country","banner"]},"flag-antigua--barbuda":{"a":"Flag: Antigua & Barbuda","b":"1F1E6-1F1EC","j":["flag","flag_antigua_barbuda","antigua","barbuda","nation","country","banner"]},"flag-anguilla":{"a":"Flag: Anguilla","b":"1F1E6-1F1EE","j":["flag","ai","nation","country","banner"]},"flag-albania":{"a":"Flag: Albania","b":"1F1E6-1F1F1","j":["flag","al","nation","country","banner"]},"flag-armenia":{"a":"Flag: Armenia","b":"1F1E6-1F1F2","j":["flag","am","nation","country","banner"]},"flag-angola":{"a":"Flag: Angola","b":"1F1E6-1F1F4","j":["flag","ao","nation","country","banner"]},"flag-antarctica":{"a":"Flag: Antarctica","b":"1F1E6-1F1F6","j":["flag","aq","nation","country","banner"]},"flag-argentina":{"a":"Flag: Argentina","b":"1F1E6-1F1F7","j":["flag","ar","nation","country","banner"]},"flag-american-samoa":{"a":"Flag: American Samoa","b":"1F1E6-1F1F8","j":["flag","american","ws","nation","country","banner"]},"flag-austria":{"a":"Flag: Austria","b":"1F1E6-1F1F9","j":["flag","at","nation","country","banner"]},"flag-australia":{"a":"Flag: Australia","b":"1F1E6-1F1FA","j":["flag","au","nation","country","banner"]},"flag-aruba":{"a":"Flag: Aruba","b":"1F1E6-1F1FC","j":["flag","aw","nation","country","banner"]},"flag-land-islands":{"a":"Flag: Åland Islands","b":"1F1E6-1F1FD","j":["flag","flag_aland_islands","Åland","islands","nation","country","banner"]},"flag-azerbaijan":{"a":"Flag: Azerbaijan","b":"1F1E6-1F1FF","j":["flag","az","nation","country","banner"]},"flag-bosnia--herzegovina":{"a":"Flag: Bosnia & Herzegovina","b":"1F1E7-1F1E6","j":["flag","flag_bosnia_herzegovina","bosnia","herzegovina","nation","country","banner"]},"flag-barbados":{"a":"Flag: Barbados","b":"1F1E7-1F1E7","j":["flag","bb","nation","country","banner"]},"flag-bangladesh":{"a":"Flag: Bangladesh","b":"1F1E7-1F1E9","j":["flag","bd","nation","country","banner"]},"flag-belgium":{"a":"Flag: Belgium","b":"1F1E7-1F1EA","j":["flag","be","nation","country","banner"]},"flag-burkina-faso":{"a":"Flag: Burkina Faso","b":"1F1E7-1F1EB","j":["flag","burkina","faso","nation","country","banner"]},"flag-bulgaria":{"a":"Flag: Bulgaria","b":"1F1E7-1F1EC","j":["flag","bg","nation","country","banner"]},"flag-bahrain":{"a":"Flag: Bahrain","b":"1F1E7-1F1ED","j":["flag","bh","nation","country","banner"]},"flag-burundi":{"a":"Flag: Burundi","b":"1F1E7-1F1EE","j":["flag","bi","nation","country","banner"]},"flag-benin":{"a":"Flag: Benin","b":"1F1E7-1F1EF","j":["flag","bj","nation","country","banner"]},"flag-st-barthlemy":{"a":"Flag: St. Barthélemy","b":"1F1E7-1F1F1","j":["flag","flag_st_barthelemy","saint","barthélemy","nation","country","banner"]},"flag-bermuda":{"a":"Flag: Bermuda","b":"1F1E7-1F1F2","j":["flag","bm","nation","country","banner"]},"flag-brunei":{"a":"Flag: Brunei","b":"1F1E7-1F1F3","j":["flag","bn","darussalam","nation","country","banner"]},"flag-bolivia":{"a":"Flag: Bolivia","b":"1F1E7-1F1F4","j":["flag","bo","nation","country","banner"]},"flag-caribbean-netherlands":{"a":"Flag: Caribbean Netherlands","b":"1F1E7-1F1F6","j":["flag","bonaire","nation","country","banner"]},"flag-brazil":{"a":"Flag: Brazil","b":"1F1E7-1F1F7","j":["flag","br","nation","country","banner"]},"flag-bahamas":{"a":"Flag: Bahamas","b":"1F1E7-1F1F8","j":["flag","bs","nation","country","banner"]},"flag-bhutan":{"a":"Flag: Bhutan","b":"1F1E7-1F1F9","j":["flag","bt","nation","country","banner"]},"flag-bouvet-island":{"a":"Flag: Bouvet Island","b":"1F1E7-1F1FB","j":["flag","norway"]},"flag-botswana":{"a":"Flag: Botswana","b":"1F1E7-1F1FC","j":["flag","bw","nation","country","banner"]},"flag-belarus":{"a":"Flag: Belarus","b":"1F1E7-1F1FE","j":["flag","by","nation","country","banner"]},"flag-belize":{"a":"Flag: Belize","b":"1F1E7-1F1FF","j":["flag","bz","nation","country","banner"]},"flag-canada":{"a":"Flag: Canada","b":"1F1E8-1F1E6","j":["flag","ca","nation","country","banner"]},"flag-cocos-keeling-islands":{"a":"Flag: Cocos (Keeling) Islands","b":"1F1E8-1F1E8","j":["flag","flag_cocos_islands","cocos","keeling","islands","nation","country","banner"]},"flag-congo--kinshasa":{"a":"Flag: Congo - Kinshasa","b":"1F1E8-1F1E9","j":["flag","flag_congo_kinshasa","congo","democratic","republic","nation","country","banner"]},"flag-central-african-republic":{"a":"Flag: Central African Republic","b":"1F1E8-1F1EB","j":["flag","central","african","republic","nation","country","banner"]},"flag-congo--brazzaville":{"a":"Flag: Congo - Brazzaville","b":"1F1E8-1F1EC","j":["flag","flag_congo_brazzaville","congo","nation","country","banner"]},"flag-switzerland":{"a":"Flag: Switzerland","b":"1F1E8-1F1ED","j":["flag","ch","nation","country","banner"]},"flag-cte-divoire":{"a":"Flag: Côte D’Ivoire","b":"1F1E8-1F1EE","j":["flag","flag_cote_d_ivoire","ivory","coast","nation","country","banner"]},"flag-cook-islands":{"a":"Flag: Cook Islands","b":"1F1E8-1F1F0","j":["flag","cook","islands","nation","country","banner"]},"flag-chile":{"a":"Flag: Chile","b":"1F1E8-1F1F1","j":["flag","nation","country","banner"]},"flag-cameroon":{"a":"Flag: Cameroon","b":"1F1E8-1F1F2","j":["flag","cm","nation","country","banner"]},"flag-china":{"a":"Flag: China","b":"1F1E8-1F1F3","j":["flag","china","chinese","prc","country","nation","banner"]},"flag-colombia":{"a":"Flag: Colombia","b":"1F1E8-1F1F4","j":["flag","co","nation","country","banner"]},"flag-clipperton-island":{"a":"Flag: Clipperton Island","b":"1F1E8-1F1F5","j":["flag"]},"flag-costa-rica":{"a":"Flag: Costa Rica","b":"1F1E8-1F1F7","j":["flag","costa","rica","nation","country","banner"]},"flag-cuba":{"a":"Flag: Cuba","b":"1F1E8-1F1FA","j":["flag","cu","nation","country","banner"]},"flag-cape-verde":{"a":"Flag: Cape Verde","b":"1F1E8-1F1FB","j":["flag","cabo","verde","nation","country","banner"]},"flag-curaao":{"a":"Flag: Curaçao","b":"1F1E8-1F1FC","j":["flag","flag_curacao","curaçao","nation","country","banner"]},"flag-christmas-island":{"a":"Flag: Christmas Island","b":"1F1E8-1F1FD","j":["flag","christmas","island","nation","country","banner"]},"flag-cyprus":{"a":"Flag: Cyprus","b":"1F1E8-1F1FE","j":["flag","cy","nation","country","banner"]},"flag-czechia":{"a":"Flag: Czechia","b":"1F1E8-1F1FF","j":["flag","cz","nation","country","banner"]},"flag-germany":{"a":"Flag: Germany","b":"1F1E9-1F1EA","j":["flag","german","nation","country","banner"]},"flag-diego-garcia":{"a":"Flag: Diego Garcia","b":"1F1E9-1F1EC","j":["flag"]},"flag-djibouti":{"a":"Flag: Djibouti","b":"1F1E9-1F1EF","j":["flag","dj","nation","country","banner"]},"flag-denmark":{"a":"Flag: Denmark","b":"1F1E9-1F1F0","j":["flag","dk","nation","country","banner"]},"flag-dominica":{"a":"Flag: Dominica","b":"1F1E9-1F1F2","j":["flag","dm","nation","country","banner"]},"flag-dominican-republic":{"a":"Flag: Dominican Republic","b":"1F1E9-1F1F4","j":["flag","dominican","republic","nation","country","banner"]},"flag-algeria":{"a":"Flag: Algeria","b":"1F1E9-1F1FF","j":["flag","dz","nation","country","banner"]},"flag-ceuta--melilla":{"a":"Flag: Ceuta & Melilla","b":"1F1EA-1F1E6","j":["flag","flag_ceuta_melilla"]},"flag-ecuador":{"a":"Flag: Ecuador","b":"1F1EA-1F1E8","j":["flag","ec","nation","country","banner"]},"flag-estonia":{"a":"Flag: Estonia","b":"1F1EA-1F1EA","j":["flag","ee","nation","country","banner"]},"flag-egypt":{"a":"Flag: Egypt","b":"1F1EA-1F1EC","j":["flag","eg","nation","country","banner"]},"flag-western-sahara":{"a":"Flag: Western Sahara","b":"1F1EA-1F1ED","j":["flag","western","sahara","nation","country","banner"]},"flag-eritrea":{"a":"Flag: Eritrea","b":"1F1EA-1F1F7","j":["flag","er","nation","country","banner"]},"flag-spain":{"a":"Flag: Spain","b":"1F1EA-1F1F8","j":["flag","spain","nation","country","banner"]},"flag-ethiopia":{"a":"Flag: Ethiopia","b":"1F1EA-1F1F9","j":["flag","et","nation","country","banner"]},"flag-european-union":{"a":"Flag: European Union","b":"1F1EA-1F1FA","j":["flag","european","union","banner"]},"flag-finland":{"a":"Flag: Finland","b":"1F1EB-1F1EE","j":["flag","fi","nation","country","banner"]},"flag-fiji":{"a":"Flag: Fiji","b":"1F1EB-1F1EF","j":["flag","fj","nation","country","banner"]},"flag-falkland-islands":{"a":"Flag: Falkland Islands","b":"1F1EB-1F1F0","j":["flag","falkland","islands","malvinas","nation","country","banner"]},"flag-micronesia":{"a":"Flag: Micronesia","b":"1F1EB-1F1F2","j":["flag","micronesia","federated","states","nation","country","banner"]},"flag-faroe-islands":{"a":"Flag: Faroe Islands","b":"1F1EB-1F1F4","j":["flag","faroe","islands","nation","country","banner"]},"flag-france":{"a":"Flag: France","b":"1F1EB-1F1F7","j":["flag","banner","nation","france","french","country"]},"flag-gabon":{"a":"Flag: Gabon","b":"1F1EC-1F1E6","j":["flag","ga","nation","country","banner"]},"flag-united-kingdom":{"a":"Flag: United Kingdom","b":"1F1EC-1F1E7","j":["flag","united","kingdom","great","britain","northern","ireland","nation","country","banner","british","UK","english","england","union jack"]},"flag-grenada":{"a":"Flag: Grenada","b":"1F1EC-1F1E9","j":["flag","gd","nation","country","banner"]},"flag-georgia":{"a":"Flag: Georgia","b":"1F1EC-1F1EA","j":["flag","ge","nation","country","banner"]},"flag-french-guiana":{"a":"Flag: French Guiana","b":"1F1EC-1F1EB","j":["flag","french","guiana","nation","country","banner"]},"flag-guernsey":{"a":"Flag: Guernsey","b":"1F1EC-1F1EC","j":["flag","gg","nation","country","banner"]},"flag-ghana":{"a":"Flag: Ghana","b":"1F1EC-1F1ED","j":["flag","gh","nation","country","banner"]},"flag-gibraltar":{"a":"Flag: Gibraltar","b":"1F1EC-1F1EE","j":["flag","gi","nation","country","banner"]},"flag-greenland":{"a":"Flag: Greenland","b":"1F1EC-1F1F1","j":["flag","gl","nation","country","banner"]},"flag-gambia":{"a":"Flag: Gambia","b":"1F1EC-1F1F2","j":["flag","gm","nation","country","banner"]},"flag-guinea":{"a":"Flag: Guinea","b":"1F1EC-1F1F3","j":["flag","gn","nation","country","banner"]},"flag-guadeloupe":{"a":"Flag: Guadeloupe","b":"1F1EC-1F1F5","j":["flag","gp","nation","country","banner"]},"flag-equatorial-guinea":{"a":"Flag: Equatorial Guinea","b":"1F1EC-1F1F6","j":["flag","equatorial","gn","nation","country","banner"]},"flag-greece":{"a":"Flag: Greece","b":"1F1EC-1F1F7","j":["flag","gr","nation","country","banner"]},"flag-south-georgia--south-sandwich-islands":{"a":"Flag: South Georgia & South Sandwich Islands","b":"1F1EC-1F1F8","j":["flag","flag_south_georgia_south_sandwich_islands","south","georgia","sandwich","islands","nation","country","banner"]},"flag-guatemala":{"a":"Flag: Guatemala","b":"1F1EC-1F1F9","j":["flag","gt","nation","country","banner"]},"flag-guam":{"a":"Flag: Guam","b":"1F1EC-1F1FA","j":["flag","gu","nation","country","banner"]},"flag-guineabissau":{"a":"Flag: Guinea-Bissau","b":"1F1EC-1F1FC","j":["flag","flag_guinea_bissau","gw","bissau","nation","country","banner"]},"flag-guyana":{"a":"Flag: Guyana","b":"1F1EC-1F1FE","j":["flag","gy","nation","country","banner"]},"flag-hong-kong-sar-china":{"a":"Flag: Hong Kong Sar China","b":"1F1ED-1F1F0","j":["flag","hong","kong","nation","country","banner"]},"flag-heard--mcdonald-islands":{"a":"Flag: Heard & Mcdonald Islands","b":"1F1ED-1F1F2","j":["flag","flag_heard_mcdonald_islands"]},"flag-honduras":{"a":"Flag: Honduras","b":"1F1ED-1F1F3","j":["flag","hn","nation","country","banner"]},"flag-croatia":{"a":"Flag: Croatia","b":"1F1ED-1F1F7","j":["flag","hr","nation","country","banner"]},"flag-haiti":{"a":"Flag: Haiti","b":"1F1ED-1F1F9","j":["flag","ht","nation","country","banner"]},"flag-hungary":{"a":"Flag: Hungary","b":"1F1ED-1F1FA","j":["flag","hu","nation","country","banner"]},"flag-canary-islands":{"a":"Flag: Canary Islands","b":"1F1EE-1F1E8","j":["flag","canary","islands","nation","country","banner"]},"flag-indonesia":{"a":"Flag: Indonesia","b":"1F1EE-1F1E9","j":["flag","nation","country","banner"]},"flag-ireland":{"a":"Flag: Ireland","b":"1F1EE-1F1EA","j":["flag","ie","nation","country","banner"]},"flag-israel":{"a":"Flag: Israel","b":"1F1EE-1F1F1","j":["flag","il","nation","country","banner"]},"flag-isle-of-man":{"a":"Flag: Isle of Man","b":"1F1EE-1F1F2","j":["flag","isle","man","nation","country","banner"]},"flag-india":{"a":"Flag: India","b":"1F1EE-1F1F3","j":["flag","in","nation","country","banner"]},"flag-british-indian-ocean-territory":{"a":"Flag: British Indian Ocean Territory","b":"1F1EE-1F1F4","j":["flag","british","indian","ocean","territory","nation","country","banner"]},"flag-iraq":{"a":"Flag: Iraq","b":"1F1EE-1F1F6","j":["flag","iq","nation","country","banner"]},"flag-iran":{"a":"Flag: Iran","b":"1F1EE-1F1F7","j":["flag","iran","islamic","republic","nation","country","banner"]},"flag-iceland":{"a":"Flag: Iceland","b":"1F1EE-1F1F8","j":["flag","is","nation","country","banner"]},"flag-italy":{"a":"Flag: Italy","b":"1F1EE-1F1F9","j":["flag","italy","nation","country","banner"]},"flag-jersey":{"a":"Flag: Jersey","b":"1F1EF-1F1EA","j":["flag","je","nation","country","banner"]},"flag-jamaica":{"a":"Flag: Jamaica","b":"1F1EF-1F1F2","j":["flag","jm","nation","country","banner"]},"flag-jordan":{"a":"Flag: Jordan","b":"1F1EF-1F1F4","j":["flag","jo","nation","country","banner"]},"flag-japan":{"a":"Flag: Japan","b":"1F1EF-1F1F5","j":["flag","japanese","nation","country","banner"]},"flag-kenya":{"a":"Flag: Kenya","b":"1F1F0-1F1EA","j":["flag","ke","nation","country","banner"]},"flag-kyrgyzstan":{"a":"Flag: Kyrgyzstan","b":"1F1F0-1F1EC","j":["flag","kg","nation","country","banner"]},"flag-cambodia":{"a":"Flag: Cambodia","b":"1F1F0-1F1ED","j":["flag","kh","nation","country","banner"]},"flag-kiribati":{"a":"Flag: Kiribati","b":"1F1F0-1F1EE","j":["flag","ki","nation","country","banner"]},"flag-comoros":{"a":"Flag: Comoros","b":"1F1F0-1F1F2","j":["flag","km","nation","country","banner"]},"flag-st-kitts--nevis":{"a":"Flag: St. Kitts & Nevis","b":"1F1F0-1F1F3","j":["flag","flag_st_kitts_nevis","saint","kitts","nevis","nation","country","banner"]},"flag-north-korea":{"a":"Flag: North Korea","b":"1F1F0-1F1F5","j":["flag","north","korea","nation","country","banner"]},"flag-south-korea":{"a":"Flag: South Korea","b":"1F1F0-1F1F7","j":["flag","south","korea","nation","country","banner"]},"flag-kuwait":{"a":"Flag: Kuwait","b":"1F1F0-1F1FC","j":["flag","kw","nation","country","banner"]},"flag-cayman-islands":{"a":"Flag: Cayman Islands","b":"1F1F0-1F1FE","j":["flag","cayman","islands","nation","country","banner"]},"flag-kazakhstan":{"a":"Flag: Kazakhstan","b":"1F1F0-1F1FF","j":["flag","kz","nation","country","banner"]},"flag-laos":{"a":"Flag: Laos","b":"1F1F1-1F1E6","j":["flag","lao","democratic","republic","nation","country","banner"]},"flag-lebanon":{"a":"Flag: Lebanon","b":"1F1F1-1F1E7","j":["flag","lb","nation","country","banner"]},"flag-st-lucia":{"a":"Flag: St. Lucia","b":"1F1F1-1F1E8","j":["flag","saint","lucia","nation","country","banner"]},"flag-liechtenstein":{"a":"Flag: Liechtenstein","b":"1F1F1-1F1EE","j":["flag","li","nation","country","banner"]},"flag-sri-lanka":{"a":"Flag: Sri Lanka","b":"1F1F1-1F1F0","j":["flag","sri","lanka","nation","country","banner"]},"flag-liberia":{"a":"Flag: Liberia","b":"1F1F1-1F1F7","j":["flag","lr","nation","country","banner"]},"flag-lesotho":{"a":"Flag: Lesotho","b":"1F1F1-1F1F8","j":["flag","ls","nation","country","banner"]},"flag-lithuania":{"a":"Flag: Lithuania","b":"1F1F1-1F1F9","j":["flag","lt","nation","country","banner"]},"flag-luxembourg":{"a":"Flag: Luxembourg","b":"1F1F1-1F1FA","j":["flag","lu","nation","country","banner"]},"flag-latvia":{"a":"Flag: Latvia","b":"1F1F1-1F1FB","j":["flag","lv","nation","country","banner"]},"flag-libya":{"a":"Flag: Libya","b":"1F1F1-1F1FE","j":["flag","ly","nation","country","banner"]},"flag-morocco":{"a":"Flag: Morocco","b":"1F1F2-1F1E6","j":["flag","ma","nation","country","banner"]},"flag-monaco":{"a":"Flag: Monaco","b":"1F1F2-1F1E8","j":["flag","mc","nation","country","banner"]},"flag-moldova":{"a":"Flag: Moldova","b":"1F1F2-1F1E9","j":["flag","moldova","republic","nation","country","banner"]},"flag-montenegro":{"a":"Flag: Montenegro","b":"1F1F2-1F1EA","j":["flag","me","nation","country","banner"]},"flag-st-martin":{"a":"Flag: St. Martin","b":"1F1F2-1F1EB","j":["flag"]},"flag-madagascar":{"a":"Flag: Madagascar","b":"1F1F2-1F1EC","j":["flag","mg","nation","country","banner"]},"flag-marshall-islands":{"a":"Flag: Marshall Islands","b":"1F1F2-1F1ED","j":["flag","marshall","islands","nation","country","banner"]},"flag-north-macedonia":{"a":"Flag: North Macedonia","b":"1F1F2-1F1F0","j":["flag","macedonia","nation","country","banner"]},"flag-mali":{"a":"Flag: Mali","b":"1F1F2-1F1F1","j":["flag","ml","nation","country","banner"]},"flag-myanmar-burma":{"a":"Flag: Myanmar (Burma)","b":"1F1F2-1F1F2","j":["flag","flag_myanmar","mm","nation","country","banner"]},"flag-mongolia":{"a":"Flag: Mongolia","b":"1F1F2-1F1F3","j":["flag","mn","nation","country","banner"]},"flag-macao-sar-china":{"a":"Flag: Macao Sar China","b":"1F1F2-1F1F4","j":["flag","macao","nation","country","banner"]},"flag-northern-mariana-islands":{"a":"Flag: Northern Mariana Islands","b":"1F1F2-1F1F5","j":["flag","northern","mariana","islands","nation","country","banner"]},"flag-martinique":{"a":"Flag: Martinique","b":"1F1F2-1F1F6","j":["flag","mq","nation","country","banner"]},"flag-mauritania":{"a":"Flag: Mauritania","b":"1F1F2-1F1F7","j":["flag","mr","nation","country","banner"]},"flag-montserrat":{"a":"Flag: Montserrat","b":"1F1F2-1F1F8","j":["flag","ms","nation","country","banner"]},"flag-malta":{"a":"Flag: Malta","b":"1F1F2-1F1F9","j":["flag","mt","nation","country","banner"]},"flag-mauritius":{"a":"Flag: Mauritius","b":"1F1F2-1F1FA","j":["flag","mu","nation","country","banner"]},"flag-maldives":{"a":"Flag: Maldives","b":"1F1F2-1F1FB","j":["flag","mv","nation","country","banner"]},"flag-malawi":{"a":"Flag: Malawi","b":"1F1F2-1F1FC","j":["flag","mw","nation","country","banner"]},"flag-mexico":{"a":"Flag: Mexico","b":"1F1F2-1F1FD","j":["flag","mx","nation","country","banner"]},"flag-malaysia":{"a":"Flag: Malaysia","b":"1F1F2-1F1FE","j":["flag","my","nation","country","banner"]},"flag-mozambique":{"a":"Flag: Mozambique","b":"1F1F2-1F1FF","j":["flag","mz","nation","country","banner"]},"flag-namibia":{"a":"Flag: Namibia","b":"1F1F3-1F1E6","j":["flag","na","nation","country","banner"]},"flag-new-caledonia":{"a":"Flag: New Caledonia","b":"1F1F3-1F1E8","j":["flag","new","caledonia","nation","country","banner"]},"flag-niger":{"a":"Flag: Niger","b":"1F1F3-1F1EA","j":["flag","ne","nation","country","banner"]},"flag-norfolk-island":{"a":"Flag: Norfolk Island","b":"1F1F3-1F1EB","j":["flag","norfolk","island","nation","country","banner"]},"flag-nigeria":{"a":"Flag: Nigeria","b":"1F1F3-1F1EC","j":["flag","nation","country","banner"]},"flag-nicaragua":{"a":"Flag: Nicaragua","b":"1F1F3-1F1EE","j":["flag","ni","nation","country","banner"]},"flag-netherlands":{"a":"Flag: Netherlands","b":"1F1F3-1F1F1","j":["flag","nl","nation","country","banner"]},"flag-norway":{"a":"Flag: Norway","b":"1F1F3-1F1F4","j":["flag","no","nation","country","banner"]},"flag-nepal":{"a":"Flag: Nepal","b":"1F1F3-1F1F5","j":["flag","np","nation","country","banner"]},"flag-nauru":{"a":"Flag: Nauru","b":"1F1F3-1F1F7","j":["flag","nr","nation","country","banner"]},"flag-niue":{"a":"Flag: Niue","b":"1F1F3-1F1FA","j":["flag","nu","nation","country","banner"]},"flag-new-zealand":{"a":"Flag: New Zealand","b":"1F1F3-1F1FF","j":["flag","new","zealand","nation","country","banner"]},"flag-oman":{"a":"Flag: Oman","b":"1F1F4-1F1F2","j":["flag","om_symbol","nation","country","banner"]},"flag-panama":{"a":"Flag: Panama","b":"1F1F5-1F1E6","j":["flag","pa","nation","country","banner"]},"flag-peru":{"a":"Flag: Peru","b":"1F1F5-1F1EA","j":["flag","pe","nation","country","banner"]},"flag-french-polynesia":{"a":"Flag: French Polynesia","b":"1F1F5-1F1EB","j":["flag","french","polynesia","nation","country","banner"]},"flag-papua-new-guinea":{"a":"Flag: Papua New Guinea","b":"1F1F5-1F1EC","j":["flag","papua","new","guinea","nation","country","banner"]},"flag-philippines":{"a":"Flag: Philippines","b":"1F1F5-1F1ED","j":["flag","ph","nation","country","banner"]},"flag-pakistan":{"a":"Flag: Pakistan","b":"1F1F5-1F1F0","j":["flag","pk","nation","country","banner"]},"flag-poland":{"a":"Flag: Poland","b":"1F1F5-1F1F1","j":["flag","pl","nation","country","banner"]},"flag-st-pierre--miquelon":{"a":"Flag: St. Pierre & Miquelon","b":"1F1F5-1F1F2","j":["flag","flag_st_pierre_miquelon","saint","pierre","miquelon","nation","country","banner"]},"flag-pitcairn-islands":{"a":"Flag: Pitcairn Islands","b":"1F1F5-1F1F3","j":["flag","pitcairn","nation","country","banner"]},"flag-puerto-rico":{"a":"Flag: Puerto Rico","b":"1F1F5-1F1F7","j":["flag","puerto","rico","nation","country","banner"]},"flag-palestinian-territories":{"a":"Flag: Palestinian Territories","b":"1F1F5-1F1F8","j":["flag","palestine","palestinian","territories","nation","country","banner"]},"flag-portugal":{"a":"Flag: Portugal","b":"1F1F5-1F1F9","j":["flag","pt","nation","country","banner"]},"flag-palau":{"a":"Flag: Palau","b":"1F1F5-1F1FC","j":["flag","pw","nation","country","banner"]},"flag-paraguay":{"a":"Flag: Paraguay","b":"1F1F5-1F1FE","j":["flag","py","nation","country","banner"]},"flag-qatar":{"a":"Flag: Qatar","b":"1F1F6-1F1E6","j":["flag","qa","nation","country","banner"]},"flag-runion":{"a":"Flag: Réunion","b":"1F1F7-1F1EA","j":["flag","flag_reunion","réunion","nation","country","banner"]},"flag-romania":{"a":"Flag: Romania","b":"1F1F7-1F1F4","j":["flag","ro","nation","country","banner"]},"flag-serbia":{"a":"Flag: Serbia","b":"1F1F7-1F1F8","j":["flag","rs","nation","country","banner"]},"flag-russia":{"a":"Flag: Russia","b":"1F1F7-1F1FA","j":["flag","russian","federation","nation","country","banner"]},"flag-rwanda":{"a":"Flag: Rwanda","b":"1F1F7-1F1FC","j":["flag","rw","nation","country","banner"]},"flag-saudi-arabia":{"a":"Flag: Saudi Arabia","b":"1F1F8-1F1E6","j":["flag","nation","country","banner"]},"flag-solomon-islands":{"a":"Flag: Solomon Islands","b":"1F1F8-1F1E7","j":["flag","solomon","islands","nation","country","banner"]},"flag-seychelles":{"a":"Flag: Seychelles","b":"1F1F8-1F1E8","j":["flag","sc","nation","country","banner"]},"flag-sudan":{"a":"Flag: Sudan","b":"1F1F8-1F1E9","j":["flag","sd","nation","country","banner"]},"flag-sweden":{"a":"Flag: Sweden","b":"1F1F8-1F1EA","j":["flag","se","nation","country","banner"]},"flag-singapore":{"a":"Flag: Singapore","b":"1F1F8-1F1EC","j":["flag","sg","nation","country","banner"]},"flag-st-helena":{"a":"Flag: St. Helena","b":"1F1F8-1F1ED","j":["flag","saint","helena","ascension","tristan","cunha","nation","country","banner"]},"flag-slovenia":{"a":"Flag: Slovenia","b":"1F1F8-1F1EE","j":["flag","si","nation","country","banner"]},"flag-svalbard--jan-mayen":{"a":"Flag: Svalbard & Jan Mayen","b":"1F1F8-1F1EF","j":["flag","flag_svalbard_jan_mayen"]},"flag-slovakia":{"a":"Flag: Slovakia","b":"1F1F8-1F1F0","j":["flag","sk","nation","country","banner"]},"flag-sierra-leone":{"a":"Flag: Sierra Leone","b":"1F1F8-1F1F1","j":["flag","sierra","leone","nation","country","banner"]},"flag-san-marino":{"a":"Flag: San Marino","b":"1F1F8-1F1F2","j":["flag","san","marino","nation","country","banner"]},"flag-senegal":{"a":"Flag: Senegal","b":"1F1F8-1F1F3","j":["flag","sn","nation","country","banner"]},"flag-somalia":{"a":"Flag: Somalia","b":"1F1F8-1F1F4","j":["flag","so","nation","country","banner"]},"flag-suriname":{"a":"Flag: Suriname","b":"1F1F8-1F1F7","j":["flag","sr","nation","country","banner"]},"flag-south-sudan":{"a":"Flag: South Sudan","b":"1F1F8-1F1F8","j":["flag","south","sd","nation","country","banner"]},"flag-so-tom--prncipe":{"a":"Flag: São Tomé & Príncipe","b":"1F1F8-1F1F9","j":["flag","flag_sao_tome_principe","sao","tome","principe","nation","country","banner"]},"flag-el-salvador":{"a":"Flag: El Salvador","b":"1F1F8-1F1FB","j":["flag","el","salvador","nation","country","banner"]},"flag-sint-maarten":{"a":"Flag: Sint Maarten","b":"1F1F8-1F1FD","j":["flag","sint","maarten","dutch","nation","country","banner"]},"flag-syria":{"a":"Flag: Syria","b":"1F1F8-1F1FE","j":["flag","syrian","arab","republic","nation","country","banner"]},"flag-eswatini":{"a":"Flag: Eswatini","b":"1F1F8-1F1FF","j":["flag","sz","nation","country","banner"]},"flag-tristan-da-cunha":{"a":"Flag: Tristan Da Cunha","b":"1F1F9-1F1E6","j":["flag"]},"flag-turks--caicos-islands":{"a":"Flag: Turks & Caicos Islands","b":"1F1F9-1F1E8","j":["flag","flag_turks_caicos_islands","turks","caicos","islands","nation","country","banner"]},"flag-chad":{"a":"Flag: Chad","b":"1F1F9-1F1E9","j":["flag","td","nation","country","banner"]},"flag-french-southern-territories":{"a":"Flag: French Southern Territories","b":"1F1F9-1F1EB","j":["flag","french","southern","territories","nation","country","banner"]},"flag-togo":{"a":"Flag: Togo","b":"1F1F9-1F1EC","j":["flag","tg","nation","country","banner"]},"flag-thailand":{"a":"Flag: Thailand","b":"1F1F9-1F1ED","j":["flag","th","nation","country","banner"]},"flag-tajikistan":{"a":"Flag: Tajikistan","b":"1F1F9-1F1EF","j":["flag","tj","nation","country","banner"]},"flag-tokelau":{"a":"Flag: Tokelau","b":"1F1F9-1F1F0","j":["flag","tk","nation","country","banner"]},"flag-timorleste":{"a":"Flag: Timor-Leste","b":"1F1F9-1F1F1","j":["flag","flag_timor_leste","timor","leste","nation","country","banner"]},"flag-turkmenistan":{"a":"Flag: Turkmenistan","b":"1F1F9-1F1F2","j":["flag","nation","country","banner"]},"flag-tunisia":{"a":"Flag: Tunisia","b":"1F1F9-1F1F3","j":["flag","tn","nation","country","banner"]},"flag-tonga":{"a":"Flag: Tonga","b":"1F1F9-1F1F4","j":["flag","to","nation","country","banner"]},"flag-turkey":{"a":"Flag: Turkey","b":"1F1F9-1F1F7","j":["flag","turkey","nation","country","banner"]},"flag-trinidad--tobago":{"a":"Flag: Trinidad & Tobago","b":"1F1F9-1F1F9","j":["flag","flag_trinidad_tobago","trinidad","tobago","nation","country","banner"]},"flag-tuvalu":{"a":"Flag: Tuvalu","b":"1F1F9-1F1FB","j":["flag","nation","country","banner"]},"flag-taiwan":{"a":"Flag: Taiwan","b":"1F1F9-1F1FC","j":["flag","tw","nation","country","banner"]},"flag-tanzania":{"a":"Flag: Tanzania","b":"1F1F9-1F1FF","j":["flag","tanzania","united","republic","nation","country","banner"]},"flag-ukraine":{"a":"Flag: Ukraine","b":"1F1FA-1F1E6","j":["flag","ua","nation","country","banner"]},"flag-uganda":{"a":"Flag: Uganda","b":"1F1FA-1F1EC","j":["flag","ug","nation","country","banner"]},"flag-us-outlying-islands":{"a":"Flag: U.S. Outlying Islands","b":"1F1FA-1F1F2","j":["flag","flag_u_s_outlying_islands"]},"flag-united-nations":{"a":"Flag: United Nations","b":"1F1FA-1F1F3","j":["flag","un","banner"]},"flag-united-states":{"a":"Flag: United States","b":"1F1FA-1F1F8","j":["flag","united","states","america","nation","country","banner"]},"flag-uruguay":{"a":"Flag: Uruguay","b":"1F1FA-1F1FE","j":["flag","uy","nation","country","banner"]},"flag-uzbekistan":{"a":"Flag: Uzbekistan","b":"1F1FA-1F1FF","j":["flag","uz","nation","country","banner"]},"flag-vatican-city":{"a":"Flag: Vatican City","b":"1F1FB-1F1E6","j":["flag","vatican","city","nation","country","banner"]},"flag-st-vincent--grenadines":{"a":"Flag: St. Vincent & Grenadines","b":"1F1FB-1F1E8","j":["flag","flag_st_vincent_grenadines","saint","vincent","grenadines","nation","country","banner"]},"flag-venezuela":{"a":"Flag: Venezuela","b":"1F1FB-1F1EA","j":["flag","ve","bolivarian","republic","nation","country","banner"]},"flag-british-virgin-islands":{"a":"Flag: British Virgin Islands","b":"1F1FB-1F1EC","j":["flag","british","virgin","islands","bvi","nation","country","banner"]},"flag-us-virgin-islands":{"a":"Flag: U.S. Virgin Islands","b":"1F1FB-1F1EE","j":["flag","flag_u_s_virgin_islands","virgin","islands","us","nation","country","banner"]},"flag-vietnam":{"a":"Flag: Vietnam","b":"1F1FB-1F1F3","j":["flag","viet","nam","nation","country","banner"]},"flag-vanuatu":{"a":"Flag: Vanuatu","b":"1F1FB-1F1FA","j":["flag","vu","nation","country","banner"]},"flag-wallis--futuna":{"a":"Flag: Wallis & Futuna","b":"1F1FC-1F1EB","j":["flag","flag_wallis_futuna","wallis","futuna","nation","country","banner"]},"flag-samoa":{"a":"Flag: Samoa","b":"1F1FC-1F1F8","j":["flag","ws","nation","country","banner"]},"flag-kosovo":{"a":"Flag: Kosovo","b":"1F1FD-1F1F0","j":["flag","xk","nation","country","banner"]},"flag-yemen":{"a":"Flag: Yemen","b":"1F1FE-1F1EA","j":["flag","ye","nation","country","banner"]},"flag-mayotte":{"a":"Flag: Mayotte","b":"1F1FE-1F1F9","j":["flag","yt","nation","country","banner"]},"flag-south-africa":{"a":"Flag: South Africa","b":"1F1FF-1F1E6","j":["flag","south","africa","nation","country","banner"]},"flag-zambia":{"a":"Flag: Zambia","b":"1F1FF-1F1F2","j":["flag","zm","nation","country","banner"]},"flag-zimbabwe":{"a":"Flag: Zimbabwe","b":"1F1FF-1F1FC","j":["flag","zw","nation","country","banner"]},"flag-england":{"a":"Flag: England","b":"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F","j":["flag","english"]},"flag-scotland":{"a":"Flag: Scotland","b":"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F","j":["flag","scottish"]},"flag-wales":{"a":"Flag: Wales","b":"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F","j":["flag","welsh"]}},"aliases":{}} \ No newline at end of file diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml index d82181d374..9249228546 100644 --- a/vector/src/main/res/values-ar/strings.xml +++ b/vector/src/main/res/values-ar/strings.xml @@ -62,7 +62,7 @@ </plurals> <string name="summary_you_sent_image">أرسلتَ صورةً.</string> <string name="summary_you_sent_sticker">أرسلتَ ملصقًا.</string> - <string name="notice_room_invite_no_invitee_by_you">دعوة منك</string> + <string name="notice_room_invite_no_invitee_by_you">دعوتك</string> <string name="notice_room_created">أنشأ %1$s الغرفة</string> <string name="notice_room_created_by_you">أنشأتَ الغرفة</string> <string name="notice_room_invite_by_you">دعوتَ %1$s</string> @@ -1135,4 +1135,99 @@ <string name="initial_sync_start_server_computing">المزامنة الأولية: \nينتظر رد الخادم…</string> <string name="notice_display_name_set">غير %1$s اسمه الى %2$s</string> + <plurals name="notice_room_aliases_added"> + <item quantity="zero">%1$s أضاف %2$s كعنوان لهذه الغرفة.</item> + <item quantity="one">%1$s أضاف %2$s كعنوان لهذه الغرفة.</item> + <item quantity="two">%1$s أضاف %2$s كعنوانين لهذه الغرفة.</item> + <item quantity="few">%1$s أضاف %2$s كعناوين لهذه الغرفة.</item> + <item quantity="many">%1$s أضاف %2$s كعناوين لهذه الغرفة.</item> + <item quantity="other">%1$s أضاف %2$s كعناوين لهذه الغرفة.</item> + </plurals> + <string name="invite_just_to_this_room">فقط في هذه الغُرفة</string> + <string name="invite_just_to_this_room_desc">لن يكونوا جزءًا من %s</string> + <string name="share_space_link_message">إنضم إلى مساحتي %1$s %2$s</string> + <string name="skip_for_now">تخطي في الوقت الراهن</string> + <string name="create_space">إنشاء مساحة</string> + <string name="join_space">انضم إلى المساحة</string> + <string name="join_anyway">الانضمام على أي حال</string> + <string name="room_alias_preview_not_found">هذا الاسم المستعار غير متوفر في الوقت الحالي. +\nحاول مرة أخرى لاحقًا، أو اطلب من مسؤول الغرفة التحقق مما إذا كان لديك وصول.</string> + <string name="suggested_rooms_pills_on_empty_text">أنت لست في أي غرفة حتى الآن. فيما يلي بعض الغرف المقترحة، ولكن يمكنك رؤية المزيد بالزر الأخضر أسفل اليمين.</string> + <string name="suggested_rooms_pills_on_empty_header">مرحبًا بك في %1$s، %2$s.</string> + <plurals name="space_people_you_know"> + <item quantity="zero">%d شخص تعرفه قد انضم بالفعل</item> + <item quantity="one">%d شخص تعرفه قد انضم بالفعل</item> + <item quantity="two">%d شخصان تعرفهم قد انضموا بالفعل</item> + <item quantity="few">%d أشخاص تعرفهم قد انضموا بالفعل</item> + <item quantity="many">%d أشخاص تعرفهم قد انضموا بالفعل</item> + <item quantity="other">%d أشخاص تعرفهم قد انضموا بالفعل</item> + </plurals> + <string name="space_explore_activity_title">استكشِف الغُرف</string> + <string name="space_add_child_title">أضف غُرف</string> + <string name="leave_space">غادر المساحة</string> + <string name="space_leave_prompt_msg">هل أنت متأكد أنك تريد مغادرة المساحة؟</string> + <string name="space_leave_prompt_msg_only_you">انت الشخص الوحيد هنا إذا غادرت، فلن يتمكن أي شخص من الانضمام في المستقبل، بما في ذلك أنت.</string> + <string name="space_leave_prompt_msg_private">هذه المساحة ليست عامة. لن تتمكن من الانضمام مرة أخرى بدون دعوة.</string> + <string name="space_leave_prompt_msg_as_admin">أنت المسؤول عن هذه المساحة، تأكد من أنك قمت بنقل حق المسؤول إلى عضو آخر قبل المغادرة.</string> + <string name="space_add_existing_rooms">أضف الغُرف الموجودة ومساحة</string> + <string name="space_add_rooms">أضف غُرف</string> + <string name="spaces_beta_welcome_to_spaces">مرحبًا بك في المساحات!</string> + <string name="spaces_beta_welcome_to_spaces_desc">تعد المساحات طريقة جديدة لتجميع الغرف والأشخاص.</string> + <string name="you_are_invited">أنت مدعو</string> + <string name="labs_use_restricted_join_rule">مساحة تجريبية - غُرفة مقيدة.</string> + <string name="space_mark_as_suggested">علم كمقترحة</string> + <string name="space_mark_as_not_suggested">علم كغير مقترحة</string> + <string name="space_manage_rooms_and_spaces">إدارة الغُرف والمساحات</string> + <string name="labs_space_show_orphan_in_home">مساحة تجريبية - فقط أعرض المُيتِّمة في الصفحة الرئيسية</string> + <string name="spaces_feeling_experimental_subspace">تشعر بالتجربة؟ +\nيمكنك إضافة مساحات موجودة إلى مساحة.</string> + <string name="spaces_no_server_support_description">يرجى الاتصال بمسؤول الخادم الخاص بك للحصول على مزيد من المعلومات</string> + <string name="spaces_no_server_support_title">يبدو أن خادمك لا يدعم المساحات بعد</string> + <string name="this_space_has_no_rooms">هذه المساحة لا تحتوي على غُرف</string> + <string name="this_space_has_no_rooms_not_admin">قد تكون بعض الغُرف مخفية لأنها خاصة وأنك بحاجة إلى دعوة. +\nليس لديك إذن لإضافة غُرف.</string> + <string name="this_space_has_no_rooms_admin">قد تكون بعض الغُرف مخفية لأنها خاصة وأنك بحاجة إلى دعوة.</string> + <string name="labs_use_restricted_join_rule_desc">يتطلب التحذير دعم الخادم وإصدار الغرفة التجريبية</string> + <string name="user_invites_you">%s يدعوك</string> + <string name="looking_for_someone_not_in_space">تبحث عن شخص ما ليس في %s؟</string> + <string name="space_settings_manage_rooms">إدارة الغُرف</string> + <string name="make_this_space_public">إجعل هَذِهِ المساحة عَامَّة</string> + <string name="space_suggested">مقترح</string> + <plurals name="notice_room_canonical_alias_alternative_added"> + <item quantity="zero">%1$s أضاف العنوان البديل %2$s لهذه الغرفة.</item> + <item quantity="one">%1$s أضاف العنوان البديل %2$s لهذه الغرفة.</item> + <item quantity="two">%1$s أضاف العنوانين البديل %2$s لهذه الغرفة.</item> + <item quantity="few">%1$s أضاف العناوين البديل %2$s لهذه الغرفة.</item> + <item quantity="many">%1$s أضاف العناوين البديل %2$s لهذه الغرفة.</item> + <item quantity="other">%1$s أضاف العناوين البديل %2$s لهذه الغرفة.</item> + </plurals> + <string name="notice_room_canonical_alias_unset_by_you">أنت أزلت العنوان الرئيسي لهذه الغرفة.</string> + <string name="notice_room_canonical_alias_unset">%1$s أزال العنوان الرئيسي لهذه الغُرفة.</string> + <string name="notice_room_canonical_alias_set_by_you">أنت غيرت العنوان الرئيسي لهذه الغرفة إلى %1$s.</string> + <string name="notice_room_aliases_added_and_removed_by_you">أنت أضفت %1$s وحذفت %2$s كعنوان لهذه الغرفة.</string> + <string name="notice_room_aliases_added_and_removed">%1$s أضاف %2$s وحذف %3$s كعناوين لهذه الغرفة.</string> + <plurals name="notice_room_aliases_removed_by_you"> + <item quantity="zero">أنت أزلت %1$s كعنوان لهذه الغرفة.</item> + <item quantity="one">أنت أزلت %1$s كعنوان لهذه الغرفة.</item> + <item quantity="two">أنت أزلت %1$s كعنوانين لهذه الغرفة.</item> + <item quantity="few">أنت أزلت %1$s كعناوين لهذه الغرفة.</item> + <item quantity="many">أنت أزلت %1$s كعناوين لهذه الغرفة.</item> + <item quantity="other">أنت أزلت %1$s كعناوين لهذه الغرفة.</item> + </plurals> + <plurals name="notice_room_aliases_removed"> + <item quantity="zero">%1$s أزال %2$s كعنوان لهذه الغرفة.</item> + <item quantity="one">%1$s أزال %2$s كعنوان لهذه الغرفة.</item> + <item quantity="two">%1$s أزال %2$s كعنوانين لهذه الغرفة.</item> + <item quantity="few">%1$s أزال %2$s كعناوين لهذه الغرفة.</item> + <item quantity="many">%1$s أزال %2$s كعناوين لهذه الغرفة.</item> + <item quantity="other">%1$s أزال %2$s كعناوين لهذه الغرفة.</item> + </plurals> + <plurals name="notice_room_aliases_added_by_you"> + <item quantity="zero">أنت أضفت %1$s كعنوان لهذه الغرفة.</item> + <item quantity="one">أنت أضفت %1$s كعنوان لهذه الغرفة.</item> + <item quantity="two">أنت أضفت %1$s كعنوانين لهذه الغرفة.</item> + <item quantity="few">أنت أضفت %1$s كعناوين لهذه الغرفة.</item> + <item quantity="many">أنت أضفت %1$s كعناوين لهذه الغرفة.</item> + <item quantity="other">أنت أضفت %1$s كعناوين لهذه الغرفة.</item> + </plurals> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-bg/strings.xml b/vector/src/main/res/values-bg/strings.xml index cf51e0546d..13e254acf7 100644 --- a/vector/src/main/res/values-bg/strings.xml +++ b/vector/src/main/res/values-bg/strings.xml @@ -2402,4 +2402,38 @@ <string name="room_member_open_or_create_dm">Директно съобщение</string> <string name="send_bug_report_include_key_share_history">Изпрати историята на заявките за споделяне на ключове</string> <string name="no_more_results">Няма повече резултати</string> + <string name="event_status_sent_message">Съобщението беше изпратено</string> + <string name="initial_sync_start_downloading">Начална синхронизация: +\nИзтегляне на данни…</string> + <string name="initial_sync_start_server_computing">Начална синхронизация: +\nИзчакване на отговор от сървъра…</string> + <string name="room_displayname_empty_room_was">Празна стая (беше %s)</string> + <plurals name="room_displayname_four_and_more_members"> + <item quantity="one">%1$s, %2$s, %3$s и %4$d друг</item> + <item quantity="other">%1$s, %2$s, %3$s и %4$d други</item> + </plurals> + <string name="room_displayname_4_members">%1$s, %2$s, %3$s и %4$s</string> + <string name="room_displayname_3_members">%1$s, %2$s и %3$s</string> + <string name="notice_widget_jitsi_modified_by_you">Променихте видео конференцията</string> + <string name="notice_widget_jitsi_modified">Видео конференцията беше променена от %1$s</string> + <string name="notice_widget_jitsi_removed_by_you">Прекратихте видео конференцията</string> + <string name="notice_widget_jitsi_removed">Видео конференцията беше прекратена от %1$s</string> + <string name="notice_widget_jitsi_added_by_you">Стартирахте видео конференция</string> + <string name="notice_widget_jitsi_added">Беше стартирана видео конференция от %1$s</string> + <string name="notice_room_server_acl_allow_is_empty">🎉 Забранено е участието на всякакви сървъри! Тази стая вече е неизползваема.</string> + <string name="notice_room_server_acl_updated_no_change">Няма промени.</string> + <string name="notice_room_server_acl_updated_ip_literals_not_allowed">• Сървърите съдържащи IP адреси ще бъдат блокирани.</string> + <string name="notice_room_server_acl_updated_ip_literals_allowed">• Сървърите съдържащи IP адреси ще бъдат разрешени.</string> + <string name="notice_room_server_acl_updated_was_allowed">• Сървърите съдържащи %s бяха премахнати от списъка с разрешени.</string> + <string name="notice_room_server_acl_updated_allowed">• Сървърите съдържащи %s ще бъдат разрешени.</string> + <string name="notice_room_server_acl_updated_was_banned">"• Сървърите съдържащи %s бяха премахнати от списъка с блокирани."</string> + <string name="notice_room_server_acl_updated_banned">"• Сървърите съдържащи %s ще бъдат блокирани."</string> + <string name="notice_room_server_acl_updated_title_by_you">Променихте сървърните разрешения (ACL) за тази стая.</string> + <string name="notice_room_server_acl_updated_title">%s промени разрешенията (ACL) за тази стая.</string> + <string name="notice_room_server_acl_set_ip_literals_not_allowed">• Сървърите съдържащи IP адрес са блокирани.</string> + <string name="notice_room_server_acl_set_ip_literals_allowed">• Сървърите съдържащи IP адрес са разрешени.</string> + <string name="notice_room_server_acl_set_allowed">• Сървърите съдържащи %s са разрешени.</string> + <string name="notice_room_server_acl_set_banned">• Сървърите съдържащи %s са блокирани.</string> + <string name="notice_room_server_acl_set_title_by_you">Настроихте сървърните разрешения (ACL) за тази стая.</string> + <string name="notice_room_server_acl_set_title">%s настрой разрешенията (ACL) за тази стая.</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 663ee6b641..7523be029e 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -384,7 +384,7 @@ <string name="create_account">Založit účet</string> <string name="login">Přihlásit se</string> <string name="logout">Odhlásit se</string> - <string name="hs_url">Adresa URL domácího serveru</string> + <string name="hs_url">Adresa domovského serveru</string> <string name="identity_url">Adresa URL serveru identit</string> <string name="search">Hledat</string> <string name="start_new_chat">Začít novou konverzaci</string> @@ -430,7 +430,7 @@ <string name="auth_email_validation_message">Prosím, zkontrolujte své e-maily, abyste mohli pokračovat v registraci</string> <string name="auth_recaptcha_message">Tento domovský server by se rád přesvědčil, že nejste robot</string> <string name="auth_username_in_use">Uživatelské jméno již použito</string> - <string name="auth_home_server">Domácí server:</string> + <string name="auth_home_server">Domovský server:</string> <string name="auth_identity_server">Server identity:</string> <string name="auth_reset_password_next_step_button">Ověřil/a jsem svoji e-mailovou adresu</string> <string name="auth_reset_password_message">K resetování hesla zadejte e-mailovou adresu spojenou s vaším účtem:</string> @@ -775,7 +775,7 @@ <string name="review">Přehled</string> <string name="people_no_identity_server">Není konfigurován žádný ověřovací server.</string> <string name="call_failed_no_ice_title">Volání se nezdařilo kvůli chybné konfiguraci serveru</string> - <string name="call_failed_no_ice_description">Prosím, požádejte administrátora homeserveru (%1$s) o konfiguraci TURN serveru, aby hovory fungovaly spolehlivě. + <string name="call_failed_no_ice_description">Prosím, požádejte administrátora domovského serveru (%1$s) o konfiguraci TURN serveru, aby hovory fungovaly spolehlivě. \n \nPřípadně můžete zkusit použít veřejný server %2$s, ale nebude tak spolehlivý a budu sdílet Vaši IP adresu s tímto serverem. V nastavení lze toto změnit.</string> <string name="call_failed_no_ice_use_alt">Zkuste použít %s</string> @@ -787,10 +787,10 @@ <string name="auth_add_email_and_phone_message_2">Nastavte e-mail pro obnovení účtu. Použijte e-mail nebo telefonní číslo volitelně později, aby je našli lidé, kteří vás znají.</string> <string name="login_error_unknown_host">Toto URL není dostupné, prosím, prověřte</string> <string name="login_error_no_homeserver_found">To není platná adresa Matrix serveru</string> - <string name="login_error_homeserver_not_found">Homeserver není dostupný na tomto URL, prosím, prověřte</string> + <string name="login_error_homeserver_not_found">Domovský server není dostupný na této adrese, zkontrolujte ji prosím</string> <string name="login_error_ssl_handshake">Vaše zařízení používá zastaralý bezpečnostní protokol TLS, zranitelný útokem, pro Vaše bezpečí se nebudete moci spojit</string> <string name="settings_call_ringtone_use_default_stun">Povolit server fallback call assist</string> - <string name="settings_call_ringtone_use_default_stun_sum">Použiiji %s jako nápomoc, pokud Váš homeserver žádnou nenabízí (Vaše IP adresa bude sdělena během hovoru)</string> + <string name="settings_call_ringtone_use_default_stun_sum">Použiiji %s jako nápomoc, pokud Váš domovský server žádnou nenabízí (Vaše IP adresa bude sdělena během hovoru)</string> <string name="invite_no_identity_server_error">Pro provedení této akce přidat server identit v nastavení.</string> <string name="settings_add_3pid_confirm_password_title">Potvrďte své heslo</string> <string name="template_settings_add_3pid_flow_not_supported">Nelze provést z ${app_name} mobile</string> @@ -841,8 +841,8 @@ \nTato chyba je mimo kontrolu ${app_name}u. V telefonu není žádný účet Google. Prosím, spusťte správce účtů a doplňte účet Google.</string> <string name="settings_troubleshoot_test_fcm_failed_account_missing_quick_fix">Přidat účet</string> <string name="settings_troubleshoot_test_token_registration_title">Registrace tokenu</string> - <string name="settings_troubleshoot_test_token_registration_success">FCM token se podařilo úspěšné registrovat na homeserveru.</string> - <string name="settings_troubleshoot_test_token_registration_failed">Registrace FCM tokenu na homeserveru se nezdařila: + <string name="settings_troubleshoot_test_token_registration_success">FCM token se podařilo úspěšné registrovat na domovském serveru.</string> + <string name="settings_troubleshoot_test_token_registration_failed">Registrace FCM tokenu na domovském serveru se nezdařila: \n%1$s</string> <string name="settings_troubleshoot_test_foreground_service_started_title">Služba oznámení</string> <string name="settings_troubleshoot_test_foreground_service_startedt_success">Služba oznámení je v chodu.</string> @@ -870,10 +870,10 @@ <string name="settings_notification_privacy_normal">Normální</string> <string name="settings_notification_privacy_reduced">Snížené soukromí</string> <string name="settings_notification_privacy_need_permission">Aplikaci potřebuje svolení k chodu na pozadí</string> - <string name="settings_notification_privacy_no_background_sync">Aplikace na pozadí opravdu <b>nepotřebuje</b> spojení k homeserveru, to by mělo snížit spotřebu</string> + <string name="settings_notification_privacy_no_background_sync">Aplikace na pozadí opravdu <b>nepotřebuje</b> spojení k domovskému serveru, to by mělo snížit spotřebu</string> <string name="settings_notification_privacy_fcm">• Oznámení se posílají pomocí Firebase Cloud Messaging</string> <string name="settings_notification_privacy_metadata">• Oznámení pouze obsahují metadata</string> - <string name="settings_notification_privacy_secure_message_content">• Obsah oznámení je <b>bezpečně uložen přímo na homeserveru Matrixu</b></string> + <string name="settings_notification_privacy_secure_message_content">• Obsah oznámení je <b>bezpečně uložen přímo na domovském serveru Matrixu</b></string> <string name="settings_notification_privacy_nosecure_message_content">• Oznámení obsahují <b>metadata a data zprávy</b></string> <string name="settings_notification_privacy_message_content_not_shown">• Oznámení <b>neukážou obsah zprávy</b></string> <string name="settings_notification_ringtone">Zvuk oznámení</string> @@ -937,7 +937,7 @@ <string name="settings_pin_unread_messages">Připnout místnosti s nepřečtenými zprávami</string> <string name="settings_devices_list">Relace</string> <string name="settings_inline_url_preview">Interní náhled URL</string> - <string name="settings_inline_url_preview_summary">Náhled odkazů v chatu, pokud Váš homeserver podporuje tuto funkci.</string> + <string name="settings_inline_url_preview_summary">Náhled odkazů v chatu, pokud Váš domovský server podporuje tuto funkci.</string> <string name="settings_send_typing_notifs">Poslat oznámení o psaní</string> <string name="settings_send_typing_notifs_summary">Dejte ostatním vědět, že právě píšete.</string> <string name="settings_send_markdown">Formát markdown</string> @@ -956,8 +956,8 @@ <string name="settings_send_message_with_enter_summary">Tlačítko enter na dotykové klávesnici odešle zprávu místo nového řádku</string> <string name="settings_deactivate_account_section">Deaktivace účtu</string> <string name="settings_deactivate_my_account">Deaktivovat můj účet</string> - <string name="settings_discovery_category">Odhalení</string> - <string name="settings_discovery_manage">Správa Vašich nastaveni pro odhalení.</string> + <string name="settings_discovery_category">Objevování</string> + <string name="settings_discovery_manage">Správa Vašich nastavení pro objevování.</string> <string name="startup_notification_privacy_title">Soukromí ohledně oznámení</string> <string name="template_startup_notification_privacy_message">${app_name} může běžet na pozadí, aby spravoval Vaše oznámení bezpečně a v soukromí. To může mít vliv na baterii.</string> <string name="startup_notification_privacy_button_grant">Udělit oprávnění</string> @@ -985,7 +985,7 @@ <string name="devices_delete_pswd">Heslo:</string> <string name="devices_delete_submit_button_label">Odeslat</string> <string name="settings_logged_in">Přihlášen jako</string> - <string name="settings_home_server">Home server</string> + <string name="settings_home_server">Domovský server</string> <string name="settings_identity_server">Server identit</string> <string name="settings_integration_allow">Povolit integrace</string> <string name="settings_integration_manager">Správce integrací</string> @@ -1183,8 +1183,8 @@ \nNeznámé relace:</string> <string name="select_room_directory">Vybrat adresář místností</string> <string name="directory_server_fail_to_retrieve_server">Server je partně nedostupný nebo přetížený</string> - <string name="directory_server_type_homeserver">Zadejte homeserver, z něhož si žádáte seznam veřejných místností</string> - <string name="directory_server_placeholder">URL homeserveru</string> + <string name="directory_server_type_homeserver">Zadejte domovský server, z něhož si žádáte seznam veřejných místností</string> + <string name="directory_server_placeholder">Adresa domovského serveru</string> <string name="directory_server_all_rooms_on_server">Všechny místnosti na serveru %s</string> <string name="directory_server_native_rooms">Všech %s vlastních místností</string> <string name="lock_screen_hint">Zadat zde…</string> @@ -1343,7 +1343,7 @@ <string name="receipt_avatar">Avatar přijetí</string> <string name="notice_avatar">Avatar vypovězení</string> <string name="avatar">Avatar</string> - <string name="dialog_user_consent_content">Abyste mohli dále používat homeserver %1$s, musíte prohlédnout všeobecné podmínky a souhlasit s nimi.</string> + <string name="dialog_user_consent_content">Abyste mohli dále používat domovský server %1$s, musíte prohlédnout všeobecné podmínky a souhlasit s nimi.</string> <string name="dialog_user_consent_submit">Prohlédnout nyní</string> <string name="deactivate_account_title">Deaktivovat účet</string> <string name="deactivate_account_content">To učiní Váš účet trvale nepoužitelným. Nebudete se moci přihlásit a nikdo nebude moci registrovat stejné uživatelské ID. Způsobí odchod Vašeho účtu ze všech místností, jichž se účastní a odstraní podrobnosti Vašeho účtu z ověřovacího serveru. <b>Tato akce je nevratná</b>. @@ -1363,15 +1363,15 @@ <string name="resource_limit_exceeded_title">Mez zdrojů překročena</string> <string name="resource_limit_contact_action">Kontaktovat správce</string> <string name="resource_limit_contact_admin">kontaktovat Vašeho správce služby</string> - <string name="resource_limit_soft_default">Tento homeserver překročil jednu ze svých mezí zdrojů, a tak <b>se někteří uživatelé nebudou moci přihlásit</b>.</string> - <string name="resource_limit_hard_default">Tento homeserver překročil jednu ze svých mezí zdrojů.</string> - <string name="resource_limit_soft_mau"> Tent homeserver narazil na svoji měsíční mez aktivních uživatelů, a tak <b>se někteří uživatelé nebudou moci přihlásit</b>.</string> - <string name="resource_limit_hard_mau">Tento homeserver narazil na svoji měsíční mez aktivních uživatelů.</string> + <string name="resource_limit_soft_default">Tento domovský server překročil jednu ze svých mezí zdrojů, a tak <b>se někteří uživatelé nebudou moci přihlásit</b>.</string> + <string name="resource_limit_hard_default">Tento domovský server překročil jednu ze svých mezí zdrojů.</string> + <string name="resource_limit_soft_mau"> Tent domovský server narazil na svoji měsíční mez aktivních uživatelů, a tak <b>se někteří uživatelé nebudou moci přihlásit</b>.</string> + <string name="resource_limit_hard_mau">Tento domovský server narazil na svoji měsíční mez aktivních uživatelů.</string> <string name="resource_limit_soft_contact">Prosím, %s, aby zvýšili mez.</string> <string name="resource_limit_hard_contact">Prosím, %s, abyste mohli službu dále používate.</string> <string name="settings_lazy_loading_title">Pomalé načítání členů místností</string> <string name="settings_lazy_loading_description">Zvýší výkon tím, že načte členy místnosti při prvním náhledu.</string> - <string name="error_lazy_loading_not_supported_by_home_server">Váš homeserver dosud nepodporuje pomalé načtení členů místností. Zkuste později.</string> + <string name="error_lazy_loading_not_supported_by_home_server">Váš domovský server dosud nepodporuje pomalé načtení členů místností. Zkuste později.</string> <string name="unknown_error">Omlouváme se, došlo k chybě</string> <string name="merged_events_expand">rozbalit</string> <string name="merged_events_collapse">sbalit</string> @@ -1399,7 +1399,7 @@ <string name="keys_backup_setup">Začít používat zálohu klíčů</string> <string name="keys_backup_setup_step1_advanced">(Pokročilé)</string> <string name="keys_backup_setup_step2_text_title">Zabezpečit zálohu přístupovou frází.</string> - <string name="keys_backup_setup_step2_text_description">Uložíme zašifrovanou kopii Vašich klíčů na Vašem homeserveru. Chraňte svoji zálohu přístupovou frází, abyste ji udrželi v bezpečí. + <string name="keys_backup_setup_step2_text_description">Uložíme zašifrovanou kopii Vašich klíčů na Vašem domovském serveru. Chraňte svoji zálohu přístupovou frází, abyste ji udrželi v bezpečí. \n \nZ důvodu nejvyšší bezpečnosti by se měla lišit od hesla účtu.</string> <string name="keys_backup_setup_step2_button_title">Nastavit přístupovou frází</string> @@ -1418,7 +1418,7 @@ <string name="recovery_key_export_saved_as_warning">Klíč obnovy byl uložen do %s\'. \n \nVarování: může dojít ke smazání tohoto souboru, pokud odstraníte aplikaci.</string> - <string name="keys_backup_setup_override_backup_prompt_tile">Záloha již existuje na Vašem homeserveru</string> + <string name="keys_backup_setup_override_backup_prompt_tile">Záloha již existuje na Vašem domovském serveru</string> <string name="keys_backup_setup_override_backup_prompt_description">Vypadá to, že jste již nastavili zálohu klíče z jiné relace. Chcete ji nahradit zálohou, již právě provádíte\?</string> <string name="keys_backup_setup_override_replace">Nahradit</string> <string name="keys_backup_setup_override_stop">Zastavit</string> @@ -1480,7 +1480,7 @@ <string name="keys_backup_info_title_version">Verze</string> <string name="keys_backup_info_title_algorithm">Algoritmus</string> <string name="keys_backup_info_title_signature">Podpis</string> - <string name="autodiscover_invalid_response">Neplatná odpověď z hledání homeserverů</string> + <string name="autodiscover_invalid_response">Neplatná odpověď z hledání domovských serverů</string> <string name="autodiscover_well_known_autofill_dialog_title">Volby serveru automaticky</string> <string name="template_autodiscover_well_known_autofill_dialog_message">${app_name} nalezl vlastní konfiguraci serveru pro doménu Vašeho uživatelského Id \"%1$s\": \n%2$s</string> @@ -1525,7 +1525,7 @@ <string name="sas_error_unknown">Neznámá chyba</string> <string name="identity_server_not_defined">Nepoužíváte žádný server pro identity</string> <string name="identity_server_not_defined_for_password_reset">Není konfigurován žádný server pro identity, musíte přenastavit heslo.</string> - <string name="error_user_already_logged_in">Vypadá to, že se chcete připojit k jinému homeserveru. Chcete se odhlásit\?</string> + <string name="error_user_already_logged_in">Vypadá to, že se chcete připojit k jinému domovskému serveru. Chcete se odhlásit\?</string> <string name="edit">Upravit</string> <string name="reply">Odpovědět</string> <string name="global_retry">Opakovat</string> @@ -1606,7 +1606,7 @@ <string name="edited_suffix">(upraveno)</string> <string name="message_edits">Úpravy zpráv</string> <string name="no_message_edits_found">Úpravy nenalezeny</string> - <string name="room_filtering_filter_hint">Vytřídit konverzace…</string> + <string name="room_filtering_filter_hint">Filtrovat konverzace…</string> <string name="room_filtering_footer_title">Nemůžete najít, co hledáte\?</string> <string name="room_filtering_footer_create_new_room">Založit novou místnost</string> <string name="room_filtering_footer_create_new_direct_message">Poslat novou přímou zprávu</string> @@ -1649,7 +1649,7 @@ <string name="settings_agree_to_terms">Souhlaste se všeobecnými podmínkami serveru identit (%s), abyste byli k nalezení podle emailové adresy nebo telefonního čísla.</string> <string name="labs_allow_extended_logging">Zapnout podrobné záznamy.</string> <string name="labs_allow_extended_logging_summary">Podrobné záznamy pomohou vývojářům mnoha podrobnostmi, odešlete-li RageShake. I když jsou zapnuty, aplikace nezaznamenává obsah zpráv nebo jakákoli soukromá data.</string> - <string name="error_terms_not_accepted">Prosím, opakujte, jakmile jste přijali všeobecné podmínky svého homeserveru.</string> + <string name="error_terms_not_accepted">Prosím, opakujte, jakmile jste přijali všeobecné podmínky svého domovského serveru.</string> <string name="error_network_timeout">Vypadá to, že serveru dlouho trvá odpovědět, to může být způsobeno buď slabým spojením nebo chybou na serveru. Prosím, opakujte za chvíli.</string> <string name="send_attachment">Poslat přílohu</string> <string name="a11y_open_drawer">Otevřít navigační zásuvku</string> @@ -1746,7 +1746,7 @@ \n \nChcete se přihlásit webovým klientem\?</string> <string name="login_registration_disabled">Omlouváme se, tento server již nepřijímá nové účty.</string> - <string name="login_registration_not_supported">Aplikace nemůže založit účet na tomto homeserveru. + <string name="login_registration_not_supported">Aplikace nemůže založit účet na tomto domovském serveru. \n \nChcete se přihlásit webovým klientem\?</string> <string name="login_login_with_email_error">Tato emailová adresa se nevztahuje k žádnému účtu.</string> @@ -1799,15 +1799,15 @@ \nZastavit registrační proces\?</string> <string name="login_a11y_choose_matrix_org">Vybrat matrix.org</string> <string name="login_a11y_choose_modular">Vybrat Element Matrix Services</string> - <string name="login_a11y_choose_other">Vybrat upravený homeserver</string> + <string name="login_a11y_choose_other">Vybrat vlastní domovský server</string> <string name="login_a11y_captcha_container">Prosím, proveďte vybídnutí captcha</string> <string name="login_terms_title">Přijmout všeobecné podmínky a pokračovat</string> <string name="login_wait_for_email_title">Prosím, nahlédněte do svého emailu</string> <string name="login_wait_for_email_notice">Právě jsme odeslali email na %1$s. \nNež budete pokračovat se založením účtu, prosím, klikněte na odkaz v něm obsažený.</string> <string name="login_validation_code_is_not_correct">Zadaný kód není správný. Prosím, zkontrolujte.</string> - <string name="login_error_outdated_homeserver_title">Zastaralý homeserver</string> - <string name="login_error_outdated_homeserver_content">Tento homeserver používá za účelem spojení příliš starou verzi. Požádejte správce, aby provedl aktualizaci.</string> + <string name="login_error_outdated_homeserver_title">Zastaralý domovský server</string> + <string name="login_error_outdated_homeserver_content">Tento domovský server používá za účelem spojení příliš starou verzi. Požádejte správce, aby provedl aktualizaci.</string> <plurals name="login_error_limit_exceeded_retry_after"> <item quantity="one">Bylo odesláno příliš mnoho požadavků. Můžete opakovat za %1$d vteřinu…</item> <item quantity="few">Bylo odesláno příliš mnoho požadavků. Můžete opakovat za %1$d vteřiny…</item> @@ -1825,7 +1825,7 @@ <string name="signed_out_submit">Znovu se přihlásit</string> <string name="soft_logout_title">Právě jste se odhlásili</string> <string name="soft_logout_signin_title">Přihlásit se</string> - <string name="soft_logout_signin_notice">Správce Vašeho homeserveru (%1$s) Vás odhlásil z Vašeho účtu %2$s (%3$s).</string> + <string name="soft_logout_signin_notice">Správce Vašeho domovského serveru (%1$s) Vás odhlásil z Vašeho účtu %2$s (%3$s).</string> <string name="soft_logout_signin_e2e_warning_notice">Přihlašte se, abyste získali přístup k šifrovacím klíčům uloženým výlučně v tomto zařízení. Potřebujete je ke čtení všech svých zpráv na jakémkoli zařízení.</string> <string name="soft_logout_signin_submit">Přihlásit</string> <string name="soft_logout_clear_data_title">Vyčistit osobní údaje</string> @@ -1870,8 +1870,8 @@ <string name="verification_conclusion_not_secure">Nezabezpečené</string> <string name="verification_conclusion_compromised">Něco z následujích je patrně narušeno: \n -\n- Váš homeserver -\n- Homeserver uživatele, jejž právě ověřujete +\n- Váš domovský server +\n- Domovský server uživatele, jejž právě ověřujete \n- Spojení do internetu Vaše či dalších uživatelů \n- Zařízení Vaše či dalších uživatelů</string> <string name="sent_a_video">Video.</string> @@ -2043,7 +2043,7 @@ <string name="verify_not_me_self_verification">Jedno z následujících může být ohroženo: \n \n- Vaše heslo -\n- Váš homeserver +\n- Váš domovský server \n- Toto zařízení nebo to druhé \n- Spojení do internetu obou zařízení \n @@ -2144,7 +2144,7 @@ <string name="login_connect_using_matrix_id_notice">Jinak, máte-li již účet a znáte-li svůj identifikátor a heslo, můžete použít tuto metodu:</string> <string name="login_connect_using_matrix_id_submit">Přihlásit se s mým identifikátorem Matrixu</string> <string name="login_signin_matrix_id_title">Přihlásit se</string> - <string name="login_signin_matrix_id_notice">Pokud založíte účet na homeserveru, použijte své Matrix ID (např. @user:domain.com) a heslo níže.</string> + <string name="login_signin_matrix_id_notice">Pokud založíte účet na domovském serveru, použijte své Matrix ID (např. @user:domain.com) a heslo níže.</string> <string name="login_signin_matrix_id_hint">Identifikátor uživatele</string> <string name="login_signin_matrix_id_error_invalid_matrix_id">To není platný identifikátor uživatele. Platný formát: \'@uživatel:homeserver.org\'</string> <string name="autodiscover_well_known_error">Nemohu najít platný domovský server. Prosím, zkontrolujte svůj identifikátor</string> @@ -2229,7 +2229,7 @@ <string name="bottom_action_notification">Oznámení</string> <string name="template_call_failed_no_connection">Volání ${app_name}u se nezdařilo</string> <string name="call_failed_no_connection_description">Založit spojení v reálném čase se nezdařilo. -\nProsím, požádejte správce svého homeserveru o konfiguraci TURN serveru, aby volání fungovala spolehlivě.</string> +\nProsím, požádejte správce svého domovského serveru o konfiguraci TURN serveru, aby volání fungovala spolehlivě.</string> <string name="call_select_sound_device">Vybrat zvukové zařízení</string> <string name="sound_device_phone">Telefon</string> <string name="sound_device_speaker">Reproduktor</string> @@ -2458,7 +2458,7 @@ \n \nVaše zprávy jsou zabezpečeny zámky a pouze Vy a příjemce máte jedinečné klíče k jejich odemknutí.</string> <string name="direct_room_profile_not_encrypted_subtitle">Zprávy zde nejsou e2e šifrovány.</string> - <string name="login_error_outdated_homeserver_warning_content">Tento homeserver používá starou verzi. Požádejte správce svého homeserveru o aktualizaci. Můžete pokračovat, ale některé funkce možná nebudou správně pracovat.</string> + <string name="login_error_outdated_homeserver_warning_content">Tento domovský server používá starou verzi. Požádejte správce svého domovského serveru o aktualizaci. Můžete pokračovat, ale některé funkce možná nebudou správně pracovat.</string> <string name="direct_room_join_rules_invite_by_you">Omezili jste na pouze pro pozvané.</string> <string name="direct_room_join_rules_invite">%1$s omezili na pouze pro pozvané.</string> <string name="room_list_quick_actions_low_priority_remove">Odebrat z nízké priority</string> @@ -2521,7 +2521,7 @@ <string name="create_room_alias_empty">Prosím, zadejte adresu místnosti</string> <string name="create_room_alias_already_in_use">Tato adresa je již obsazena</string> <string name="create_room_alias_hint">Adresa místnosti</string> - <string name="create_room_disable_federation_description">Můžete zapnout, pokud bude tato místnost využita pro spolupráci interních týmů na Vašem homeserveru. Později nelze změnit.</string> + <string name="create_room_disable_federation_description">Můžete zapnout, pokud bude tato místnost využita pro spolupráci interních týmů na Vašem domovském serveru. Později nelze změnit.</string> <string name="create_room_disable_federation_title">Trvale blokovat vstup do této místnosti všem, kdo nejsou členy %s</string> <string name="hide_advanced">Skrýt pokročilé</string> <string name="show_advanced">Ukázat pokročilé</string> @@ -2571,7 +2571,7 @@ <string name="room_alias_action_publish">Zveřejnit tuto adresu</string> <string name="room_alias_local_address_add">Přidat lokální adresu</string> <string name="room_alias_local_address_empty">Tato místnost nemá žádné lokální adresy</string> - <string name="room_alias_local_address_subtitle">Nastavte adresy pro tuto místnost, aby uživatelé mohli tuto místnost nalézt přes Váš homeserver (%1$s)</string> + <string name="room_alias_local_address_subtitle">Nastavte adresy pro tuto místnost, aby uživatelé mohli tuto místnost nalézt přes Váš domovský server (%1$s)</string> <string name="room_alias_local_address_title">Lokální adresa</string> <string name="room_alias_address_hint">Nová zveřejněná adresa (např. #alias:server)</string> <string name="room_alias_address_empty">Zatím žádné zveřejněné adresy.</string> @@ -2726,7 +2726,7 @@ <string name="event_status_sent_message">Zpráva odeslána</string> <string name="a11y_unchecked">Neoznačeno</string> <string name="labs_use_restricted_join_rule">Experimentální, prostor - omezená místnost.</string> - <string name="spaces_beta_welcome_to_spaces_desc">Prostory jsou způsob organizace místností a lidí k práci, zábavě anebo jen pro Vás.</string> + <string name="spaces_beta_welcome_to_spaces_desc">Prostory představují nový způsob seskupování místností a osob.</string> <string name="create_spaces_room_private_header_desc">Založme pro každé místnost. Později můžete přidat i další, včetně již existujících.</string> <string name="create_spaces_room_private_header">Na jakých tématech pracujete\?</string> <string name="create_spaces_room_public_header_desc">Založíme pro ně místnosti. Můžete přidat další později.</string> @@ -2824,4 +2824,39 @@ <string name="send_file_step_compressing_image">Komprimuji obrázek…</string> <string name="use_as_default_and_do_not_ask_again">Použít výchozí a dále se neptat</string> <string name="option_always_ask">Vždy se dotázat</string> + <string name="this_space_has_no_rooms_admin">Některé místnosti mohou být skryté, protože jsou soukromé a potřebujete pozvánku.</string> + <string name="this_space_has_no_rooms_not_admin">Některé místnosti mohou být skryté, protože jsou soukromé a potřebujete pozvánku. +\nK přidávání místností nemáte oprávnění.</string> + <string name="this_space_has_no_rooms">Tento prostor nemá žádné místnosti</string> + <string name="spaces_no_server_support_description">Další informace získáte od správce domovského serveru</string> + <string name="spaces_no_server_support_title">Vypadá to, že váš domovský server zatím Prostory nepodporuje</string> + <string name="spaces_feeling_experimental_subspace">Chcete experimentovat\? +\nDo prostoru můžete přidat existující prostory.</string> + <string name="labs_space_show_orphan_in_home">Experimentální prostor - Zobrazit pouze sirotky v Domově</string> + <string name="space_add_rooms">Přidat místnosti</string> + <string name="space_leave_prompt_msg_as_admin">Jste administrátorem tohoto prostoru, ujistěte se, že jste před odchodem převedli administrátorská práva na jiného člena.</string> + <string name="space_leave_prompt_msg_private">Tento prostor není veřejný. Bez pozvánky se do něj nebudete moci znovu připojit.</string> + <string name="space_leave_prompt_msg_only_you">Jste tu jediný člověk. Pokud odejdete, nikdo se k vám v budoucnu nebude moci připojit, včetně vás.</string> + <string name="invite_to_space">Pozvat do %s</string> + <string name="a11y_beta">Tato funkce je ve fázi beta</string> + <string name="give_feedback">Poskytněte zpětnou vazbu</string> + <string name="feedback_failed">Zpětnou vazbu se nepodařilo odeslat (%s)</string> + <string name="feedback_sent">Děkujeme, vaše zpětná vazba byla úspěšně odeslána</string> + <string name="you_may_contact_me">V případě dalších dotazů se na mě můžete obrátit</string> + <string name="send_feedback_space_info">Používáte beta verzi prostorů. Vaše zpětná vazba pomůže při tvorbě dalších verzí. Vaše platforma a uživatelské jméno budou zaznamenány, abychom mohli vaši zpětnou vazbu co nejlépe využít.</string> + <string name="feedback">Zpětná vazba</string> + <string name="send_feedback_space_title">Zpětná vazba prostorů</string> + <string name="error_jitsi_join_conf">Omlouváme se, při pokusu o připojení ke konferenci došlo k chybě</string> + <string name="unnamed_room">Nepojmenovaná místnost</string> + <string name="private_space">Soukromý prostor</string> + <string name="public_space">Veřejný prostor</string> + <string name="a11y_public_space">Tento Prostor je veřejný</string> + <string name="call_transfer_unknown_person">Neznámá osoba</string> + <string name="call_transfer_transfer_to_title">Převod na %1$s</string> + <string name="call_transfer_consulting_with">Konzultace s %1$s</string> + <string name="directory_add_a_new_server_error_already_added">Tento server je již uveden v seznamu</string> + <string name="directory_add_a_new_server_error">Nelze najít tento server nebo jeho seznam místností</string> + <string name="directory_add_a_new_server_prompt">Zadejte název nového serveru, který chcete prozkoumat.</string> + <string name="directory_add_a_new_server">Přidat nový server</string> + <string name="directory_your_server">Váš server</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml index 03e03cb845..fa6d20d007 100644 --- a/vector/src/main/res/values-de/strings.xml +++ b/vector/src/main/res/values-de/strings.xml @@ -280,7 +280,7 @@ <string name="call_notification_reject">Ablehnen</string> <string name="call_notification_hangup">Anruf beenden</string> <!-- button names --> - <string name="ok">OK</string> + <string name="ok">Ok</string> <string name="cancel">Abbrechen</string> <string name="save">Speichern</string> <string name="leave">Verlassen</string> @@ -292,22 +292,22 @@ <string name="later">Später</string> <string name="forward">Weiterleiten</string> <string name="permalink">Permalink</string> - <string name="view_source">Quellcode anzeigen</string> - <string name="view_decrypted_source">Entschlüsselten Quellcode anzeigen</string> + <string name="view_source">Rohdaten anzeigen</string> + <string name="view_decrypted_source">Entschlüsselte Rohdaten anzeigen</string> <string name="delete">Löschen</string> <string name="rename">Umbenennen</string> <string name="report_content">Inhalt melden</string> <string name="active_call">Aktives Gespräch</string> - <string name="ongoing_conference_call">Konferenzgespräch läuft. + <string name="ongoing_conference_call">Laufendes Konferenzgespräch \nPer %1$s oder %2$s beitreten</string> <string name="ongoing_conference_call_voice">Sprache</string> <string name="ongoing_conference_call_video">Video</string> - <string name="cannot_start_call">Das Gespräch kann nicht gestartet werden, bitte später erneut versuchen</string> + <string name="cannot_start_call">Das Gespräch kann nicht gestartet werden, bitte versuche es später erneut</string> <string name="missing_permissions_warning">Aufgrund fehlender Berechtigungen stehen einige Funktionen eventuell nicht zur Verfügung…</string> - <string name="missing_permissions_to_start_conf_call">Ihnen fehlt die Berechtigung, ein Konferenzgespräch in diesem Raum zu starten</string> + <string name="missing_permissions_to_start_conf_call">Du kannst in diesem Raum keine Videokonferenz starten</string> <string name="missing_permissions_title_to_start_conf_call">Kann Gespräch nicht starten</string> <string name="device_information">Sitzungsinformationen</string> - <string name="room_no_conference_call_in_encrypted_rooms">Konferenzgespräche werden in verschlüsselten Räumen nicht unterstützt</string> + <string name="room_no_conference_call_in_encrypted_rooms">Konferenzgespräche in verschlüsselten Räumen werden nicht unterstützt</string> <string name="send_anyway">Trotzdem senden</string> <string name="or">oder</string> <string name="invite">Einladen</string> @@ -350,7 +350,7 @@ <string name="rooms_header">Räume</string> <string name="rooms_directory_header">Raumverzeichnis</string> <string name="no_room_placeholder">Keine Räume</string> - <string name="no_public_room_placeholder">Keine öffentl. Räume verfügbar</string> + <string name="no_public_room_placeholder">Keine öffentlichen Räume</string> <plurals name="public_room_nb_users"> <item quantity="one">%d Benutzer</item> <item quantity="other">%d Benutzer</item> @@ -361,12 +361,12 @@ <string name="send_bug_report">Problem melden</string> <string name="send_bug_report_description">Bitte beschreibe das Problem. Was hast du genau gemacht\? Was sollte passieren\? Was ist tatsächlich passiert\?</string> <string name="send_bug_report_placeholder">Problembeschreibung</string> - <string name="send_bug_report_logs_description">Um Probleme diagnostizieren zu können, werden Protokolle dieses Clients zusammen mit dem Fehlerbericht übermittelt. Dieser Fehlerbericht wird, wie die Protokolle und der Screenshot, nicht öffentlich sichtbar sein. Wenn du nur den oben eingegebenen Text senden möchtest, die nachfolgenden Haken entsprechend entfernen:</string> + <string name="send_bug_report_logs_description">Um Probleme diagnostizieren zu können, werden Protokolle des Clients zusammen mit dem Fehlerbericht übermittelt. Dieser Fehlerbericht wird, wie die Protokolle und der Screenshot, nicht öffentlich sichtbar sein. Wenn du nur den oben eingegebenen Text senden möchtest, die nachfolgenden Haken entsprechend entfernen:</string> <string name="send_bug_report_alert_message">Du scheinst dein Telefon frustriert zu schütteln. Möchtest du das Fenster zum Senden eines Fehlerberichts öffnen\?</string> - <string name="send_bug_report_sent">Der Fehlerbericht wurde erfolgreich übermittelt</string> + <string name="send_bug_report_sent">Dein Fehlerbericht wurde erfolgreich übermittelt</string> <string name="send_bug_report_failed">Der Fehlerbericht konnte nicht übermittelt werden (%s)</string> <string name="send_bug_report_progress">Fortschritt (%s%%)</string> - <string name="send_bug_report_app_crashed">Die Anwendung ist während der letzten Benutzung abgestürzt. Möchtest du das Fehler-melden-Fenster öffnen?</string> + <string name="send_bug_report_app_crashed">Die Anwendung ist während der letzten Benutzung abgestürzt. Möchtest du den Fehler melden\?</string> <string name="send_files_in">Sende Datei nach</string> <string name="read_receipt">Gelesen</string> <string name="join_room">Raum betreten</string> @@ -374,8 +374,8 @@ <string name="create_account">Konto erstellen</string> <string name="login">Anmelden</string> <string name="logout">Abmelden</string> - <string name="hs_url">Home-Server-URL</string> - <string name="identity_url">Identitätsserver-URL</string> + <string name="hs_url">Heimserver-Adresse</string> + <string name="identity_url">Identitätsserver-Adresse</string> <string name="search">Suchen</string> <string name="start_new_chat">Neuen Chat starten</string> <string name="start_voice_call">Sprachanruf starten</string> @@ -387,8 +387,8 @@ <string name="auth_register">Konto erstellen</string> <string name="auth_submit">Absenden</string> <string name="auth_skip">Überspringen</string> - <string name="auth_send_reset_email">Rücksetz-E-Mail senden</string> - <string name="auth_return_to_login">Zur Anmeldemaske zurückkehren</string> + <string name="auth_send_reset_email">Reset-E-Mail senden</string> + <string name="auth_return_to_login">Zum Anmeldebildschirm zurückkehren</string> <string name="auth_user_id_placeholder">E-Mail oder Benutzername</string> <string name="auth_password_placeholder">Passwort</string> <string name="auth_new_password_placeholder">Neues Passwort</string> @@ -415,12 +415,12 @@ <string name="auth_use_server_options">Benutzerdefinierte Server-Optionen (erweitert)</string> <string name="auth_email_validation_message">Bitte überprüfe deinen E-Mail-Posteingang, um die Registrierung abzuschließen</string> <string name="auth_threepid_warning_message">Registrierung mit E-Mail und Telefonnummer zusammen wird zurzeit nicht unterstützt, da die zugrundeliegende Schnittstelle noch nicht existiert. Nur die Telefonnummer wird in den Account übernommen.\n\nDu kannst aber deine E-Mail-Adresse in den Einstellungen zu deinem Profil hinzufügen.</string> - <string name="auth_recaptcha_message">Dieser Home-Server möchte sicherstellen, dass du kein Roboter bist</string> - <string name="auth_username_in_use">Benutzername wird schon verwendet</string> - <string name="auth_home_server">Home-Server:</string> + <string name="auth_recaptcha_message">Dieser Homeserver möchte sicherstellen, dass du kein Roboter bist</string> + <string name="auth_username_in_use">Benutzername bereits vergeben</string> + <string name="auth_home_server">Heimserver:</string> <string name="auth_identity_server">Identitätsserver:</string> <string name="auth_reset_password_next_step_button">Ich habe meine E-Mail-Adresse verifiziert</string> - <string name="auth_reset_password_message">Um dein Passwort zurückzusetzen, gib deine mit deinem Account verknüpfte E-Mail-Adresse ein:</string> + <string name="auth_reset_password_message">Um dein Passwort zurückzusetzen, gib die mit deinem Account verknüpfte E-Mail-Adresse ein:</string> <string name="auth_reset_password_missing_email">Die E-Mail-Adresse, die mit deinem Account verknüpft ist, muss eingegeben werden.</string> <string name="auth_reset_password_missing_password">Ein neues Passwort muss eingegeben werden.</string> <string name="auth_reset_password_email_validation_message">Eine E-Mail wurde an %s gesendet. Bitte dem in der E-Mail enthaltenen Link folgen und anschließend unten klicken.</string> @@ -470,7 +470,7 @@ <string name="call_ended">Anruf beendet</string> <string name="call_ring">Es klingelt…</string> <string name="incoming_call">Eingehender Anruf</string> - <string name="incoming_video_call">Eingehender Video-Anruf</string> + <string name="incoming_video_call">Eingehender Videoanruf</string> <string name="incoming_voice_call">Eingehender Sprachanruf</string> <string name="call_in_progress">Anruf aktiv…</string> <string name="call_error_user_not_responding">Die Gegenseite hat den Anruf nicht angenommen.</string> @@ -525,8 +525,8 @@ <string name="room_title_one_member">1 Mitglied</string> <!-- Chat participants --> <string name="room_participants_leave_prompt_title">Raum verlassen</string> - <string name="room_participants_leave_prompt_msg">Bist du sicher, dass du den Raum verlassen möchtest?</string> - <string name="room_participants_remove_prompt_msg">Bist du sicher, dass du %s aus diesem Chat entfernen möchtest?</string> + <string name="room_participants_leave_prompt_msg">Raum wirklich verlassen\?</string> + <string name="room_participants_remove_prompt_msg">%s wirklich aus diesem Chat entfernen möchtest\?</string> <string name="room_participants_create">Erstellen</string> <string name="room_participants_online">Online</string> <string name="room_participants_offline">Offline</string> @@ -548,7 +548,7 @@ <string name="room_participants_invite_search_another_user">Nutzer-ID, Name oder E-Mail-Adresse</string> <string name="room_participants_action_mention">Erwähnen</string> <string name="room_participants_action_devices_list">Sitzungsliste anzeigen</string> - <string name="room_participants_power_level_prompt">Du wirst diese Änderung nicht rückgängig machen können, da der Benutzer dieselbe Berechtigungsstufe wie du erhalten wirst. + <string name="room_participants_power_level_prompt">Du wirst diese Änderung nicht rückgängig machen können, da der Benutzer dieselbe Berechtigungsstufe wie du erhalten wird. \nBist du sicher\?</string> <string name="room_participants_invite_prompt_msg">"Bist du sicher, dass du %s in diesen Chat einladen willst?"</string> <!-- invitation --> @@ -693,7 +693,7 @@ <string name="devices_delete_pswd">Passwort:</string> <string name="devices_delete_submit_button_label">Absenden</string> <string name="settings_logged_in">Angemeldet als</string> - <string name="settings_home_server">Home-Server</string> + <string name="settings_home_server">Heimserver</string> <string name="settings_identity_server">Identitätsserver</string> <string name="account_email_validation_title">Verifizierung ausstehend</string> <string name="account_email_validation_message">Bitte prüfe deinen E-Mail-Posteingang und klicke auf den in der E-Mail enthaltenen Link. Klicke anschließend auf Fortsetzen.</string> @@ -836,7 +836,7 @@ <string name="select_room_directory">Raum-Verzeichnis auswählen</string> <string name="directory_server_fail_to_retrieve_server">Der Server kann nicht verfügbar oder überlastet sein</string> <string name="directory_server_type_homeserver">Gib einen Home-Server ein, um seine öffentlichen Räume aufzulisten</string> - <string name="directory_server_placeholder">Home-Server-URL</string> + <string name="directory_server_placeholder">Server-Name</string> <string name="directory_server_all_rooms_on_server">Alle Räume auf dem %s-Server</string> <string name="directory_server_native_rooms">Alle nativen %s-Räume</string> <!-- historical --> @@ -853,7 +853,7 @@ <string name="media_saving_period_1_month">1 Monat</string> <string name="media_saving_period_forever">Unbegrenzt</string> <string name="offline">Offline</string> - <string name="user_directory_header">Nutzer-Verzeichnis</string> + <string name="user_directory_header">Nutzerverzeichnis</string> <string name="people_search_user_directory">BENUTZER-VERZEICHNIS (%s)</string> <string name="settings_data_save_mode">Datensparsamer Modus</string> <string name="font_size">Schriftgröße</string> @@ -893,7 +893,7 @@ <string name="start_verification">Verifizierung beginnen</string> <string name="call">Anruf</string> <string name="notification_noisy_notifications">Laute Benachrichtigungen</string> - <string name="notification_silent_notifications">Lautlose Benachrichtigungen</string> + <string name="notification_silent_notifications">Stumme Benachrichtigungen</string> <string name="option_take_photo">Foto aufnehmen</string> <string name="option_take_video">Video aufnehmen</string> <string name="settings_labs_native_camera">Systemeigene Kamera verwenden</string> @@ -913,7 +913,7 @@ <string name="encrypted_message">Verschlüsselte Nachricht</string> <string name="title_activity_group_details">Community-Details</string> <string name="loading">Lädt…</string> - <string name="action_exit">Schließen</string> + <string name="action_exit">Beenden</string> <string name="bottom_action_groups">Communities</string> <string name="home_filter_placeholder_groups">Community-Namen filtern</string> <string name="groups_invite_header">Einladen</string> @@ -1006,7 +1006,7 @@ <item quantity="other">%d Mitgliedsänderungen</item> </plurals> <string name="notification_unread_notified_messages_in_room">%1$s in %2$s</string> - <string name="open_chat_header">Öffne Header</string> + <string name="open_chat_header">Header öffnen</string> <string name="receipt_avatar">Profilbild für Lesebestätigungen</string> <string name="notice_avatar">Profilbild für Bemerkungen</string> <string name="settings_notification_privacy">Datenschutz für Benachrichtigungen</string> @@ -1022,8 +1022,8 @@ <string name="template_startup_notification_privacy_message">${app_name} kann im Hintergrund laufen um deine Benachrichtigungen sicher und privat zu verwalten. Dies kann den Energieverbrauch beeinflussen.</string> <string name="startup_notification_privacy_button_grant">Berechtigung gewähren</string> <string name="startup_notification_privacy_button_other">Wähle eine andere Option</string> - <string name="title_activity_choose_sticker">Sende einen Sticker</string> - <string name="option_send_sticker">Sende Sticker</string> + <string name="title_activity_choose_sticker">Sticker senden</string> + <string name="option_send_sticker">Sticker senden</string> <string name="no_sticker_application_dialog_content">Du hast aktuell keine Stickerpakete aktiviert. \n \nMöchtest du welche hinzufügen\?</string> @@ -1050,7 +1050,7 @@ <string name="download">Download</string> <string name="speak">Sprechen</string> <string name="clear">Leeren</string> - <string name="e2e_re_request_encryption_key">Verschlüsselungsschlüssel von deinen anderen Sitzungen erneut anfragen.</string> + <string name="e2e_re_request_encryption_key">Schlüssel von deinen anderen Sitzungen erneut anfordern.</string> <string name="e2e_re_request_encryption_key_sent">Schlüsselanfrage gesendet.</string> <string name="e2e_re_request_encryption_key_dialog_title">Anfrage gesendet</string> <string name="template_e2e_re_request_encryption_key_dialog_content">Bitte öffne ${app_name} auf einem anderen Gerät, das die Nachricht entschlüsseln kann, damit es die Schlüssel an diese Sitzung senden kann.</string> @@ -1171,7 +1171,7 @@ <string name="settings_call_ringtone_title">Klingelton für eingehende Anrufe</string> <string name="settings_call_ringtone_dialog_title">Wähle Klingelton für Anrufe:</string> <string name="accept">Akzeptieren</string> - <string name="auth_accept_policies">Bitte prüfe und akzeptiere die Richtlinien dieses Home-Servers:</string> + <string name="auth_accept_policies">Bitte lese und akzeptiere die Richtlinien dieses Home-Servers:</string> <string name="settings_troubleshoot_diagnostic_run_button_title">Tests ausführen</string> <string name="settings_troubleshoot_diagnostic_running_status">Läuft… (%1$d von %2$d)</string> <string name="settings_troubleshoot_diagnostic_failure_status_with_quickfix">Einer oder mehrere Tests sind fehlgeschlagen. Versuche vorgeschlagene Lösung(en).</string> @@ -1240,8 +1240,8 @@ <string name="account_additional_info">Weitere Information: %s</string> <string name="no_valid_google_play_services_apk">Keine validen Google-Play-Dienste gefunden. Benachrichtigungen könnten nicht richtig funktionieren.</string> <string name="video_call_in_progress">Videogespräch aktiv…</string> - <string name="title_activity_keys_backup_setup">Schlüssel-Sicherung</string> - <string name="title_activity_keys_backup_restore">Schlüssel-Sicherung verwenden</string> + <string name="title_activity_keys_backup_setup">Schlüsselsicherung</string> + <string name="title_activity_keys_backup_restore">Schlüsselsicherung verwenden</string> <string name="keys_backup_is_not_finished_please_wait">Schlüsselsicherung ist nicht abgeschlossen. Bitte warten…</string> <string name="skip">Überspringen</string> <string name="done">Fertig</string> @@ -1297,7 +1297,7 @@ \n \nWarnung: Diese Datei wird gelöscht, wenn die Anwendung deinstalliert wird.</string> <string name="keys_backup_setup_step3_generating_key_status">Wiederherstellungsschlüssel aus Passphrase generieren. Dies kann mehrere Sekunden brauchen.</string> - <string name="keys_backup_setup_backup_started_message">Deine Verschlüsselungsschlüssel werden nun im Hintergrund auf deinem Home-Server gesichert. Die initiale Sicherung kann mehrere Minuten dauern.</string> + <string name="keys_backup_setup_backup_started_message">Deine Schlüssel werden nun im Hintergrund auf deinem Home-Server gesichert. Die initiale Sicherung kann mehrere Minuten dauern.</string> <string name="keys_backup_setup_skip_msg">Du verlierst möglicherweise den Zugang zu deinen Nachrichten, wenn du dich abmeldest oder das Gerät verlierst.</string> <string name="keys_backup_restore_is_getting_backup_version">Rufe Backup-Version ab…</string> <string name="keys_backup_restore_with_passphrase">Nutze deine Wiederherstellungspassphrase, um deinen verschlüsselten Chatverlauf lesen zu können</string> @@ -1331,19 +1331,19 @@ <string name="keys_backup_settings_invalid_signature_from_unverified_device">Die Sicherung hat eine ungültige Signatur von der nicht verifizierten Sitzung %s</string> <string name="keys_backup_get_trust_error">Abfrage der Vertrauensinformationen für die Sicherung fehlgeschlagen (%s).</string> <string name="keys_backup_settings_untrusted_backup">Um die Schlüsselsicherung für diese Sitzung zu verwenden, stelle sie jetzt mit deiner Passphrase oder deinem Wiederherstellungsschlüssel wieder her.</string> - <string name="keys_backup_settings_delete_confirm_message">Deine gesicherten Verschlüsselungsschlüssel vom Server löschen\? Du wirst deinen Wiederherstellungsschlüssel nicht mehr nutzen können, um deinen verschlüsselten Chatverlauf zu lesen.</string> - <string name="sign_out_bottom_sheet_warning_no_backup">Beim Ausloggen gehen deine verschlüsselten Nachrichten verloren</string> - <string name="sign_out_bottom_sheet_warning_backing_up">Schlüssel-Sicherung wird durchgeführt. Wenn du dich jetzt ausloggst, gehen deine verschlüsselten Nachrichten verloren.</string> - <string name="sign_out_bottom_sheet_warning_backup_not_active">Schlüssel-Sicherung sollte bei allen Sitzungen aktiviert sein, um den Verlust verschlüsselter Nachrichten zu verhindern.</string> + <string name="keys_backup_settings_delete_confirm_message">Deine gesicherten Schlüssel vom Server löschen\? Du wirst deinen Wiederherstellungsschlüssel nicht mehr nutzen können, um deinen verschlüsselten Chatverlauf zu lesen.</string> + <string name="sign_out_bottom_sheet_warning_no_backup">Beim Abmelden gehen deine verschlüsselten Nachrichten verloren</string> + <string name="sign_out_bottom_sheet_warning_backing_up">Schlüssel-Sicherung wird durchgeführt. Wenn du dich jetzt abmeldest, gehen deine verschlüsselten Nachrichten verloren.</string> + <string name="sign_out_bottom_sheet_warning_backup_not_active">Schlüsselsicherung sollte bei allen Sitzungen aktiviert sein, um den Verlust verschlüsselter Nachrichten zu verhindern.</string> <string name="sign_out_bottom_sheet_dont_want_secure_messages">Ich möchte meine verschlüsselten Nachrichten nicht</string> <string name="sign_out_bottom_sheet_backing_up_keys">Sichere Schlüssel…</string> - <string name="keys_backup_activate">Schlüssel-Sicherung verwenden</string> + <string name="keys_backup_activate">Schlüsselsicherung verwenden</string> <string name="are_you_sure">Sicher\?</string> <string name="backup">Sicherung</string> - <string name="sign_out_bottom_sheet_will_lose_secure_messages">Alle verschlüsselten Nachrichten gehen verloren, wenn Du dich ausloggst ohne eine Sicherung der Schlüssel gemacht zu haben.</string> + <string name="sign_out_bottom_sheet_will_lose_secure_messages">Alle verschlüsselten Nachrichten gehen verloren, wenn Du dich abmeldest ohne die Schlüssel gesichert zu haben.</string> <string name="stay">Bleiben</string> <string name="abort">Abbrechen</string> - <string name="action_sign_out_confirmation_simple">Sicher, dass du dich ausloggen möchtest\?</string> + <string name="action_sign_out_confirmation_simple">Wirklich abmelden\?</string> <string name="encryption_message_recovery">Wiederherstellung verschlüsselter Nachrichten</string> <string name="error_empty_field_enter_user_name">Bitte gib einen Benutzernamen ein.</string> <string name="settings_data_save_mode_summary">Der datensparsame Modus sorgt dafür, dass die Präsenz- und Tipp-Benachrichtigungen ausgefiltert werden.</string> @@ -1427,10 +1427,10 @@ <string name="error_jitsi_not_supported_on_old_device">Entschuldigung, Konferenzanrufe mit Jitsi werden auf älteren Geräten (mit älteren Android-Versionen als 6.0) nicht unterstützt</string> <string name="title_activity_verify_device">Sitzung verifizieren</string> <string name="encryption_information_unknown_ip">Unbekannte IP-Adresse</string> - <string name="you_added_a_new_device_with_info">Eine neue Sitzung fordert Verschlüsselungsschlüssel an. -\nSitzungsname: %1$s -\nZuletzt gesehen: %2$s -\nWenn du dich nicht mit einer anderen Sitzung angemeldet hast, ignoriere diese Anfrage.</string> + <string name="you_added_a_new_device_with_info">Eine neue Sitzung fordert Schlüssel an. +\nSitzungsname: %1$s +\nZuletzt gesehen: %2$s +\nWenn du nicht mit einer anderen Sitzung angemeldet bist, ignoriere diese Anfrage.</string> <string name="your_unverified_device_requesting_with_info">Eine unverifizierte Sitzung fordert Verschlüsselungs-Schlüssel an. \nSitzungsname: %1$s \nZuletzt gesehen: %2$s @@ -1530,19 +1530,19 @@ <string name="quick_reactions">Schnelle Reaktionen</string> <string name="settings_general_title">Allgemein</string> <string name="settings_preferences">Einstellungen</string> - <string name="settings_security_and_privacy">Sicherheit & Privatsphäre</string> + <string name="settings_security_and_privacy">Sicherheit und Privatsphäre</string> <string name="settings_expert">Experte</string> <string name="settings_push_rules">Push-Regeln</string> <string name="settings_push_rules_no_rules">Keine Push-Regeln definiert</string> <string name="settings_push_gateway_no_pushers">Keine registrierten Push-Gateways</string> - <string name="preference_voice_and_video">Sprache & Video</string> - <string name="preference_root_help_about">Hilfe & Über</string> + <string name="preference_voice_and_video">Sprache und Video</string> + <string name="preference_root_help_about">Hilfe und Über</string> <string name="settings_troubleshoot_test_token_registration_quick_fix">Token registrieren</string> <string name="send_suggestion">Mache einen Vorschlag</string> <string name="send_suggestion_content">Bitte schreibe unten deine Anmerkungen.</string> <string name="send_suggestion_report_placeholder">Beschreibe hier deine Anmerkung</string> <string name="settings_labs_show_hidden_events_in_timeline">Versteckte Ereignisse in der Zeitleiste anzeigen</string> - <string name="bottom_action_people_x">Direkte Nachrichten</string> + <string name="bottom_action_people_x">Direktnachrichten</string> <string name="send_file_step_idle">Warten…</string> <string name="send_file_step_encrypting_thumbnail">Miniaturbild wird verschlüsselt…</string> <string name="send_file_step_encrypting_file">Datei wird verschlüsselt…</string> @@ -1580,7 +1580,7 @@ <string name="none">Keine</string> <string name="revoke">Widerrufen</string> <string name="disconnect">Trennen</string> - <string name="people_no_identity_server">Kein Integrationsserver konfiguriert.</string> + <string name="people_no_identity_server">Kein Identitätsserver konfiguriert.</string> <string name="call_failed_no_ice_title">Anruf aufgrund eines falsch konfigurierten Servers fehlgeschlagen</string> <string name="call_failed_no_ice_use_alt">Versuche es mit %s</string> <string name="call_failed_dont_ask_again">Nicht erneut fragen</string> @@ -1618,13 +1618,13 @@ <string name="settings_discovery_mail_pending">ausstehend</string> <string name="settings_discovery_enter_identity_server">Gib einen neuen Identitätsserver ein</string> <string name="settings_discovery_bad_identity_server">Konnte keine Verbindung zum Home-Server herstellen</string> - <string name="call_failed_no_ice_description">Bitte frage den Administrator deines Home-Servers (%1$s) nach der Einrichtung eines TURN-Servers, damit Anrufe zuverlässig funktionieren. + <string name="call_failed_no_ice_description">Bitte bitte den Administrator deines Heimservers (%1$s) einen \"TURN-Server\" einzurichten, damit Anrufe zuverlässig funktionieren. \n -\nAlternativ kann ein öffentlicher Server auf %2$s genutzt werden. Dies wird jedoch weniger zuverlässig sein und deine IP-Adresse wird gegenüber diesem Server preisgegeben. Du kannst den Server auch in den Einstellungen anpassen.</string> +\nAlternativ kann ein öffentlicher Server auf %2$s genutzt werden. Dies wird jedoch weniger zuverlässig sein und deine IP-Adresse gegenüber diesem Server preisgeben. Du kannst den Server auch in den Einstellungen anpassen.</string> <string name="login_error_no_homeserver_found">Dies ist keine Adresse eines Matrixservers</string> - <string name="login_error_homeserver_not_found">Kann Home-Server nicht bei dieser URL erreichen. Bitte überprüfen</string> - <string name="settings_call_ringtone_use_default_stun_sum">Wir nutzen %s als Assistenten wenn dein Home-Server keinen anbietet (Deine IP-Adresse wird während des Anrufs geteilt)</string> - <string name="invite_no_identity_server_error">Führe einen Identitätsserver in deinen Einstellungen hinzu um diese Aktion auszuführen.</string> + <string name="login_error_homeserver_not_found">Kann Home-Server nicht unter dieser URL erreichen. Bitte überprüfen</string> + <string name="settings_call_ringtone_use_default_stun_sum">Wir nutzen %s als Ersatz, wenn dein Heimserver keinen anbietet (Deine IP-Adresse wird während des Anrufs geteilt)</string> + <string name="invite_no_identity_server_error">Füge einen Identitätsserver in deinen Einstellungen hinzu, um diese Aktion auszuführen.</string> <string name="settings_add_3pid_confirm_password_title">Passwort bestätigen</string> <string name="template_settings_add_3pid_flow_not_supported">Du kannst dies nicht auf einem mobilen ${app_name} tun</string> <string name="settings_add_3pid_authentication_needed">Authentifizierung benötigt</string> @@ -1774,7 +1774,7 @@ <string name="login_reset_password_email_hint">E-Mail</string> <string name="login_reset_password_password_hint">Neues Passwort</string> <string name="login_reset_password_warning_title">Achtung!</string> - <string name="login_reset_password_warning_content">Eine Änderung deines Passworts wird alle Ende-zu-Ende-Verschlüsselungsschlüssel zurücksetzen. Dein verschlüsselter Chatverlauf wird dadurch unlesbar. Richte eine Schlüsselsicherung ein oder exportiere deine Raumschlüssel von einer anderen Sitzung bevor du dein Passwort zurücksetzt.</string> + <string name="login_reset_password_warning_content">Eine Änderung deines Passworts wird alle Ende-zu-Ende-Schlüssek zurücksetzen. Dein verschlüsselter Chatverlauf wird dadurch unlesbar. Richte die Schlüsselsicherung ein oder exportiere deine Raumschlüssel aus einer anderen Sitzung, bevor du dein Passwort zurücksetzt.</string> <string name="login_reset_password_warning_submit">Fortfahren</string> <string name="login_reset_password_error_not_found">Diese E-Mail-Adresse ist mit keinem Benutzerkonto verknüpft</string> <string name="login_reset_password_mail_confirmation_title">Prüfe deinen Posteingang</string> @@ -1855,18 +1855,18 @@ <string name="soft_logout_title">Du bist abgemeldet</string> <string name="soft_logout_signin_title">Anmelden</string> <string name="soft_logout_signin_notice">Dein Home-Server-Administrator (%1$s) hat dich von deinem Konto %2$s (%3$s) abgemeldet.</string> - <string name="soft_logout_signin_e2e_warning_notice">Melde dich an, um ausschließlich auf diesem Gerät gespeicherte Verschlüsselungsschlüssel wiederherzustellen. Du benötigst sie, um deine verschlüsselten Nachrichten auf jedem Gerät zu lesen.</string> + <string name="soft_logout_signin_e2e_warning_notice">Melde dich an, um ausschließlich auf diesem Gerät gespeicherte Schlüssel wiederherzustellen. Du benötigst sie, um deine verschlüsselten Nachrichten auf jedem Gerät zu lesen.</string> <string name="soft_logout_signin_submit">Anmelden</string> <string name="soft_logout_signin_password_hint">Passwort</string> <string name="soft_logout_clear_data_title">Persönliche Daten löschen</string> - <string name="soft_logout_clear_data_notice">Warnung: Persönliche Daten (einschließlich Verschlüsselungsschlüssel) werden weiterhin auf diesem Gerät gespeichert. -\n + <string name="soft_logout_clear_data_notice">Warnung: Persönliche Daten (einschließlich Schlüssel) werden weiterhin auf diesem Gerät gespeichert. +\n \nDeaktiviere diese Option, wenn dieses Gerät nicht mehr verwendet wird oder sich bei einem anderen Konto angemeldet werden soll.</string> <string name="soft_logout_clear_data_submit">Alle Daten löschen</string> <string name="soft_logout_clear_data_dialog_title">Daten löschen</string> <string name="soft_logout_clear_data_dialog_content">Alle aktuell auf diesem Gerät gespeicherten Daten löschen\? \nMelde dich erneut an, um auf deine Kontodaten und Nachrichten zuzugreifen.</string> - <string name="soft_logout_clear_data_dialog_e2e_warning_content">Du verlierst den Zugriff auf verschlüsselte Nachrichten, außer, du meldest dich an, um den Verschlüsselungsschlüssel wiederherzustellen.</string> + <string name="soft_logout_clear_data_dialog_e2e_warning_content">Du verlierst den Zugriff auf verschlüsselte Nachrichten, außer, du meldest dich an, um den Schlüssel wiederherzustellen.</string> <string name="soft_logout_clear_data_dialog_submit">Daten löschen</string> <string name="template_soft_logout_sso_not_same_user_error">Die aktuelle Sitzung gehört dem Benutzer %1$s. Die angegebenen Anmeldeinformationen sind vom Benutzer %2$s. Dies wird nicht von ${app_name} unterstützt. \nBitte zuerst die Daten löschen und dann erneut anmelden.</string> @@ -2207,21 +2207,21 @@ <string name="dismiss">Ablehnen</string> <string name="dialog_title_success">Erfolg</string> <string name="call_failed_no_connection_description">Echtzeitverbindung konnte nicht hergestellt werden. -\nBitte den Administrator deines Home-Servers, einen TURN-Server so zu konfigurieren, dass Anrufe zuverlässig funktionieren.</string> - <string name="call_select_sound_device">Wähle Audiogerät aus</string> +\nBitte den Administrator deines Home-Servers, einen TURN-Server zu konfigurieren, dass Anrufe zuverlässig funktionieren.</string> + <string name="call_select_sound_device">Audiogerät auswählen</string> <string name="sound_device_phone">Telefonie</string> <string name="sound_device_speaker">Lautsprecher</string> - <string name="sound_device_headset">Headset</string> - <string name="sound_device_wireless_headset">Drahtloses Headset</string> - <string name="call_switch_camera">Wechsle Kamera</string> + <string name="sound_device_headset">Kopfhörer</string> + <string name="sound_device_wireless_headset">Drahtloser Kopfhörer</string> + <string name="call_switch_camera">Kamera wechseln</string> <string name="call_camera_front">Frontkamera</string> <string name="call_camera_back">Hintere Kamera</string> - <string name="call_format_turn_hd_off">Deaktiviere HD-Qualität</string> - <string name="call_format_turn_hd_on">Aktiviere HD-Qualität</string> + <string name="call_format_turn_hd_off">HD-Qualität deaktivieren</string> + <string name="call_format_turn_hd_on">HD-Qualität aktivieren</string> <string name="login_error_ssl_peer_unverified">SSL-Fehler: Die Identität des Gegenüber ist noch nicht verifiziert.</string> <string name="login_error_ssl_other">SSL Fehler.</string> <string name="active_call_with_duration">Aktiver Anruf (%s)</string> - <string name="return_to_call">Zum Anruf zurückkehren</string> + <string name="return_to_call">Zurück zum Anruf</string> <string name="room_participants_action_cancel_invite">Einladung zurückziehen</string> <string name="room_participants_power_level_demote_warning_title">Möchtest du dich zurückstufen\?</string> <string name="room_participants_power_level_demote_warning_prompt">Du kannst die Zurückstufung nicht rückgängig machen und du wirst die Rechte nur mit einem anderen berechtigten Benutzer im Raum zurückerlangen können.</string> @@ -2347,7 +2347,7 @@ <string name="notice_crypto_unable_to_decrypt_final">Du kannst auf diese Nachricht nicht zugreifen</string> <string name="notice_crypto_unable_to_decrypt_friendly">Warte auf diese Nachricht. Das könnte eine Weile dauern</string> <string name="crypto_utd">Kann nicht entschlüsselt werden</string> - <string name="notice_crypto_unable_to_decrypt_friendly_desc">Wegen der Ende-zu-Ende-Verschlüsselung könnte es sein, dass du auf jemandes Nachricht warten musst, weil die Verschlüsselungsschlüssel nicht ordnungsgemäß gesendet worden sind.</string> + <string name="notice_crypto_unable_to_decrypt_friendly_desc">Wegen der Ende-zu-Ende-Verschlüsselung könnte es sein, dass du auf jemandes Nachricht warten musst, weil die Schlüssel nicht ordnungsgemäß gesendet worden sind.</string> <string name="crypto_error_withheld_blacklisted">Du kannst auf diese Nachricht nicht zugreifen, weil der Sender dich blockiert hat</string> <string name="crypto_error_withheld_unverified">Du kannst auf diese Nachricht nicht zugreifen, weil der Sender deiner Sitzung nicht vertraut</string> <string name="crypto_error_withheld_generic">Du kannst auf diese Nachricht nicht zugreifen, weil der Sender absichtlich die Schlüssel nicht gesendet hat</string> @@ -2619,7 +2619,7 @@ <string name="login_social_continue">Oder</string> <string name="default_message_emote_snow">Sendet Schnee ❄️</string> <string name="default_message_emote_confetti">Sendet Konfetti 🎉</string> - <string name="command_snow">Sendet die nachfolgende Nachricht mit Schnee</string> + <string name="command_snow">Nachricht mit Schnee senden</string> <string name="command_confetti">Sendet die nachfolgende Nachricht mit Konfetti</string> <string name="login_clear_homeserver_history">Nachrichtenverlauf bereinigen</string> <string name="login_social_sso">Einmalanmeldung</string> @@ -2757,7 +2757,7 @@ <string name="suggested_rooms_pills_on_empty_header">Willkommen zu %1$s, %2$s.</string> <string name="labs_use_restricted_join_rule_desc">Warnung benötigt Server Unterstützung und eine experimentelle Raumversion</string> <string name="labs_use_restricted_join_rule">Experimenteller Space - Zugangsbeschränkter Raum.</string> - <string name="spaces_beta_welcome_to_spaces_desc">Mit Spaces hast du die Möglichkeit Personen und Räume für die Arbeit, zum Spaß oder nur für dich selbst zu gruppieren.</string> + <string name="spaces_beta_welcome_to_spaces_desc">Mit Spaces hast du die Möglichkeit Personen und Räume zu gruppieren.</string> <string name="spaces_beta_welcome_to_spaces">Sag hallo zu Spaces!</string> <string name="space_add_existing_rooms">Füge bereits existierende Räume und Spaces hinzu</string> <string name="skip_for_now">Vorübergehend überspringen</string> @@ -2813,8 +2813,8 @@ <string name="looking_for_someone_not_in_space">Suchst du jemanden außerhalb %s\?</string> <string name="create_spaces_room_public_header_desc">Wir erstellen dir für jedes einen Raum. Du kannst jederzeit weitere Räume hinzufügen.</string> <string name="space_manage_rooms_and_spaces">Räume und Spaces verwalten</string> - <string name="space_mark_as_suggested">Als \"vorgeschlagen\" markieren</string> - <string name="space_mark_as_not_suggested">Als \"nicht vorgeschlagen\" markieren</string> + <string name="space_mark_as_suggested">Als vorgeschlagen markieren</string> + <string name="space_mark_as_not_suggested">Als nicht vorgeschlagen markieren</string> <string name="space_suggested">Vorgeschlagen</string> <string name="make_this_space_public">Teile deinen öffentlichen Space mit der Welt</string> <string name="space_settings_manage_rooms">Räume verwalten</string> @@ -2834,4 +2834,36 @@ <string name="send_file_step_compressing_image">Bild wird komprimiert…</string> <string name="use_as_default_and_do_not_ask_again">Als Standard festsetzen und nicht mehr fragen</string> <string name="option_always_ask">Jedes Mal fragen</string> + <string name="directory_add_a_new_server_prompt">Gib den Namen eines neuen Servers ein, den du erkunden möchtest.</string> + <string name="directory_add_a_new_server">Neuen Server hinzufügen</string> + <string name="directory_your_server">Dein Server</string> + <string name="send_feedback_space_info">Du verwendest die Betaversion von Spaces. Mit Feedback hilfst du uns, die nächsten Versionen zu verbessern. Dabei wird uns deine Platform übermittelt, damit wir deine Rückmeldung optimal nutzen können.</string> + <string name="this_space_has_no_rooms_admin">Möglicherweise musst du extra eingeladen werden, damit du die Räume siehst.</string> + <string name="this_space_has_no_rooms_not_admin">Möglicherweise musst du extra eingeladen werden, damit du die Räume siehst. +\nDie fehlt die Berechtigung, Räume hinzuzufügen.</string> + <string name="spaces_feeling_experimental_subspace">Du kannst Unterspaces zu einem Space hinzufügen.</string> + <string name="labs_space_show_orphan_in_home">Experimentelle Spaces - Nur verweiste Räume auf Startseite</string> + <string name="error_jitsi_join_conf">Leider ist ein Fehler beim Betreten der Konferenz aufgetreten</string> + <string name="unnamed_room">Unbenannter Raum</string> + <string name="this_space_has_no_rooms">Dieser Space hat noch keine Räume</string> + <string name="spaces_no_server_support_description">Für weitere Infos kontaktiere bitte die Administration des Homeservers</string> + <string name="spaces_no_server_support_title">Dein Homeserver scheint Spaces noch nicht zu unterstützen</string> + <string name="space_add_rooms">Räume hinzufügen</string> + <string name="space_leave_prompt_msg_as_admin">Du bist der Admin von diesem Space. Stelle vor dem Verlassen sicher, dass du die Adminrechte an jemand anderen übergibst.</string> + <string name="space_leave_prompt_msg_private">Dieser Raum ist nicht öffentlich. Du wirst ihn ohne Einladung nicht wieder betreten können.</string> + <string name="space_leave_prompt_msg_only_you">Du bist die einzige Person hier. Wenn du den Space verlässt, ist er für immer verloren (eine lange Zeit).</string> + <string name="invite_to_space">Einladen in %s</string> + <string name="private_space">Privater Space</string> + <string name="public_space">Öffentlicher Space</string> + <string name="a11y_public_space">Dieser Space ist öffentlich</string> + <string name="call_transfer_unknown_person">Unbekannte Person</string> + <string name="a11y_beta">Dieses Feature ist in der Beta</string> + <string name="give_feedback">Feedback geben</string> + <string name="feedback_failed">Fehler beim Senden vom Feedback (%s)</string> + <string name="feedback_sent">Dein Feedback wurde erfolgreich versandt. Danke!</string> + <string name="you_may_contact_me">Mich bei Fragen kontaktieren</string> + <string name="feedback">Feedback</string> + <string name="send_feedback_space_title">Spaces Feedback</string> + <string name="directory_add_a_new_server_error_already_added">Dieser Server ist schon in der Liste vorhanden</string> + <string name="directory_add_a_new_server_error">Server oder Raumliste kann nicht gefunden werden</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-eo/strings.xml b/vector/src/main/res/values-eo/strings.xml index 4e506e1d59..36ba941734 100644 --- a/vector/src/main/res/values-eo/strings.xml +++ b/vector/src/main/res/values-eo/strings.xml @@ -215,7 +215,7 @@ <string name="dark_theme">Malhela haŭto</string> <string name="black_theme">Nigra haŭto</string> <string name="notification_sync_in_progress">Spegulante…</string> - <string name="notification_listening_for_events">Atentante eventojn</string> + <string name="notification_listening_for_events">Atentante okazojn</string> <string name="notification_noisy_notifications">Laŭtaj sciigoj</string> <string name="notification_silent_notifications">Silentaj sciigoj</string> <string name="title_activity_home">Mesaĝoj</string> @@ -586,7 +586,7 @@ <string name="external_link_confirmation_message">La ligilo %1$s kondukas vin al alia retejo: %2$s. \n \nĈu vi certe volas daŭrigi\?</string> - <string name="create_room_dm_failure">Ni ne povis krei vian rektan interparolon. Bonvolu kontroli la invitotajn uzantojn kaj reprovi.</string> + <string name="create_room_dm_failure">Ni ne povis krei vian individuan ĉambron. Bonvolu kontroli la invitotajn uzantojn kaj reprovi.</string> <string name="send_bug_report_logs_description">Por diagnozi problemojn, protokolo de ĉi tiu kliento sendiĝos kune kun ĉi tiu erar-raporto. Ĉi tiu erar-raporto, inkluzive la protokolon kaj la ekrankopion, ne estos publike videbla. Se vi preferus sendi nur la ĉi-supran tekston, bonvolu malmarki:</string> <string name="send_bug_report_alert_message">Ŝajnas, ke vi kolere skuas la telefonon. Ĉu vi volas malfermi la erar-raportilon\?</string> <string name="send_bug_report_app_crashed">La aplikaĵo lastatempe fiaskis. Ĉu vi volas malfermi la fiasko-raportilon\?</string> @@ -741,9 +741,9 @@ <string name="verify_cannot_cross_sign">Tiu ĉi salutaĵo ne povas konigi ĉi tiun kontrolon al aliaj viaj salutaĵoj. \nLa kontrolo konserviĝos loke kaj estos konigota de venonta versio de la aplikaĵo.</string> <string name="unignore">Reatenti</string> - <string name="template_rendering_event_error_exception">${app_name} renkontis problemon bildigante enhavon de evento kun la identigilo «%1$s»</string> + <string name="template_rendering_event_error_exception">${app_name} renkontis problemon bildigante enhavon de okazo kun la identigilo «%1$s»</string> <string name="template_rendering_event_error_type_of_message_not_handled">${app_name} ne traktas mesaĝojn de speco «%1$s»</string> - <string name="template_rendering_event_error_type_of_event_not_handled">${app_name} ne traktas eventojn de speco «%1$s»</string> + <string name="template_rendering_event_error_type_of_event_not_handled">${app_name} ne traktas okazojn de speco «%1$s»</string> <string name="room_member_jump_to_read_receipt">Salti al legokonfirmo</string> <string name="room_member_power_level_custom_in">Propra (%1$d) en %2$s</string> <string name="room_member_power_level_default_in">Ordinara en %1$s</string> @@ -1030,7 +1030,7 @@ <string name="a11y_show_password">Montri pasvorton</string> <string name="a11y_close_keys_backup_banner">Fermi rubandon pri savkopiado de ŝlosiloj</string> <string name="a11y_create_room">Krei novan ĉambron</string> - <string name="a11y_create_direct_message">Krei novan rektan interparolon</string> + <string name="a11y_create_direct_message">Krei novan individuan ĉambron</string> <string name="send_attachment">Kunsendi</string> <string name="error_network_timeout">Ŝajnas, ke la servilo longe ne respondas. Tion povus kaŭzi malbona retkonekto aŭ eraro ĉe la servilo. Bonvolu reprovi iom poste.</string> <string name="error_terms_not_accepted">Bonvolu reprovi leginte la uzokondiĉojn de via hejmservilo.</string> @@ -1086,9 +1086,9 @@ <string name="send_file_step_sending_thumbnail">Sendante bildeton (%1$s / %2$s)</string> <string name="send_file_step_encrypting_thumbnail">Ĉifrante bildeton…</string> <string name="send_file_step_idle">Atendante…</string> - <string name="bottom_action_people_x">Rektaj interparoloj</string> + <string name="bottom_action_people_x">Individuaj ĉambroj</string> <string name="settings_labs_show_complete_history_in_encrypted_room">Montri plenan historion en ĉifritaj ĉambroj</string> - <string name="settings_labs_show_hidden_events_in_timeline">Montri kaŝitajn eventojn en historio</string> + <string name="settings_labs_show_hidden_events_in_timeline">Montri kaŝitajn okazojn en historio</string> <string name="send_suggestion_failed">Malsukcesis sendi la proponon (%s)</string> <string name="send_suggestion_sent">Dankon, la propono sukcese sendiĝis</string> <string name="send_suggestion_report_placeholder">Priskribu vian proponon ĉi tie</string> @@ -1119,7 +1119,7 @@ <string name="create_room_name_hint">Nomo</string> <string name="create_room_action_create">KREI</string> <string name="create_room_title">Nova ĉambro</string> - <string name="fab_menu_create_chat">Rektaj interparoloj</string> + <string name="fab_menu_create_chat">Individuaj ĉambroj</string> <string name="fab_menu_create_room">Ĉambroj</string> <string name="template_room_preview_world_readable_room_not_supported_yet">Antaŭrigardo al ĉambro legebla de ĉiuj ankoraŭ ne estas subtenata de ${app_name}</string> <string name="room_preview_no_preview">Ne eblas antaŭrigardi ĉi tiun ĉambron</string> @@ -1129,10 +1129,10 @@ <string name="action_change">Ŝanĝi</string> <string name="error_no_network">Neniu reto. Bonvolu kontroli vian retkonekton.</string> <string name="create_new_room">Krei novan ĉambron</string> - <string name="malformed_message">Misformita evento, ne povas montri</string> + <string name="malformed_message">Misformita okazo, ne povas montri</string> <string name="last_edited_info_message">Lastafoje redaktiĝis de %1$s je %2$s</string> - <string name="event_redacted_by_admin_reason">Evento reguliĝis de administranto de la ĉambro</string> - <string name="event_redacted_by_user_reason">Evento foriĝis de uzanto</string> + <string name="event_redacted_by_admin_reason">Okazo reguliĝis de administranto de la ĉambro</string> + <string name="event_redacted_by_user_reason">Okazo foriĝis de uzanto</string> <string name="settings_show_redacted_summary">Montri anstataŭaĵon je forigitaj mesaĝoj</string> <string name="settings_show_redacted">Montri forigitajn mesaĝojn</string> <string name="event_redacted">Mesaĝo foriĝis</string> @@ -1142,9 +1142,9 @@ <string name="reactions_like">Ŝati</string> <string name="reactions_agree">Konsenti</string> <string name="title_activity_emoji_reaction_picker">Reagoj</string> - <string name="room_list_rooms_empty_body">Viaj ĉambroj montriĝos ĉi tie</string> + <string name="room_list_rooms_empty_body">Viaj ĉambroj montriĝos ĉi tie. Tuŝetu al la «+» dekstre sube por trovi jam ekzistantajn, aŭ fari viajn proprajn.</string> <string name="room_list_rooms_empty_title">Ĉambroj</string> - <string name="room_list_people_empty_body">Viaj rektaj interparoloj montriĝos ĉi tie</string> + <string name="room_list_people_empty_body">Viaj individuaj ĉambroj montriĝos ĉi tie. Tuŝetu la plus-signon sube dekstre por krei iun.</string> <string name="room_list_people_empty_title">Interparoloj</string> <string name="room_list_catchup_welcome_body">Retrovu viajn nelegitajn mesaĝojn ĉi tie</string> <string name="room_list_catchup_welcome_title">Bonvenu hejmen!</string> @@ -1464,7 +1464,7 @@ <string name="notification_new_invitation">Nova invito</string> <string name="notification_new_messages">Novaj mesaĝoj</string> <string name="notification_unknown_room_name">Ĉambro</string> - <string name="notification_unknown_new_event">Nova evento</string> + <string name="notification_unknown_new_event">Nova okazo</string> <string name="notification_unread_notified_messages_and_invitation">%1$s kaj %2$s</string> <string name="notification_unread_notified_messages_in_room_and_invitation">%1$s en %2$s kaj %3$s</string> <string name="notification_unread_notified_messages_in_room">%1$s en %2$s</string> @@ -1549,7 +1549,7 @@ <string name="encryption_information_claimed_ed25519_fingerprint_key">Pretendita ŝlosilo kun fingrospuro je Ed25519</string> <string name="encryption_information_curve25519_identity_key">Identiga ŝlosilo je Curve25519</string> <string name="encryption_information_user_id">Identigilo de uzanto</string> - <string name="encryption_information_device_info">Informoj pri evento</string> + <string name="encryption_information_device_info">Informoj pri okazo</string> <string name="encryption_information_title">Informoj pri tutvoja ĉifrado</string> <string name="failed_to_load_timeline_position">%s provis enlegi precizan momenton en la historio de ĉambro, sed ne povis ĝin trovi.</string> <string name="settings_theme">Haŭto</string> @@ -1713,11 +1713,11 @@ <string name="settings_preview_media_before_sending">Antaŭrigardi vidaŭdaĵojn antaŭ sendi</string> <string name="settings_vibrate_on_mention">Vibri je mencio de uzanto</string> <string name="settings_show_avatar_display_name_changes_messages_summary">Inkluzivas ŝanĝojn de profilbildo kaj prezenta nomo.</string> - <string name="settings_show_avatar_display_name_changes_messages">Montri eventojn de konto</string> + <string name="settings_show_avatar_display_name_changes_messages">Montri okazojn de konto</string> <string name="settings_show_join_leave_messages_summary">Invitoj, forpeloj kaj forbaroj ne estos influitaj.</string> - <string name="settings_show_join_leave_messages">Montri eventojn de aliĝo kaj foriro</string> - <string name="settings_show_room_member_state_events_summary">Inkluzivas eventojn de invitoj, aliĝoj, foriroj, forpeloj, forbaroj, kaj ŝanĝoj de profilbildo aŭ prezenta nomo.</string> - <string name="settings_show_room_member_state_events">Montri stateventojn de ĉambranoj</string> + <string name="settings_show_join_leave_messages">Montri okazojn de aliĝo kaj foriro</string> + <string name="settings_show_room_member_state_events_summary">Inkluzivas okazojn de invitoj, aliĝoj, foriroj, forpeloj, forbaroj, kaj ŝanĝoj de profilbildo aŭ prezenta nomo.</string> + <string name="settings_show_room_member_state_events">Montri statokazojn de ĉambranoj</string> <string name="settings_show_read_receipts_summary">Klaku la kvitancojn por detala listo.</string> <string name="settings_show_read_receipts">Montri kvitancojn</string> <string name="settings_12_24_timestamps">Montri tempindikojn en 12-hora formo</string> @@ -1847,7 +1847,7 @@ <string name="settings_troubleshoot_diagnostic">Solvi problemojn pri diagnozo</string> <string name="settings_notification_troubleshoot">Solvi problemojn pri sciigoj</string> <string name="settings_notification_privacy">Privateco de sciigoj</string> - <string name="settings_notification_by_event">Graveco de sciigo laŭ evento</string> + <string name="settings_notification_by_event">Graveco de sciigo laŭ okazo</string> <string name="settings_notification_advanced">Altnivelaj agordoj pri sciigoj</string> <string name="error_threepid_auth_failed">Certigu, ke vi klakis la ligilon en la reltereo, kiun ni sendis al vi.</string> <string name="settings_remove_three_pid_confirmation_content">Ĉu forigi %s\?</string> @@ -1871,7 +1871,7 @@ <string name="room_sliding_menu_third_party_notices">Avizoj de eksteraj liverantoj</string> <string name="room_sliding_menu_term_and_conditions">Uzokondiĉoj</string> <string name="room_settings_leave_conversation">Foriri de interparolo</string> - <string name="room_settings_direct_chat">Rekta ĉambro</string> + <string name="room_settings_direct_chat">Individua ĉambro</string> <string name="room_settings_de_prioritize">Forigi prioritaton</string> <string name="room_settings_all_messages_noisy">Ĉiuj mesaĝoj (laŭte)</string> <plurals name="directory_search_rooms_for"> @@ -1923,7 +1923,7 @@ <string name="room_participants_power_level_demote_warning_title">Ĉu malaltigi vian propran povnivelon\?</string> <string name="room_participants_action_cancel_invite">Nuligi inviton</string> <string name="room_participants_header_devices">SALUTAĴOJ</string> - <string name="room_participants_header_direct_chats">Rektaj ĉambroj</string> + <string name="room_participants_header_direct_chats">Individuaj ĉambroj</string> <string name="room_participants_header_call">VOKO</string> <string name="room_participants_header_admin_tools">ADMINISTRILOJ</string> <string name="invite_no_identity_server_error">Por fari ĉi tion, aldonu identigan servilon en viaj agordoj.</string> @@ -2000,7 +2000,7 @@ <string name="settings_discovery_mail_pending">Pritraktota</string> <string name="direct_room_no_known_users">Neniu rezulto troviĝis, uzu «Aldoni per identigilo de Matrix» por serĉi servile.</string> <string name="labs_swipe_to_reply_in_timeline">Ŝalti viŝon por respondo en historio</string> - <string name="room_filtering_footer_create_new_direct_message">Sendi novan rektan mesaĝon</string> + <string name="room_filtering_footer_create_new_direct_message">Sendi novan individuan mesaĝon</string> <string name="push_gateway_item_format">Formato:</string> <string name="directory_server_type_homeserver">Entajpu hejmservilon, kies publikaj ĉambroj listiĝos</string> <string name="settings_home_display">Hejmekrano</string> @@ -2212,11 +2212,11 @@ <string name="settings_key_requests">Ŝlosilpetoj</string> <string name="template_login_default_session_public_name">${app_name} por Android</string> <string name="keys_backup_restore_success_title_already_up_to_date">Ŝlosiloj jam estas ĝisdataj!</string> - <string name="event_redacted_by_admin_reason_with_reason">Evento foriĝis de administranto de la ĉambro, kialo: %1$s</string> - <string name="event_redacted_by_user_reason_with_reason">Evento foriĝis de uzanto, kialo: %1$s</string> + <string name="event_redacted_by_admin_reason_with_reason">Okazo foriĝis de administranto de la ĉambro, kialo: %1$s</string> + <string name="event_redacted_by_user_reason_with_reason">Okazo foriĝis de uzanto, kialo: %1$s</string> <string name="delete_event_dialog_reason_hint">Kialo de redakto</string> <string name="delete_event_dialog_reason_checkbox">Kialigi</string> - <string name="delete_event_dialog_content">Ĉu vi certe volas forigi ĉi tiun eventon\? Sciu, ke se vi forigos nomon de ĉambro aŭ ŝanĝon de temo, ĝi povus malfari la ŝanĝon.</string> + <string name="delete_event_dialog_content">Ĉu vi certe volas forigi ĉi tiun okazon\? Sciu, ke se vi forigos nomon de ĉambro aŭ ŝanĝon de temo, ĝi povus malfari la ŝanĝon.</string> <string name="delete_event_dialog_title">Konfirmi forigon</string> <plurals name="send_images_with_original_size"> <item quantity="one">Sendi bildon je la originala grando</item> @@ -2278,7 +2278,7 @@ <string name="settings_active_sessions_manage">Administri salutaĵojn</string> <string name="settings_active_sessions_show_all">Montri ĉiujn salutaĵojn</string> <string name="settings_active_sessions_list">Aktivaj salutaĵoj</string> - <string name="settings_hs_admin_e2e_disabled">La administranto de via servilo malŝaltis implicitan tutvojan ĉifradon en privataj ĉambroj kaj rektaj interparoloj.</string> + <string name="settings_hs_admin_e2e_disabled">La administranto de via servilo malŝaltis implicitan tutvojan ĉifradon en privataj kaj individuaj ĉambroj.</string> <string name="encryption_information_dg_xsigning_disabled">Delegaj subskriboj ne estas ŝaltitaj</string> <string name="encryption_information_dg_xsigning_not_trusted">Delegaj subskriboj estas ŝaltitaj. \nŜlosiloj ne estas fidataj</string> @@ -2298,14 +2298,14 @@ <string name="room_settings_enable_encryption_dialog_content">Post ŝalto, ne eblas malŝalti ĉifradon de ĉambro. Mesaĝoj en ĉifrita ĉambro ne estas videblaj al la servilo, nur al la partoprenantoj de la ĉambro. Ŝalto de ĉifrado povus malhelpi ĝustan funkciadon de multaj pontoj kaj robotoj.</string> <string name="room_settings_enable_encryption_dialog_title">Ĉu ŝalti ĉifradon\?</string> <string name="room_settings_enable_encryption_warning">Post ŝalto, ne eblas ĉifradon malŝalti.</string> - <string name="room_settings_enable_encryption">Ŝalti tutvojan ĉifradon</string> + <string name="room_settings_enable_encryption">Ŝalti tutvojan ĉifradon…</string> <string name="settings_category_composer">Redaktilo de mesaĝoj</string> <string name="settings_category_timeline">Historio</string> <string name="command_description_rainbow_emote">Sendas la donitan faron en ĉielarkaj koloroj</string> <string name="auth_invalid_login_deactivated_account">Ĉi tiu konto malaktiviĝis.</string> <string name="auth_invalid_login_param_space_in_password">Neĝusta uzantonomo kaj/aŭ pasvorto. La enigita pasvorto komenciĝas aŭ finiĝas per spaco, bonvolu ĝin kontroli.</string> <string name="command_description_plain">Sendas mesaĝon kiel platan tekston, sen interpretado de Markdown</string> - <string name="settings_notification_advanced_summary">Agordi gravecon de sciigoj laŭ evento</string> + <string name="settings_notification_advanced_summary">Agordi gravecon de sciigoj laŭ okazo</string> <string name="settings_troubleshoot_title">Solvi problemojn</string> <string name="settings_when_rooms_are_upgraded">Gradaltigoj de ĉambroj</string> <string name="settings_messages_in_e2e_group_chat">Ĉifritaj mesaĝoj en grupaj interparoloj</string> @@ -2404,7 +2404,7 @@ <string name="room_alias_local_address_subtitle">Agordu adresojn por ĉi tiu ĉambro, por ke uzantoj ĝin facile trovu per via hejmservilo (%1$s)</string> <string name="room_permissions_change_topic">Ŝanĝi la temon</string> <string name="room_permissions_upgrade_the_room">Gradaltigi la ĉambron</string> - <string name="room_permissions_send_m_room_server_acl_events">Sendi eventojn de la speco «m.room.server_acl»</string> + <string name="room_permissions_send_m_room_server_acl_events">Sendi okazojn de la speco «m.room.server_acl»</string> <string name="room_permissions_change_permissions">Ŝanĝi permesojn</string> <string name="room_permissions_change_room_name">Ŝanĝi nomon de ĉambro</string> <string name="room_permissions_change_history_visibility">Ŝanĝi videblecon de historio</string> @@ -2481,4 +2481,302 @@ <string name="notice_room_server_acl_set_banned">• Serviloj akordaj kun %s estas forbaritaj.</string> <string name="notice_room_server_acl_set_title_by_you">Vi agordis la alirpermesojn por serviloj por ĉi tiu ĉambro.</string> <string name="notice_room_server_acl_set_title">%s agordis la alirpermesojn por serviloj por ĉi tiu ĉambro.</string> + <string name="call_transfer_users_tab_title">Uzantoj</string> + <string name="call_transfer_failure">Eraris transdonado de voko</string> + <string name="call_transfer_title">Transdonu</string> + <string name="call_transfer_consult_first">Unue konsulti</string> + <plurals name="call_one_active_and_other_paused"> + <item quantity="one">1 aktiva voko (%1$s) · 1 paŭzigita voko</item> + <item quantity="other">1 aktiva voko (%1$s) · %2$d paŭzigitaj vokoj</item> + </plurals> + <plurals name="call_only_paused"> + <item quantity="one">Paŭzigita voko</item> + <item quantity="other">%1$d paŭzigitaj vokoj</item> + </plurals> + <string name="call_only_active">Aktiva voko (%1$s)</string> + <string name="call_dial_pad_lookup_error">Eraris serĉado de la telefonnumero</string> + <string name="call_dial_pad_title">Ciferplato</string> + <string name="call_tile_call_back">Revoki</string> + <string name="call_tile_ended">Ĉi tiu voko finiĝis</string> + <string name="call_tile_other_declined">%1$s rifuzis ĉi tiun vokon</string> + <string name="call_tile_you_declined">Vi rifuzis ĉi tiun vokon %1$s</string> + <string name="call_tile_in_call">Vi nun enas ĉi tiun vokon</string> + <string name="call_tile_other_started_call">%1$s komencis vokon</string> + <string name="call_tile_you_started_call">Vi komencis vokon</string> + <string name="matrix_to_card_title">Ligilo al Matrix</string> + <string name="warning_unsaved_change_discard">Forĵeti ŝanĝojn</string> + <string name="warning_unsaved_change">Ekzistas nekonservitaj ŝanĝoj. Ĉu ili forĵetiĝu\?</string> + <string name="qr_code_not_scanned">Rapidresponda kodo ne estas skanita!</string> + <string name="invalid_qr_code_uri">Nevalida rapidresponda kodo (nevalida URI)!</string> + <string name="cannot_dm_self">Ne eblas kun vi mem!</string> + <string name="share_by_text">Havigi per telefona mesaĝo</string> + <string name="settings_security_pin_code_change_pin_summary">Ŝanĝi vian nunan personan identigan numeron</string> + <string name="settings_security_pin_code_change_pin_title">Ŝanĝi personan identigan numeron</string> + <plurals name="entries"> + <item quantity="one">%d ero</item> + <item quantity="other">%d eroj</item> + </plurals> + <string name="phone_book_perform_lookup">Serĉi kontaktojn en Matrix</string> + <string name="room_settings_set_avatar">Agordi profilbildon</string> + <string name="identity_server_user_consent_not_provided">Konsento de la uzanto ne estas donita.</string> + <string name="user_code_info_text">Havigu ĉi tiun kodon al aliuloj, por ke ili povu ekbabili kun vi, skaninte ĝin.</string> + <string name="user_code_my_code">Mia kodo</string> + <string name="user_code_share">Havigi mian kodon</string> + <string name="user_code_scan">Skani rapidrespondan kodon (QR)</string> + <string name="not_a_valid_qr_code">Tio ne estas valida rapidresponda kodo (QR) de Matrix</string> + <string name="template_invite_friends_rich_title">🔐️ Aliĝu al mi per ${app_name}</string> + <string name="template_invite_friends_text">Saluton, parolu kun mi per ${app_name}: %s</string> + <string name="invite_friends">Inviti amikojn</string> + <string name="add_people">Aldoni personojn</string> + <string name="failed_to_initialize_cross_signing">Malsukcesis agordi delegajn subskribojn</string> + <string name="default_message_emote_snow">sendas neĝon ❄️</string> + <string name="default_message_emote_confetti">sendas konfetojn 🎉</string> + <string name="command_snow">Sendas la donitan mesaĝon kun neĝo</string> + <string name="command_confetti">Sendas la donitan mesaĝon kun konfetoj</string> + <string name="topic_prefix">"Temo: "</string> + <string name="add_a_topic_link_text">Aldonu temon</string> + <string name="room_created_summary_no_topic_creation_text">%s por sciigi, pri kio temas la ĉambro.</string> + <string name="this_is_the_beginning_of_dm">Ĉi tio estas la komenco de via individua ĉambro kun %s.</string> + <string name="this_is_the_beginning_of_room_no_name">Ĉi tio estas la komenco de interparolado.</string> + <string name="this_is_the_beginning_of_room">Ĉi tio estas la komenco de %s.</string> + <string name="send_images_and_video_with_original_size">Sendi vidaŭdaĵojn en originala grandeco</string> + <plurals name="send_videos_with_original_size"> + <item quantity="one">Sendi filmon en originala grandeco</item> + <item quantity="other">Sendi filmojn en originala grandeco</item> + </plurals> + <string name="settings_server_upload_size_unknown">La limo ne estas konata.</string> + <string name="settings_server_upload_size_content">Via hejmservilo akceptas kunsendaĵojn (dosierojn, vidaŭdaĵojn, ktp.) kun grandeco ĝis %s.</string> + <string name="settings_server_upload_size_title">Datumlimo por alŝutoj al servilo</string> + <string name="settings_server_version">Versio de servilo</string> + <string name="settings_server_name">Nomo de servilo</string> + <string name="room_settings_enable_encryption_no_permission">Vi ne havas permeson ŝalti ĉifradon en ĉi tiu ĉambro.</string> + <string name="room_member_open_or_create_dm">Individua ĉambro</string> + <string name="create_room_in_progress">Kreante ĉambron…</string> + <string name="create_room_alias_invalid">Iuj signoj ne estas permesitaj</string> + <string name="create_room_alias_empty">Bonvolu doni adreson de ĉambro</string> + <string name="create_room_alias_already_in_use">Ĉi tiu adreso jam estas uzata</string> + <string name="create_room_alias_hint">Adreso de ĉambro</string> + <string name="create_room_disable_federation_description">Vi povus ŝalti ĉi tion, ekzemple se la ĉambro nur estus uzata por kunlaborado de internaj skipoj sur en hejmservilo. Ne eblas ŝanĝi ĉi tiun agordon poste.</string> + <string name="create_room_disable_federation_title">Malebligi aliĝon la ĉambro al tiuj, kiuj ne venas de %s</string> + <string name="hide_advanced">Kaŝi altnivelajn</string> + <string name="show_advanced">Montri altnivelajn</string> + <string name="login_clear_homeserver_history">Vakigi historion</string> + <string name="login_social_sso">ununura saluto</string> + <string name="login_social_signin_with">Saluti per %s</string> + <string name="login_social_signup_with">Registriĝi per %s</string> + <string name="login_social_continue_with">Daŭrigi per %s</string> + <string name="login_social_continue">Aŭ</string> + <string name="room_list_quick_actions_room_settings">Agordoj de ĉambro</string> + <string name="attachment_viewer_item_x_of_y">%1$d el %2$d</string> + <string name="error_handling_incoming_share">Ne povis trakti havigitajn datumojn</string> + <string name="error_file_too_big_simple">Ĉi tiu dosiero estas tro granda por alŝuto.</string> + <string name="a11y_beta">Ĉi tiu funkcio ankoraŭ estas prova</string> + <string name="a11y_create_direct_message_by_qr_code">Krei novan individuan ĉambron per skanado de rapidresponda kodo (QR)</string> + <string name="a11y_create_direct_message_by_mxid">Krei novan individuan ĉambron per identigilo de Matrix</string> + <string name="you_may_contact_me">Vi povas kontakti min okaze de pliaj demandoj</string> + <string name="send_feedback_space_info">Vi uzas provan version de aroj. Viaj prikomentoj helpos formi la sekvajn versiojn. Via platformo kaj uzantonomo notiĝos, por ke ni povus uzi viajn prikomentojn kiel eble plej bone.</string> + <string name="feedback">Prikomentoj</string> + <string name="send_feedback_space_title">Prikomentoj pri aroj</string> + <string name="room_preview_no_preview_join">Oni ne povas antaŭrigardi ĉi tiun ĉambron. Ĉu vi volas eniri\?</string> + <string name="room_preview_not_found">Ĉi tiu ĉambro nun ne estas disponebla. +\nReprovu poste, aŭ petu administranton de ĉambro kontroli, ĉu vi rajtas aliri.</string> + <string name="identity_server_consent_dialog_content">Por trovi kontaktojn, kiujn vi jam konas, ĉu vi akceptas sendi informojn pri viaj kontaktoj (telefonnumerojn kaj/aŭ retpoŝtadresojn) al la agordita identiga servilo (%1$s)\? +\n +\nPor pli bona privateco, la datumoj haketiĝos antaŭ sendo.</string> + <string name="identity_server_consent_dialog_title">Sendi retpoŝtadresojn kaj telefonnumerojn</string> + <string name="settings_discovery_consent_action_give_consent">Konsenti</string> + <string name="settings_discovery_consent_action_revoke">Nuligi mian konsenton</string> + <string name="settings_discovery_consent_notice_off">Vi ne konsentis sendi retpoŝtadresojn kaj telefonnumerojn al ĉi tiu identiga servilo por trovi aliajn uzantojn el viaj kontaktoj.</string> + <string name="settings_discovery_consent_notice_on">Vi konsentis sendi retpoŝtadresojn kaj telefonnumerojn al ĉi tiu identiga servilo por trovi aliajn uzantojn el viaj kontaktoj.</string> + <string name="settings_discovery_consent_title">Sendi retpoŝtadresojn kaj telefonnumerojn</string> + <string name="direct_room_user_list_suggestions_title">Rekomendoj</string> + <string name="direct_room_user_list_contacts_title">Kontaktoj</string> + <string name="direct_room_user_list_known_title">Konataj uzantoj</string> + <string name="direct_room_user_list_recent_title">Freŝaj</string> + <string name="qr_code">Rapidresponda kodo (QR)</string> + <string name="add_by_qr_code">Aldoni per rapidresponda kodo (QR)</string> + <string name="search_hint_room_name">Serĉi per nomo</string> + <string name="user_directory_search_hint">Serĉi per nomo aŭ identigilo</string> + <string name="send_file_step_compressing_video">Densigante filmon %d%%</string> + <string name="send_file_step_compressing_image">Densigante bildon…</string> + <string name="give_feedback">Prikomenti</string> + <string name="feedback_failed">Malsukcesis sendi la prikomentojn (%s)</string> + <string name="feedback_sent">Dankon, viaj prikomentoj sendiĝis sukcese</string> + <string name="room_settings_room_access_restricted_description">Ĉiu ajn en aro kun ĉi tiu ĉambro povas ĝin trovi kaj aliĝi. Nur administrantoj de ĉi tiu ĉambro povas ĝin arigi.</string> + <string name="room_settings_room_access_restricted_title">Aroj</string> + <string name="room_settings_room_access_public_description">Ĉiu ajn povas trovi kaj aliĝi la ĉambron</string> + <string name="room_settings_room_access_public_title">Publika</string> + <string name="room_settings_room_access_private_description">Nur invititoj povas trovi kaj aliĝi</string> + <string name="room_settings_room_access_private_title">Privata</string> + <string name="room_settings_room_access_entry_unknown">Nekonata agordo de aliro (%s)</string> + <string name="room_settings_room_access_entry_knock">Ĉiu ajn povas frapi al la ĉambro, aliaj ĉambranoj poste povas akcepti au rifuzi</string> + <string name="room_alias_local_address_title">Lokaj adresoj</string> + <string name="room_alias_address_hint">Nova publikigita adreso (ekz. #kromnomo:servilo)</string> + <string name="room_alias_address_empty">Neniuj aliaj adresoj ankoraŭ publikiĝis.</string> + <string name="room_alias_address_empty_can_add">Neniuj aliaj adresoj ankoraŭ publikiĝis, aldonu iun ĉi-sube.</string> + <string name="room_alias_publish">Ĉu publikigi ĉi tiun ĉambron al la katalogo de ĉambroj de %1$s\?</string> + <string name="room_alias_delete_confirmation">Ĉu forigi la adreson «%1$s»\?</string> + <string name="room_alias_unpublish_confirmation">Ĉu malpublikigi la adreson «%1$s»\?</string> + <string name="room_alias_published_alias_add_manually_submit">Publikigi</string> + <string name="room_alias_published_alias_add_manually">Publikigi novan adreson permane</string> + <string name="room_alias_published_other">Aliaj publikigitaj adresoj:</string> + <string name="room_alias_main_address_hint">Ĉefa adreso</string> + <string name="room_alias_published_alias_main">Ĉi tio estas la ĉefa adreso</string> + <string name="room_alias_published_alias_subtitle">Publikigitaj adresoj povas esti uzataj de iu ajn por aliĝi al via ĉambro. Por publikiĝi, adreso devas unue esti loka.</string> + <string name="room_alias_published_alias_title">Publikigitaj adresoj</string> + <string name="room_alias_title">Adresoj de ĉambro</string> + <string name="room_settings_alias_subtitle">Vidi kaj administri adresojn de ĉi tiu ĉambro, kaj ĝian videblecon en la katalogo de ĉambroj.</string> + <string name="room_settings_alias_title">Adresoj de ĉambro</string> + <string name="room_settings_guest_access_title">Permesi al gastoj aliĝi</string> + <string name="room_settings_room_access_title">Aliro al ĉambro</string> + <string name="room_settings_room_read_history_dialog_subtitle">Ŝanĝoj al legebleco de historio aplikiĝos nur al mesaĝoj venontaj al la ĉambro. Videbleco de jama historio restos senŝanĝa.</string> + <string name="settings_show_emoji_keyboard_summary">Aldoni butonon por malfermi bildosignan klavaron al la redaktilo de mesaĝoj</string> + <string name="settings_show_emoji_keyboard">Montri bildosignan klavaron</string> + <string name="settings_chat_effects_description">Uzu la ordonon «/confetti» aŭ sendu mesaĝon enhavantan la signojn ❄️ aŭ 🎉</string> + <string name="settings_chat_effects_title">Montri efektojn en babilujo</string> + <string name="room_permissions_notice_read_only">Vi ne rajtas ĝisdatigi la rolojn bezonatajn por ŝanĝi diversajn partojn de la ĉambro</string> + <string name="use_as_default_and_do_not_ask_again">Uzi implicite kaj ne plu demandi</string> + <string name="option_always_ask">Ĉiam demandi</string> + <string name="spaces_header">Aroj</string> + <string name="spaces_invited_header">Invitoj</string> + <string name="suggested_header">Rekomendataj ĉambroj</string> + <string name="action_switch">Baskuli</string> + <string name="event_status_sent_message">Mesaĝo sendiĝis</string> + <string name="a11y_import_key_from_file">Enporti ŝlosilon el dosiero</string> + <string name="a11y_open_widget">Malfermi fenestraĵojn</string> + <string name="a11y_screenshot">Ekrankopio</string> + <string name="authentication_error">Malsukcesis aŭtentikigi</string> + <string name="template_re_authentication_default_confirm_text">${app_name} postulas enigon de viaj salutiloj por tiu ĉi ago.</string> + <string name="error_jitsi_join_conf">Pardonu, eraris via aliĝo al la grupa voko</string> + <string name="this_space_has_no_rooms_admin">Iuj ĉambroj povas esti kaŝitaj ĉar ili estas privataj kaj vi bezonas inviton.</string> + <string name="this_space_has_no_rooms_not_admin">Iuj ĉambroj povas esti kaŝitaj, ĉar ili estas privataj kaj vi bezonas inviton. +\nVi ne havas permeson aldoni ĉambrojn.</string> + <string name="this_space_has_no_rooms">Ĉi tiu aro ne havas ĉambrojn</string> + <string name="spaces_no_server_support_description">Bonvolu kontakti administranton de via hejmservilo por pliaj informoj</string> + <string name="spaces_no_server_support_title">Ŝajnas, ke via hejmservilo ankoraŭ ne subtenas arojn</string> + <string name="spaces_feeling_experimental_subspace">Ĉu vi eksperimentemas\? +\nVi povas arigi jamajn arojn.</string> + <string name="labs_space_show_orphan_in_home">Eksperimenta aro – montri nur orfojn en la Hejmo</string> + <string name="space_manage_rooms_and_spaces">Administri ĉambrojn kaj arojn</string> + <string name="space_mark_as_not_suggested">Marki nerekomendita</string> + <string name="space_mark_as_suggested">Marki rekomendita</string> + <string name="space_suggested">Rekomenditaj</string> + <string name="make_this_space_public">Publikigi ĉi tiun aron</string> + <string name="space_settings_manage_rooms">Administri ĉambrojn</string> + <string name="looking_for_someone_not_in_space">Ĉu vi serĉas iun, kiu ne estas en %s\?</string> + <string name="user_invites_you">%s invitas vin</string> + <string name="labs_use_restricted_join_rule_desc">Averto: bezonas subtenon de servilo kaj eksperimentan version de ĉambro</string> + <string name="labs_use_restricted_join_rule">Eksperimenta aro – limigita ĉambro.</string> + <string name="you_are_invited">Vi estas invitita</string> + <string name="spaces_beta_welcome_to_spaces_desc">Aroj prezentas novan manieron grupigi ĉambrojn kaj personojn.</string> + <string name="spaces_beta_welcome_to_spaces">Bonvenu al aroj!</string> + <string name="space_add_rooms">Aldoni ĉambrojn</string> + <string name="space_add_existing_rooms">Aldoni jamajn ĉambrojn kaj arojn</string> + <string name="space_leave_prompt_msg_as_admin">Vi estas administranto de ĉi tiu aro. Certigu, ke vi transdonis administrajn rajtojn al alia ano, antaŭ ol vi vere foriros.</string> + <string name="space_leave_prompt_msg_private">Ĉi tiu aro ne estas publika. Vi ne povos ree aliĝi sen invito.</string> + <string name="space_leave_prompt_msg_only_you">Vi estas la sola persono ĉi tie. Se vi foriros, neniu plu povos aliĝi, inkluzive vin mem.</string> + <string name="space_leave_prompt_msg">Ĉu vi certe volas foriri de la aro\?</string> + <string name="leave_space">Foriri de aro</string> + <string name="space_add_child_title">Aldoni ĉambrojn</string> + <string name="space_explore_activity_title">Esplori ĉambrojn</string> + <plurals name="space_people_you_know"> + <item quantity="one">%d persono, kiun vi konas, jam aliĝis</item> + <item quantity="other">%d personoj, kiujn vi konas, jam aliĝis</item> + </plurals> + <string name="suggested_rooms_pills_on_empty_header">Bonvenu al %1$s, %2$s.</string> + <string name="suggested_rooms_pills_on_empty_text">Vi ne jam enas iun ĉambron. Ĉi-sube estas kelkaj proponitaj ĉambroj, sed vi povas vidi pliajn per la verda butono sube-dekstre.</string> + <string name="room_alias_preview_not_found">Ĉi tiu kromnomo ne estas nun atingebla. +\nReprovu poste, aŭ petu al administranto de ĉambro kontroli, ĉu vi rajtas aliri.</string> + <string name="join_anyway">Tamen aliĝi</string> + <string name="join_space">Aliĝi al aro</string> + <string name="create_space">Krei aron</string> + <string name="skip_for_now">Provizore preterpasi</string> + <string name="share_space_link_message">Aliĝu al mia aro %1$s %2$s</string> + <string name="invite_just_to_this_room_desc">Oni ne apartenos al %s</string> + <string name="invite_just_to_this_room">Nur al ĉi tiu ĉambro</string> + <string name="invite_to_space_with_name_desc">Oni povos esplori en %s</string> + <string name="invite_to_space_with_name">Inviti al %s</string> + <string name="invite_by_link">Havigi ligilon</string> + <string name="invite_by_mxid">Inviti per uzantonomo</string> + <string name="invite_by_email">Inviti per retpoŝto</string> + <string name="invite_people_to_your_space_desc">Nun ĉeestas nur vi. %s eĉ pli bonos kun aliuloj.</string> + <string name="invite_to_space">Inviti al %s</string> + <string name="invite_people_menu">Inviti personojn</string> + <string name="invite_people_to_your_space">Invitu personojn al via aro</string> + <string name="create_space_topic_hint">Priskribo</string> + <string name="create_spaces_loading_message">Kreante aron…</string> + <string name="create_spaces_default_public_random_room_name">Hazarda</string> + <string name="create_spaces_default_public_room_name">Ĝenerala</string> + <string name="create_spaces_room_private_header_desc">Ni kreu por ĉio apartan ĉambron. Vi povos aldoni pliajn poste, inkluzive jam ekzistantajn.</string> + <string name="create_spaces_room_private_header">Kion vi prilaboras\?</string> + <string name="create_spaces_room_public_header_desc">Ni kreos ĉambrojn por ili. Vi povos aldoni pliajn poste.</string> + <string name="create_spaces_room_public_header">Kiajn diskutojn vi volus havi en %s\?</string> + <string name="create_space_error_empty_field_space_name">Donu al ĝi nomon kaj pluiĝu.</string> + <string name="create_spaces_details_private_header">Aldonu kelkajn detalojn por helpi identigi la aron. Vi povos ilin ŝanĝi iam ajn.</string> + <string name="create_spaces_details_public_header">Aldonu kelkajn detalojn por elstarigi ĝin. Vi povos ilin ŝanĝi iam ajn.</string> + <string name="activity_create_space_title">Krei aron</string> + <string name="space_type_private_desc">Nur por invititoj, plej bona por vi mem aŭ skipoj</string> + <string name="space_type_private">Privata</string> + <string name="space_type_public_desc">Malfermita al ĉiuj, plej bona por komunumoj</string> + <string name="space_type_public">Publika</string> + <string name="create_spaces_private_teammates">Privata spaco por vi kaj viaj kolegoj</string> + <string name="create_spaces_me_and_teammates">Mi kaj kolegoj</string> + <string name="create_spaces_organise_rooms">Privata aro por organizi viajn ĉambrojn</string> + <string name="create_spaces_just_me">Nur mi</string> + <string name="create_spaces_make_sure_access">Certigu, ke la ĝustaj personoj povas aliri al %s. Vi povas ŝanĝi ĉi tion pli poste.</string> + <string name="create_spaces_who_are_you_working_with">Kun kiu laboras vi\?</string> + <string name="create_spaces_join_info_help">Por aliĝi al jam ekzistanta aro, vi bezonos inviton.</string> + <string name="create_spaces_you_can_change_later">Vi povos ŝanĝi ĉi tion poste</string> + <string name="create_spaces_choose_type_label">Kian aron volas vi krei\?</string> + <string name="create_spaces_type_header">Aroj estas nova maniero grupigi ĉambrojn kaj personojn</string> + <string name="your_private_space">Via privata aro</string> + <string name="your_public_space">Via publika aro</string> + <string name="add_space">Aldoni aron</string> + <string name="event_status_delete_all_failed_dialog_message">Ĉu vi certe volas forigi ĉiujn nesenditajn mesaĝojn en ĉi tiu ĉambro\?</string> + <string name="event_status_delete_all_failed_dialog_title">Forigi nesenditajn mesaĝojn</string> + <string name="event_status_failed_messages_warning">Malsukcesis sendi mesaĝojn</string> + <string name="event_status_cancel_sending_dialog_message">Ĉu vi certe volas nuligi sendon de mesaĝo\?</string> + <string name="event_status_a11y_delete_all">Forigi ĉiujn malsukcesitajn mesaĝoj</string> + <string name="event_status_a11y_failed">Malsukcesis</string> + <string name="event_status_a11y_sent">Sendite</string> + <string name="event_status_a11y_sending">Sendante</string> + <string name="command_description_leave_room">Foriri de ĉambro kun la donita identigilo (aŭ de la nuna ĉambro, kun nenio)</string> + <string name="command_description_join_space">Aliĝi al aro kun la donita identigilo</string> + <string name="command_description_create_space">Krei aron</string> + <string name="dev_tools_event_content_hint">Enhavo de okazo</string> + <string name="dev_tools_success_state_event">Sendiĝis statokazo!</string> + <string name="dev_tools_success_event">Sendiĝis okazo!</string> + <string name="dev_tools_error_malformed_event">Misformita okzao</string> + <string name="dev_tools_error_no_message_type">Mankas speco de mesaĝo</string> + <string name="dev_tools_error_no_content">Neniu enhavo</string> + <string name="dev_tools_form_hint_event_content">Enhavo de okzao</string> + <string name="dev_tools_form_hint_state_key">Statŝlosilo</string> + <string name="dev_tools_form_hint_type">Speco</string> + <string name="dev_tools_send_custom_state_event">Sendi propran statokazon</string> + <string name="dev_tools_edit_content">Redakti enhavon</string> + <string name="dev_tools_state_event">Statokazoj</string> + <string name="dev_tools_send_state_event">Sendi statokazon</string> + <string name="dev_tools_send_custom_event">Sendi propran okazon</string> + <string name="dev_tools_explore_room_state">Esplori staton de ĉambro</string> + <string name="dev_tools_menu_name">Programistaj iloj</string> + <string name="a11y_public_room">Ĉi tiu ĉambro estas publika</string> + <string name="a11y_view_read_receipts">Vidi legokonfirmojn</string> + <string name="a11y_rule_notify_off">Ne sciigi</string> + <string name="a11y_rule_notify_silent">Sciigi sen sono</string> + <string name="a11y_rule_notify_noisy">Sciigi per sono</string> + <string name="a11y_error_message_not_sent">Mesaĝo ne sendiĝis pro eraro</string> + <string name="a11y_unchecked">Nekontrolite</string> + <string name="a11y_checked">Kontrolite</string> + <string name="a11y_close_emoji_picker">Fermi elektilon de bildosignoj</string> + <string name="a11y_open_emoji_picker">Malfermi elektilon de bildosignoj</string> + <string name="a11y_trust_level_trusted">Fidata fidnivelo</string> + <string name="a11y_trust_level_warning">Averta fidnivelo</string> + <string name="a11y_trust_level_default">Implicita fidnivelo</string> + <string name="a11y_selected">Elektitaj</string> + <string name="a11y_video">Filmo</string> + <string name="a11y_unsent_draft">Ĉi tiu ĉambro havas nesenditan malneton</string> + <string name="a11y_error_some_message_not_sent">Iuj mesaĝoj ne sendiĝis</string> + <string name="a11y_delete_avatar">Forigi profilbildon</string> + <string name="a11y_change_avatar">Ŝanĝi profilbildon</string> + <string name="a11y_image">Bildo</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-es/strings.xml b/vector/src/main/res/values-es/strings.xml index 076ca3ffed..5e5b4727e6 100644 --- a/vector/src/main/res/values-es/strings.xml +++ b/vector/src/main/res/values-es/strings.xml @@ -384,7 +384,7 @@ <string name="auth_register">Crear cuenta</string> <string name="auth_submit">Enviar</string> <string name="auth_skip">Omitir</string> - <string name="auth_send_reset_email">Enviar Correo Electrónico de Restauración</string> + <string name="auth_send_reset_email">Enviar un Correo Electrónico de Restauración</string> <string name="auth_return_to_login">Regresar a la pantalla de inicio de sesión</string> <string name="auth_user_id_placeholder">Correo electrónico o nombre de usuario</string> <string name="auth_password_placeholder">Contraseña</string> @@ -1012,7 +1012,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua </plurals> <!-- Widget Integration Manager --> <string name="title_activity_choose_sticker">Enviar una pegatina</string> - <string name="no_sticker_application_dialog_content">Actualmente no tienes ningún paquete de pegatinas habilitado. + <string name="no_sticker_application_dialog_content">Actualmente no tienes ningún paquete de stickers habilitado. \n \n¿Añadir algunos ahora\?</string> <string name="deactivate_account_title">Desactivar Cuenta</string> @@ -1173,7 +1173,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua <string name="abort">Cancelar</string> <string name="ignore">Ignorar</string> <string name="action_mark_room_read">Marcar como leído</string> - <string name="auth_login_sso">Iniciar sesión con single-sign-on</string> + <string name="auth_login_sso">Iniciar sesión con un solo registro</string> <string name="login_error_ssl_handshake">Tu dispositivo usa una versión anticuada e insegura del protocolo de seguridad TLS. Por tu seguridad no puedes conectarte</string> <string name="settings_notification_advanced">Ajustes avanzados de notificaciones</string> <string name="settings_notification_by_event">Importancia de notificación por evento</string> @@ -2589,7 +2589,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua <string name="call_hold_action">Esperar</string> <string name="call_resume_action">Continuar</string> <string name="action_return">Volver</string> - <string name="spaces_beta_welcome_to_spaces_desc">Los espacios son una manera de agrupar salas y personas por trabajo, diversión o lo que quieras.</string> + <string name="spaces_beta_welcome_to_spaces_desc">Los espacios son una nueva manera para agrupar salas y personas.</string> <string name="spaces_beta_welcome_to_spaces">¡Bienvenido a los Espacios!</string> <string name="join_space">Únete a un Espacio</string> <string name="create_space">Crea un Espacio</string> @@ -2599,4 +2599,176 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua <string name="create_spaces_type_header">Los Espacios son una nueva forma de agrupar salas y personas</string> <string name="initial_sync_start_server_computing">Sincronización inicial: \nEsperando respuesta del servidor…</string> + <string name="a11y_error_message_not_sent">El mensaje no se pudo enviar por un error</string> + <string name="a11y_view_read_receipts">Ver confirmaciones de recibido</string> + <string name="a11y_public_room">Esta sala es publica</string> + <string name="dev_tools_menu_name">Herramientas de Desarrollador</string> + <string name="dev_tools_send_custom_event">Enviar Evento Personalizado</string> + <string name="dev_tools_send_state_event">Enviar Estado del Evento</string> + <string name="dev_tools_send_custom_state_event">Enviar Estado del Evento Personalizado</string> + <string name="dev_tools_state_event">Estado de los Eventos</string> + <string name="this_space_has_no_rooms_not_admin">Algunas salas pueden estar ocultas debido a que son privadas y necesitas una invitación. +\nTu no tenes permiso para añadir salas.</string> + <string name="this_space_has_no_rooms_admin">Algunas salas pueden estar ocultas debido a que son privadas y necesitas una invitación para verlas.</string> + <string name="this_space_has_no_rooms">Este espacio no tiene salas</string> + <string name="space_mark_as_not_suggested">Marcar como no sugerido</string> + <string name="space_mark_as_suggested">Marcar como sugerido</string> + <string name="space_suggested">Sugerido</string> + <string name="make_this_space_public">Hacer este espacio publico</string> + <string name="user_invites_you">%s te invita</string> + <string name="labs_use_restricted_join_rule">Espacio Experimental - Sala Restringida.</string> + <string name="you_are_invited">Estas invitado</string> + <string name="space_add_rooms">Añadir salas</string> + <string name="space_leave_prompt_msg">Estas seguro de que quieres salir de este espacio\?</string> + <string name="leave_space">Salir de este espacio</string> + <string name="space_add_child_title">Añadir salas</string> + <string name="space_explore_activity_title">Explorar salas</string> + <string name="join_anyway">Unirte igualmente</string> + <string name="skip_for_now">Saltar por ahora</string> + <string name="invite_just_to_this_room">Solo esta sala</string> + <string name="invite_to_space_with_name">Invitar a %s</string> + <string name="invite_by_link">Compartir enlace</string> + <string name="invite_by_mxid">Invitar por nombre de usuario</string> + <string name="invite_by_email">Invitar por correo</string> + <string name="invite_to_space">Invitar a %s</string> + <string name="invite_people_to_your_space">Invitar gente a tu espacio</string> + <string name="invite_people_menu">Invitar gente</string> + <string name="create_space_topic_hint">Descripción</string> + <string name="create_spaces_loading_message">Creando espacio…</string> + <string name="create_spaces_default_public_random_room_name">Aleatorio</string> + <string name="create_spaces_default_public_room_name">General</string> + <string name="create_spaces_room_private_header">En que cosas estas trabajando\?</string> + <string name="create_space_error_empty_field_space_name">Dale un nombre para continuar.</string> + <string name="space_type_private_desc">Solo por invitación, lo mejor para tu mismo o para equipos</string> + <string name="space_type_private">Privado</string> + <string name="space_type_public_desc">Abierto a cualquiera, lo mejor para comunidades</string> + <string name="space_type_public">Publico</string> + <string name="create_spaces_me_and_teammates">Yo y mis compañeros</string> + <string name="create_spaces_just_me">Solo yo</string> + <string name="your_private_space">Tu espacio privado</string> + <string name="your_public_space">Tu espacio publico</string> + <string name="event_status_a11y_delete_all">Borrar todos los mensajes fallidos</string> + <string name="event_status_a11y_failed">Falló</string> + <string name="event_status_a11y_sent">Enviado</string> + <string name="event_status_a11y_sending">Enviando</string> + <string name="dev_tools_success_event">Evento enviado!</string> + <string name="dev_tools_event_content_hint">Contenido del evento</string> + <string name="dev_tools_error_malformed_event">Evento malformado</string> + <string name="dev_tools_error_no_content">Sin contenido</string> + <string name="dev_tools_form_hint_type">Tipo</string> + <string name="dev_tools_edit_content">Editar Contenido</string> + <string name="a11y_rule_notify_off">No notificar</string> + <string name="a11y_rule_notify_silent">Notificar sin sonido</string> + <string name="a11y_rule_notify_noisy">Notificar con sonido</string> + <string name="a11y_unchecked">Sin revisar</string> + <string name="a11y_checked">Revisado</string> + <string name="a11y_close_emoji_picker">Cerrar selector de Emojis</string> + <string name="a11y_open_emoji_picker">Abrir selector de Emojis</string> + <string name="a11y_selected">Seleccionada</string> + <string name="a11y_video">Video</string> + <string name="a11y_delete_avatar">Borrar avatar</string> + <string name="a11y_change_avatar">Cambiar avatar</string> + <string name="a11y_image">Imagen</string> + <string name="a11y_import_key_from_file">Importar clave desde un archivo</string> + <string name="a11y_open_widget">Abrir widgets</string> + <string name="a11y_screenshot">Captura de pantalla</string> + <string name="call_transfer_users_tab_title">Usuarios</string> + <string name="call_transfer_title">Transferir</string> + <string name="call_transfer_connect_action">Conectar</string> + <string name="call_transfer_consult_first">Preguntar primero</string> + <plurals name="call_only_paused"> + <item quantity="one">Llamada pausada</item> + <item quantity="other">%1$d llamadas pausadas</item> + </plurals> + <string name="call_only_active">Llamada activa (%1$s)</string> + <string name="call_dial_pad_title">Pad de marcado</string> + <string name="call_tile_ended">Esta llamada ha terminado</string> + <string name="call_tile_other_declined">%1$s ha cortado esta llamada</string> + <string name="call_tile_you_declined">Has cortado esta llamada %1$s</string> + <string name="call_tile_in_call">Ahora estas en esta llamada</string> + <string name="call_tile_other_started_call">%1$s empezó una llamada</string> + <string name="call_tile_you_started_call">Has empezado una llamada</string> + <plurals name="entries"> + <item quantity="one">%d entrada</item> + <item quantity="other">%d entradas</item> + </plurals> + <string name="room_settings_set_avatar">Configurar avatar</string> + <string name="default_message_emote_confetti">enviar confeti 🎉</string> + <string name="default_message_emote_snow">enviar nieve ❄️</string> + <plurals name="send_videos_with_original_size"> + <item quantity="one">Enviar el video con el tamaño original</item> + <item quantity="other">Enviar los videos con el tamaño original</item> + </plurals> + <string name="settings_server_upload_size_unknown">El limite es desconocido.</string> + <string name="settings_server_version">Versión del servidor</string> + <string name="settings_server_name">Nombre del servidor</string> + <string name="create_room_in_progress">Creando sala…</string> + <string name="create_room_alias_already_in_use">Esta dirección ya está en uso</string> + <string name="create_room_alias_hint">Dirección de la sala</string> + <string name="hide_advanced">Esconder avanzado</string> + <string name="show_advanced">Mostrar avanzado</string> + <string name="login_social_signin_with">Iniciar sesión con %s</string> + <string name="login_social_signup_with">Registrarse con %s</string> + <string name="login_social_continue_with">Continuar con %s</string> + <string name="login_social_continue">O</string> + <string name="room_list_quick_actions_room_settings">Ajustes de la sala</string> + <string name="attachment_viewer_item_x_of_y">%1$d de %2$d</string> + <string name="error_file_too_big_simple">El archivo es muy grande como para subirlo.</string> + <string name="a11y_beta">Esta característica esta en fase beta</string> + <string name="identity_server_consent_dialog_title">Enviar correos electrónicos y números de teléfono</string> + <string name="feedback_failed">Ha ocurrido un error al enviar reacción (%s)</string> + <string name="feedback_sent">Gracias, tu reacción ha sido enviada satisfactoriamente</string> + <string name="give_feedback">Dar una reacción</string> + <string name="room_preview_no_preview_join">Esta sala no tiene una vista previa. Quieres unirte a ella\?</string> + <string name="room_preview_not_found">Esta sala no es accesible en este momento. +\nIntentalo de nuevo luego, o pídele al administrador de la sala que se fije si tienes acceso.</string> + <string name="jitsi_leave_conf_to_join_another_one_content">Salir de la conferencia actual y cambiar a otra\?</string> + <string name="error_jitsi_join_conf">Lo siento, un error ha ocurrido cuando se intentaba unir a la conferencia</string> + <string name="room_settings_room_access_entry_unknown">Configuración de acceso desconocido (%s)</string> + <string name="room_alias_publish_to_directory">Publicar esta sala públicamente en el directorio de salas %1$s\?</string> + <string name="room_settings_guest_access_title">Permitir que invitados se unan</string> + <string name="room_alias_action_unpublish">Quitar publicación de esta dirección</string> + <string name="room_alias_publish_to_directory_error">No se puede recibir la visibilidad actual de esta sala (%1$s).</string> + <string name="room_alias_delete_confirmation">Borrar la dirección \"%1$s\"\?</string> + <string name="room_alias_unpublish_confirmation">Quitar publicación de dirección \"%1$s\"\?</string> + <string name="room_alias_published_alias_add_manually_submit">Publicar</string> + <string name="room_alias_published_alias_add_manually">Publicar una nueva dirección manualmente</string> + <string name="room_alias_published_other">Otras direcciones publicadas:</string> + <string name="room_settings_alias_subtitle">Mirar y controlar las direcciones de esta sala, y su visibilidad en la carpeta de salas.</string> + <string name="use_as_default_and_do_not_ask_again">Usar como predeterminado y no volver a preguntar</string> + <string name="spaces_invited_header">Invita</string> + <string name="settings_discovery_consent_title">Enviar emails y números de teléfono</string> + <string name="search_hint_room_name">Buscar Nombre</string> + <string name="send_file_step_compressing_video">Comprimiendo video %d%%</string> + <string name="send_file_step_compressing_image">Comprimiendo imagen…</string> + <string name="send_feedback_space_title">Feedback de espacios</string> + <string name="room_settings_room_version_title">Versión de sala</string> + <string name="room_settings_room_access_restricted_title">Espacios</string> + <string name="room_settings_room_access_public_description">Cualquiera puede encontrar y unirse a esta sala</string> + <string name="room_settings_room_access_public_title">Publico</string> + <string name="room_settings_room_access_private_title">Privada</string> + <string name="room_alias_action_publish">Publicar esta dirección</string> + <string name="room_alias_local_address_add">Añadir una dirección local</string> + <string name="room_alias_local_address_empty">Esta sala no tiene direcciones locales</string> + <string name="room_alias_local_address_title">Direcciones locales</string> + <string name="room_alias_address_hint">Nueva dirección publicada (ej. #alias:servidor)</string> + <string name="room_alias_address_empty">No hay otras direcciones publicadas.</string> + <string name="room_alias_main_address_hint">Dirección principal</string> + <string name="room_alias_published_alias_main">Esta es la dirección principal</string> + <string name="room_alias_published_alias_title">Direcciones publicadas</string> + <string name="room_alias_title">Direcciones de la Sala</string> + <string name="room_settings_alias_title">Direcciones de la sala</string> + <string name="room_settings_room_access_title">Acceso a la sala</string> + <string name="template_settings_add_3pid_flow_not_supported">No puedes hacer eso desde ${app_name} móvil</string> + <string name="option_always_ask">Siempre preguntar</string> + <string name="spaces_header">Espacios</string> + <string name="settings_room_directory_show_all_rooms_summary">mostrar todas las salas en el directorio de salas, incluyendo salas con contenido explícito.</string> + <string name="settings_room_directory_show_all_rooms">Mostrar salas con contenido explícito</string> + <string name="settings_category_room_directory">Directorio de la sala</string> + <string name="suggested_header">Salas sugeridas</string> + <string name="dialog_edit_hint">Nuevo valor</string> + <string name="action_switch">Cambiar</string> + <string name="event_status_sent_message">Mensaje enviado</string> + <string name="initial_sync_start_downloading">Sincronización inicial: +\nDescargando datos…</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index cd58abcbf7..88081c59c5 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -1514,7 +1514,7 @@ <string name="select_room_directory">Vali jututubade loend</string> <string name="directory_server_fail_to_retrieve_server">Server kas pole kättesaadav või on ülekoormatud</string> <string name="directory_server_type_homeserver">Sisesta koduserveri nimi, mille avalike jututubade loendit soovid näha</string> - <string name="directory_server_placeholder">Koduserveri aadress</string> + <string name="directory_server_placeholder">Serveri aadress</string> <string name="directory_server_all_rooms_on_server">Kõik jututoad %s serveris</string> <string name="directory_server_native_rooms">Kõik %s jututoad</string> <string name="lock_screen_hint">Kirjuta siia…</string> @@ -2676,7 +2676,7 @@ <string name="labs_use_restricted_join_rule_desc">Hoiatus: eeldab serveripoolset tuge ning katselise jututoa versiooni kasutamist</string> <string name="labs_use_restricted_join_rule">Katseline kogukonnakeskus - ligipääs on piiratud.</string> <string name="you_are_invited">Sa oled saanud kutse</string> - <string name="spaces_beta_welcome_to_spaces_desc">Kogukonnakeskused on võimalus siduda jututubasid ja inimesi nii tööks, meelelahutuseks kui lihtsalt sinu jaoks.</string> + <string name="spaces_beta_welcome_to_spaces_desc">Kogukonnakeskused on uus võimalus siduda jututubasid ja inimesi.</string> <string name="spaces_beta_welcome_to_spaces">Tere tulemast kasutama kogukonnakeskuseid!</string> <string name="space_add_existing_rooms">Lisa olemasolevaid jututubasid ja kogukonnakeskuseid</string> <string name="space_leave_prompt_msg">Kas oled kindel, et soovid lahkuda kogukonnakeskusest\?</string> @@ -2771,4 +2771,39 @@ <string name="send_file_step_compressing_image">Teen pildi väiksemaks…</string> <string name="use_as_default_and_do_not_ask_again">Kasuta vaikeseadistusena ja ära küsi uuesti</string> <string name="option_always_ask">Alati küsi</string> + <string name="this_space_has_no_rooms_admin">Mõned mitteavalikud jututoad võivad olla peidetud. Nendega liitumiseks vajad kutset.</string> + <string name="this_space_has_no_rooms_not_admin">Mõned mitteavalikud jututoad võivad olla peidetud. Nendega liitumiseks vajad kutset. +\nUue jututubade lisamiseks sul õigused puuduvad.</string> + <string name="this_space_has_no_rooms">Selles kogukonnakeskuses pole jututube</string> + <string name="spaces_no_server_support_description">Lisateavet saad oma koduserveri haldajalt</string> + <string name="spaces_no_server_support_title">Tundub, et sinu koduserver veel ei võimalda kogukonnakeskuste kasutamist</string> + <string name="spaces_feeling_experimental_subspace">Kas sa tahad katsetada\? +\nSa võid kogukonnakeskusele lisada ka teisi kogukonnakeskuseid.</string> + <string name="labs_space_show_orphan_in_home">Katseline kogukonnakeskus, mis näitab avalehel vaid hüljatud jututube</string> + <string name="space_add_rooms">Lisa jututube</string> + <string name="space_leave_prompt_msg_as_admin">Sa oled selle kogukonnakeskuse haldaja. Enne oma lahkumist palun lisa siia veel vähemalt üks uus haldaja.</string> + <string name="space_leave_prompt_msg_private">See ei ole avalik kogukonnakeskus. Ilma kutseta sa ei saa uuesti liituda.</string> + <string name="space_leave_prompt_msg_only_you">Sa oled siin viimane osaleja. Kui sa nüüd lahkud, siis mitte keegi, kaasa arvatud sa ise, ei saa hiljem enam liituda.</string> + <string name="invite_to_space">Kutse kogukonnakeskusesse %s</string> + <string name="a11y_beta">Tegemist on beeta-taseme funktsionaalsusega</string> + <string name="give_feedback">Jaga tagasisidet</string> + <string name="feedback_failed">Tagasiside saatmine ei õnnestunud (%s)</string> + <string name="feedback_sent">Tänud, sinu tagasiside saatmine õnnestus</string> + <string name="you_may_contact_me">Kui sul on lisaküsimusi, siis vastan neile hea meelega</string> + <string name="send_feedback_space_info">Sa kasutad kogukonnakeskuste beetaversiooni. Sinu saadetud teabe alusel saame teha parandusi selle järgmistes versioonides. Saadetud info parimaks kasutamiseks lisame sinna ka sinu kasutatava operatsioonisüsteemi nime ja sinu kasutajanime.</string> + <string name="feedback">Tagasiside</string> + <string name="send_feedback_space_title">Tagasiside kogukonnakeskuste kohta</string> + <string name="error_jitsi_join_conf">Vabandust, rühmakõnega liitumisel tekkis viga</string> + <string name="unnamed_room">Nimetu jututuba</string> + <string name="private_space">Privaatne kogukonnakeskus</string> + <string name="public_space">Avalik kogukonnakeskus</string> + <string name="a11y_public_space">See kogukonnakeskus on avalik</string> + <string name="call_transfer_unknown_person">Tundmatu isik</string> + <string name="call_transfer_transfer_to_title">Suuna kasutajale %1$s</string> + <string name="call_transfer_consulting_with">Pean nõu kasutajaga %1$s</string> + <string name="directory_add_a_new_server_error_already_added">See server on juba loendis olemas</string> + <string name="directory_add_a_new_server_error">Seda serverit kas ei leidu või seal puudub jututubade loend</string> + <string name="directory_add_a_new_server_prompt">Sisesta serveri nimi, mille sisu sa soovid uurida.</string> + <string name="directory_add_a_new_server">Lisa uus server</string> + <string name="directory_your_server">Sinu server</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml index 0681fed0df..628a6f8379 100644 --- a/vector/src/main/res/values-fa/strings.xml +++ b/vector/src/main/res/values-fa/strings.xml @@ -366,7 +366,7 @@ <string name="send_bug_report_failed">امکان ارسال گزارش اشکال وجود نداشت، دوباره تلاش کنید (%s)</string> <string name="send_bug_report_progress">پیشرفت (%s%%)</string> <string name="send_files_in">ارسال در</string> - <string name="hs_url">نشانی کارساز خانگی</string> + <string name="hs_url">نشانی کارساز(سرور) خانگی</string> <string name="identity_url">نشانی کارساز هویت</string> <string name="option_send_voice">ارسال صدا</string> <string name="start_new_chat_prompt_msg">آیا مطمئنید میخواهید با %s یک گپ جدید را آغاز کنید؟</string> @@ -386,7 +386,7 @@ <string name="auth_invalid_token">توکن نامعتبر است</string> <string name="auth_missing_email_or_phone">نشانی رایانامه یا شماره تلفن وارد نشده</string> <string name="auth_email_already_defined">این نشانی رایانامه قبلاً ثبت شده.</string> - <string name="auth_home_server">کارساز خانگی:</string> + <string name="auth_home_server">کارساز(سرور) خانگی:</string> <string name="auth_identity_server">کارساز هویت:</string> <string name="login_error_unable_login">امکان ورود وجود ندارد</string> <string name="attachment_remaining_time_minutes">%1$dد %2$dث</string> @@ -602,7 +602,7 @@ <string name="devices_delete_pswd">گذرواژه:</string> <string name="devices_delete_submit_button_label">ثبت</string> <string name="settings_logged_in">واردشده به عنوان</string> - <string name="settings_home_server">کارساز خانگی</string> + <string name="settings_home_server">کارساز(سرور) خانگی</string> <string name="settings_identity_server">کارساز هویت</string> <string name="settings_integration_allow">اجازهٔ یکپارچگیها</string> <string name="settings_integration_manager">مدیر یکپارچگی</string> @@ -2290,7 +2290,7 @@ <item quantity="one">%d دعوت</item> <item quantity="other">%d دعوت</item> </plurals> - <string name="directory_server_placeholder">نشانی کارساز خانگی</string> + <string name="directory_server_placeholder">نام کارساز</string> <string name="unknown_devices_alert_message">این اتاق شامل نشستهای تایید نشده هستند. \nهیچ تضمینی وجود ندارد این نشستهای تائیدنشده متعلق به کاربرانی باشد که فکر میکنید. \nتوضیه میشود افراد نشستهای خود را تائید کنند. هر چند در صورتی که تمایلی به این کار ندارید، همچنان میتوانید پیام ارسال کنید. @@ -2525,7 +2525,7 @@ <string name="login_social_sso">ورود یکپارچه</string> <string name="login_clear_homeserver_history">پاکسازی تاریخچه</string> <string name="command_confetti">فرستادن پیام داده با کاغذ رنگی</string> - <string name="command_snow">فرستادن پیام داده با برف</string> + <string name="command_snow">فرستادن پیام داده شده با بارش برف</string> <string name="default_message_emote_confetti">فرستادن کاغذ رنگی 🎉</string> <string name="default_message_emote_snow">فرستادن برف ❄️</string> <string name="authentication_error">احراز هویت انجام نشد</string> @@ -2676,7 +2676,7 @@ <string name="labs_use_restricted_join_rule_desc">هشدار به پشتیبانی سرور و نسخه اتاق آزمایشی نیاز دارد</string> <string name="labs_use_restricted_join_rule">فضای کاری آزمایشی - اتاق محدود.</string> <string name="you_are_invited">شما دعوت شدهاید</string> - <string name="spaces_beta_welcome_to_spaces_desc">فضایهای کاری روش هایی برای دستهبندی اتاقها و افراد برای کار، تفریح یا فقط خودتان است.</string> + <string name="spaces_beta_welcome_to_spaces_desc">اسپیس ها یک شیوه جدید برای دسته بندی اتاق ها و افراد هستند.</string> <string name="spaces_beta_welcome_to_spaces">به فضایهای کاری خوشآمدید!</string> <string name="space_add_existing_rooms">اتاقها و فضای کاری موجود را اضافه کنید</string> <string name="space_leave_prompt_msg">آیا مطمئن هستید که می خواهید فضای کاری را ترک کنید؟</string> @@ -2771,4 +2771,30 @@ <string name="send_file_step_compressing_image">فشردهسازی تصویر…</string> <string name="use_as_default_and_do_not_ask_again">به عنوان پیش فرض استفاده کن و دیگر سوال نپرس</string> <string name="option_always_ask">همواره بپرس</string> + <string name="invite_to_space">دعوت به %s</string> + <string name="call_transfer_unknown_person">شخص ناشناس</string> + <string name="call_transfer_transfer_to_title">انتقال به %1$s</string> + <string name="a11y_beta">این قابلیت در وضعیت بتا است</string> + <string name="give_feedback">به ما بازخورد دهید</string> + <string name="feedback_failed">ارسال بازخورد با شکست مواجه شد(%s)</string> + <string name="feedback_sent">سپاس! بازخورد شما با موفقیت ارسال شد</string> + <string name="send_feedback_space_info">شما در حال استفاده از نسخه بتای اسپیس هستید. بازخورد شما به آگاه کردن نسخه های بعدی کمک خواهد کرد. سکو و نام کاربری شما ثبت خواهد شد تا به ما در استفاده هرچه بیشتر از بازخورد شما کمک کند.</string> + <string name="feedback">بازخورد</string> + <string name="error_jitsi_join_conf">متاسفم، یک خطا زمانی که در تلاش برای اضافه شدن به کنفرانس بود ، اتفاق افتاد</string> + <string name="directory_add_a_new_server_error_already_added">این کارساز در حال حاضر در فهرست موجود است</string> + <string name="directory_add_a_new_server_error">نمیتوانم این کارساز یا فهرست اتاقش را بیابم</string> + <string name="directory_add_a_new_server_prompt">نام کارساز جدیدی که میخواهید در آن به جستجو بپردازید را وارد کنید</string> + <string name="directory_add_a_new_server">اضافه کردن یک کارساز(سرور) جدید</string> + <string name="directory_your_server">کارساز شما</string> + <string name="unnamed_room">اتاق نامگذاری نشده</string> + <string name="this_space_has_no_rooms_admin">بعضی اتاق ها ممکن است پنهان باشند زیرا خصوصی هستند و شما به یک دعوتنامه نیاز دارید.</string> + <string name="this_space_has_no_rooms_not_admin">بعضی اتاق ها ممکن است پنهان باشند زیرا خصوصی هستند و شما به یک دعوتنامه نیاز دارید. +\nشما اجازه اضافه کردن اتاق را ندارید.</string> + <string name="this_space_has_no_rooms">این اسپیس هیچ اتاقی ندارد</string> + <string name="spaces_no_server_support_description">لطفا برای آگاهی بیشتر با مدیر کارساز خود تماس بگیرید</string> + <string name="spaces_no_server_support_title">به نظر می رسد کارساز خانگی شما هنوز از اسپیس ها پشتیبانی نمی کند</string> + <string name="space_add_rooms">افزودن اتاق ها</string> + <string name="space_leave_prompt_msg_as_admin">شما مدیر این اسپیس هستید،مطمئن شوید قبل از خروج، حق مدیریت را به عضوی دیگر منتقل کرده اید.</string> + <string name="space_leave_prompt_msg_private">این اسپیس عمومی نیست. شما نمیتوانید بدون یک دعوتنامه دوباره ملحق شوید.</string> + <string name="space_leave_prompt_msg_only_you">شما تنها فرد اینجا هستید. اگر خارج شوید، هیچ کس از جمله شما قادر نخواهد بود در آینده ملحق شود.</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-fr-rCA/strings.xml b/vector/src/main/res/values-fr-rCA/strings.xml index e9e6e66d7c..fe2e08780e 100644 --- a/vector/src/main/res/values-fr-rCA/strings.xml +++ b/vector/src/main/res/values-fr-rCA/strings.xml @@ -369,8 +369,8 @@ <string name="send_suggestion_content">Saisissez votre suggestion ci-dessous.</string> <string name="send_suggestion">Faire une suggestion</string> <string name="settings_troubleshoot_test_token_registration_quick_fix">Inscrire le jeton</string> - <string name="preference_root_help_about">Aide & à propos</string> - <string name="preference_voice_and_video">Voix & vidéo</string> + <string name="preference_root_help_about">Aide et à propos</string> + <string name="preference_voice_and_video">Voix et vidéo</string> <string name="push_gateway_item_format">Format :</string> <string name="push_gateway_item_url">URL :</string> <string name="push_gateway_item_device_name">session_name :</string> @@ -381,7 +381,7 @@ <string name="settings_push_rules_no_rules">Aucune règle de notification définie</string> <string name="settings_push_rules">Règles de notification</string> <string name="settings_expert">Expert</string> - <string name="settings_security_and_privacy">Sécurité & vie privée</string> + <string name="settings_security_and_privacy">Sécurité et vie privée</string> <string name="settings_preferences">Préférences</string> <string name="settings_general_title">Général</string> <string name="quick_reactions">Réactions rapides</string> @@ -2171,7 +2171,7 @@ <string name="settings_deactivate_account_section">Désactiver le compte</string> <string name="reset_secure_backup_warning">Ceci remplacera votre clé ou phrase actuelle.</string> <string name="reset_secure_backup_title">Générer une nouvelle clé de sécurité ou définir une nouvelle phrase de sécurité pour votre sauvegarde existante.</string> - <string name="settings_secure_backup_section_info">Protection contre la perte d\'accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur.</string> + <string name="settings_secure_backup_section_info">Protection contre la perte d’accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur.</string> <string name="settings_secure_backup_enter_to_setup">Activer sur cet appareil</string> <string name="settings_secure_backup_reset">Réinitialiser la sauvegarde sécurisée</string> <string name="settings_secure_backup_setup">Activer la sauvegarde sécurisée</string> @@ -2722,4 +2722,76 @@ <string name="spaces_header">Espaces</string> <string name="spaces_invited_header">Invitations</string> <string name="suggested_header">Salons recommandés</string> + <string name="this_space_has_no_rooms_admin">Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation.</string> + <string name="this_space_has_no_rooms_not_admin">Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation. +\nVous n’avez pas l’autorisation d’ajouter des salons.</string> + <string name="this_space_has_no_rooms">Cet espace n’a pas de salons</string> + <string name="spaces_no_server_support_description">Veuillez contacter votre admin de serveur pour plus d’informations</string> + <string name="spaces_no_server_support_title">Il semble que votre serveur d’accueil ne prend pas encore en charge les espaces</string> + <string name="spaces_feeling_experimental_subspace">Envie d’expérimenter\? +\nVous pouvez ajouter des espaces existants à un espace.</string> + <string name="labs_space_show_orphan_in_home">Espace expérimental – afficher seulement les orphelins dans Accueil</string> + <string name="space_manage_rooms_and_spaces">Gérer les salons et les espaces</string> + <string name="space_mark_as_not_suggested">Marquer comme non recommandé</string> + <string name="space_mark_as_suggested">Marquer comme recommandé</string> + <string name="space_suggested">Recommandé</string> + <string name="make_this_space_public">Rendre cet espace public</string> + <string name="space_settings_manage_rooms">Gérer les salons</string> + <string name="looking_for_someone_not_in_space">Vous cherchez quelqu’un qui n’est pas dans %s\?</string> + <string name="user_invites_you">%s vous invite</string> + <string name="labs_use_restricted_join_rule_desc">Attention, nécessite la prise en charge par le serveur ainsi qu’une version de salon expérimentale</string> + <string name="labs_use_restricted_join_rule">Espace expérimental – salon restreint.</string> + <string name="you_are_invited">Vous êtes invité·e</string> + <string name="spaces_beta_welcome_to_spaces_desc">Les espaces sont une nouvelle manière de regrouper les salons et les gens.</string> + <string name="spaces_beta_welcome_to_spaces">Bienvenue dans les espaces!</string> + <string name="space_add_rooms">Ajouter des salons</string> + <string name="space_add_existing_rooms">Ajouter des salons et espaces existants</string> + <string name="space_leave_prompt_msg_as_admin">Vous êtes admin de cet espace, assurez-vous d’avoir transféré les droits d’admin à un autre membre avant de partir.</string> + <string name="space_leave_prompt_msg_private">Cet espace n’est pas public. Vous ne pourrez pas le rejoindre sans invitation.</string> + <string name="space_leave_prompt_msg_only_you">Vous êtes la seule personne ici. Si vous partez, personne ne pourra entrer à l’avenir, même pas vous.</string> + <string name="space_leave_prompt_msg">Voulez-vous vraiment quitter l’espace\?</string> + <string name="leave_space">Quitter l’espace</string> + <string name="space_add_child_title">Ajouter des salons</string> + <string name="space_explore_activity_title">Parcourir les salons</string> + <plurals name="space_people_you_know"> + <item quantity="one">%d personne que vous connaissez en fait partie</item> + <item quantity="other">%d personnes que vous connaissez en font partie</item> + </plurals> + <string name="suggested_rooms_pills_on_empty_header">Bienvenue dans %1$s, %2$s.</string> + <string name="suggested_rooms_pills_on_empty_text">Vous ne faites partie d’aucun salon pour l’instant. Vous trouverez ci-dessous les salons recommandés, mais vous pouvez en voir plus avec le bouton vert en bas à droite.</string> + <string name="room_alias_preview_not_found">Cet alias n’est pas accessible en ce moment. +\nRéessayez plus tard, ou demandez à un administrateur de ce salon de vérifier que vous pouvez y accéder.</string> + <string name="join_anyway">Rejoindre quand même</string> + <string name="join_space">Rejoindre l’espace</string> + <string name="create_space">Créer un espace</string> + <string name="skip_for_now">Passer pour l’instant</string> + <string name="share_space_link_message">Rejoignez mon espace %1$s %2$s</string> + <string name="invite_just_to_this_room_desc">Ne fera pas partie de %s</string> + <string name="invite_just_to_this_room">Seulement ce salon</string> + <string name="invite_to_space_with_name_desc">Permettra de parcourir les salons de %s</string> + <string name="invite_to_space_with_name">Inviter dans %s</string> + <string name="invite_by_link">Partager le lien</string> + <string name="invite_by_mxid">Inviter par nom d’utilisateur</string> + <string name="invite_by_email">Inviter par courriel</string> + <string name="invite_people_to_your_space_desc">Vous êtes seul·e pour l’instant. %s sera plus agréable avec de la compagnie.</string> + <string name="invite_to_space">Inviter à %s</string> + <string name="invite_people_menu">Inviter des personnes</string> + <string name="invite_people_to_your_space">Invitez des personnes dans votre espace</string> + <string name="create_space_topic_hint">Description</string> + <string name="create_spaces_loading_message">Création de l’espace…</string> + <string name="create_spaces_default_public_random_room_name">Aléatoire</string> + <string name="create_spaces_default_public_room_name">Général</string> + <string name="create_spaces_room_private_header_desc">Créons un salon pour chacun d’entre eux. Vous pourrez en ajouter plus tard, y compris certains déjà existant.</string> + <string name="create_spaces_room_private_header">Sur quels projets travaillez-vous\?</string> + <string name="create_spaces_room_public_header_desc">Nous allons créer les salons pour ces sujets. Vous pourrez en ajouter d’autres plus tard.</string> + <string name="create_spaces_room_public_header">De quoi allez-vous parler dans %s\?</string> + <string name="a11y_beta">Cette fonctionnalité est en bêta</string> + <string name="give_feedback">Envoyer des remarques</string> + <string name="feedback_failed">L’envoi des remarques a échoué (%s)</string> + <string name="feedback_sent">Merci, vos remarques ont bien été envoyées</string> + <string name="you_may_contact_me">Vous pouvez me contacter si vous avez des questions</string> + <string name="send_feedback_space_info">Vous utilisez une version bêta des espaces. Vos remarques aideront à concevoir les prochaines versions. Votre plateforme et votre nom d’utilisateur seront marqués pour nous aider à utiliser vos remarques autant que possible.</string> + <string name="feedback">Remarques</string> + <string name="send_feedback_space_title">Remarques sur les espaces</string> + <string name="error_jitsi_join_conf">Désolé, une erreur s’est produite en essayant d’entrer dans la conférence</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 9fb56dd860..2d5cad33f3 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -591,7 +591,7 @@ <string name="encryption_information_unblock">Supprimer de la liste noire</string> <string name="encryption_information_verify_device">Vérifier la session</string> <string name="select_room_directory">Sélectionner un répertoire de salons</string> - <string name="directory_server_placeholder">URL du serveur d’accueil</string> + <string name="directory_server_placeholder">Nom du serveur d’accueil</string> <string name="directory_server_all_rooms_on_server">Tous les salons sur le serveur %s</string> <string name="directory_server_native_rooms">Tous les salons natifs sur %s</string> <string name="historical_placeholder">Rechercher dans l’historique</string> @@ -1444,7 +1444,7 @@ <string name="quick_reactions">Réactions rapides</string> <string name="settings_general_title">Général</string> <string name="settings_preferences">Préférences</string> - <string name="settings_security_and_privacy">Sécurité & vie privée</string> + <string name="settings_security_and_privacy">Sécurité et vie privée</string> <string name="settings_expert">Expert</string> <string name="settings_push_rules">Règles de notification</string> <string name="settings_push_rules_no_rules">Aucune règle de notification définie</string> @@ -1455,8 +1455,8 @@ <string name="push_gateway_item_device_name">session_name :</string> <string name="push_gateway_item_url">URL :</string> <string name="push_gateway_item_format">Format :</string> - <string name="preference_voice_and_video">Voix & vidéo</string> - <string name="preference_root_help_about">Aide & à propos</string> + <string name="preference_voice_and_video">Voix et vidéo</string> + <string name="preference_root_help_about">Aide et à propos</string> <string name="settings_troubleshoot_test_token_registration_quick_fix">Inscrire le jeton</string> <string name="send_suggestion">Faire une suggestion</string> <string name="send_suggestion_content">Saisissez votre suggestion ci-dessous.</string> @@ -2358,7 +2358,7 @@ <string name="room_participants_power_level_demote">Rétrograder</string> <string name="reset_secure_backup_warning">Ceci remplacera votre clé ou phrase actuelle.</string> <string name="reset_secure_backup_title">Générer une nouvelle clé de sécurité ou définir une nouvelle phrase de sécurité pour votre sauvegarde existante.</string> - <string name="settings_secure_backup_section_info">Protection contre la perte d\'accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur.</string> + <string name="settings_secure_backup_section_info">Protection contre la perte d’accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur.</string> <string name="settings_secure_backup_enter_to_setup">Activer sur cet appareil</string> <string name="settings_secure_backup_manage">Gérer</string> <string name="settings_show_room_member_state_events_summary">Inclure les événement d’invitation/ajout/départ/expulsion/exclusion ainsi que les changements d’avatar et de nom d’affichage.</string> @@ -2705,7 +2705,7 @@ <string name="suggested_header">Salons recommandés</string> <string name="labs_use_restricted_join_rule">Espace expérimental – salon restreint.</string> <string name="you_are_invited">Vous êtes invité</string> - <string name="spaces_beta_welcome_to_spaces_desc">Les espaces sont un moyen de regrouper les salons et personnes pour travailler, s’amuser, ou juste pour vous-même.</string> + <string name="spaces_beta_welcome_to_spaces_desc">Les espaces sont une nouvelle manière de regrouper les salons et les gens.</string> <string name="spaces_beta_welcome_to_spaces">Bienvenue dans les espaces !</string> <string name="space_add_existing_rooms">Ajouter des salons et espaces existants</string> <string name="space_leave_prompt_msg">Voulez-vous vraiment quitter l’espace \?</string> @@ -2778,4 +2778,39 @@ <item quantity="one">Envoyer la vidéo en taille originale</item> <item quantity="other">Envoyer les vidéos en taille originale</item> </plurals> + <string name="labs_space_show_orphan_in_home">Espace expérimental – afficher seulement les orphelins dans Accueil</string> + <string name="space_leave_prompt_msg_as_admin">Vous êtes administrateur de cet espace, assurez-vous d’avoir transféré les droits d’administration à un autre membre avant de partir.</string> + <string name="send_feedback_space_info">Vous utilisez une version bêta des espaces. Vos remarques aideront à concevoir les prochaines versions. Votre plateforme et votre nom d’utilisateur seront marqués pour nous aider à utiliser vos remarques autant que possible.</string> + <string name="this_space_has_no_rooms_admin">Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation.</string> + <string name="this_space_has_no_rooms_not_admin">Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation. +\nVous n’avez pas l’autorisation d’ajouter des salons.</string> + <string name="this_space_has_no_rooms">Cet espace n’a pas de salons</string> + <string name="spaces_no_server_support_description">Veuillez contacter l’administrateur de votre serveur d’accueil pour plus d’informations</string> + <string name="spaces_no_server_support_title">Il semble que votre serveur d’accueil ne prend pas encore en charge les espaces</string> + <string name="spaces_feeling_experimental_subspace">Envie d’expérimenter \? +\nVous pouvez ajouter des espaces existants à un espace.</string> + <string name="space_add_rooms">Ajouter des salons</string> + <string name="space_leave_prompt_msg_private">Cet espace n’est pas public. Vous ne pourrez pas le rejoindre sans invitation.</string> + <string name="space_leave_prompt_msg_only_you">Vous êtes la seule personne ici. Si vous partez, personne ne pourra entrer à l’avenir, même pas vous.</string> + <string name="invite_to_space">Inviter à %s</string> + <string name="a11y_beta">Cette fonctionnalité est en bêta</string> + <string name="send_feedback_space_title">Remarques sur les espaces</string> + <string name="you_may_contact_me">Vous pouvez me contacter si vous avez des questions</string> + <string name="give_feedback">Envoyer des remarques</string> + <string name="feedback_failed">L’envoi des remarques a échoué (%s)</string> + <string name="feedback_sent">Merci, vos remarques ont bien été envoyées</string> + <string name="feedback">Remarques</string> + <string name="error_jitsi_join_conf">Désolé, une erreur s’est produite en essayant d’entrer dans la conférence</string> + <string name="unnamed_room">Salon sans nom</string> + <string name="private_space">Espace privé</string> + <string name="public_space">Espace public</string> + <string name="a11y_public_space">Cet espace est public</string> + <string name="call_transfer_unknown_person">Personne inconnue</string> + <string name="call_transfer_transfer_to_title">Transférer à %1$s</string> + <string name="directory_add_a_new_server_error_already_added">Ce serveur fait déjà partie de la liste</string> + <string name="directory_add_a_new_server_error">Impossible de trouver ce serveur ou la liste de ses salons</string> + <string name="directory_add_a_new_server_prompt">Saisissez le nom du nouveau serveur que vous souhaitez explorer.</string> + <string name="directory_add_a_new_server">Ajouter un nouveau serveur</string> + <string name="directory_your_server">Votre serveur</string> + <string name="call_transfer_consulting_with">Consultation de %1$s</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-gl/strings.xml b/vector/src/main/res/values-gl/strings.xml index 61beb07197..4af9956161 100644 --- a/vector/src/main/res/values-gl/strings.xml +++ b/vector/src/main/res/values-gl/strings.xml @@ -854,4 +854,7 @@ \nDescargando datos…</string> <string name="initial_sync_start_server_computing">Sincr. inicial: \nAgardando resposta do servidor…</string> + <string name="no_permissions_to_start_conf_call_in_direct_room">Non tes permisos para comezar unha chamada de conferencia nesta sala</string> + <string name="no_permissions_to_start_conf_call">Non tes permisos para comezar unha chamada de conferencia nesta sala</string> + <string name="event_status_sent_message">Mensaxe enviada</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 0c6558bcc9..797ea4f036 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -704,7 +704,7 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.</st <string name="select_room_directory">Válassz egy szoba könyvtárat</string> <string name="directory_server_fail_to_retrieve_server">A szerver lehet nem elérhető vagy túltöltött</string> <string name="directory_server_type_homeserver">Írj be egy Matrix szervert, az ott található nyilvános szobák listázásához</string> - <string name="directory_server_placeholder">Matrix szerver URL</string> + <string name="directory_server_placeholder">Szerver neve</string> <string name="directory_server_all_rooms_on_server">Összes szoba a %s szerveren</string> <string name="directory_server_native_rooms">Összes anyanyelvi %s szoba</string> <string name="historical_placeholder">Előzmények keresése</string> @@ -847,11 +847,11 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.</st <item quantity="other">%d tag</item> </plurals> <plurals name="room_new_messages_notification"> - <item quantity="one">1 új üzenet</item> + <item quantity="one">%d új üzenet</item> <item quantity="other">%d új üzenet</item> </plurals> <plurals name="directory_search_rooms"> - <item quantity="one">1 szoba</item> + <item quantity="one">%d szoba</item> <item quantity="other">%d szoba</item> </plurals> <plurals name="directory_search_rooms_for"> @@ -859,20 +859,20 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.</st <item quantity="other">%1$s szoba található ehhez: %2$s</item> </plurals> <plurals name="notification_unread_notified_messages"> - <item quantity="one">1 olvasatlan üzenet</item> + <item quantity="one">%d olvasatlan üzenet</item> <item quantity="other">%d olvasatlan üzenet</item> </plurals> <plurals name="notification_unread_notified_messages_in_room_msgs"> - <item quantity="one">1 olvasatlan üzenet értesítéssel</item> + <item quantity="one">%d olvasatlan üzenet értesítéssel</item> <item quantity="other">%d olvasatlan üzenet értesítéssel</item> </plurals> <plurals name="notification_unread_notified_messages_in_room_rooms"> - <item quantity="one">1 szoba</item> + <item quantity="one">%d szoba</item> <item quantity="other">%d szoba</item> </plurals> <string name="notification_unread_notified_messages_in_room">%1$s itt: %2$s</string> <plurals name="active_widgets"> - <item quantity="one">1 aktív kisalkalmazás</item> + <item quantity="one">%d aktív kisalkalmazás</item> <item quantity="other">%d aktív kisalkalmazás</item> </plurals> <!-- Widget Integration Manager --> @@ -963,11 +963,11 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés <item quantity="other">%dp</item> </plurals> <plurals name="format_time_h"> - <item quantity="one">1ó</item> + <item quantity="one">%dó</item> <item quantity="other">%dó</item> </plurals> <plurals name="format_time_d"> - <item quantity="one">1n</item> + <item quantity="one">%dn</item> <item quantity="other">%dn</item> </plurals> <string name="room_participants_now">Most: %1$s</string> @@ -976,15 +976,15 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés <string name="room_participants_invite_join_names_and">%1$s és %2$s</string> <string name="room_participants_invite_join_names_combined">%2$s %1$s</string> <plurals name="room_details_selected"> - <item quantity="one">1 kiválasztva</item> + <item quantity="one">%d kiválasztva</item> <item quantity="other">%d kiválasztva</item> </plurals> <plurals name="group_members"> - <item quantity="one">1 tag</item> + <item quantity="one">%d tag</item> <item quantity="other">%d tag</item> </plurals> <plurals name="group_rooms"> - <item quantity="one">1 szoba</item> + <item quantity="one">%d szoba</item> <item quantity="other">%d szoba</item> </plurals> <string name="system_alerts_header">Rendszerriasztások</string> @@ -1279,7 +1279,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="action_mark_room_read">Olvasottnak jelölés</string> <string name="settings_notification_privacy_no_background_sync">Az alkalmazásnak <b>nem</b> kell a háttérben folyamatosan a Matrix szerverrel tartani a kapcsolatot, ez csökkentheti az akkumulátor használatot</string> <plurals name="notification_compat_summary_line_for_room"> - <item quantity="one">%1$s: 1 üzenet</item> + <item quantity="one">%1$s: %2$d üzenet</item> <item quantity="other">%1$s: %2$d üzenet</item> </plurals> <plurals name="notification_compat_summary_title"> @@ -1361,9 +1361,9 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="room_list_catchup_welcome_title">Üdvözöllek itthon!</string> <string name="room_list_catchup_welcome_body">Olvasd el az olvasatlan üzeneteket itt</string> <string name="room_list_people_empty_title">Beszélgetések</string> - <string name="room_list_people_empty_body">A közvetlen beszélgetéseidet itt láthatod</string> + <string name="room_list_people_empty_body">A közvetlen beszélgetéseidet itt láthatod. Koppints a + -ra jobbra lent, hogy indíts egyet.</string> <string name="room_list_rooms_empty_title">Szobák</string> - <string name="room_list_rooms_empty_body">A szobáidat itt láthatod</string> + <string name="room_list_rooms_empty_body">A szobáidat itt láthatod. Koppints a + -ra jobbra lent a meglévők kereséséhez vagy egy saját indításához.</string> <string name="title_activity_emoji_reaction_picker">Reakciók</string> <string name="reactions_agree">Egyetértek</string> <string name="reactions_like">Kedvelem</string> @@ -1386,7 +1386,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="fab_menu_create_chat">Közvetlen üzenetek</string> <string name="create_room_title">Új szoba</string> <string name="create_room_action_create">KÉSZÍT</string> - <string name="create_room_name_hint">Szoba neve</string> + <string name="create_room_name_hint">Név</string> <string name="create_room_public_title">Nyilvános</string> <string name="create_room_public_description">Bárki csatlakozhat ehhez a szobához</string> <string name="create_room_directory_title">Szobák listája</string> @@ -1474,7 +1474,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="settings_call_ringtone_use_default_stun">Tartalék hívássegítő kiszolgáló engedélyezése</string> <string name="settings_call_ringtone_use_default_stun_sum">Segítőként a(z) %s lesz használatban ha a Matrix-kiszolgálója nem biztosít egyet (a hívás ideje alatt az IP-címed megosztásra kerül)</string> <string name="invite_no_identity_server_error">A beállításokban adj hozzá egy azonosítási szervert ehhez a művelethez.</string> - <string name="settings_background_fdroid_sync_mode">Háttér Szinkronizálási Mód (Kísérleti)</string> + <string name="settings_background_fdroid_sync_mode">Háttér Szinkronizálási Mód</string> <string name="settings_background_fdroid_sync_mode_battery">Optimalizált akkumulátor használat</string> <string name="template_settings_background_fdroid_sync_mode_battery_description">${app_name} a háttérben úgy szinkronizál, hogy a leginkább kímélje az eszköz korlátozott erőforrásait (akkumulátor). \nAz eszköz erőforrásainak állapotától függően a szinkronizációt az operációs rendszer elhalaszthatja.</string> @@ -1533,7 +1533,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="two_users_read">%1$s és %2$s olvasták</string> <string name="one_user_read">%s olvasta</string> <plurals name="fallback_users_read"> - <item quantity="one">1 felhasználó olvasta</item> + <item quantity="one">%d felhasználó olvasta</item> <item quantity="other">%d felhasználó olvasta</item> </plurals> <string name="error_file_too_big">\'%1$s\' (%2$s) fájl túl nagy a feltöltéshez. A korlát: %3$s.</string> @@ -1555,15 +1555,15 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="content_reported_title">Tartalom bejelentve</string> <string name="content_reported_content">Ez a tartalom bejelentve. \n -\nHa nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra</string> +\nHa nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra.</string> <string name="content_reported_as_spam_title">Bejelentve nem kívántként (spam)</string> <string name="content_reported_as_spam_content">Ez a tartalom nem kívántnak (spam) lett bejelentve. \n -\n Ha nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra</string> +\n Ha nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra.</string> <string name="content_reported_as_inappropriate_title">Nem idevalónak bejelentve</string> <string name="content_reported_as_inappropriate_content">Ez a tartalom nem idevalónak lett bejelentve. \n -\n Ha nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra</string> +\n Ha nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra.</string> <string name="template_permissions_rationale_msg_keys_backup_export">${app_name}nak engedélyre van szüksége ahhoz, hogy a végponttól végpontig titkosító kulcsokat a lemezre menthesse. \n \nKérlek a következő felugró ablakban engedélyezd a hozzáférést, hogy a kulcsokat kézzel kimenthesd.</string> @@ -1622,7 +1622,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="login_splash_submit">Kezdj neki</string> <string name="login_server_title">Válassz szervert</string> <string name="login_server_text">Hasonlóan az e-mailhez, egy fiókod van, de bárkivel tudsz beszélgetni</string> - <string name="login_server_matrix_org_text">Csatlakozz a milliónyi felhasználóhoz a legnagyobb nyilvános szerveren</string> + <string name="login_server_matrix_org_text">Csatlakozz a milliónyi felhasználóhoz ingyen a legnagyobb nyilvános szerveren</string> <string name="login_server_modular_text">Prémium szerver üzemeltetés szervezetek részére</string> <string name="login_server_modular_learn_more">Tudj meg többet</string> <string name="login_server_other_title">Egyéni</string> @@ -1838,7 +1838,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="command_description_rainbow_emote">A megadott hangulatjelet szivárvány színben küldi el</string> <string name="settings_category_timeline">Idővonal</string> <string name="settings_category_composer">Üzenet szerkesztő</string> - <string name="room_settings_enable_encryption">Végpontok közötti titkosítás engedélyezése</string> + <string name="room_settings_enable_encryption">Végpontok közötti titkosítás engedélyezése…</string> <string name="room_settings_enable_encryption_warning">Ha egyszer bekapcsolod, már nem lehet kikapcsolni.</string> <string name="room_settings_enable_encryption_dialog_title">Titkosítás engedélyezése\?</string> <string name="room_settings_enable_encryption_dialog_content">Ha egyszer engedélyezve lett, a szoba titkosítását nem lehet kikapcsolni. A titkosított szobákban küldött üzenetek a szerver számára nem, csak a szoba tagjai számára láthatók. A titkosítás bekapcsolása megakadályoz sok botot és hidat a megfelelő működésben.</string> @@ -2340,4 +2340,475 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró <string name="no_more_results">Nincs több eredmény</string> <string name="action_unpublish">Visszavonás</string> <string name="system_theme">Alapértelmezett rendszertéma</string> + <string name="notice_room_canonical_alias_no_change_by_you">A szoba címeit megváltoztattad.</string> + <string name="notice_room_canonical_alias_no_change">%1$s megváltoztatta a szoba címeit.</string> + <string name="notice_room_canonical_alias_main_and_alternative_changed_by_you">A szoba elsődleges és alternatív címeit megváltoztattad.</string> + <string name="notice_room_canonical_alias_main_and_alternative_changed">%1$s megváltoztatta a szoba elsődleges és alternatív címeit.</string> + <string name="notice_room_canonical_alias_alternative_changed_by_you">A szoba alternatív címét megváltoztattad.</string> + <string name="notice_room_canonical_alias_alternative_changed">%1$s megváltoztatta a szoba alternatív címét.</string> + <plurals name="notice_room_canonical_alias_alternative_removed_by_you"> + <item quantity="one">A szobához tartozó alternatív címet törölted: %1$s.</item> + <item quantity="other">A szobához tartozó alternatív címeket törölted: %1$s.</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_removed"> + <item quantity="one">%1$s törölte a szobához tartozó alternatív címet: %2$s.</item> + <item quantity="other">%1$s törölte a szobához tartozó alternatív címeket: %2$s.</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_added_by_you"> + <item quantity="one">A szobához hozzáadtad, mint alternatív cím: %1$s.</item> + <item quantity="other">A szobához hozzáadtad, mint alternatív címek: %1$s.</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_added"> + <item quantity="one">%1$s hozzáadta a szobához, mint alternatív cím: %2$s.</item> + <item quantity="other">%1$s hozzáadta a szobához, mint alternatív címek: %2$s.</item> + </plurals> + <string name="notice_room_canonical_alias_unset_by_you">A szoba elsődleges címét törölted.</string> + <string name="notice_room_canonical_alias_set_by_you">A szoba elsődleges címét beállítottad erre: %1$s.</string> + <string name="notice_room_aliases_added_and_removed_by_you">A szoba címét hozzáadtad: %1$s és törölted: %2$s.</string> + <plurals name="notice_room_aliases_removed_by_you"> + <item quantity="one">A szoba címét törölted: %1$s.</item> + <item quantity="other">A szoba címeit törölted: %1$s.</item> + </plurals> + <plurals name="notice_room_aliases_added_by_you"> + <item quantity="one">A szobához hozzáadtad mint cím: %1$s.</item> + <item quantity="other">A szobához hozzáadtad mint címek: %1$s.</item> + </plurals> + <string name="notice_room_withdraw_with_reason_by_you">%1$s meghívóját visszavontad. Ok: %2$s</string> + <string name="notice_room_third_party_registered_invite_with_reason_by_you">A meghívót elfogadtad ehhez: %1$s. Ok: %2$s</string> + <string name="notice_room_third_party_revoked_invite_with_reason_by_you">A meghívót visszavontad tőle, hogy beléphessen a szobába: %1$s. Ok: %2$s</string> + <string name="notice_room_third_party_invite_with_reason_by_you">Meghívót küldtél neki, hogy belépjen a szobába: %1$s. Ok: %2$s</string> + <string name="notice_room_ban_with_reason_by_you">Kitiltottad: %1$s. Ok: %2$s</string> + <string name="notice_room_unban_with_reason_by_you">Visszaengedted: %1$s. Ok: %2$s</string> + <string name="notice_room_kick_with_reason_by_you">Kirúgtad: %1$s. Ok: %2$s</string> + <string name="notice_room_reject_with_reason_by_you">A meghívót elutasítottad. Ok: %1$s</string> + <string name="notice_direct_room_leave_with_reason_by_you">Kiléptél. Ok: %1$s</string> + <string name="notice_direct_room_leave_with_reason">%1$s kilépett. Ok: %2$s</string> + <string name="notice_room_leave_with_reason_by_you">A szobát elhagytad. Ok: %1$s</string> + <string name="notice_direct_room_join_with_reason_by_you">Beléptél. Ok: %1$s</string> + <string name="notice_direct_room_join_with_reason">%1$s belépett. Ok: %2$s</string> + <string name="notice_room_join_with_reason_by_you">Beléptél a szobába: Ok: %1$s</string> + <string name="notice_room_invite_with_reason_by_you">Meghívtad: %1$s. Ok: %2$s</string> + <string name="notice_room_invite_no_invitee_with_reason_by_you">Meghívód. Ok: %1$s</string> + <string name="event_status_sent_message">Üzenet elküldve</string> + <string name="initial_sync_start_downloading">Kezdeti szinkronizálás: +\nAdatok letöltése…</string> + <string name="initial_sync_start_server_computing">Kezdeti szinkronizálás: +\nA szerver válaszára várakozás…</string> + <string name="room_displayname_empty_room_was">Üres szoba (%s volt)</string> + <plurals name="room_displayname_four_and_more_members"> + <item quantity="one">%1$s, %2$s, %3$s és még %4$d</item> + <item quantity="other">%1$s, %2$s, %3$s és még %4$d</item> + </plurals> + <string name="room_displayname_4_members">%1$s, %2$s, %3$s és %4$s</string> + <string name="room_displayname_3_members">%1$s, %2$s és %3$s</string> + <string name="notice_widget_jitsi_modified_by_you">Videó konferenciát módosítottad</string> + <string name="notice_widget_jitsi_modified">Videó konferenciát módosította: %1$s</string> + <string name="notice_widget_jitsi_removed_by_you">Befejezted a videó konferenciát</string> + <string name="notice_widget_jitsi_removed">Videó konferenciát befejezte: %1$s</string> + <string name="notice_widget_jitsi_added_by_you">Videó konferenciát indítottál</string> + <string name="notice_widget_jitsi_added">Videó konferenciát elindította: %1$s</string> + <string name="call_held_by_user">%s felfüggesztetted a hívást</string> + <string name="settings_troubleshoot_test_notification_title">Értesítés megjelenítése</string> + <string name="settings_troubleshoot_test_push_notification_content">Az értesítést látod. Kattints ide!</string> + <string name="settings_troubleshoot_test_push_loop_failed">A push-t nem sikerült megkapni. Megoldás lehet az alkalmazás újratelepítése.</string> + <string name="settings_troubleshoot_test_push_loop_success">Az alkalmazás megkapta a PUSH-t</string> + <string name="settings_troubleshoot_test_push_loop_waiting_for_push">Az alkalmazás a PUSH-ra vár</string> + <string name="settings_troubleshoot_test_push_loop_title">Push tesztelése</string> + <string name="error_threepid_auth_failed">Ellenőrizd, hogy rákattintottál arra a hivatkozásra amit e-mailben küldtünk neked.</string> + <string name="settings_remove_three_pid_confirmation_content">%s törlése\?</string> + <string name="search_is_not_supported_in_e2e_room">Titkosított szobákban való keresés egyelőre nem támogatott.</string> + <string name="search_banned_user_hint">Kitiltott felhasználók szűrése</string> + <string name="room_permissions_change_topic">Téma megváltoztatása</string> + <string name="room_permissions_upgrade_the_room">Szoba fejlesztése</string> + <string name="room_permissions_send_m_room_server_acl_events">m.room.server_acl esemény küldése</string> + <string name="room_permissions_change_permissions">Jogosultságok megváltoztatása</string> + <string name="room_permissions_change_room_name">Szoba nevének megváltoztatása</string> + <string name="room_permissions_change_history_visibility">Régi üzenetek láthatóságának megváltoztatása</string> + <string name="room_permissions_enable_room_encryption">Szoba titkosításának bekapcsolása</string> + <string name="room_permissions_change_main_address_for_the_room">A szoba elsődleges címének megváltoztatása</string> + <string name="room_permissions_change_room_avatar">Szoba profilkép megváltoztatása</string> + <string name="room_permissions_modify_widgets">Kisalkalmazások megváltoztatása</string> + <string name="room_permissions_notify_everyone">Mindenki értesítése</string> + <string name="room_permissions_remove_messages_sent_by_others">Mások által küldött üzenetek törlése</string> + <string name="room_permissions_ban_users">Felhasználók kitiltása</string> + <string name="room_permissions_kick_users">Felhasználók kirúgása</string> + <string name="room_permissions_change_settings">Beállítások megváltoztatása</string> + <string name="room_permissions_invite_users">Felhasználók meghívása</string> + <string name="room_permissions_send_messages">Üzenet küldése</string> + <string name="room_permissions_default_role">Alapértelmezett szerep</string> + <string name="room_permissions_notice_read_only">Nincs jogosultságod a szerepek megváltoztatásához, amik szükségesek a szoba bizonyos részeinek megváltoztatásához</string> + <string name="room_permissions_notice">A szoba bizonyos beállításainak megváltoztatásához szükséges szerep kiválasztása</string> + <string name="room_permissions_title">Jogosultságok</string> + <string name="room_settings_permissions_subtitle">Szerepek megjelenítése és megváltoztatása, amik szükségesek a szoba bizonyos részeinek megváltoztatásához.</string> + <string name="room_settings_permissions_title">Szoba jogosultságok</string> + <string name="room_participants_leave_private_warning">Ez a szoba nem nyilvános. Kilépés után csak újabb meghívóval tudsz újra belépni a szobába.</string> + <string name="call_held_by_you">Felfüggesztetted a hívást</string> + <string name="call_hold_action">Várakoztat</string> + <string name="call_resume_action">Folytatás</string> + <string name="error_unauthorized">Jogosulatlan, érvényes azonosítási adatok hiányoznak</string> + <string name="use_as_default_and_do_not_ask_again">Használd alapértelmezettként és ne kérdezze újra</string> + <string name="option_always_ask">Mindig kérdez</string> + <string name="spaces_header">Terek</string> + <string name="spaces_invited_header">Meghívók</string> + <string name="settings_room_directory_show_all_rooms_summary">Minden szoba megjelenítése ebben a könyvárban, beleértve a szókimondó tartalmú szobákat is.</string> + <string name="settings_room_directory_show_all_rooms">Szókimondó tartalmas szobák megjelenítése</string> + <string name="settings_category_room_directory">Szobák listája</string> + <string name="suggested_header">Javasolt szobák</string> + <string name="dialog_edit_hint">Új érték</string> + <string name="action_return">Visszatérés</string> + <string name="action_switch">Cserél</string> + <string name="notice_end_to_end_unknown_algorithm_by_you">A végpontok közötti titkosítást bekapcsoltad (ismeretlen algoritmus: %1$s).</string> + <string name="notice_end_to_end_ok_by_you">A végpontok közötti titkosítást bekapcsoltad.</string> + <string name="notice_direct_room_guest_access_forbidden_by_you">A vendégeknek megtiltottad, hogy belépjenek a szobába.</string> + <string name="notice_direct_room_guest_access_forbidden">%1$s megtiltotta a vendégeknek, hogy belépjenek ebbe a szobába.</string> + <string name="notice_room_guest_access_forbidden_by_you">A vendégeknek megtiltottad, hogy belépjenek a szobába.</string> + <string name="notice_direct_room_guest_access_can_join_by_you">A vendégeknek megengedted, hogy belépjenek ide.</string> + <string name="notice_direct_room_guest_access_can_join">%1$s megengedte a vendégeknek, hogy belépjenek ide.</string> + <string name="notice_room_guest_access_can_join_by_you">A vendégeknek megengedted, hogy belépjenek a szobába.</string> + <string name="this_space_has_no_rooms_not_admin">Néhány szoba rejtett lehet, mert privátok és meghívó kell hozzá. +\nNincs jogosultságod szobák hozzáadásához.</string> + <string name="this_space_has_no_rooms">Ezen a Téren nincsenek szobák</string> + <string name="spaces_no_server_support_description">További információért vedd fel a kapcsolatot a matrix szerver adminisztrátorával</string> + <string name="spaces_no_server_support_title">Úgy látszik a matrix szervered nem támogatja egyelőre a Tereket</string> + <string name="spaces_feeling_experimental_subspace">Szeretsz kísérletezni\? +\nTereket adhatsz terekhez.</string> + <string name="labs_space_show_orphan_in_home">Kísérleti tér - Csak árvák mutatása a Kezdőlapon</string> + <string name="space_manage_rooms_and_spaces">Szobák és terek kezelése</string> + <string name="space_mark_as_not_suggested">Nem javasoltnak jelölés</string> + <string name="space_mark_as_suggested">Javasoltnak jelölés</string> + <string name="space_suggested">Javaslat</string> + <string name="make_this_space_public">A tér legyen nyilvános</string> + <string name="space_settings_manage_rooms">Szobák kezelése</string> + <string name="looking_for_someone_not_in_space">Olyant keresel aki még nincs itt: %s\?</string> + <string name="user_invites_you">%s meghívott</string> + <string name="labs_use_restricted_join_rule_desc">Figyelmeztetés szerver oldali támogatás és kísérleti szoba verzió szükséges</string> + <string name="labs_use_restricted_join_rule">Kísérleti Tér - Korlátozott szobák.</string> + <string name="you_are_invited">Meghívtak</string> + <string name="spaces_beta_welcome_to_spaces_desc">Szobák és emberek csoportosításának új lehetősége a Terek használata.</string> + <string name="spaces_beta_welcome_to_spaces">Üdv a Terekben!</string> + <string name="space_add_rooms">Szobák hozzáadása</string> + <string name="space_add_existing_rooms">Létező szobák és tér hozzáadása</string> + <string name="space_leave_prompt_msg_as_admin">Most te vagy a tér adminisztrátora, bizonyosodj meg arról, hogy kineveztél mást adminisztrátornak mielőtt elhagyod.</string> + <string name="space_leave_prompt_msg_private">Ez a tér nem nyilvános. Kilépés után csak újabb meghívóval lehet újra belépni.</string> + <string name="space_leave_prompt_msg_only_you">Csak te van itt. Ha kilépsz, akkor a jövőben senki nem tud majd ide belépni, beleértve téged is.</string> + <string name="space_leave_prompt_msg">Biztos el akarod hagyni a teret\?</string> + <string name="leave_space">Tér elhagyása</string> + <string name="space_add_child_title">Szobák hozzáadása</string> + <string name="space_explore_activity_title">Szobák felderítése</string> + <plurals name="space_people_you_know"> + <item quantity="one">%d ember már csatlakozott</item> + <item quantity="other">%d ember már csatlakozott</item> + </plurals> + <string name="suggested_rooms_pills_on_empty_header">Üdv itt: %1$s, %2$s.</string> + <string name="suggested_rooms_pills_on_empty_text">Még egyik szobába sem vagy belépve. Alul van pár javasolt szoba, de többet is láthatsz a zöld gombbal jobb alsó sarokban.</string> + <string name="room_alias_preview_not_found">Ez az álnév jelenleg nem elérhető. +\nPróbáld meg később vagy kérdezd meg a szoba adminisztrátorát, hogy van-e hozzáférésed.</string> + <string name="join_anyway">Belépés mindenképpen</string> + <string name="join_space">Belépés a Térbe</string> + <string name="create_space">Tér készítése</string> + <string name="skip_for_now">Kihagy egyelőre</string> + <string name="share_space_link_message">Csatlakozz a Teremhez %1$s %2$s</string> + <string name="invite_just_to_this_room_desc">Nem lesznek a részesei ennek: %s</string> + <string name="invite_just_to_this_room">Csak ehhez a szobához</string> + <string name="invite_to_space_with_name_desc">Felfedezhetik ezt: %s</string> + <string name="invite_to_space_with_name">Meghívó ide: %s</string> + <string name="invite_by_link">Megosztás hivatkozás</string> + <string name="invite_by_mxid">Meghívás felhasználónévvel</string> + <string name="invite_by_email">Meghívás e-maillel</string> + <string name="invite_people_to_your_space_desc">Egyelőre csak te vagy itt, %s még jobb lehet másokkal együtt.</string> + <string name="invite_to_space">Meghívó ide: %s</string> + <string name="invite_people_to_your_space">Emberek meghívása a teredbe</string> + <string name="invite_people_menu">Személyek meghívása</string> + <string name="create_space_topic_hint">Leírás</string> + <string name="create_spaces_loading_message">Tér készítése…</string> + <string name="create_spaces_default_public_random_room_name">Véletlen</string> + <string name="create_spaces_default_public_room_name">Általános</string> + <string name="create_spaces_room_private_header_desc">Készítsünk mindegyik szobához egyet. Később is hozzáadhatsz újakat vagy akár meglévőket.</string> + <string name="create_spaces_room_private_header">Milyen projekteken dolgozol\?</string> + <string name="create_spaces_room_public_header_desc">Készítünk szobákat számukra. Később még adhatsz hozzájuk.</string> + <string name="create_spaces_room_public_header">Milyen beszélgetéseket szeretnél itt: %s\?</string> + <string name="create_space_error_empty_field_space_name">A folytatáshoz adj neki nevet.</string> + <string name="create_spaces_details_private_header">Adj hozzá információkat amik segítenek az embereknek beazonosítani. Bármikor megváltoztathatod.</string> + <string name="create_spaces_details_public_header">Adj hozzá pár információt, hogy tűnjön ki. Bármikor megváltoztathatod.</string> + <string name="activity_create_space_title">Tér készítése</string> + <string name="space_type_private_desc">Csak meghívóval, saját célra és csoportoknak ideális</string> + <string name="space_type_private">Privát</string> + <string name="space_type_public_desc">Nyílt tér mindenkinek, a legjobb a közösségeknek</string> + <string name="space_type_public">Nyilvános</string> + <string name="create_spaces_private_teammates">Privát tér neked és a csoporttársaidnak</string> + <string name="create_spaces_me_and_teammates">Én és a csoporttársaim</string> + <string name="create_spaces_organise_rooms">Privát tér a szobáid csoportosításához</string> + <string name="create_spaces_just_me">Csak én</string> + <string name="create_spaces_make_sure_access">Ellenőrizd, hogy a megfelelő személyeknek van hozzáférése ide: %s. Később ezt megváltoztathatod.</string> + <string name="settings_security_pin_code_notifications_summary_off">Csak az olvasatlan üzenetek számát mutassa az egyszerű értesítésekben.</string> + <string name="create_spaces_who_are_you_working_with">Kivel dolgozol együtt\?</string> + <string name="create_spaces_join_info_help">Létező térbe való belépéshez meghívó szükséges.</string> + <string name="create_spaces_you_can_change_later">Ezt később meg lehet változtatni</string> + <string name="create_spaces_choose_type_label">Milyen típusú teret szeretnél készíteni\?</string> + <string name="create_spaces_type_header">Szobák és emberek csoportosításának új lehetősége a Terek használata</string> + <string name="your_private_space">Privát tér</string> + <string name="your_public_space">Nyilvános tér</string> + <string name="add_space">Tér hozzáadása</string> + <string name="event_status_delete_all_failed_dialog_message">Biztos, hogy törlöd az összes el nem küldött üzenetet a szobában\?</string> + <string name="event_status_delete_all_failed_dialog_title">El nem küldött üzenetek törlése</string> + <string name="event_status_failed_messages_warning">Üzeneteket nem lehetett elküldeni</string> + <string name="event_status_cancel_sending_dialog_message">Megszakítod az üzenetek küldését\?</string> + <string name="event_status_a11y_delete_all">Minden hibás üzenet törlése</string> + <string name="event_status_a11y_failed">Hiba</string> + <string name="event_status_a11y_sent">Elküldve</string> + <string name="event_status_a11y_sending">Küldés</string> + <string name="command_description_join_space">Megadott azonosítójú térbe belépés</string> + <string name="command_description_leave_room">A megadott azonosítójú szoba elhagyása (vagy az aktuális szoba, ha üres)</string> + <string name="command_description_create_space">Tér készítése</string> + <string name="dev_tools_event_content_hint">Esemény tartalma</string> + <string name="dev_tools_success_state_event">Állapot esemény elküldve!</string> + <string name="dev_tools_success_event">Az esemény elküldve!</string> + <string name="dev_tools_error_malformed_event">Hibás esemény</string> + <string name="dev_tools_error_no_message_type">Üzenet típus hiányzik</string> + <string name="dev_tools_error_no_content">Nincs tartalom</string> + <string name="dev_tools_form_hint_event_content">Esemény tartalma</string> + <string name="dev_tools_form_hint_state_key">Állapotkulcs</string> + <string name="dev_tools_form_hint_type">Típus</string> + <string name="dev_tools_send_custom_state_event">Egyedi állapot esemény küldése</string> + <string name="dev_tools_send_state_event">Állapot esemény küldése</string> + <string name="dev_tools_state_event">Állapot események</string> + <string name="dev_tools_edit_content">Tartalom szerkesztése</string> + <string name="dev_tools_send_custom_event">Egyéni esemény elküldése</string> + <string name="dev_tools_explore_room_state">Szoba állapot felderítése</string> + <string name="dev_tools_menu_name">Fejlesztői Eszközök</string> + <string name="a11y_public_room">Ez egy nyilvános szoba</string> + <string name="a11y_view_read_receipts">Olvasás visszajelzés megjelenítése</string> + <string name="a11y_rule_notify_off">Nincs értesítés</string> + <string name="a11y_rule_notify_silent">Értesítés hang nélkül</string> + <string name="a11y_rule_notify_noisy">Értesítés hanggal</string> + <string name="a11y_error_message_not_sent">Üzenet hiba miatt nincs elküldve</string> + <string name="a11y_unchecked">Nem megjelölve</string> + <string name="a11y_checked">Megjelölve</string> + <string name="a11y_close_emoji_picker">Emodzsi választó bezárás</string> + <string name="a11y_open_emoji_picker">Emodzsi választó megnyitás</string> + <string name="a11y_trust_level_trusted">Megbízható megbízhatósági szint</string> + <string name="a11y_trust_level_warning">Megbízhatóság figyelmeztetési szint</string> + <string name="a11y_trust_level_default">Alapértelmezett megbízhatósági szint</string> + <string name="a11y_selected">Kiválasztott</string> + <string name="a11y_video">Videó</string> + <string name="a11y_unsent_draft">Ebben a szobába küldetlen piszkozat van</string> + <string name="a11y_error_some_message_not_sent">Néhány üzenet nem lett elküldve</string> + <string name="a11y_delete_avatar">Profilkép törlése</string> + <string name="a11y_change_avatar">Profilkép megváltoztatása</string> + <string name="a11y_image">Kép</string> + <string name="a11y_import_key_from_file">Kulcs betöltése fájlból</string> + <string name="a11y_open_widget">Kisalkalmazások megnyitása</string> + <string name="a11y_screenshot">Képernyőkép</string> + <string name="authentication_error">Azonosítás sikertelen</string> + <string name="template_re_authentication_default_confirm_text">A művelet elvégzéséhez ${app_name} kéri, hogy adja meg az azonosításhoz az adatokat.</string> + <string name="re_authentication_activity_title">Újra-Azonosítás szükséges</string> + <string name="call_transfer_users_tab_title">Felhasználók</string> + <string name="call_transfer_failure">A hívás átadásánál hiba történt</string> + <string name="failed_to_initialize_cross_signing">Eszközök közötti aláírást nem sikerült beállítani</string> + <string name="settings_export_trail">Audit kiexportálása</string> + <string name="delete_account_data_warning">%1$s fiók adatait törlöd\? +\n +\nÓvatosan használd, váratlan következményei lehetnek.</string> + <string name="login_error_outdated_homeserver_warning_content">Ez egy régi verziójú mátrix szerver. Kérd meg a matrix szerver adminisztrátorát, hogy frissítse. Folytathatod, de néhány funkció nem fog megfelelően működni.</string> + <string name="room_settings_room_access_restricted_description">Mindenki aki ezzel a szobával egy Térben van megtalálhatja és beléphet. Csak a szoba adminisztrátorok tudják Térhez adni.</string> + <string name="this_space_has_no_rooms_admin">Néhány szoba lehet rejtett, mert privát és meghívóra van szükséged.</string> + <string name="call_transfer_title">Átadás</string> + <string name="call_transfer_connect_action">Kapcsolódás</string> + <string name="call_transfer_consult_first">Először tájékozódj</string> + <plurals name="call_one_active_and_other_paused"> + <item quantity="one">1 aktív hívás (%1$s) · 1 hívás tartásban</item> + <item quantity="other">1 aktív hívás (%1$s) · %2$d hívás tartásban</item> + </plurals> + <plurals name="call_only_paused"> + <item quantity="one">Hívás tartásban</item> + <item quantity="other">%1$d hívás tartásban</item> + </plurals> + <string name="call_only_active">Aktív hívás (%1$s)</string> + <string name="call_dial_pad_lookup_error">A telefonszám megkeresésekor hiba történt</string> + <string name="call_dial_pad_title">Tárcsázó számlap</string> + <string name="call_tile_call_back">Visszahívás</string> + <string name="call_tile_ended">Hívás befejeződött</string> + <string name="call_tile_other_declined">%1$s elutasította a hívást</string> + <string name="call_tile_you_declined">Elutasítottad ezt a hívást: %1$s</string> + <string name="call_tile_in_call">Jelenleg ebben a hívásban van</string> + <string name="call_tile_other_started_call">%1$s hívást kezdeményezett</string> + <string name="call_tile_you_started_call">Hívást kezdeményeztél</string> + <string name="matrix_to_card_title">Matrix hivatkozás</string> + <string name="warning_unsaved_change_discard">Változtatások elvetése</string> + <string name="warning_unsaved_change">Mentetlen változások vannak. Elveted a változásokat\?</string> + <string name="warning_room_not_created_yet">A szoba még nem készült el. Megszakítod a szoba készítést\?</string> + <string name="universal_link_malformed">A hivatkozás hibás volt</string> + <string name="cannot_dm_self">Saját magadnak nem küldhetsz közvetlen üzenetet!</string> + <string name="share_by_text">Szöveggel megosztás</string> + <string name="room_error_not_found">A szoba nem található. Biztos, hogy létezik\?</string> + <string name="error_opening_banned_room">A szoba nem nyitható meg ahonnan kitiltottak.</string> + <string name="settings_security_pin_code_change_pin_summary">Jelenlegi PIN kód megváltoztatása</string> + <string name="settings_security_pin_code_change_pin_title">PIN megváltoztatása</string> + <string name="template_settings_security_pin_code_grace_period_summary_off">${app_name} megnyitásához mindig PIN kód szükséges.</string> + <string name="template_settings_security_pin_code_grace_period_summary_on">Ha nem használsz ilyent: ${app_name} akkor 2 perc elteltével PIN kód megadása szükséges.</string> + <string name="settings_security_pin_code_grace_period_title">2 perc elteltével PIN szükséges</string> + <string name="settings_security_pin_code_use_biometrics_summary_on">Eszköz specifikus biometrikus azonosítás engedélyezése, mint ujjlenyomat vagy arcfelismerés.</string> + <plurals name="entries"> + <item quantity="one">%d bejegyzés</item> + <item quantity="other">%d bejegyzés</item> + </plurals> + <string name="phone_book_perform_lookup">Kapcsolatok keresése a Matrixban</string> + <string name="room_settings_set_avatar">Profilkép beállítása</string> + <string name="identity_server_user_consent_not_provided">Nincs felhasználói hozzájárulás.</string> + <string name="confirm_your_identity_quad_s">Erősítsd meg a személyazonosságod ebben a belépésben, hogy hozzáférj a titkosított üzenetekhez.</string> + <string name="default_message_emote_snow">hóesést küld ❄️</string> + <string name="default_message_emote_confetti">konfettit küld 🎉</string> + <string name="command_snow">Az üzenet elküldése hóeséssel</string> + <string name="command_confetti">Az üzenet elküldése konfettivel</string> + <plurals name="secure_backup_reset_devices_you_can_verify"> + <item quantity="one">Eszköz megjelenítése amivel most ellenőrizni lehet</item> + <item quantity="other">%d eszköz megjelenítése amivel most ellenőrizni lehet</item> + </plurals> + <string name="secure_backup_reset_no_history">Tiszta lappal indulsz, üzenetek, megbízható eszközök és felhasználók nélkül</string> + <string name="secure_backup_reset_if_you_reset_all">Ha mindent visszaállítasz</string> + <string name="secure_backup_reset_all_no_other_devices">Csak akkor csináld, ha nincs másik eszközöd amivel ellenőrizni tudnád ezt.</string> + <string name="secure_backup_reset_all">Minden visszaállítása</string> + <string name="bad_passphrase_key_reset_all_action">Elfelejtetted vagy elvesztetted az összes visszaállítási lehetőséget\? Minden visszaállítása</string> + <string name="settings_server_upload_size_content">A matrix szervered elfogad csatolmányokat (fájlt, médiát, stb.) egészen eddig a méretig: %s.</string> + <string name="room_settings_enable_encryption_no_permission">A titkosítás bekapcsolásához nincs jogosultságod.</string> + <string name="create_room_disable_federation_title">A szobába soha ne léphessenek be azok, akik nem ezen a szerveren vannak:%s</string> + <string name="login_msisdn_notice">Használd a nemzetközi formátumot (a telefonszámnak „+” jellel kell kezdődnie)</string> + <string name="login_social_signin_with">Bejelentkezés ezzel: %s</string> + <string name="login_social_signup_with">Fiókkészítés ezzel: %s</string> + <string name="topic_prefix">"Téma: "</string> + <string name="direct_room_created_summary_item_by_you">Beléptél.</string> + <string name="direct_room_created_summary_item">%s csatlakozott.</string> + <string name="send_images_and_video_with_original_size">Média fájl küldése eredeti méretben</string> + <plurals name="send_videos_with_original_size"> + <item quantity="one">Videó küldése eredeti méretben</item> + <item quantity="other">Videók küldése eredeti méretben</item> + </plurals> + <string name="settings_server_upload_size_unknown">Ismeretlen határérték.</string> + <string name="settings_server_upload_size_title">Szerver fájl feltöltési határérték</string> + <string name="settings_server_version">Szerver verziószám</string> + <string name="settings_server_name">Szerver neve</string> + <string name="room_member_open_or_create_dm">Közvetlen beszélgetés</string> + <string name="direct_room_profile_section_more_leave">Elhagy</string> + <string name="direct_room_profile_encrypted_subtitle">A szobában az üzenetek végponttól végpontig titkosítva vannak. +\n +\nAz üzeneteidet zárolással vannak biztosítva és csak neked és a címzetteknek van meg a kulcs hozzá.</string> + <string name="direct_room_profile_not_encrypted_subtitle">Itt az üzenetek nincsenek végponttól végpontig titkosítva.</string> + <string name="sent_verification_conclusion">Azonosítás eredménye</string> + <string name="sent_a_bot_buttons">Bot Gomb</string> + <string name="sent_a_poll">Szavazás</string> + <string name="create_room_in_progress">Szoba létrehozása…</string> + <string name="create_room_alias_invalid">Néhány karakter nem engedélyezett</string> + <string name="create_room_alias_empty">Kérlek add meg a szoba címét</string> + <string name="create_room_alias_already_in_use">Ez a cím már használatban van</string> + <string name="create_room_alias_hint">Szoba címe</string> + <string name="create_room_disable_federation_description">Beállíthatod, ha a szobát csak egy belső csoport használja majd a matrix szervereden. Ezt később nem lehet megváltoztatni.</string> + <string name="hide_advanced">Haladó elrejtése</string> + <string name="show_advanced">Speciális megjelenítése</string> + <string name="login_clear_homeserver_history">Régi üzenetek törlése</string> + <string name="login_social_sso">Egyszeri bejelentkezés</string> + <string name="login_social_continue_with">Folytatás ezzel: %s</string> + <string name="login_social_continue">Vagy</string> + <string name="room_alias_local_address_subtitle">Állíts be címet ehhez a szobához, hogy a felhasználók a matrix szervereden megtalálhassák (%1$s)</string> + <string name="direct_room_join_rules_invite_by_you">Meghívásossá tetted.</string> + <string name="direct_room_join_rules_invite">%1$s meghívásossá tette.</string> + <string name="room_list_quick_actions_room_settings">Szoba beállításai</string> + <string name="room_list_quick_actions_low_priority_remove">Alacsony prioritásúak közül kivesz</string> + <string name="room_list_quick_actions_low_priority_add">Alacsony prioritásúakhoz ad</string> + <string name="attachment_viewer_item_x_of_y">%1$d / %2$d</string> + <string name="rotate_and_crop_screen_title">Forgatás és vágás</string> + <string name="error_file_too_big_simple">A fájl túl nagy a feltöltéshez.</string> + <string name="a11y_beta">Ez egy béta funkció</string> + <string name="a11y_create_direct_message_by_mxid">Közvetlen beszélgetés indítása Matrix azonosítóval</string> + <string name="identity_server_consent_dialog_title">Email címek és telefonszámok küldése</string> + <string name="settings_discovery_consent_action_give_consent">Beleegyezés adása</string> + <string name="settings_discovery_consent_action_revoke">Beleegyezés visszavonása</string> + <string name="settings_discovery_consent_notice_off">Nem egyeztél bele abba, hogy e-mail címeket és telefonszámokat küldjél ennek az azonosítási szervernek más felhasználók felderítéséhez a névjegyzékedből.</string> + <string name="settings_discovery_consent_notice_on">Beleegyeztél abba, hogy e-mail címeket és telefonszámokat küldjél ennek az azonosítási szervernek más felhasználók felderítéséhez a névjegyzékedből.</string> + <string name="settings_discovery_consent_title">Email címek és telefonszámok küldése</string> + <string name="direct_room_user_list_suggestions_title">Javaslatok</string> + <string name="direct_room_user_list_contacts_title">Névjegyek</string> + <string name="direct_room_user_list_recent_title">Legutóbbi</string> + <string name="search_hint_room_name">Név keresése</string> + <string name="send_file_step_compressing_video">Videó tömörítése (%d%%)</string> + <string name="send_file_step_compressing_image">Kép tömörítése…</string> + <string name="settings_labs_show_complete_history_in_encrypted_room">Teljes tartalom megmutatása titkosított szobákban</string> + <string name="give_feedback">Visszajelzés adása</string> + <string name="feedback_failed">A visszajelzésed nem sikerült elküldeni (%s)</string> + <string name="feedback_sent">Köszönjük, a visszajelzésed sikeresen elküldésre került</string> + <string name="you_may_contact_me">Ha további kérdés merülne fel, kapcsolatba léphetnek velem</string> + <string name="send_feedback_space_info">A Terek béta verzióját használod. A visszajelzésed segít a következő verzió elkészítésében. A platform és felhasználói neved feljegyzésre kerül, hogy minél jobban felhasználhassuk a visszajelzésed.</string> + <string name="feedback">Visszajelzés</string> + <string name="send_feedback_space_title">Visszajelzés a Terekről</string> + <string name="create_room_topic_hint">Téma</string> + <string name="create_room_topic_section">Szoba témája (nem kötelező)</string> + <string name="create_room_name_section">Szoba neve</string> + <string name="room_preview_no_preview_join">Ennek a szobának nincs előnézete. Szeretnél csatlakozni\?</string> + <string name="room_preview_not_found">Ez a szoba jelenleg nem elérhető. +\nPróbáld meg később vagy kérdezd meg a szoba adminisztrátorát, hogy van-e hozzáférésed.</string> + <string name="jitsi_leave_conf_to_join_another_one_content">Elhagyod ezt a konferenciát és átváltasz egy másikba\?</string> + <string name="error_jitsi_join_conf">Bocsánat, a konferenciába való belépésnél hiba történt</string> + <string name="notification_unread_notified_messages_and_invitation">%1$s és %2$s</string> + <string name="notification_unread_notified_messages_in_room_and_invitation">%1$s, %2$s és %3$s</string> + <plurals name="notification_invitations"> + <item quantity="one">%d meghívó</item> + <item quantity="other">%d meghívó</item> + </plurals> + <string name="room_settings_room_version_title">Szoba verzió</string> + <string name="room_settings_room_access_restricted_title">Terek</string> + <string name="room_settings_room_access_public_description">Bárki rátalálhat és beléphet a szobába</string> + <string name="room_settings_room_access_public_title">Nyilvános</string> + <string name="room_settings_room_access_private_description">Csak a meghívott személyek találják meg és tudnak belépni</string> + <string name="room_settings_room_access_private_title">Privát</string> + <string name="room_settings_room_access_entry_unknown">Ismeretlen hozzáférési beállítás (%s)</string> + <string name="room_settings_room_access_entry_knock">Bárki bekopoghat a szobába, a szoba tagok be tudják engedni vagy el tudják küldeni</string> + <string name="room_alias_publish_to_directory_error">A jelenlegi szoba láthatóságát a listában nem lehet lekérdezni (%1$s).</string> + <string name="room_alias_publish_to_directory">Publikálod a szobát ennek a domainnek a szoba listájában: %1$s\?</string> + <string name="room_alias_action_unpublish">A cím nyilvánosságának visszavonása</string> + <string name="room_alias_action_publish">A cím nyilvánossá tétele</string> + <string name="room_alias_local_address_add">Helyi cím hozzáadása</string> + <string name="room_alias_local_address_empty">Ennek a szobának nincs helyi címe</string> + <string name="room_alias_local_address_title">Helyi címek</string> + <string name="room_alias_address_hint">Új nyilvános cím (pl.: #becenév:szerver)</string> + <string name="room_alias_address_empty">Nincs másik nyilvánosságra hozott cím.</string> + <string name="room_alias_address_empty_can_add">Nincs másik nyilvánosságra hozott cím, alább adj hozzá egyet.</string> + <string name="room_alias_publish">Publikálod a szobát ennek a domainnek a szoba listájában: %1$s\?</string> + <string name="room_alias_delete_confirmation">„%1$s” címet törlöd\?</string> + <string name="room_alias_unpublish_confirmation">„%1$s” cím nyilvánosságát visszavonod\?</string> + <string name="room_alias_published_alias_add_manually_submit">Nyilvánosságra hoz</string> + <string name="room_alias_published_alias_add_manually">Új cím nyilvánosságra hozatala manuálisan</string> + <string name="room_alias_published_other">Más nyilvánosságra hozott címek:</string> + <string name="room_alias_main_address_hint">Fő cím</string> + <string name="room_alias_published_alias_main">Ez az elsődleges cím</string> + <string name="room_alias_published_alias_subtitle">A nyilvánosságra hozott címeket bárki bármelyik szerveren használhatja a szobádba való belépéshez. A cím közzétételéhez először helyi címnek kell beállítani.</string> + <string name="room_alias_published_alias_title">Nyilvánosságra hozott címek</string> + <string name="room_alias_title">Szoba címek</string> + <string name="room_settings_alias_subtitle">Szoba cím megjelenítése, kezelése és láthatóságának beállítása a szobák listájában.</string> + <string name="room_settings_alias_title">Szoba címek</string> + <string name="room_settings_guest_access_title">Vendégek csatlakozásának engedélyezése</string> + <string name="room_settings_room_access_title">Szoba hozzáfárés</string> + <string name="room_settings_room_read_history_dialog_subtitle">A üzenetek olvashatóságának változtatása csak az új üzenetekre lesz érvényes. A régi üzenetek láthatósága nem fog változni.</string> + <string name="settings_show_emoji_keyboard_summary">Az üzenet szerkesztőhöz emodzsi billentyűzet gomb hozzáadása</string> + <string name="settings_show_emoji_keyboard">Emodzsi billentyűzet megjelenítése</string> + <string name="settings_show_room_member_state_events_summary">Magába foglalja a meghívás/belépés/kilépés/kirúgás/kitiltás eseményt és profilkép/megjelenítési név változtatást.</string> + <string name="settings_chat_effects_description">Használd a /confetti parancsot vagy küldj üzenetet ami ❄️-t vagy 🎉-t tartalmaz</string> + <string name="settings_chat_effects_title">Beszélgetés effektek megjelenítése</string> + <string name="settings_show_room_member_state_events">Szoba tagok státusz eseményeinek megjelenítése</string> + <plurals name="seconds"> + <item quantity="one">%d másodperc</item> + <item quantity="other">%d másodperc</item> + </plurals> + <string name="settings_troubleshoot_test_notification_notification_clicked">Az értesítésre kattintottak!</string> + <string name="settings_troubleshoot_test_notification_notice">Kattints az értesítésre. Ha nem látsz értesítést, ellenőrizd a rendszerbeállításokat.</string> + <string name="call_transfer_transfer_to_title">Hívásátirányítás ide: %1$s</string> + <string name="unnamed_room">Névtelen szoba</string> + <string name="private_space">Privát tér</string> + <string name="public_space">Nyilvános tér</string> + <string name="a11y_public_space">Ez a Tér nyilvános</string> + <string name="call_transfer_unknown_person">Ismeretlen személy</string> + <string name="call_transfer_consulting_with">Konzultáció vele: %1$s</string> + <string name="directory_add_a_new_server_error_already_added">Ez a szerver már szerepel a listában</string> + <string name="directory_add_a_new_server_error">A szerver vagy a szoba listája nem található</string> + <string name="directory_add_a_new_server_prompt">Add meg a felfedezni kívánt új szerver nevét.</string> + <string name="directory_add_a_new_server">Új szerver hozzáadása</string> + <string name="directory_your_server">Matrix szervered</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 520fac1900..2bffefc310 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -9,17 +9,17 @@ <string name="notice_room_leave">%1$s è uscito dalla stanza</string> <string name="notice_room_reject">%1$s ha rifiutato l\'invito</string> <string name="notice_room_kick">%1$s ha buttato fuori %2$s</string> - <string name="notice_room_unban">%1$s ha tolto il bando a %2$s</string> - <string name="notice_room_ban">%1$s ha bandito %2$s</string> - <string name="notice_room_withdraw">%1$s ha revocato l\'invito per %2$s</string> - <string name="notice_avatar_url_changed">%1$s ha modificato il suo avatar</string> - <string name="notice_display_name_set">%1$s hanno cambiato il nome visualizzato con %2$s</string> - <string name="notice_display_name_changed_from">%1$s ha cambiato il nome visualizzato da %2$s a %3$s</string> - <string name="notice_display_name_removed">%1$s ha rimosso il nome visibile (%2$s)</string> - <string name="notice_room_topic_changed">%1$s ha cambiato l\'argomento con: %2$s</string> - <string name="notice_room_name_changed">%1$s ha cambiato il nome della stanza con: %2$s</string> - <string name="notice_placed_video_call">%s ha iniziato una chiamata video.</string> - <string name="notice_placed_voice_call">%s ha iniziato una chiamata vocale.</string> + <string name="notice_room_unban">%1$s ha rimosso il ban nei confronti di %2$s</string> + <string name="notice_room_ban">%1$s ha bannato %2$s</string> + <string name="notice_room_withdraw">%1$s ha revocato l\'invito a %2$s</string> + <string name="notice_avatar_url_changed">%1$s ha modificato la sua immagine profilo</string> + <string name="notice_display_name_set">%1$s hanno cambiato il nome in %2$s</string> + <string name="notice_display_name_changed_from">%1$s ha cambiato il nome da %2$s a %3$s</string> + <string name="notice_display_name_removed">%1$s ha rimosso il nome (%2$s)</string> + <string name="notice_room_topic_changed">%1$s ha cambiato l\'argomento in: %2$s</string> + <string name="notice_room_name_changed">%1$s ha cambiato il nome della stanza in: %2$s</string> + <string name="notice_placed_video_call">%s ha iniziato una videochiamata.</string> + <string name="notice_placed_voice_call">%s ha iniziato una chiamata audio.</string> <string name="notice_answered_call">%s ha risposto alla chiamata.</string> <string name="notice_ended_call">%s ha terminato la chiamata.</string> <string name="notice_made_future_room_visibility">%1$s ha reso la futura cronologia della stanza visibile a %2$s</string> @@ -28,19 +28,19 @@ <string name="notice_room_visibility_shared">tutti i membri della stanza.</string> <string name="notice_room_visibility_world_readable">chiunque.</string> <string name="notice_room_visibility_unknown">sconosciuto (%s).</string> - <string name="notice_end_to_end">%1$s ha attivato la crittografia end-to-end (%2$s)</string> + <string name="notice_end_to_end">%1$s ha attivato la crittografia E2E (%2$s)</string> <string name="notice_requested_voip_conference">%1$s ha richiesto una conferenza VoIP</string> <string name="notice_voip_started">Conferenza VoIP iniziata</string> <string name="notice_voip_finished">Conferenza VoIP terminata</string> - <string name="notice_avatar_changed_too">(anche l\'avatar è cambiato)</string> + <string name="notice_avatar_changed_too">(anche l\'avatar è stato cambiato)</string> <string name="notice_room_name_removed">%1$s ha rimosso il nome della stanza</string> <string name="notice_room_topic_removed">%1$s ha rimosso l\'argomento della stanza</string> <string name="notice_profile_change_redacted">%1$s ha aggiornato il profilo %2$s</string> - <string name="notice_room_third_party_invite">%1$s ha mandato un invito a %2$s per unirsi alla stanza</string> - <string name="notice_room_third_party_registered_invite">%1$s ha accettato l\'invito per %2$s</string> + <string name="notice_room_third_party_invite">%1$s ha mandato un invito a %2$s per entrare alla stanza</string> + <string name="notice_room_third_party_registered_invite">%1$s ha accettato l\'invito a %2$s</string> <string name="notice_crypto_unable_to_decrypt">** Impossibile decriptare: %s **</string> - <string name="notice_crypto_error_unkwown_inbound_session_id">Il dispositivo del mittente non ci ha inviato le chiavi per questo messaggio.</string> - <string name="could_not_redact">Impossibile revisionare</string> + <string name="notice_crypto_error_unkwown_inbound_session_id">Il dispositivo del mittente non ha inviato le chiavi per questo messaggio.</string> + <string name="could_not_redact">Impossibile riscrivere</string> <string name="unable_to_send_message">Impossibile inviare il messaggio</string> <string name="message_failed_to_upload">Invio dell\'immagine fallito</string> <string name="network_error">Errore di rete</string> @@ -48,7 +48,7 @@ <string name="room_error_join_failed_empty_room">Al momento non è possibile rientrare in una stanza vuota.</string> <string name="medium_email">Indirizzo email</string> <string name="medium_phone_number">Numero di telefono</string> - <string name="summary_user_sent_sticker">%1$s ha inviato un adesivo.</string> + <string name="summary_user_sent_sticker">%1$s ha inviato uno sticker.</string> <!-- Room display name --> <string name="room_displayname_invite_from">Invito da %s</string> <string name="room_displayname_room_invite">Invito nella stanza</string> @@ -62,37 +62,37 @@ <string name="notice_event_redacted_by">Messaggio rimosso da %1$s</string> <string name="notice_event_redacted_with_reason">Messaggio rimosso [motivo: %1$s]</string> <string name="notice_event_redacted_by_with_reason">Messaggio rimosso da %1$s [motivo: %2$s]</string> - <string name="initial_sync_start_importing_account">Sync iniziale: + <string name="initial_sync_start_importing_account">Sincronizzazione iniziale: \nImportazione account…</string> - <string name="initial_sync_start_importing_account_crypto">Sync iniziale: -\nImportazione cifratura</string> - <string name="initial_sync_start_importing_account_rooms">Sync iniziale: + <string name="initial_sync_start_importing_account_crypto">Sincronizzazione iniziale: +\nImportazione crittografia</string> + <string name="initial_sync_start_importing_account_rooms">Sincronizzazione iniziale: \nImportazione stanze</string> - <string name="initial_sync_start_importing_account_joined_rooms">Sync iniziale: + <string name="initial_sync_start_importing_account_joined_rooms">Sincronizzazione iniziale: \nImportazione stanze partecipate</string> - <string name="initial_sync_start_importing_account_invited_rooms">Sync iniziale: -\nImportazione stanze invitate</string> - <string name="initial_sync_start_importing_account_left_rooms">Sync iniziale: + <string name="initial_sync_start_importing_account_invited_rooms">Sincronizzazione iniziale: +\nImportazione stanze con invito</string> + <string name="initial_sync_start_importing_account_left_rooms">Sincronizzazione iniziale: \nImportazione stanze lasciate</string> - <string name="initial_sync_start_importing_account_groups">Sync iniziale: + <string name="initial_sync_start_importing_account_groups">Sincronizzazione iniziale: \nImportazione comunità</string> - <string name="initial_sync_start_importing_account_data">Sync iniziale: + <string name="initial_sync_start_importing_account_data">Sincronizzazione iniziale: \nImportazione dati account</string> <string name="notice_room_update">%s ha aggiornato questa stanza.</string> <string name="event_status_sending_message">Invio messaggio in corso …</string> <string name="clear_timeline_send_queue">Cancella la coda di invio</string> - <string name="notice_room_third_party_revoked_invite">%1$s ha revocato l\'invito a %2$s di unirsi alla stanza</string> + <string name="notice_room_third_party_revoked_invite">%1$s ha revocato l\'invito a %2$s per entrare alla stanza</string> <string name="notice_room_invite_no_invitee_with_reason">Invito di %1$s. Motivo: %2$s</string> <string name="notice_room_invite_with_reason">%1$s ha invitato %2$s. Motivo: %3$s</string> <string name="notice_room_invite_you_with_reason">%1$s ti ha invitato. Motivo: %2$s</string> <string name="notice_room_join_with_reason">%1$s è entrato nella stanza. Motivo: %2$s</string> <string name="notice_room_leave_with_reason">%1$s è uscito dalla stanza. Motivo: %2$s</string> <string name="notice_room_reject_with_reason">%1$s ha rifiutato l\'invito. Motivo: %2$s</string> - <string name="notice_room_kick_with_reason">%1$s ha buttato fuori %2$s. Motivo: %3$s</string> + <string name="notice_room_kick_with_reason">%1$s ha cacciato fuori %2$s. Motivo: %3$s</string> <string name="notice_room_unban_with_reason">%1$s ha riammesso %2$s. Motivo: %3$s</string> - <string name="notice_room_ban_with_reason">%1$s ha bandito %2$s. Motivo: %3$s</string> - <string name="notice_room_third_party_invite_with_reason">%1$s ha inviato un invito a %2$s di unirsi alla stanza. Motivo: %3$s</string> - <string name="notice_room_third_party_revoked_invite_with_reason">%1$s ha revocato l\'invito a %2$s di unirsi alla stanza. Motivo: %3$s</string> + <string name="notice_room_ban_with_reason">%1$s ha bannato %2$s. Motivo: %3$s</string> + <string name="notice_room_third_party_invite_with_reason">%1$s ha mandato un invito a %2$s per entrare nella stanza. Motivo: %3$s</string> + <string name="notice_room_third_party_revoked_invite_with_reason">%1$s ha revocato l\'invito a %2$s per entrare nella stanza. Motivo: %3$s</string> <string name="notice_room_third_party_registered_invite_with_reason">%1$s ha accettato l\'invito per %2$s. Motivo: %3$s</string> <string name="notice_room_withdraw_with_reason">%1$s ha rifiutato l\'invito di %2$s. Motivo: %3$s</string> <plurals name="notice_room_aliases_added"> @@ -108,11 +108,11 @@ <string name="notice_room_canonical_alias_unset">%1$s ha rimosso l\'indirizzo principale per questa stanza.</string> <string name="notice_room_guest_access_can_join">%1$s ha permesso l\'accesso alla stanza per gli ospiti.</string> <string name="notice_room_guest_access_forbidden">%1$s ha impedito l\'accesso alla stanza per gli ospiti.</string> - <string name="notice_end_to_end_ok">%1$s ha attivato la cifratura end-to-end.</string> - <string name="notice_end_to_end_unknown_algorithm">%1$s ha attivato la cifratura end-to-end (algoritmo %2$s non riconosciuto).</string> + <string name="notice_end_to_end_ok">%1$s ha attivato la crittografia E2E.</string> + <string name="notice_end_to_end_unknown_algorithm">%1$s ha attivato la crittografia E2E (algoritmo %2$s non riconosciuto).</string> <string name="notice_room_created">%1$s ha creato la stanza</string> <string name="summary_you_sent_image">Hai inviato un\'immagine.</string> - <string name="summary_you_sent_sticker">Hai inviato un adesivo.</string> + <string name="summary_you_sent_sticker">Hai inviato uno sticker.</string> <string name="notice_room_invite_no_invitee_by_you">Il tuo invito</string> <string name="notice_room_created_by_you">Hai creato la stanza</string> <string name="notice_room_invite_by_you">Hai invitato %1$s</string> @@ -120,25 +120,25 @@ <string name="notice_room_leave_by_you">Sei uscito dalla stanza</string> <string name="notice_room_reject_by_you">Hai rifiutato l\'invito</string> <string name="notice_room_kick_by_you">Hai buttato fuori %1$s</string> - <string name="notice_room_unban_by_you">Hai riammesso %1$s</string> - <string name="notice_room_ban_by_you">Hai bandito %1$s</string> - <string name="notice_room_withdraw_by_you">Hai ritirato l\'invito di %1$s</string> - <string name="notice_avatar_url_changed_by_you">Hai cambiato il tuo avatar</string> - <string name="notice_display_name_set_by_you">Hai impostato il tuo nome visualizzato a %1$s</string> - <string name="notice_display_name_changed_from_by_you">Hai cambiato il tuo nome visualizzato da %1$s a %2$s</string> - <string name="notice_display_name_removed_by_you">Hai rimosso il tuo nome visibile (era %1$s)</string> - <string name="notice_room_topic_changed_by_you">Hai cambiato l\'argomento a: %1$s</string> + <string name="notice_room_unban_by_you">Hai rimosso il ban nei confronti di %1$s</string> + <string name="notice_room_ban_by_you">Hai bannato %1$s</string> + <string name="notice_room_withdraw_by_you">Hai revocato l\'invito a %1$s</string> + <string name="notice_avatar_url_changed_by_you">Hai cambiato la tua immagine profilo</string> + <string name="notice_display_name_set_by_you">Hai impostato il tuo nome in %1$s</string> + <string name="notice_display_name_changed_from_by_you">Hai cambiato il tuo nome da %1$s a %2$s</string> + <string name="notice_display_name_removed_by_you">Hai rimosso il tuo nome (era %1$s)</string> + <string name="notice_room_topic_changed_by_you">Hai cambiato l\'argomento in: %1$s</string> <string name="notice_room_avatar_changed">%1$s ha modificato l\'avatar della stanza</string> <string name="notice_room_avatar_changed_by_you">Hai modificato l\'avatar della stanza</string> - <string name="notice_room_name_changed_by_you">Hai cambiato il nome della stanza a: %1$s</string> + <string name="notice_room_name_changed_by_you">Hai cambiato il nome della stanza in: %1$s</string> <string name="notice_placed_video_call_by_you">Hai iniziato una videochiamata.</string> - <string name="notice_placed_voice_call_by_you">Hai iniziato una telefonata.</string> - <string name="notice_call_candidates">%s ha inviato dati per impostare la chiamata.</string> - <string name="notice_call_candidates_by_you">Hai inviato dati per impostare la chiamata.</string> + <string name="notice_placed_voice_call_by_you">Hai iniziato una chiamata audio.</string> + <string name="notice_call_candidates">%s ha inviato i dati per impostare la chiamata.</string> + <string name="notice_call_candidates_by_you">Hai inviato i dati per impostare la chiamata.</string> <string name="notice_answered_call_by_you">Hai risposto alla chiamata.</string> <string name="notice_ended_call_by_you">Hai terminato la chiamata.</string> <string name="notice_made_future_room_visibility_by_you">Hai reso visibile la futura cronologia della stanza a %1$s</string> - <string name="notice_end_to_end_by_you">Hai attivato la crittografia end-to-end (%1$s)</string> + <string name="notice_end_to_end_by_you">Hai attivato la crittografia E2E (%1$s)</string> <string name="notice_room_update_by_you">Hai aggiornato questa stanza.</string> <string name="notice_requested_voip_conference_by_you">Hai richiesto una conferenza VoIP</string> <string name="notice_room_name_removed_by_you">Hai rimosso il nome della stanza</string> @@ -146,9 +146,9 @@ <string name="notice_room_avatar_removed">%1$s ha rimosso l\'avatar della stanza</string> <string name="notice_room_avatar_removed_by_you">Hai rimosso l\'avatar della stanza</string> <string name="notice_profile_change_redacted_by_you">Hai aggiornato il tuo profilo %1$s</string> - <string name="notice_room_third_party_invite_by_you">Hai mandato un invito a %1$s a unirsi alla stanza</string> - <string name="notice_room_third_party_revoked_invite_by_you">Hai revocato l\'invito per %1$s a unirsi alla stanza</string> - <string name="notice_room_third_party_registered_invite_by_you">Hai accettato l\'invito per %1$s</string> + <string name="notice_room_third_party_invite_by_you">Hai mandato un invito a %1$s per entrare nella stanza</string> + <string name="notice_room_third_party_revoked_invite_by_you">Hai revocato l\'invito a %1$s per entrare alla stanza</string> + <string name="notice_room_third_party_registered_invite_by_you">Hai accettato l\'invito a %1$s</string> <string name="notice_widget_added">%1$s ha aggiunto il widget %2$s</string> <string name="notice_widget_added_by_you">Hai aggiunto il widget %1$s</string> <string name="notice_widget_removed">%1$s ha rimosso il widget %2$s</string> @@ -157,22 +157,22 @@ <string name="notice_widget_modified_by_you">Hai modificato il widget %1$s</string> <string name="power_level_admin">Amministratore</string> <string name="power_level_moderator">Moderatore</string> - <string name="power_level_default">Predefinito</string> + <string name="power_level_default">Standard</string> <string name="power_level_custom">Personalizzato (%1$d)</string> <string name="power_level_custom_no_value">Personalizzato</string> - <string name="notice_power_level_changed_by_you">Hai cambiato il livello di potere di %1$s.</string> - <string name="notice_power_level_changed">%1$s ha cambiato il livello di potere di %2$s.</string> + <string name="notice_power_level_changed_by_you">Hai cambiato le autorizzazioni di %1$s.</string> + <string name="notice_power_level_changed">%1$s ha cambiato le autorizzazioni di %2$s.</string> <string name="notice_power_level_diff">%1$s da %2$s a %3$s</string> <string name="notice_room_invite_no_invitee_with_reason_by_you">Il tuo invito. Motivo: %1$s</string> <string name="notice_room_invite_with_reason_by_you">Hai invitato %1$s. Motivo: %2$s</string> <string name="notice_room_join_with_reason_by_you">Sei entrato nella stanza. Motivo: %1$s</string> <string name="notice_room_leave_with_reason_by_you">Sei uscito dalla stanza. Motivo: %1$s</string> <string name="notice_room_reject_with_reason_by_you">Hai rifiutato l\'invito. Motivo: %1$s</string> - <string name="notice_room_kick_with_reason_by_you">Hai buttato fuori %1$s. Motivo: %2$s</string> + <string name="notice_room_kick_with_reason_by_you">Hai cacciato %1$s. Motivo: %2$s</string> <string name="notice_room_unban_with_reason_by_you">Hai riammesso %1$s. Motivo: %2$s</string> - <string name="notice_room_ban_with_reason_by_you">Hai bandito %1$s. Motivo: %2$s</string> - <string name="notice_room_third_party_invite_with_reason_by_you">Hai mandato un invito a %1$s a unirsi alla stanza. Motivo: %2$s</string> - <string name="notice_room_third_party_revoked_invite_with_reason_by_you">Hai revocato l\'invito a %1$s a unirsi alla stanza. Motivo: %2$s</string> + <string name="notice_room_ban_with_reason_by_you">Hai bannato %1$s. Motivo: %2$s</string> + <string name="notice_room_third_party_invite_with_reason_by_you">Hai mandato un invito a %1$s per entrare nella stanza. Motivo: %2$s</string> + <string name="notice_room_third_party_revoked_invite_with_reason_by_you">Hai revocato l\'invito a %1$s per entrare nella stanza. Motivo: %2$s</string> <string name="notice_room_third_party_registered_invite_with_reason_by_you">Hai accettato l\'invito per %1$s. Motivo: %2$s</string> <string name="notice_room_withdraw_with_reason_by_you">Hai ritirato l\'invito di %1$s. Motivo: %2$s</string> <plurals name="notice_room_aliases_added_by_you"> @@ -189,7 +189,7 @@ <string name="notice_room_guest_access_can_join_by_you">Hai permesso l\'accesso alla stanza per gli ospiti.</string> <string name="notice_room_guest_access_forbidden_by_you">Hai impedito l\'accesso alla stanza per gli ospiti.</string> <string name="notice_end_to_end_ok_by_you">Hai attivato la crittografia end-to-end.</string> - <string name="notice_end_to_end_unknown_algorithm_by_you">Hai attivato la crittografia end-to-end (algoritmo %1$s sconosciuto).</string> + <string name="notice_end_to_end_unknown_algorithm_by_you">Hai attivato la crittografia E2E (algoritmo %1$s sconosciuto).</string> <string name="notice_direct_room_guest_access_forbidden_by_you">Hai impedito l\'accesso alla stanza agli ospiti.</string> <string name="notice_direct_room_guest_access_forbidden">%1$s ha impedito l\'accesso alla stanza agli ospiti.</string> <string name="notice_direct_room_guest_access_can_join_by_you">Hai permesso l\'accesso agli ospiti.</string> @@ -198,8 +198,8 @@ <string name="notice_direct_room_leave_with_reason_by_you">Sei uscito. Motivo: %1$s</string> <string name="notice_direct_room_leave_with_reason">%1$s è uscito. Motivo: %2$s</string> <string name="notice_direct_room_join_with_reason">%1$s è entrato. Motivo: %2$s</string> - <string name="notice_direct_room_third_party_revoked_invite_by_you">Hai revocato l\'invito per %1$s</string> - <string name="notice_direct_room_third_party_revoked_invite">%1$s ha revocato l\'invito per %2$s</string> + <string name="notice_direct_room_third_party_revoked_invite_by_you">Hai revocato l\'invito a %1$s</string> + <string name="notice_direct_room_third_party_revoked_invite">%1$s ha revocato l\'invito a %2$s</string> <string name="notice_direct_room_third_party_invite_by_you">Hai invitato %1$s</string> <string name="notice_direct_room_third_party_invite">%1$s ha invitato %2$s</string> <string name="notice_direct_room_update_by_you">Hai aggiornato la stanza.</string> @@ -219,19 +219,19 @@ </plurals> <string name="room_displayname_4_members">%1$s, %2$s, %3$s e %4$s</string> <string name="room_displayname_3_members">%1$s, %2$s e %3$s</string> - <string name="notice_room_server_acl_allow_is_empty">🎉 Tutti i server sono banditi dalla partecipazione! Questa stanza non può più essere usata.</string> + <string name="notice_room_server_acl_allow_is_empty">🎉 Tutti i server sono banditi! Questa stanza non può più essere usata.</string> <string name="notice_room_server_acl_updated_no_change">Nessuna modifica.</string> - <string name="notice_room_server_acl_updated_ip_literals_not_allowed">• I server che corrispondono a IP letterali ora sono banditi.</string> - <string name="notice_room_server_acl_updated_ip_literals_allowed">• I server che corrispondono a IP letterali ora sono permessi.</string> - <string name="notice_room_server_acl_updated_was_allowed">• I server che corrispondono a %s sono stati rimossi dalla lista dei consentiti.</string> - <string name="notice_room_server_acl_updated_allowed">• I server che corrispondono a %s ora sono permessi.</string> + <string name="notice_room_server_acl_updated_ip_literals_not_allowed">• I server che corrispondono a IP alfabetici ora sono banditi.</string> + <string name="notice_room_server_acl_updated_ip_literals_allowed">• I server che corrispondono a IP alfabetici ora sono permessi.</string> + <string name="notice_room_server_acl_updated_was_allowed">• I server che corrispondono a %s sono stati rimossi dalla lista degli ammessi.</string> + <string name="notice_room_server_acl_updated_allowed">• I server che corrispondono a %s ora sono ammessi.</string> <string name="notice_room_server_acl_updated_was_banned">• I server che corrispondono a %s sono stati rimossi dalla lista di ban.</string> <string name="notice_room_server_acl_updated_banned">• I server che corrispondono a %s ora sono banditi.</string> <string name="notice_room_server_acl_updated_title_by_you">Hai cambiato le ACL del server per questa stanza.</string> <string name="notice_room_server_acl_updated_title">%s ha cambiato le ACL del server per questa stanza.</string> - <string name="notice_room_server_acl_set_ip_literals_not_allowed">• I server che corrispondono a IP letterali sono banditi.</string> - <string name="notice_room_server_acl_set_ip_literals_allowed">• I server che corrispondono a IP letterali sono permessi.</string> - <string name="notice_room_server_acl_set_allowed">• I server che corrispondono a %s sono permessi.</string> + <string name="notice_room_server_acl_set_ip_literals_not_allowed">• I server che corrispondono a IP alfabetici sono banditi.</string> + <string name="notice_room_server_acl_set_ip_literals_allowed">• I server che corrispondono a IP alfabetici sono permessi.</string> + <string name="notice_room_server_acl_set_allowed">• I server che corrispondono a %s sono ammessi.</string> <string name="notice_room_server_acl_set_banned">• I server che corrispondono a %s sono banditi.</string> <string name="notice_room_server_acl_set_title_by_you">Hai impostato le ACL del server per questa stanza.</string> <string name="notice_room_server_acl_set_title">%s ha impostato le ACL del server per questa stanza.</string> @@ -257,12 +257,12 @@ <item quantity="one">%1$s ha aggiunto l\'indirizzo alternativo %2$s per questa stanza.</item> <item quantity="other">%1$s ha aggiunto gli indirizzi alternativi %2$s per questa stanza.</item> </plurals> - <string name="notice_widget_jitsi_modified_by_you">Hai modificato la video conferenza</string> - <string name="notice_widget_jitsi_modified">Video conferenza modificata da %1$s</string> - <string name="notice_widget_jitsi_added_by_you">Hai iniziato la video conferenza</string> - <string name="notice_widget_jitsi_removed_by_you">Hai terminato la video conferenza</string> - <string name="notice_widget_jitsi_removed">Video conferenza terminata da %1$s</string> - <string name="notice_widget_jitsi_added">Video conferenza iniziata da %1$s</string> + <string name="notice_widget_jitsi_modified_by_you">Hai modificato la videoconferenza</string> + <string name="notice_widget_jitsi_modified">Videoconferenza modificata da %1$s</string> + <string name="notice_widget_jitsi_added_by_you">Hai iniziato la videoconferenza</string> + <string name="notice_widget_jitsi_removed_by_you">Hai terminato la videoconferenza</string> + <string name="notice_widget_jitsi_removed">Videoconferenza terminata da %1$s</string> + <string name="notice_widget_jitsi_added">Videoconferenza iniziata da %1$s</string> <!-- titles --> <string name="title_activity_home">Messaggi</string> <string name="title_activity_room">Stanza</string> @@ -281,7 +281,7 @@ <string name="share">Condividi</string> <string name="later">Ultimi</string> <string name="forward">Inoltra</string> - <string name="permalink">Collegamento permanente</string> + <string name="permalink">URL Link</string> <string name="view_source">Vedi il codice sorgente</string> <string name="view_decrypted_source">Vedi il codice sorgente decifrato</string> <string name="delete">Elimina</string> @@ -366,7 +366,7 @@ <string name="create_account">Crea account</string> <string name="login">Accedi</string> <string name="logout">Disconnetti</string> - <string name="hs_url">URL dell\'Home Server</string> + <string name="hs_url">URL dell\'homeserver</string> <string name="identity_url">URL dell\'Identity Server</string> <string name="search">Cerca</string> <string name="start_new_chat">Avvia una nuova chat diretta</string> @@ -412,9 +412,9 @@ <string name="auth_threepid_warning_message">La registrazione con email e numero di telefono in una volta sola non è ancora supportata. Sarà utilizzato solo il numero di telefono. \n \nPotrai aggiungere l\'indirizzo email al tuo profilo dalle impostazioni.</string> - <string name="auth_recaptcha_message">Questo Home Server vorrebbe assicurarsi che tu non sia un robot</string> + <string name="auth_recaptcha_message">Questo homeserver vuole assicurarsi che tu non sia un robot</string> <string name="auth_username_in_use">Nome utente già in uso</string> - <string name="auth_home_server">Home Server:</string> + <string name="auth_home_server">Homeserver:</string> <string name="auth_identity_server">Server identità:</string> <string name="auth_reset_password_next_step_button">Ho verificato il mio indirizzo email</string> <string name="auth_reset_password_message">Per reimpostare la password, inserisci l\'indirizzo email associato al tuo account:</string> @@ -497,7 +497,7 @@ <string name="template_permissions_msg_contacts_warning_other_androids">${app_name} può usare tua Rubrica locale per trovare altri utenti Matrix grazie alle loro email e numeri di telefono. \n \nTi sta bene comunicare i dati di tutti i tuoi contatti per questo scopo\?</string> - <string name="permissions_action_not_performed_missing_permissions">Purtroppo l\'azione non è stata eseguita poiché mancano i permessi</string> + <string name="permissions_action_not_performed_missing_permissions">Purtroppo l\'azione non è stata eseguita a causa di autorizzazioni mancanti</string> <!-- medias slider string --> <string name="media_slider_saved">Salvato</string> <string name="media_slider_saved_message">Salvare nei download?</string> @@ -506,16 +506,16 @@ <string name="_continue">Continua</string> <!-- Actions --> <string name="remove">Rimuovi</string> - <string name="join">Unisciti</string> + <string name="join">Entra</string> <string name="preview">Anteprima</string> <string name="reject">Rifiuta</string> <!-- Room --> <string name="room_jump_to_first_unread">Vai al primo messaggio non letto.</string> <!-- Room Preview --> - <string name="room_preview_invitation_format">Sei stato invitato ad entrare in questa stanza da %s</string> + <string name="room_preview_invitation_format">Sei stato invitato da %s a entrare in questa stanza</string> <string name="room_preview_unlinked_email_warning">Questo invito è stato spedito a %s, che non è associato a questo account. \nPuoi aggiungere questa email al tuo account o provare ad accedere con un account differente.</string> - <string name="room_preview_try_join_an_unknown_room">Stai provando ad accedere a %s. Desideri entrare per partecipare alla discussione?</string> + <string name="room_preview_try_join_an_unknown_room">Stai provando ad accedere a %s. Vuoi entrare e partecipare alla discussione\?</string> <string name="room_preview_try_join_an_unknown_room_default">una stanza</string> <string name="room_preview_room_interactions_disabled">Questa è l\'anteprima della stanza. Le interazioni sono disabilitate.</string> <!-- Chat creation --> @@ -530,7 +530,7 @@ <string name="room_participants_online">Online</string> <string name="room_participants_offline">Offline</string> <string name="room_participants_idle">Inattivo</string> - <string name="room_participants_header_admin_tools">STRUMENTI ADMIN</string> + <string name="room_participants_header_admin_tools">STRUMENTI DELL\'AMMINISTRATORE</string> <string name="room_participants_header_call">CHIAMATA</string> <string name="room_participants_header_direct_chats">CHAT DIRETTE</string> <string name="room_participants_header_devices">SESSIONI</string> @@ -591,7 +591,7 @@ <string name="room_details_people">Utenti</string> <string name="room_details_files">File</string> <string name="room_details_settings">Impostazioni</string> - <string name="malformed_id">ID malformato. Dovrebbe essere un indirizzo email o un ID utente come \'@localpart:domain\'</string> + <string name="malformed_id">ID malformato. Dovrebbe essere un indirizzo email o un ID utente Matrix come \'@localpart:domain\'</string> <string name="room_details_people_invited_group_name">INVITATI</string> <string name="room_details_people_present_group_name">MEMBRI</string> <!-- Room events --> @@ -599,8 +599,8 @@ <string name="room_event_action_report_prompt_ignore_user">Desideri nascondere tutti i messaggi di questo utente\? \n \nTieni presente che questa azione riavvierà l\'app e ciò potrebbe richiedere molto tempo.</string> - <string name="room_event_action_cancel_upload">Annulla il caricamento</string> - <string name="room_event_action_cancel_download">Annulla lo scaricamento</string> + <string name="room_event_action_cancel_upload">Annulla l\'Upload</string> + <string name="room_event_action_cancel_download">Annulla il Download</string> <!-- Search --> <string name="search_hint">Cerca</string> <string name="search_members_hint">Cerca tra i membri della stanza</string> @@ -661,7 +661,7 @@ <string name="settings_set_sync_timeout">La richiesta di sincronizzazione sta impiegando troppo tempo</string> <string name="settings_set_sync_delay">Ritardo tra ogni sincronizzazione</string> <string name="settings_version">Versione</string> - <string name="settings_olm_version">Versione olm</string> + <string name="settings_olm_version">Versione OLM</string> <string name="settings_app_term_conditions">Termini e condizioni</string> <string name="settings_third_party_notices">Avvisi di terze parti</string> <string name="settings_copyright">Copyright</string> @@ -696,11 +696,11 @@ <string name="devices_delete_pswd">Password:</string> <string name="devices_delete_submit_button_label">Invia</string> <string name="settings_logged_in">Autenticato come</string> - <string name="settings_home_server">Home Server</string> - <string name="settings_identity_server">Server identità</string> + <string name="settings_home_server">Homeserver</string> + <string name="settings_identity_server">Server di identità</string> <string name="settings_user_interface">Interfaccia utente</string> <string name="settings_interface_language">Lingua</string> - <string name="settings_select_language">Scegli una lingua</string> + <string name="settings_select_language">Scegli la lingua</string> <string name="account_email_validation_title">In attesa di verifica</string> <string name="account_email_validation_message">Controlla la tua email e clicca sul link che ti è stato spedito. Fatto questo, clicca su Continua.</string> <string name="account_email_validation_error">Impossibile verificare l\'indirizzo email. Controlla la tua email e clicca sul link che ti è stato spedito. Fatto questo, clicca su Continua.</string> @@ -711,9 +711,9 @@ <string name="settings_old_password">Password attuale</string> <string name="settings_new_password">Nuova password</string> <string name="settings_confirm_password">Conferma la nuova password</string> - <string name="settings_fail_to_update_password">Fallito l\'aggiornamento della password</string> + <string name="settings_fail_to_update_password">L\'aggiornamento della password è fallito</string> <string name="settings_password_updated">La tua password è stata aggiornata</string> - <string name="settings_unignore_user">Mostrare tutti i messaggi di %s\? + <string name="settings_unignore_user">Mostra tutti i messaggi di %s\? \n \nTieni presente che questa azione riavvierà l\'app e ciò potrebbe richiedere molto tempo.</string> <string name="settings_delete_notification_targets_confirmation">Sicuro di voler rimuovere questo target di notifica?</string> @@ -723,10 +723,10 @@ <string name="settings_phone_number_country_error">Per favore scegli un paese</string> <string name="settings_phone_number_label">Numero di telefono</string> <string name="settings_phone_number_error">Numero di telefono non valido per il paese selezionato</string> - <string name="settings_phone_number_verification">Verifica numero di telefono</string> + <string name="settings_phone_number_verification">Verifica il numero di telefono</string> <string name="settings_phone_number_verification_instruction">E\' stato spedito un SMS con il codice di attivazione. Per favore inserisci il codice qui sotto.</string> <string name="settings_phone_number_verification_error_empty_code">Inserisci un codice di attivazione</string> - <string name="settings_phone_number_verification_error">Errore durante la convalida del numero di telefono</string> + <string name="settings_phone_number_verification_error">Errore durante la verifica del numero di telefono</string> <string name="settings_phone_number_code">Codice</string> <!-- medias saving settings --> <string name="media_saving_period_3_days">3 giorni</string> @@ -738,7 +738,7 @@ <string name="room_settings_room_photo">Icona della stanza</string> <string name="room_settings_room_name">Nome della stanza</string> <string name="room_settings_topic">Argomento</string> - <string name="room_settings_room_tag">Etichetta</string> + <string name="room_settings_room_tag">Etichetta dela stanza</string> <string name="room_settings_tag_pref_dialog_title">Etichetta come:</string> <!-- Room settings: Room tag --> <string name="room_settings_tag_pref_entry_favourite">Preferito</string> @@ -768,12 +768,12 @@ <string name="room_settings_room_internal_id">ID interno della stanza</string> <string name="room_settings_addresses_pref_title">Indirizzi</string> <string name="room_settings_labs_pref_title">Laboratorio</string> - <string name="room_settings_labs_warning_message">Queste sono caratteristiche sperimentali che potrebbero dare risultati inattesi. Usare con cautela.</string> - <string name="room_settings_labs_end_to_end">Crittografia da-utente-a-utente</string> - <string name="room_settings_labs_end_to_end_is_active">La crittografia da-utente-a-utente è attiva</string> - <string name="room_settings_labs_end_to_end_warnings">Devi disconnetterti per abilitare la crittografia.</string> + <string name="room_settings_labs_warning_message">Queste sono caratteristiche sperimentali che potrebbero dare risultati inattesi. Usali con cautela.</string> + <string name="room_settings_labs_end_to_end">Crittografia E2E</string> + <string name="room_settings_labs_end_to_end_is_active">La crittografia E2E è attiva</string> + <string name="room_settings_labs_end_to_end_warnings">Per abilitare la crittografia devi disconnetterti.</string> <string name="room_settings_never_send_to_unverified_devices_title">Cripta solo per le sessioni verificate</string> - <string name="room_settings_never_send_to_unverified_devices_summary">Non inviare mai da questa sessione messaggi cifrati verso sessioni in questa stanza non verificate.</string> + <string name="room_settings_never_send_to_unverified_devices_summary">Da questa sessione non inviare mai messaggi cifrati alle sessioni non verificate presenti in questa stanza.</string> <!-- Room settings: advanced addresses --> <string name="room_settings_addresses_no_local_addresses">Questa stanza non ha indirizzi locali</string> <string name="room_settings_addresses_add_new_address">Nuovo indirizzo stanza (es. #foo:matrix.org)</string> @@ -785,15 +785,15 @@ <string name="room_settings_unset_main_address">Non usare più come indirizzo principale</string> <string name="room_settings_copy_room_id">Copia ID stanza</string> <string name="room_settings_copy_room_address">Copia indirizzo stanza</string> - <string name="room_settings_addresses_e2e_enabled">Crittografia abilitata in questa stanza.</string> - <string name="room_settings_addresses_e2e_disabled">Crittografia disabilitata in questa stanza.</string> + <string name="room_settings_addresses_e2e_enabled">La Crittografia in questa stanza é attiva.</string> + <string name="room_settings_addresses_e2e_disabled">La Crittografia in questa stanza non è attiva.</string> <string name="room_settings_addresses_e2e_encryption_warning">Attiva crittografia \n(attenzione: non potrà più essere disattivata!)</string> <!-- Directory --> <string name="directory_title">Elenco</string> <string name="settings_theme">Tema</string> <!-- matrix error --> - <string name="failed_to_load_timeline_position">%s stava cercando di caricare un punto specifico tra i messaggi passati di questa stanza, ma non l\'ha trovato.</string> + <string name="failed_to_load_timeline_position">%s stava cercando di caricare un punto specifico nella cronologia di questa stanza ma non è stato in grado di trovarlo.</string> <!-- encryption dialog --> <string name="encryption_information_title">Informazioni sulla crittografia E2E</string> <string name="encryption_information_device_info">Informazioni sull\'evento</string> @@ -803,29 +803,29 @@ <string name="encryption_information_algorithm">Algoritmo</string> <string name="encryption_information_session_id">ID sessione</string> <string name="encryption_information_decryption_error">Errore di decriptazione</string> - <string name="encryption_information_sender_device_information">Informazioni sessione del mittente</string> + <string name="encryption_information_sender_device_information">Informazioni sulla sessione del mittente</string> <string name="encryption_information_device_name">Nome pubblico</string> <string name="encryption_information_name">Nome pubblico</string> <string name="encryption_information_device_id">ID sessione</string> <string name="encryption_information_device_key">Chiave sessione</string> <string name="encryption_information_verification">Verifica</string> <string name="encryption_information_ed25519_fingerprint">Impronta digitale Ed25519</string> - <string name="encryption_export_e2e_room_keys">Esporta le chiavi di crittografia delle stanze</string> + <string name="encryption_export_e2e_room_keys">Esporta le chiavi di crittografia E2E delle stanze</string> <string name="encryption_export_room_keys">Esporta le chiavi delle stanze</string> <string name="encryption_export_room_keys_summary">Esporta le chiavi in un file locale</string> <string name="encryption_export_export">Esporta</string> - <string name="passphrase_enter_passphrase">Inserisci password</string> - <string name="passphrase_confirm_passphrase">Conferma password</string> - <string name="encryption_export_saved_as">Le chiavi di crittografia della stanza sono state salvate su \'%s\'. + <string name="passphrase_enter_passphrase">Inserisci la Passphrase</string> + <string name="passphrase_confirm_passphrase">Conferma la Passphrase</string> + <string name="encryption_export_saved_as">Le chiavi per la crittografia E2E della stanza sono state salvate su \'%s\'. \n -\nAttenzione: se si disinstalla quest\'applicazione il file, viene eliminato.</string> - <string name="encryption_import_e2e_room_keys">Importa le chiavi di crittografia della stanza</string> +\nAttenzione: se si disinstalla quest\'applicazione il file viene eliminato.</string> + <string name="encryption_import_e2e_room_keys">Importa le chiavi di crittografia E2E della stanza</string> <string name="encryption_import_room_keys">Importa le chiavi della stanza</string> <string name="encryption_import_room_keys_summary">Importa le chiavi da un file locale</string> <string name="encryption_import_import">Importa</string> <string name="encryption_never_send_to_unverified_devices_title">Cripta solo per le sessioni verificate</string> - <string name="encryption_never_send_to_unverified_devices_summary">Non inviare mai da questa sessione messaggi cifrati verso sessioni non verificate.</string> - <string name="encryption_information_not_verified">NON verificato</string> + <string name="encryption_never_send_to_unverified_devices_summary">Da questa sessione non inviare mai messaggi cifrati verso sessioni non verificate.</string> + <string name="encryption_information_not_verified">Non verificato</string> <string name="encryption_information_verified">Verificato</string> <string name="encryption_information_blocked">Metti in lista nera</string> <string name="encryption_information_unknown_device">sessione sconosciuta</string> @@ -849,13 +849,13 @@ <string name="select_room_directory">Scegli un elenco di stanze</string> <string name="directory_server_fail_to_retrieve_server">Il server potrebbe essere non disponibile o sovraccarico</string> <string name="directory_server_type_homeserver">Inserisci un Home Server per vedere le sue stanze pubbliche</string> - <string name="directory_server_placeholder">URL dell\'Home Server</string> + <string name="directory_server_placeholder">Nome del server</string> <string name="directory_server_all_rooms_on_server">Tutte le stanze sull\'Home Server %s</string> <string name="directory_server_native_rooms">Tutte le stanze native %s</string> <!-- historical --> <string name="historical_placeholder">Cerca tra i messaggi passati</string> <!-- text size selection --> - <string name="font_size">Grandezza font</string> + <string name="font_size">Dimensione font</string> <string name="tiny">Minuscolo</string> <string name="small">Piccolo</string> <string name="normal">Normale</string> @@ -902,10 +902,10 @@ <string name="send_bug_report_rage_shake">Per segnalare un errore agita il dispositivo con rabbia</string> <string name="start_new_chat_prompt_msg">Sicuro di voler avviare una nuova chat con %s\?</string> <string name="start_voice_call_prompt_msg">Sicuro di voler fare una chiamata audio\?</string> - <string name="start_video_call_prompt_msg">Sicuro di voler fare una chiamata video\?</string> + <string name="start_video_call_prompt_msg">Sicuro di voler fare una videochiamata\?</string> <string name="groups_list">Elenco gruppi</string> <string name="list_members">Elenco dei membri</string> - <string name="open_chat_header">Apri descrizione</string> + <string name="open_chat_header">Apri intestazione</string> <string name="room_sync_in_progress">Sincronizzazione…</string> <plurals name="room_header_active_members_count"> <item quantity="one">%d utente attivo</item> @@ -938,8 +938,8 @@ <string name="settings_analytics">Statistiche</string> <string name="room_settings_room_notifications_title">Notifiche</string> <string name="room_settings_add_new_group">Nuovo ID della comunità (es. +foo:matrix.org)</string> - <string name="room_settings_invalid_group_format_dialog_title">L\'ID comunità non è valido</string> - <string name="room_settings_invalid_group_format_dialog_body">\'%s\' non è un ID comunità valido</string> + <string name="room_settings_invalid_group_format_dialog_title">L\'ID della comunità non è valido</string> + <string name="room_settings_invalid_group_format_dialog_body">\'%s\' non è un ID della comunità valido</string> <plurals name="notification_unread_notified_messages"> <item quantity="one">%d messaggio notificato non letto</item> <item quantity="other">%d messaggi notificati non letti</item> @@ -999,7 +999,7 @@ <string name="forget_room">Dimentica la stanza</string> <string name="avatar">Avatar</string> <string name="settings_flair">Predisposizione</string> - <string name="room_settings_no_flair">Questa stanza non mostra predisposizione per alcuna comunità</string> + <string name="room_settings_no_flair">Questa stanza non mostra predisposizioni per alcuna comunità</string> <string name="widget_integration_positive_power_level">Il livello di potere deve essere un intero positivo.</string> <string name="notice_avatar">Avatar di avviso</string> <string name="receipt_avatar">Avatar di ricezione</string> @@ -1051,7 +1051,7 @@ <string name="e2e_re_request_encryption_key">Richiedi di nuovo le chiavi di crittografia dalle tue altre sessioni.</string> <string name="e2e_re_request_encryption_key_sent">La richiesta della chiave è stata inviata.</string> <string name="e2e_re_request_encryption_key_dialog_title">Richiesta inviata</string> - <string name="template_e2e_re_request_encryption_key_dialog_content">Avvia ${app_name} su un altro dispositivo che possa decifrare il messaggio, in modo che possa inviare le chiavi a questa sessione.</string> + <string name="template_e2e_re_request_encryption_key_dialog_content">Avvia ${app_name} su un altro dispositivo capace di decrittare il messaggio in modo che poi possa inviarti le chiavi su questa sessione.</string> <string name="lock_screen_hint">Digita qui…</string> <string name="option_send_voice">Invia messaggio vocale</string> <string name="go_on_with">prosegui con…</string> @@ -1118,7 +1118,7 @@ </plurals> <string name="system_alerts_header">Avvisi di sistema</string> <string name="resource_limit_exceeded_title">Limite di risorse superato</string> - <string name="resource_limit_contact_action">Contatta l\'amministratore</string> + <string name="resource_limit_contact_action">Contatta l\'Amministratore</string> <string name="resource_limit_contact_admin">contatta l\'amministratore del servizio</string> <string name="resource_limit_soft_default">L\'Home Server ha superato uno dei limiti delle risorse, pertanto <b>alcuni utenti non potranno accedere</b>.</string> <string name="resource_limit_hard_default">L\'Home Server ha superato uno dei limiti delle risorse.</string> @@ -1132,9 +1132,9 @@ <string name="unknown_error">Spiacente, si è verificato un errore</string> <string name="settings_lazy_loading_title">Caricamento differito dei membri della stanza</string> <string name="room_sliding_menu_version_x">Versione %s</string> - <string name="encryption_export_notice">Crea una password per mettere al sicuro le chiavi esportate. La stessa password dovrà essere usata per poter importare le chiavi.</string> - <string name="passphrase_create_passphrase">Crea una password</string> - <string name="passphrase_passphrase_does_not_match">Le password devono corrispondere</string> + <string name="encryption_export_notice">Crea una Passphrase per mettere al sicuro le chiavi esportate. La stessa Passphrase dovrà essere usata anche per importare le chiavi.</string> + <string name="passphrase_create_passphrase">Crea una Passphrase</string> + <string name="passphrase_passphrase_does_not_match">La Passphrase non corrisponde</string> <string name="merged_events_expand">espandi</string> <string name="merged_events_collapse">riduci</string> <string name="settings_info_area_show">Mostra l\'area informazioni</string> @@ -1172,7 +1172,7 @@ <string name="accept">Accetta</string> <string name="auth_accept_policies">Per favore, leggi e accetta i termini di servizio di questo Home Server:</string> <string name="settings_notification_troubleshoot">Diagnostica delle notifiche</string> - <string name="settings_troubleshoot_diagnostic">Diagnosi</string> + <string name="settings_troubleshoot_diagnostic">Diagnosi dei problemi</string> <string name="settings_troubleshoot_diagnostic_run_button_title">Esegui i test</string> <string name="settings_troubleshoot_diagnostic_running_status">In esecuzione… (%1$d di %2$d)</string> <string name="settings_troubleshoot_diagnostic_success_status">La diagnostica di base risponde correttamente. Se continui a non ricevere notifiche, invia una segnalazione errore per aiutarci a indagare.</string> @@ -1207,7 +1207,7 @@ <string name="settings_troubleshoot_test_token_registration_success">Token FCM registrato con successo sull\'Home Server.</string> <string name="settings_troubleshoot_test_token_registration_failed">E\'fallita la registrazione del Token FCM sull\'Home Server: \n %1$s</string> - <string name="settings_troubleshoot_test_foreground_service_started_title">Servizio di notifiche</string> + <string name="settings_troubleshoot_test_foreground_service_started_title">Servizi di notifica</string> <string name="settings_troubleshoot_test_foreground_service_startedt_success">Servizio di notifiche in esecuzione.</string> <string name="settings_troubleshoot_test_foreground_service_started_failed">Servizio di notifiche non in esecuzione. \nProva a riavviare l\'applicazione.</string> @@ -1225,7 +1225,7 @@ <string name="template_settings_troubleshoot_test_bg_restricted_failed">${app_name} è stato configurato per funzionare in modo limitato quando è eseguito in background. \nIl funzionamento dell\'App, quando è eseguita in background, è stato fortemente limitato e ciò potrebbe influenzare la ricezione delle notifiche. \n%1$s</string> - <string name="settings_troubleshoot_test_bg_restricted_quickfix">Non limitare</string> + <string name="settings_troubleshoot_test_bg_restricted_quickfix">Disabilita le restrizioni</string> <string name="settings_troubleshoot_test_battery_title">Ottimizzazione della batteria</string> <string name="template_settings_troubleshoot_test_battery_success">${app_name} non è influenzato dall\'ottimizzazione della batteria.</string> <string name="settings_troubleshoot_test_battery_failed">Se si lascia un dispositivo scollegato, fermo e con lo schermo spento, dopo un certo tempo questo entra in modalità Doze. Ciò impedisce alle App di accedere alla rete e ritarda le attività, le sincronizzazioni e la ricezione dei normali allarmi.</string> @@ -1246,14 +1246,14 @@ <string name="done">Fatto</string> <string name="settings_notification_advanced">Impostazioni di notifica avanzate</string> <string name="sign_out_bottom_sheet_warning_no_backup">Se ti disconnetti adesso perderai i tuoi messaggi cifrati</string> - <string name="sign_out_bottom_sheet_warning_backing_up">Il Backup delle chiavi è in corso. Se ti disconnetti adesso perderai i tuoi messaggi cifrati.</string> + <string name="sign_out_bottom_sheet_warning_backing_up">Il Backup delle chiavi è in corso. Se ti disconnetti adesso perderai i tuoi messaggi criptati.</string> <string name="sign_out_bottom_sheet_warning_backup_not_active">Il Backup delle chiavi deve essere attivo su tutte le tue sessioni per evitare di perdere l\'accesso ai tuoi messaggi cifrati.</string> <string name="sign_out_bottom_sheet_dont_want_secure_messages">Non voglio i miei messaggi cifrati</string> <string name="sign_out_bottom_sheet_backing_up_keys">Backup delle chiavi…</string> <string name="keys_backup_activate">Usa il Backup delle chiavi</string> <string name="are_you_sure">Sei sicuro\?</string> <string name="backup">Backup</string> - <string name="sign_out_bottom_sheet_will_lose_secure_messages">Perderai l\'accesso ai tuoi messaggi cifrati a meno che tu non faccia il Backup delle chiavi prima di disconnetterti.</string> + <string name="sign_out_bottom_sheet_will_lose_secure_messages">Perderai l\'accesso ai tuoi messaggi criptati a meno che tu non faccia il Backup delle chiavi prima di disconnetterti.</string> <string name="stay">Rimani</string> <string name="abort">Interrompi</string> <string name="ignore">Ignora</string> @@ -1280,38 +1280,38 @@ <string name="settings_system_preferences_summary">Scegli il colore del LED, la vibrazione, il suono…</string> <string name="settings_cryptography_manage_keys">Gestione chiavi crittografiche</string> <string name="settings_send_message_with_enter">Invia il messaggio col tasto Invio</string> - <string name="settings_send_message_with_enter_summary">Il tasto Invio della tastiera, invece di andare a capo invierà il messaggio</string> + <string name="settings_send_message_with_enter_summary">Il tasto Invio della tastiera invece di andare a capo invierà il messaggio</string> <string name="settings_data_save_mode_summary">La modalità risparmio dati applica un filtro specifico che esclude gli aggiornamenti di presenza e le notifiche di scrittura.</string> <string name="settings_change_password_submit">Aggiorna la password</string> <string name="settings_fail_to_update_password_invalid_current_password">La password non è valida</string> <string name="passwords_do_not_match">Le password non corrispondono</string> - <string name="encryption_message_recovery">Ripristino dei messaggi cifrati</string> + <string name="encryption_message_recovery">Ripristino dei messaggi criptati</string> <string name="encryption_settings_manage_message_recovery_summary">Gestisci il Backup delle chiavi</string> <string name="notification_silent">Silenzioso</string> <string name="error_empty_field_enter_user_name">Inserisci un nome utente.</string> - <string name="passphrase_empty_error_message">Inserisci una password</string> - <string name="passphrase_passphrase_too_weak">La password è troppo debole</string> - <string name="template_keys_backup_passphrase_not_empty_error_message">Cancella la password se vuoi che ${app_name} generi un codice di recupero.</string> + <string name="passphrase_empty_error_message">Inserisci una Passphrase</string> + <string name="passphrase_passphrase_too_weak">La Passphrase è troppo debole</string> + <string name="template_keys_backup_passphrase_not_empty_error_message">Cancella la Passphrase se vuoi che ${app_name} generi un codice di recupero.</string> <string name="keys_backup_no_session_error">Non c\'è alcuna sessione Matrix disponibile</string> <string name="keys_backup_setup_step1_title">Non perdere mai i messaggi cifrati</string> - <string name="keys_backup_setup_step1_description">I messaggi nelle stanze cifrate sono protetti con crittografia E2E. Solo tu e il/i destinatario/i avete le chiavi crittografiche per leggere questi messaggi. -\n + <string name="keys_backup_setup_step1_description">I messaggi nelle stanze cifrate sono protetti con crittografia E2E. Solo tu e i destinatarii avete le chiavi crittografiche per leggere questi messaggi. +\n \nRicorda di fare un backup delle tue chiavi crittografiche per evitare di perderle.</string> <string name="keys_backup_setup">Inizia ad usare il Backup delle chiavi crittografiche</string> <string name="keys_backup_setup_step1_advanced">(Avanzato)</string> <string name="keys_backup_setup_step1_manual_export">Esporta manualmente le chiavi crittografiche</string> - <string name="keys_backup_setup_step2_text_title">Proteggi il tuo backup con una password.</string> - <string name="keys_backup_setup_step2_text_description">Una copia cifrata delle tue chiavi crittografiche sarà salvata sul tuo Home Server. Proteggi il tuo Backup con una password per tenerlo al sicuro. -\n -\nPer una maggior sicurezza, è meglio che la password del Backup delle chiavi sia diversa da quella del tuo account.</string> - <string name="keys_backup_setup_step2_button_title">Imposta password</string> + <string name="keys_backup_setup_step2_text_title">Proteggi il tuo backup con una Passphrase.</string> + <string name="keys_backup_setup_step2_text_description">Una copia criptata delle tue chiavi crittografiche sarà salvata sul tuo Home Server. Proteggi il tuo Backup con una Passphrase per tenerla al sicuro. +\n +\nPer una maggior sicurezza, è meglio che la Passphrase del Backup delle chiavi sia diversa dalla password del tuo account.</string> + <string name="keys_backup_setup_step2_button_title">Imposta la Passphrase</string> <string name="keys_backup_setup_creating_backup">Creazione backup</string> <string name="keys_backup_setup_step1_recovery_key_alternative">Oppure, proteggi il tuo Backup con un codice di recupero, salvandolo in un luogo sicuro.</string> <string name="keys_backup_setup_step2_skip_button_title">(Avanzato) Imposta un codice di recupero</string> <string name="keys_backup_setup_step3_success_title">Fatto!</string> <string name="keys_backup_setup_step3_text_line1">Il Backup delle tue chiavi crittografiche è in corso.</string> - <string name="keys_backup_setup_step3_text_line2">Il tuo codice di recupero è un\'ancora di salvezza - puoi usarlo per riaccedere ai tuoi messaggi cifrati se dimentichi la password. -\nSalva il tuo codice di recupero in un luogo sicuro, tipo un password manager (o una cassaforte)</string> + <string name="keys_backup_setup_step3_text_line2">Il tuo codice di recupero è un\'ancora di salvezza - puoi usarlo per riaccedere ai tuoi messaggi criptati qualora dimenticassi la Passphrase. +\nSalva il tuo codice di recupero in un luogo sicuro, come un password manager (o una cassaforte)</string> <string name="keys_backup_setup_step3_text_line2_no_passphrase">Salva il tuo codice di recupero in un luogo sicuro, come un password manager (o una cassaforte)</string> <string name="keys_backup_setup_step3_button_title">Fatto</string> <string name="keys_backup_setup_step3_button_title_no_passphrase">Ho fatto una copia</string> @@ -1323,7 +1323,7 @@ \nAttenzione: se l\'applicazione su cui è salvato venisse disinstallata, il codice di recupero verrà perso.</string> <string name="keys_backup_setup_step3_please_make_copy">Si prega di farne una copia</string> <string name="keys_backup_setup_step3_share_intent_chooser_title">Condividi il codice di recupero con…</string> - <string name="keys_backup_setup_step3_generating_key_status">Generazione del codice di recupero usando la password. Questo processo può durare alcuni secondi.</string> + <string name="keys_backup_setup_step3_generating_key_status">Generazione del codice di recupero basato sulla Passphrase. Questo processo può durare alcuni secondi.</string> <string name="recovery_key">Codice di recupero</string> <string name="unexpected_error">Errore inatteso</string> <string name="keys_backup_setup_backup_started_title">Backup avviato</string> @@ -1331,20 +1331,20 @@ <string name="keys_backup_setup_skip_title">Sei sicuro\?</string> <string name="keys_backup_setup_skip_msg">Se ti disconnetti o perdessi questo dispositivo potresti perdere l\'accesso ai tuoi messaggi.</string> <string name="keys_backup_restore_is_getting_backup_version">Verifica versione backup…</string> - <string name="keys_backup_restore_with_passphrase">Usa la tua password di recupero per sbloccare i messaggi cifrati</string> + <string name="keys_backup_restore_with_passphrase">Usa la tua Passphrase per sbloccare i messaggi criptati</string> <string name="keys_backup_restore_use_recovery_key">usa il tuo codice di recupero</string> - <string name="keys_backup_restore_with_passphrase_helper_with_link">Se non conosci la tua password di recupero, puoi %s.</string> + <string name="keys_backup_restore_with_passphrase_helper_with_link">Se non ricordi la tua Passphrase, puoi %s.</string> <string name="keys_backup_restore_with_recovery_key">Usa il tuo codice di recupero per sbloccare la Timeline dei messaggi cifrati</string> <string name="keys_backup_restore_key_enter_hint">Inserisci codice di recupero</string> <string name="keys_backup_restore_setup_recovery_key">Ripristino messaggio</string> <string name="keys_backup_restore_with_key_helper">Hai perso il codice di recupero\? Nelle Impostazioni puoi crearne uno nuovo.</string> - <string name="keys_backup_passphrase_error_decrypt">Impossibile decifrare il backup con questa password: verifica che la password di recupero inserita sia corretta.</string> + <string name="keys_backup_passphrase_error_decrypt">Impossibile decrittare il backup con questa Passphrase: verifica che sia corretta.</string> <string name="network_error_please_check_and_retry">Errore di rete: controlla la tua connessione e riprova.</string> <string name="keys_backup_restoring_waiting_message">Ripristino Backup:</string> <string name="keys_backup_restoring_computing_key_waiting_message">Codice di recupero in elaborazione…</string> <string name="keys_backup_restoring_downloading_backup_waiting_message">Download chiavi…</string> <string name="keys_backup_restoring_importing_keys_waiting_message">Importazione chiavi…</string> - <string name="keys_backup_unlock_button">Sblocca Timeline</string> + <string name="keys_backup_unlock_button">Sblocca Cronologia</string> <string name="keys_backup_recovery_code_empty_error_message">Inserisci un codice di recupero</string> <string name="keys_backup_recovery_code_error_decrypt">Impossibile decifrare il backup con questo codice di recupero: verifica di avere inserito il codice di recupero corretto.</string> <string name="keys_backup_restore_success_title">Backup ripristinato %s !</string> @@ -1359,7 +1359,7 @@ <string name="keys_backup_get_version_error">Rilevazione ultima versione codici di recupero fallita (%s).</string> <string name="keys_backup_no_keysbackup_sdk_error">La cifratura della sessione non è stata attivata</string> <string name="keys_backup_settings_restore_backup_button">Ripristina da backup</string> - <string name="keys_backup_settings_delete_backup_button">Elimina backup</string> + <string name="keys_backup_settings_delete_backup_button">Elimina Backup</string> <string name="keys_backup_settings_status_ok">Il backup delle chiavi è stato impostato correttamente per questa sessione.</string> <string name="keys_backup_settings_status_ko">Il backup delle chiavi non è attivo su questa sessione.</string> <string name="keys_backup_settings_status_not_setup">Questa sessione non sta facendo il backup delle chiavi.</string> @@ -1370,10 +1370,10 @@ <string name="keys_backup_settings_invalid_signature_from_verified_device">Il backup ha una firma non valida dalla sessione verificata %s</string> <string name="keys_backup_settings_invalid_signature_from_unverified_device">Il backup ha una firma non valida dalla sessione non verificata %s</string> <string name="keys_backup_get_trust_error">Impossibile ottenere info di fiducia per il backup (%s).</string> - <string name="keys_backup_settings_untrusted_backup">Per usare il backup delle chiavi crittografiche su questa sessione, devi accedervi con la password o con il codice di recupero.</string> - <string name="keys_backup_settings_deleting_backup">Eliminazione backup…</string> + <string name="keys_backup_settings_untrusted_backup">Per usare il backup delle chiavi crittografiche su questa sessione, devi accedervi con la Passphrase o con il codice di recupero.</string> + <string name="keys_backup_settings_deleting_backup">Eliminazione Backup…</string> <string name="keys_backup_settings_delete_backup_error">Eliminazione backup fallita (%s)</string> - <string name="keys_backup_settings_delete_confirm_title">Elimina backup</string> + <string name="keys_backup_settings_delete_confirm_title">Elimina Backup</string> <string name="keys_backup_settings_delete_confirm_message">Eliminare il Backup delle chiavi crittografiche dall\'Home Server\? Non potrai più usare il codice di recupero per leggere i messaggi cifrati.</string> <string name="new_recovery_method_popup_title">Nuovo Backup delle chiavi</string> <string name="new_recovery_method_popup_description">È stato rilevato un nuovo Backup delle chiavi crittografiche. @@ -1397,7 +1397,7 @@ <string name="keys_backup_info_title_signature">Firma</string> <string name="autodiscover_invalid_response">Risposta Home Server non valida</string> <string name="autodiscover_well_known_autofill_dialog_title">Opzioni autocompletamento server</string> - <string name="template_autodiscover_well_known_autofill_dialog_message">${app_name} ha rilevato una configurazione server personalizzata per il tuo dominio userId \"%1$s\": + <string name="template_autodiscover_well_known_autofill_dialog_message">${app_name} ha rilevato una configurazione server personalizzata per il tuo dominio userID \"%1$s\": \n%2$s</string> <string name="autodiscover_well_known_autofill_confirm">Usa configurazione</string> <string name="notification_sync_init">Inizializzazione del servizio</string> @@ -1439,13 +1439,13 @@ <string name="key_share_request">Richiesta condivisione chiavi crittografiche</string> <string name="ignore_request_short_label">Ignora</string> <string name="sas_verify_title">Verifica confrontando una breve stringa.</string> - <string name="sas_security_advise">Per la massima sicurezza, consigliamo di farlo di persona o di utilizzare un altro metodo di comunicazione fidato.</string> + <string name="sas_security_advise">Per una miglior sicurezza consigliamo di farlo di persona o di utilizzare altri metodi di comunicazione sicuri.</string> <string name="sas_verify_start_button_title">Inizia la verifica</string> <string name="sas_incoming_request_title">Richiesta di verifica in arrivo</string> - <string name="sas_incoming_request_description">Verifica questa sessione per segnarla come fidata. Verificare le sessioni dei partner ti dà una maggiore tranquillità quando usi messaggi cifrati end-to-end.</string> - <string name="sas_incoming_request_description_2">Verificare questa sessione la segnerà come fidata e segnerà anche la tua sessione come fidata per il tuo partner.</string> - <string name="sas_emoji_description">Verifica questa sessione confermando che le seguenti emoji appaiono sullo schermo del partner</string> - <string name="sas_decimal_description">Verifica questa sessione confermando che i seguenti numeri appaiono sullo schermo del partner</string> + <string name="sas_incoming_request_description">Verifica questa sessione per segnarla come affidabile. Verificare le sessioni degli utenti offre maggiori sicurezze quando usi messaggi cifrati end-to-end.</string> + <string name="sas_incoming_request_description_2">Verificando questa sessione verrà contrassegnata come affidabile anche per l\'altro utente.</string> + <string name="sas_emoji_description">Verifica questa sessione confermando che le seguenti emoji appaiono sullo schermo dell\'altro utente</string> + <string name="sas_decimal_description">Verifica questa sessione confermando che i seguenti numeri appaiono sullo schermo dell\'altro utente</string> <string name="sas_incoming_verification_request_dialog">Hai ricevuto una richiesta di verifica.</string> <string name="sas_view_request_action">Vedi la richiesta</string> <string name="sas_waiting_for_partner">In attesa che il partner confermi…</string> @@ -1457,7 +1457,7 @@ <string name="sas_legacy_verification_button_title">Usa la verifica classica.</string> <string name="sas_verification_request_notification_channel_title">Verifica chiave</string> <string name="sas_cancelled_dialog_title">Richiesta annullata</string> - <string name="sas_cancelled_by_other">L\'altra parte ha annullato la verifica. + <string name="sas_cancelled_by_other">L\'altro utente ha annullato la verifica. \n%s</string> <string name="sas_cancelled_by_me">La verifica è annullata. \nMotivo: %s</string> @@ -1468,12 +1468,12 @@ <string name="sas_error_m_timeout">Il processo di verifica è scaduto</string> <string name="sas_error_m_unknown_transaction">La sessione non sa della transazione</string> <string name="sas_error_m_unknown_method">La sessione non riesce ad accordarsi sulla chiave, hash, MAC, o metodo SAS</string> - <string name="sas_error_m_mismatched_commitment">L\'hash non corrispondeva</string> + <string name="sas_error_m_mismatched_commitment">L\'hash inviato non corrisponde</string> <string name="sas_error_m_mismatched_sas">Il SAS non corrispondeva</string> <string name="sas_error_m_unexpected_message">La sessione ha ricevuto un messaggio inaspettato</string> <string name="sas_error_m_invalid_message">È stato ricevuto un messaggio non valido</string> <string name="sas_error_m_key_mismatch">Le chiavi non corrispondono</string> - <string name="sas_error_m_user_error">Utente non corrispondente</string> + <string name="sas_error_m_user_error">L\'utente non corrisponde</string> <string name="sas_error_unknown">Errore sconosciuto</string> <string name="keys_backup_setup_override_backup_prompt_tile">Esiste già un backup sul tuo Home Server</string> <string name="keys_backup_setup_override_backup_prompt_description">Sembra tu abbia già impostato il backup delle chiavi crittografiche da un\'altra sessione. Vuoi sostituirlo con il backup che stai creando\?</string> @@ -1566,14 +1566,14 @@ <string name="room_filtering_footer_title">Non trovi quello che cerchi\?</string> <string name="room_filtering_footer_create_new_room">Crea un nuova stanza</string> <string name="room_filtering_footer_create_new_direct_message">Invia un nuovo messaggio diretto</string> - <string name="room_filtering_footer_open_room_directory">Vedi l\'elenco delle stanze</string> + <string name="room_filtering_footer_open_room_directory">Guarda l\'elenco delle stanze pubbliche</string> <string name="room_directory_search_hint">Nome o ID stanza (#esempio:matrix.org)</string> - <string name="labs_swipe_to_reply_in_timeline">Attiva swipe per rispondere nella timeline</string> - <string name="link_copied_to_clipboard">Collegamento copiato negli appunti</string> - <string name="settings_integration_manager">Gestore dell\'integrazione</string> + <string name="labs_swipe_to_reply_in_timeline">Attiva lo swipe per rispondere nella timeline</string> + <string name="link_copied_to_clipboard">Link URL copiato negli appunti</string> + <string name="settings_integration_manager">Gestore delle integrazioni</string> <string name="integration_manager_not_configured">Non è stato configurato nessun Integration Manager.</string> <string name="add_by_matrix_id">Aggiungi per ID utente</string> - <string name="creating_direct_room">Creare una stanza …</string> + <string name="creating_direct_room">Creazione stanza …</string> <string name="direct_room_no_known_users">Nessun risultato trovato. Usa \"Aggiungi per ID utente\" per cercare sul server.</string> <string name="direct_room_start_search">Inizia a digitare per ottenere risultati</string> <string name="direct_room_filter_hint">Cerca per nome o ID utente …</string> @@ -1584,7 +1584,7 @@ <string name="widget_integration_review_terms">Per continuare devi accettare i termini di servizio.</string> <string name="terms_of_service">Termini di servizio</string> <string name="review_terms">Leggi i termini di servizio</string> - <string name="terms_description_for_identity_server">Fatti trovare dagli altri utenti</string> + <string name="terms_description_for_identity_server">Fatti rintracciare dagli altri utenti</string> <string name="terms_description_for_integration_manager">Usa bot, bridge, widget e pacchetti di sticker</string> <string name="read_at">Leggi su</string> <string name="none">Nessuno</string> @@ -1603,7 +1603,7 @@ <string name="auth_add_email_and_phone_message_2">Imposta un\'email per il ripristino dell\'account in caso di problemi. Email e numero di telefono potranno essere usati, se lo vorrai, anche per permettere a chi li conosce di trovarti.</string> <string name="login_error_homeserver_not_found">Non è stato trovato alcun Home Server seguendo questo URL. Per favore, controllalo</string> <string name="settings_call_ringtone_use_default_stun">Permetti chiamate dal Server di appoggio</string> - <string name="settings_call_ringtone_use_default_stun_sum">Se il tuo Home Server non ne ha un proprio Server d\'appoggio verrà usato %s (il Server d\'appoggio verrà a conoscenza del tuo indirizzo IP durante le chiamate)</string> + <string name="settings_call_ringtone_use_default_stun_sum">Verrà usato %s come server d\'appoggio quando il tuo homeserver non ha uno proprio (il tuo indirizzo IP verrà esposto durante una chiamata)</string> <string name="invite_no_identity_server_error">Per poterlo fare, aggiungi un Identity Server nelle Impostazioni.</string> <string name="settings_background_fdroid_sync_mode">Modalità sync in background</string> <string name="settings_background_fdroid_sync_mode_battery">Ottimizzato per la batteria</string> @@ -1629,20 +1629,20 @@ <string name="disconnect_identity_server">Disconnetti Identity Server</string> <string name="add_identity_server">Configura Identity Server</string> <string name="change_identity_server">Cambia Identity Server</string> - <string name="settings_discovery_identity_server_info">Stai usando l\'Identity Server %1$s per trovare e farti trovare da altri utenti.</string> - <string name="settings_discovery_identity_server_info_none">In questo momento non stai usando alcun Identity Server. Per trovare e farti trovare dagli altri utenti, configurane uno qua sotto.</string> + <string name="settings_discovery_identity_server_info">Stai usando l\'Identity Server %1$s per trovare altri utenti e essere a tua volta rintracciabile da loro.</string> + <string name="settings_discovery_identity_server_info_none">In questo momento non stai usando alcun Identity Server. Per trovare e farti rintracciare dagli altri utenti, configurane uno qua sotto.</string> <string name="settings_discovery_emails_title">Indirizzi email visibili pubblicamente</string> - <string name="settings_discovery_no_mails">Le opzioni su come farsi trovare da altri utenti appariranno dopo avere aggiunto un\'email.</string> - <string name="settings_discovery_no_msisdn">Le opzioni su come farsi trovare da altri utenti appariranno dopo avere aggiunto un numero di telefono.</string> - <string name="settings_discovery_disconnect_identity_server_info">Se ti disconnetti dall\'Identity Server gli altri utenti non potranno trovarti e tu non potrai invitarne di nuovi per email o telefono.</string> + <string name="settings_discovery_no_mails">Le opzioni su come farsi trovare da altri utenti appariranno dopo che avrai aggiunto un\'email.</string> + <string name="settings_discovery_no_msisdn">Le opzioni su come farsi trovare da altri utenti appariranno dopo che avrai aggiunto un numero di telefono.</string> + <string name="settings_discovery_disconnect_identity_server_info">Se ti disconnetti dall\'Identity Server gli altri utenti non potranno trovarti e tu non potrai invitarli tramite le loro email e numeri di telefono.</string> <string name="settings_discovery_msisdn_title">Numeri di telefono visibili pubblicamente</string> - <string name="settings_discovery_confirm_mail">Abbiamo inviato un\'email di conferma a %s, controlla l\'email e clicca sul link di conferma</string> + <string name="settings_discovery_confirm_mail">Abbiamo inviato un\'email di conferma a %s. Controlla l\'email e clicca sul link di conferma</string> <string name="settings_discovery_mail_pending">In attesa</string> - <string name="settings_discovery_enter_identity_server">Inserisci un URL di server di identità</string> + <string name="settings_discovery_enter_identity_server">Inserisci l\'URL di un Identity Server</string> <string name="settings_discovery_bad_identity_server">Impossibile connettersi all\'Identity Server</string> <string name="settings_discovery_please_enter_server">Inserisci l\'URL dell\'Identity Server</string> <string name="settings_discovery_no_terms_title">L\'Identity Server non ha reso noti i propri termini di servizio</string> - <string name="settings_discovery_no_terms">L\'Identity Server che hai scelto non ha freso noti i propri termini di servizio. Continua solo se ti fidi</string> + <string name="settings_discovery_no_terms">L\'Identity Server che hai scelto non ha reso noti i propri termini di servizio. Continua solo se ti fidi</string> <string name="settings_text_message_sent">È stato inviato un messaggio a %s. Inserisci il codice di verifica che contiene.</string> <string name="settings_discovery_disconnect_with_bound_pid">In questo momento stai condividendo i tuoi indirizzi email o numeri di telefono sull\'Identity Server %1$s. Dovrai riconnetterti a %2$s per interromperne la condivisione.</string> <string name="settings_agree_to_terms">Accetta i termini di servizio dell\'Identity Server (%s) per permettere ad altri utenti di trovarti tramite la tua email o numero di telefono.</string> @@ -1653,13 +1653,13 @@ <string name="send_attachment">Invia allegato</string> <string name="a11y_open_drawer">Apri il pannello di navigazione</string> <string name="a11y_create_menu_open">Apri il menu \"Crea nuova stanza\"</string> - <string name="a11y_create_menu_close">Chiudi il menu di \"Crea nuova stanza\"…</string> + <string name="a11y_create_menu_close">Chiudi il menu \"Crea nuova stanza\"…</string> <string name="a11y_create_direct_message">Crea una nuova conversazione diretta</string> <string name="a11y_create_room">Crea nuova stanza</string> <string name="a11y_close_keys_backup_banner">Chiudi il banner del Backup delle chiavi</string> <string name="a11y_show_password">Mostra password</string> <string name="a11y_hide_password">Nascondi password</string> - <string name="a11y_jump_to_bottom">Salta in fondo</string> + <string name="a11y_jump_to_bottom">Vai in fondo</string> <string name="three_users_read">%1$s, %2$s e %3$s hanno letto</string> <string name="two_users_read">%1$s e %2$s hanno letto</string> <string name="one_user_read">%s ha letto</string> @@ -1667,14 +1667,14 @@ <item quantity="one">%d utente ha letto</item> <item quantity="other">%d utenti hanno letto</item> </plurals> - <string name="error_file_too_big">Il file \'%1$s\' (%2$s) è troppo grande da inviare. Il limite è %3$s.</string> - <string name="error_attachment">Si è verificato un errore ricevendo l\'allegato.</string> + <string name="error_file_too_big">Il file \'%1$s\' (%2$s) è troppo grande per essere inviato. Il limite è %3$s.</string> + <string name="error_attachment">Si è verificato un errore nella ricezione dell\'allegato.</string> <string name="attachment_type_file">File</string> <string name="attachment_type_contact">Contatto</string> <string name="attachment_type_camera">Fotocamera</string> <string name="attachment_type_audio">Audio</string> <string name="attachment_type_gallery">Galleria</string> - <string name="attachment_type_sticker">Adesivo</string> + <string name="attachment_type_sticker">Sticker</string> <string name="error_handling_incoming_share">Errore nella gestione dei dati condivisi</string> <string name="report_content_spam">È spam</string> <string name="report_content_inappropriate">È inappropriato</string> @@ -1684,19 +1684,19 @@ <string name="report_content_custom_submit">SEGNALA</string> <string name="block_user">IGNORA UTENTE</string> <string name="content_reported_title">Contenuto segnalato</string> - <string name="content_reported_content">Questo contenuto è stato segnalato. -\n -\nSe non vuoi più vedere contenuti da questo utente, puoi ignorarlo per nascondere i suoi messaggi.</string> + <string name="content_reported_content">Questo contenuto è stato segnalato. +\n +\nSe non vuoi più vedere i contenuti di questo utente puoi ignorarlo. Ciò nasconderà i suoi messaggi dalla tua vista.</string> <string name="content_reported_as_spam_title">Segnalato come spam</string> - <string name="content_reported_as_spam_content">Questo contenuto è stato segnalato come spam. -\n -\nSe non vuoi più vedere contenuti da questo utente, puoi ignorarlo per nascondere i suoi messaggi.</string> + <string name="content_reported_as_spam_content">Questo contenuto è stato segnalato come spam. +\n +\nSe non vuoi più vedere i contenuti di questo utente puoi ignorarlo. Ciò nasconderà i suoi messaggi dalla tua vista.</string> <string name="content_reported_as_inappropriate_title">Segnalato come inappropriato</string> - <string name="content_reported_as_inappropriate_content">Questo contenuto è stato segnalato come inappropriato. -\n -\nSe non vuoi più vedere contenuti da questo utente, puoi ignorarlo per nascondere i suoi messaggi.</string> - <string name="template_permissions_rationale_msg_keys_backup_export">${app_name} richiede l\'autorizzazione per salvare le tue chiavi crittografiche sul disco. -\n + <string name="content_reported_as_inappropriate_content">Questo contenuto è stato segnalato come inappropriato. +\n +\nSe non vuoi più vedere i contenuti di questo utente puoi ignorarlo. Ciò nasconderà i suoi messaggi dalla tua vista.</string> + <string name="template_permissions_rationale_msg_keys_backup_export">${app_name} richiede l\'autorizzazione per salvare sul disco le tue chiavi crittografiche. +\n \nPermetti l\'accesso nel prossimo pop-up per poter esportare le chiavi manualmente.</string> <string name="no_network_indicator">In questo momento non c\'è nessuna connessione di rete</string> <string name="settings_add_3pid_confirm_password_title">Conferma la tua password</string> @@ -1725,7 +1725,7 @@ <string name="room_widget_resource_permission_title">Questo widget vuole usare le seguenti risorse:</string> <string name="room_widget_resource_grant_permission">Permetti</string> <string name="room_widget_resource_decline_permission">Blocca tutto</string> - <string name="room_widget_webview_access_camera">Usare la fotocamera</string> + <string name="room_widget_webview_access_camera">Usa la fotocamera</string> <string name="room_widget_webview_access_microphone">Usa il microfono</string> <string name="room_widget_webview_read_protected_media">Leggi media protetti da DRM</string> <string name="login_error_no_homeserver_found">Questo non è un indirizzo di server Matrix valido</string> @@ -1735,93 +1735,93 @@ <string name="room_list_quick_actions_notifications_mentions">Solo citazioni</string> <string name="room_list_quick_actions_notifications_mute">Silenzioso</string> <string name="room_list_quick_actions_settings">Impostazioni</string> - <string name="room_list_quick_actions_leave">Lascia la stanza</string> + <string name="room_list_quick_actions_leave">Esci dalla stanza</string> <string name="notice_member_no_changes">%1$s non ha fatto modifiche</string> <string name="command_description_spoiler">Invia il messaggio come spoiler</string> <string name="spoiler">Spoiler</string> - <string name="reaction_search_type_hint">Digita parole chiave per trovare una reazione.</string> + <string name="reaction_search_type_hint">Digita parole chiave per trovare le reazioni.</string> <string name="no_ignored_users">Non stai ignorando alcun utente</string> <string name="help_long_click_on_room_for_more_options">Tieni premuto su una stanza per altre opzioni</string> - <string name="room_join_rules_public">%1$s ha reso pubblica la stanza a chiunque conosca il collegamento.</string> - <string name="room_join_rules_invite">%1$s ha reso la stanza solo ad invito.</string> + <string name="room_join_rules_public">%1$s ha reso la stanza pubblica. Ora è raggiungibile da chiunque ne conosca l\'indirizzo.</string> + <string name="room_join_rules_invite">%1$s ha reso la stanza accessibile solo su invito.</string> <string name="timeline_unread_messages">Messaggi non letti</string> - <string name="login_splash_title">È la tua conversazione. Tienitela.</string> - <string name="login_splash_text1">Chatta con persone direttamente o in gruppi</string> - <string name="login_splash_text2">Tieni private le conversazioni con la crittografia</string> + <string name="login_splash_title">Le -tue- conversazioni appartengono solo a te.</string> + <string name="login_splash_text1">Scambia messaggi diretti o nei gruppi</string> + <string name="login_splash_text2">Rendi sicure le tue conversazioni grazie alla crittografia</string> <string name="login_splash_text3">Estendi e personalizza la tua esperienza</string> <string name="login_splash_submit">Inizia</string> <string name="login_server_title">Seleziona un server</string> - <string name="login_server_text">Proprio come le email, gli account hanno una sola origine, ma puoi parlare con chiunque</string> - <string name="login_server_matrix_org_text">Unisciti a milioni gratuitamente sul server pubblico più grande</string> + <string name="login_server_text">Proprio come le email: puoi fare un account dove preferisci e interagire con tutti</string> + <string name="login_server_matrix_org_text">Unisciti gratuitamente a milioni di utenti sul più grande server pubblico</string> <string name="login_server_modular_text">Hosting premium per organizzazioni</string> <string name="login_server_modular_learn_more">Maggiori info</string> <string name="login_server_other_title">Altro</string> <string name="login_server_other_text">Impostazioni personalizzate ed avanzate</string> <string name="login_continue">Continua</string> <string name="login_connect_to">Connetti a %1$s</string> - <string name="login_connect_to_modular">Connetti a Element Matrix Services</string> - <string name="login_connect_to_a_custom_server">Connetti ad un server personalizzato</string> + <string name="login_connect_to_modular">Connettiti a Element Matrix Services</string> + <string name="login_connect_to_a_custom_server">Connettiti a un server personalizzato</string> <string name="login_signin_to">Accedi a %1$s</string> <string name="login_signup">Registrati</string> <string name="login_signin">Accedi</string> - <string name="login_signin_sso">Continua con SSO</string> + <string name="login_signin_sso">Continua con l\'autenticazione (SSO)</string> <string name="login_server_url_form_modular_hint">Indirizzo Element Matrix Services</string> <string name="login_server_url_form_other_hint">Indirizzo</string> <string name="login_server_url_form_modular_text">Hosting premium per organizzazioni</string> - <string name="login_server_url_form_modular_notice">Inserisci l\'indirizzo del Element Modular o del server che vuoi usare</string> + <string name="login_server_url_form_modular_notice">Inserisci l\'indirizzo Element Modular o del server che vuoi usare</string> <string name="login_sso_error_message">Si è verificato un errore caricando la pagina: %1$s (%2$d)</string> - <string name="login_mode_not_supported">L\'applicazione non riesce ad accedere a questo homeserver. L\'homeserver supporta i seguenti tipi di accesso: %1$s. + <string name="login_mode_not_supported">L\'applicazione non riesce ad accedere a questo Home Server. L\'Home Server supporta i seguenti tipi di accesso: %1$s. \n \nVuoi accedere usando un client web\?</string> <string name="login_registration_disabled">Spiacenti, questo server non accetta nuovi account.</string> - <string name="login_registration_not_supported">L\'applicazione non riesce a creare un account su questo homeserver. + <string name="login_registration_not_supported">L\'applicazione non riesce a creare un account su questo Home Server. \n \nVuoi registrarti usando un client web\?</string> <string name="login_login_with_email_error">Questa email non è associata ad alcun account.</string> - <string name="login_reset_password_on">Reimposta password su %1$s</string> - <string name="login_reset_password_notice">Verrà inviata un\'email di verifica nella tua posta per confermare l\'impostazione della nuova password.</string> + <string name="login_reset_password_on">Reimposta la password su %1$s</string> + <string name="login_reset_password_notice">Per confermare la nuova password ti verrà inviata un\'email di verifica.</string> <string name="login_reset_password_submit">Avanti</string> <string name="login_reset_password_email_hint">Email</string> <string name="login_reset_password_password_hint">Nuova password</string> <string name="login_reset_password_warning_title">Attenzione!</string> - <string name="login_reset_password_warning_content">Cambiare la password reimposterà qualunque chiave di cifratura end-to-end su tutte le tue sessioni, rendendo illeggibile la cronologia delle chat criptate. Imposta il Backup Chiavi o esporta le tue chiavi della stanza da un\'altra sessione prima di reimpostare la password.</string> + <string name="login_reset_password_warning_content">Cambiando la password verranno reimpostate le chiavi crittografiche E2E di tutte le tue sessioni rendendo illeggibile la cronologia delle chat criptate. Prima di reimpostare la password imposta il Backup delle Chiavi o esporta le chiavi della tua stanza da un\'altra sessione.</string> <string name="login_reset_password_warning_submit">Continua</string> <string name="login_reset_password_error_not_found">Questa email non è collegata ad alcun account</string> <string name="login_reset_password_mail_confirmation_title">Controlla la tua posta</string> <string name="login_reset_password_mail_confirmation_notice">Un\'email di verifica è stata inviata a %1$s.</string> - <string name="login_reset_password_mail_confirmation_notice_2">Tocca il collegamento per confermare la tua nuova password. Una volta seguito il collegamento contenuto, clicca sotto.</string> + <string name="login_reset_password_mail_confirmation_notice_2">Clicca sul link per confermare la tua nuova password. Una volta fatto, clicca sotto.</string> <string name="login_reset_password_mail_confirmation_submit">Ho verificato il mio indirizzo email</string> - <string name="login_reset_password_success_title">Successo!</string> + <string name="login_reset_password_success_title">Fatto!</string> <string name="login_reset_password_success_notice">La tua password è stata reimpostata.</string> - <string name="login_reset_password_success_notice_2">Sei stato disconnesso da tutte le sessioni e non riceverai più notifiche push. Per riattivare le notifiche, riaccedi su ogni dispositivo.</string> + <string name="login_reset_password_success_notice_2">Sei stato disconnesso da tutte le sessioni e non riceverai più notifiche push. Per riattivare le notifiche, accedi nuovamente su ogni dispositivo.</string> <string name="login_reset_password_success_submit">Torna all\'accesso</string> <string name="login_reset_password_cancel_confirmation_title">Attenzione</string> <string name="login_reset_password_cancel_confirmation_content">La tua password non è ancora cambiata. \n \nFermare il processo di cambio password\?</string> <string name="login_set_email_title">Imposta indirizzo email</string> - <string name="login_set_email_notice">Imposta un\'email per recuperare il tuo account. Più tardi potrai permettere facoltativamente alle persone che conosci di trovarti tramite la tua email.</string> + <string name="login_set_email_notice">Imposta un\'email per recuperare il tuo account. Più tardi potrai decidere se permettere alle persone che conosci di trovarti tramite questa email.</string> <string name="login_set_email_mandatory_hint">Email</string> <string name="login_set_email_optional_hint">Email (facoltativa)</string> <string name="login_set_email_submit">Avanti</string> <string name="login_set_msisdn_title">Imposta numero di telefono</string> - <string name="login_set_msisdn_notice">Imposta un numero di telefono per permettere facoltativamente alle persone che conosci di trovarti.</string> + <string name="login_set_msisdn_notice">Imposta un numero di telefono per permettere alle persone che conosci di trovarti (facoltativo).</string> <string name="login_set_msisdn_notice2">Si prega di usare il formato internazionale.</string> <string name="login_set_msisdn_mandatory_hint">Numero di telefono</string> <string name="login_set_msisdn_optional_hint">Numero di telefono (facoltativo)</string> <string name="login_set_msisdn_submit">Avanti</string> - <string name="login_msisdn_confirm_title">Conferma numero di telefono</string> - <string name="login_msisdn_confirm_notice">Abbiamo inviato un codice a %1$s. Inseriscilo sotto per verificare che sei tu.</string> - <string name="login_msisdn_confirm_hint">Inserisci codice</string> + <string name="login_msisdn_confirm_title">Conferma il numero di telefono</string> + <string name="login_msisdn_confirm_notice">Abbiamo inviato un codice a %1$s. Inseriscilo qui sotto per verificare che sei davvero tu.</string> + <string name="login_msisdn_confirm_hint">Inserisci il codice</string> <string name="login_msisdn_confirm_send_again">Invia di nuovo</string> <string name="login_msisdn_confirm_submit">Avanti</string> <string name="login_msisdn_error_not_international">I numeri di telefono internazionali devono iniziare con \'+\'</string> - <string name="login_msisdn_error_other">Il numero di telefono non sembra valido. Ricontrollalo</string> + <string name="login_msisdn_error_other">Il numero di telefono non sembra valido. Controlla di nuovo</string> <string name="login_signup_to">Registrati su %1$s</string> <string name="login_signin_username_hint">Nome utente o email</string> <string name="login_signup_password_hint">Password</string> <string name="login_signup_submit">Avanti</string> - <string name="login_signup_error_user_in_use">Quel nome utente esiste già</string> + <string name="login_signup_error_user_in_use">Questo nome utente è già in uso</string> <string name="login_signup_cancel_confirmation_title">Attenzione</string> <string name="login_signup_cancel_confirmation_content">Il tuo account non è ancora stato creato. \n @@ -1829,17 +1829,17 @@ <string name="login_a11y_choose_matrix_org">Seleziona matrix.org</string> <string name="login_a11y_choose_modular">Seleziona Element Matrix Services</string> <string name="login_a11y_choose_other">Seleziona un server personalizzato</string> - <string name="login_a11y_captcha_container">Completa la verifica Captcha</string> - <string name="login_terms_title">Accetta le condizioni per continuare</string> + <string name="login_a11y_captcha_container">Completa il Captcha</string> + <string name="login_terms_title">Per continuare accetta le condizioni</string> <string name="login_wait_for_email_title">Controlla la tua email</string> - <string name="login_wait_for_email_notice">Abbiamo inviato un\'email a %1$s. -\nClicca il collegamento contenuto per continuare la creazione dell\'account.</string> - <string name="login_validation_code_is_not_correct">Il codice inserito non è corretto. Ricontrollalo.</string> - <string name="login_error_outdated_homeserver_title">Homeserver obsoleto</string> - <string name="login_error_outdated_homeserver_content">Questo homerserver è di una versione troppo vecchia per connettersi. Chiedi all\'amministratore dell\'homeserver di aggiornarlo.</string> + <string name="login_wait_for_email_notice">Abbiamo inviato un\'email a %1$s contenente un link. +\nClicca sul link per continuare la creazione dell\'account.</string> + <string name="login_validation_code_is_not_correct">Il codice inserito non è corretto. Controllalo nuovamente.</string> + <string name="login_error_outdated_homeserver_title">Home Server obsoleto</string> + <string name="login_error_outdated_homeserver_content">Impossibile connettersi: questo Home Server utilizza una versione obsoleta del software. Chiedi all\'amministratore dell\'Home Server di aggiornarlo.</string> <plurals name="login_error_limit_exceeded_retry_after"> - <item quantity="one">Sono state inviate troppe richieste. Puoi riprovare in %1$d secondo…</item> - <item quantity="other">Sono state inviate troppe richieste. Puoi riprovare in %1$d secondi…</item> + <item quantity="one">Sono state inviate troppe richieste. Puoi riprovare tra %1$d secondo…</item> + <item quantity="other">Sono state inviate troppe richieste. Puoi riprovare tra %1$d secondi…</item> </plurals> <string name="seen_by">Visto da</string> <string name="signed_out_title">Sei disconnesso</string> @@ -1853,54 +1853,54 @@ <string name="signed_out_submit">Accedi di nuovo</string> <string name="soft_logout_title">Sei disconnesso</string> <string name="soft_logout_signin_title">Accedi</string> - <string name="soft_logout_signin_notice">L\'amministratore dell\'homeserver (%1$s) ti ha disconnesso dall\'account %2$s (%3$s).</string> - <string name="soft_logout_signin_e2e_warning_notice">Accedi per recuperare le chiavi di cifratura memorizzate esclusivamente su questo dispositivo. Ti servono per leggere tutti i tuoi messaggi sicuri su qualsiasi dispositivo.</string> + <string name="soft_logout_signin_notice">L\'amministratore dell\'Home Server (%1$s) ti ha disconnesso dall\'account %2$s (%3$s).</string> + <string name="soft_logout_signin_e2e_warning_notice">Accedi per recuperare le chiavi crittografiche memorizzate esclusivamente su questo dispositivo. Sono indispensabili per poter leggere i tuoi messaggi criptati su altri dispositivi.</string> <string name="soft_logout_signin_submit">Accedi</string> <string name="soft_logout_signin_password_hint">Password</string> <string name="soft_logout_clear_data_title">Elimina i dati personali</string> - <string name="soft_logout_clear_data_notice">Attenzione: i tuoi dati personali (incluse chiavi di cifratura) sono ancora in questo dispositivo. + <string name="soft_logout_clear_data_notice">Attenzione: i tuoi dati personali (incluse le chiavi crittografiche) sono ancora su questo dispositivo. \n -\nEliminali se hai finito di usare questo dispositivo, o se vuoi accedere ad un altro account.</string> +\nEliminali se non userai più questo dispositivo o se vuoi usare un altro account.</string> <string name="soft_logout_clear_data_submit">Elimina tutti i dati</string> <string name="soft_logout_clear_data_dialog_title">Elimina i dati</string> - <string name="soft_logout_clear_data_dialog_content">Eliminare tutti i dati attualmente presenti in questo dispositivo\? -\nRiaccedi per avere accesso ai dati dell\'account e ai messaggi.</string> - <string name="soft_logout_clear_data_dialog_e2e_warning_content">Perderai l\'accesso ai messaggi sicuri a meno che non accedi per recuperare le tue chiavi di cifratura.</string> + <string name="soft_logout_clear_data_dialog_content">Eliminare tutti i dati attualmente presenti su questo dispositivo\? +\nAccedi nuovamente per avere accesso ai dati dell\'account e ai messaggi.</string> + <string name="soft_logout_clear_data_dialog_e2e_warning_content">Se non accedi per recuperare le tue chiavi crittografiche perderai l\'accesso ai messaggi criptati.</string> <string name="soft_logout_clear_data_dialog_submit">Elimina i dati</string> <string name="template_soft_logout_sso_not_same_user_error">La sessione attuale è per l\'utente %1$s e hai fornito le credenziali per l\'utente %2$s. Ciò non è supportato da ${app_name}. \nPrima elimina i dati, poi accedi di nuovo con un altro account.</string> - <string name="permalink_malformed">Il tuo collegamento matrix.to non è corretto</string> + <string name="permalink_malformed">Il tuo link matrix.to non è corretto</string> <string name="bug_report_error_too_short">La descrizione è troppo breve</string> - <string name="notification_initial_sync">Sync iniziale…</string> + <string name="notification_initial_sync">Sincronizzazione iniziale…</string> <string name="settings_show_devices_list">Vedi tutte le mie sessioni</string> <string name="settings_advanced_settings">Impostazioni avanzate</string> <string name="settings_developer_mode">Modalità sviluppatore</string> - <string name="settings_developer_mode_summary">La modalità sviluppatore abilita funzionalità nascoste e potrebbe anche rendere l\'app meno stabile. Solo per sviluppatori!</string> + <string name="settings_developer_mode_summary">La modalità sviluppatore abilita funzionalità nascoste che potrebberorendere l\'app instabile. Solo per sviluppatori!</string> <string name="settings_rageshake">Scuotimento</string> - <string name="settings_rageshake_detection_threshold">Soglia di rilevamento</string> - <string name="settings_rageshake_detection_threshold_summary">Scuoti il telefono per testare la soglia di rilevamento</string> + <string name="settings_rageshake_detection_threshold">Sensibilità scuotimento</string> + <string name="settings_rageshake_detection_threshold_summary">Agita il telefono per testare la sensibilità di scuotimento</string> <string name="rageshake_detected">Scuotimento rilevato!</string> <string name="settings">Impostazioni</string> <string name="devices_current_device">Sessione attuale</string> <string name="devices_other_devices">Altre sessioni</string> - <string name="autocomplete_limited_results">Mostrati solo i primi risultati, digita più lettere…</string> - <string name="settings_developer_mode_fail_fast_title">Crash facile</string> - <string name="template_settings_developer_mode_fail_fast_summary">${app_name} potrebbe crashare più spesso quando si verifica un errore imprevisto</string> - <string name="command_description_shrug">Antepone ¯\\_(ツ)_/¯ ad un messaggio testuale</string> - <string name="create_room_encryption_title">Attiva la cifratura</string> - <string name="create_room_encryption_description">Una volta attivata, la cifratura non può essere disattivata.</string> + <string name="autocomplete_limited_results">Si vedono solo i primi risultati: digita più lettere…</string> + <string name="settings_developer_mode_fail_fast_title">Fail-fast</string> + <string name="template_settings_developer_mode_fail_fast_summary">Se si verifica un errore imprevisto ${app_name} potrebbe crashare più spesso</string> + <string name="command_description_shrug">Antepone ¯\\_(ツ)_/¯ in un messaggio testuale</string> + <string name="create_room_encryption_title">Attiva la crittografia</string> + <string name="create_room_encryption_description">Una volta attivata, la crittografia non può più essere disattivata.</string> <string name="login_error_threepid_denied">Il dominio della tua email non è autorizzato alla registrazione in questo server</string> - <string name="verification_conclusion_warning">Accesso non fidato</string> + <string name="verification_conclusion_warning">Accesso non affidabile</string> <string name="verification_sas_match">Corrispondono</string> <string name="verification_sas_do_not_match">Non corrispondono</string> - <string name="verify_user_sas_emoji_help_text">Verifica questo utente confermando che le seguenti emoji appaiono sul suo schermo, nello stesso ordine.</string> - <string name="verify_user_sas_emoji_security_tip">Per la massima sicurezza, usate un\'altra via di comunicazione fidata o fatelo di persona.</string> - <string name="verification_green_shield">Cerca lo scudo verde per garantire la fiducia dell\'utente. Fidati di tutti gli utenti in una stanza per garantire che essa sia sicura.</string> + <string name="verify_user_sas_emoji_help_text">Verifica questo utente confermando che le seguenti emoji appaiono sul suo schermo nello stesso ordine.</string> + <string name="verify_user_sas_emoji_security_tip">Per avere la massima certezza effettuate l\'operazione tramite un mezzo di comunicazione già fidato oppure fatelo di persona.</string> + <string name="verification_green_shield">Il badge verde garantisce che l\'identità dell\'utente è verificata. Verifica tutti gli utenti in una stanza per assicurarti che sia sicura.</string> <string name="verification_conclusion_not_secure">Non sicuro</string> <string name="verification_conclusion_compromised">Uno dei seguenti potrebbe essere compromesso: \n -\n - Il tuo homeserver -\n - L\'homeserver al quale è connesso l\'utente che stai verificando +\n - Il tuo Home Server +\n - L\'Home Server al quale è connesso l\'utente che stai verificando \n - La tua connessione internet o quella dell\'altro utente \n - Il tuo dispositivo o quello dell\'altro utente</string> <string name="sent_a_video">Video.</string> @@ -1920,19 +1920,19 @@ <string name="verification_scan_notice">Scansiona il codice con il dispositivo dell\'altro utente per verificarvi a vicenda</string> <string name="verification_scan_their_code">Scansiona il suo codice</string> <string name="verification_scan_emoji_title">Impossibile scansionare</string> - <string name="verification_scan_emoji_subtitle">Se non siete di persona, confrontate invece le emoji</string> + <string name="verification_scan_emoji_subtitle">Se non siete fisicamente vicini potete fare la verifica con le emoji</string> <string name="verification_no_scan_emoji_title">Verifica confrontando le emoji</string> <string name="verify_by_emoji_title">Verifica via emoji</string> - <string name="verify_by_emoji_description">Se non potete scansionare il codice sopra, verificate confrontando una breve selezione univoca di emoji.</string> + <string name="verify_by_emoji_description">Se non puoi scansionare il codice qui sopra, potete fare la verifica confrontando una breve sequenza di emoji.</string> <string name="a13n_qr_code_description">Immagine codice QR</string> <string name="verification_verify_user">Verifica %s</string> <string name="verification_verified_user">%s verificato</string> <string name="verification_request_waiting_for">In attesa di %s…</string> - <string name="verification_request_alert_description">Per maggiore sicurezza, verifica %s controllando un codice univoco su entrambi i dispositivi. + <string name="verification_request_alert_description">Per maggiore sicurezza, verifica %s confrontando un codice univoco su entrambi i dispositivi. \n \nPer la massima sicurezza, fatelo di persona.</string> - <string name="room_profile_not_encrypted_subtitle">I messaggi in questa stanza non sono cifrati end-to-end.</string> - <string name="room_profile_encrypted_subtitle">I messaggi in questa stanza sono cifrati end-to-end. + <string name="room_profile_not_encrypted_subtitle">I messaggi in questa stanza non sono cifrati E2E.</string> + <string name="room_profile_encrypted_subtitle">I messaggi in questa stanza sono cifrati E2E. \n \nI tuoi messaggi sono protetti con lucchetti e solo tu e il destinatario avete le chiavi univoche per sbloccarli.</string> <string name="room_profile_section_security">Sicurezza</string> @@ -1945,7 +1945,7 @@ <item quantity="other">%1$d persone</item> </plurals> <string name="room_profile_section_more_uploads">File caricati</string> - <string name="room_profile_section_more_leave">Lascia stanza</string> + <string name="room_profile_section_more_leave">Esci dalla stanza</string> <string name="room_profile_leaving_room">Uscita dalla stanza…</string> <string name="room_member_power_level_admins">Amministratori</string> <string name="room_member_power_level_moderators">Moderatori</string> @@ -1959,32 +1959,32 @@ <string name="template_rendering_event_error_type_of_event_not_handled">${app_name} non gestisce eventi del tipo \'%1$s\'</string> <string name="template_rendering_event_error_type_of_message_not_handled">${app_name} non gestisce messaggi del tipo \'%1$s\'</string> <string name="template_rendering_event_error_exception">${app_name} ha riscontrato un errore con il rendering del contenuto dell\'evento con id \'%1$s\'</string> - <string name="unignore">Non ignorare</string> + <string name="unignore">Non ignorare più</string> <string name="verify_cannot_cross_sign">Questa sessione non riesce a condividere questa verifica con le tue altre sessioni. \nLa verifica sarà salvata in locale e condivisa in una versione futura dell\'app.</string> <string name="room_list_sharing_header_recent_rooms">Stanze recenti</string> <string name="room_list_sharing_header_other_rooms">Altre stanze</string> - <string name="command_description_rainbow">Invia il messaggio in questione colorato ad arcobaleno</string> - <string name="command_description_rainbow_emote">Invia l\'emoticon in questione colorata ad arcobaleno</string> + <string name="command_description_rainbow">Invia il messaggio coi colori dell\'arcobaleno</string> + <string name="command_description_rainbow_emote">Invia l\'emoticon coi colori dell\'arcobaleno</string> <string name="settings_category_timeline">Cronologia</string> <string name="settings_category_composer">Editor messaggi</string> - <string name="room_settings_enable_encryption">Attiva crittografia end-to-end…</string> - <string name="room_settings_enable_encryption_warning">Una volta attivata, la cifratura non può essere disattivata.</string> - <string name="room_settings_enable_encryption_dialog_title">Attivare la cifratura\?</string> - <string name="room_settings_enable_encryption_dialog_content">Una volta attivata, la cifratura di una stanza non può essere disattivata. I messaggi inviati in una stanza cifrata non possono essere visti dal server, solo dai partecipanti della stanza. L\'attivazione della cifratura può impedire il funzionamento di molti bot e bridge.</string> - <string name="room_settings_enable_encryption_dialog_submit">Attiva cifratura</string> - <string name="verification_request_notice">Per sicurezza, verifica %s controllando un codice univoco.</string> - <string name="verification_request_start_notice">Per sicurezza, fatelo di persona o usate un\'altra via di comunicazione.</string> - <string name="verification_emoji_notice">Confronta le emoji, assicurandoti che appaiono nello stesso ordine.</string> - <string name="verification_code_notice">Confronta il codice con quello mostrato nello schermo dell\'altro utente.</string> - <string name="verification_conclusion_ok_notice">I messaggi con questo utente sono cifrati end-to-end e non possono essere letti da terze parti.</string> - <string name="verification_conclusion_ok_self_notice">La tua nuova sessione ora è verificata. Ha accesso ai messaggi cifrati e gli altri utenti la vedranno come fidata.</string> + <string name="room_settings_enable_encryption">Attiva crittografia E2E…</string> + <string name="room_settings_enable_encryption_warning">Una volta attivata, la crittografia non può più essere disattivata.</string> + <string name="room_settings_enable_encryption_dialog_title">Attivare la crittografia\?</string> + <string name="room_settings_enable_encryption_dialog_content">Una volta attivata, la crittografia di una stanza non può più essere disattivata. I messaggi inviati in una stanza criptata non possono essere letti dal server ma solo dai partecipanti della stanza. L\'attivazione della crittografia può impedire il funzionamento di molti bot e bridge.</string> + <string name="room_settings_enable_encryption_dialog_submit">Attiva crittografia</string> + <string name="verification_request_notice">Per sicurezza, verifica %s confrontando un codice univoco.</string> + <string name="verification_request_start_notice">Per sicurezza, fatelo di persona o usate un\'altra via di comunicazione fidata.</string> + <string name="verification_emoji_notice">Confronta le emoji assicurandoti che siano nello stesso ordine.</string> + <string name="verification_code_notice">Confronta il codice con quello mostrato sullo schermo dell\'altro utente.</string> + <string name="verification_conclusion_ok_notice">I messaggi con questo utente sono cifrati E2E e non possono essere letti da altri.</string> + <string name="verification_conclusion_ok_self_notice">La tua nuova sessione ora è verificat ed ha accesso ai messaggi criptati. Gli altri utenti la vedranno come affidabile.</string> <string name="encryption_information_cross_signing_state">Firma incrociata</string> <string name="encryption_information_dg_xsigning_complete">La firma incrociata è attiva -\nChiavi private nel dispositivo.</string> +\nLe chiavi private sono nel dispositivo.</string> <string name="encryption_information_dg_xsigning_trusted">La firma incrociata è attiva \nLe chiavi sono fidate. -\nChiavi private non conosciute</string> +\nChiavi private non sono note</string> <string name="encryption_information_dg_xsigning_not_trusted">La firma incrociata è attiva. \nLe chiavi non sono fidate</string> <string name="encryption_information_dg_xsigning_disabled">La firma incrociata non è attiva</string> @@ -1994,34 +1994,34 @@ <string name="settings_active_sessions_signout_device">Disconnetti questa sessione</string> <string name="settings_failed_to_get_crypto_device_info">Nessuna informazione crittografica disponibile</string> <string name="settings_active_sessions_verified_device_desc">Questa sessione è fidata per i messaggi sicuri perché l\'hai verificata:</string> - <string name="settings_active_sessions_unverified_device_desc">Verifica questa sessione per segnarla come fidata e darle l\'accesso ai messaggi cifrati. Se non hai fatto l\'accesso a questa sessione il tuo account potrebbe essere compromesso:</string> + <string name="settings_active_sessions_unverified_device_desc">Verifica questa sessione per segnarla come affidabile e darle l\'accesso ai messaggi criptati. Se non hai effettuato l\'accesso a questa sessione il tuo account potrebbe essere compromesso:</string> <plurals name="settings_active_sessions_count"> <item quantity="one">%d sessione attiva</item> <item quantity="other">%d sessioni attive</item> </plurals> <string name="crosssigning_verify_this_session">Verifica questo accesso</string> <string name="crosssigning_other_user_not_trust">Gli altri utenti potrebbero non fidarsi</string> - <string name="complete_security">Completa la sicurezza</string> - <string name="verification_open_other_to_verify">Usa una sessione esistente per verificare questa, dandole l\'accesso ai messaggi cifrati.</string> + <string name="complete_security">Completa la messa in sicurezza</string> + <string name="verification_open_other_to_verify">Usa una sessione esistente per verificare questa, dandole l\'accesso ai messaggi criptati.</string> <string name="verification_profile_verify">Verifica</string> <string name="verification_profile_verified">Verificato</string> <string name="verification_profile_warning">Attenzione</string> - <string name="room_member_profile_failed_to_get_devices">Rilevazione sessioni fallita</string> + <string name="room_member_profile_failed_to_get_devices">Rilevamento sessioni fallito</string> <string name="room_member_profile_sessions_section_title">Sessioni</string> - <string name="trusted">Fidato</string> - <string name="not_trusted">Non fidato</string> - <string name="verification_profile_device_verified_because">Questa sessione è fidata per i messaggi sicuri perché %1$s (%2$s) l\'ha verificata:</string> + <string name="trusted">Affidabile</string> + <string name="not_trusted">Inaffidabile</string> + <string name="verification_profile_device_verified_because">Questa sessione è affidabile per i messaggi criptati perché %1$s (%2$s) l\'ha verificata:</string> <string name="verification_profile_device_new_signing">%1$s (%2$s) ha fatto l\'accesso con una nuova sessione:</string> - <string name="verification_profile_device_untrust_info">Finché questo utente non si fida di questa sessione, i messaggi inviati da e verso di essa sono etichettati con avvisi. In alternativa, puoi verificarlo manualmente.</string> + <string name="verification_profile_device_untrust_info">Finché questo utente non verificherà questa sessione, i messaggi inviati da e verso di essa saranno etichettati con un avviso. In alternativa, puoi verificarlo manualmente.</string> <string name="initialize_cross_signing">Inizializza la firma incrociata</string> <string name="reset_cross_signing">Reimposta chiavi</string> <string name="a11y_qr_code_for_verification">Codice QR</string> - <string name="qr_code_scanned_by_other_notice">Quasi fatto! %s sta mostrando lo stesso scudo\?</string> + <string name="qr_code_scanned_by_other_notice">Quasi fatto! %s sta mostrando lo stesso badge\?</string> <string name="qr_code_scanned_by_other_yes">Sì</string> <string name="qr_code_scanned_by_other_no">No</string> <string name="no_connectivity_to_the_server_indicator">La connessione al server è stata persa</string> <string name="login_signup_username_hint">Nome utente</string> - <string name="settings_dev_tools">Strumenti Svil</string> + <string name="settings_dev_tools">Strumenti per sviluppatori</string> <string name="settings_account_data">Dati account</string> <plurals name="poll_info"> <item quantity="one">%d voto</item> @@ -2033,11 +2033,11 @@ </plurals> <string name="poll_item_selected_aria">Opzione selezionata</string> <string name="command_description_poll">Crea un semplice sondaggio</string> - <string name="verification_cannot_access_other_session">Usa una password o chiave di recupero</string> + <string name="verification_cannot_access_other_session">Usa una Passphrase o un codice di recupero</string> <string name="verification_use_passphrase">Se non puoi accedere a una sessione esistente</string> <string name="new_signin">Nuovo accesso</string> <string name="enter_secret_storage_invalid">Impossibile trovare segreti nell\'archivio</string> - <string name="enter_secret_storage_passphrase">Inserisci la password dell\'archivio segreto</string> + <string name="enter_secret_storage_passphrase">Inserisci la Passphrase dell\'archivio segreto</string> <string name="enter_secret_storage_passphrase_warning">Attenzione:</string> <string name="enter_secret_storage_passphrase_warning_text">Dovresti accedere all\'archivio segreto solo da un dispositivo fidato</string> <string name="message_action_item_redact">Rimuovi…</string> @@ -2050,8 +2050,8 @@ <string name="delete_event_dialog_content">Sei sicuro di volere rimuovere (eliminare) questo evento\? Nota che se elimini il nome della stanza o cambi l\'argomento, ciò potrebbe annullare la modifica.</string> <string name="delete_event_dialog_reason_checkbox">Includi un motivo</string> <string name="delete_event_dialog_reason_hint">Motivo della revisione</string> - <string name="event_redacted_by_user_reason_with_reason">Evento eliminato da un utente, motivo: %1$s</string> - <string name="event_redacted_by_admin_reason_with_reason">Evento moderato da un admin della stanza, motivo: %1$s</string> + <string name="event_redacted_by_user_reason_with_reason">Evento eliminato dall\'utente, motivo: %1$s</string> + <string name="event_redacted_by_admin_reason_with_reason">Evento moderato dll\'Amministratore della stanza, motivo: %1$s</string> <string name="keys_backup_restore_success_title_already_up_to_date">Le chiavi sono già aggiornate!</string> <string name="template_login_default_session_public_name">${app_name} Android</string> <string name="settings_key_requests">Richieste di chiavi</string> @@ -2062,114 +2062,114 @@ <string name="verify_new_session_notice">Usa questa sessione per verificare quella nuova, dandole l\'accesso ai messaggi cifrati.</string> <string name="verify_new_session_was_not_me">Non ero io</string> <string name="verify_new_session_compromized">Il tuo account potrebbe essere compromesso</string> - <string name="verify_cancel_self_verification_from_untrusted">Se annulli, non potrai leggere i messaggi cifrati su questo dispositivo e altri utenti non si fideranno di esso</string> - <string name="verify_cancel_self_verification_from_trusted">Se annulli, non potrai leggere i messaggi cifrati sul tuo nuovo dispositivo e altri utenti non si fideranno di esso</string> + <string name="verify_cancel_self_verification_from_untrusted">Se annulli, non potrai leggere i messaggi criptati su questo dispositivo e altri utenti non lo considereranno affidabile</string> + <string name="verify_cancel_self_verification_from_trusted">Se annulli, non potrai leggere i messaggi criptati sul nuovo dispositivo e altri utenti non lo considereranno affidabile</string> <string name="verify_cancel_other">Non verificherai %1$s (%2$s) se annulli adesso. Ricomincia nel suo profilo utente.</string> <string name="verify_not_me_self_verification">Uno dei seguenti potrebbe essere compromesso: \n \n- La tua password -\n- Il tuo homeserver +\n- Il tuo Home Server \n- Questo dispositivo, o l\'altro \n- La connessione internet usata da uno dei dispositivi \n \nTi consigliamo di cambiare immediatamente la password e le chiavi di recupero nelle impostazioni.</string> - <string name="verify_cancelled_notice">Verifica i tuoi dispositivi dalle impostazioni.</string> + <string name="verify_cancelled_notice">Verifica i tuoi dispositivi nelle impostazioni.</string> <string name="verification_cancelled">Verifica annullata</string> - <string name="recovery_passphrase">Password di ripristino</string> - <string name="message_key">chiave dei messaggi</string> - <string name="account_password">password dell\'account</string> + <string name="recovery_passphrase">Passphrase di ripristino</string> + <string name="message_key">Chiave dei messaggi</string> + <string name="account_password">Password dell\'account</string> <string name="set_recovery_passphrase">Imposta una %s</string> <string name="generate_message_key">Genera una chiave dei messaggi</string> <string name="confirm_recovery_passphrase">Conferma la %s</string> <string name="enter_account_password">Inserisci la tua %s per continuare.</string> - <string name="bootstrap_info_text">Proteggi e sblocca i messaggi cifrati e fidati con una %s.</string> - <string name="bootstrap_info_confirm_text">Inserisci la tua %s di nuovo per confermarla.</string> - <string name="bootstrap_dont_reuse_pwd">Non riutilizzare la tua password dell\'account.</string> + <string name="bootstrap_info_text">Proteggi e sblocca i messaggi criptati e fidati con una %s.</string> + <string name="bootstrap_info_confirm_text">Inserisci di nuovo la tua %s per confermarla.</string> + <string name="bootstrap_dont_reuse_pwd">Non riutilizzare la password del tuo account.</string> <string name="bootstrap_loading_text">Potrebbe impiegarci qualche secondo, porta pazienza.</string> <string name="bootstrap_loading_title">Inizializzazione del ripristino.</string> <string name="your_recovery_key">La tua chiave di recupero</string> <string name="bootstrap_finish_title">Hai finito!</string> <string name="keep_it_safe">Tienila al sicuro</string> <string name="finish">Fine</string> - <string name="bootstrap_save_key_description">Usa questa %1$s come una rete di salvataggio in caso ti dimentichi la tua %2$s.</string> + <string name="bootstrap_save_key_description">Usa questa %1$s come una rete di salvataggio in caso dimenticassi la tua %2$s.</string> <string name="bootstrap_crosssigning_progress_initializing">Pubblicazione delle chiavi di identità create</string> - <string name="bootstrap_crosssigning_progress_pbkdf2">Generazione della chiave sicura dalla password</string> + <string name="bootstrap_crosssigning_progress_pbkdf2">Generazione di una chiave sicura basata sulla Passphrase</string> <string name="bootstrap_crosssigning_progress_default_key">Definizione della chiave predefinita SSSS</string> <string name="bootstrap_crosssigning_progress_save_msk">Sincronizzazione della chiave principale</string> <string name="bootstrap_crosssigning_progress_save_usk">Sincronizzazione della chiave utente</string> <string name="bootstrap_crosssigning_progress_save_ssk">Sincronizzazione della chiave di auto-firma</string> <string name="bootstrap_crosssigning_progress_key_backup">Inizializzazione del backup chiavi</string> - <string name="bootstrap_cross_signing_success">La tua %2$s e la %1$s sono ora impostate. + <string name="bootstrap_cross_signing_success">La tua %2$s e la %1$s ora sono impostate. \n -\nTienile al sicuro! Ti serviranno per sbloccare i messaggi cifrati e informazioni sicure se perdi tutte le tue sessioni attive.</string> +\nTienile al sicuro! Ti serviranno per poter sbloccare i messaggi criptati se perdessi tutte le tue sessioni attive.</string> <string name="bootstrap_crosssigning_print_it">Stampala e conservala in un posto sicuro</string> <string name="bootstrap_crosssigning_save_usb">Salvala in una penna USB o disco di backup</string> - <string name="bootstrap_crosssigning_save_cloud">Copiala nella tua archiviazione online</string> - <string name="auth_flow_not_supported">Non puoi farlo da mobile</string> - <string name="bootstrap_skip_text">Impostare una password dei messaggi ti consente di proteggere e sbloccare i messaggi cifrati e di fidarti. + <string name="bootstrap_crosssigning_save_cloud">Copiala sul Cloud</string> + <string name="auth_flow_not_supported">Non puoi farlo dallo smartphone</string> + <string name="bootstrap_skip_text">Impostare una Passphrase di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche. \n -\nSe non vuoi impostare una password dei messaggi, genera una chiave dei messaggi.</string> - <string name="bootstrap_skip_text_no_gen_key">Impostare una password di ripristino ti consente di proteggere e sbloccare i messaggi cifrati e di fidarti.</string> - <string name="encryption_enabled">Cifratura attiva</string> - <string name="encryption_enabled_tile_description">I messaggi in questa stanza sono cifrati end-to-end. Maggiori info e verifica degli utenti nel loro profilo.</string> - <string name="encryption_not_enabled">Cifratura non attiva</string> - <string name="encryption_unknown_algorithm_tile_description">La cifratura usata da questa stanza non è supportata</string> +\nSe non vuoi impostare una Password dei messaggi puoi generare una chiave dei messaggi.</string> + <string name="bootstrap_skip_text_no_gen_key">Impostare una Passphrase di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche.</string> + <string name="encryption_enabled">Crittografia attiva</string> + <string name="encryption_enabled_tile_description">I messaggi in questa stanza sono crittografati E2E. Maggiori info e verifica degli utenti nel loro profilo.</string> + <string name="encryption_not_enabled">Crittografia non attiva</string> + <string name="encryption_unknown_algorithm_tile_description">La crittografia usata in questa stanza non è supportata</string> <string name="room_created_summary_item">%s ha creato e configurato la stanza.</string> - <string name="qr_code_scanned_self_verif_notice">Quasi fatto! L\'altro dispositivo sta mostrando lo stesso scudo\?</string> + <string name="qr_code_scanned_self_verif_notice">Quasi fatto! L\'altro dispositivo sta mostrando lo stesso badge\?</string> <string name="qr_code_scanned_verif_waiting_notice">Quasi fatto! In attesa della conferma…</string> <string name="qr_code_scanned_verif_waiting">In attesa di %s…</string> <string name="error_failed_to_import_keys">Importazione chiavi fallita</string> <string name="settings_notification_configuration">Configurazione delle notifiche</string> <string name="settings_messages_at_room">Messaggi contenenti @room</string> - <string name="settings_messages_in_e2e_one_to_one">Messaggi cifrati in conversazioni private</string> - <string name="settings_messages_in_e2e_group_chat">Messaggi cifrati in chat di gruppo</string> + <string name="settings_messages_in_e2e_one_to_one">Messaggi criptati in conversazioni private</string> + <string name="settings_messages_in_e2e_group_chat">Messaggi criptati in chat di gruppo</string> <string name="settings_when_rooms_are_upgraded">Quando le stanze vengono aggiornate</string> - <string name="settings_troubleshoot_title">Risoluzione problemi</string> - <string name="settings_notification_advanced_summary">Imposta l\'importanza della notifica per evento</string> - <string name="command_description_plain">Invia un messaggio come testo semplice, senza interpretarlo come markdown</string> - <string name="auth_invalid_login_param_space_in_password">Nome utente e/o password errati. La password inserita inizia o termina con spazi, controllala.</string> + <string name="settings_troubleshoot_title">Risoluzione dei problemi</string> + <string name="settings_notification_advanced_summary">Personalizza importanza per evento</string> + <string name="command_description_plain">Invia in testo semplice senza interpretarlo come markdown</string> + <string name="auth_invalid_login_param_space_in_password">Nome utente e/o password errati. La password inserita inizia o termina con spazi. Controllala.</string> <string name="room_message_placeholder">Messaggio…</string> - <string name="upgrade_security">Aggiornamento cifratura disponibile</string> + <string name="upgrade_security">È disponibile un aggiornamento della crittografia</string> <string name="security_prompt_text">Verifica te stesso e gli altri per tenere al sicuro le chat</string> <string name="bootstrap_enter_recovery">Inserisci la tua %s per continuare</string> <string name="use_file">Usa file</string> - <string name="enter_backup_passphrase">Inserisci la %s</string> - <string name="backup_recovery_passphrase">Password di ripristino</string> + <string name="enter_backup_passphrase">Inserisci %s</string> + <string name="backup_recovery_passphrase">Passphrase di ripristino</string> <string name="bootstrap_invalid_recovery_key">Non è una chiave di ripristino valida</string> <string name="recovery_key_empty_error_message">Inserisci una chiave di ripristino</string> <string name="bootstrap_progress_checking_backup">Controllo della chiave di backup</string> <string name="bootstrap_progress_checking_backup_with_info">Controllo della chiave di backup (%s)</string> <string name="bootstrap_progress_compute_curve_key">Rilevazione chiave di curva ellittica</string> - <string name="bootstrap_progress_generating_ssss">Generazione chiave SSSS dalla password</string> - <string name="bootstrap_progress_generating_ssss_with_info">Generazione chiave SSSS dalla password (%s)</string> + <string name="bootstrap_progress_generating_ssss">Generazione chiave SSSS basata sulla Passphrase</string> + <string name="bootstrap_progress_generating_ssss_with_info">Generazione chiave SSSS basata sulla Passphrase (%s)</string> <string name="bootstrap_progress_generating_ssss_recovery">Generazione chiave SSSS dalla chiave di ripristino</string> <string name="bootstrap_progress_storing_in_sss">Memorizzazione segreto della chiave in SSSS</string> <string name="new_session_review_with_info">%1$s (%2$s)</string> - <string name="bootstrap_migration_enter_backup_password">Inserisci la password del backup chiavi per continuare.</string> + <string name="bootstrap_migration_enter_backup_password">Per continuare inserisci la Passphrase del backup delle chiavi.</string> <string name="bootstrap_migration_use_recovery_key">usare la chiave di ripristino del backup chiavi</string> - <string name="bootstrap_migration_with_passphrase_helper_with_link">Non conosci la password del backup chiavi, puoi %s.</string> + <string name="bootstrap_migration_with_passphrase_helper_with_link">Non conosci la Passphrase del backup delle chiavi, puoi %s.</string> <string name="bootstrap_migration_backup_recovery_key">Chiave di ripristino del backup chiavi</string> <string name="settings_security_prevent_screenshots_title">Impedisci la cattura di schermate dell\'app</string> - <string name="settings_security_prevent_screenshots_summary">Attivandolo verrà aggiunto FLAG_SECURE a tutte le Activity. Riavvia l\'applicazione per applicare le modifiche.</string> + <string name="settings_security_prevent_screenshots_summary">Attivandolo verrà aggiunto FLAG_SECURE a tutte le attività. Riavvia l\'applicazione per applicare le modifiche.</string> <string name="media_file_added_to_gallery">File multimediale aggiunto alla galleria</string> <string name="error_adding_media_file_to_gallery">Impossibile aggiungere il file multimediale alla galleria</string> <string name="change_password_summary">Imposta una nuova password dell\'account…</string> - <string name="template_use_other_session_content_description">Usa l\'ultima versione di ${app_name} sui tuoi altri dispositivi, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} per Android o un altro client Matrix che supporti la firma incrociata</string> + <string name="template_use_other_session_content_description">Usa l\'ultima versione di ${app_name} sui tuoi altri dispositivi, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} Android o un altro client Matrix che supporti la firma incrociata</string> <string name="template_app_desktop_web">${app_name} Web \n${app_name} Desktop</string> <string name="template_app_ios_android">${app_name} iOS \n${app_name} Android</string> <string name="or_other_mx_capabale_client">o un altro client Matrix che supporti la firma incrociata</string> - <string name="template_use_latest_app">Usa l\'ultimo ${app_name} sui tuoi altri dispositivi:</string> + <string name="template_use_latest_app">Usa l\'ultima versione di ${app_name} anche sui tuoi altri dispositivi:</string> <string name="command_description_discard_session">Forza l\'attuale sessione di gruppo in uscita in una stanza cifrata ad essere scartata</string> - <string name="command_description_discard_session_not_handled">Supportato solo nelle stanze cifrate</string> + <string name="command_description_discard_session_not_handled">Supportato solo nelle stanze criptate</string> <string name="enter_secret_storage_passphrase_or_key">Usa la tua %1$s o la %2$s per continuare.</string> <string name="use_recovery_key">Usa la chiave di recupero</string> - <string name="enter_secret_storage_input_key">Seleziona la tua chiave di recupero, oppure inseriscila a mano digitandola o incollando dagli appunti</string> + <string name="enter_secret_storage_input_key">Seleziona la tua chiave di recupero, oppure digitala a mano o copia/incollala</string> <string name="keys_backup_recovery_key_error_decrypt">Impossibile decifrare il backup con questa chiave di recupero: verifica di avere inserito la chiave giusta.</string> <string name="failed_to_access_secure_storage">Accesso all\'archivio sicuro fallito</string> - <string name="unencrypted">Non cifrato</string> - <string name="encrypted_unverified">Cifrato da un dispositivo non verificato</string> + <string name="unencrypted">Non criptato</string> + <string name="encrypted_unverified">Criptato da un dispositivo non verificato</string> <string name="review_logins">Controlla dove hai fatto l\'accesso</string> <string name="verify_other_sessions">Verifica tutte le tue sessioni per assicurarti che il tuo account e i messaggi siano protetti</string> <string name="verify_this_session">Verifica il nuovo accesso entrando nel tuo account: %1$s</string> @@ -2177,11 +2177,11 @@ <string name="crosssigning_verify_session">Verifica accesso</string> <string name="cross_signing_verify_by_emoji">Verifica interattivamente con emoji</string> <string name="confirm_your_identity">Conferma la tua identità verificando questo accesso da una delle tua altre sessioni, dandole l\'accesso ai messaggi cifrati.</string> - <string name="mark_as_verified">Segna come fidato</string> + <string name="mark_as_verified">Segna come affidabile</string> <string name="error_empty_field_choose_user_name">Scegli un nome utente.</string> <string name="error_empty_field_choose_password">Scegli una password.</string> - <string name="external_link_confirmation_title">Verifica questo collegamento</string> - <string name="external_link_confirmation_message">Il collegamento %1$s ti sta portando ad un altro sito: %2$s. + <string name="external_link_confirmation_title">Verifica questo link</string> + <string name="external_link_confirmation_message">Il link %1$s aprirà una nuova pagina web: %2$s. \n \nSei sicuro di volere continuare\?</string> <string name="create_room_dm_failure">Impossibile creare il messaggio diretto. Controlla gli utenti che vuoi invitare e riprova.</string> @@ -2201,39 +2201,39 @@ <string name="event_redacted">Messaggio eliminato</string> <string name="settings_show_redacted">Mostra messaggi rimossi</string> <string name="settings_show_redacted_summary">Mostra un segnaposto per i messaggi rimossi</string> - <string name="settings_discovery_confirm_mail_not_clicked">Ti abbiamo inviato un\'email di conferma a %s, prima controlla la tua posta e clicca sul link di conferma</string> + <string name="settings_discovery_confirm_mail_not_clicked">Ti abbiamo inviato un\'email di conferma a %s. Per proseguire controlla la tua posta e clicca sul link di conferma</string> <string name="settings_text_message_sent_wrong_code">Il codice di verifica non è corretto.</string> <string name="uploads_media_title">MEDIA</string> - <string name="uploads_media_no_result">Non ci sono file multimediali in questa stanza</string> + <string name="uploads_media_no_result">In questa stanza non ci sono file multimediali</string> <string name="uploads_files_title">FILE</string> <string name="uploads_files_subtitle">%1$s alle %2$s</string> - <string name="uploads_files_no_result">Non ci sono file in questa stanza</string> - <string name="login_connect_using_matrix_id_notice">In alternativa, se hai già un account e conosci il tuo identificativo e password di Matrix, puoi usare questo metodo:</string> - <string name="login_connect_using_matrix_id_submit">Accedi con il mio identificativo di Matrix</string> - <string name="login_signin_matrix_id_title">Accedi</string> - <string name="login_signin_matrix_id_notice">Se configuri un account in un homeserver, usa il tuo ID Matrix (es. @utente:dominio.com) e la password qua sotto.</string> - <string name="login_signin_matrix_id_hint">Identificativo utente</string> - <string name="login_signin_matrix_id_error_invalid_matrix_id">Non è un identificativo valido. Formato previsto: \'@utente:homeserver.org\'</string> - <string name="autodiscover_well_known_error">Impossibile trovare un homeserver valido. Controlla il tuo identificativo</string> + <string name="uploads_files_no_result">In questa stanza non ci sono file</string> + <string name="login_connect_using_matrix_id_notice">In alternativa, se hai già un account e conosci il tuo ID utente e password, puoi usare questo metodo:</string> + <string name="login_connect_using_matrix_id_submit">Accedi con il tuo ID utente</string> + <string name="login_signin_matrix_id_title">Accedi con il tuo ID utente</string> + <string name="login_signin_matrix_id_notice">Se hai un account su un Home Server, usa il tuo ID utente (es. @utente:homeserver.org) e la password qua sotto.</string> + <string name="login_signin_matrix_id_hint">ID utente</string> + <string name="login_signin_matrix_id_error_invalid_matrix_id">Non è un ID utente valido. Il formato corretto è del tipo: \'@utente:homeserver.org\'</string> + <string name="autodiscover_well_known_error">Impossibile trovare un Home Server valido. Controlla il tuo ID utente</string> <string name="no_connectivity_to_the_server_indicator_airplane">Modalità aereo attiva</string> <string name="choose_locale_current_locale_title">Lingua attuale</string> <string name="choose_locale_other_locales_title">Altre lingue disponibili</string> <string name="choose_locale_loading_locales">Caricamento lingue disponibili…</string> <string name="open_terms_of">Apri condizioni di %s</string> - <string name="disconnect_identity_server_dialog_content">Disconnettere dal server di identitià %s\?</string> - <string name="template_identity_server_error_outdated_identity_server">Questo server di identità è obsoleto. ${app_name} supporta solo API V2.</string> - <string name="identity_server_error_outdated_home_server">Questa operazione non è possibile. L\'homeserver è obsoleto.</string> - <string name="identity_server_error_no_identity_server_configured">Prima configura un server di identità.</string> - <string name="identity_server_error_terms_not_signed">Prima accetta le condizioni del server di identità nelle impostazioni.</string> - <string name="template_identity_server_error_bulk_sha256_not_supported">Per la tua privacy, ${app_name} supporta solo l\'invio di email utente e numeri di telefono in formato hash.</string> - <string name="identity_server_error_binding_error">L\'associamento è fallito.</string> - <string name="identity_server_error_no_current_binding_error">Non c\'è alcun associamento attuale con questo identificativo.</string> - <string name="identity_server_set_default_notice">Il tuo homeserver (%1$s) propone di usare %2$s come tuo server di identità</string> + <string name="disconnect_identity_server_dialog_content">Disconnettere dall\'Identity Server %s\?</string> + <string name="template_identity_server_error_outdated_identity_server">Questo Identity Server è obsoleto. ${app_name} supporta solo API V2.</string> + <string name="identity_server_error_outdated_home_server">Questa operazione non è possibile. L\'Home Server è obsoleto.</string> + <string name="identity_server_error_no_identity_server_configured">Prima configura un Identity Server.</string> + <string name="identity_server_error_terms_not_signed">Prima accetta le condizioni dell\'Identity Server nelle impostazioni.</string> + <string name="template_identity_server_error_bulk_sha256_not_supported">Per la tua privacy, ${app_name} supporta solo l\'invio di email e numeri di telefono degli utenti in modalità oscurata (hash).</string> + <string name="identity_server_error_binding_error">L\'associazione è fallita.</string> + <string name="identity_server_error_no_current_binding_error">Non c\'è alcuna associazione con questo identificativo.</string> + <string name="identity_server_set_default_notice">Il tuo Home Server (%1$s) propone di usare %2$s come tuo Identity Server</string> <string name="identity_server_set_default_submit">Usa %1$s</string> - <string name="identity_server_set_alternative_notice">In alternativa, puoi inserire un qualsiasi altro URL di server di identità</string> - <string name="identity_server_set_alternative_notice_no_default">Inserisci l\'URL di un server di identità</string> + <string name="identity_server_set_alternative_notice">In alternativa, puoi inserire l\'URL di un qualsiasi altro Identity Server</string> + <string name="identity_server_set_alternative_notice_no_default">Inserisci l\'URL di un Identity Server</string> <string name="identity_server_set_alternative_submit">Invia</string> - <string name="play_video">Riproduci</string> + <string name="play_video">Avvia</string> <string name="pause_video">Pausa</string> <string name="dismiss">Annulla</string> <string name="action_copy">Copia</string> @@ -2246,7 +2246,7 @@ <string name="sound_device_phone">Telefono</string> <string name="sound_device_speaker">Altoparlante</string> <string name="sound_device_headset">Cuffie</string> - <string name="sound_device_wireless_headset">Cuffie senza fili</string> + <string name="sound_device_wireless_headset">Cuffie wireless</string> <string name="call_switch_camera">Cambia fotocamera</string> <string name="call_camera_front">Frontale</string> <string name="call_camera_back">Posteriore</string> @@ -2282,14 +2282,14 @@ <string name="settings_secure_backup_setup">Imposta il Backup Sicuro</string> <string name="settings_secure_backup_reset">Reimposta il Backup Sicuro</string> <string name="settings_secure_backup_enter_to_setup">Configura in questo dispositivo</string> - <string name="settings_secure_backup_section_info">Proteggiti contro la perdita dell\'accesso ai messaggi e dati cifrati facendo un backup delle chiavi crittografiche sul tuo server.</string> + <string name="settings_secure_backup_section_info">Per evitare di non poter più accedere ai messaggi e dati criptati fai un backup delle chiavi crittografiche sul tuo server.</string> <string name="reset_secure_backup_title">Genera una nuova chiave di sicurezza o imposta una nuova frase di sicurezza per il backup esistente.</string> - <string name="reset_secure_backup_warning">Ciò sostituirà la tua attuale chiave o frase.</string> + <string name="reset_secure_backup_warning">Questo sostituirà la tua attuale chiave o frase.</string> <string name="disabled_integration_dialog_title">Le integrazioni sono disattivate</string> <string name="disabled_integration_dialog_content">Attiva \'Permetti integrazioni\' nelle impostazioni per continuare.</string> <plurals name="room_settings_banned_users_count"> - <item quantity="one">%d utente bandito</item> - <item quantity="other">%d utenti banditi</item> + <item quantity="one">%d utente bannato</item> + <item quantity="other">%d utenti bannati</item> </plurals> <string name="encryption_exported_successfully">Chiavi esportate correttamente</string> <string name="active_widget_view_action">VEDI</string> @@ -2298,20 +2298,20 @@ <string name="secure_backup_banner_setup_line1">Backup Sicuro</string> <string name="secure_backup_banner_setup_line2">Proteggiti dalla perdita dei messaggi e dati crittografati</string> <string name="secure_backup_setup">Imposta il Backup Sicuro</string> - <string name="labs_show_unread_notifications_as_tab">Aggiungi una scheda dedicata per le notifiche non lette nella schermata principale.</string> + <string name="labs_show_unread_notifications_as_tab">Aggiungi una scheda per le notifiche non lette nella schermata principale.</string> <string name="room_list_quick_actions_favorite_add">Aggiungi ai preferiti</string> <string name="room_list_quick_actions_favorite_remove">Rimuovi dai preferiti</string> <string name="notice_member_no_changes_by_you">Non hai fatto modifiche</string> - <string name="room_join_rules_public_by_you">Hai reso pubblica la stanza a chiunque conosca il link.</string> - <string name="room_join_rules_invite_by_you">Hai reso la stanza solo su invito.</string> + <string name="room_join_rules_public_by_you">Hai reso la stanza pubblica. Ora è raggiungibile da chiunque ne conosca l\'indirizzo.</string> + <string name="room_join_rules_invite_by_you">Hai reso la stanza accessibile solo su invito.</string> <string name="login_server_url_form_common_notice">Inserisci l\'indirizzo del server che vuoi usare</string> <string name="login_signin_matrix_id_password_notice">Se non sai la tua password, torna indietro per reimpostarla.</string> - <string name="send_a_sticker">Adesivo</string> - <string name="room_profile_section_admin">Azioni amministratore</string> - <string name="room_member_power_level_default_in">Predefinito in %1$s</string> - <string name="settings_hs_admin_e2e_disabled">L\'amministratore del server ha disattivato la crittografia end-to-end in modo predefinito nelle stanze private e nei messaggi diretti.</string> - <string name="bootstrap_info_text_2">Inserisci una frase di sicurezza che conosci solo tu, usata per proteggere i segreti nel tuo server.</string> - <string name="bootstrap_cancel_text">Se annulli ora, potresti perdere i messaggi e dati cifrati se perdi l\'accesso ai tuoi login. + <string name="send_a_sticker">Sticker</string> + <string name="room_profile_section_admin">Azioni Amministratore</string> + <string name="room_member_power_level_default_in">Standard in %1$s</string> + <string name="settings_hs_admin_e2e_disabled">L\'amministratore del server ha disattivato di default la crittografia E2E sia nelle stanze private che nei messaggi diretti.</string> + <string name="bootstrap_info_text_2">Inserisci una frase di sicurezza che conosci solo tu per proteggere i segreti nel tuo server.</string> + <string name="bootstrap_cancel_text">Se annulli ora, potresti perdere i messaggi e i dati criptati qualora perdessi l\'accesso ai tuoi login. \n \nPuoi anche configurare il backup sicuro e gestire le tue chiavi nelle impostazioni.</string> <string name="room_created_summary_item_by_you">Hai creato e configurato la stanza.</string> @@ -2327,31 +2327,31 @@ <string name="a11y_start_camera">Avvia la fotocamera</string> <string name="settings_setup_secure_backup">Imposta il Backup Sicuro</string> <string name="bottom_sheet_setup_secure_backup_title">Backup sicuro</string> - <string name="bottom_sheet_setup_secure_backup_subtitle">Proteggiti contro la perdita dell\'accesso ai messaggi e dati cifrati facendo un backup delle chiavi crittografiche sul tuo server.</string> + <string name="bottom_sheet_setup_secure_backup_subtitle">Per prevenire la perdita dell\'accesso ai messaggi e dati criptati fai un backup delle chiavi crittografiche sul tuo server.</string> <string name="bottom_sheet_setup_secure_backup_submit">Configura</string> <string name="bottom_sheet_setup_secure_backup_security_key_title">Usa una chiave di sicurezza</string> - <string name="bottom_sheet_setup_secure_backup_security_key_subtitle">Genera una chiave di sicurezza da conservare in qualche posto sicuro, come un gestore di password o una cassaforte.</string> + <string name="bottom_sheet_setup_secure_backup_security_key_subtitle">Genera una chiave di sicurezza da conservare in un posto sicuro, come un gestore di password o una cassaforte.</string> <string name="bottom_sheet_setup_secure_backup_security_phrase_title">Usa una frase di sicurezza</string> <string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">Inserisci una frase segreta che conosci solo tu e genera una chiave per backup.</string> <string name="bottom_sheet_save_your_recovery_key_title">Salva la chiave di sicurezza</string> - <string name="bottom_sheet_save_your_recovery_key_content">Conserva la chiave di sicurezza in qualche posto sicuro, come un gestore di password o una cassaforte.</string> + <string name="bottom_sheet_save_your_recovery_key_content">Conserva la chiave di sicurezza in un posto sicuro, come un password manager o una cassaforte.</string> <string name="set_a_security_phrase_title">Imposta una frase di sicurezza</string> <string name="set_a_security_phrase_notice">Inserisci una frase di sicurezza che conosci solo tu, usata per proteggere i segreti nel tuo server.</string> <string name="set_a_security_phrase_hint">Frase di sicurezza</string> - <string name="set_a_security_phrase_again_notice">Inserisci la frase di sicurezza di nuovo per confermarla.</string> + <string name="set_a_security_phrase_again_notice">Inserisci di nuovo la frase di sicurezza per confermarla.</string> <string name="save_your_security_key_title">Salva la chiave di sicurezza</string> - <string name="save_your_security_key_notice">Conserva la chiave di sicurezza in qualche posto sicuro, come un gestore di password o una cassaforte.</string> + <string name="save_your_security_key_notice">Conserva la chiave di sicurezza in un posto sicuro, come un gestore di password o una cassaforte.</string> <string name="room_settings_name_hint">Nome stanza</string> <string name="room_settings_topic_hint">Argomento</string> - <string name="room_settings_save_success">Hai cambiato le impostazioni della stanza correttamente</string> + <string name="room_settings_save_success">Hai cambiato correttamente le impostazioni della stanza</string> <string name="notice_crypto_unable_to_decrypt_final">Non puoi accedere a questo messaggio</string> <string name="notice_crypto_unable_to_decrypt_friendly">In attesa del messaggio, potrebbe volerci un po\'</string> - <string name="crypto_utd">Impossibile decifrare</string> - <string name="notice_crypto_unable_to_decrypt_friendly_desc">A causa della crittografia end-to-end, devi aspettare che arrivi un messaggio di qualcuno poiché non ti sono state inviate correttamente le chiavi di crittografia.</string> + <string name="crypto_utd">Impossibile decrittare</string> + <string name="notice_crypto_unable_to_decrypt_friendly_desc">Per via della crittografia E2E devi aspettare finchè non ti arriva un messaggio da qualcuno poiché al momento non ti sono ancora state inviate le chiavi di crittografia corrette.</string> <string name="crypto_error_withheld_blacklisted">Non puoi accedere a questo messaggio perché sei stato bloccato dal mittente</string> - <string name="crypto_error_withheld_unverified">Non puoi accedere a questo messaggio perché la tua sessione non è fidata dal mittente</string> + <string name="crypto_error_withheld_unverified">Non puoi accedere a questo messaggio perché il mittente non ha verificato la tua sessione</string> <string name="crypto_error_withheld_generic">Non puoi accedere a questo messaggio perché il mittente non ha inviato le chiavi di proposito</string> - <string name="notice_crypto_unable_to_decrypt_merged">In attesa della cronologia di crittografia</string> + <string name="notice_crypto_unable_to_decrypt_merged">In attesa che la cronologia venga crittografata</string> <string name="disclaimer_title">Riot ora si chiama Element!</string> <string name="disclaimer_content">Siamo entusiasti di annunciare che abbiamo cambiato nome! La tua app è aggiornata e hai fatto l\'accesso al tuo account.</string> <string name="disclaimer_negative_button">CAPITO</string> @@ -2362,11 +2362,11 @@ <string name="phone_book_title">Rubrica</string> <string name="search_in_my_contacts">Cerca nei miei contatti</string> <string name="loading_contact_book">Rilevazione dei tuoi contatti…</string> - <string name="empty_contact_book">Il tuo elenco di contatti è vuoto</string> + <string name="empty_contact_book">Il tuo elenco contatti è vuoto</string> <string name="contacts_book_title">Elenco contatti</string> - <string name="three_pid_revoke_invite_dialog_title">Revoca invito</string> + <string name="three_pid_revoke_invite_dialog_title">Revoca l\'invito</string> <string name="three_pid_revoke_invite_dialog_content">Revocare l\'invito a %1$s\?</string> - <string name="member_banned_by">Bandito da %1$s</string> + <string name="member_banned_by">Bannato da %1$s</string> <string name="failed_to_unban">Rimozione ban fallita</string> <string name="alert_push_are_disabled_title">Le notifiche push sono disattivate</string> <string name="alert_push_are_disabled_description">Verifica le tue impostazioni per attivare le notifiche push</string> @@ -2375,11 +2375,11 @@ <string name="create_pin_confirm_failure">Validazione PIN fallita, inseriscine uno nuovo.</string> <string name="auth_pin_title">Inserisci il tuo PIN</string> <string name="auth_pin_forgot">PIN dimenticato\?</string> - <string name="auth_pin_reset_title">Reimposta PIN</string> + <string name="auth_pin_reset_title">Reimposta il PIN</string> <string name="auth_pin_new_pin_action">Nuovo PIN</string> - <string name="auth_pin_reset_content">Per reimpostare il PIN, dovrai riaccedere e crearne uno nuovo.</string> - <string name="settings_security_pin_code_title">Attiva PIN</string> - <string name="settings_security_pin_code_summary">Se vuoi reimpostare il PIN, tocca \"PIN dimenticato\" per disconnetterti e reimpostarlo.</string> + <string name="auth_pin_reset_content">Per reimpostare il PIN dovrai riaccedere e crearne uno nuovo.</string> + <string name="settings_security_pin_code_title">Attiva il PIN</string> + <string name="settings_security_pin_code_summary">Se vuoi reimpostare il PIN tocca \"PIN dimenticato\" per disconnetterti e reimpostarlo.</string> <string name="auth_pin_confirm_to_disable_title">Conferma il PIN per disattivarlo</string> <string name="settings_call_show_confirmation_dialog_title">Impedisci chiamate accidentali</string> <string name="settings_call_show_confirmation_dialog_summary">Chiedi conferma prima di iniziare una chiamata</string> @@ -2409,7 +2409,7 @@ <item quantity="one">Codice sbagliato, %d tentativo rimasto</item> <item quantity="other">Codice sbagliato, %d tentativi rimasti</item> </plurals> - <string name="wrong_pin_message_last_remaining_attempt">Attenzione! Ultimo tentativo rimasto prima di venire disconnesso!</string> + <string name="wrong_pin_message_last_remaining_attempt">Attenzione! Ultimo tentativo rimasto prima di esser disconnesso!</string> <string name="too_many_pin_failures">Troppi errori, sei stato disconnesso</string> <string name="auth_msisdn_already_defined">Questo numero di telefono è già definito.</string> <string name="settings_phone_number_empty">Nessun numero di telefono aggiunto al tuo account</string> @@ -2423,7 +2423,7 @@ <string name="settings_text_message_sent_hint">Codice</string> <string name="login_msisdn_notice">Si prega di usare il formato internazionale (il numero deve iniziare con \'+\')</string> <string name="confirm_your_identity_quad_s">Conferma la tua identità verificando questo accesso, dandogli l\'accesso ai messaggi cifrati.</string> - <string name="error_opening_banned_room">Impossibile aprire una stanza dove sei stato bandito.</string> + <string name="error_opening_banned_room">È impossibile entrare in una stanza da cui sei stato bannato.</string> <string name="room_error_not_found">Impossibile trovare questa stanza. Assicurati che esista.</string> <string name="no_permissions_to_start_webrtc_call">Non hai il permesso di avviare una chiamata in questa stanza</string> <plurals name="seconds"> @@ -2435,40 +2435,40 @@ <string name="sent_a_poll">Sondaggio</string> <string name="sent_a_bot_buttons">Pulsanti bot</string> <string name="sent_a_reaction">Reagito con: %s</string> - <string name="sent_verification_conclusion">Conclusione della verifica</string> - <string name="delete_account_data_warning">Eliminare i dati dell\'account di tipo %1$s\? + <string name="sent_verification_conclusion">Verifica conclusa</string> + <string name="delete_account_data_warning">Vuoi eliminare i dati dell\'account di tipo %1$s\? \n -\nUsalo con attenzione, può avere comportamenti imprevisti.</string> - <string name="universal_link_malformed">Il collegamento non è corretto</string> +\nProcedi con cautela: quest\'azione può provocare comportamenti imprevisti.</string> + <string name="universal_link_malformed">Il link non è corretto</string> <string name="settings_security_pin_code_notifications_summary_off">Mostra solo il numero di messaggi non letti in una semplice notifica.</string> <string name="settings_security_pin_code_notifications_summary_on">Mostra dettagli come il nome delle stanze e il contenuto dei messaggi.</string> <string name="settings_security_pin_code_notifications_title">Mostra il contenuto nelle notifiche</string> <string name="template_settings_security_pin_code_use_biometrics_summary_off">Il codice PIN è l\'unico modo per sbloccare ${app_name}.</string> - <string name="settings_security_pin_code_use_biometrics_summary_on">Attiva la biometria specifica del dispositivo, come impronte e riconoscimento facciale.</string> + <string name="settings_security_pin_code_use_biometrics_summary_on">Attiva la biometria specifica del dispositivo, come le impronte digitali e il riconoscimento facciale.</string> <string name="settings_security_pin_code_use_biometrics_title">Attiva la biometria</string> <string name="settings_security_application_protection_screen_title">Configura protezione</string> <string name="settings_security_application_protection_summary">Proteggi l\'accesso usando un PIN e la biometria.</string> - <string name="settings_security_application_protection_title">Proteggi accesso</string> + <string name="settings_security_application_protection_title">Proteggi l\'accesso</string> <plurals name="secure_backup_reset_devices_you_can_verify"> <item quantity="one">Mostra il dispositivo con cui puoi verificare ora</item> <item quantity="other">Mostra %d dispositivi con cui puoi verificare ora</item> </plurals> <string name="secure_backup_reset_no_history">Ricomincerai senza cronologia, messaggi, dispositivi o utenti fidati</string> <string name="secure_backup_reset_if_you_reset_all">Se reimposti tutto</string> - <string name="secure_backup_reset_all_no_other_devices">Fallo solo se non hai altri dispositivi con cui verificare questo.</string> + <string name="secure_backup_reset_all_no_other_devices">Fallo solo se non hai altri dispositivi con cui fare la verifica.</string> <string name="secure_backup_reset_all">Reimposta tutto</string> - <string name="bad_passphrase_key_reset_all_action">Dimenticato o perso tutte le opzioni di recupero\? Reimposta tutto</string> + <string name="bad_passphrase_key_reset_all_action">Hai dimenticato o perso tutte le opzioni di ripristino\? Reimposta tutto</string> <string name="direct_room_created_summary_item_by_you">Sei entrato.</string> - <string name="direct_room_encryption_enabled_tile_description">I messaggi in questa stanza sono cifrati end-to-end.</string> + <string name="direct_room_encryption_enabled_tile_description">I messaggi in questa stanza sono crittografati E2E.</string> <string name="direct_room_profile_section_more_leave">Esci</string> <string name="direct_room_profile_section_more_settings">Impostazioni</string> - <string name="direct_room_profile_encrypted_subtitle">I messaggi qui sono cifrati end-to-end. -\n + <string name="direct_room_profile_encrypted_subtitle">I messaggi qui sono cifrati E2E. +\n \nI tuoi messaggi sono protetti con lucchetti e solo tu e il destinatario avete le chiavi univoche per sbloccarli.</string> - <string name="direct_room_profile_not_encrypted_subtitle">I messaggi qui non sono cifrati end-to-end.</string> - <string name="login_error_outdated_homeserver_warning_content">L\'homeserver gira su una versione vecchia. Chiedi al tuo amministratore di aggiornare. Puoi continuare, ma alcune funzionalità potrebbero non funzionare correttamente.</string> - <string name="direct_room_join_rules_invite_by_you">L\'hai resa solo su invito.</string> - <string name="direct_room_join_rules_invite">%1$s l\'ha resa solo su invito.</string> + <string name="direct_room_profile_not_encrypted_subtitle">I messaggi qui non sono cifrati E2E.</string> + <string name="login_error_outdated_homeserver_warning_content">Questo Home Server utilizza una versione obsoleta del software: chiedi all\'amministratore dell\'Home Server di aggiornarlo. Puoi connetterti, ma alcune funzionalità potrebbero non funzionare correttamente.</string> + <string name="direct_room_join_rules_invite_by_you">Hai reso la stanza accessibile solo su invito.</string> + <string name="direct_room_join_rules_invite">%1$s ha reso la stanza accessibile solo su invito.</string> <string name="settings_labs_show_complete_history_in_encrypted_room">Mostra la cronologia completa nelle stanze cifrate</string> <string name="notification_unread_notified_messages_and_invitation">%1$s e %2$s</string> <string name="notification_unread_notified_messages_in_room_and_invitation">%1$s in %2$s e %3$s</string> @@ -2489,15 +2489,15 @@ <string name="no_permissions_to_start_conf_call_in_direct_room">Non hai il permesso di avviare una chiamata di gruppo</string> <string name="reset">Reimposta</string> <string name="template_settings_security_pin_code_grace_period_summary_off">Il codice PIN è richiesto ogni volta che apri ${app_name}.</string> - <string name="template_settings_security_pin_code_grace_period_summary_on">È necessario il codice PIN dopo 2 minuti di inattività con ${app_name}.</string> + <string name="template_settings_security_pin_code_grace_period_summary_on">Il codice PIN è richiesto dopo 2 minuti di inattività su ${app_name}.</string> <string name="settings_security_pin_code_grace_period_title">Richiedi il PIN dopo 2 minuti</string> <string name="direct_room_created_summary_item">%s è entrato.</string> <string name="settings_troubleshoot_test_push_loop_waiting_for_push">L\'applicazione è in attesa del PUSH</string> - <string name="warning_unsaved_change_discard">Scarta modifiche</string> + <string name="warning_unsaved_change_discard">Scarta le modifiche</string> <string name="warning_unsaved_change">Ci sono modifiche non salvate. Scartare le modifiche\?</string> <string name="warning_room_not_created_yet">La stanza non è ancora stata creata. Annullare la creazione della stanza\?</string> - <string name="room_list_quick_actions_low_priority_remove">Rimuovi da priorità bassa</string> - <string name="room_list_quick_actions_low_priority_add">Aggiungi in priorità bassa</string> + <string name="room_list_quick_actions_low_priority_remove">Rimuovi da bassa priorità</string> + <string name="room_list_quick_actions_low_priority_add">Imposta come bassa priorità</string> <string name="rotate_and_crop_screen_title">Ruota e ritaglia</string> <string name="attachment_type_dialog_title">Aggiungi immagine da</string> <string name="create_room_settings_section">Impostazioni stanza</string> @@ -2506,52 +2506,52 @@ <string name="create_room_name_section">Nome stanza</string> <string name="settings_export_trail">Esporta revisione</string> <string name="room_member_open_or_create_dm">Messaggio diretto</string> - <string name="send_bug_report_include_key_share_history">Invia cronologia di richieste condivisione chiave</string> + <string name="send_bug_report_include_key_share_history">Invia cronologia delle richieste di condivisione chiave</string> <string name="no_more_results">Nessun altro risultato</string> - <string name="matrix_to_card_title">Collegamento Matrix</string> + <string name="matrix_to_card_title">Link Matrix</string> <string name="qr_code_not_scanned">Codice QR non scansionato!</string> <string name="invalid_qr_code_uri">Codice QR non valido (URI non valido)!</string> <string name="cannot_dm_self">Non puoi messaggiare te stesso!</string> <string name="share_by_text">Condividi via testo</string> <string name="phone_book_perform_lookup">Cerca contatti su Matrix</string> - <string name="room_settings_set_avatar">Imposta avatar</string> + <string name="room_settings_set_avatar">Imposta l\'immagine della stanza</string> <string name="identity_server_user_consent_not_provided">Non è stato fornito il consenso dell\'utente.</string> - <string name="user_code_info_text">Condividi questo codice con le persone consentendo la scansione per aggiungerti e iniziare a chattare.</string> + <string name="user_code_info_text">Condividi questo codice con i tuoi contatti! Basta una scansione per aggiungerti ed iniziare a chattare.</string> <string name="user_code_my_code">Il mio codice</string> <string name="user_code_share">Condividi il mio codice</string> <string name="user_code_scan">Scansiona un codice QR</string> <string name="not_a_valid_qr_code">Non è un codice QR Matrix valido</string> - <string name="template_invite_friends_rich_title">🔐️ Unisciti a me su ${app_name}</string> - <string name="template_invite_friends_text">Ehy, parliamo su ${app_name}: %s</string> + <string name="template_invite_friends_rich_title">🔐️ Puoi trovarmi su ${app_name}</string> + <string name="template_invite_friends_text">Ehy, chattiamo su ${app_name}: %s</string> <string name="invite_friends">Invita amici</string> <string name="add_people">Aggiungi persone</string> <string name="topic_prefix">"Argomento: "</string> <string name="add_a_topic_link_text">Aggiungi un argomento</string> - <string name="room_created_summary_no_topic_creation_text">%s per far sapere alle persone di cosa parla questa stanza.</string> - <string name="this_is_the_beginning_of_dm">Questo è l\'inizio della tua cronologia di messaggi diretti con %s.</string> - <string name="this_is_the_beginning_of_room_no_name">Questo è l\'inizio di questa conversazione.</string> - <string name="this_is_the_beginning_of_room">Questo è l\'inizio di %s.</string> - <string name="room_settings_enable_encryption_no_permission">Non hai il permesso di attivare la crittografia in questa stanza.</string> + <string name="room_created_summary_no_topic_creation_text">%s per far sapere alle persone l\'argomento di questa stanza.</string> + <string name="this_is_the_beginning_of_dm">Qui comincia la cronologia dei messaggi diretti con %s.</string> + <string name="this_is_the_beginning_of_room_no_name">Qui comincia questa conversazione.</string> + <string name="this_is_the_beginning_of_room">Qui comincia %s.</string> + <string name="room_settings_enable_encryption_no_permission">Non sei autorizzato ad attivare la crittografia in questa stanza.</string> <string name="create_room_in_progress">Creazione stanza…</string> <string name="create_room_alias_invalid">Alcuni caratteri non sono permessi</string> - <string name="create_room_alias_empty">Inserisci un indirizzo della stanza</string> + <string name="create_room_alias_empty">Attribuisci un indirizzo alla stanza</string> <string name="create_room_alias_already_in_use">Questo indirizzo è già in uso</string> <string name="create_room_alias_hint">Indirizzo stanza</string> - <string name="create_room_disable_federation_description">Dovresti attivarlo se questa stanza verrà usata solo per collaborazioni tra squadre interne nel tuo homeserver. Non può essere cambiato in seguito.</string> - <string name="create_room_disable_federation_title">Impedisci a chiunque non faccia parte di %s di entrare in questa stanza</string> + <string name="create_room_disable_federation_description">Dovresti attivarlo solo se vuoi che questa stanza sia usata solamente da utenti registrati sul tuo stesso Home Server. Questa impostazione non potrà essere cambiata in seguito.</string> + <string name="create_room_disable_federation_title">Impedisci a chiunque non sia registrato su %s di entrare in questa stanza</string> <string name="hide_advanced">Nascondi avanzate</string> <string name="show_advanced">Mostra avanzate</string> <string name="attachment_viewer_item_x_of_y">%1$d di %2$d</string> <string name="a11y_create_direct_message_by_qr_code">Crea una nuova conversazione diretta scansionando un codice QR</string> - <string name="a11y_create_direct_message_by_mxid">Crea una nuova conversazione diretta via ID Matrix</string> - <string name="identity_server_consent_dialog_content">Per trovare i contatti esistenti che conosci, accetti di inviare i dati di contatto (numeri di telefono e/o email) al server d\'identità configurato (%1$s)\? + <string name="a11y_create_direct_message_by_mxid">Crea una nuova conversazione diretta tramite ID utente</string> + <string name="identity_server_consent_dialog_content">Per trovare gli utenti che già conosci, accetti di inviare le informazioni di contatto (numeri di telefono e/o email) all\'Identity Server configurato (%1$s)\? \n -\nPer privacy, sarà inviato solo l\'hash dei dati da inviare.</string> +\nPer garantire la privacy, i dati verranno inviati in forma oscurata (hashing).</string> <string name="identity_server_consent_dialog_title">Invio di email e numeri di telefono</string> <string name="settings_discovery_consent_action_give_consent">Accetta</string> <string name="settings_discovery_consent_action_revoke">Revoca il mio consenso</string> - <string name="settings_discovery_consent_notice_off">Non hai accettato l\'invio di email e numeri di telefono a questo server d\'identità per trovare altri utenti dai tuoi contatti.</string> - <string name="settings_discovery_consent_notice_on">Hai accettato l\'invio di email e numeri di telefono a questo server d\'identità per trovare altri utenti dai tuoi contatti.</string> + <string name="settings_discovery_consent_notice_off">Non hai acconsentito ad inviare email e numeri di telefono a questo Identity Server per poter rintracciare altri utenti tra i tuoi contatti.</string> + <string name="settings_discovery_consent_notice_on">Hai acconsentito ad inviare email e numeri di telefono a questo Identity Server per poter rintracciare altri utenti tra i tuoi contatti.</string> <string name="settings_discovery_consent_title">Invia email e numeri di telefono</string> <string name="direct_room_user_list_suggestions_title">Suggerimenti</string> <string name="direct_room_user_list_contacts_title">Contatti</string> @@ -2560,26 +2560,26 @@ <string name="qr_code">Codice QR</string> <string name="add_by_qr_code">Aggiungi da codice QR</string> <string name="user_directory_search_hint">Cerca per nome o ID</string> - <string name="permissions_denied_qr_code">Per scansionare un codice QR, devi permettere l\'accesso alla fotocamera.</string> - <string name="permissions_denied_add_contact">Permetti l\'autorizzazione per l\'accesso ai contatti.</string> + <string name="permissions_denied_qr_code">Per scansionare un codice QR devi permettere l\'accesso alla fotocamera.</string> + <string name="permissions_denied_add_contact">Autorizza ad accedere ai tuoi contatti.</string> <string name="start_chatting">Inizia a chattare</string> <string name="settings_security_pin_code_change_pin_summary">Cambia il tuo PIN attuale</string> <string name="settings_security_pin_code_change_pin_title">Cambia PIN</string> <string name="room_preview_no_preview_join">Anteprima della stanza non disponibile. Vuoi entrare\?</string> <string name="room_preview_not_found">Questa stanza non è accessibile al momento. \nRiprova più tardi, o chiedi ad un admin della stanza di controllare se ne hai l\'accesso.</string> - <string name="room_alias_publish_to_directory_error">Impossibile rilevare l\'attuale visibilità dell\'elenco di stanze (%1$s).</string> - <string name="room_alias_publish_to_directory">Pubblicare questa stanza nell\'elenco pubblico delle stanze di %1$s\?</string> + <string name="room_alias_publish_to_directory_error">Impossibile rilevare l\'attuale visibilità dell\'elenco stanze (%1$s).</string> + <string name="room_alias_publish_to_directory">Inserire questa stanza nell\'elenco delle stanze pubbliche di %1$s\?</string> <string name="room_alias_action_unpublish">Revoca questo indirizzo</string> <string name="room_alias_action_publish">Pubblica questo indirizzo</string> <string name="room_alias_local_address_add">Aggiungi un indirizzo locale</string> <string name="room_alias_local_address_empty">Questa stanza non ha indirizzi locali</string> - <string name="room_alias_local_address_subtitle">Imposta gli indirizzi per la stanza affinché gli utenti la trovino attraverso il tuo homeserver (%1$s)</string> + <string name="room_alias_local_address_subtitle">Imposta gli indirizzi per la stanza affinché gli utenti la trovino attraverso il tuo Homeserver (%1$s)</string> <string name="room_alias_local_address_title">Indirizzi locali</string> - <string name="room_alias_address_hint">Nuovo indirizzo pubblicato (es. #alias:server)</string> - <string name="room_alias_address_empty">Nessun altro indirizzo ancora pubblicato.</string> - <string name="room_alias_address_empty_can_add">Nessun altro indirizzo ancora pubblicato, aggiungine uno sotto.</string> - <string name="room_alias_publish">Pubblicare questa stanza nell\'elenco pubblico delle stanze di %1$s\?</string> + <string name="room_alias_address_hint">Nuovo indirizzo pubblico (es. #alias:server)</string> + <string name="room_alias_address_empty">Nessun altro indirizzo pubblico finora.</string> + <string name="room_alias_address_empty_can_add">Nessun altro indirizzo pubblico finora. Aggiungine uno sotto.</string> + <string name="room_alias_publish">Inserire questa stanza nell\'elenco delle stanze pubbliche di %1$s\?</string> <string name="room_alias_delete_confirmation">Eliminare l\'indirizzo \"%1$s\"\?</string> <string name="room_alias_unpublish_confirmation">Revocare la pubblicazione dell\'indirizzo \"%1$s\"\?</string> <string name="room_alias_published_alias_add_manually_submit">Pubblica</string> @@ -2587,21 +2587,21 @@ <string name="room_alias_published_other">Altri indirizzi pubblicati:</string> <string name="room_alias_main_address_hint">Indirizzo principale</string> <string name="room_alias_published_alias_main">Questo è l\'indirizzo principale</string> - <string name="room_alias_published_alias_subtitle">Gli indirizzi pubblicati possono essere usati da chiunque su qualsiasi server per entrare nella stanza. Per pubblicare un indirizzo, deve essere prima impostato come indirizzo locale.</string> - <string name="room_alias_published_alias_title">Indirizzi pubblicati</string> + <string name="room_alias_published_alias_subtitle">Gli indirizzi pubblici possono essere usati da chiunque su qualsiasi server per entrare nella stanza. Per poter impostare un indirizzo pubblico prima è necessario aver dato alla stanza un indirizzo locale.</string> + <string name="room_alias_published_alias_title">Indirizzi pubblici</string> <string name="room_alias_title">Indirizzi stanza</string> - <string name="room_settings_alias_subtitle">Vedi e gestisci gli indirizzi di questa stanza e la sua visibilità nell\'elenco delle stanze.</string> + <string name="room_settings_alias_subtitle">Vedi e gestisci gli indirizzi di questa stanza e la sua visibilità nell\'elenco delle stanze pubbliche.</string> <string name="room_settings_alias_title">Indirizzi stanza</string> <string name="room_settings_room_access_title">Accesso alla stanza</string> - <string name="room_settings_room_read_history_dialog_subtitle">La leggibilità della cronologia sarà modificata solo per i futuri messaggi di questa stanza. La visibilità dei messaggi esistenti rimarrà invariata.</string> + <string name="room_settings_room_read_history_dialog_subtitle">La visibilità della cronologia sarà modificata solo per i messaggi futuri. La visibilità dei messaggi esistenti rimarrà invariata.</string> <string name="action_unpublish">Revoca pubblicazione</string> <string name="action_add">Aggiungi</string> <string name="default_message_emote_snow">invia neve ❄️</string> <string name="default_message_emote_confetti">invia coriandoli 🎉</string> - <string name="command_snow">Invia il messaggio in questione con neve</string> - <string name="command_confetti">Invia il messaggio in questione con coriandoli</string> + <string name="command_snow">Invia il messaggio con neve</string> + <string name="command_confetti">Invia il messaggio con coriandoli</string> <string name="login_clear_homeserver_history">Svuota cronologia</string> - <string name="login_social_sso">single sign-on</string> + <string name="login_social_sso">Autenticazione unica (SSO)</string> <string name="login_social_signin_with">Accedi con %s</string> <string name="login_social_signup_with">Registrati con %s</string> <string name="login_social_continue_with">Continua con %s</string> @@ -2628,16 +2628,16 @@ <string name="room_permissions_invite_users">Invita utenti</string> <string name="room_permissions_send_messages">Invia messaggi</string> <string name="room_permissions_default_role">Ruolo predefinito</string> - <string name="room_permissions_notice_read_only">Non hai l\'autorizzazione di aggiornare i ruoli necessari per cambiare varie parti della stanza</string> + <string name="room_permissions_notice_read_only">Non hai l\'autorizzazione ad aggiornare i ruoli necessari per cambiare diverse parti della stanza</string> <string name="room_permissions_notice">Seleziona i ruoli necessari per cambiare varie parti della stanza</string> <string name="room_permissions_title">Autorizzazioni</string> <string name="room_settings_permissions_subtitle">Vedi e aggiorna i ruoli necessari per cambiare varie parti della stanza.</string> <string name="room_settings_permissions_title">Autorizzazioni stanza</string> - <string name="room_participants_leave_private_warning">Questa stanza non è pubblica. Non potrai rientrare senza un invito.</string> + <string name="room_participants_leave_private_warning">Questa non è una stanza pubblica. Senza un invito non potrai rientrare.</string> <string name="system_theme">Predefinito di sistema</string> <string name="authentication_error">Autenticazione fallita</string> - <string name="template_re_authentication_default_confirm_text">${app_name} richiede di reinserire le credenziali per eseguire questa azione.</string> - <string name="re_authentication_activity_title">Necessario riautenticarsi</string> + <string name="template_re_authentication_default_confirm_text">${app_name} chiede siano reinserite le credenziali per eseguire questa azione.</string> + <string name="re_authentication_activity_title">È necessario riautenticarsi</string> <string name="call_transfer_users_tab_title">Utenti</string> <string name="call_transfer_failure">Si è verificato un errore trasferendo la chiamata</string> <string name="call_transfer_title">Trasferisci</string> @@ -2658,7 +2658,7 @@ <string name="call_tile_ended">Questa chiamata è terminata</string> <string name="call_tile_other_declined">%1$s ha rifiutato questa chiamata</string> <string name="call_tile_you_declined">Hai rifiutato questa chiamata %1$s</string> - <string name="call_tile_in_call">Sei attualmente in questa chiamata</string> + <string name="call_tile_in_call">Stai partecipando a questa chiamata</string> <string name="call_tile_other_started_call">%1$s ha iniziato una chiamata</string> <string name="call_tile_you_started_call">Hai iniziato una chiamata</string> <string name="failed_to_initialize_cross_signing">Impostazione della firma incrociata fallita</string> @@ -2690,8 +2690,8 @@ <string name="dev_tools_state_event">Eventi di stato</string> <string name="dev_tools_send_state_event">Invia evento di stato</string> <string name="dev_tools_send_custom_event">Invia evento personalizzato</string> - <string name="dev_tools_explore_room_state">Esplora stato stanza</string> - <string name="dev_tools_menu_name">Strumenti Svil</string> + <string name="dev_tools_explore_room_state">Esplora lo stato della stanza</string> + <string name="dev_tools_menu_name">Strumenti per Sviluppatori</string> <string name="a11y_view_read_receipts">Vedi le conferme di lettura</string> <string name="a11y_rule_notify_off">Non notificare</string> <string name="a11y_rule_notify_silent">Notifica senza suono</string> @@ -2707,15 +2707,15 @@ <string name="a11y_video">Video</string> <string name="a11y_unsent_draft">Questa stanza ha una bozza non inviata</string> <string name="a11y_error_some_message_not_sent">Alcuni messaggi non sono stati inviati</string> - <string name="a11y_delete_avatar">Elimina avatar</string> - <string name="a11y_change_avatar">Cambia avatar</string> + <string name="a11y_delete_avatar">Elimina immagine profilo</string> + <string name="a11y_change_avatar">Cambia immagine profilo</string> <string name="a11y_image">Immagine</string> <string name="a11y_import_key_from_file">Importa chiave da file</string> <string name="a11y_open_widget">Apri i widget</string> <string name="a11y_screenshot">Schermata</string> <plurals name="entries"> - <item quantity="one">%d elemento</item> - <item quantity="other">%d elementi</item> + <item quantity="one">%d inserimento</item> + <item quantity="other">%d inserimenti</item> </plurals> <string name="settings_server_upload_size_unknown">Il limite è sconosciuto.</string> <string name="settings_server_upload_size_content">Il tuo homeserver accetta allegati (file, multimedia, ecc.) di una dimensione fino a %s.</string> @@ -2730,97 +2730,97 @@ <string name="settings_category_room_directory">Elenco delle stanze</string> <string name="dialog_edit_hint">Nuovo valore</string> <string name="action_switch">Cambia</string> - <string name="initial_sync_start_downloading">Sinc. iniziale: -\nScaricamento dati…</string> - <string name="initial_sync_start_server_computing">Sinc. iniziale: + <string name="initial_sync_start_downloading">Sincronizzazione iniziale: +\nDownload dei dati…</string> + <string name="initial_sync_start_server_computing">Sincronizzazione iniziale: \nIn attesa di risposta dal server…</string> <string name="event_status_sent_message">Messaggio inviato</string> <string name="labs_use_restricted_join_rule_desc">L\'avviso richiede il supporto del server e una versione di stanza sperimentale</string> <string name="labs_use_restricted_join_rule">Spazio sperimentale - stanza riservata.</string> - <string name="you_are_invited">Sei invitato</string> - <string name="spaces_beta_welcome_to_spaces_desc">Gli spazi sono modi di raggruppare stanze e persone per lavoro, divertimento o solo per te stesso.</string> - <string name="spaces_beta_welcome_to_spaces">Benvenuti negli spazi!</string> - <string name="space_add_existing_rooms">Aggiungi stanze e spazi esistenti</string> - <string name="space_leave_prompt_msg">Vuoi veramente uscire dallo spazio\?</string> - <string name="leave_space">Esci dallo spazio</string> + <string name="you_are_invited">Sei stato invitato</string> + <string name="spaces_beta_welcome_to_spaces_desc">Gli Spazi sono un nuovo modo per raggruppare stanze e contatti.</string> + <string name="spaces_beta_welcome_to_spaces">Benvenuto negli Spazi!</string> + <string name="space_add_existing_rooms">Aggiungi stanze e Spazi esistenti</string> + <string name="space_leave_prompt_msg">Vuoi veramente uscire dallo Spazio\?</string> + <string name="leave_space">Esci dallo Spazio</string> <string name="space_add_child_title">Aggiungi stanze</string> - <string name="space_explore_activity_title">Esplora stanze</string> + <string name="space_explore_activity_title">Guarda le stanze</string> <plurals name="space_people_you_know"> <item quantity="one">%d persona che conosci si è già unita</item> <item quantity="other">%d persone che conosci si sono già unite</item> </plurals> <string name="suggested_rooms_pills_on_empty_header">Benvenuti a %1$s, %2$s.</string> - <string name="suggested_rooms_pills_on_empty_text">Non sei ancora in nessuna stanza. Sotto trovi alcune stanze consigliate, ma puoi vederne altre con il pulsante verde in fondo a destra.</string> - <string name="room_alias_preview_not_found">Questo alias non è accessibile al momento. -\nRiprova più tardi, o chiedi ad un amministratore della stanza di controllare se hai l\'accesso.</string> + <string name="suggested_rooms_pills_on_empty_text">Non sei ancora entrato in nessuna stanza. Sotto ne trovi alcune consigliate ma puoi trovarne altre con il pulsante verde in fondo a destra.</string> + <string name="room_alias_preview_not_found">Al momento questo alias non è accessibile. +\nRiprova più tardi, o chiedi a un amministratore della stanza di controllare se hai l\'accesso.</string> <string name="join_anyway">Unisciti comunque</string> - <string name="join_space">Unisciti ad uno spazio</string> - <string name="create_space">Crea spazio</string> - <string name="skip_for_now">Salta per adesso</string> - <string name="share_space_link_message">Unisciti al mio spazio %1$s %2$s</string> + <string name="join_space">Unisciti a uno Spazio</string> + <string name="create_space">Crea Spazio</string> + <string name="skip_for_now">Per il momento, salta</string> + <string name="share_space_link_message">Unisciti al mio Spazio %1$s %2$s</string> <string name="invite_just_to_this_room_desc">Non faranno parte di %s</string> <string name="invite_just_to_this_room">Solo in questa stanza</string> <string name="invite_to_space_with_name_desc">Potranno esplorare %s</string> <string name="invite_to_space_with_name">Invita in %s</string> - <string name="invite_by_link">Condividi collegamento</string> + <string name="invite_by_link">Condividi link</string> <string name="invite_by_mxid">Invita per nome utente</string> <string name="invite_by_email">Invita per email</string> - <string name="invite_people_to_your_space_desc">Ci sei solo tu al momento. %s sarà ancora meglio con gli altri.</string> + <string name="invite_people_to_your_space_desc">Al momento ci sei solo tu. Con più persone %s sarà ancora migliore.</string> <string name="invite_people_menu">Invita persone</string> - <string name="invite_people_to_your_space">Invita persone nel tuo spazio</string> + <string name="invite_people_to_your_space">Invita persone nel tuo Spazio</string> <string name="create_space_topic_hint">Descrizione</string> - <string name="create_spaces_loading_message">Creazione spazio…</string> + <string name="create_spaces_loading_message">Creazione Spazio…</string> <string name="create_spaces_default_public_random_room_name">Casuale</string> <string name="create_spaces_default_public_room_name">Generale</string> - <string name="create_spaces_room_private_header_desc">Creiamo una stanza per ognuno di esse. Puoi aggiungerne altre in seguito, incluse quelle già esistenti.</string> - <string name="create_spaces_room_private_header">Su quali cose stai lavorando\?</string> + <string name="create_spaces_room_private_header_desc">Creiamo una stanza per ognuno di essi. Potrai sempre aggiungerne altre a quelle già esistenti.</string> + <string name="create_spaces_room_private_header">A cosa stai lavorando\?</string> <string name="create_spaces_room_public_header_desc">Creeremo delle stanze per ognuno di essi. Puoi aggiungerne altre in seguito.</string> <string name="create_spaces_room_public_header">Di quali argomenti vorresti parlare in %s\?</string> <string name="create_space_error_empty_field_space_name">Dagli un nome per continuare.</string> - <string name="create_spaces_details_private_header">Aggiungi alcuni dettagli per aiutare le persone ad identificarlo. Puoi modificarli in qualsiasi momento.</string> - <string name="create_spaces_details_public_header">Aggiungi alcuni dettagli per renderlo più distinguibile. Puoi modificarli in qualsiasi momento.</string> - <string name="activity_create_space_title">Crea uno spazio</string> - <string name="space_type_private_desc">Solo su invito, consigliato per te o i team</string> + <string name="create_spaces_details_private_header">Aggiungi alcuni dettagli per aiutare le persone ad identificarlo. Potrai modificarli in qualsiasi momento.</string> + <string name="create_spaces_details_public_header">Aggiungi alcuni dettagli per renderlo più distinguibile. Potrai modificarli in qualsiasi momento.</string> + <string name="activity_create_space_title">Crea uno Spazio</string> + <string name="space_type_private_desc">Solo su invito (consigliato per te e per i team di lavoro)</string> <string name="space_type_private">Privato</string> - <string name="space_type_public_desc">Aperto a tutti, consigliato per le comunità</string> + <string name="space_type_public_desc">Aperto a tutti (consigliato per le comunità pubbliche)</string> <string name="space_type_public">Pubblico</string> - <string name="create_spaces_private_teammates">Uno spazio privato per te e i tuoi compagni</string> + <string name="create_spaces_private_teammates">Uno Spazio privato per te e i tuoi compagni</string> <string name="create_spaces_me_and_teammates">Io e i miei compagni</string> - <string name="create_spaces_organise_rooms">Uno spazio privato per organizzare le tue stanze</string> + <string name="create_spaces_organise_rooms">Uno Spazio privato per organizzare le tue stanze</string> <string name="create_spaces_just_me">Solo io</string> <string name="create_spaces_make_sure_access">Assicurati che le persone giuste abbiano accesso a %s. Puoi cambiarlo in seguito.</string> <string name="create_spaces_who_are_you_working_with">Con chi stai lavorando\?</string> - <string name="create_spaces_join_info_help">Per unirti ad uno spazio esistente, ti serve un invito.</string> + <string name="create_spaces_join_info_help">Per unirti ad uno Spazio già esistente, ti serve un invito.</string> <string name="create_spaces_you_can_change_later">Puoi cambiarlo in seguito</string> - <string name="create_spaces_choose_type_label">Che tipo di spazio vuoi creare\?</string> - <string name="create_spaces_type_header">Gli spazi sono un nuovo modo di raggruppare stanze e persone</string> - <string name="your_private_space">Il tuo spazio privato</string> - <string name="your_public_space">Il tuo spazio pubblico</string> - <string name="add_space">Aggiungi spazio</string> - <string name="command_description_leave_room">Esci dalla stanza con un dato ID (o dalla stanza attuale se vuoto)</string> - <string name="command_description_join_space">Unisciti allo spazio con un dato ID</string> - <string name="command_description_create_space">Crea uno spazio</string> - <string name="a11y_unchecked">Non controllato</string> + <string name="create_spaces_choose_type_label">Che tipo di Spazio vuoi creare\?</string> + <string name="create_spaces_type_header">Gli Spazi sono un nuovo modo di raggruppare stanze e contatti</string> + <string name="your_private_space">Il tuo Spazio privato</string> + <string name="your_public_space">Il tuo Spazio pubblico</string> + <string name="add_space">Aggiungi Spazio</string> + <string name="command_description_leave_room">Esci dalla stanza con un ID (o dalla stanza attuale se vuota)</string> + <string name="command_description_join_space">Unisciti allo Spazio con un ID</string> + <string name="command_description_create_space">Crea uno Spazio</string> + <string name="a11y_unchecked">Deselezionato</string> <string name="search_hint_room_name">Cerca nome</string> - <string name="room_settings_room_access_restricted_description">Chiunque in uno spazio con questa stanza può trovarla ed entrarci. Solo gli amministratori della stanza possono aggiungerla ad uno spazio.</string> + <string name="room_settings_room_access_restricted_description">Chiunque in uno Spazio con questa stanza può trovarla ed entrarci. Solo gli amministratori della stanza possono aggiungerla ad uno Spazio.</string> <string name="room_settings_room_access_restricted_title">Spazi</string> <string name="room_settings_room_access_public_description">Chiunque può trovarla ed entrare</string> <string name="room_settings_room_access_public_title">Pubblica</string> <string name="room_settings_room_access_private_description">Solo le persone invitate possono trovarla ed entrare</string> <string name="room_settings_room_access_private_title">Privata</string> <string name="room_settings_room_access_entry_unknown">Impostazione di accesso sconosciuta (%s)</string> - <string name="room_settings_room_access_entry_knock">Chiunque può bussare alla porta, poi i membri possono accettare o rifiutare</string> + <string name="room_settings_room_access_entry_knock">Chiunque può chiedere di poter entrare, poi i membri decidono se accettare o rifiutare</string> <string name="room_settings_guest_access_title">Permetti l\'ingresso agli ospiti</string> <string name="spaces_header">Spazi</string> <string name="spaces_invited_header">Inviti</string> <string name="suggested_header">Stanze suggerite</string> - <string name="space_manage_rooms_and_spaces">Gestisci stanze e spazi</string> + <string name="space_manage_rooms_and_spaces">Gestisci stanze e Spazi</string> <string name="space_mark_as_not_suggested">Segna come non consigliato</string> <string name="space_mark_as_suggested">Segna come consigliato</string> <string name="space_suggested">Consigliato</string> - <string name="make_this_space_public">Rendi questo spazio pubblico</string> + <string name="make_this_space_public">Rendi pubblico questo Spazio</string> <string name="space_settings_manage_rooms">Gestisci stanze</string> - <string name="looking_for_someone_not_in_space">Cerchi qualcuno non in %s\?</string> + <string name="looking_for_someone_not_in_space">Cerchi qualcuno che non è in %s\?</string> <string name="user_invites_you">%s ti ha invitato</string> <string name="a11y_public_room">Questa stanza è pubblica</string> <string name="send_images_and_video_with_original_size">Invia i file multimediali nella dimensione originale</string> @@ -2829,8 +2829,43 @@ <item quantity="other">Invia i video nella dimensione originale</item> </plurals> <string name="error_file_too_big_simple">Il file è troppo grande per essere inviato.</string> - <string name="send_file_step_compressing_video">Compressione video %d%%</string> - <string name="send_file_step_compressing_image">Compressione immagine…</string> + <string name="send_file_step_compressing_video">Compressione del video %d%%</string> + <string name="send_file_step_compressing_image">Compressione dell\'immagine…</string> <string name="use_as_default_and_do_not_ask_again">Usa come predefinito e non chiedere più</string> <string name="option_always_ask">Chiedi sempre</string> + <string name="this_space_has_no_rooms">In questo Spazio non ci sono stanze</string> + <string name="invite_to_space">Invita a %s</string> + <string name="a11y_beta">Questa funzione è in via di sviluppo</string> + <string name="give_feedback">Invia un feedback</string> + <string name="feedback_failed">L\'invio del feedback non è riuscito (%s)</string> + <string name="feedback_sent">Grazie! Il tuo feedback è stato ricevuto</string> + <string name="you_may_contact_me">Se hai altre domande puoi contattarmi</string> + <string name="send_feedback_space_info">Gli Spazi sono ancora in via di sviluppo. Il tuo feedback ci è utile per migliorarli. Il tuo nome utente e i dati sull\'App verranno comunicati per permetterci di utilizzare il tuo feedback al meglio.</string> + <string name="feedback">Feedback</string> + <string name="send_feedback_space_title">Feedback sugli Spazi</string> + <string name="error_jitsi_join_conf">Ops! Qualcosa è andato storto nel cercar di entrare nella conferenza</string> + <string name="space_leave_prompt_msg_as_admin">Sei l\'Amministratore di questo Spazio. Assicurati di aver nominato un altro amministratore prima di uscire.</string> + <string name="space_leave_prompt_msg_only_you">Sei l\'unico utente di questo Spazio. Se esci nessuno potrà più entrarci. Nemmeno tu.</string> + <string name="space_add_rooms">Aggiungi stanze</string> + <string name="labs_space_show_orphan_in_home">Spazio sperimentale - Mostra solo stanze orfane nella Home</string> + <string name="this_space_has_no_rooms_admin">Alcune stanze potrebbero essere nascoste perché sono private e ti serve il loro invito.</string> + <string name="this_space_has_no_rooms_not_admin">Alcune stanze potrebbero essere nascoste perché sono private e ti serve il loro invito. +\nNon hai il permesso di aggiungere stanze.</string> + <string name="spaces_no_server_support_description">Per maggiori informazioni contatta il tuo Home Server</string> + <string name="spaces_no_server_support_title">Pare che il tuo Home Server non supporti ancora gli Spazi</string> + <string name="spaces_feeling_experimental_subspace">Ti piace sperimentare\? +\nProva ad inserire uno Spazio all\'interno di un altro Spazio.</string> + <string name="space_leave_prompt_msg_private">Questo non è uno Spazio pubblico. Senza un invito non potrai più rientrare.</string> + <string name="unnamed_room">Stanza senza nome</string> + <string name="private_space">Spazio privato</string> + <string name="public_space">Spazio pubblico</string> + <string name="a11y_public_space">Questo spazio è pubblico</string> + <string name="call_transfer_unknown_person">Persona sconosciuta</string> + <string name="call_transfer_transfer_to_title">Trasferisci a %1$s</string> + <string name="call_transfer_consulting_with">Consultazione con %1$s</string> + <string name="directory_add_a_new_server_error_already_added">Questo server è già presente nell\'elenco</string> + <string name="directory_add_a_new_server_error">Impossibile trovare questo server o il suo elenco di stanze</string> + <string name="directory_add_a_new_server_prompt">Inserisci il nome di un nuovo server che vuoi esplorare.</string> + <string name="directory_add_a_new_server">Aggiungi un nuovo server</string> + <string name="directory_your_server">Il tuo server</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index 69aaecc085..84bccec0f6 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -332,11 +332,11 @@ <string name="room_settings_addresses_invalid_format_dialog_body">\'%s\' は正しくない形式の住所表記です</string> <string name="room_settings_addresses_disable_main_address_prompt_msg">この部屋の本住所表記が設定されていません.</string> <string name="room_settings_addresses_disable_main_address_prompt_title">本住所表記の警告</string> - <string name="room_settings_set_main_address">本住所表記を設定</string> - <string name="room_settings_unset_main_address">本住所表記を設定解除</string> + <string name="room_settings_set_main_address">メインアドレスとして設定</string> + <string name="room_settings_unset_main_address">メインアドレスとして設定を解除</string> <string name="room_settings_copy_room_id">部屋固有IDをコピー</string> <string name="room_settings_copy_room_address">部屋の住所表記をコピー</string> - <string name="encryption_information_device_id">装置固有ID</string> + <string name="encryption_information_device_id">セッションID</string> <string name="font_size">文字の大きさ</string> <string name="tiny">とても小さい</string> <string name="small">小さい</string> @@ -487,8 +487,7 @@ <string name="room_settings_room_access_warning">この部屋へのリンクを作成するには、部屋の住所表記が必要です。</string> <string name="room_settings_addresses_e2e_enabled">この部屋は暗号化されています。</string> <string name="room_settings_addresses_e2e_disabled">この部屋は暗号化されていません。</string> - <string name="room_settings_addresses_e2e_encryption_warning">暗号化を開始 -(警告: 部屋の暗号を中止することはできません!)</string> + <string name="room_settings_addresses_e2e_encryption_warning">暗号化を有効化 (警告: 部屋の暗号を再度無効することはできません!)</string> <string name="directory_title">部屋一覧</string> <string name="settings_theme">外観</string> <string name="encryption_information_title">エンドツーエンド暗号化についての情報</string> @@ -1407,7 +1406,7 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ <string name="notice_room_invite_no_invitee_with_reason">%1$sの招待です。理由: %2$s</string> <string name="clear_timeline_send_queue">送信キューのクリア</string> <string name="event_status_sending_message">メッセージを送っています…</string> - <string name="event_status_sent_message">メッセージを送る</string> + <string name="event_status_sent_message">メッセージを送りました</string> <string name="initial_sync_start_importing_account_data">初期同期: \nアカウントデータをインポート</string> <string name="initial_sync_start_importing_account_groups">初期同期: @@ -1556,4 +1555,59 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ </plurals> <string name="three_users_read">%1$sや %2$sそれに%3$sが読みました</string> <string name="command_description_plain">メッセージをマークダウンとして解釈せずにプレーンテキストとして送信する</string> + <string name="keys_backup_setup_step3_save_button_title">ファイルとして保存</string> + <string name="keys_backup_setup_step3_share_recovery_file">共有</string> + <string name="keys_backup_setup_step3_button_title">完了</string> + <string name="keys_backup_setup_step3_success_title">成功!</string> + <string name="keys_backup_setup_creating_backup">バックアップを作成中</string> + <string name="keys_backup_setup_step2_button_title">パスフレーズを設定</string> + <string name="keys_backup_setup_step1_manual_export">手動でキーをエクスポート</string> + <string name="keys_backup_setup">キーバックアップを使って開始する</string> + <string name="passphrase_passphrase_too_weak">パスフレーズが弱すぎます</string> + <string name="passphrase_empty_error_message">パスフレーズを入力してください</string> + <string name="no_valid_google_play_services_apk">Google PlayサービスのAPKが見つかりませんでした。通知がうまく機能しない場合があります。</string> + <string name="error_empty_field_enter_user_name">ユーザー名を入力してください。</string> + <string name="ignore_request_short_label">無視</string> + <string name="share_without_verifying_short_label">共有</string> + <string name="widget_integration_review_terms">続けるには利用規約に同意する必要があります。</string> + <string name="room_widget_resource_decline_permission">全てブロック</string> + <string name="room_widget_resource_grant_permission">許可</string> + <string name="room_widget_permission_room_id">部屋ID</string> + <string name="room_widget_permission_widget_id">ウィジェットID</string> + <string name="room_widget_permission_theme">あなたのテーマ</string> + <string name="room_widget_permission_user_id">あなたのユーザーID</string> + <string name="room_widget_permission_avatar_url">あなたのアバターURL</string> + <string name="room_widget_open_in_browser">ブラウザで開く</string> + <string name="room_widget_permission_title">ウィジェットをロードする</string> + <string name="room_widget_activity_title">ウィジェット</string> + <string name="active_widgets_title">アクティブなウィジェット</string> + <string name="notification_sender_me">自分</string> + <string name="notification_new_messages">新しいメッセージ</string> + <string name="notification_unknown_room_name">部屋</string> + <string name="notification_unknown_new_event">新しいイベント</string> + <string name="encryption_information_unknown_ip">不明なIP</string> + <plurals name="encryption_import_room_keys_success"> + <item quantity="other">キー %1$dと%2$dのインポートに成功。</item> + </plurals> + <string name="encryption_settings_manage_message_recovery_summary">キーバックアップを管理</string> + <string name="encryption_exported_successfully">キーのエクスポートに成功しました</string> + <string name="media_source_choose">選択</string> + <string name="compression_opt_list_choose">選択</string> + <string name="account_additional_info">詳細情報: %s</string> + <string name="room_alias_local_address_add">ローカルアドレスを追加する</string> + <string name="room_alias_local_address_empty">この部屋はローカルアドレスがありません</string> + <string name="room_alias_delete_confirmation">アドレス \"%1$s\" を削除しますか?</string> + <string name="room_alias_main_address_hint">メインアドレス</string> + <string name="room_alias_published_alias_main">これがメインアドレスです</string> + <string name="account_phone_number_error">電話番号の認証中にエラーが発生しました。</string> + <string name="invite_by_link">リンクを共有</string> + <string name="invite_to_space_with_name">%s に招待する</string> + <string name="invite_by_email">Eメールで招待</string> + <string name="create_space_topic_hint">説明</string> + <string name="invite_people_menu">人を招待する</string> + <string name="join_anyway">とにかく参加する</string> + <string name="space_add_child_title">部屋を追加する</string> + <string name="user_invites_you">%s はあなたを招待しています</string> + <string name="no_permissions_to_start_conf_call">この部屋で電話会議をする権利がありません</string> + <string name="audio_meeting">オーディオミーティングを開始する</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-ml/strings.xml b/vector/src/main/res/values-ml/strings.xml index b41bdae287..db959072d7 100644 --- a/vector/src/main/res/values-ml/strings.xml +++ b/vector/src/main/res/values-ml/strings.xml @@ -985,4 +985,6 @@ <string name="encryption_information_unblock">കരിമ്പട്ടികയിൽ നിന്നും നീക്കുക</string> <string name="encryption_import_import">ഇമ്പോർട്ട്</string> <string name="encryption_export_export">എക്സ്പോർട്ട്</string> + <string name="spaces_invited_header">ക്ഷണങ്ങൾ</string> + <string name="settings_flair">ഫ്ലെയർ</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-nl/strings.xml b/vector/src/main/res/values-nl/strings.xml index a2e12e99e2..b2c1aff6ec 100644 --- a/vector/src/main/res/values-nl/strings.xml +++ b/vector/src/main/res/values-nl/strings.xml @@ -2,7 +2,6 @@ <resources> <string name="summary_message">%1$s: %2$s</string> <string name="summary_user_sent_image">%1$s heeft een afbeelding gestuurd.</string> - <string name="notice_room_invite_no_invitee">Uitnodiging van %s</string> <string name="notice_room_invite">%1$s heeft %2$s uitgenodigd</string> <string name="notice_room_invite_you">%1$s heeft u uitgenodigd</string> @@ -30,61 +29,45 @@ <string name="notice_room_visibility_world_readable">iedereen.</string> <string name="notice_room_visibility_unknown">onbekend (%s).</string> <string name="notice_end_to_end">%1$s heeft eind-tot-eind-versleuteling aangezet (%2$s)</string> - <string name="notice_requested_voip_conference">%1$s heeft een VoIP-vergadering aangevraagd</string> <string name="notice_voip_started">VoIP-vergadering gestart</string> <string name="notice_voip_finished">VoIP-vergadering gestopt</string> - <string name="notice_avatar_changed_too">(avatar is ook veranderd)</string> <string name="notice_room_name_removed">%1$s heeft de gespreksnaam verwijderd</string> <string name="notice_room_topic_removed">%1$s heeft het gespreksonderwerp verwijderd</string> <string name="notice_profile_change_redacted">%1$s heeft zijn/haar profiel %2$s bijgewerkt</string> <string name="notice_room_third_party_invite">%1$s heeft een uitnodiging naar %2$s gestuurd om het gesprek toe te treden</string> <string name="notice_room_third_party_registered_invite">%1$s heeft de uitnodiging voor %2$s aanvaard</string> - <string name="notice_crypto_unable_to_decrypt">** Kan niet ontsleutelen: %s **</string> <string name="notice_crypto_error_unkwown_inbound_session_id">Het apparaat van de afzender heeft geen sleutels voor dit bericht gestuurd.</string> - <!-- Room Screen --> <string name="could_not_redact">Kon niet verwijderd worden</string> <string name="unable_to_send_message">Kan bericht niet verzenden</string> - <string name="message_failed_to_upload">Uploaden van de afbeelding mislukt</string> - <!-- general errors --> <string name="network_error">Netwerkfout</string> <string name="matrix_error">Matrix-fout</string> - <!-- Home Screen --> - <!-- Last seen time --> - <!-- room error messages --> <string name="room_error_join_failed_empty_room">Het is momenteel niet mogelijk om een leeg gesprek opnieuw toe te treden.</string> - <!-- medium friendly name --> <string name="medium_email">E-mailadres</string> <string name="medium_phone_number">Telefoonnummer</string> - <string name="summary_user_sent_sticker">%1$s heeft een sticker gestuurd.</string> - <!-- Room display name --> <string name="room_displayname_invite_from">Uitnodiging van %s</string> <string name="room_displayname_room_invite">Gespreksuitnodiging</string> <string name="room_displayname_two_members">%1$s en %2$s</string> <string name="room_displayname_empty_room">Leeg gesprek</string> - <plurals name="room_displayname_three_and_more_members"> <item quantity="one">%1$s en 1 andere</item> <item quantity="other">%1$s en %2$d anderen</item> </plurals> - - <string name="notice_event_redacted">Bericht verwijderd</string> <string name="notice_event_redacted_by">Bericht verwijderd door %1$s</string> <string name="notice_event_redacted_with_reason">Bericht verwijderd [reden: %1$s]</string> <string name="notice_event_redacted_by_with_reason">Bericht verwijderd door %1$s [reden: %2$s]</string> - <string name="initial_sync_start_importing_account">Initiële synchronisatie: \nAccount wordt geïmporteerd…</string> <string name="initial_sync_start_importing_account_crypto">Initiële synchronisatie: @@ -101,12 +84,9 @@ \nGemeenschappen worden geïmporteerd</string> <string name="initial_sync_start_importing_account_data">Initiële synchronisatie: \nAccountgegevens worden geïmporteerd</string> - <string name="notice_room_update">%s heeft dit gesprek opgewaardeerd.</string> - <string name="event_status_sending_message">Bericht wordt verstuurd…</string> <string name="clear_timeline_send_queue">Uitgaande wachtrij legen</string> - <string name="notice_room_third_party_revoked_invite">%1$s heeft de uitnodiging voor %2$s om het gesprek toe te treden ingetrokken</string> <string name="notice_room_invite_no_invitee_with_reason">Uitnodiging van %1$s. Reden: %2$s</string> <string name="notice_room_invite_with_reason">%1$s heeft %2$s uitgenodigd. Reden: %3$s</string> @@ -121,25 +101,19 @@ <string name="notice_room_third_party_revoked_invite_with_reason">%1$s heeft de uitnodiging voor %2$s ingetrokken. Reden: %3$s</string> <string name="notice_room_third_party_registered_invite_with_reason">%1$s heeft de uitnodiging voor %2$s aanvaard. Reden: %3$s</string> <string name="notice_room_withdraw_with_reason">%1$s heeft de uitnodiging van %2$s ingetrokken. Reden: %3$s</string> - <plurals name="notice_room_aliases_added"> <item quantity="one">%1$s heeft %2$s als gespreksadres toegevoegd.</item> <item quantity="other">%1$s heeft %2$s als gespreksadressen toegevoegd.</item> </plurals> - <plurals name="notice_room_aliases_removed"> <item quantity="one">%1$s heeft %2$s als gespreksadres verwijderd.</item> <item quantity="other">%1$s heeft %3$s als gespreksadressen verwijderd.</item> </plurals> - <string name="notice_room_aliases_added_and_removed">%1$s heeft %2$s als gespreksadres toegevoegd en %3$s verwijderd.</string> - <string name="notice_room_canonical_alias_set">%1$s heeft het hoofdadres voor dit gesprek ingesteld op %2$s.</string> <string name="notice_room_canonical_alias_unset">%1$s heeft het hoofdadres voor dit gesprek verwijderd.</string> - <string name="notice_room_guest_access_can_join">%1$s heeft gasten de toegang tot het gesprek verleend.</string> <string name="notice_room_guest_access_forbidden">%1$s heeft gasten de toegang tot het gesprek verhinderd.</string> - <string name="notice_end_to_end_ok">%1$s heeft eind-tot-eind-versleuteling ingeschakeld.</string> <string name="notice_end_to_end_unknown_algorithm">%1$s heeft eind-tot-eind-versleuteling ingeschakeld (onbekend algoritme %2$s).</string> <!-- titles --> @@ -1471,4 +1445,36 @@ <string name="create_room_public_description">Iedereen zal dit gesprek kunnen toetreden</string> <string name="pause_video">Pauzeren</string> <string name="play_video">Afspelen</string> + <string name="notice_room_canonical_alias_unset_by_you">Je hebt het hoofdadres voor dit gesprek verwijderd.</string> + <string name="notice_room_invite_with_reason_by_you">Je hebt %1$s uitgenodigd. Reden: %2$s</string> + <string name="notice_room_invite_no_invitee_with_reason_by_you">Jouw uitnodiging. Reden: %1$s</string> + <string name="event_status_sent_message">Bericht verstuurd</string> + <string name="initial_sync_start_downloading">Initiële synchronisatie: +\nGegevens aan het downloaden…</string> + <string name="initial_sync_start_server_computing">Initiële synchronisatie: +\nAan het wachten op een antwoord van de server…</string> + <string name="room_displayname_empty_room_was">Lege kamer (was %s)</string> + <string name="power_level_moderator">Moderator</string> + <string name="notice_direct_room_third_party_invite_by_you">Je hebt %1$s uitgenodigd</string> + <string name="notice_direct_room_third_party_invite">%1$s nodigde %2$s uit</string> + <string name="notice_room_server_acl_updated_no_change">Geen verandering.</string> + <string name="notice_end_to_end_by_you">Je hebt end-to-end encryptie ingeschakeld (%1$s)</string> + <string name="notice_made_future_direct_room_visibility_by_you">Je hebt toekomstige berichten zichtbaar gemaakt voor %1$s</string> + <string name="notice_made_future_direct_room_visibility">%1$s heeft toekomstige berichten zichtbaar gemaakt voor %2$s</string> + <string name="notice_ended_call_by_you">Je hebt de oproep beëindigd.</string> + <string name="notice_answered_call_by_you">Je hebt de oproep beantwoord.</string> + <string name="notice_display_name_changed_from_by_you">Je hebt je schermnaam gewijzigd van %1$s naar %2$s</string> + <string name="notice_display_name_set_by_you">Je hebt je schermnaam ingesteld op %1$s</string> + <string name="notice_avatar_url_changed_by_you">Je hebt je avatar aangepast</string> + <string name="notice_room_reject_by_you">Je hebt de uitnodiging geweigerd</string> + <string name="notice_direct_room_leave_by_you">Je hebt de kamer verlaten</string> + <string name="notice_direct_room_leave">%1$s heeft de kamer verlaten</string> + <string name="notice_room_leave_by_you">Je hebt de kamer verlaten</string> + <string name="notice_room_invite_by_you">Jij hebt %1$s uitgenodigd</string> + <string name="notice_direct_room_created_by_you">Jij hebt de discussie aangemaakt</string> + <string name="notice_direct_room_created">%1$s heeft de discussie aangemaakt</string> + <string name="notice_room_created_by_you">Jij hebt de kamer aangemaakt</string> + <string name="notice_room_created">%1$s heeft de kamer aangemaakt</string> + <string name="notice_room_invite_no_invitee_by_you">Jouw uitnodiging</string> + <string name="summary_you_sent_image">Je hebt een afbeelding gestuurd.</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index f55453707f..db7f940e38 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -12,17 +12,17 @@ <string name="notice_room_unban">%1$s desbaniu %2$s</string> <string name="notice_room_ban">%1$s baniu %2$s</string> <string name="notice_room_withdraw">%1$s retirou o convite de %2$s</string> - <string name="notice_avatar_url_changed">%1$s mudou seu avatar</string> - <string name="notice_display_name_set">%1$s definiu seu nome de exibição para %2$s</string> - <string name="notice_display_name_changed_from">%1$s mudou seu nome de exibição de %2$s para %3$s</string> - <string name="notice_display_name_removed">%1$s removeu seu nome de exibição (era %2$s)</string> + <string name="notice_avatar_url_changed">%1$s mudou o avatar dela(e)</string> + <string name="notice_display_name_set">%1$s definiu o nome de exibição dela(e) para %2$s</string> + <string name="notice_display_name_changed_from">%1$s mudou o nome de exibição dela(e) de %2$s para %3$s</string> + <string name="notice_display_name_removed">%1$s removeu o nome de exibição dela(e) (era %2$s)</string> <string name="notice_room_topic_changed">%1$s mudou o tópico para: %2$s</string> <string name="notice_room_name_changed">%1$s mudou o nome da sala para: %2$s</string> <string name="notice_placed_video_call">%s começou uma chamada de vídeo.</string> <string name="notice_placed_voice_call">%s começou uma chamada de voz.</string> <string name="notice_answered_call">%s atendeu a chamada.</string> <string name="notice_ended_call">%s terminou a chamada.</string> - <string name="notice_made_future_room_visibility">%1$s deixou o histórico futuro da sala visível para %2$s</string> + <string name="notice_made_future_room_visibility">%1$s fez histórico da sala futuro visível para %2$s</string> <string name="notice_room_visibility_invited">todos os membros da sala, do ponto que foram convidados.</string> <string name="notice_room_visibility_joined">todos os mebros da sala, do ponto que se juntaram.</string> <string name="notice_room_visibility_shared">todos os membros da sala.</string> @@ -31,7 +31,7 @@ <string name="notice_end_to_end">%1$s ativou a encriptação ponta-a-ponta (%2$s)</string> <string name="notice_requested_voip_conference">%1$s requisitou uma conferência de VoIP</string> <string name="notice_voip_started">Conferência de VoIP começou</string> - <string name="notice_voip_finished">Conferência de VoIP terminou</string> + <string name="notice_voip_finished">Conferência de VoIP finalizou</string> <string name="notice_avatar_changed_too">(avatar mudou também)</string> <string name="notice_room_name_removed">%1$s removeu o nome da sala</string> <string name="notice_room_topic_removed">%1$s removeu o tópico da sala</string> @@ -39,11 +39,11 @@ <string name="notice_room_third_party_invite">%1$s enviou um convite para %2$s para se juntar à sala</string> <string name="notice_room_third_party_registered_invite">%1$s aceitou o convite para %2$s</string> <string name="notice_crypto_unable_to_decrypt">** Incapaz de decriptar: %s **</string> - <string name="notice_crypto_error_unkwown_inbound_session_id">O dispositivo do(a) enviador(a) não nos enviou as chaves para esta mensagem.</string> + <string name="notice_crypto_error_unkwown_inbound_session_id">O dispositivo do/da enviador(a) não nos enviou as chaves para esta mensagem.</string> <!-- Room Screen --> <string name="could_not_redact">Não foi possível redigir</string> <string name="unable_to_send_message">Não foi possível enviar mensagem</string> - <string name="message_failed_to_upload">Upload de imagem falhou</string> + <string name="message_failed_to_upload">Falha para fazer upload de imagem</string> <!-- general errors --> <string name="network_error">Erro de rede</string> <string name="matrix_error">Erro de Matrix</string> @@ -51,7 +51,7 @@ <!-- Last seen time --> <!-- call events --> <!-- room error messages --> - <string name="room_error_join_failed_empty_room">Atualmente não é possível se rejuntar a uma sala vazia.</string> + <string name="room_error_join_failed_empty_room">Não é atualmente possível se re-juntar a uma sala vazia.</string> <!-- medium friendly name --> <string name="medium_email">Endereço de email</string> <string name="medium_phone_number">Número de telefone</string> @@ -92,7 +92,7 @@ <string name="notice_call_candidates_by_you">Você enviou dados para configurar a chamada.</string> <string name="notice_answered_call_by_you">Você atendeu a chamada.</string> <string name="notice_ended_call_by_you">Você terminou a chamada.</string> - <string name="notice_made_future_room_visibility_by_you">Você deixou o histórico futuro da sala visível para %1$s</string> + <string name="notice_made_future_room_visibility_by_you">Você fez histórico da sala futuro visível para %1$s</string> <string name="notice_end_to_end_by_you">Você ativou a encriptação ponta-a-ponta (%1$s)</string> <string name="notice_room_update">%s fez o upgrade desta sala.</string> <string name="notice_room_update_by_you">Você fez o upgrade desta sala.</string> @@ -141,7 +141,7 @@ <string name="initial_sync_start_importing_account_data">Sinc Inicial: \nImportando Dados de Conta</string> <string name="event_status_sending_message">Enviando mensagem…</string> - <string name="clear_timeline_send_queue">Limpar a fila de envio</string> + <string name="clear_timeline_send_queue">Limpar fila de envio</string> <string name="notice_room_invite_no_invitee_with_reason">Convite de %1$s. Razão: %2$s</string> <string name="notice_room_invite_no_invitee_with_reason_by_you">Seu convite. Razão: %1$s</string> <string name="notice_room_invite_with_reason">%1$s convidou %2$s. Razão: %3$s</string> @@ -189,18 +189,18 @@ <string name="notice_room_canonical_alias_set_by_you">Você definiu o endereço principal para esta sala para %1$s.</string> <string name="notice_room_canonical_alias_unset">%1$s removeu o endereço principal para esta sala.</string> <string name="notice_room_canonical_alias_unset_by_you">Você removeu o endereço principal para esta sala.</string> - <string name="notice_room_guest_access_can_join">%1$s tem permitido que visitas se juntem à sala.</string> - <string name="notice_room_guest_access_can_join_by_you">Você tem permitido que visitas se juntem à sala.</string> - <string name="notice_room_guest_access_forbidden">%1$s tem prevenido visitas de se juntarem à sala.</string> - <string name="notice_room_guest_access_forbidden_by_you">Você tem prevenido visitas de se juntarem à sala.</string> + <string name="notice_room_guest_access_can_join">%1$s tem permitido visitantes se juntarem à sala.</string> + <string name="notice_room_guest_access_can_join_by_you">Você tem permitido visitantes se juntarem à sala.</string> + <string name="notice_room_guest_access_forbidden">%1$s tem prevenido visitantes de se juntarem à sala.</string> + <string name="notice_room_guest_access_forbidden_by_you">Você tem prevenido visitantes de se juntarem à sala.</string> <string name="notice_end_to_end_ok">%1$s ativou encriptação ponta-a-ponta.</string> <string name="notice_end_to_end_ok_by_you">Você ativou encriptação ponta-a-ponta.</string> <string name="notice_end_to_end_unknown_algorithm">%1$s ativou encriptação ponta-a-ponta (algoritmo irreconhecido %2$s).</string> <string name="notice_end_to_end_unknown_algorithm_by_you">Você ativou encriptação ponta-a-ponta (algoritmo irreconhecido %1$s).</string> - <string name="notice_direct_room_guest_access_forbidden_by_you">Você tem prevenido visitas de se juntarem à sala.</string> - <string name="notice_direct_room_guest_access_forbidden">%1$s tem prevenido visitas de se juntarem à sala.</string> - <string name="notice_direct_room_guest_access_can_join_by_you">Você tem permitido que visitas se juntem aqui.</string> - <string name="notice_direct_room_guest_access_can_join">%1$s tem permitido que visitas se juntem aqui.</string> + <string name="notice_direct_room_guest_access_forbidden_by_you">Você tem prevenido visitantes de se juntarem à sala.</string> + <string name="notice_direct_room_guest_access_forbidden">%1$s tem prevenido visitantes de se juntarem à sala.</string> + <string name="notice_direct_room_guest_access_can_join_by_you">Você tem permitido visitantes se juntarem aqui.</string> + <string name="notice_direct_room_guest_access_can_join">%1$s tem permitido visitantes se juntarem aqui.</string> <string name="notice_direct_room_leave_with_reason_by_you">Você saiu. Razão: %1$s</string> <string name="notice_direct_room_leave_with_reason">%1$s saiu. Razão: %2$s</string> <string name="notice_direct_room_join_with_reason_by_you">Você juntou-se. Razão: %1$s</string> @@ -212,7 +212,7 @@ <string name="notice_direct_room_update_by_you">Você fez o upgrade aqui.</string> <string name="notice_direct_room_update">%s fez o upgrade aqui.</string> <string name="notice_made_future_direct_room_visibility_by_you">Você deixou mensagens futuras vísiveis para %1$s</string> - <string name="notice_made_future_direct_room_visibility">%1$s deixou mensagens futuras visíveis para %2$s</string> + <string name="notice_made_future_direct_room_visibility">%1$s fez mensagens futuras visíveis para %2$s</string> <string name="notice_direct_room_leave_by_you">Você saiu da sala</string> <string name="notice_direct_room_leave">%1$s saiu da sala</string> <string name="notice_direct_room_join_by_you">Você juntou-se</string> @@ -292,8 +292,8 @@ <string name="later">Mais Tarde</string> <string name="forward">Encaminhar</string> <string name="permalink">Permalink</string> - <string name="view_source">Ver Fonte</string> - <string name="view_decrypted_source">Ver Fonte Decriptada</string> + <string name="view_source">Visualizar Fonte</string> + <string name="view_decrypted_source">Visualizar Fonte Decriptada</string> <string name="delete">Deletar</string> <string name="rename">Renomear</string> <string name="report_content">Reportar conteúdo</string> @@ -306,7 +306,7 @@ <string name="missing_permissions_warning">Devido a permissões faltando, alguns recursos podem estar faltando…</string> <string name="missing_permissions_to_start_conf_call">Você precisa de permissão para convidar para começar uma conferência nesta sala</string> <string name="missing_permissions_title_to_start_conf_call">Não é possível começar chamada</string> - <string name="device_information">Informação da sessão</string> + <string name="device_information">Informação de sessão</string> <string name="room_no_conference_call_in_encrypted_rooms">Chamadas de conferência não são suportadas em salas encriptadas</string> <string name="send_anyway">Enviar Mesmo Assim</string> <string name="or">ou</string> @@ -352,8 +352,8 @@ <string name="no_room_placeholder">Nenhuma sala</string> <string name="no_public_room_placeholder">Nenhuma sala pública disponível</string> <plurals name="public_room_nb_users"> - <item quantity="one">%d usuário</item> - <item quantity="other">%d usuários</item> + <item quantity="one">%d usuária(o)</item> + <item quantity="other">%d usuárias(os)</item> </plurals> <string name="send_bug_report_include_logs">Enviar logs</string> <string name="send_bug_report_include_crash_logs">Enviar crash logs</string> @@ -361,20 +361,20 @@ <string name="send_bug_report">Reportar bug</string> <string name="send_bug_report_description">Por favor descreva o bug. O que você fez\? O que você esperava que acontecese\? O que aconteceu na verdade\?</string> <string name="send_bug_report_placeholder">Descreva seu problema aqui</string> - <string name="send_bug_report_logs_description">A fim de diagnosticar problemas, logs deste cliente serão enviados com este reporte de bug. Este reporte de bug, incluindo os logs e o screenshot, não será visível publicamente. Se você prefere somente enviar o texto acima, por favor desmarque:</string> - <string name="send_bug_report_alert_message">Você parece estar agitando o celular em frustração. Gostaria de abrir a tela de reporte de bug\?</string> + <string name="send_bug_report_logs_description">A fim de diagnosticar problemas, logs deste cliente vão ser enviados com este reporte de bug. Este reporte de bug, incluindo os logs e o screenshot, não será visível publicamente. Se você prefere somente enviar o texto acima, por favor desmarque:</string> + <string name="send_bug_report_alert_message">Você parece estar agitando o telefone em frustração. Você gostaria de abrir a tela de reporte de bug\?</string> <string name="send_bug_report_sent">O reporte de bug tem sido enviado com sucesso</string> - <string name="send_bug_report_failed">O reporte de bug falhou para enviar (%s)</string> + <string name="send_bug_report_failed">O reporte de bug falhou para ser enviado (%s)</string> <string name="send_bug_report_progress">Progresso (%s%%)</string> - <string name="send_bug_report_app_crashed">O aplicativo crashou da última vez. Gostaria de abrir a tela de reporte de crash\?</string> + <string name="send_bug_report_app_crashed">O aplicativo tem crashado da última vez. Você gostaria de abrir a tela de reporte de crash\?</string> <string name="send_files_in">Enviar para</string> - <string name="read_receipt">Lido</string> + <string name="read_receipt">Lida</string> <string name="join_room">Juntar-se a Sala</string> - <string name="username">Nome de Usuário</string> + <string name="username">Nome de Usuária(o)</string> <string name="create_account">Criar Conta</string> <string name="login">Fazer Login</string> <string name="logout">Fazer Signout</string> - <string name="hs_url">URL de Servidor de Casa</string> + <string name="hs_url">URL de Servidorcasa</string> <string name="identity_url">URL de Servidor de Identidade</string> <string name="search">Pesquisar</string> <string name="start_new_chat">Começar Novo Chat</string> @@ -389,18 +389,18 @@ <string name="auth_skip">Pular</string> <string name="auth_send_reset_email">Enviar Email de Reset</string> <string name="auth_return_to_login">Retornar a tela de login</string> - <string name="auth_user_id_placeholder">Email ou nome de usuário</string> + <string name="auth_user_id_placeholder">Email ou nome de usuária(o)</string> <string name="auth_password_placeholder">Senha</string> <string name="auth_new_password_placeholder">Nova senha</string> - <string name="auth_user_name_placeholder">Nome de usuário</string> + <string name="auth_user_name_placeholder">Nome de usuária(o)</string> <string name="auth_email_placeholder">Endereço de email</string> <string name="auth_opt_email_placeholder">Endereço de email (opcional)</string> <string name="auth_phone_number_placeholder">Número de telefone</string> <string name="auth_opt_phone_number_placeholder">Número de telefone (opcional)</string> <string name="auth_repeat_password_placeholder">Repetir senha</string> <string name="auth_repeat_new_password_placeholder">Confirmar sua nova senha</string> - <string name="auth_invalid_login_param">Nome de usuário e/ou senha incorreta(s)</string> - <string name="auth_invalid_user_name">Nomes de usuário só podem conter letras, números, pontos, hifens e underscores</string> + <string name="auth_invalid_login_param">Nome de usuária(o) e/ou senha incorreta(s)</string> + <string name="auth_invalid_user_name">Nomes de usuária(o) só podem conter letras, números, pontos, hifens e underscores</string> <string name="auth_invalid_password">Senha curta demais (mín 6)</string> <string name="auth_missing_password">Senha faltando</string> <string name="auth_invalid_email">Isto não parece com um endereço de email válido</string> @@ -410,23 +410,23 @@ <string name="auth_missing_phone">Número de telefone faltando</string> <string name="auth_missing_email_or_phone">Endereço de email ou número de telefone faltando</string> <string name="auth_invalid_token">Token inválido</string> - <string name="auth_password_dont_match">Senhas não batem</string> + <string name="auth_password_dont_match">Senhas não correspondem</string> <string name="auth_forgot_password">Esqueceu senha\?</string> - <string name="auth_use_server_options">Usar opções de servidor personalizado (avançado)</string> + <string name="auth_use_server_options">Usar opções de servidor personalizadas (avançada)</string> <string name="auth_email_validation_message">Por favor cheque seu email para continuar registro</string> <string name="auth_threepid_warning_message">Registro com email e número de telefone de vez não é suportado ainda até que a api exista. Somente o número de telefone será levado em consideração. \n \nVocê pode adicionar seu email a seu perfil em configurações.</string> - <string name="auth_recaptcha_message">Este Servidor de Casa gostaria de assegurar que você não é um robô</string> - <string name="auth_username_in_use">Nome de usuário em uso</string> - <string name="auth_home_server">Servidor de Casa:</string> + <string name="auth_recaptcha_message">Este servidorcasa gostaria de assegurar que você não é um robô</string> + <string name="auth_username_in_use">Nome de usuária(o) em uso</string> + <string name="auth_home_server">Servidorcasa:</string> <string name="auth_identity_server">Servidor de Identidade:</string> <string name="auth_reset_password_next_step_button">Eu tenho verificado meu endereço de email</string> <string name="auth_reset_password_message">Para resettar sua senha, entre o endereço de email linkado a sua conta:</string> <string name="auth_reset_password_missing_email">O endereço de email linkado a sua conta deve ser entrado.</string> <string name="auth_reset_password_missing_password">Uma nova senha deve ser entrada.</string> <string name="auth_reset_password_email_validation_message">Um email tem sido enviado para %s. Uma vez que tenha seguido o link que ele contém, clique abaixo.</string> - <string name="auth_reset_password_error_unauthorized">Falha ao verificar endereço de email: assegure-se que clicou no link no email</string> + <string name="auth_reset_password_error_unauthorized">Falha para verificar endereço de email: assegure-se que clicou no link no email</string> <string name="auth_reset_password_success_message">Sua senha tem sido resettada. \n \nVocê tem sido feito logout de todas as sessões e não vai mais receber notificações push. Para reativar notificações, faça re-login em cada dispositivo.</string> @@ -438,12 +438,12 @@ <string name="login_error_unable_register">Incapaz de registrar</string> <string name="login_error_unable_register_mail_ownership">Incapaz de registrar: falha de posse de email</string> <string name="login_error_invalid_home_server">Por favor entre um URL válido</string> - <string name="login_error_forbidden">Nome de usuário/senha inválida(o)</string> + <string name="login_error_forbidden">Nome de usuária(o)/senha inválida(o)</string> <string name="login_error_unknown_token">O token de acesso especificado não foi reconhecido</string> <string name="login_error_bad_json">JSON malformado</string> <string name="login_error_not_json">Não continha JSON válido</string> <string name="login_error_limit_exceeded">Requisições demais tem sido enviadas</string> - <string name="login_error_user_in_use">Este nome de usuário já é usado</string> + <string name="login_error_user_in_use">Este nome de usuária(o) já é usado</string> <string name="login_error_login_email_not_yet">O link de email que não tem sido clicado ainda</string> <!-- crypto warnings --> <!-- read receipts list Screen --> @@ -464,8 +464,8 @@ <string name="yesterday">Ontem</string> <string name="today">Hoje</string> <!-- room info dialog Screen --> - <string name="room_info_room_name">Nome da sala</string> - <string name="room_info_room_topic">Tópico da sala</string> + <string name="room_info_room_name">Nome de sala</string> + <string name="room_info_room_topic">Tópico de sala</string> <!-- call string --> <string name="call_connected">Chamada conectada</string> <string name="call_connecting">Chamada conectando…</string> @@ -475,7 +475,7 @@ <string name="incoming_video_call">Chamada de Vídeo Recebendo</string> <string name="incoming_voice_call">Chamada de Voz Recebendo</string> <string name="call_in_progress">Chamada Em Progresso…</string> - <string name="call_error_user_not_responding">O lado remoto falhou ao atender.</string> + <string name="call_error_user_not_responding">O lado remoto falhou para atender.</string> <string name="call_error_ice_failed">Conexão de Mídia Falhou</string> <string name="call_error_camera_init_failed">Não é possível inicializar a câmera</string> <string name="call_error_answered_elsewhere">chamada atendida em algum outro lugar</string> @@ -499,7 +499,7 @@ \n \nPor favor permita acesso no próximo pop-up para ser capaz de fazer a chamada.</string> <string name="template_permissions_rationale_msg_contacts">${app_name} pode checar seu livro de endereços para achar outras(os) usuárias(os) de Matrix baseado em seus email e números de telefone. Se você concorda em compartilhar seu livro de endereços para este propósito, por favor permita acesso no próximo pop-up.</string> - <string name="template_permissions_msg_contacts_warning_other_androids">${app_name} pode checar seu livro de endereços para encontrar outras(os) usuásias(os) de Matrix baseado em seus email e números de telefone. + <string name="template_permissions_msg_contacts_warning_other_androids">${app_name} pode checar seu livro de endereços para encontrar outras(os) usuásias(os) de Matrix baseado em seus emails e números de telefone. \n \nVocê concorda em compartilhar seu livro de endereços para este propósito\?</string> <string name="permissions_action_not_performed_missing_permissions">Desculpe. Ação não performada, devido a permissões faltando</string> @@ -518,9 +518,9 @@ <string name="room_jump_to_first_unread">Pular para primeira mensagem não-lida.</string> <!-- Room Preview --> <string name="room_preview_invitation_format">Você tem sido convidada(o) a juntar-se a esta sala por %s</string> - <string name="room_preview_unlinked_email_warning">Este convite foi enviado a %s, que não está associada(o) com esta conta. + <string name="room_preview_unlinked_email_warning">Este convite foi enviado para %s, que não está associada(o) a esta conta. \nVocê pode desejar fazer login com uma conta diferente, ou adicionar este email a sua conta.</string> - <string name="room_preview_try_join_an_unknown_room">Você está tentando acessar %s. Gostaria de se juntar a fim de participar da discussão\?</string> + <string name="room_preview_try_join_an_unknown_room">Você está tentando acessar %s. Você gostaria de se juntar a fim de participar na discussão\?</string> <string name="room_preview_try_join_an_unknown_room_default">uma sala</string> <string name="room_preview_room_interactions_disabled">Esta é uma previsualização desta sala. Interações de sala têm sido desativadas.</string> <!-- Chat creation --> @@ -528,9 +528,9 @@ <string name="room_creation_add_member">Adicionar membro</string> <string name="room_title_one_member">1 membro</string> <!-- Chat participants --> - <string name="room_participants_leave_prompt_title">Sair da sala</string> - <string name="room_participants_leave_prompt_msg">Você tem certeza que quer sair da sala\?</string> - <string name="room_participants_remove_prompt_msg">Você tem certeza que quer remover %s deste chat\?</string> + <string name="room_participants_leave_prompt_title">Sair de sala</string> + <string name="room_participants_leave_prompt_msg">Você tem certeza que você quer sair da sala\?</string> + <string name="room_participants_remove_prompt_msg">Você tem certeza que você quer remover %s deste chat\?</string> <string name="room_participants_create">Criar</string> <string name="room_participants_online">Online</string> <string name="room_participants_offline">Offline</string> @@ -545,16 +545,16 @@ <string name="room_participants_action_ban">Banir</string> <string name="room_participants_action_unban">Desbanir</string> <string name="room_participants_action_set_default_power_level">Resettar a usuária(o) normal</string> - <string name="room_participants_action_set_moderator">Tornar moderador(a)</string> - <string name="room_participants_action_set_admin">Tornar admin</string> + <string name="room_participants_action_set_moderator">Fazer moderador(a)</string> + <string name="room_participants_action_set_admin">Fazer admin</string> <string name="room_participants_action_ignore">Ignorar</string> <string name="room_participants_action_unignore">Designorar</string> - <string name="room_participants_invite_search_another_user">ID de usuário, Nome ou email</string> + <string name="room_participants_invite_search_another_user">ID de usuária(o), Nome ou email</string> <string name="room_participants_action_mention">Mencionar</string> <string name="room_participants_action_devices_list">Mostrar Lista de Sessões</string> <string name="room_participants_power_level_prompt">Você não vai ser capaz de desfazer esta mudança já que você está promovendo a(o) usuária(o) para ter o mesmo nível de poder que você. \nVocê tem certeza\?</string> - <string name="room_participants_invite_prompt_msg">Você tem certeza que quer convidar %s para este chat\?</string> + <string name="room_participants_invite_prompt_msg">Você tem certeza você que quer convidar %s para este chat\?</string> <!-- invitation --> <string name="people_search_invite_by_id"><u>Convidar por ID</u></string> <string name="people_search_local_contacts">CONTATOS LOCAIS (%d)</string> @@ -586,28 +586,28 @@ <string name="ssl_fingerprint_hash">Impressão digital (%s):</string> <string name="ssl_could_not_verify">Não foi possível verificar identidade de servidor remoto.</string> <string name="ssl_cert_not_trust">Isto poderia significar que alguém está maliciosamente interceptando seu tráfico, ou que seu celular não confia no certificado provido pelo servidor remoto.</string> - <string name="ssl_cert_new_account_expl">Se o(a) administrador(a) do servidor tem dito que isto é esperado, assegure que a impressão digital abaixo corresponde à impressão digital provida por ele(a).</string> + <string name="ssl_cert_new_account_expl">Se o/a administrador(a) de servidor tem dito que isto é esperado, assegure que a impressão digital abaixo corresponde à impressão digital provida por ele(a).</string> <string name="ssl_unexpected_existing_expl">O certificado tem mudado de um que era confiado por seu telefone. Isto é ALTAMENTE INCOMUM. É recomendado que você NÃO ACEITE este novo certificado.</string> - <string name="ssl_expected_existing_expl">O certificado tem sido mudado de um previamente confiado para um que não é confiado. O servidor pode ter renovado seu certificado. Conacte o(a) administrador(a) do servidor para a impressão digital esperada.</string> - <string name="ssl_only_accept">Somente aceite o certificado se o(a) administrador(a) do servidor tem publicado uma impressão digital que bate com a acima.</string> + <string name="ssl_expected_existing_expl">O certificado tem mudado de um previamente confiado para um que não é confiado. O servidor pode ter renovado seu certificado. Contacte o/a administrador(a) de servidor para a impressão digital esperada.</string> + <string name="ssl_only_accept">Somente aceite o certificado se o/a administrador(a) de servidor tem publicado uma impressão digital que corresponde com a acima.</string> <!-- Room Details --> - <string name="room_details_title">Detalhes da Sala</string> + <string name="room_details_title">Detalhes de Sala</string> <string name="room_details_people">Pessoas</string> <string name="room_details_files">Arquivos</string> <string name="room_details_settings">Configurações</string> - <string name="malformed_id">ID malformado. Devia ser um endereço de email ou um ID Matrix como \'@partlocal:dominio\'</string> + <string name="malformed_id">ID malformada. Devia ser um endereço de email ou uma ID Matrix como \'@partlocal:dominio\'</string> <string name="room_details_people_invited_group_name">CONVIDADAS(OS)</string> <string name="room_details_people_present_group_name">SE JUNTARAM</string> <!-- Room events --> <string name="room_event_action_report_prompt_reason">Razão por reportar este conteúdo</string> - <string name="room_event_action_report_prompt_ignore_user">Você quer esconder todas as mensagens deste usuário\? + <string name="room_event_action_report_prompt_ignore_user">Você quer esconder todas as mensagens desta(e) usuária(o)\? \n -\nNote que esta ação irá reiniciar o app e pode levar algum tempo.</string> +\nNote que esta ação vai recomeçar o app e pode levar algum tempo.</string> <string name="room_event_action_cancel_upload">Cancelar Upload</string> <string name="room_event_action_cancel_download">Cancelar Download</string> <!-- Search --> <string name="search_hint">Pesquisar</string> - <string name="search_members_hint">Filtrar membros da sala</string> + <string name="search_members_hint">Filtrar membros de sala</string> <string name="search_no_results">Nenhum resultado</string> <string name="tab_title_search_rooms">SALAS</string> <string name="tab_title_search_messages">MENSAGENS</string> @@ -624,7 +624,7 @@ <string name="room_recents_create_room">Criar sala</string> <string name="room_recents_join_room">Juntar-se a sala</string> <string name="room_recents_join_room_title">Juntar-se a uma sala</string> - <string name="room_recents_join_room_prompt">Digite um id de sala ou um alias de sala</string> + <string name="room_recents_join_room_prompt">Digite uma id de sala ou um alias de sala</string> <!-- Directory --> <string name="directory_search_results_title">Navegar diretório</string> <string name="directory_searching_title">Pesquisando diretório…</string> @@ -697,7 +697,7 @@ <string name="devices_delete_pswd">Senha:</string> <string name="devices_delete_submit_button_label">Submeter</string> <string name="settings_logged_in">Feito login como</string> - <string name="settings_home_server">Servidor de Casa</string> + <string name="settings_home_server">Servidorcasa</string> <string name="settings_identity_server">Servidor de Identidade</string> <string name="account_email_validation_title">Verificação Pendente</string> <string name="account_email_validation_message">Por favor cheque seu email e clique no link que ele contém. Uma vez que isto for feito, clique em continuar.</string> @@ -709,13 +709,13 @@ <string name="settings_old_password">Senha atual</string> <string name="settings_new_password">Senha nova</string> <string name="settings_confirm_password">Confirmar senha nova</string> - <string name="settings_fail_to_update_password">Falha ao atualizar senha</string> + <string name="settings_fail_to_update_password">Falha para atualizar senha</string> <string name="settings_password_updated">Sua senha tem sido atualizada</string> <string name="settings_unignore_user">Mostrar todas as mensagens de %s\? \n -\nNote que esta ação vai reiniciar o app e pode levar algum tempo.</string> - <string name="settings_delete_notification_targets_confirmation">Você tem certeza que quer remover este alvo de notificação\?</string> - <string name="settings_delete_threepid_confirmation">Você tem certeza que quer remover o %1$s %2$s\?</string> +\nNote que esta ação vai recomeçar o app e pode levar algum tempo.</string> + <string name="settings_delete_notification_targets_confirmation">Você tem certeza que você quer remover este alvo de notificação\?</string> + <string name="settings_delete_threepid_confirmation">Você tem certeza que você quer remover o %1$s %2$s\?</string> <string name="settings_select_country">Escolha um país</string> <string name="settings_phone_number_country_label">País</string> <string name="settings_phone_number_country_error">Por favor escolha um país</string> @@ -729,7 +729,7 @@ <!-- Room Settings --> <!-- room global settings--> <string name="room_settings_room_photo">Foto da Sala</string> - <string name="room_settings_room_name">Nome da Sala</string> + <string name="room_settings_room_name">Nome de Sala</string> <string name="room_settings_topic">Tópico</string> <string name="room_settings_room_tag">Etiqueta da Sala</string> <string name="room_settings_tag_pref_dialog_title">Etiquetada como:</string> @@ -741,19 +741,19 @@ <string name="room_settings_category_access_visibility_title">Acesso e visibilidade</string> <string name="room_settings_directory_visibility">Listar esta sala em diretório de salas</string> <string name="room_settings_room_access_rules_pref_title">Acesso a Sala</string> - <string name="room_settings_room_read_history_rules_pref_title">Legibilidade de Histórico da Sala</string> + <string name="room_settings_room_read_history_rules_pref_title">Legibilidade de Histórico de Sala</string> <string name="room_settings_room_read_history_rules_pref_dialog_title">Quem pode ler o histórico\?</string> <string name="room_settings_room_access_rules_pref_dialog_title">Quem pode acessar esta sala?</string> <!-- Room settings, access and visibility : WHO CAN READ HISTORY? (read rule) --> <string name="room_settings_read_history_entry_anyone">Qualquer pessoa</string> - <string name="room_settings_read_history_entry_members_only_option_time_shared">Membros somente (desde o ponto no tempo de selecionar esta opção)</string> + <string name="room_settings_read_history_entry_members_only_option_time_shared">Membros somente (desde o ponto no tempo de seleção desta opção)</string> <string name="room_settings_read_history_entry_members_only_invited">Membros somente (desde que eles foram convidados)</string> <string name="room_settings_read_history_entry_members_only_joined">Membros somente (desde que eles se juntaram)</string> <!-- Room settings: "Who can access this room?" (access rule) --> <string name="room_settings_room_access_warning">Para linkar a uma sala ela deve ter um endereço.</string> <string name="room_settings_room_access_entry_only_invited">Somente pessoas que têm sido convidadas</string> - <string name="room_settings_room_access_entry_anyone_with_link_apart_guest">Qualquer pessoa que saiba o link da sala, exceto visitantes</string> - <string name="room_settings_room_access_entry_anyone_with_link_including_guest">Qualquer pessoa que saiba o link da sala, incluindo visitantes</string> + <string name="room_settings_room_access_entry_anyone_with_link_apart_guest">Qualquer pessoa que sabe o link da sala, a parte de visitantes</string> + <string name="room_settings_room_access_entry_anyone_with_link_including_guest">Qualquer pessoa que sabe o link da sala, incluindo visitantes</string> <!-- Room settings: banned users --> <string name="room_settings_banned_users_title">Usuárias(os) banidas(os)</string> <!-- advanced --> @@ -777,41 +777,41 @@ <string name="room_settings_set_main_address">Definir como endereço principal</string> <string name="room_settings_unset_main_address">Des-definir como endereço principal</string> <string name="room_settings_copy_room_id">Copiar ID de Sala</string> - <string name="room_settings_copy_room_address">Copiar Endereço da Sala</string> + <string name="room_settings_copy_room_address">Copiar Endereço de Sala</string> <string name="room_settings_addresses_e2e_enabled">Encriptação está ativada nesta sala.</string> <string name="room_settings_addresses_e2e_disabled">Encriptação está desativada nesta sala.</string> <string name="room_settings_addresses_e2e_encryption_warning">Ativar encriptação -\n(atenção: não pode ser desativado de novo!)</string> +\n(aviso: não pode ser desativada de novo!)</string> <!-- Directory --> <string name="directory_title">Diretório</string> <!-- matrix error --> <string name="failed_to_load_timeline_position">%s estava tentando carregar um ponto específico na timeline desta sala mas foi incapaz de encontrá-lo.</string> <!-- encryption dialog --> <string name="encryption_information_title">Informação de encriptação ponta-a-ponta</string> - <string name="encryption_information_device_info">Informação do evento</string> + <string name="encryption_information_device_info">Informação de evento</string> <string name="encryption_information_user_id">Id de usuária(o)</string> <string name="encryption_information_curve25519_identity_key">Chave de identidade Curve25519</string> <string name="encryption_information_claimed_ed25519_fingerprint_key">Chave de impressão digital Ed25519 clamada</string> <string name="encryption_information_algorithm">Algoritmo</string> <string name="encryption_information_session_id">ID de Sessão</string> <string name="encryption_information_decryption_error">Erro de decriptação</string> - <string name="encryption_information_sender_device_information">Informação de sessão do(a) enviador(a)</string> + <string name="encryption_information_sender_device_information">Informação de sessão do/da enviador(a)</string> <string name="encryption_information_device_name">Nome público</string> <string name="encryption_information_name">Nome público</string> <string name="encryption_information_device_id">ID de sessão</string> - <string name="encryption_information_device_key">Chave da sessão</string> + <string name="encryption_information_device_key">Chave de sessão</string> <string name="encryption_information_verification">Verificação</string> <string name="encryption_information_ed25519_fingerprint">Impressão digital Ed25519</string> - <string name="encryption_export_e2e_room_keys">Exportar chaves de sala PAP</string> + <string name="encryption_export_e2e_room_keys">Exportar chaves de sala E2E</string> <string name="encryption_export_room_keys">Exportar chaves de sala</string> <string name="encryption_export_room_keys_summary">Exportar as chaves para um arquivo local</string> <string name="encryption_export_export">Exportar</string> <string name="passphrase_enter_passphrase">Entrar frasepasse</string> <string name="passphrase_confirm_passphrase">Confirmar frasepasse</string> - <string name="encryption_export_saved_as">As chaves de sala PAP têm sido salvas em \'%s\'. + <string name="encryption_export_saved_as">As chaves de sala E2E têm sido salvas em \'%s\'. \n \nAviso: este arquivo pode ser deletado se o aplicativo for desinstalado.</string> - <string name="encryption_import_e2e_room_keys">Importar chaves de sala PAP</string> + <string name="encryption_import_e2e_room_keys">Importar chaves de sala E2E</string> <string name="encryption_import_room_keys">Importar chaves de sala</string> <string name="encryption_import_room_keys_summary">Importar as chaves de um arquivo local</string> <string name="encryption_import_import">Importar</string> @@ -828,27 +828,27 @@ <string name="encryption_information_unblock">Retirar da lista negra</string> <string name="encryption_information_verify_device">Verificar sessão</string> <string name="encryption_information_verify_device_warning">Confirme ao comparar o seguinte com as Configurações de Usuária(o) em sua outra sessão:</string> - <string name="encryption_information_verify_device_warning2">Se não baterem, a segurança de sua comunicação pode estar comprometida.</string> - <string name="encryption_information_verify_key_match">Eu verifico que as chaves batem</string> + <string name="encryption_information_verify_device_warning2">Se não corresponderem, a segurança de sua comunicação pode estar comprometida.</string> + <string name="encryption_information_verify_key_match">Eu verifico que as chaves correspondem</string> <!-- unknown devices management --> <string name="unknown_devices_alert_title">Sala contém sessões desconhecidas</string> <string name="unknown_devices_alert_message">Esta sala contém sessões desconhecidas que não têm sido verificadas. -\nIsto significa que não há nenhuma garantia que as sessões pertencem às(aos) usuárias(os) às(aos) quais elas clamam pertencer. +\nIsto significa que não há nenhuma garantia que as sessões pertencem às/aos usuárias(os) às/aos quais elas clamam pertencer. \nNós recomendamos que você passe pelo processo de verificação para cada sessão antes de continuar, mas você pode reenviar a mensagem sem verificar se você preferir. \n \nSessões desconhecidas:</string> <!-- directory activity --> - <string name="select_room_directory">Selecione um diretório de salas</string> + <string name="select_room_directory">Selecionar um diretório de salas</string> <string name="directory_server_fail_to_retrieve_server">O servidor pode estar indisponível ou sobrecarregado</string> - <string name="directory_server_type_homeserver">Digite um servidor de casa para de onde listar salas públicas</string> - <string name="directory_server_placeholder">URL de servidorcasa</string> + <string name="directory_server_type_homeserver">Digite um servidorcasa para de onde listar salas públicas</string> + <string name="directory_server_placeholder">Nome de servidor</string> <string name="directory_server_all_rooms_on_server">Todas as salas em servidor %s</string> <string name="directory_server_native_rooms">Todas as salas nativas de %s</string> <!-- historical --> <string name="historical_placeholder">Pesquisar por histórico</string> <string name="offline">Offline</string> - <string name="user_directory_header">Diretório de usuários</string> - <string name="people_search_user_directory">DIRETÓRIO DE USUÁRIOS (%s)</string> + <string name="user_directory_header">Diretório de usuárias(os)</string> + <string name="people_search_user_directory">DIRETÓRIO DE USUÁRIAS(OS) (%s)</string> <string name="settings_start_on_boot">Começar em boot</string> <string name="settings_clear_media_cache">Limpar cache de mídia</string> <string name="settings_keep_media">Manter mídia</string> @@ -862,7 +862,7 @@ <string name="media_saving_period_1_month">1 mês</string> <string name="media_saving_period_forever">Para sempre</string> <string name="settings_theme">Tema</string> - <string name="font_size">Tamanho da fonte</string> + <string name="font_size">Tamanho de fonte</string> <string name="tiny">Minúsculo</string> <string name="small">Pequeno</string> <string name="normal">Normal</string> @@ -878,7 +878,7 @@ <string name="notification_noisy_notifications">Notificações barulhentas</string> <string name="notification_silent_notifications">Notificações silenciosas</string> <string name="title_activity_bug_report">Reporte de bug</string> - <string name="title_activity_group_details">Detalhes de Comunidade</string> + <string name="title_activity_group_details">Detalhes de comunidade</string> <string name="loading">Carregando…</string> <string name="action_exit">Sair</string> <string name="bottom_action_groups">Comunidades</string> @@ -886,25 +886,25 @@ <string name="groups_invite_header">Convidar</string> <string name="groups_header">Comunidades</string> <string name="no_group_placeholder">Nenhum grupo</string> - <string name="start_new_chat_prompt_msg">Você tem certeza que quer começar um novo chat com %s\?</string> - <string name="start_voice_call_prompt_msg">Você tem certeza que quer começar uma chamada de voz\?</string> - <string name="start_video_call_prompt_msg">Você tem certeza que quer começar uma chamada de vídeo\?</string> + <string name="start_new_chat_prompt_msg">Você tem certeza que você quer começar um novo chat com %s\?</string> + <string name="start_voice_call_prompt_msg">Você tem certeza que você quer começar uma chamada de voz\?</string> + <string name="start_video_call_prompt_msg">Você tem certeza que você quer começar uma chamada de vídeo\?</string> <string name="option_take_photo">Tirar foto</string> <string name="option_take_video">Tirar vídeo</string> <string name="groups_list">Lista de Grupos</string> <string name="call">Chamar</string> <string name="room_participants_ban_prompt_msg">Banir usuária(o) vai expulsá-la(o) desta sala e preveni-la(o) de se juntar de novo.</string> - <string name="room_settings_all_messages_noisy">Todas as mensagens (barulhento)</string> + <string name="room_settings_all_messages_noisy">Todas as mensagens (barulhentas)</string> <string name="room_settings_all_messages">Todas as mensagens</string> <string name="room_settings_mention_only">Menções somente</string> <string name="room_settings_mute">Mudo</string> <string name="room_settings_add_homescreen_shortcut">Adicionar a tela de Início</string> <string name="settings_notification_ringtone">Som de notificação</string> <string name="settings_containing_my_display_name">Mnsgns contendo meu nome de exibição</string> - <string name="settings_containing_my_user_name">Mnsgns contando meu nome de usuário</string> + <string name="settings_containing_my_user_name">Mnsgns contendo meu nome de usuária(o)</string> <string name="settings_inline_url_preview">Previsualização de URL emlinha</string> <string name="settings_12_24_timestamps">Mostrar timestamps em formato de 12 horas</string> - <string name="settings_vibrate_on_mention">Vibrar ao mencionar um(a) usuário(a)</string> + <string name="settings_vibrate_on_mention">Vibrar ao mencionar um/uma usuário(a)</string> <string name="settings_analytics">Analítica</string> <string name="settings_flair">Flair</string> <string name="room_settings_room_notifications_title">Notificações</string> @@ -915,10 +915,10 @@ <string name="widget_no_power_to_manage">Você precisa de permissão para gerenciar widgets nesta sala</string> <string name="widget_creation_failure">Criação de widget tem falhado</string> <string name="settings_labs_create_conference_with_jitsi">Criar chamadas de conferência com jitsi</string> - <string name="widget_delete_message_confirmation">Você tem certeza que quer deletar o widget desta sala\?</string> + <string name="widget_delete_message_confirmation">Você tem certeza que você quer deletar o widget desta sala\?</string> <!-- Widget Integration Manager --> <string name="widget_integration_unable_to_create">Incapaz de criar widget.</string> - <string name="widget_integration_failed_to_send_request">Falha ao enviar requisição.</string> + <string name="widget_integration_failed_to_send_request">Falha para enviar requisição.</string> <string name="widget_integration_positive_power_level">Nível de poder deve ser um inteiro positivo.</string> <string name="widget_integration_must_be_in_room">Você não está nesta sala.</string> <string name="widget_integration_no_permission_in_room">Você não tem permissão para fazer isso nesta sala.</string> @@ -960,7 +960,7 @@ <string name="invited">Convidada(o)</string> <string name="filter_group_members">Filtrar membros do grupo</string> <string name="filter_group_rooms">Filtrar salas do grupo</string> - <string name="group_no_long_description">O(a) administrador(a) da comunidade não tem provido uma descrição longa para esta comunidade.</string> + <string name="group_no_long_description">O/a admin de comunidade não tem provido uma descrição longa para esta comunidade.</string> <string name="has_been_kicked">Você foi expulsa(o) de %1$s por %2$s</string> <string name="has_been_banned">Você foi banida(o) de %1$s por %2$s</string> <string name="reason_colon">Razão: %1$s</string> @@ -1033,7 +1033,7 @@ \n \nAdicionar alguns agora\?</string> <string name="go_on_with">continuar com…</string> - <string name="error_no_external_application_found">Desculpe, nenhum aplicativo externo foi encontrado para completar esta ação.</string> + <string name="error_no_external_application_found">Desculpe, nenhum aplicativo externo tem sido encontrado para completar esta ação.</string> <string name="e2e_re_request_encryption_key">Re-requisitar chaves de encriptação de suas outras sessões.</string> <string name="e2e_re_request_encryption_key_sent">Requisição de chave enviada.</string> <string name="e2e_re_request_encryption_key_dialog_title">Requisição enviada</string> @@ -1068,7 +1068,7 @@ <string name="settings_notification_privacy">Privacidade de notificações</string> <string name="settings_notification_privacy_fcm">• Notificações são enviadas via Firebase Cloud Messaging</string> <string name="settings_notification_privacy_metadata">• Notificações somente contêm meta dados</string> - <string name="settings_notification_privacy_secure_message_content">• Conteúdo de mensagem da notificação é <b>localizado seguramente direto do servidor de casa de Matrix</b></string> + <string name="settings_notification_privacy_secure_message_content">• Conteúdo de mensagem da notificação é <b>localizado seguramente direto do servidorcasa Matrix</b></string> <string name="settings_notification_privacy_nosecure_message_content">• Notificações contêm <b>metadados e dados de mensagem</b></string> <string name="settings_notification_privacy_message_content_not_shown">• Notificações <b>não vão mostrar conteúdo de mensagem</b></string> <string name="settings_preview_media_before_sending">Previsualizar mídia antes de enviar</string> @@ -1091,7 +1091,7 @@ <string name="command_description_emote">Exibe ação</string> <string name="command_description_ban_user">Bane usuária(o) com id dada</string> <string name="command_description_unban_user">Desbane usuária(o) com id dada</string> - <string name="command_description_op_user">Define nível de poder de um(a) usuário(a)</string> + <string name="command_description_op_user">Define nível de poder de um/uma usuário(a)</string> <string name="command_description_deop_user">Desopa usuária(o) com id dada</string> <string name="command_description_invite_user">Convida usuária(o) com id dada para esta sala</string> <string name="command_description_join_room">Junta-se a sala com alias dado</string> @@ -1112,12 +1112,12 @@ <string name="dialog_user_consent_content">Para continuar usando o servidorcasa %1$s você deve revisar e aceitar os termos e condições.</string> <string name="dialog_user_consent_submit">Revisar agora</string> <string name="deactivate_account_title">Desativar Conta</string> - <string name="deactivate_account_content">Isto vai fazer sua conta permanentemente inusável. Você não vai ser capaz de fazer login, e ninguém vai poder re-registrar o mesmo ID de usuária(o). Isto vai causar sua conta sair de todas as salas em que ela está participando, e vai remover detalhes de sua conta de seu servidor de identidade. <b>Esta ação é irreversível</b>. + <string name="deactivate_account_content">Isto vai fazer sua conta permanentemente inusável. Você não vai ser capaz de fazer login, e ninguém vai ser capaz de re-registrar a mesma ID de usuária(o). Isto vai causar sua conta sair de todas as salas em que ela está participando, e vai remover detalhes de sua conta de seu servidor de identidade. <b>Esta ação é irreversível</b>. \n -\nDesativar sua conta <b>não nos causa por padrão esquecer mensagens que você tem enviado</b>. Se você gostaria que nós esqueçamos suas mensagens, por favor marque a caixa abaixo. +\nDesativar sua conta <b>não nos causa por default esquecer mensagens que você tem enviado</b>. Se você gostaria que nós esqueçamos suas mensagens, por favor marque a caixa abaixo. \n \nVisibilidade de mensagem em Matrix é similar a email. Nós esquecermos suas mensagens significa que mensagens que você tem enviado não vão ser compartilhadas com nenhum usuária(o) nova(o) ou não-registrada(o), mas usuárias(os) registradas(os) que já têm acesso a estas mensagens vão ainda ter acesso à cópia delas(es).</string> - <string name="deactivate_account_delete_checkbox">Por favor esqueça todas as mensagens que eu tenho enviado quando minha conta for desativada (Aviso: isto vai causar usuárias/os futuras/os terem uma visão incompleta de conversas)</string> + <string name="deactivate_account_delete_checkbox">Por favor esqueça todas as mensagens que eu tenho enviado quando minha conta for desativada (Aviso: isto vai causar usuárias/os futuras/os terem uma visualização incompleta de conversas)</string> <string name="deactivate_account_prompt_password">Para continuar, por favor entre sua senha:</string> <string name="deactivate_account_submit">Desativar Conta</string> <string name="error_empty_field_your_password">Por favor entre sua senha.</string> @@ -1127,21 +1127,21 @@ <string name="room_tombstone_predecessor_link">Clique aqui para ver mensagens mais antigas</string> <string name="resource_limit_exceeded_title">Limite de Recurso Excedido</string> <string name="resource_limit_contact_action">Contactar Administrador(a)</string> - <string name="resource_limit_contact_admin">contacte o(a) administrador(a) de seu serviço</string> + <string name="resource_limit_contact_admin">contacte o/a administrador(a) de seu serviço</string> <string name="resource_limit_soft_default">Este servidorcasa tem excedido um de seus limites de recurso, então <b>algumas(ns) usuária(os) não vão ser capazes de fazer login</b>.</string> <string name="resource_limit_hard_default">Este servidorcasa tem excedido um de seus limites de recurso.</string> - <string name="resource_limit_soft_mau"> Este servidorcasa tem atingido seu limite de Usuárias(os) Mensalmente Ativos então <b>algumas(ns) usuárias(os) não vão ser capazes de fazer login</b>.</string> + <string name="resource_limit_soft_mau"> Este servidorcasa tem atingido seu limite de Usuárias(os) Mensalmente Ativas(os) então <b>algumas(ns) usuárias(os) não vão ser capazes de fazer login</b>.</string> <string name="resource_limit_hard_mau">Este servidorcasa tem atingido seu limite de Usuárias(os) Mensalmente Ativas(os).</string> <string name="resource_limit_soft_contact">Por favor %s para ter este limite aumentado.</string> <string name="resource_limit_hard_contact">Por favor %s para continuar usando este serviço.</string> <string name="encryption_export_notice">Por favor crie uma frasepasse para encriptar as chaves exportadas. Você vai precisar entrar a mesma frasepasse para ser capaz de importar as chaves.</string> <string name="accept">Aceitar</string> <string name="dialog_title_error">Erro</string> - <string name="auth_accept_policies">Por favor revise e aceite as políticas deste servidor de casa:</string> + <string name="auth_accept_policies">Por favor revise e aceite as políticas deste servidorcasa:</string> <string name="settings_call_category">Chamadas</string> <string name="template_settings_call_ringtone_use_app_ringtone">Usar toque default de ${app_name} para chamadas recebendo</string> <string name="settings_call_ringtone_title">Toque de chamada recebendo</string> - <string name="settings_call_ringtone_dialog_title">Selecione toque para chamadas:</string> + <string name="settings_call_ringtone_dialog_title">Selecionar toque para chamadas:</string> <string name="reason_hint">Razão</string> <string name="room_sliding_menu_version_x">Versão %s</string> <string name="settings_notification_troubleshoot">Resolver Problemas de Notificação</string> @@ -1176,22 +1176,22 @@ <string name="settings_troubleshoot_test_fcm_success">Token FCM recuperado com sucesso: \n%1$s</string> <string name="call_anyway">Ligar Mesmo Assim</string> - <string name="settings_troubleshoot_test_fcm_failed">Falha ao recuperar token do FCM: + <string name="settings_troubleshoot_test_fcm_failed">Falha para recuperar token do FCM: \n%1$s</string> <string name="settings_troubleshoot_test_token_registration_title">Registro de Token</string> <string name="settings_troubleshoot_test_token_registration_success">Token FCM registrado com sucesso a ServidorCasa.</string> - <string name="settings_troubleshoot_test_token_registration_failed">Falha ao registrar token FCM a ServidorCasa: + <string name="settings_troubleshoot_test_token_registration_failed">Falha para registrar token FCM a ServidorCasa: \n%1$s</string> <string name="settings_troubleshoot_test_foreground_service_started_title">Serviço de Notificações</string> <string name="settings_troubleshoot_test_foreground_service_startedt_success">Serviço de Notificações está rodando.</string> <string name="settings_troubleshoot_test_foreground_service_started_failed">Serviço de Notificações não está rodando. -\nTente reiniciar o aplicativo.</string> +\nTente recomeçar o aplicativo.</string> <string name="settings_troubleshoot_test_foreground_service_started_quickfix">Começar Serviço</string> <string name="settings_troubleshoot_test_service_restart_success">Serviço foi matado e reiniciado automaticamente.</string> - <string name="settings_troubleshoot_test_service_restart_failed">Falha ao reiniciar serviço</string> + <string name="settings_troubleshoot_test_service_restart_failed">Serviço falhou para recomeçar</string> <string name="settings_troubleshoot_test_service_boot_title">Começar em boot</string> <string name="settings_troubleshoot_test_service_boot_success">Serviço vai começar quando o dispositivo for reiniciado.</string> - <string name="template_settings_troubleshoot_test_service_boot_failed">Serviço não vai começar quando o dispositivo for reiniciado, você não vai receber notificações até que ${app_name} tenha sido aberto uma vez.</string> + <string name="template_settings_troubleshoot_test_service_boot_failed">O serviço não vai começar quando o dispositivo for recomeçado, você não vai receber notificações até que ${app_name} tenha sido aberto uma vez.</string> <string name="settings_troubleshoot_test_service_boot_quickfix">Ativar Começar em boot</string> <string name="settings_troubleshoot_test_bg_restricted_title">Checar restrições de background</string> <string name="settings_troubleshoot_test_battery_title">Otimização de Bateria</string> @@ -1199,25 +1199,25 @@ <string name="settings_troubleshoot_test_service_restart_title">Auto-Reinício de Serviço de Notificações</string> <string name="settings_troubleshoot_test_bg_restricted_quickfix">Desativar restrições</string> <string name="settings_troubleshoot_test_battery_quickfix">Ignorar Otimização</string> - <string name="settings_inline_url_preview_summary">Previsualize links dentro do chat quando seu servidor de casa suporta este recurso.</string> + <string name="settings_inline_url_preview_summary">Previsualizar links dentro do chat quando seu servidorcasa suporta este recurso.</string> <string name="settings_send_typing_notifs">Enviar notificações de digitação</string> - <string name="settings_send_typing_notifs_summary">Deixe outras(os) usuárias(os) saberem quando você está digitando.</string> + <string name="settings_send_typing_notifs_summary">Deixar outras(os) usuárias(os) saberem que você está digitando.</string> <string name="settings_show_read_receipts">Mostrar recibos de leitura</string> - <string name="settings_show_read_receipts_summary">Clique nos recibos de leitura para uma lista detalhada.</string> + <string name="settings_show_read_receipts_summary">Clicar nos recibos de leitura para uma lista detalhada.</string> <string name="settings_show_join_leave_messages">Mostrar eventos de juntar-se e sair</string> <string name="settings_show_join_leave_messages_summary">Convites, expulsões e bans são desafetados.</string> <string name="settings_show_avatar_display_name_changes_messages">Mostrar eventos de conta</string> <string name="settings_show_avatar_display_name_changes_messages_summary">Inclui mudanças de avatar e nome de exibição.</string> <string name="startup_notification_fdroid_battery_optim_title">Conexão no Background</string> <string name="template_startup_notification_fdroid_battery_optim_message">${app_name} precisa manter uma conexão no background de baixo impacto a fim de ter notificações confiáveis. -\nNa próxima tela você vai ser instigado a permitir que o ${app_name} rode sempre em background, por favor aceite.</string> +\nNa próxima tela você vai ser instigado a permitir ${app_name} sempre rodar em background, por favor aceite.</string> <string name="template_settings_troubleshoot_test_bg_restricted_success">Restrições de background estão desativadas para ${app_name}. Este teste devia ser rodado usando dados móveis (sem Wi-Fi). \n%1$s</string> <string name="template_settings_troubleshoot_test_bg_restricted_failed">Restrições de background estão ativadas para ${app_name}. -\nTrabalho que o app tenta fazer vai ser agressivamente restringido enquando ele está em background, e isto pode afetar notificações. +\nTrabalho que o app tenta fazer vai ser agressivamente restringido enquando ele está no background, e isto poderia afetar notificações. \n%1$s</string> - <string name="settings_send_markdown">Formatação Markdown</string> - <string name="settings_send_markdown_summary">Formate mensagens usando sintaxe markdown antes que elas são enviadas. Isto permite formatação avançada tal como usar asteriscos para exibir texto itálico.</string> + <string name="settings_send_markdown">Formatação markdown</string> + <string name="settings_send_markdown_summary">Formatar mensagens usando sintaxe markdown antes que elas são enviadas. Isto permite formatação avançada tal como usar asteriscos para exibir texto itálico.</string> <string name="startup_notification_fdroid_battery_optim_button_grant">Conceder permissão</string> <string name="account_email_error">Um erro ocorreu enquanto verificando seu endereço de email.</string> <string name="settings_password">Senha</string> @@ -1242,21 +1242,21 @@ <string name="plus_x">+%d</string> <string name="x_plus">%d+</string> <string name="no_valid_google_play_services_apk">Nenhum APK de Google Play Services válido encontrado. Notificações podem não funcionar apropriadamente.</string> - <string name="settings_troubleshoot_test_battery_failed">Se um(a) usuário(a) deixa um dispositivo fora do plug e parado por um período de tempo, com a tela desligada, o aparelho entra em modo Doze. Isto previne apps de acessar a rede e adiar seus trabalhos, sincs e alarmes padrões.</string> + <string name="settings_troubleshoot_test_battery_failed">Se um/uma usuário(a) deixa um dispositivo despluggado e parado por um período de tempo, com a tela desligada, o dispositivo entra em modo Doze. Isto previne apps de acessar a rede e adia seus trabalhos, sincs e alarmes padrões.</string> <string name="passphrase_create_passphrase">Criar frasepasse</string> - <string name="passphrase_passphrase_does_not_match">Frasepasse não bate</string> - <string name="settings_lazy_loading_title">Carregar preguiçoso membros das salas</string> + <string name="passphrase_passphrase_does_not_match">Frasepasse não corresponde</string> + <string name="settings_lazy_loading_title">Carregar preguiçoso membros de salas</string> <string name="video_call_in_progress">Chamada de Vídeo em Progresso…</string> <string name="title_activity_keys_backup_setup">Backup de Chave</string> <string name="title_activity_keys_backup_restore">Usar Backup de Chave</string> - <string name="keys_backup_is_not_finished_please_wait">Backup de chaves não está terminado, por favor espere…</string> + <string name="keys_backup_is_not_finished_please_wait">Backup de chaves não está finalizado, por favor espere…</string> <string name="sign_out_bottom_sheet_warning_no_backup">Você vai perder suas mensagens encriptadas se fizer signout agora</string> <string name="sign_out_bottom_sheet_warning_backing_up">Backup de chave em progresso. Se você fizer signout agora você vai perder acesso a suas mensagens encriptadas.</string> <string name="sign_out_bottom_sheet_warning_backup_not_active">Backup de Chave Seguro devia estar ativo em todas as suas sessões para evitar perder o acesso a suas mensagens encriptadas.</string> <string name="sign_out_bottom_sheet_dont_want_secure_messages">Eu não quero minhas mensagens encriptadas</string> <string name="sign_out_bottom_sheet_backing_up_keys">Fazendo backup de chaves…</string> <string name="keys_backup_activate">Usar Backup de Chave</string> - <string name="are_you_sure">Tem certeza\?</string> + <string name="are_you_sure">Você tem certeza\?</string> <string name="backup">Fazer backup</string> <string name="sign_out_bottom_sheet_will_lose_secure_messages">Você vai perder acesso a suas mensagens encriptadas a menos que faça backup de suas chaves antes de fazer signout.</string> <string name="keys_backup_info_title_signature">Assinatura</string> @@ -1264,16 +1264,16 @@ <string name="skip">Pular</string> <string name="done">Feito</string> <string name="abort">Abortar</string> - <string name="action_sign_out_confirmation_simple">Você tem certeza que quer fazer sign out\?</string> + <string name="action_sign_out_confirmation_simple">Você tem certeza que você quer fazer sign out\?</string> <string name="settings_notification_advanced">Configurações de Notificações Avançadas</string> - <string name="settings_notification_by_event">Importância de notificações por evento</string> + <string name="settings_notification_by_event">Importância de notificação por evento</string> <string name="settings_troubleshoot_test_bing_settings_title">Configurações Personalizadas.</string> <string name="settings_troubleshoot_test_bing_settings_success_with_warn">Observe que alguns tipos de mensagens estão definidos para serem silenciosos (vão produzir uma notificação sem nenhum som).</string> <string name="settings_troubleshoot_test_bing_settings_failed">Algumas notificações estão desativadas em suas configurações personalizadas.</string> - <string name="settings_troubleshoot_test_bing_settings_failed_to_load_rules">Falha ao carregar regras personalizadas, por favor retente.</string> + <string name="settings_troubleshoot_test_bing_settings_failed_to_load_rules">Falha para carregar regras personalizadas, por favor retente.</string> <string name="settings_troubleshoot_test_bing_settings_quickfix">Checar Configurações</string> <string name="template_settings_troubleshoot_test_fcm_failed_too_many_registration">[%1$s] -\nEste erro está fora de controle de ${app_name} e de acordo com Google, este erro indica que o dispositivo tem apps demais registrados com FCM. O erro somente ocorre em casos onde há números extremos de apps, então isso não devia afetar a(o) usuária(o) média(o).</string> +\nEste erro está fora de controle de ${app_name} e de acordo com Google, este erro indica que o dispositivo tem apps demais registrados com FCM. O erro somente ocorre em casos onde há números extremos de apps, então isso não devia afetar a/o usuária(o) média(o).</string> <string name="ignore">Ignorar</string> <string name="auth_login_sso">Fazer sign-in com sign-on único</string> <string name="login_error_unknown_host">Este URL não é alcançável, por favor cheque-o</string> @@ -1298,21 +1298,21 @@ <string name="decline">Declinar</string> <string name="action_mark_room_read">Marcar como lida</string> <string name="people_no_identity_server">Nenhum servidor de identidade configurado.</string> - <string name="call_failed_no_ice_title">Chamada falhou devido a servidor configurado errado</string> + <string name="call_failed_no_ice_title">Chamada falhou devido a servidor malconfigurado</string> <string name="play_video">Tocar</string> <string name="pause_video">Pausar</string> <string name="dismiss">Descartar</string> <string name="action_copy">Copiar</string> <string name="dialog_title_success">Sucesso</string> <string name="bottom_action_notification">Notificações</string> - <string name="call_failed_no_ice_description">Por favor peça ao administrador do seu servidor de casa (%1$s) para confugurar um servidor TURN a fim que chamadas funcionem confiavelmente. + <string name="call_failed_no_ice_description">Por favor peça ao/à administrador(a) de seu servidorcasa (%1$s) para configurar um servidor TURN a fim que chamadas funcionem confiavelmente. \n -\nAlternativamente, você pode tentar usar o servidor público em %2$s, mas isto não vai set tão confiável, e ele vai compartilhar seu endereço de IP com esse servidor. Você também pode gerir isto em Configurações.</string> - <string name="call_failed_no_ice_use_alt">Tente usar %s</string> +\nAlternativamente, você pode tentar usar o servidor público em %2$s, mas isto não vai ser tão confiável, e vai compartilhar seu endereço de IP com esse servidor. Você também pode gerenciar isto em Configurações.</string> + <string name="call_failed_no_ice_use_alt">Tentar usar %s</string> <string name="call_failed_dont_ask_again">Não me pergunte de novo</string> <string name="template_call_failed_no_connection">Chamada ${app_name} Falhou</string> - <string name="call_failed_no_connection_description">Falha ao estabelecer conexão em tempo real. -\nPor favor peça ao administrador do seu servidor de casa para configurar um servidor TURN a fim que chamadas funcionem confiavelmente.</string> + <string name="call_failed_no_connection_description">Falha para estabelecer conexão em tempo real. +\nPor favor peça ao/à administrador(a) de seu servidorcasa para configurar um servidor TURN a fim que chamadas funcionem confiavelmente.</string> <string name="call_select_sound_device">Selecionar Dispositivo de Som</string> <string name="sound_device_phone">Celular</string> <string name="sound_device_speaker">Falante</string> @@ -1328,11 +1328,11 @@ <string name="auth_add_email_phone_message_2">Defina um email para recuperação de conta. Use mais tarde email ou telefone para ser opcionalmente descobertável por pessoas que conhecem você.</string> <string name="auth_add_email_and_phone_message_2">Defina um email para recuperação de conta. Use mais tarde email ou telefone para ser opcionalmente descobertável por pessoas que conhecem você.</string> <string name="login_error_no_homeserver_found">Isto não é um endereço de servidor Matrix válido</string> - <string name="login_error_homeserver_not_found">Não é possível alcançar um servidor de casa neste URL, por favor cheque-o</string> - <string name="login_error_ssl_peer_unverified">Erro de SSL: a identidade da(o) peer não tem sido verificada.</string> + <string name="login_error_homeserver_not_found">Não é possível alcançar um servidorcasa neste URL, por favor cheque-o</string> + <string name="login_error_ssl_peer_unverified">Erro de SSL: a identidade da/do peer não tem sido verificada.</string> <string name="login_error_ssl_other">Erro de SSL.</string> <string name="settings_call_ringtone_use_default_stun">Permitir servidor fallback de assistência de chamadas</string> - <string name="settings_call_ringtone_use_default_stun_sum">Vai usar %s como assistência quando seu servidor de casa não oferece um (seu endereço de IP vai ser compartilhado durante uma chamada)</string> + <string name="settings_call_ringtone_use_default_stun_sum">Vai usar %s como assistência quando seu servidorcasa não oferece um (seu endereço de IP vai ser compartilhado durante uma chamada)</string> <string name="active_call_with_duration">Chamada Ativa (%s)</string> <string name="return_to_call">Retornar a chamada</string> <string name="invite_no_identity_server_error">Adicione um servidor de identidade em suas configurações para performar esta ação.</string> @@ -1347,7 +1347,7 @@ <string name="room_participants_action_unignore_title">Designorar usuária(o)</string> <string name="room_participants_action_unignore_prompt_msg">Designorar esta(e) usuária(o) vai mostrar todas as mensagens dela(e) de novo.</string> <string name="room_participants_action_cancel_invite_title">Cancelar convite</string> - <string name="room_participants_action_cancel_invite_prompt_msg">Você tem certeza que quer cancelar o convite para esta(e) usuária(o)\?</string> + <string name="room_participants_action_cancel_invite_prompt_msg">Você tem certeza que você quer cancelar o convite para esta(e) usuária(o)\?</string> <string name="room_participants_kick_title">Expulsar usuária(o)</string> <string name="room_participants_kick_reason">Razão de expulsão</string> <string name="room_participants_kick_prompt_msg">expulsar usuária(o) vai removê-la(o) desta sala. @@ -1356,7 +1356,7 @@ <string name="room_participants_ban_title">Banir usuária(o)</string> <string name="room_participants_ban_reason">Razão de ban</string> <string name="room_participants_unban_title">Desbanir usuária(o)</string> - <string name="room_participants_unban_prompt_msg">Desbanir usuária(o) vai permitir que ela(e) se junte à sala de novo.</string> + <string name="room_participants_unban_prompt_msg">Desbanir usuária(o) vai permitir-lhe se juntar à sala de novo.</string> <string name="settings_add_3pid_confirm_password_title">Confirme sua senha</string> <string name="template_settings_add_3pid_flow_not_supported">Você não pode fazer isto de ${app_name} celular</string> <string name="settings_add_3pid_authentication_needed">Autenticação é requerida</string> @@ -1370,7 +1370,7 @@ \nIsto vai impactar uso de rádio e bateria, vai ter uma notificação permanente exibida declarando que ${app_name} está à escuta por eventos.</string> <string name="settings_background_fdroid_sync_mode_disabled">Sem sinc no background</string> <string name="settings_background_fdroid_sync_mode_disabled_description">Você não vai ser notificada(o) sobre mensagens recebendo quando o app está em background.</string> - <string name="settings_background_sync_update_error">Falha ao atualizar configurações.</string> + <string name="settings_background_sync_update_error">Falha para atualizar configurações.</string> <string name="settings_set_workmanager_delay">Intervalo de Sinc Preferido</string> <string name="settings_set_workmanager_delay_summary">%s \nA sinc pode ser adiada dependendo dos recursos (bateria) ou estado do dispositivo (sono).</string> @@ -1383,19 +1383,19 @@ <string name="settings_secure_backup_setup">Configurar Backup Seguro</string> <string name="settings_secure_backup_reset">Resettar Backup Seguro</string> <string name="settings_secure_backup_enter_to_setup">Configurar neste dispositivo</string> - <string name="settings_secure_backup_section_info">Salvaguarde-se contra perder acesso a mensagens & dados encriptados ao fazer backup de chaves de encriptação em seu servidor.</string> + <string name="settings_secure_backup_section_info">Salvaguardar-se contra perda de acesso a mensagens & dados encriptados ao fazer backup de chaves de encriptação em seu servidor.</string> <string name="reset_secure_backup_title">Gere uma nova Chave de Segurança ou defina uma nova Frase de Segurança para seu backup existente.</string> <string name="reset_secure_backup_warning">Isto vai substituir sua Chave ou Frase atual.</string> <string name="settings_discovery_category">Descoberta</string> <string name="settings_discovery_manage">Gerencie suas configurações de descoberta.</string> - <string name="settings_data_save_mode_summary">Modo de economia de dados aplica um filtro específico para que atualizações de presença e notificações de digitação sejam filtrados fora.</string> + <string name="settings_data_save_mode_summary">Modo de economia de dados aplica um filtro específico para que atualizações de presença e notificações de digitação sejam filtradas fora.</string> <string name="settings_integration_allow">Permitir integrações</string> <string name="settings_integration_manager">Gerenciador de Integração</string> <string name="disabled_integration_dialog_title">Integrações estão desativadas</string> <string name="disabled_integration_dialog_content">Ative \'Permitir integrações\' em Configurações para fazer isto.</string> <string name="settings_change_password_submit">Atualizar Senha</string> <string name="settings_fail_to_update_password_invalid_current_password">A senha não é válida</string> - <string name="passwords_do_not_match">Senhas não batem</string> + <string name="passwords_do_not_match">Senhas não correspondem</string> <string name="settings_media">Mídia</string> <string name="settings_default_compression">Compressão default</string> <string name="compression_opt_list_choose">Escolher</string> @@ -1410,7 +1410,7 @@ <string name="device_name_warning">O nome público de uma sessão é visível para pessoas com quem você se comunica</string> <string name="encryption_exported_successfully">Chaves exportadas com sucesso</string> <string name="encryption_message_recovery">Recuperação de Mensagens Encriptadas</string> - <string name="encryption_settings_manage_message_recovery_summary">Gerenciar Backup de Chaves</string> + <string name="encryption_settings_manage_message_recovery_summary">Gerenciar Backup de Chave</string> <string name="encryption_information_unknown_ip">ip desconhecido</string> <plurals name="notification_compat_summary_line_for_room"> <item quantity="one">%1$s: %2$d mensagem</item> @@ -1425,17 +1425,17 @@ <string name="notification_new_messages">Novas Mensagens</string> <string name="notification_new_invitation">Novo Convite</string> <string name="notification_sender_me">Eu</string> - <string name="notification_inline_reply_failed">** Não foi possível enviar - por favor abrir sala</string> + <string name="notification_inline_reply_failed">** Falha para enviar - por favor abra sala</string> <string name="notification_ticker_text_dm">%1$s: %2$s</string> <string name="notification_ticker_text_group">%1$s: %2$s %3$s</string> - <string name="active_widget_view_action">VISTA</string> + <string name="active_widget_view_action">VISUALIZAR</string> <string name="active_widgets_title">Widgets ativos</string> <string name="room_widget_activity_title">Widget</string> <string name="room_widget_permission_title">Carregar Widget</string> <string name="room_widget_permission_added_by">Este widget foi adicionado por:</string> <string name="room_widget_permission_webview_shared_info_title">Usá-lo pode definir cookies e compartilhar dados com %s:</string> <string name="room_widget_permission_shared_info_title">Usá-lo pode compartilhar dados com %s:</string> - <string name="room_widget_failed_to_load">Falha ao carregar widget. + <string name="room_widget_failed_to_load">Falha para carregar widget. \n%s</string> <string name="room_widget_reload">Recarregar widget</string> <string name="room_widget_open_in_browser">Abrir em browser</string> @@ -1456,11 +1456,11 @@ <string name="integration_manager_not_configured">Nenhum gerenciador de integração configurado.</string> <string name="widget_integration_review_terms">Para continuar você precisa aceitar os Termos deste serviço.</string> <string name="you_added_a_new_device_with_info">Uma nova sessão está requisitando chaves de encriptação. -\nNome da sessão: %1$s +\nNome de sessão: %1$s \nVisto por último: %2$s \nSe você não fez login numa outra sessão, ignore esta requisição.</string> <string name="your_unverified_device_requesting_with_info">Uma sessão não-verificada está requisitando chaves de encriptação. -\nNome da sessão: %1$s +\nNome de sessão: %1$s \nVisto por último: %2$s \nSe você não fez login numa outra sessão, ignore esta requisição.</string> <string name="start_verification_short_label">Verificar</string> @@ -1468,17 +1468,17 @@ <string name="key_share_request">Requisição de Compartilhamento de Chaves</string> <string name="ignore_request_short_label">Ignorar</string> <string name="notification_silent">Silenciosa</string> - <string name="error_empty_field_enter_user_name">Por favor entre um nome de usuário.</string> + <string name="error_empty_field_enter_user_name">Por favor entre um nome de usuária(o).</string> <string name="passphrase_empty_error_message">Por favor entre sua frasepasse</string> <string name="passphrase_passphrase_too_weak">Frasepasse é fraca demais</string> <string name="template_keys_backup_passphrase_not_empty_error_message">Por favor delete a frasepasse se quiser que ${app_name} gere uma chave de recuperação.</string> <string name="keys_backup_no_session_error">Nenhuma sessão Matrix disponível</string> <string name="keys_backup_setup_step1_title">Nunca perca mensagens encriptadas</string> - <string name="keys_backup_setup_step1_description">Mensagens em salas encriptadas são asseguradas com a encriptação ponta-a-ponta. Somente você e a/o(s) recipiente(s) têm as chaves para ler estas mensagens. + <string name="keys_backup_setup_step1_description">Mensagens em salas encriptadas são asseguradas com encriptação ponta-a-ponta. Somente você e a(s)/o(s) recipiente(s) têm as chaves para ler estas mensagens. \n \nFaça seguramente backup de suas chaves para evitar perdê-las.</string> - <string name="keys_backup_setup">Começar a usar Backup de Chaves</string> - <string name="keys_backup_setup_step1_advanced">(Avançado)</string> + <string name="keys_backup_setup">Começar a usar Backup de Chave</string> + <string name="keys_backup_setup_step1_advanced">(Avançada)</string> <string name="keys_backup_setup_step1_manual_export">Exportar chaves manualmente</string> <string name="keys_backup_setup_step2_text_title">Assegure seu backup com uma Frasepasse.</string> <string name="keys_backup_setup_step2_text_description">Nós vamos armazenar uma cópia encriptada de suas chaves em seu servidorcasa. Proteja seu backup com uma frasepasse para mantê-lo seguro. @@ -1487,23 +1487,23 @@ <string name="keys_backup_setup_step2_button_title">Definir Frasepasse</string> <string name="keys_backup_setup_creating_backup">Criando Backup</string> <string name="keys_backup_setup_step1_recovery_key_alternative">Ou, assegure seu backup com uma Chave de Recuperação, salvando-a em algum lugar seguro.</string> - <string name="keys_backup_setup_step2_skip_button_title">(Avançado) Configurar com Chave de Recuperação</string> + <string name="keys_backup_setup_step2_skip_button_title">(Avançada) Configurar com Chave de Recuperação</string> <string name="keys_backup_setup_step3_success_title">Sucesso !</string> <string name="keys_backup_setup_step3_text_line1">Backup de suas chaves está sendo feito.</string> - <string name="keys_backup_setup_step3_text_line2">Sua chave de recuperação é uma rede de proteção - você pode usá-la para restaurar acesso a suas mensagens encriptadas se você esquecer sua frasepasse. -\nMantenha a sua chave de recuperação em algum lugar muito seguro, como um gerenciador de senhas (ou um cofre)</string> + <string name="keys_backup_setup_step3_text_line2">Sua chave de recuperação é uma rede de segurança - você pode usá-la para restaurar acesso a suas mensagens encriptadas se você esquecer sua frasepasse. +\nMantenha sua chave de recuperação em algum lugar muito seguro, como um gerenciador de senhas (ou um cofre)</string> <string name="keys_backup_setup_step3_text_line2_no_passphrase">Mantenha sua chave de recuperação em algum lugar muito seguro, como um gerenciador de senhas (ou um cofre)</string> <string name="keys_backup_setup_step3_button_title">Feito</string> <string name="keys_backup_setup_step3_button_title_no_passphrase">Eu tenho feito uma cópia</string> <string name="keys_backup_setup_step3_copy_button_title">Salvar Chave de Recuperação</string> <string name="keys_backup_setup_step3_share_recovery_file">Compartilhar</string> <string name="keys_backup_setup_step3_save_button_title">Salvar como Arquivo</string> - <string name="recovery_key_export_saved_as_warning">A chave de recuperação tem sido salva em \"%s\". + <string name="recovery_key_export_saved_as_warning">A chave de recuperação tem sido salva em \'%s\'. \n \nAviso: este arquivo pode ser deletado se o aplicativo for desinstalado.</string> <string name="recovery_key_export_saved">A chave de recuperação tem sido salva.</string> <string name="keys_backup_setup_override_backup_prompt_tile">Um backup já existe em seu ServidorCasa</string> - <string name="keys_backup_setup_override_backup_prompt_description">Parece que você já tem configurado um backup de chaves numa outra sessão. Você quer substituí-lo pelo que está criando\?</string> + <string name="keys_backup_setup_override_backup_prompt_description">Parece que você já tem configurado backup de chave de uma outra sessão. Você quer substituí-lo pelo que você está criando\?</string> <string name="keys_backup_setup_override_replace">Substituir</string> <string name="keys_backup_setup_override_stop">Parar</string> <string name="keys_backup_setup_step3_please_make_copy">Por favor faça uma cópia</string> @@ -1512,7 +1512,7 @@ <string name="recovery_key">Chave de Recuperação</string> <string name="unexpected_error">Erro inesperado</string> <string name="keys_backup_setup_backup_started_title">Backup Começado</string> - <string name="keys_backup_setup_backup_started_message">Backup de suas chaves está sendo feito. O backup inicial poderia levar muitos minutos.</string> + <string name="keys_backup_setup_backup_started_message">Backup de suas chaves de encriptação está agora sendo feito no background para seu servidorcasa. O backup inicial poderia levar muitos minutos.</string> <string name="keys_backup_setup_skip_title">Você tem certeza\?</string> <string name="keys_backup_setup_skip_msg">Você pode perder acesso a suas mensagens se você fizer logout ou perder este dispositivo.</string> <string name="keys_backup_restore_is_getting_backup_version">Obtendo versão de backup…</string> @@ -1541,593 +1541,593 @@ <item quantity="one">%d nova chave tem sido adicionada a esta sessão.</item> <item quantity="other">%d novas chaves têm sido adicionadas a esta sessão.</item> </plurals> - <string name="keys_backup_get_version_error">Não foi possível obter a versão mais recente das chaves de recuperação (%s).</string> - <string name="keys_backup_no_keysbackup_sdk_error">A sessão criptografada não está activa</string> - <string name="keys_backup_settings_restore_backup_button">Restaurar do backup</string> - <string name="keys_backup_settings_delete_backup_button">Remover backup</string> - <string name="keys_backup_settings_status_ok">O backup da chave foi configurado corretamente para esta sessão.</string> - <string name="keys_backup_settings_status_ko">O backup da chave não está configurado nesta sessão.</string> - <string name="keys_backup_settings_status_not_setup">O backup das suas chaves não está sendo feito nesta sessão.</string> - <string name="keys_backup_settings_signature_from_unknown_device">O backup tem uma assinatura de uma sessão desconhecida com ID %s.</string> - <string name="keys_backup_settings_valid_signature_from_this_device">O backup tem uma assinatura válida desta sessão.</string> - <string name="keys_backup_settings_valid_signature_from_verified_device">O backup tem uma assinatura válida da sessão confirmada %s.</string> - <string name="keys_backup_settings_valid_signature_from_unverified_device">O backup tem uma assinatura válida da sessão não confirmada %s</string> - <string name="keys_backup_settings_invalid_signature_from_verified_device">O backup tem uma assinatura inválida da sessão confirmada %s</string> - <string name="keys_backup_settings_invalid_signature_from_unverified_device">O backup tem uma assinatura inválida da sessão não confirmada %s</string> - <string name="keys_backup_get_trust_error">Não foi possível saber se o backup é confiável (%s).</string> - <string name="keys_backup_settings_untrusted_backup">Para usar o Backup de Chaves nesta sessão, restaure com a sua frase secreta ou chave de recuperação agora.</string> - <string name="keys_backup_settings_deleting_backup">Removendo o backup…</string> - <string name="keys_backup_settings_delete_backup_error">Não foi possível remover o backup (%s)</string> - <string name="keys_backup_settings_checking_backup_state">Verificando a situação do backup</string> - <string name="keys_backup_settings_delete_confirm_title">Remover backup</string> - <string name="keys_backup_settings_delete_confirm_message">Excluir as chaves de criptografia do servidor\? Você não será mais capaz de usar a sua chave de recuperação para ler o histórico de mensagens criptografadas.</string> - <string name="new_recovery_method_popup_title">Novo backup de chave</string> - <string name="new_recovery_method_popup_description">Foi detectado um novo backup de chave. -\n -\nSe você não definiu o novo método de recuperação, um invasor pode estar tentando acessar sua conta. Altere a senha da sua conta e defina um novo método de recuperação imediatamente nas Configurações.</string> + <string name="keys_backup_get_version_error">Falha para obter versão mais recente de chaves de recuperação (%s).</string> + <string name="keys_backup_no_keysbackup_sdk_error">A cripto de sessão não está ativada</string> + <string name="keys_backup_settings_restore_backup_button">Restaurar de Backup</string> + <string name="keys_backup_settings_delete_backup_button">Deletar Backup</string> + <string name="keys_backup_settings_status_ok">Backup de Chave tem sido corretamente configurado para esta sessão.</string> + <string name="keys_backup_settings_status_ko">Backup de Chave não está ativo nesta sessão.</string> + <string name="keys_backup_settings_status_not_setup">Backup de suas chaves não está sendo feito desta sessão.</string> + <string name="keys_backup_settings_signature_from_unknown_device">Backup tem uma assinatura de sessão desconhecida com ID %s.</string> + <string name="keys_backup_settings_valid_signature_from_this_device">Backup tem uma assinatura válida desta sessão.</string> + <string name="keys_backup_settings_valid_signature_from_verified_device">Backup tem uma assinatura válida de sessão verificada %s.</string> + <string name="keys_backup_settings_valid_signature_from_unverified_device">Backup tem uma assinatura válida de sessão não-verificada %s</string> + <string name="keys_backup_settings_invalid_signature_from_verified_device">Backup tem uma assinatura inválida de sessão verificada %s</string> + <string name="keys_backup_settings_invalid_signature_from_unverified_device">Backup tem uma assinatura inválida de sessão não-verificada %s</string> + <string name="keys_backup_get_trust_error">Falha para obter info de confiança para backup (%s).</string> + <string name="keys_backup_settings_untrusted_backup">Para usar Backup de Chave nesta sessão, restaure com sua frasepasse ou chave de recuperação agora.</string> + <string name="keys_backup_settings_deleting_backup">Deletando backup…</string> + <string name="keys_backup_settings_delete_backup_error">Falha para deletar backup (%s)</string> + <string name="keys_backup_settings_checking_backup_state">Checando estado de backup</string> + <string name="keys_backup_settings_delete_confirm_title">Deletar Backup</string> + <string name="keys_backup_settings_delete_confirm_message">Deletar suas chaves de encriptação, das quais foi feito backup, do servidor\? Você não vai ser mais capaz de usar sua chave de recuperação para ler histórico de mensagens encriptadas.</string> + <string name="new_recovery_method_popup_title">Novo Backup de Chave</string> + <string name="new_recovery_method_popup_description">Um novo backup de chave de mensagem segura tem sido detectado. +\n +\nSe você não definiu o novo método de recuperação, um atacante poderia estar tentando acessar sua conta. Mude a senha de sua conta e defina um novo método de recuperação imediatamente em Configurações.</string> <string name="new_recovery_method_popup_was_me">Foi eu</string> - <string name="keys_backup_banner_setup_line1">Nunca perca mensagens criptografadas</string> - <string name="keys_backup_banner_setup_line2">Comece a fazer o backup da chave</string> - <string name="secure_backup_banner_setup_line1">Backup online</string> - <string name="secure_backup_banner_setup_line2">Proteja-se contra a perda de acesso a mensagens e dados criptografados</string> - <string name="keys_backup_banner_recover_line1">Nunca perca mensagens criptografadas</string> - <string name="keys_backup_banner_recover_line2">Fazer o backup da chave</string> + <string name="keys_backup_banner_setup_line1">Nunca perca mensagens encriptadas</string> + <string name="keys_backup_banner_setup_line2">Começar a usar Backup de Chave</string> + <string name="secure_backup_banner_setup_line1">Backup Seguro</string> + <string name="secure_backup_banner_setup_line2">Salvaguardar-se contra perda de acesso a mensagens & dados encriptados</string> + <string name="keys_backup_banner_recover_line1">Nunca perca mensagens encriptadas</string> + <string name="keys_backup_banner_recover_line2">Usar Backup de Chave</string> <string name="keys_backup_banner_update_line1">Novas chaves de mensagens seguras</string> - <string name="keys_backup_banner_update_line2">Configurar o backup das chaves</string> - <string name="keys_backup_banner_in_progress">Fazendo backup das chaves. Isso pode demorar vários minutos…</string> - <string name="secure_backup_setup">Configurar o backup online</string> - <string name="keys_backup_info_keys_all_backup_up">O backup de todas as chaves foi concluído</string> + <string name="keys_backup_banner_update_line2">Gerenciar em Backup de Chave</string> + <string name="keys_backup_banner_in_progress">Fazendo backup de suas chaves. Isto pode levar muitos minutos…</string> + <string name="secure_backup_setup">Configurar Backup Seguro</string> + <string name="keys_backup_info_keys_all_backup_up">Backup de todas as chaves foi feito</string> <plurals name="keys_backup_info_keys_backing_up"> - <item quantity="one">Fazendo o backup de %d chave…</item> - <item quantity="other">Fazendo o backup de %d chaves…</item> + <item quantity="one">Fazendo backup de %d chave…</item> + <item quantity="other">Fazendo backup de %d chaves…</item> </plurals> <string name="keys_backup_info_title_version">Versão</string> <string name="keys_backup_info_title_algorithm">Algoritmo</string> - <string name="autodiscover_invalid_response">Resposta de descoberta inválida no servidor local</string> - <string name="autodiscover_well_known_autofill_dialog_title">Completar Automaticamente as Opções do Servidor</string> - <string name="template_autodiscover_well_known_autofill_dialog_message">${app_name} detectou uma configuração personalizada do servidor para a sua ID de usuário \"%1$s\": + <string name="autodiscover_invalid_response">Resposta de descoberta de servidorcasa inválida</string> + <string name="autodiscover_well_known_autofill_dialog_title">Autocompletar Opções de Servidor</string> + <string name="template_autodiscover_well_known_autofill_dialog_message">${app_name} detectou uma configuração de servidor personalizada para seu domínio de userId \"%1$s\": \n%2$s</string> - <string name="autodiscover_well_known_autofill_confirm">Usar a Configuração</string> - <string name="invalid_or_expired_credentials">Você foi desligado devido as credenciais inválidas ou caducadas.</string> - <string name="sas_verify_title">Confirmar comparando um texto curto.</string> - <string name="sas_security_advise">Para máxima segurança, recomendamos que você faça isso pessoalmente ou use outro meio de comunicação confiável.</string> - <string name="sas_verify_start_button_title">Iniciar a confirmação</string> - <string name="sas_incoming_request_title">Recebendo solicitação de confirmação</string> - <string name="sas_incoming_request_description">Confirme se esta sessão é sua. Confirmar sessões fornece segurança adicional, ao usar mensagens criptografadas de ponta a ponta.</string> - <string name="sas_incoming_request_description_2">Ao confirmar se esta sessão é sua, você também a tornará confirmada para o seu contato.</string> - <string name="sas_emoji_description">Confirme esta sessão, comparando os emojis a seguir que serão exibidos para você e seu contato</string> - <string name="sas_decimal_description">Confirme esta sessão, comparando os números a seguir que serão exibidos para você e seu contato</string> - <string name="sas_incoming_verification_request_dialog">Você recebeu uma solicitação de confirmação.</string> - <string name="sas_view_request_action">Ver pedido</string> - <string name="sas_waiting_for_partner">Aguardando seu contato confirmar…</string> - <string name="sas_verified">Confirmado!</string> - <string name="sas_verified_successful">Você confirmou essa sessão com êxito.</string> - <string name="sas_verified_successful_description">As mensagens com este usuário estão criptografadas de ponta a ponta e não podem ser lidas por terceiros.</string> - <string name="sas_got_it">Ok, entendi</string> - <string name="sas_verifying_keys">Não aparece nada\? Nem todos os clientes suportam a confirmação interativa. Use a confirmação tradicional.</string> - <string name="sas_legacy_verification_button_title">Use a confirmação tradicional.</string> - <string name="sas_verification_request_notification_channel_title">Verificação da chave</string> - <string name="sas_cancelled_dialog_title">Pedido Cancelado</string> - <string name="sas_cancelled_by_other">Seu contato cancelou a confirmação. + <string name="autodiscover_well_known_autofill_confirm">Usar Config</string> + <string name="invalid_or_expired_credentials">Você tem sido feito logout devido a credenciais inválidas ou expiradas.</string> + <string name="sas_verify_title">Verificar ao comparar um string de texto curto.</string> + <string name="sas_security_advise">Para máxima segurança, nós recomendamos que você faça isto em pessoa ou use um outro meio de comunicação confiado.</string> + <string name="sas_verify_start_button_title">Começar a Verificar</string> + <string name="sas_incoming_request_title">Requisição de Verificação Chegando</string> + <string name="sas_incoming_request_description">Verifique esta sessão para marcá-la como confiada. Confiar em sessões de parceiras(os) dá a você paz de mente extra quando usando mensagens encriptadas ponta-a-ponta.</string> + <string name="sas_incoming_request_description_2">Verificar esta sessão vai marcá-la como confiada, e também marcar sua sessão como confiada para a/o parceira(o).</string> + <string name="sas_emoji_description">Verifique esta sessão ao confirmar que os seguintes emoji aparecem na tela da/do parceira(o)</string> + <string name="sas_decimal_description">Verifique esta sessão ao confirmar que os seguintes números aparecem na tela da/do parceira(o)</string> + <string name="sas_incoming_verification_request_dialog">Você recebeu uma requisição de verificação entrante.</string> + <string name="sas_view_request_action">Visualizar requisição</string> + <string name="sas_waiting_for_partner">Esperando por parceira(o) confirmar…</string> + <string name="sas_verified">Verificada!</string> + <string name="sas_verified_successful">Você tem confirmado esta sessão com sucesso.</string> + <string name="sas_verified_successful_description">Mensagens seguras com esta(e) usuária(o) estão encriptadas ponta-a-ponta e não são capazes de ser lidas por terceiros.</string> + <string name="sas_got_it">Entendido</string> + <string name="sas_verifying_keys">Nada aparecendo\? Não todos os clientes suportam verificação interativa ainda. Use verificação legado.</string> + <string name="sas_legacy_verification_button_title">Usar verificação legado.</string> + <string name="sas_verification_request_notification_channel_title">Verificação de Chave</string> + <string name="sas_cancelled_dialog_title">Requisição Cancelada</string> + <string name="sas_cancelled_by_other">A outra parte cancelou a verificação. \n%s</string> - <string name="sas_cancelled_by_me">A confirmação foi cancelada. -\nMotivo: %s</string> - <string name="sas_verification_request_notification_channel">Confirmação interativa da sessão</string> - <string name="sas_incoming_request_notif_title">Solicitação de confirmação</string> - <string name="sas_incoming_request_notif_content">%s quer confirmar a sua sessão</string> - <string name="sas_error_m_user">O contato cancelou a confirmação</string> - <string name="sas_error_m_timeout">O tempo de confirmação expirou</string> + <string name="sas_cancelled_by_me">A verificação foi cancelada. +\nRazão: %s</string> + <string name="sas_verification_request_notification_channel">Verificação de Sessão Interativa</string> + <string name="sas_incoming_request_notif_title">Requisição de Verificação</string> + <string name="sas_incoming_request_notif_content">%s quer verificar sua sessão</string> + <string name="sas_error_m_user">A(o) usuária(o) cancelou a verificação</string> + <string name="sas_error_m_timeout">O tempo para processo de verificação expirou</string> <string name="sas_error_m_unknown_transaction">A sessão não sabe sobre essa transação</string> - <string name="sas_error_m_unknown_method">A sessão não concorda com a chave, método hash, MAC, ou SAS</string> - <string name="sas_error_m_mismatched_commitment">O compromisso de hash não coincidiu</string> - <string name="sas_error_m_mismatched_sas">O SAS não corresponde</string> + <string name="sas_error_m_unknown_method">A sessão não concorda com um metódo de acordo de chave, hash, MAC, ou SAS</string> + <string name="sas_error_m_mismatched_commitment">O cometimento de hash não correspondeu</string> + <string name="sas_error_m_mismatched_sas">O SAS não correspondeu</string> <string name="sas_error_m_unexpected_message">A sessão recebeu uma mensagem inesperada</string> <string name="sas_error_m_invalid_message">Uma mensagem inválida foi recebida</string> - <string name="sas_error_m_key_mismatch">Chave incorreta</string> - <string name="sas_error_m_user_error">Contato não corresponde</string> + <string name="sas_error_m_key_mismatch">Disparidade de chave</string> + <string name="sas_error_m_user_error">Disparidade de usuária(o)</string> <string name="sas_error_unknown">Erro Desconhecido</string> - <string name="identity_server_not_defined">Você não está usando algum servidor de identidade</string> - <string name="identity_server_not_defined_for_password_reset">Nenhum servidor de identidade está configurado. É necessário usar um para redefinir sua senha.</string> - <string name="error_user_already_logged_in">Parece que você está tentando se conectar com outro servidor local. Deseja sair\?</string> + <string name="identity_server_not_defined">Você não está usando nenhum Servidor de Identidade</string> + <string name="identity_server_not_defined_for_password_reset">Nenhum servidor de identidade está configurado, ele é requerido para resettar sua senha.</string> + <string name="error_user_already_logged_in">Parece que você está tentando se conectar a um outro servidorcasa. Você quer fazer signout\?</string> <string name="edit">Editar</string> <string name="reply">Responder</string> - <string name="global_retry">Tentar novamente</string> - <string name="room_list_empty">Conecta-se a uma sala para começar a usar o aplicativo.</string> - <string name="send_you_invite">Enviou um convite</string> - <string name="invited_by">Convidado por %s</string> - <string name="room_list_catchup_empty_title">Tudo em dia!</string> - <string name="room_list_catchup_empty_body">Você não tem mais mensagens não lidas</string> + <string name="global_retry">Retentar</string> + <string name="room_list_empty">Junte-se a uma sala para começar a usar o app.</string> + <string name="send_you_invite">Te enviou um convite</string> + <string name="invited_by">Convidada(o) por %s</string> + <string name="room_list_catchup_empty_title">Você está em dia!</string> + <string name="room_list_catchup_empty_body">Você não tem mais nenhuma mensagem não-lida</string> <string name="room_list_catchup_welcome_title">Boas-vindas!</string> - <string name="room_list_catchup_welcome_body">Leia mensagens não lidas aqui</string> + <string name="room_list_catchup_welcome_body">Fique em dia com suas mensagens não-lidas aqui</string> <string name="room_list_people_empty_title">Conversas</string> - <string name="room_list_people_empty_body">Suas conversas serão exibidas aqui. Toque no botão + abaixo para conversar com alguém.</string> + <string name="room_list_people_empty_body">Suas conversas de mensagem direta vai ser exibidas aqui. Toque no + à direita fundo para começar algumas.</string> <string name="room_list_rooms_empty_title">Salas</string> - <string name="room_list_rooms_empty_body">Seus salas serão exibidas aqui. Toque no botão + abaixo para pesquisar as salas existentes ou criar novas.</string> + <string name="room_list_rooms_empty_body">Suas salas vão ser exibidas aqui. Toque no + à direita fundo para encontrar umas existentes ou começar algumas propriamente suas.</string> <string name="title_activity_emoji_reaction_picker">Reações</string> <string name="reactions_agree">Concordo</string> <string name="reactions_like">Curtir</string> - <string name="message_add_reaction">Adicionar reação</string> - <string name="message_view_reaction">Veja as reações</string> + <string name="message_add_reaction">Adicionar Reação</string> + <string name="message_view_reaction">Visualizar Reações</string> <string name="reactions">Reações</string> - <string name="event_redacted">Mensagem apagada</string> - <string name="settings_show_redacted">Mostrar mensagens apagadas</string> - <string name="settings_show_redacted_summary">Mostrar um espaço reservado para mensagens apagadas</string> - <string name="event_redacted_by_user_reason">Evento apagado pelo usuário</string> - <string name="event_redacted_by_admin_reason">Evento moderado pelo administrador da sala</string> - <string name="last_edited_info_message">Última edição por %1$s em %2$s</string> - <string name="malformed_message">Evento malformado, não pode ser exibido</string> + <string name="event_redacted">Mensagem deletada</string> + <string name="settings_show_redacted">Mostrar mensagens removidas</string> + <string name="settings_show_redacted_summary">Mostrar um placeholder para mensagens removidas</string> + <string name="event_redacted_by_user_reason">Evento deletado por usuária(o)</string> + <string name="event_redacted_by_admin_reason">Evento moderado por admin da sala</string> + <string name="last_edited_info_message">Último editada por %1$s a %2$s</string> + <string name="malformed_message">Evento malformado, não dá para exibir</string> <string name="create_new_room">Criar Nova Sala</string> - <string name="error_no_network">Sem rede. Por favor, verifique sua conexão de internet.</string> - <string name="action_change">Alterar</string> - <string name="change_room_directory_network">Alterar a rede</string> - <string name="please_wait">Por favor, aguarde…</string> - <string name="group_all_communities">Todas as comunidades</string> - <string name="room_preview_no_preview">Esta sala não pode ser visualizada</string> - <string name="template_room_preview_world_readable_room_not_supported_yet">A visualização da sala global ainda não é suportada por ${app_name}</string> + <string name="error_no_network">Sem rede. Por favor cheque sua conexão de Internet.</string> + <string name="action_change">Mudar</string> + <string name="change_room_directory_network">Mudar rede</string> + <string name="please_wait">Por favor espere…</string> + <string name="group_all_communities">Todas as Comunidades</string> + <string name="room_preview_no_preview">Esta sala não pode ser previsualizada</string> + <string name="template_room_preview_world_readable_room_not_supported_yet">A previsualização de sala legível pelo mundo não é suportada ainda em ${app_name}</string> <string name="fab_menu_create_room">Salas</string> - <string name="fab_menu_create_chat">Conversas</string> + <string name="fab_menu_create_chat">Mensagens Diretas</string> <string name="create_room_title">Nova Sala</string> <string name="create_room_action_create">CRIAR</string> <string name="create_room_name_hint">Nome</string> <string name="create_room_public_title">Público</string> - <string name="create_room_public_description">Qualquer pessoa poderá entrar nesta sala</string> - <string name="create_room_directory_title">Lista de Salas</string> - <string name="create_room_directory_description">Publicar esta sala na lista de salas</string> - <string name="keys_backup_unable_to_get_trust_info">Ocorreu um erro ao receber informações de confiança</string> - <string name="keys_backup_unable_to_get_keys_backup_data">Ocorreu um erro ao obter dados de backup de chaves</string> - <string name="import_e2e_keys_from_file">Importar as chaves de arquivo \"%1$s\".</string> - <string name="settings_sdk_version">Versão do SDK da Matrix</string> - <string name="settings_other_third_party_notices">Outras licenças de terceiros</string> - <string name="navigate_to_room_when_already_in_the_room">Você já está vendo esta sala!</string> - <string name="quick_reactions">Reações rápidas</string> + <string name="create_room_public_description">Qualquer pessoa vai ser capaz de se juntar a esta sala</string> + <string name="create_room_directory_title">Diretório de Salas</string> + <string name="create_room_directory_description">Publicar esta sala no diretório de salas</string> + <string name="keys_backup_unable_to_get_trust_info">Um erro ocorreu ao obter info de confiança</string> + <string name="keys_backup_unable_to_get_keys_backup_data">Um erro ocorreu ao obter dados de backup de chaves</string> + <string name="import_e2e_keys_from_file">Importar as chaves e2e de arquivo \"%1$s\".</string> + <string name="settings_sdk_version">Versão de SDK de Matrix</string> + <string name="settings_other_third_party_notices">Outras notas de terceiros</string> + <string name="navigate_to_room_when_already_in_the_room">Você já está visualizando esta sala!</string> + <string name="quick_reactions">Reações Rápidas</string> <string name="settings_general_title">Geral</string> <string name="settings_preferences">Preferências</string> - <string name="settings_security_and_privacy">Segurança e Privacidade</string> - <string name="settings_expert">Experiente</string> - <string name="settings_push_rules">Regras do Push</string> - <string name="settings_push_rules_no_rules">Nenhuma regra Push definida</string> - <string name="settings_push_gateway_no_pushers">Nenhuma entrada Push registrada</string> + <string name="settings_security_and_privacy">Segurança & Privacidade</string> + <string name="settings_expert">Expert</string> + <string name="settings_push_rules">Regras de Push</string> + <string name="settings_push_rules_no_rules">Nenhuma regra de push definida</string> + <string name="settings_push_gateway_no_pushers">Nenhum gateway de push registrado</string> <string name="push_gateway_item_app_id">app_id:</string> - <string name="push_gateway_item_push_key">chave_push:</string> - <string name="push_gateway_item_app_display_name">nome_da_ tela_ do_app:</string> - <string name="push_gateway_item_device_name">nome_da_sessão:</string> - <string name="push_gateway_item_url">Link:</string> + <string name="push_gateway_item_push_key">push_key:</string> + <string name="push_gateway_item_app_display_name">app_display_name:</string> + <string name="push_gateway_item_device_name">session_name:</string> + <string name="push_gateway_item_url">Url:</string> <string name="push_gateway_item_format">Formato:</string> - <string name="preference_voice_and_video">Voz e vídeo</string> - <string name="preference_root_help_about">Ajuda e Sobre</string> + <string name="preference_voice_and_video">Voz & Vídeo</string> + <string name="preference_root_help_about">Ajuda & Sobre</string> <string name="settings_troubleshoot_test_token_registration_quick_fix">Registrar token</string> - <string name="send_suggestion">Faça uma sugestão</string> - <string name="send_suggestion_content">Por favor, escreva sua sugestão abaixo.</string> - <string name="send_suggestion_report_placeholder">Descreva aqui sua sugestão</string> - <string name="send_suggestion_sent">Obrigado, a sugestão foi enviada com êxito</string> - <string name="send_suggestion_failed">A sugestão não foi enviada (%s)</string> - <string name="settings_labs_show_hidden_events_in_timeline">Mostrar eventos ocultos nas conversas</string> - <string name="bottom_action_people_x">Conversas</string> - <string name="send_file_step_idle">Aguardando…</string> - <string name="send_file_step_encrypting_thumbnail">Criptografando imagem miniatura…</string> - <string name="send_file_step_sending_thumbnail">Enviando imagem miniatura (%1$s / %2$s)</string> - <string name="send_file_step_encrypting_file">Criptografando arquivo…</string> + <string name="send_suggestion">Fazer uma sugestão</string> + <string name="send_suggestion_content">Por favor escreva sua sugestão abaixo.</string> + <string name="send_suggestion_report_placeholder">Descreva sua sugestão aqui</string> + <string name="send_suggestion_sent">Obrigado, a sugestão tem sido enviada com sucesso</string> + <string name="send_suggestion_failed">A sugestão falhou para ser enviada (%s)</string> + <string name="settings_labs_show_hidden_events_in_timeline">Mostrar eventos escondidos em timeline</string> + <string name="bottom_action_people_x">Mensagens Diretas</string> + <string name="send_file_step_idle">Esperando…</string> + <string name="send_file_step_encrypting_thumbnail">Encriptando thumbnail…</string> + <string name="send_file_step_sending_thumbnail">Enviando thumbnail (%1$s / %2$s)</string> + <string name="send_file_step_encrypting_file">Encriptando arquivo…</string> <string name="send_file_step_sending_file">Enviando arquivo (%1$s / %2$s)</string> - <string name="downloading_file">Baixando arquivo %1$s…</string> - <string name="downloaded_file">O arquivo %1$s foi baixado!</string> - <string name="edited_suffix">(editado)</string> - <string name="message_edits">Edições na mensagem</string> + <string name="downloading_file">Fazendo download de arquivo %1$s…</string> + <string name="downloaded_file">Download de arquivo %1$s foi feito!</string> + <string name="edited_suffix">(editada)</string> + <string name="message_edits">Edições de Mensagem</string> <string name="no_message_edits_found">Nenhuma edição encontrada</string> <string name="room_filtering_filter_hint">Filtrar conversas…</string> <string name="room_filtering_footer_title">Não consegue encontrar o que você está procurando\?</string> - <string name="room_filtering_footer_create_new_room">Criar uma sala nova</string> - <string name="room_filtering_footer_create_new_direct_message">Enviar nova mensagem</string> - <string name="room_filtering_footer_open_room_directory">Veja lista de salas</string> - <string name="room_directory_search_hint">Nome ou ID (#example:matrix.org)</string> - <string name="labs_swipe_to_reply_in_timeline">Ativar o recurso de deslizar para responder nas conversas</string> - <string name="labs_show_unread_notifications_as_tab">Adicione uma aba dedicada para notificações não lidas na tela principal.</string> - <string name="link_copied_to_clipboard">Link copiado para a memória</string> - <string name="add_by_matrix_id">Adicionar por ID do Matrix</string> - <string name="creating_direct_room">Criando a sala…</string> - <string name="direct_room_no_known_users">Nenhum resultado encontrado, use adicionar por ID do Matrix para pesquisar no servidor.</string> + <string name="room_filtering_footer_create_new_room">Criar uma nova sala</string> + <string name="room_filtering_footer_create_new_direct_message">Enviar uma nova mensagem direta</string> + <string name="room_filtering_footer_open_room_directory">Visualizar o diretório de salas</string> + <string name="room_directory_search_hint">Nome ou ID (#exemplo:matrix.org)</string> + <string name="labs_swipe_to_reply_in_timeline">Ativar deslize para responder em timeline</string> + <string name="labs_show_unread_notifications_as_tab">Adicionar uma aba dedicada para notificações não-lidas em tela principal.</string> + <string name="link_copied_to_clipboard">Link copiado para clipboard</string> + <string name="add_by_matrix_id">Adicionar por ID matrix</string> + <string name="creating_direct_room">Criando sala…</string> + <string name="direct_room_no_known_users">Nenhum resultado encontrado, use Adicionar por ID matrix para pesquisar em servidor.</string> <string name="direct_room_start_search">Comece a digitar para obter resultados</string> - <string name="direct_room_filter_hint">Filtrar por nome do usuário ou ID…</string> - <string name="joining_room">Entrando na sala…</string> - <string name="message_view_edit_history">Veja Histórico das Edições</string> - <string name="terms_of_service">Termos de serviço</string> - <string name="review_terms">Revisar termos</string> - <string name="terms_description_for_identity_server">Seja descoberto por outros</string> - <string name="terms_description_for_integration_manager">Use bots, integrações, widgets e pacotes de figurinhas</string> - <string name="read_at">Leia em</string> + <string name="direct_room_filter_hint">Filtrar por nome de usuária(o) ou ID…</string> + <string name="joining_room">Juntando-se a sala…</string> + <string name="message_view_edit_history">Visualizar Histórico de Edição</string> + <string name="terms_of_service">Termos de Serviço</string> + <string name="review_terms">Revisar Termos</string> + <string name="terms_description_for_identity_server">Ser descobertável por outras(os)</string> + <string name="terms_description_for_integration_manager">Usar Bots, bridges, widgets e pacotes de stickers</string> + <string name="read_at">Lido a</string> <string name="identity_server">Servidor de identidade</string> <string name="disconnect_identity_server">Desconectar servidor de identidade</string> <string name="add_identity_server">Configurar servidor de identidade</string> - <string name="change_identity_server">Alterar servidor de identidade</string> - <string name="settings_discovery_identity_server_info">Atualmente você está usando %1$s para descobrir e ser descoberto pelos contatos existentes.</string> - <string name="settings_discovery_identity_server_info_none">No momento, você não está usando um servidor de identidade. Para descobrir e ser descoberto pelos contatos existentes, adicione um abaixo.</string> - <string name="settings_discovery_emails_title">Endereços de e-mail detectáveis</string> - <string name="settings_discovery_no_mails">As opções de descoberta aparecerão uma vez que você tenha adicionado um e-mail.</string> - <string name="settings_discovery_no_msisdn">As opções de descoberta aparecerão uma vez que você tenha adicionado um número de telefone.</string> - <string name="settings_discovery_disconnect_identity_server_info">Desconectar-se de seu servidor de identidade resultará em que você não poderá ser descoberto por outros usuários e não poderá convidar outros por e-mail ou número de telefone.</string> - <string name="settings_discovery_msisdn_title">Números de telefone detectáveis</string> - <string name="settings_discovery_confirm_mail">Enviamos um e-mail de confirmação para %s, verifique seu e-mail e clique no link de confirmação</string> - <string name="settings_discovery_confirm_mail_not_clicked">Enviamos um e-mail de confirmação para %s. Por favor, verifique seu e-mail e clique no link de confirmação</string> - <string name="settings_discovery_mail_pending">Aguardando</string> - <string name="settings_discovery_enter_identity_server">Digite o endereço de um servidor de identidade</string> - <string name="settings_discovery_bad_identity_server">Não foi possível conectar-se ao servidor de identidade</string> - <string name="settings_discovery_please_enter_server">Digite o endereço do servidor de identidade</string> - <string name="settings_discovery_no_terms_title">O servidor de identidade não tem termos de serviço</string> - <string name="settings_discovery_no_terms">O servidor de identidade que você escolheu não possui termos de serviço. Continue apenas se você confiar no proprietário do servidor</string> - <string name="settings_text_message_sent">Uma mensagem de texto foi enviada para %s. Por favor, digite o código de confirmação que ela contém.</string> - <string name="settings_text_message_sent_wrong_code">O código de confirmação não está correto.</string> - <string name="settings_discovery_disconnect_with_bound_pid">Atualmente, você está compartilhando endereços de e-mail ou números de telefone no servidor de identidade %1$s. Você precisará reconectar-se a %2$s para parar de compartilhá-los.</string> - <string name="settings_agree_to_terms">Concorde com os Termos de Serviço do servidor de identidade (%s), para que você possa ser descoberto por endereço de e-mail ou por número de telefone.</string> - <string name="labs_allow_extended_logging">Ativar registros detalhados</string> - <string name="labs_allow_extended_logging_summary">Os registros detalhados ajudarão os desenvolvedores, ao fornecerem mais registros quando você usar sacudir o aparelho. Mesmo quando ativado, o aplicativo não registra o conteúdo da mensagem ou qualquer outro dado privado.</string> - <string name="error_terms_not_accepted">Por favor, tente novamente quando tiver aceitado os termos e condições de seu servidor.</string> - <string name="error_network_timeout">Parece que o servidor está demorando muito para responder, isto pode ser causado ou por má conectividade ou por um erro com o servidor. Por favor, tente novamente daqui a pouco.</string> + <string name="change_identity_server">Mudar servidor de identidade</string> + <string name="settings_discovery_identity_server_info">Você está atualmente usando %1$s para descobrir e ser descobertável por contatos existentes que você conhece.</string> + <string name="settings_discovery_identity_server_info_none">Você não está atualmente usando um servidor de identidade. Para descobrir e ser descobertável por contatos existentes que você conhece, configure um abaixo.</string> + <string name="settings_discovery_emails_title">Endereços de email descobertáveis</string> + <string name="settings_discovery_no_mails">Opções de descoberta vão aparecer uma vez que você tenha adicionado um email.</string> + <string name="settings_discovery_no_msisdn">Opções de descoberta vão aparecer uma vez que você tenha adicionado um número de telefone.</string> + <string name="settings_discovery_disconnect_identity_server_info">Desconectar-se de seu servidor de identidade vai significar que você não vai ser descobertável por outras(os) usuárias(os) e você não vai ser capaz de convidar outras(os) por email ou telefone.</string> + <string name="settings_discovery_msisdn_title">Números de telefone descobertáveis</string> + <string name="settings_discovery_confirm_mail">Nós enviamos a você um email de confirmar para %s, cheque seu email e clique no link de confirmação</string> + <string name="settings_discovery_confirm_mail_not_clicked">Nós enviamos a você um email de confirmar para %s, por favor primeiro cheque seu email e clique no link de confirmação</string> + <string name="settings_discovery_mail_pending">Pendente</string> + <string name="settings_discovery_enter_identity_server">Entre um URL de servidor de identidade</string> + <string name="settings_discovery_bad_identity_server">Não foi possível conectar-se a servidor de identidade</string> + <string name="settings_discovery_please_enter_server">Por favor entre o url de servidor de identidade</string> + <string name="settings_discovery_no_terms_title">Servidor de identidade não tem termos de serviço</string> + <string name="settings_discovery_no_terms">O servidor de identidade que você tem escolhido não tem quaisquer termos de serviço. Somente continue se você confia na/do proprietária(o) do serviço</string> + <string name="settings_text_message_sent">Uma mensagem de texto tem sido enviada para %s. Por favor entre o código de verificação que ela contém.</string> + <string name="settings_text_message_sent_wrong_code">O código de verificação não está correto.</string> + <string name="settings_discovery_disconnect_with_bound_pid">Você está atualmente compartilhando endereços de email ou números de telefone no servidor de identidade %1$s. Você vai precisar reconectar-se a %2$s para parar de os compartilhar.</string> + <string name="settings_agree_to_terms">Concorde com os Termos de Serviço do servidor de identidade (%s) para permitir você mesma(o) ser descobertável por endereço de email ou número de telefone.</string> + <string name="labs_allow_extended_logging">Ativar verbose logs.</string> + <string name="labs_allow_extended_logging_summary">Verbose logs vão ajudar desenvolvedoras(es) ao prover mais logs quando você enviar uma RageShake. Mesmo quando ativado, o aplicativo não registra conteúdos de mensagem ou quaisquer outros dados privados.</string> + <string name="error_terms_not_accepted">Por favor retente uma vez que você tenha aceitado os termos e condições de seu servidorcasa.</string> + <string name="error_network_timeout">Parece que o servidor está demorando muito para responder, isto pode ser causado por ou má conectividade ou um erro com o servidor. Por favor tente de novo daqui a pouco.</string> <string name="send_attachment">Enviar anexo</string> - <string name="a11y_open_drawer">Abra a gaveta de navegação</string> - <string name="a11y_create_menu_open">Abra o menu de criar a sala</string> - <string name="a11y_create_menu_close">Fecha o menu de criar a sala…</string> + <string name="a11y_open_drawer">Abrir a gaveta de navegação</string> + <string name="a11y_create_menu_open">Abrir o menu de criar sala</string> + <string name="a11y_create_menu_close">Fechar menu de criar sala…</string> <string name="a11y_create_direct_message">Criar uma nova conversa direta</string> - <string name="a11y_create_room">Criar uma sala nova</string> - <string name="a11y_close_keys_backup_banner">Fechar o aviso de backup das chaves</string> + <string name="a11y_create_room">Criar uma nova sala</string> + <string name="a11y_close_keys_backup_banner">Fechar banner de backup de chaves</string> <string name="a11y_show_password">Mostrar senha</string> <string name="a11y_hide_password">Esconder senha</string> - <string name="a11y_jump_to_bottom">Saltar para parte inferior</string> - <string name="three_users_read">%1$s, %2$s e %3$s leu</string> - <string name="two_users_read">%1$s e %2$s lê</string> - <string name="one_user_read">%s lê</string> + <string name="a11y_jump_to_bottom">Pular para fundo</string> + <string name="three_users_read">%1$s, %2$s e %3$s leram</string> + <string name="two_users_read">%1$s e %2$s leram</string> + <string name="one_user_read">%s leu</string> <plurals name="fallback_users_read"> - <item quantity="one">%d usuário leu</item> - <item quantity="other">%d usuários leram</item> + <item quantity="one">%d usuária(o) leu</item> + <item quantity="other">%d usuárias(os) leram</item> </plurals> - <string name="error_file_too_big">O arquivo \'%1$s\' (%2$s) é muito grande para ser carregado. O limite é de %3$s.</string> - <string name="error_attachment">Ocorreu um erro durante a recuperação do anexo.</string> + <string name="error_file_too_big">O arquivo \'%1$s\' (%2$s) é grande demais para fazer upload. O limite é %3$s.</string> + <string name="error_attachment">Um erro ocorreu enquando recuperando o anexo.</string> <string name="attachment_type_file">Arquivo</string> <string name="attachment_type_contact">Contato</string> <string name="attachment_type_camera">Câmera</string> <string name="attachment_type_audio">Áudio</string> <string name="attachment_type_gallery">Galeria</string> - <string name="attachment_type_sticker">Figurinha</string> - <string name="error_handling_incoming_share">Não conseguia lidar com dados compartilhados</string> + <string name="attachment_type_sticker">Sticker</string> + <string name="error_handling_incoming_share">Não deu para lidar com compartilhar dados</string> <string name="uploads_media_title">MÍDIA</string> - <string name="uploads_media_no_result">Nenhuma mídia nesta sala</string> + <string name="uploads_media_no_result">Não tem nenhuma mídia nesta sala</string> <string name="uploads_files_title">ARQUIVOS</string> - <string name="uploads_files_subtitle">%1$s em %2$s</string> - <string name="uploads_files_no_result">Nenhum arquivo nesta sala</string> + <string name="uploads_files_subtitle">%1$s a %2$s</string> + <string name="uploads_files_no_result">Não tem nenhum arquivo nesta sala</string> <string name="report_content_spam">É spam</string> <string name="report_content_inappropriate">É inapropriado</string> - <string name="report_content_custom">Relatório personalizado…</string> - <string name="report_content_custom_title">Denunciar conteúdo</string> - <string name="report_content_custom_hint">Motivo para denúnciar este conteúdo</string> - <string name="report_content_custom_submit">RELATÓRIO</string> - <string name="block_user">BLOQUEAR USUÁRIO</string> - <string name="content_reported_title">Conteúdo relatado</string> + <string name="report_content_custom">Reporte personalizado…</string> + <string name="report_content_custom_title">Reportar este conteúdo</string> + <string name="report_content_custom_hint">Razão para reportar este conteúdo</string> + <string name="report_content_custom_submit">REPORTAR</string> + <string name="block_user">IGNORAR USUÁRIA(O)</string> + <string name="content_reported_title">Conteúdo reportado</string> <string name="content_reported_content">Este conteúdo foi reportado. \n -\nSe você não quiser ver mais mensagens deste usuário, você pode bloqueá-lo para esconder suas mensagens.</string> - <string name="content_reported_as_spam_title">Denunciado como spam</string> +\nSe você não quer ver mais nada de conteúdo desta(e) usuária(o), você pode ignorá-la(o) para esconder mensagens dela(e).</string> + <string name="content_reported_as_spam_title">Reportado como spam</string> <string name="content_reported_as_spam_content">Este conteúdo foi reportado como spam. \n -\nSe você não quiser ver mais mensagens deste usuário, você pode bloqueá-lo para esconder suas mensagens.</string> - <string name="content_reported_as_inappropriate_title">Denunciado como inadequado</string> - <string name="content_reported_as_inappropriate_content">Este conteúdo foi relatado como inadequado. +\nSe você não quer ver mais nada de conteúdo desta(e) usuária(o), você pode ignorá-la(o) para esconder mensagens dela(e).</string> + <string name="content_reported_as_inappropriate_title">Reportado como inapropriado</string> + <string name="content_reported_as_inappropriate_content">Este conteúdo foi reportado como inapropriado. \n -\nSe você não quiser ver mais mensagens deste usuário, você pode bloqueá-lo para esconder suas mensagens.</string> - <string name="template_permissions_rationale_msg_keys_backup_export">${app_name} precisa de permissão para salvar suas chaves E2E no aparelho. +\nSe você não quer ver mais nada de conteúdo desta(e) usuária(o), você pode ignorá-la(o) para esconder mensagens dela(e).</string> + <string name="template_permissions_rationale_msg_keys_backup_export">${app_name} precisa de permissão para salvar suas chaves E2E em disco. \n -\nPermita o acesso na próxima janela para poder exportar suas chaves manualmente.</string> - <string name="no_network_indicator">Não há conexão de rede no momento</string> - <string name="message_ignore_user">Bloquear usuário</string> - <string name="room_list_quick_actions_notifications_all_noisy">Todas as mensagens novas (com som)</string> - <string name="room_list_quick_actions_notifications_all">Todas as mensagens novas</string> - <string name="room_list_quick_actions_notifications_mentions">Apenas @menções</string> - <string name="room_list_quick_actions_notifications_mute">Silenciar</string> +\nPor favor permita acesso no próximo pop-up para ser capaz de exportar suas chaves manualmente.</string> + <string name="no_network_indicator">Não há nenhuma conexão de rede no momento</string> + <string name="message_ignore_user">Ignorar usuária(o)</string> + <string name="room_list_quick_actions_notifications_all_noisy">Todas as mensagens (barulhentas)</string> + <string name="room_list_quick_actions_notifications_all">Todas as mensagens</string> + <string name="room_list_quick_actions_notifications_mentions">Menções somente</string> + <string name="room_list_quick_actions_notifications_mute">Mutar</string> <string name="room_list_quick_actions_settings">Configurações</string> - <string name="room_list_quick_actions_favorite_add">Adicionar aos favoritos</string> - <string name="room_list_quick_actions_favorite_remove">Remover dos favoritos</string> + <string name="room_list_quick_actions_favorite_add">Adicionar a favoritos</string> + <string name="room_list_quick_actions_favorite_remove">Remover de favoritos</string> <string name="room_list_quick_actions_leave">Sair da sala</string> - <string name="notice_member_no_changes">%1$s não fez nenhuma alteração</string> - <string name="notice_member_no_changes_by_you">Você não fez nenhuma alteração</string> - <string name="command_description_spoiler">Envia esta mensagem como um spoiler</string> - <string name="spoiler">Estraga-Surpresa</string> - <string name="reaction_search_type_hint">Digite palavras-chave para encontrar uma reação.</string> - <string name="no_ignored_users">Nenhum usuário bloqueado</string> - <string name="help_long_click_on_room_for_more_options">Clique longo sobre uma sala para ver mais opções</string> - <string name="room_join_rules_public">%1$s tornou a sala pública para quem conhece o link.</string> - <string name="room_join_rules_public_by_you">Você tornou a sala pública para quem conhece o link.</string> - <string name="room_join_rules_invite">%1$s tornou a sala acessível somente com convite.</string> - <string name="room_join_rules_invite_by_you">Você tornou a sala acessível somente com convite.</string> - <string name="timeline_unread_messages">Mensagens não lidas</string> - <string name="login_splash_title">É a sua conversa. Vira um admin.</string> - <string name="login_splash_text1">Converse com as pessoas diretamente ou em comunidades</string> - <string name="login_splash_text2">Manter conversas privadas com criptografia</string> - <string name="login_splash_text3">Amplie e personalize sua experiência</string> + <string name="notice_member_no_changes">%1$s não fez nenhuma mudança</string> + <string name="notice_member_no_changes_by_you">Você não fez nenhuma mudança</string> + <string name="command_description_spoiler">Envia a dada mensagem como um spoiler</string> + <string name="spoiler">Spoiler</string> + <string name="reaction_search_type_hint">Digite palavrachaves para encontrar uma reação.</string> + <string name="no_ignored_users">Você não está ignorando nenhum(a) usuário(a)</string> + <string name="help_long_click_on_room_for_more_options">Clique longo numa sala para ver mais opções</string> + <string name="room_join_rules_public">%1$s fez a sala pública para qualquer pessoa que sabe o link.</string> + <string name="room_join_rules_public_by_you">Você fez a sala pública para qualquer pessoa que sabe o link.</string> + <string name="room_join_rules_invite">%1$s fez a sala somente convite.</string> + <string name="room_join_rules_invite_by_you">Você fez a sala somente convite.</string> + <string name="timeline_unread_messages">Mensagens não-lidas</string> + <string name="login_splash_title">É sua conversa. Tome-a como sua.</string> + <string name="login_splash_text1">Faça chat com pessoas diretamente ou em grupos</string> + <string name="login_splash_text2">Mantenha conversas privadas com encriptação</string> + <string name="login_splash_text3">Extenda & personalize sua experiência</string> <string name="login_splash_submit">Comece agora</string> <string name="login_server_title">Selecione um servidor</string> - <string name="login_server_text">Assim como o e-mail, as contas têm uma casa, embora você possa falar com qualquer pessoa</string> - <string name="login_server_matrix_org_text">Junte-se gratuitamente aos milhões no maior servidor público</string> - <string name="login_server_modular_text">Hospedagem Premium para organizações</string> + <string name="login_server_text">Assim como email, contas têm uma casa, embora você pode falar com qualquer pessoa</string> + <string name="login_server_matrix_org_text">Junte-se a milhões de graça no maior servidor público</string> + <string name="login_server_modular_text">Hospedagem premium para organizações</string> <string name="login_server_modular_learn_more">Saiba mais</string> <string name="login_server_other_title">Outros</string> - <string name="login_server_other_text">Configurações avançadas e preferências</string> + <string name="login_server_other_text">Configurações personalizadas & avançadas</string> <string name="login_continue">Continuar</string> - <string name="login_connect_to">Conecte-se a %1$s</string> - <string name="login_connect_to_modular">Conecte-se aos serviços de Element no Matrix</string> + <string name="login_connect_to">Conectar-se a %1$s</string> + <string name="login_connect_to_modular">Conectar-se Element Matrix Services</string> <string name="login_connect_to_a_custom_server">Conectar-se a um servidor personalizado</string> - <string name="login_signin_to">Entrar com %1$s</string> - <string name="login_signup">Cadastre-se</string> - <string name="login_signin">Entrar</string> - <string name="login_signin_sso">Continuar com ID único</string> - <string name="login_server_url_form_modular_hint">Endereço de serviço Element no Matrix</string> + <string name="login_signin_to">Fazer signin a %1$s</string> + <string name="login_signup">Fazer Signup</string> + <string name="login_signin">Fazer Signin</string> + <string name="login_signin_sso">Continuar com SOU</string> + <string name="login_server_url_form_modular_hint">Endereço de Element Matrix Services</string> <string name="login_server_url_form_other_hint">Endereço</string> - <string name="login_server_url_form_modular_text">Hospedagem Premium para organizações</string> - <string name="login_server_url_form_modular_notice">Digite o endereço de Element Modular ou Servidor que você deseja usar</string> - <string name="login_server_url_form_common_notice">Digite o endereço do servidor que você deseja usar</string> - <string name="login_sso_error_message">Ocorreu um erro ao carregar a página: %1$s (%2$d)</string> - <string name="login_mode_not_supported">O aplicativo não pode entrar neste servidor. O servidor suporta os seguintes tipos de login: %1$s. + <string name="login_server_url_form_modular_text">Hospedagem premium para organizações</string> + <string name="login_server_url_form_modular_notice">Entre o endereço do Modular Element ou Servidor que você quer usar</string> + <string name="login_server_url_form_common_notice">Entre o endereço do servidor que você quer usar</string> + <string name="login_sso_error_message">Um erro ocorreu quando carregando a página: %1$s (%2$d)</string> + <string name="login_mode_not_supported">O aplicativo não é capaz de fazer signin a este servidorcasa. O servidorcasa suporta o(s) seguinte(s) tipo(s) de signin: %1$s. \n -\nDeseja entrar no servidor usando o Element Web\?</string> +\nVocê quer fazer signing usando um cliente web\?</string> <string name="login_registration_disabled">Desculpe, este servidor não está aceitando novas contas.</string> - <string name="login_registration_not_supported">O aplicativo não pode criar uma conta neste servidor. + <string name="login_registration_not_supported">O aplicativo não é capaz de criar uma conta neste servidorcasa. \n -\nDeseja criar uma conta no servidor usando o Element Web\?</string> - <string name="login_login_with_email_error">Este e-mail não está associado a nenhuma conta.</string> - <string name="login_reset_password_on">Redefinir senha em %1$s</string> - <string name="login_reset_password_notice">Um e-mail de confirmação será enviado para sua caixa de entrada, para você confirmar a definição de sua nova senha.</string> +\nVocê quer fazer signup usando um cliente web\?</string> + <string name="login_login_with_email_error">Este email não está associado a nenhuma conta.</string> + <string name="login_reset_password_on">Resettar senha em %1$s</string> + <string name="login_reset_password_notice">Um email de verificação vai ser enviado para sua inbox para confirmar definição de sua nova senha.</string> <string name="login_reset_password_submit">Próximo</string> - <string name="login_reset_password_email_hint">E-mail</string> + <string name="login_reset_password_email_hint">Email</string> <string name="login_reset_password_password_hint">Nova senha</string> - <string name="login_reset_password_warning_title">Atenção!</string> - <string name="login_reset_password_warning_content">Alterar a sua senha redefinirá todas as chaves de criptografia de ponta a ponta existentes em todas as suas sessões, tornando o histórico de mensagens criptografadas ilegível. Faça um backup das suas chaves, ou exporte as chaves de outra sessão antes de alterar a sua senha.</string> + <string name="login_reset_password_warning_title">Aviso!</string> + <string name="login_reset_password_warning_content">Mudar sua senha vai resettar quaisquer chaves de encriptação ponta-a-ponta em todas as suas sessões, fazendo histórico de chat encriptado ilegível. Configure Backup de Chave ou exporte suas chaves de sala de uma outra sessão antes de resettar sua senha.</string> <string name="login_reset_password_warning_submit">Continuar</string> - <string name="login_reset_password_error_not_found">Este e-mail não está associado a nenhuma conta</string> - <string name="login_reset_password_mail_confirmation_title">Verifique sua caixa de entrada no e-mail</string> - <string name="login_reset_password_mail_confirmation_notice">Um e-mail de confirmação foi enviado para %1$s.</string> - <string name="login_reset_password_mail_confirmation_notice_2">Toque no link para confirmar sua nova senha. Uma vez que você tenha clicado o link que ele contém, clique abaixo.</string> - <string name="login_reset_password_mail_confirmation_submit">Verifiquei meu endereço de e-mail</string> - <string name="login_reset_password_success_title">Parabéns!</string> - <string name="login_reset_password_success_notice">Sua senha foi alterada.</string> - <string name="login_reset_password_success_notice_2">Você foi desconectado de todas as sessões e não receberá mais notificações pop-up. Para reativar as notificações, faça o login novamente em cada aparelho.</string> - <string name="login_reset_password_success_submit">Voltar para Entrar</string> - <string name="login_reset_password_cancel_confirmation_title">Atenção</string> - <string name="login_reset_password_cancel_confirmation_content">Sua senha ainda não foi alterada. + <string name="login_reset_password_error_not_found">Este email não está linkado a nenhuma conta</string> + <string name="login_reset_password_mail_confirmation_title">Cheque sua inbox</string> + <string name="login_reset_password_mail_confirmation_notice">Um email de verificação foi enviado para %1$s.</string> + <string name="login_reset_password_mail_confirmation_notice_2">Toque no link para confirmar sua nova senha. Uma vez que você tenha seguido o link que ele contém, clique abaixo.</string> + <string name="login_reset_password_mail_confirmation_submit">Eu tenho verificado meu endereço de email</string> + <string name="login_reset_password_success_title">Sucesso!</string> + <string name="login_reset_password_success_notice">Sua senha tem sido resettada.</string> + <string name="login_reset_password_success_notice_2">Você tem sido feito logout de todas suas sessões e você não vai mais receber notificações push. Para reativar notificações, faça signin de novo em cada dispositivo.</string> + <string name="login_reset_password_success_submit">Voltar para Fazer Signin</string> + <string name="login_reset_password_cancel_confirmation_title">Aviso</string> + <string name="login_reset_password_cancel_confirmation_content">Sua senha ainda não tem sido mudada. \n -\nInterromper a alteração de senha\?</string> - <string name="login_set_email_title">Defina um endereço de e-mail</string> - <string name="login_set_email_notice">Defina um e-mail para recuperar sua conta. Mais tarde, você pode, opcionalmente, permitir que as pessoas que você conhece o descubram por seu e-mail.</string> - <string name="login_set_email_mandatory_hint">E-mail</string> - <string name="login_set_email_optional_hint">E-mail (opcional)</string> +\nPara o processo de mudança de senha\?</string> + <string name="login_set_email_title">Definir endereço de email</string> + <string name="login_set_email_notice">Defina um email para recuperar sua conta. Mais tarde, você pode opcionalmente permitir pessoas que você conhece descobrirem você por seu email.</string> + <string name="login_set_email_mandatory_hint">Email</string> + <string name="login_set_email_optional_hint">Email (opcional)</string> <string name="login_set_email_submit">Próximo</string> - <string name="login_set_msisdn_title">Defina número de telefone</string> - <string name="login_set_msisdn_notice">Defina um número de telefone para, opcionalmente, permitir que as pessoas que você conhece o encontram.</string> - <string name="login_set_msisdn_notice2">Por favor, use o formato internacional.</string> + <string name="login_set_msisdn_title">Definir número de telefone</string> + <string name="login_set_msisdn_notice">Defina um número de telefone para opcionalmente permitir que pessoas que você conhece descubram você.</string> + <string name="login_set_msisdn_notice2">Por favor use o formato internacional.</string> <string name="login_set_msisdn_mandatory_hint">Número de telefone</string> <string name="login_set_msisdn_optional_hint">Número de telefone (opcional)</string> <string name="login_set_msisdn_submit">Próximo</string> - <string name="login_msisdn_confirm_title">Confirme o número de telefone</string> - <string name="login_msisdn_confirm_notice">Acabamos de enviar um código para %1$s. Digite-o abaixo para confirmar se é você.</string> - <string name="login_msisdn_confirm_hint">Digite o código</string> - <string name="login_msisdn_confirm_send_again">Enviar novamente</string> + <string name="login_msisdn_confirm_title">Confirmar número de telefone</string> + <string name="login_msisdn_confirm_notice">Nós acabamos de enviar um código para %1$s. Entre-o abaixo para verificar que é você.</string> + <string name="login_msisdn_confirm_hint">Entrar código</string> + <string name="login_msisdn_confirm_send_again">Enviar de novo</string> <string name="login_msisdn_confirm_submit">Próximo</string> - <string name="login_msisdn_error_not_international">Os números de telefone internacionais devem começar com \'+\'</string> - <string name="login_msisdn_error_other">O número de telefone parece inválido. Favor verificá-lo</string> - <string name="login_signup_to">Registar em %1$s</string> - <string name="login_signin_username_hint">Nome de usuário ou e-mail</string> - <string name="login_signup_username_hint">Nome de usuário</string> + <string name="login_msisdn_error_not_international">Números de telefone internacionais devem começar com \'+\'</string> + <string name="login_msisdn_error_other">Número de telefone parece inválido. Por favor cheque-o</string> + <string name="login_signup_to">Fazer signup a %1$s</string> + <string name="login_signin_username_hint">Nome de usuária(o) ou email</string> + <string name="login_signup_username_hint">Nome de usuária(o)</string> <string name="login_signup_password_hint">Senha</string> <string name="login_signup_submit">Próximo</string> - <string name="login_signup_error_user_in_use">Esse nome de usuário está indisponível</string> - <string name="login_signup_cancel_confirmation_title">Atenção</string> - <string name="login_signup_cancel_confirmation_content">Sua conta ainda não foi criada. + <string name="login_signup_error_user_in_use">Esse nome de usuária(o) está tomado</string> + <string name="login_signup_cancel_confirmation_title">Aviso</string> + <string name="login_signup_cancel_confirmation_content">Sua conta não foi criada ainda. \n -\nCancelar o processo de registro\?</string> - <string name="login_a11y_choose_matrix_org">Selecione matrix.org</string> - <string name="login_a11y_choose_modular">Selecione Element nos Serviços de Matrix</string> - <string name="login_a11y_choose_other">Selecione um servidor personalizado</string> - <string name="login_a11y_captcha_container">Por favor, realize o desafio de Captcha</string> - <string name="login_terms_title">Aceitar termos para continuar</string> - <string name="login_wait_for_email_title">Por favor, verifique seu e-mail</string> - <string name="login_wait_for_email_notice">Acabamos de enviar um e-mail para %1$s. -\nPor favor, clique no link que ele contém para continuar a criação da conta.</string> - <string name="login_validation_code_is_not_correct">O código digitado não está correto. Por favor, verifique-o.</string> - <string name="login_error_outdated_homeserver_title">Servidor desatualizado</string> - <string name="login_error_outdated_homeserver_content">Este servidor tem uma versão muito antiga que não é compatível com nosso servidor. Peça ao administrador para fazer atualização.</string> +\nParar o processo de registro\?</string> + <string name="login_a11y_choose_matrix_org">Selecionar matrix.org</string> + <string name="login_a11y_choose_modular">Selecionar Element Matrix Services</string> + <string name="login_a11y_choose_other">Selecionar um servidorcasa personalizado</string> + <string name="login_a11y_captcha_container">Por favor performe o desafio de captcha</string> + <string name="login_terms_title">Aceite termos para continuar</string> + <string name="login_wait_for_email_title">Por favor cheque seu email</string> + <string name="login_wait_for_email_notice">Nós acabamos de enviar um email para %1$s. +\nPor favor clique no link que ele contém para continuar a criação de conta.</string> + <string name="login_validation_code_is_not_correct">O código entrado não está correto. Por favor cheque.</string> + <string name="login_error_outdated_homeserver_title">Servidorcasa desatualizado</string> + <string name="login_error_outdated_homeserver_content">Este servidorcasa está rodando uma versão antiga demais para se conectar a ele. Peça à/ao admin de seu servidorcasa para fazer upgrade.</string> <plurals name="login_error_limit_exceeded_retry_after"> - <item quantity="one">Recebemos demasiado pedidos. Você pode tentar novamente em %1$d segundo…</item> - <item quantity="other">Recebemos demasiado pedidos. Você pode tentar novamente em %1$d segundos…</item> + <item quantity="one">Requisições demais têm sido enviadas. Você pode retentar em %1$d segundo…</item> + <item quantity="other">Requisições demais têm sido enviadas. Você pode retentar em %1$d segundos…</item> </plurals> - <string name="login_connect_using_matrix_id_notice">Alternativamente, se você já tem uma conta e conhece a sua ID de usuário na Matrix e a senha, você pode usar este método:</string> - <string name="login_connect_using_matrix_id_submit">Entre com ID do Matrix</string> - <string name="login_signin_matrix_id_title">Entre com ID do Matrix</string> - <string name="login_signin_matrix_id_notice">Se você criar uma conta no servidor local, use ID do Matrix (e.g. @user:domain.com) e a senha abaixo.</string> - <string name="login_signin_matrix_id_hint">ID do Matrix</string> - <string name="login_signin_matrix_id_password_notice">Se você não souber sua senha, volte para redefinir-a.</string> - <string name="login_signin_matrix_id_error_invalid_matrix_id">Este não é um identificador de usuário válido. Formato esperado: \'@user:homeserver.org\'</string> - <string name="autodiscover_well_known_error">Incapaz de encontrar um servidor válido. Por favor, verifique seu identificador</string> - <string name="seen_by">Lida por</string> - <string name="signed_out_title">Você está desconectada/o</string> - <string name="signed_out_notice">Isso pode ser devido à vários motivos: + <string name="login_connect_using_matrix_id_notice">Alternativamente, se você já tem uma conta e sabe seu identificador Matrix e sua senha, você pode usar este método:</string> + <string name="login_connect_using_matrix_id_submit">Fazer signin com ID Matrix</string> + <string name="login_signin_matrix_id_title">Fazer signin com ID Matrix</string> + <string name="login_signin_matrix_id_notice">Se você configurar uma conta em um servidorcasa, use sua ID Matrix (e.g. @usuarix:dominio.com) e senha abaixo.</string> + <string name="login_signin_matrix_id_hint">ID Matrix</string> + <string name="login_signin_matrix_id_password_notice">Se você não sabe sua senha, volte para resettá-la.</string> + <string name="login_signin_matrix_id_error_invalid_matrix_id">Este não é um identificador de usuária(o) válido. Formato esperado: \'@usuarix:servidorcasa.org\'</string> + <string name="autodiscover_well_known_error">Incapaz de encontrar um servidorcasa válido. Por favor cheque seu identificador</string> + <string name="seen_by">Vista por</string> + <string name="signed_out_title">Você fez signout</string> + <string name="signed_out_notice">Pode ser devido a várias razões: \n -\n• Você alterou sua senha em outra sessão. +\n• Você tem mudado sua senha numa outra sessão. \n -\n• Você excluiu esta sessão de outra sessão. +\n• Você tem deletado esta sessão de uma outra sessão. \n -\n• O administrador do seu servidor invalidou seu acesso por motivos de segurança.</string> - <string name="signed_out_submit">Entrar novamente</string> - <string name="soft_logout_title">Você está desconectada/o</string> - <string name="soft_logout_signin_title">Entrar</string> - <string name="soft_logout_signin_notice">Administrador do seu servidor (%1$s) invalidou seu acesso %2$s (%3$s).</string> - <string name="soft_logout_signin_e2e_warning_notice">Faça login para recuperar as chaves de criptografia armazenadas exclusivamente neste aparelho. Você precisa delas para ler todas as suas mensagens seguras em qualquer aparelho.</string> - <string name="soft_logout_signin_submit">Entrar</string> +\n• O/a administrador(a) de seu servidor tem invalidado seu acesso por razão de segurança.</string> + <string name="signed_out_submit">Fazer signin de novo</string> + <string name="soft_logout_title">Você fez signout</string> + <string name="soft_logout_signin_title">Fazer signin</string> + <string name="soft_logout_signin_notice">A/o admin de seu servidorcasa (%1$s) fez seu signout de sua conta %2$s (%3$s).</string> + <string name="soft_logout_signin_e2e_warning_notice">Faça signin para recuperar chaves de encriptação armazenadas exclusivamente neste dispositivo. Você precisa delas para ler todas suas mensagens seguras em qualquer dispositivo.</string> + <string name="soft_logout_signin_submit">Fazer signin</string> <string name="soft_logout_signin_password_hint">Senha</string> <string name="soft_logout_clear_data_title">Limpar dados pessoais</string> - <string name="soft_logout_clear_data_notice">Atenção: Seus dados pessoais (incluindo chaves de criptografia) ainda estão armazenados neste aparelho. + <string name="soft_logout_clear_data_notice">Aviso: Seus dados pessoais (incluindo chaves de encriptação) ainda estão armazenados neste dispositivo. \n -\nApague-os quando não usar mais este aparelho, ou se quiser entrar em outra conta.</string> +\nLimpe-os quando você estiver terminado de usar este dispositivo, ou quiser fazer signin numa outra conta.</string> <string name="soft_logout_clear_data_submit">Limpar todos os dados</string> <string name="soft_logout_clear_data_dialog_title">Limpar dados</string> - <string name="soft_logout_clear_data_dialog_content">Limpar todos os dados atualmente armazenados neste aparelho\? -\nEntre novamente para acessar os dados e mensagens da sua conta.</string> - <string name="soft_logout_clear_data_dialog_e2e_warning_content">Você perderá o acesso as mensagens seguras a menos que você faça login para recuperar suas chaves de criptografia.</string> + <string name="soft_logout_clear_data_dialog_content">Limpar todos os dados atualmente armazenados neste dispositivo\? +\nFaça signin de novo para acessar os dados e mensagens de sua conta.</string> + <string name="soft_logout_clear_data_dialog_e2e_warning_content">Você vai perder acesso a mensagens seguras a menos que você faça signin para recuperar suas chaves de encriptação.</string> <string name="soft_logout_clear_data_dialog_submit">Limpar dados</string> - <string name="template_soft_logout_sso_not_same_user_error">A sessão atual é para o usuário %1$s e você fornece credenciais para o usuário %2$s. Isto não é suportado no ${app_name}. -\nPor favor, limpe os dados do aplicativo, depois faça o login novamente em outra conta.</string> - <string name="permalink_malformed">Seu link do matrix.to foi malformado</string> + <string name="template_soft_logout_sso_not_same_user_error">A sessão atual é para usuária(o) %1$s e você provê credenciais para usuária(o) %2$s. Isto não é suportado por ${app_name}. +\nPor favor primeiro limpe dados, então faça signin de novo em uma outra conta.</string> + <string name="permalink_malformed">Seu link matrix.to foi malformado</string> <string name="bug_report_error_too_short">A descrição é curta demais</string> - <string name="notification_initial_sync">Sincronia Inicial…</string> - <string name="settings_show_devices_list">Veja todas as minhas sessões</string> + <string name="notification_initial_sync">Sinc Inicial…</string> + <string name="settings_show_devices_list">Ver todas minhas sessões</string> <string name="settings_advanced_settings">Configurações avançadas</string> - <string name="settings_developer_mode">Modo desenvolvedor</string> - <string name="settings_developer_mode_summary">O modo de desenvolvedor permite ativar recursos ocultos, o que pode tornar o aplicativo menos estável. Somente para desenvolvedores!</string> - <string name="settings_rageshake">Agitar celular</string> - <string name="settings_rageshake_detection_threshold">Detectar patamar</string> + <string name="settings_developer_mode">Modo desenvolvedor(a)</string> + <string name="settings_developer_mode_summary">O modo desenvolvedor(a) ativa funcionalidades escondidas e também pode fazer o aplicativo menos estável. Para desenvolvedores(as) somente!</string> + <string name="settings_rageshake">Rageshake</string> + <string name="settings_rageshake_detection_threshold">Limiar de detecção</string> <string name="settings_rageshake_detection_threshold_summary">Agite seu telefone para testar o limiar de detecção</string> - <string name="rageshake_detected">A sacudida detectada!</string> + <string name="rageshake_detected">Agitação detectada!</string> <string name="settings">Configurações</string> <string name="devices_current_device">Sessão atual</string> <string name="devices_other_devices">Outras sessões</string> - <string name="autocomplete_limited_results">Mostrando apenas os primeiros resultados, digite mais letras…</string> - <string name="settings_developer_mode_fail_fast_title">Relatar imediatamente as falhas</string> - <string name="template_settings_developer_mode_fail_fast_summary">${app_name} poderá quebrar com mais frequência quando ocorrer um erro inesperado</string> - <string name="command_description_shrug">Adiciona ¯\\_(ツ)_/¯ a uma mensagem de texto</string> - <string name="create_room_encryption_title">Ativar criptografia</string> - <string name="create_room_encryption_description">Uma vez ativada, a criptografia não poderá ser desativada.</string> - <string name="login_error_threepid_denied">Seu domínio de e-mail não está permitido a se registrar neste servidor</string> - <string name="verification_conclusion_warning">Entrada não confiável</string> - <string name="verification_sas_match">Correspondem</string> - <string name="verification_sas_do_not_match">Não correspondem</string> - <string name="verify_user_sas_emoji_help_text">Confirme este usuário, comparando os emojis a seguir que serão exibidos na tela dele, na mesma ordem.</string> - <string name="verify_user_sas_emoji_security_tip">Para maior segurança, use outro meio de comunicação confiável ou faça isso pessoalmente.</string> - <string name="verification_green_shield">Procure o escudo verde para garantir que um usuário seja confiável. Confie em todos os usuários numa sala para garantir que a sala é segura.</string> + <string name="autocomplete_limited_results">Mostrando somente os primeiros resultados, digite mais letras…</string> + <string name="settings_developer_mode_fail_fast_title">Rápida-falha</string> + <string name="template_settings_developer_mode_fail_fast_summary">${app_name} pode crashar com mais frequência quando um erro inesperado ocorre</string> + <string name="command_description_shrug">Prepende ¯\\_(ツ)_/¯ a uma mensagem de texto puro</string> + <string name="create_room_encryption_title">Ativar encriptação</string> + <string name="create_room_encryption_description">Uma vez ativada, encriptação não poder ser desativada.</string> + <string name="login_error_threepid_denied">Seu domínio de email não está autorizado a se registrar neste servidor</string> + <string name="verification_conclusion_warning">Signin desconfiado</string> + <string name="verification_sas_match">Eles correspondem</string> + <string name="verification_sas_do_not_match">Eles não correspondem</string> + <string name="verify_user_sas_emoji_help_text">Verifique esta(e) usuária(o) ao confirmar que os seguintes emoji únicos aparecem na tela dela(e), na mesma ordem.</string> + <string name="verify_user_sas_emoji_security_tip">Para máxima segurança, use um outro meio de comunicação confiado ou faça isto em pessoa.</string> + <string name="verification_green_shield">Procure pelo escudo verde para assegurar que um/uma usuário(a) é confiado. Confie em todos(as) os/as usuários(as) numa sala para assegurar que a sala é segura.</string> <string name="verification_conclusion_not_secure">Não seguro</string> - <string name="verification_conclusion_compromised">Um dos seguintes casos pode estar comprometido: + <string name="verification_conclusion_compromised">Um dos seguintes pode estar comprometido: \n -\n·- Seu servidor doméstico -\n·- O servidor do usuário que você está verificando -\n·- A sua, ou a conexão de outros usuários à internet -\n·- O seu, ou o aparelho dos outros usuários</string> +\n - Seu servidorcasa +\n - O servidorcasa da/do usuária(o) ao qual você está verificando está conectada(o) +\n - A conexão de internet sua ou da/do outra(o) usuária(o) +\n - O dispositivo seu ou da/do outra(o) usuária(o)</string> <string name="sent_a_video">Vídeo.</string> <string name="sent_an_image">Imagem.</string> <string name="sent_an_audio_file">Áudio</string> <string name="sent_a_file">Arquivo</string> - <string name="send_a_sticker">Figurinha</string> - <string name="verification_request_waiting">Aguardando…</string> + <string name="send_a_sticker">Sticker</string> + <string name="verification_request_waiting">Esperando…</string> <string name="verification_request_other_cancelled">%s cancelado</string> <string name="verification_request_you_cancelled">Você cancelou</string> <string name="verification_request_other_accepted">%s aceitou</string> <string name="verification_request_you_accepted">Você aceitou</string> - <string name="verification_sent">Confirmação enviada</string> - <string name="verification_request">Solicitação de confirmação</string> - <string name="verification_verify_device">Confirmar esta sessão</string> - <string name="verification_verify_device_manually">Confirmar manualmente</string> + <string name="verification_sent">Verificação Enviada</string> + <string name="verification_request">Requisição de Verificação</string> + <string name="verification_verify_device">Verificar esta sessão</string> + <string name="verification_verify_device_manually">Verificar manualmente</string> <string name="you">Você</string> - <string name="verification_scan_notice">Escaneie o código com a câmera do aparelho do outro usuário para confirmar a segurança entre vocês</string> - <string name="verification_scan_their_code">Escanea o código do seu contato</string> - <string name="verification_scan_emoji_title">Não pode escanear</string> - <string name="verification_scan_emoji_subtitle">Se você não está presente, alternativamente compare emoji</string> - <string name="verification_no_scan_emoji_title">Confirmar comparando emojis</string> - <string name="verify_by_emoji_title">Confirmar por emojis</string> - <string name="verify_by_emoji_description">Se você não consegue escanear o código acima, confirme via comparação de emojis.</string> - <string name="a13n_qr_code_description">Imagem em código QR</string> - <string name="verification_verify_user">Confirmar %s</string> - <string name="verification_verified_user">Confirmou %s</string> - <string name="verification_request_waiting_for">Aguardando por %s…</string> - <string name="verification_request_alert_description">Para segurança extra, confirme %s comparando um código único em ambos os aparelhos. + <string name="verification_scan_notice">Scanne o código com o dispositivo da/do outra(o) usuária(o) para verificar seguramente um/uma a/o outra(o)</string> + <string name="verification_scan_their_code">Scannar código dela(e)</string> + <string name="verification_scan_emoji_title">Não dá para scannar</string> + <string name="verification_scan_emoji_subtitle">Se você não está em pessoa, compare emoji em vez disso</string> + <string name="verification_no_scan_emoji_title">Verificar ao comparar emojis</string> + <string name="verify_by_emoji_title">Verificar por Emoji</string> + <string name="verify_by_emoji_description">Se você não pode scannar o código acima, verifique ao comparar uma seleção curta e única de emoji.</string> + <string name="a13n_qr_code_description">Imagem de QR code</string> + <string name="verification_verify_user">Verificar %s</string> + <string name="verification_verified_user">Verificou %s</string> + <string name="verification_request_waiting_for">Esperando por %s…</string> + <string name="verification_request_alert_description">Para segurança extra, verifique %s ao checar um código de única vez em ambos seus dispositivos. \n -\nPara máxima segurança, faça isso pessoalmente.</string> - <string name="room_profile_not_encrypted_subtitle">As mensagens nesta sala não estão criptografadas de ponta a ponta.</string> - <string name="room_profile_encrypted_subtitle">As mensagens nesta sala estão criptografadas de ponta a ponta. +\nPara máxima segurança, faça isto em pessoa.</string> + <string name="room_profile_not_encrypted_subtitle">Mensagens nesta sala não são encriptadas ponta-a-ponta.</string> + <string name="room_profile_encrypted_subtitle">Mensagens nesta sala são encriptadas ponta-a-ponta. \n -\nSuas mensagens estão protegidas com cadeados e somente você e o destinatário têm as chaves exclusivas que permitem a leitura delas.</string> +\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipente têm as chaves únicas para os destrancar.</string> <string name="room_profile_section_security">Segurança</string> <string name="room_profile_section_security_learn_more">Saiba mais</string> <string name="room_profile_section_more">Mais</string> - <string name="room_profile_section_admin">Ações do administrador</string> - <string name="room_profile_section_more_settings">Configurações da sala</string> + <string name="room_profile_section_admin">Ações de Admin</string> + <string name="room_profile_section_more_settings">Configurações de sala</string> <string name="room_profile_section_more_notifications">Notificações</string> <plurals name="room_profile_section_more_member_list"> <item quantity="one">Uma pessoa</item> <item quantity="other">%1$d pessoas</item> </plurals> - <string name="room_profile_section_more_uploads">Mídia e arquivos</string> - <string name="room_profile_section_more_leave">Sair da sala</string> - <string name="room_profile_leaving_room">Deixando a sala…</string> - <string name="room_member_power_level_admins">Administradores</string> - <string name="room_member_power_level_moderators">Moderadores</string> + <string name="room_profile_section_more_uploads">Uploads</string> + <string name="room_profile_section_more_leave">Sair de Sala</string> + <string name="room_profile_leaving_room">Saindo da sala…</string> + <string name="room_member_power_level_admins">Admins</string> + <string name="room_member_power_level_moderators">Moderadoras(es)</string> <string name="room_member_power_level_custom">Personalizado</string> <string name="room_member_power_level_invites">Convites</string> - <string name="room_member_power_level_users">Usuários</string> - <string name="room_member_power_level_admin_in">Administrador em %1$s</string> - <string name="room_member_power_level_moderator_in">Moderador em %1$s</string> - <string name="room_member_power_level_default_in">Padrão em %1$s</string> + <string name="room_member_power_level_users">Usuárias(os)</string> + <string name="room_member_power_level_admin_in">Admin em %1$s</string> + <string name="room_member_power_level_moderator_in">Moderador(a) em %1$s</string> + <string name="room_member_power_level_default_in">Default em %1$s</string> <string name="room_member_power_level_custom_in">Personalizado (%1$d) em %2$s</string> - <string name="room_member_jump_to_read_receipt">Ir para a confirmação de leitura</string> - <string name="template_rendering_event_error_type_of_event_not_handled">${app_name} não lida com eventos do tipo \'%1$s\'</string> - <string name="template_rendering_event_error_type_of_message_not_handled">${app_name} não lida com mensagens do tipo \'%1$s\'</string> - <string name="template_rendering_event_error_exception">${app_name} encontrou um problema ao render o conteúdo de um evento com \'%1$s\' ID</string> - <string name="unignore">Desbloquear</string> - <string name="verify_cannot_cross_sign">Esta sessão não pode compartilhar essa confirmação com suas outras sessões. -\nA confirmação será salvada localmente e será compartilhada em uma versão futura do aplicativo.</string> + <string name="room_member_jump_to_read_receipt">Pular para recibo de leitura</string> + <string name="template_rendering_event_error_type_of_event_not_handled">${app_name} não lida com eventos de tipo \'%1$s\'</string> + <string name="template_rendering_event_error_type_of_message_not_handled">${app_name} não lida com mensagens de tipo \'%1$s\'</string> + <string name="template_rendering_event_error_exception">${app_name} encontrou um problema ao render conteúdo de evento com id \'%1$s\'</string> + <string name="unignore">Designorar</string> + <string name="verify_cannot_cross_sign">Esta sessão é incapaz de compartilhar essa verificação com suas outras sessões. +\nA confirmação vai ser salvada localmente e compartilhada numa versão futura do app.</string> <string name="room_list_sharing_header_recent_rooms">Salas recentes</string> <string name="room_list_sharing_header_other_rooms">Outras salas</string> - <string name="command_description_rainbow">Envia a mensagem colorida como arco-íris</string> - <string name="command_description_rainbow_emote">Envia o emoji colorido como um arco-íris</string> - <string name="settings_category_timeline">Conversas</string> - <string name="settings_category_composer">Campo de texto</string> - <string name="room_settings_enable_encryption">Ativar a criptografia de ponta a ponta…</string> - <string name="room_settings_enable_encryption_warning">Uma vez ativada, a criptografia não poderá ser desativada.</string> - <string name="room_settings_enable_encryption_dialog_title">Ativar criptografia\?</string> - <string name="room_settings_enable_encryption_dialog_content">Uma vez ativada, a criptografia de uma sala não pode ser desativada. As mensagens enviadas em uma sala criptografada não podem ser lidas pelo servidor, apenas pelos participantes desta sala. A ativação da criptografia pode impedir que muitos bots e integrações funcionem corretamente.</string> - <string name="room_settings_enable_encryption_dialog_submit">Ativar criptografia</string> - <string name="verification_request_notice">Para ficar seguro, confirme %s comparando um código único.</string> - <string name="verification_request_start_notice">Para sua segurança, faça isso pessoalmente ou use outra forma confiável de comunicação.</string> + <string name="command_description_rainbow">Envia a dada mensagem colorida como um arco-íris</string> + <string name="command_description_rainbow_emote">Envia o dado emote colorido como um arco-íris</string> + <string name="settings_category_timeline">Timeline</string> + <string name="settings_category_composer">Editor de mensagem</string> + <string name="room_settings_enable_encryption">Ativar encriptação ponta-a-ponta…</string> + <string name="room_settings_enable_encryption_warning">Uma vez ativada, encriptação não poder ser desativada.</string> + <string name="room_settings_enable_encryption_dialog_title">Ativar encriptação\?</string> + <string name="room_settings_enable_encryption_dialog_content">Uma vez ativada, encriptação para uma sala não pode ser desativada. Mensagens enviadas numa sala encriptada não podem ser vistas pelo servidor, somente pelas(os) participantes da sala. Ativar encriptação pode prevenir que muitos bots e bridges de funcionarem corretamente.</string> + <string name="room_settings_enable_encryption_dialog_submit">Ativar encriptação</string> + <string name="verification_request_notice">Para estar segura(o), verifique %s ao checar um código de única vez.</string> + <string name="verification_request_start_notice">Para estar segura(o), faça isto em pessoa ou use uma outra forma de se comunicar.</string> <string name="verification_emoji_notice">Compare os emoji únicos, assegurando que eles apareçam na mesma ordem.</string> - <string name="verification_code_notice">Compare o código com o exibido na tela do outro usuário.</string> - <string name="verification_conclusion_ok_notice">As mensagens com este usuário estão criptografadas de ponta a ponta e não podem ser lidas por terceiros.</string> - <string name="verification_conclusion_ok_self_notice">Sua nova sessão agora está confirmada. Ela tem acesso às suas mensagens criptografadas, e outros usuários a verão como confirmada.</string> - <string name="encryption_information_cross_signing_state">Autoverificação</string> - <string name="encryption_information_dg_xsigning_complete">A autoverificação está ativada -\nChaves privadas estão no aparelho.</string> - <string name="encryption_information_dg_xsigning_trusted">A autoverificação está ativada -\nAs chaves são confiáveis. -\nAs chaves privadas não são conhecidas</string> - <string name="encryption_information_dg_xsigning_not_trusted">A autoverificação está ativada. -\nAs chaves não são confiáveis</string> - <string name="encryption_information_dg_xsigning_disabled">A autoverificação não está ativada</string> - <string name="settings_hs_admin_e2e_disabled">O administrador do servidor desativou a criptografia de ponta a ponta por padrão em salas privadas e em conversas.</string> - <string name="settings_active_sessions_list">Sessões ativas</string> - <string name="settings_active_sessions_show_all">Veja todas as sessões</string> - <string name="settings_active_sessions_manage">Gerenciar sessões</string> - <string name="settings_active_sessions_signout_device">Sair desta sessão</string> - <string name="settings_failed_to_get_crypto_device_info">Não há informações criptográficas disponíveis</string> - <string name="settings_active_sessions_verified_device_desc">Esta sessão é confiável para o envio de mensagens seguras porque você a confirmou:</string> - <string name="settings_active_sessions_unverified_device_desc">Confirme esta sessão para conceder para ela o acesso a mensagens criptografadas. Se você não entrou nesta sessão, sua conta pode estar comprometida:</string> + <string name="verification_code_notice">Compare o código com aquele exibido na tela da/do outra(o) usuária(o).</string> + <string name="verification_conclusion_ok_notice">Mensagens com esta(e) usuária(o) são encriptadas ponta-a-ponta e não podem ser lidas por terceiros.</string> + <string name="verification_conclusion_ok_self_notice">Sua nova sessão agora está confirmada. Ela tem acesso a suas mensagens encriptadas, e outras(os) usuárias(os) vão vê-la como confiada.</string> + <string name="encryption_information_cross_signing_state">Assinatura Cruzada</string> + <string name="encryption_information_dg_xsigning_complete">Assinatura Cruzada está ativada +\nChaves Privadas em dispositivo.</string> + <string name="encryption_information_dg_xsigning_trusted">Assinatura Cruzada está ativada +\nChaves são confiadas. +\nChaves privadas não são conhecidas</string> + <string name="encryption_information_dg_xsigning_not_trusted">Assinatura Cruzada está ativada. +\nChaves não são confiadas</string> + <string name="encryption_information_dg_xsigning_disabled">Assinatura Cruzada não está ativada</string> + <string name="settings_hs_admin_e2e_disabled">O/a administrador(a) de seu servidor tem desativado encriptação ponta-a-ponta por default em salas privadas & Mensagens Diretas.</string> + <string name="settings_active_sessions_list">Sessões Ativas</string> + <string name="settings_active_sessions_show_all">Mostrar Todas as Sessões</string> + <string name="settings_active_sessions_manage">Gerenciar Sessões</string> + <string name="settings_active_sessions_signout_device">Fazer signout desta sessão</string> + <string name="settings_failed_to_get_crypto_device_info">Nenhuma informação criptográfica disponível</string> + <string name="settings_active_sessions_verified_device_desc">Esta sessão é confiada para mensageria segura porque você a verificou:</string> + <string name="settings_active_sessions_unverified_device_desc">Verifique esta sessão para marcá-la como confiada & garantir-lhe acesso a mensagens encriptadas. Se você não fez signin a esta sessão sua conta pode estar comprometida:</string> <plurals name="settings_active_sessions_count"> <item quantity="one">%d sessão ativa</item> <item quantity="other">%d sessões ativas</item> </plurals> - <string name="crosssigning_verify_this_session">Confirmar este acesso</string> - <string name="crosssigning_other_user_not_trust">Outros usuários podem não confiar nela</string> - <string name="complete_security">Segurança completa</string> - <string name="verification_open_other_to_verify">Use uma sessão existente para confirmar a nova sessão, dando a ela acesso às mensagens criptografadas.</string> - <string name="verification_profile_verify">Confirmar</string> - <string name="verification_profile_verified">Confirmado</string> - <string name="verification_profile_warning">Atenção</string> - <string name="room_member_profile_failed_to_get_devices">Falha em obter sessões</string> + <string name="crosssigning_verify_this_session">Verificar este login</string> + <string name="crosssigning_other_user_not_trust">Outras(os) usuárias(os) podem não confiar nela</string> + <string name="complete_security">Completar Segurança</string> + <string name="verification_open_other_to_verify">Use uma sessão existente para verificar esta aqui, garantindo-lhe acesso a mensagens encriptadas.</string> + <string name="verification_profile_verify">Verificar</string> + <string name="verification_profile_verified">Verificada</string> + <string name="verification_profile_warning">Aviso</string> + <string name="room_member_profile_failed_to_get_devices">Falha para obter sessões</string> <string name="room_member_profile_sessions_section_title">Sessões</string> - <string name="trusted">Confiável</string> - <string name="not_trusted">Não confiável</string> - <string name="verification_profile_device_verified_because">Esta sessão está confirmada para trocar mensagens seguras porque %1$s (%2$s) a confirmou:</string> - <string name="verification_profile_device_new_signing">%1$s (%2$s) entrou usando uma nova sessão:</string> - <string name="verification_profile_device_untrust_info">Até que este usuário confirme esta sessão, as mensagens enviadas de e para ela são etiquetadas com avisos. Alternativamente, é possível confirmar a sessão manualmente.</string> - <string name="initialize_cross_signing">Ativar a autoverificação</string> - <string name="reset_cross_signing">Reiniciar Chaves</string> - <string name="a11y_qr_code_for_verification">Código QR</string> - <string name="qr_code_scanned_by_other_notice">Quase lá! Este escudo também aparece para %s\?</string> + <string name="trusted">Confiada</string> + <string name="not_trusted">Não Confiada</string> + <string name="verification_profile_device_verified_because">Esta sessão está confiada para mensageria segura porque %1$s (%2$s) a verificou:</string> + <string name="verification_profile_device_new_signing">%1$s (%2$s) fez signin usando uma nova sessão:</string> + <string name="verification_profile_device_untrust_info">Até que esta(e) usuária(o) confie nesta sessão, mensagens enviadas para e desde ela são etiquetadas com avisos. Alternativamente, você pode verificá-la manualmente.</string> + <string name="initialize_cross_signing">Inicializar AssinaturaCruzada</string> + <string name="reset_cross_signing">Resettar Chaves</string> + <string name="a11y_qr_code_for_verification">QR code</string> + <string name="qr_code_scanned_by_other_notice">Quase lá! %s está mostrando o mesmo escudo\?</string> <string name="qr_code_scanned_by_other_yes">Sim</string> <string name="qr_code_scanned_by_other_no">Não</string> - <string name="no_connectivity_to_the_server_indicator">A conexão com o servidor foi perdida</string> - <string name="no_connectivity_to_the_server_indicator_airplane">O modo de Avião está ativo</string> - <string name="settings_dev_tools">Ferramentas do Desenvolvedor</string> - <string name="settings_account_data">Dados da Conta</string> + <string name="no_connectivity_to_the_server_indicator">Conectividade ao servidor tem sido perdida</string> + <string name="no_connectivity_to_the_server_indicator_airplane">Modo avião está ligado</string> + <string name="settings_dev_tools">Ferramentas Dev</string> + <string name="settings_account_data">Dados de Conta</string> <plurals name="poll_info"> <item quantity="one">%d voto</item> <item quantity="other">%d votos</item> @@ -2137,258 +2137,258 @@ <item quantity="other">%d votos - Resultados finais</item> </plurals> <string name="poll_item_selected_aria">Opção Selecionada</string> - <string name="command_description_poll">Cria uma pesquisa simples</string> - <string name="verification_cannot_access_other_session">Use a Chave ou a Frase Secreta de Recuperação</string> - <string name="verification_use_passphrase">Se você não pode entrar numa sessão existente</string> - <string name="new_signin">Entrar de Novo</string> - <string name="enter_secret_storage_invalid">Não é possível encontrar segredos no armazenamento</string> - <string name="enter_secret_storage_passphrase">Digite a frase secreta de armazenamento</string> - <string name="enter_secret_storage_passphrase_warning">Atenção:</string> - <string name="enter_secret_storage_passphrase_warning_text">Você só deveria entrar no armazenamento secreto a partir de um aparelho confiável</string> - <string name="message_action_item_redact">Apagar</string> - <string name="share_confirm_room">Deseja enviar este anexo para %1$s\?</string> + <string name="command_description_poll">Cria uma sondagem simples</string> + <string name="verification_cannot_access_other_session">Use uma Chave ou a Frasepasse de Recuperação</string> + <string name="verification_use_passphrase">Se você não pode acessar uma sessão existente</string> + <string name="new_signin">Novo Sign In</string> + <string name="enter_secret_storage_invalid">Não dá para encontrar segredos em armazenamento</string> + <string name="enter_secret_storage_passphrase">Entrar frasepasse de armazenamento secreto</string> + <string name="enter_secret_storage_passphrase_warning">Aviso:</string> + <string name="enter_secret_storage_passphrase_warning_text">Você somente deveria acessar armazenamento secreto a partir de um dispositivo confiado</string> + <string name="message_action_item_redact">Remover…</string> + <string name="share_confirm_room">Você quer enviar este anexo para %1$s\?</string> <plurals name="send_images_with_original_size"> - <item quantity="one">Enviar imagem no tamanho original</item> - <item quantity="other">Enviar imagens no tamanho original</item> + <item quantity="one">Enviar imagem com o tamanho original</item> + <item quantity="other">Enviar imagens com o tamanho original</item> </plurals> - <string name="delete_event_dialog_title">Confirmar a exclusão</string> - <string name="delete_event_dialog_content">Tem certeza de que deseja apagar este evento\? Observe que, se você apagar a alteração do nome ou descrição de uma sala, isso reverterá a alteração.</string> - <string name="delete_event_dialog_reason_checkbox">Incluir o motivo</string> - <string name="delete_event_dialog_reason_hint">Motivo da edição</string> - <string name="event_redacted_by_user_reason_with_reason">Evento apagado pelo usuário, motivo: %1$s</string> - <string name="event_redacted_by_admin_reason_with_reason">Evento moderado pelo administrador da sala, motivo: %1$s</string> - <string name="keys_backup_restore_success_title_already_up_to_date">As chaves já estão atualizadas!</string> - <string name="template_login_default_session_public_name">${app_name} para Android</string> - <string name="settings_key_requests">A chave pede</string> - <string name="e2e_use_keybackup">Desbloquear histórico de mensagens criptografadas</string> + <string name="delete_event_dialog_title">Confirmar Remoção</string> + <string name="delete_event_dialog_content">Você tem certeza que você deseja remover (deletar) este evento\? Note que se você deletar um nome de sala ou mudança de tópico, poderia desfazer a mudança.</string> + <string name="delete_event_dialog_reason_checkbox">Incluir uma razão</string> + <string name="delete_event_dialog_reason_hint">Razão para redigir</string> + <string name="event_redacted_by_user_reason_with_reason">Evento deletado por usuária(o), razão: %1$s</string> + <string name="event_redacted_by_admin_reason_with_reason">Evento moderado por admin de sala, razão: %1$s</string> + <string name="keys_backup_restore_success_title_already_up_to_date">Chaves já estão atualizadas!</string> + <string name="template_login_default_session_public_name">${app_name} Android</string> + <string name="settings_key_requests">Requisições de Chave</string> + <string name="e2e_use_keybackup">Destrancar histórico de mensagens encriptadas</string> <string name="refresh">Recarregar</string> <string name="new_session">Novo login. Foi você\?</string> - <string name="new_session_review">Toque para revisar e confirmar</string> - <string name="verify_new_session_notice">Use esta sessão para confirmar a sua nova sessão, dando a ela acesso às mensagens criptografadas.</string> + <string name="new_session_review">Toque para revisar & verificar</string> + <string name="verify_new_session_notice">Use esta sessão para verificar sua nova, garantindo-lhe acesso a mensagens encriptadas.</string> <string name="verify_new_session_was_not_me">Não foi eu</string> <string name="verify_new_session_compromized">Sua conta pode estar comprometida</string> - <string name="verify_cancel_self_verification_from_untrusted">Se você cancelar, não será capaz de ler mensagens criptografadas neste aparelho, e outros usuários não confiarão nele</string> - <string name="verify_cancel_self_verification_from_trusted">Se você cancelar, você não poderá ler mensagens criptografadas em seu novo aparelho, e outros usuários não confiarão nele</string> - <string name="verify_cancel_other">Você não confirmará %1$s (%2$s) se cancelar agora. Precisará começar novamente no perfil dele.</string> - <string name="verify_not_me_self_verification">Um dos seguintes casos pode estar comprometido: + <string name="verify_cancel_self_verification_from_untrusted">Se você cancelar, você não vai ser capaz de ler mensagens encriptadas neste dispositivo, e outras(os) usuárias(os) não vão confiar nele</string> + <string name="verify_cancel_self_verification_from_trusted">Se você cancelar, você não vai ser capaz de ler mensagens encriptadas em seu novo dispositivo, e outras(os) usuárias(os) não vão confiar nele</string> + <string name="verify_cancel_other">Você não vai verificar %1$s (%2$s) se cancelar agora. Comece de novo no perfil de usuária(o) dela(e).</string> + <string name="verify_not_me_self_verification">Um dos seguintes pode estar comprometido: \n \n- Sua senha -\n- Seu servidor doméstico -\n- Este aparelho, ou o outro aparelho -\n- A conexão à internet de qualquer um dos aparelhos que você está usando +\n- Seu servidorcasa +\n- Este dispositivo, ou o outro dispositivo +\n- A conexão de internet que qualquer um dos dois dispositivos está usando \n -\nRecomendamos que você altere imediatamente a sua senha e a chave de recuperação em Configurações.</string> - <string name="verify_cancelled_notice">Confirme seus aparelhos em Configurações.</string> - <string name="verification_cancelled">Confirmação cancelada</string> - <string name="recovery_passphrase">Digite a frase secreta de recuperação</string> - <string name="message_key">Chave da Mensagem</string> +\nNós recomendamos que você mude sua senha & chave de recuperação em Configurações imediatamente.</string> + <string name="verify_cancelled_notice">Verifique seus dispositivos desde Configurações.</string> + <string name="verification_cancelled">Verificação Cancelada</string> + <string name="recovery_passphrase">Frasepasse de Recuperação</string> + <string name="message_key">Chave de Mensagem</string> <string name="account_password">Senha da Conta</string> - <string name="set_recovery_passphrase">Definir o %s</string> + <string name="set_recovery_passphrase">Definir uma %s</string> <string name="generate_message_key">Gerar uma Chave de Mensagem</string> - <string name="confirm_recovery_passphrase">Confirme %s</string> - <string name="enter_account_password">Digite sua %s para continuar.</string> - <string name="bootstrap_info_text">Proteja e desbloqueie mensagens criptografadas e confia com um %s.</string> - <string name="bootstrap_info_confirm_text">Digite novamente seu %s para confirmar.</string> - <string name="bootstrap_dont_reuse_pwd">Não use a senha da sua conta.</string> - <string name="bootstrap_info_text_2">Digite uma frase de segurança que só você conheça, usada para proteger os segredos em seu servidor.</string> - <string name="bootstrap_loading_text">Isto pode levar vários segundos, seja paciente.</string> - <string name="bootstrap_loading_title">Criação de recuperação.</string> + <string name="confirm_recovery_passphrase">Confirmar %s</string> + <string name="enter_account_password">Entre sua %s para continuar.</string> + <string name="bootstrap_info_text">Assegure & destranque mensagens encriptadas e confie com uma %s.</string> + <string name="bootstrap_info_confirm_text">Entre sua %s de novo para confirmá-la.</string> + <string name="bootstrap_dont_reuse_pwd">Não use a senha de sua conta.</string> + <string name="bootstrap_info_text_2">Entre uma frase de segurança que só você conheça, usada para assegurar segredos em seu servidor.</string> + <string name="bootstrap_loading_text">Isto pode levar muitos segundos, por favor seja paciente.</string> + <string name="bootstrap_loading_title">Configurando recuperação.</string> <string name="your_recovery_key">Sua chave de recuperação</string> <string name="bootstrap_finish_title">Tudo pronto!</string> - <string name="keep_it_safe">Guarde num local seguro</string> - <string name="finish">Encerrar</string> - <string name="bootstrap_save_key_description">Use isto %1$s como uma rede de segurança caso você esqueça sua %2$s.</string> - <string name="bootstrap_crosssigning_progress_initializing">Publicando as chaves de identidade criadas</string> - <string name="bootstrap_crosssigning_progress_pbkdf2">Gerando uma chave segura a partir de uma frase secreta</string> - <string name="bootstrap_crosssigning_progress_default_key">Definindo a chave padrão SSSS</string> - <string name="bootstrap_crosssigning_progress_save_msk">Sincronização da chave Geral</string> - <string name="bootstrap_crosssigning_progress_save_usk">Sincronização da chave do Usuário</string> - <string name="bootstrap_crosssigning_progress_save_ssk">Sincronizando a chave de Auto-Assinatura</string> - <string name="bootstrap_crosssigning_progress_key_backup">Criando o backup da chave</string> + <string name="keep_it_safe">Mantenha-a segura</string> + <string name="finish">Finalizar</string> + <string name="bootstrap_save_key_description">Use esta %1$s como uma rede de segurança em caso você esqueça sua %2$s.</string> + <string name="bootstrap_crosssigning_progress_initializing">Publicando chaves de identidade criadas</string> + <string name="bootstrap_crosssigning_progress_pbkdf2">Gerando chave segura desde frasepasse</string> + <string name="bootstrap_crosssigning_progress_default_key">Definindo a Chave default SSSS</string> + <string name="bootstrap_crosssigning_progress_save_msk">Sincronizando Master key</string> + <string name="bootstrap_crosssigning_progress_save_usk">Sincronizando User key</string> + <string name="bootstrap_crosssigning_progress_save_ssk">Sincronizando Self Signing key</string> + <string name="bootstrap_crosssigning_progress_key_backup">Configurando Backup de Chave</string> <string name="bootstrap_cross_signing_success">Suas %2$s & %1$s estão agora definidas. \n -\nSalva arquivos em local seguro! Você precisará deles para desbloquear mensagens criptografadas e proteger informações se perder todas as suas sessões ativas.</string> - <string name="bootstrap_crosssigning_print_it">Imprime e armazena em local seguro</string> - <string name="bootstrap_crosssigning_save_usb">Salve isto em uma chave USB ou unidade de backup</string> - <string name="bootstrap_crosssigning_save_cloud">Copia para sua nuvem pessoal</string> +\nMantenha-as seguras! Você vai precisar delas para destrancar mensagens encriptadas e informação segura se você perder todas as suas sessões ativas.</string> + <string name="bootstrap_crosssigning_print_it">Imprima-a e armazene-a em algum lugar seguro</string> + <string name="bootstrap_crosssigning_save_usb">Salve-a em uma chave USB ou drive de backup</string> + <string name="bootstrap_crosssigning_save_cloud">Copie-a para seu armazenamento nuvem pessoal</string> <string name="auth_flow_not_supported">Você não pode fazer isso por celular</string> - <string name="encryption_enabled">Criptografia ativada</string> - <string name="encryption_not_enabled">Criptografia desativada</string> - <string name="qr_code_scanned_verif_waiting">Aguardando por %s…</string> + <string name="encryption_enabled">Encriptação ativada</string> + <string name="encryption_not_enabled">Encriptação não ativada</string> + <string name="qr_code_scanned_verif_waiting">Esperando por %s…</string> <string name="settings_notification_configuration">Configuração de notificações</string> - <string name="settings_troubleshoot_title">Solução de problemas</string> - <string name="room_message_placeholder">Digite uma mensagem…</string> - <string name="use_file">Use Arquivo</string> - <string name="enter_backup_passphrase">Digite %s</string> - <string name="backup_recovery_passphrase">Frase Secreta de Recuperação</string> - <string name="bootstrap_progress_checking_backup">Verificando o backup de chave</string> - <string name="bootstrap_skip_text">Criando uma Frase Secreta de Recuperação permite proteger e desbloquear mensagens criptografadas e estabelecer confiança. + <string name="settings_troubleshoot_title">Solucionar problemas</string> + <string name="room_message_placeholder">Mensagem…</string> + <string name="use_file">Usar Arquivo</string> + <string name="enter_backup_passphrase">Entrar %s</string> + <string name="backup_recovery_passphrase">Frasepasse de Recuperação</string> + <string name="bootstrap_progress_checking_backup">Checando Chave de backup</string> + <string name="bootstrap_skip_text">Definir uma Frasepasse de Recuperação permite a você assegurar & destrancar mensagens encriptadas e confiança. \n -\nSe você não quiser definir uma Senha de Mensagem, crie antes uma Chave de Mensagem.</string> - <string name="bootstrap_skip_text_no_gen_key">Criar uma Frase Secreta de Recuperação permite proteger e desbloquear mensagens criptografadas e estabelecer confiança.</string> - <string name="bootstrap_cancel_text">Se você cancelar agora, poderá perder mensagens e dados criptografados para sempre se esquecer suas credenciais. -\n -\nVocê também pode configurar o Backup online e gerenciar suas chaves em Configurações.</string> - <string name="encryption_enabled_tile_description">As mensagens nesta sala estão criptografadas de ponta a ponta. Confirme os usuários em seus perfis.</string> - <string name="encryption_unknown_algorithm_tile_description">A criptografia usada por esta sala não é suportada</string> +\nSe você não quer definir uma Senha de Mensagem, gere uma Chave de Mensagem em vez disso.</string> + <string name="bootstrap_skip_text_no_gen_key">Definir uma Frasepasse de Recuperação permite a você assegurar & destrancar mensagens encriptadas e confiança.</string> + <string name="bootstrap_cancel_text">Se você cancelar agora, você pode perder mensagens & dados encriptados se você perder acesso a seus logins. +\n +\nVocê também pode configurar Backup Seguro & gerenciar suas chaves em Configurações.</string> + <string name="encryption_enabled_tile_description">Mensagens nesta sala são encriptadas ponta-a-ponta. Saiba mais & verifique usuárias(os) nos perfis delas(es).</string> + <string name="encryption_unknown_algorithm_tile_description">A encriptação usada por esta sala não é suportada</string> <string name="room_created_summary_item">%s criou e configurou a sala.</string> <string name="room_created_summary_item_by_you">Você criou e configurou a sala.</string> - <string name="qr_code_scanned_self_verif_notice">Quase lá! O outro aparelho está mostrando o mesmo escudo\?</string> - <string name="qr_code_scanned_verif_waiting_notice">Quase lá! Aguardando confirmação…</string> - <string name="error_failed_to_import_keys">Falha na importação de chaves</string> + <string name="qr_code_scanned_self_verif_notice">Quase lá! O outro dispositivo está mostrando o mesmo escudo\?</string> + <string name="qr_code_scanned_verif_waiting_notice">Quase lá! Esperando por confirmação…</string> + <string name="error_failed_to_import_keys">Falha para importar chaves</string> <string name="settings_messages_at_room">Mensagens contendo @room</string> - <string name="settings_messages_in_e2e_one_to_one">Mensagens criptografadas em conversas individuais</string> - <string name="settings_messages_in_e2e_group_chat">Mensagens criptografadas em salas</string> - <string name="settings_when_rooms_are_upgraded">Quando a versão da sala é atualizada</string> - <string name="settings_notification_advanced_summary">Ajustar as notificações por evento</string> - <string name="command_description_plain">Envia uma mensagem como texto simples, sem formatar o texto</string> - <string name="auth_invalid_login_param_space_in_password">Nome de usuário e/ou senha incorretos. A senha digitada começa ou termina com espaços, favor verificá-la.</string> - <string name="auth_invalid_login_deactivated_account">Esta conta foi desativada.</string> - <string name="upgrade_security">Atualização de criptografia disponível</string> - <string name="setup_cross_signing">Ativar a autoverificação</string> - <string name="security_prompt_text">Verifique-se e os outros para manter suas conversas seguras</string> - <string name="bootstrap_enter_recovery">Digite sua %s para continuar</string> + <string name="settings_messages_in_e2e_one_to_one">Mensagens encriptadas em conversas um-a-um</string> + <string name="settings_messages_in_e2e_group_chat">Mensagens encriptadas em chats de grupo</string> + <string name="settings_when_rooms_are_upgraded">Quando é feito upgrade de salas</string> + <string name="settings_notification_advanced_summary">Definir importância de notificação por evento</string> + <string name="command_description_plain">Envia uma mensagem como texto puro, sem interpretá-la como markdown</string> + <string name="auth_invalid_login_param_space_in_password">Nome de usuária(o) e/ou senha incorretos. A senha entrada começa ou termina com espaços, por favor cheque-a.</string> + <string name="auth_invalid_login_deactivated_account">Esta conta tem sido desativada.</string> + <string name="upgrade_security">Upgrade de encriptação disponível</string> + <string name="setup_cross_signing">Ativar Assinatura Cruzada</string> + <string name="security_prompt_text">Verifique-se a si mesma(o) & outras(os) para manter seus chats seguros</string> + <string name="bootstrap_enter_recovery">Entre sua %s para continuar</string> <string name="bootstrap_invalid_recovery_key">Não é uma chave de recuperação válida</string> - <string name="recovery_key_empty_error_message">Digite uma chave de recuperação</string> - <string name="bootstrap_progress_checking_backup_with_info">Verificando o backup da chave (%s)</string> - <string name="bootstrap_progress_compute_curve_key">Obtendo a chave da curva</string> - <string name="bootstrap_progress_generating_ssss">Gerando a chave SSSS a partir de uma frase secreta</string> - <string name="bootstrap_progress_generating_ssss_with_info">Gerando a chave SSSS a partir de uma frase secreta (%s)</string> - <string name="bootstrap_progress_generating_ssss_recovery">Gerando a chave SSSS a partir da chave de recuperação</string> - <string name="bootstrap_progress_storing_in_sss">Armazenando backup secreto de chave em SSSS</string> + <string name="recovery_key_empty_error_message">Por favor entre uma chave de recuperação</string> + <string name="bootstrap_progress_checking_backup_with_info">Checando Chave de backup (%s)</string> + <string name="bootstrap_progress_compute_curve_key">Obtendo chave de curva</string> + <string name="bootstrap_progress_generating_ssss">Gerando chave SSSS a partir de frasepasse</string> + <string name="bootstrap_progress_generating_ssss_with_info">Gerando chave SSSS a partir de frasepasse (%s)</string> + <string name="bootstrap_progress_generating_ssss_recovery">Gerando chave SSSS a partir de chave de recuperação</string> + <string name="bootstrap_progress_storing_in_sss">Armazenando segredo de backup de chave em SSSS</string> <string name="new_session_review_with_info">%1$s (%2$s)</string> - <string name="bootstrap_migration_enter_backup_password">Digite sua Frase Secreta de Chave do Backup para continuar.</string> - <string name="bootstrap_migration_use_recovery_key">use sua chave de recuperação da Chave do Backup</string> - <string name="bootstrap_migration_with_passphrase_helper_with_link">Se não se lembrar de sua Frase Secreta do backup de chave, você pode %s.</string> - <string name="bootstrap_migration_backup_recovery_key">Chave de recuperação do backup de chave</string> - <string name="settings_security_prevent_screenshots_title">Impedir a captura de tela do aplicativo</string> - <string name="settings_security_prevent_screenshots_summary">Ativando esta opção acrescenta FLAG_SECURE a todas as atividades. Reinicie o aplicativo para que a alteração tenha efeito.</string> + <string name="bootstrap_migration_enter_backup_password">Entre sua Frasepasse de Backup de Chave para continuar.</string> + <string name="bootstrap_migration_use_recovery_key">usar sua chave de recuperação da Chave do Backup</string> + <string name="bootstrap_migration_with_passphrase_helper_with_link">Se você não sabe sua Frasepasse de Backup de Chave, você pode %s.</string> + <string name="bootstrap_migration_backup_recovery_key">Chave de recuperação de Backup de Chave</string> + <string name="settings_security_prevent_screenshots_title">Prevenir screenshots do aplicativo</string> + <string name="settings_security_prevent_screenshots_summary">Ativar esta configuração adiciona FLAG_SECURE a todas as Atividades. Recomece o aplicativo para que a mudança tenha efeito.</string> <string name="media_file_added_to_gallery">Arquivo de mídia adicionado à Galeria</string> - <string name="error_adding_media_file_to_gallery">Não foi possível adicionar o arquivo de mídia à Galeria</string> - <string name="error_saving_media_file">Não foi possível salvar o arquivo de mídia</string> - <string name="change_password_summary">Definir uma nova senha da conta…</string> - <string name="template_use_other_session_content_description">Use o ${app_name} mais recente em seus outros aparelhos: ${app_name} Web, ${app_name} para Computador, ${app_name} para iOS, ${app_name} para Android, ou outro cliente Matrix capaz de fazer autoverificação</string> + <string name="error_adding_media_file_to_gallery">Não foi possível adicionar arquivo de mídia à Galeria</string> + <string name="error_saving_media_file">Não foi possível salvar arquivo de mídia</string> + <string name="change_password_summary">Definir uma nova senha de conta…</string> + <string name="template_use_other_session_content_description">Use o ${app_name} mais recente em seus outros dispositivos, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} para Android, ou um outro cliente Matrix capaz de assinatura cruzada</string> <string name="template_app_desktop_web">${app_name} Web -\n${app_name} para Computador</string> - <string name="template_app_ios_android">${app_name} para iOS -\n${app_name} para Android</string> - <string name="or_other_mx_capabale_client">ou outro cliente da Matrix capaz de fazer autoverificação</string> - <string name="template_use_latest_app">Use o ${app_name} mais recente em seus outros aparelhos:</string> - <string name="command_description_discard_session">Força a atual sessão da comunidade em uma sala criptografada a ser descartada</string> - <string name="command_description_discard_session_not_handled">Só é suportado em salas criptografadas</string> - <string name="enter_secret_storage_passphrase_or_key">Use seu %1$s ou %2$s para continuar.</string> - <string name="use_recovery_key">Usar a chave de recuperação</string> - <string name="enter_secret_storage_input_key">Selecione sua Chave de Recuperação, ou insira manualmente digitando-a ou colando-a da sua área de transferência</string> - <string name="keys_backup_recovery_key_error_decrypt">O backup não pôde ser descriptografado com essa Chave de Recuperação: verifique se você digitou corretamente a Chave de Recuperação.</string> - <string name="failed_to_access_secure_storage">Falha ao acessar o armazenamento seguro</string> - <string name="unencrypted">Não criptografado</string> - <string name="encrypted_unverified">Criptografado por um aparelho não confirmado</string> - <string name="review_logins">Revisar onde você está logado</string> - <string name="verify_other_sessions">Verifique todas as suas sessões para garantir que sua conta e mensagens estão seguras</string> +\n${app_name} Desktop</string> + <string name="template_app_ios_android">${app_name} iOS +\n${app_name} Android</string> + <string name="or_other_mx_capabale_client">ou um outro cliente Matrix capaz de assinatura cruzada</string> + <string name="template_use_latest_app">Use o ${app_name} mais recente em seus outros dispositivos:</string> + <string name="command_description_discard_session">Força a atual sessão de grupo de saída em uma sala encriptada a ser descartada</string> + <string name="command_description_discard_session_not_handled">Somente suportado em salas encriptadas</string> + <string name="enter_secret_storage_passphrase_or_key">Use sua %1$s ou %2$s para continuar.</string> + <string name="use_recovery_key">Usar Chave de Recuperação</string> + <string name="enter_secret_storage_input_key">Selecione sua Chave de Recuperação, ou faça manualmente input dela ao digitá-la ou colá-la desde seu clipboard</string> + <string name="keys_backup_recovery_key_error_decrypt">Backup não pôde ser decriptado com esta Chave de Recuperação: por favor verifique que você entrou a Chave de Recuperação correta.</string> + <string name="failed_to_access_secure_storage">Falha para acessar armazenamento seguro</string> + <string name="unencrypted">Não-encripada</string> + <string name="encrypted_unverified">Encriptada por um dispositivo não-verificado</string> + <string name="review_logins">Revisar onde você está com login feito</string> + <string name="verify_other_sessions">Verifique todas as suas sessões para assegurar que sua conta & mensagens estão seguras</string> <string name="verify_this_session">Verifique o novo login acessando sua conta: %1$s</string> - <string name="cross_signing_verify_by_text">Confirmação manual por texto</string> - <string name="crosssigning_verify_session">Confirmar o login</string> - <string name="cross_signing_verify_by_emoji">Confirme interativamente por emojis</string> - <string name="confirm_your_identity">Confirme sua identidade verificando este login a partir de uma de suas outras sessões, concedendo-lhe acesso às mensagens criptografadas.</string> - <string name="mark_as_verified">Marcar como Confiável</string> - <string name="error_empty_field_choose_user_name">Escolha um nome de usuário.</string> - <string name="error_empty_field_choose_password">Escolha uma senha.</string> - <string name="external_link_confirmation_title">Verificar este link</string> - <string name="external_link_confirmation_message">O link %1$s redirecionará você para outro site: %2$s. + <string name="cross_signing_verify_by_text">Verificar Manualmente por Texto</string> + <string name="crosssigning_verify_session">Verificar login</string> + <string name="cross_signing_verify_by_emoji">Verificar Interativamente por Emoji</string> + <string name="confirm_your_identity">Confirme sua identidade ao verificar este login desde uma de suas outras sessões, garantindo-lhe acesso a mensagens encriptadas.</string> + <string name="mark_as_verified">Marcar como Confiada</string> + <string name="error_empty_field_choose_user_name">Por favor escolha um nome de usuária(o).</string> + <string name="error_empty_field_choose_password">Por favor escolha uma senha.</string> + <string name="external_link_confirmation_title">Cheque duplamente este link</string> + <string name="external_link_confirmation_message">O link %1$s está levando você para um outro site: %2$s. \n -\nDeseja continuar\?</string> - <string name="create_room_dm_failure">Não foi possível criar sua DM. Por favor, verifique os usuários que você deseja convidar e tente novamente.</string> - <string name="add_members_to_room">Adicionar participantes</string> - <string name="invite_users_to_room_action_invite">CONVITE</string> - <string name="inviting_users_to_room">Convidando os usuários…</string> - <string name="invite_users_to_room_title">Convidar Usuários</string> +\nVocê tem certeza que você quer continuar\?</string> + <string name="create_room_dm_failure">Nós não conseguimos criar sua DM. Por favor cheque as/os usuárias(os) que você quer convidar e tente de novo.</string> + <string name="add_members_to_room">Adicionar membros</string> + <string name="invite_users_to_room_action_invite">CONVIDAR</string> + <string name="inviting_users_to_room">Convidando usuárias(os)…</string> + <string name="invite_users_to_room_title">Convidar Usuárias(os)</string> <string name="invitation_sent_to_one_user">Convite enviado para %1$s</string> <string name="invitations_sent_to_two_users">Convites enviados para %1$s e %2$s</string> <plurals name="invitations_sent_to_one_and_more_users"> - <item quantity="one">Convites enviados para %1$s e mais um</item> - <item quantity="other">Convites enviados para %1$s e %2$d mais</item> + <item quantity="one">Convites enviados para %1$s e mais um/uma</item> + <item quantity="other">Convites enviados para %1$s e mais %2$d</item> </plurals> - <string name="invite_users_to_room_failure">Não foi possível convidar os usuários. Por favor, verifique os usuários que você deseja convidar e tente novamente.</string> - <string name="choose_locale_current_locale_title">Idioma atual</string> - <string name="choose_locale_other_locales_title">Outros idiomas disponíveis</string> - <string name="choose_locale_loading_locales">Carregando os idiomas disponíveis…</string> - <string name="open_terms_of">Abra termos de %s</string> + <string name="invite_users_to_room_failure">Nós não conseguimos convidar usuárias(os). Por favor cheque as/os usuárias(os) que você quer convidar e tente de novo.</string> + <string name="choose_locale_current_locale_title">Língua atual</string> + <string name="choose_locale_other_locales_title">Outras línguas disponíveis</string> + <string name="choose_locale_loading_locales">Carregando línguas disponíveis…</string> + <string name="open_terms_of">Abrir termos de %s</string> <string name="disconnect_identity_server_dialog_content">Desconectar-se do servidor de identidade %s\?</string> - <string name="template_identity_server_error_outdated_identity_server">Este servidor de identidade está desatualizado. ${app_name} suporta apenas API V2.</string> - <string name="identity_server_error_outdated_home_server">Esta operação não é possível. O servidor doméstico está desatualizado.</string> - <string name="identity_server_error_no_identity_server_configured">Por favor, primeiro configure um servidor de identidade.</string> - <string name="identity_server_error_terms_not_signed">Por favor, primeiro aceite os termos do servidor de identidade nas configurações.</string> - <string name="template_identity_server_error_bulk_sha256_not_supported">Pela sua privacidade, ${app_name} apenas suporta o envio dos e-mails e números de telefone de usuários em hash.</string> - <string name="identity_server_error_binding_error">A associação falhou.</string> + <string name="template_identity_server_error_outdated_identity_server">Este servidor de identidade está desatualizado. ${app_name} suporta somente API V2.</string> + <string name="identity_server_error_outdated_home_server">Esta operação não é possível. O servidorcasa está desatualizado.</string> + <string name="identity_server_error_no_identity_server_configured">Por favor primeiro configure um servidor de identidade.</string> + <string name="identity_server_error_terms_not_signed">Por favor primeiro aceite os termos do servidor de identidade nas configurações.</string> + <string name="template_identity_server_error_bulk_sha256_not_supported">Para sua privacidade, ${app_name} somente suporta enviar emails e números de telefone de usuária(o) hashados.</string> + <string name="identity_server_error_binding_error">A associação tem falhado.</string> <string name="identity_server_error_no_current_binding_error">Não há nenhuma associação atual com este identificador.</string> - <string name="identity_server_set_default_notice">Seu servidor doméstico (%1$s) propõe o uso de %2$s para seu servidor de identidade</string> - <string name="identity_server_set_default_submit">Use %1$s</string> - <string name="identity_server_set_alternative_notice">Como alternativa, você pode digitar o endereço de outro servidor de identidade</string> - <string name="identity_server_set_alternative_notice_no_default">Digite o endereço de um servidor de identidade</string> - <string name="identity_server_set_alternative_submit">Enviar</string> - <string name="power_level_edit_title">Definir o papel</string> + <string name="identity_server_set_default_notice">Seu servidorcasa (%1$s) propõe usar %2$s para seu servidor de identidade</string> + <string name="identity_server_set_default_submit">Usar %1$s</string> + <string name="identity_server_set_alternative_notice">Alternativamente, você pode entrar qualquer outro URL de servidor de identidade</string> + <string name="identity_server_set_alternative_notice_no_default">Entre o URL de um servidor de identidade</string> + <string name="identity_server_set_alternative_submit">Submeter</string> + <string name="power_level_edit_title">Definir papel</string> <string name="power_level_title">Papel</string> - <string name="a11y_open_chat">Bate-papo aberto</string> - <string name="a11y_mute_microphone">Silenciar o microfone</string> - <string name="a11y_unmute_microphone">Ativar o microfone</string> - <string name="a11y_stop_camera">Desligue a câmera</string> - <string name="a11y_start_camera">Ativar a câmera</string> - <string name="settings_setup_secure_backup">Configure o backup online</string> - <string name="bottom_sheet_setup_secure_backup_title">Backup online</string> - <string name="bottom_sheet_setup_secure_backup_subtitle">Previna-se contra perda de acesso a mensagens e dados criptografados, fazendo backup das chaves de criptografia no seu servidor.</string> - <string name="bottom_sheet_setup_secure_backup_submit">Configure</string> - <string name="bottom_sheet_setup_secure_backup_security_key_title">Use uma Chave de Segurança</string> - <string name="bottom_sheet_setup_secure_backup_security_key_subtitle">Gere uma chave de segurança para armazenar num local seguro, como um gerenciador de senhas ou um cofre.</string> - <string name="bottom_sheet_setup_secure_backup_security_phrase_title">Use uma Frase de Segurança</string> - <string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">Digite uma frase secreta que só você conhece, e gere uma chave para backup.</string> - <string name="bottom_sheet_save_your_recovery_key_title">Salve sua Chave de Segurança</string> - <string name="bottom_sheet_save_your_recovery_key_content">Armazene sua Chave de Segurança num local seguro, como um gerenciador de senhas ou um cofre.</string> - <string name="set_a_security_phrase_title">Defina uma Frase de Segurança</string> - <string name="set_a_security_phrase_notice">Digite uma frase de segurança que só você conheça, usada para proteger os segredos no seu servidor.</string> + <string name="a11y_open_chat">Abrir chat</string> + <string name="a11y_mute_microphone">Mutar o microfone</string> + <string name="a11y_unmute_microphone">Desmutar o microfone</string> + <string name="a11y_stop_camera">Parar a câmera</string> + <string name="a11y_start_camera">Começar a câmera</string> + <string name="settings_setup_secure_backup">Configurar Backup Seguro</string> + <string name="bottom_sheet_setup_secure_backup_title">Backup seguro</string> + <string name="bottom_sheet_setup_secure_backup_subtitle">Salvaguardar-se contra perda de acesso a mensagens & dados encriptados ao fazer backup de chaves de encriptação em seu servidor.</string> + <string name="bottom_sheet_setup_secure_backup_submit">Configurar</string> + <string name="bottom_sheet_setup_secure_backup_security_key_title">Usar uma Chave de Segurança</string> + <string name="bottom_sheet_setup_secure_backup_security_key_subtitle">Gere uma chave de segurança para armazenar em algum lugar seguro como um gerenciador de senhas ou um cofre.</string> + <string name="bottom_sheet_setup_secure_backup_security_phrase_title">Usar uma Frase de Segurança</string> + <string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">Entre uma frase secreta que somente você conhece, e gere uma chave para backup.</string> + <string name="bottom_sheet_save_your_recovery_key_title">Salvar sua Chave de Segurança</string> + <string name="bottom_sheet_save_your_recovery_key_content">Armazene sua Chave de Segurança em algum lugar seguro, como um gerenciador de senhas ou um cofre.</string> + <string name="set_a_security_phrase_title">Definir uma Frase de Segurança</string> + <string name="set_a_security_phrase_notice">Entre uma frase de segurança que somente você conheça, usada para assegurar segredos em seu servidor.</string> <string name="set_a_security_phrase_hint">Frase de Segurança</string> - <string name="set_a_security_phrase_again_notice">Digite sua Frase de Segurança novamente para confirmá-la.</string> - <string name="save_your_security_key_title">Salve sua Chave de Segurança</string> - <string name="save_your_security_key_notice">Armazene sua Chave de Segurança num local seguro, como um gerenciador de senhas ou um cofre.</string> - <string name="room_settings_name_hint">Nome da sala</string> - <string name="room_settings_topic_hint">Descrição</string> - <string name="room_settings_save_success">Você alterou as configurações da sala com êxito</string> + <string name="set_a_security_phrase_again_notice">Entre sua Frase de Segurança de novo para confirmá-la.</string> + <string name="save_your_security_key_title">Salvar sua Chave de Segurança</string> + <string name="save_your_security_key_notice">Armazene sua Chave de Segurança em algum lugar seguro, como um gerenciador de senhas ou um cofre.</string> + <string name="room_settings_name_hint">Nome de Sala</string> + <string name="room_settings_topic_hint">Tópico</string> + <string name="room_settings_save_success">Você mudou configurações de sala com sucesso</string> <string name="notice_crypto_unable_to_decrypt_final">Você não pode acessar esta mensagem</string> - <string name="notice_crypto_unable_to_decrypt_friendly">Aguardando esta mensagem. Pode demorar um pouco</string> - <string name="crypto_utd">Não é possível decifrar</string> - <string name="notice_crypto_unable_to_decrypt_friendly_desc">Devido à criptografia de ponta a ponta, pode ser necessário aguardar que as chaves de criptografia de alguém cheguem, para ler as mensagens enviadas para você.</string> - <string name="crypto_error_withheld_blacklisted">Você não pode acessar esta mensagem porque você foi bloqueado pelo remetente</string> - <string name="crypto_error_withheld_unverified">Você não pode acessar esta mensagem porque a sessão não foi definida como confiável pelo remetente</string> - <string name="crypto_error_withheld_generic">Você não pode acessar esta mensagem porque o remetente intencionalmente não enviou as chaves</string> - <string name="notice_crypto_unable_to_decrypt_merged">Aguardando o histórico de criptografia</string> + <string name="notice_crypto_unable_to_decrypt_friendly">Esperando por esta mensagem, isto pode levar algum tempo</string> + <string name="crypto_utd">Não Dá para Decifrar</string> + <string name="notice_crypto_unable_to_decrypt_friendly_desc">Devido a encriptação ponta-a-ponta, pode ser que você precise esperar para que a mensagem de alguém chegue porque as chaves de encriptação não foram enviadas apropriadamente para você.</string> + <string name="crypto_error_withheld_blacklisted">Você não pode acessar esta mensagem porque você foi bloqueada(o) pelo(a) enviador(a)</string> + <string name="crypto_error_withheld_unverified">Você não pode acessar esta mensagem porque sua sessão não é confiada pelo(a) enviador(a)</string> + <string name="crypto_error_withheld_generic">Você não pode acessar esta mensagem porque o/a enviador(a) propositalmente não enviou as chaves</string> + <string name="notice_crypto_unable_to_decrypt_merged">Esperando por histórico de encriptação</string> <string name="disclaimer_title">Riot agora é Element!</string> - <string name="disclaimer_content">Estamos felizes em anunciar que mudamos de nome! Seu aplicativo está atualizado e você está conectado à sua conta.</string> - <string name="disclaimer_negative_button">OK, ENTENDI</string> - <string name="disclaimer_positive_button">APRENDA MAIS</string> + <string name="disclaimer_content">Nós estamos animados em anunciar que nós mudamos de nome! Seu app está atualizado e o signin está feito a sua conta.</string> + <string name="disclaimer_negative_button">ENTENDI</string> + <string name="disclaimer_positive_button">SABER MAIS</string> <string name="save_recovery_key_chooser_hint">Salvar chave de recuperação em</string> - <string name="add_from_phone_book">Adicionar da minha lista de contatos</string> - <string name="empty_phone_book">Sua lista de contatos está vazia</string> - <string name="phone_book_title">Lista de Contatos</string> - <string name="search_in_my_contacts">Procure em meus contatos</string> - <string name="loading_contact_book">Extraindo seus contatos…</string> - <string name="empty_contact_book">Sua lista de contatos está vazia</string> - <string name="contacts_book_title">Lista de contatos</string> - <string name="three_pid_revoke_invite_dialog_title">Revogar o convite</string> - <string name="three_pid_revoke_invite_dialog_content">Revogar o convite para %1$s\?</string> - <string name="member_banned_by">Banido por %1$s</string> - <string name="failed_to_unban">Não foi possível remover o banimento do usuário</string> - <string name="alert_push_are_disabled_title">As notificações Push estão desativadas</string> - <string name="alert_push_are_disabled_description">Revise suas configurações para permitir notificações Push</string> - <string name="create_pin_title">Escolha um PIN de segurança</string> + <string name="add_from_phone_book">Adicionar de meu livro de telefone</string> + <string name="empty_phone_book">Seu livro de telefone está vazio</string> + <string name="phone_book_title">Livro de Telefone</string> + <string name="search_in_my_contacts">Pesquisar em meus contatos</string> + <string name="loading_contact_book">Recuperando seus contatos…</string> + <string name="empty_contact_book">Seu livro de contatos está vazio</string> + <string name="contacts_book_title">Livro de Contatos</string> + <string name="three_pid_revoke_invite_dialog_title">Revogar convite</string> + <string name="three_pid_revoke_invite_dialog_content">Revogar convite para %1$s\?</string> + <string name="member_banned_by">Banida(o) por %1$s</string> + <string name="failed_to_unban">Falha para DesBanir usuária(o)</string> + <string name="alert_push_are_disabled_title">Notificações push estão desativadas</string> + <string name="alert_push_are_disabled_description">Revise suas configurações para permitir notificações push</string> + <string name="create_pin_title">Escolha um PIN por segurança</string> <string name="create_pin_confirm_title">Confirme PIN</string> - <string name="create_pin_confirm_failure">Falha na validação do PIN, por favor, digite um novo.</string> - <string name="auth_pin_title">Digite seu PIN</string> - <string name="auth_pin_forgot">Esqueceu o PIN\?</string> - <string name="auth_pin_reset_title">Redefinir o PIN</string> + <string name="create_pin_confirm_failure">Falha para validar PIN, por favor toque um novo.</string> + <string name="auth_pin_title">Entre seu PIN</string> + <string name="auth_pin_forgot">Esqueceu PIN\?</string> + <string name="auth_pin_reset_title">Resettar PIN</string> <string name="auth_pin_new_pin_action">Novo PIN</string> - <string name="auth_pin_reset_content">Para redefinir seu PIN, você precisará fazer um novo login e em seguida criar um novo PIN.</string> - <string name="settings_security_pin_code_title">Ativar o PIN</string> - <string name="settings_security_pin_code_summary">Se você quiser redefinir seu PIN, toque no Esqueci o PIN para sair e redefinir-lo.</string> - <string name="auth_pin_confirm_to_disable_title">Confirme o PIN para desativar o PIN</string> + <string name="auth_pin_reset_content">Para resettar seu PIN, você vai precisar refazer login e criar um novo.</string> + <string name="settings_security_pin_code_title">Ativar PIN</string> + <string name="settings_security_pin_code_summary">Se você quer resettar seu PIN, toque em Esqueceu PIN para fazer logout e resettá-lo.</string> + <string name="auth_pin_confirm_to_disable_title">Confirmar PIN para desativar PIN</string> <string name="settings_call_show_confirmation_dialog_title">Prevenir chamada acidental</string> <string name="settings_call_show_confirmation_dialog_summary">Pedir por confirmação antes de começar uma chamada</string> <string name="no_permissions_to_start_conf_call">Você não tem permissão para começar uma chamada de conferência nesta sala</string> @@ -2398,27 +2398,27 @@ <string name="audio_video_meeting_description">Reuniões usam políticas de segurança e permissão de Jitsi. Todas as pessoas atualmente na sala vão ver um convite para se juntarem enquanto sua reunião estiver acontecendo.</string> <string name="cannot_call_yourself">Você não pode começar uma chamada com você mesma(o)</string> <string name="cannot_call_yourself_with_invite">Você não pode começar uma chamada com você mesma(o), espere pelas(os) participantes aceitarem convite</string> - <string name="failed_to_add_widget">Falha ao adicionar widget</string> - <string name="failed_to_remove_widget">Falha ao remover widget</string> + <string name="failed_to_add_widget">Falha para adicionar widget</string> + <string name="failed_to_remove_widget">Falha para remover widget</string> <plurals name="encryption_import_room_keys_success"> <item quantity="one">%1$d/%2$d chave importada com êxito.</item> <item quantity="other">%1$d/%2$d chaves importadas com êxito.</item> </plurals> <string name="room_manage_integrations">Gerenciar Integrações</string> <string name="room_no_active_widgets">Nenhum widget ativo</string> - <string name="create_room_federation_error">A sala foi criada, mas alguns convites não foram enviados pelo seguinte motivo: + <string name="create_room_federation_error">A sala tem sido criada, mas alguns convites não têm sido enviados pela seguinte razão: \n \n%s</string> <plurals name="two_and_some_others_read"> - <item quantity="one">%1$s, %2$s e %3$d outro leu</item> - <item quantity="other">%1$s, %2$s e %3$d outros leram</item> + <item quantity="one">%1$s, %2$s e %3$d outra(o) leu</item> + <item quantity="other">%1$s, %2$s e %3$d outras(os) leram</item> </plurals> <plurals name="wrong_pin_message_remaining_attempts"> <item quantity="one">Código errado, %d tentativa restante</item> <item quantity="other">Código errado, %d tentativas restantes</item> </plurals> - <string name="wrong_pin_message_last_remaining_attempt">Atenção! Última tentativa restante antes de você ser desconectada/o!</string> - <string name="too_many_pin_failures">Muitos erros, você foi desconectada/o</string> + <string name="wrong_pin_message_last_remaining_attempt">Aviso! Última tentativa restante antes de logout!</string> + <string name="too_many_pin_failures">Erros demais, você tem sido feito logout</string> <string name="no_permissions_to_start_webrtc_call">Você não tem permissão para começar uma chamada nesta sala</string> <string name="settings_phone_number_empty">Nenhum número de telefone tem sido adicionado a sua conta</string> <string name="settings_emails">Endereços de email</string> @@ -2434,141 +2434,141 @@ <string name="settings_emails_and_phone_numbers_title">Emails e números de telefone</string> <string name="settings_emails_and_phone_numbers_summary">Gerenciar emails e números de telefone linkados a sua conta Matrix</string> <string name="settings_text_message_sent_hint">Código</string> - <string name="login_msisdn_notice">Por favor, use o formato internacional (o número de telefone precisa começar com \'+\')</string> - <string name="confirm_your_identity_quad_s">Confirme sua identidade verificando este login, concedendo a ele acesso a mensagens criptografadas.</string> - <string name="error_opening_banned_room">Não é possível carregar uma sala da qual você foi banido.</string> - <string name="room_error_not_found">Não foi possível encontrar esta sala. Certifique-se de que ela existe.</string> - <string name="universal_link_malformed">O link não está correto</string> + <string name="login_msisdn_notice">Por favor use o formato internacional (número de telefone deve começar com \'+\')</string> + <string name="confirm_your_identity_quad_s">Confirme sua identidade ao verificar este login, garantindo-lhe acesso a mensagens encriptadas.</string> + <string name="error_opening_banned_room">Não dá para abrir uma sala de onde você foi banida(o).</string> + <string name="room_error_not_found">Não dá para encontrar esta sala. Assegure-se que ela existe.</string> + <string name="universal_link_malformed">O link foi malformado</string> <string name="auth_msisdn_already_defined">Este número de telefone já está definido.</string> - <string name="settings_show_room_member_state_events">Mostrar eventos de estado de membros da sala</string> - <string name="sent_a_poll">Votação</string> - <string name="sent_a_bot_buttons">Botões do bot</string> + <string name="settings_show_room_member_state_events">Mostrar eventos de estado de membros de sala</string> + <string name="sent_a_poll">Sondagem</string> + <string name="sent_a_bot_buttons">Botões de Bot</string> <string name="sent_a_reaction">Reagiu com: %s</string> - <string name="sent_verification_conclusion">Confirmação concluída</string> - <string name="delete_account_data_warning">Remover os dados de %1$s desta conta\? + <string name="sent_verification_conclusion">Conclusão de Verificação</string> + <string name="delete_account_data_warning">Deletar os dados de conta de tipo %1$s\? \n -\nProssiga com cuidado, pois não há como reverter esta escolha.</string> - <string name="template_settings_security_pin_code_grace_period_summary_off">O código PIN é solicitado todas as vezes que você abre o ${app_name}.</string> - <string name="template_settings_security_pin_code_grace_period_summary_on">O código PIN é solicitado após 2 minutos sem usar o ${app_name}.</string> - <string name="settings_security_pin_code_grace_period_title">Solicitar o PIN depois de 2 minutos</string> - <string name="settings_security_pin_code_notifications_summary_off">Exibir apenas o número de mensagens não lidas em uma notificação.</string> - <string name="settings_security_pin_code_notifications_summary_on">Exibir o nome das salas e o conteúdo das mensagens.</string> - <string name="settings_security_pin_code_notifications_title">Exibir o conteúdo das mensagens nas notificações</string> - <string name="template_settings_security_pin_code_use_biometrics_summary_off">O código PIN é a única maneira de desbloquear o ${app_name}.</string> - <string name="settings_security_pin_code_use_biometrics_summary_on">Ativa a biometria específica do dispositivo, como impressões digitais e reconhecimento de rosto.</string> - <string name="settings_security_pin_code_use_biometrics_title">Ativar a biometria</string> +\nUse com caução, pode levar a comportamento inesperado.</string> + <string name="template_settings_security_pin_code_grace_period_summary_off">Código PIN é requerido toda vez que você abre ${app_name}.</string> + <string name="template_settings_security_pin_code_grace_period_summary_on">Código PIN é requerido depois de 2 minutos de não usar ${app_name}.</string> + <string name="settings_security_pin_code_grace_period_title">Requerer PIN depois de 2 minutos</string> + <string name="settings_security_pin_code_notifications_summary_off">Somente mostrar número de mensagens não-lidas em uma notificação simples.</string> + <string name="settings_security_pin_code_notifications_summary_on">Mostrar detalhes como nomes de salas e conteúdo de mensagens.</string> + <string name="settings_security_pin_code_notifications_title">Mostrar conteúdo em notificações</string> + <string name="template_settings_security_pin_code_use_biometrics_summary_off">Código PIN é a única maneira de destrancar ${app_name}.</string> + <string name="settings_security_pin_code_use_biometrics_summary_on">Ativar biometria específica de dispositivo, como impressões digitais e reconhecimento de face.</string> + <string name="settings_security_pin_code_use_biometrics_title">Ativar biometria</string> <string name="settings_security_application_protection_screen_title">Configurar a proteção</string> - <string name="settings_security_application_protection_summary">Proteger o acesso usando PIN e biometria.</string> - <string name="settings_security_application_protection_title">Acesso restrito</string> + <string name="settings_security_application_protection_summary">Proteger acesso usando PIN e biometria.</string> + <string name="settings_security_application_protection_title">Proteger acesso</string> <plurals name="secure_backup_reset_devices_you_can_verify"> - <item quantity="one">Exibir o aparelho com o qual você pode se verificar</item> - <item quantity="other">Exibir %d aparelhos com os quais você pode se verificar</item> + <item quantity="one">Mostrar o dispositivo com o qual você pode verificar agora</item> + <item quantity="other">Mostrar %d dispositivos com os quais você pode verificar agora</item> </plurals> - <string name="secure_backup_reset_no_history">Você não terá mais o histórico de mensagens, aparelhos confiáveis e contatos confirmados</string> - <string name="secure_backup_reset_if_you_reset_all">Se você redefinir tudo</string> - <string name="secure_backup_reset_all_no_other_devices">Apenas faça isso se você não tiver outro aparelho para confirmar este aparelho.</string> - <string name="secure_backup_reset_all">Redefinir tudo</string> - <string name="bad_passphrase_key_reset_all_action">Esqueceu as senhas ou perdeu todas as opções de recuperação\? Redefina tudo</string> - <string name="direct_room_created_summary_item_by_you">Você entrou.</string> - <string name="direct_room_encryption_enabled_tile_description">As mensagens nesta sala estão criptografadas de ponta a ponta.</string> + <string name="secure_backup_reset_no_history">Você vai recomeçar com nada de histórico, mensagens, dispositivos confiados ou usuárias(os) confiadas(os)</string> + <string name="secure_backup_reset_if_you_reset_all">Se você resettar tudo</string> + <string name="secure_backup_reset_all_no_other_devices">Somente faça isto se você não tem nenhum outro dispositivo com o qual você pode verificar este dispositivo.</string> + <string name="secure_backup_reset_all">Resettar tudo</string> + <string name="bad_passphrase_key_reset_all_action">Esqueceu ou perdeu todas as opções de recuperação\? Resette tudo</string> + <string name="direct_room_created_summary_item_by_you">Você juntou-se.</string> + <string name="direct_room_encryption_enabled_tile_description">Mensagens nesta sala são encriptadas ponta-a-ponta.</string> <string name="direct_room_profile_section_more_leave">Sair</string> <string name="direct_room_profile_section_more_settings">Configurações</string> - <string name="direct_room_profile_encrypted_subtitle">As mensagens nesta conversa estão criptografadas de ponta a ponta. + <string name="direct_room_profile_encrypted_subtitle">Mensagens aqui são encriptadas ponta-a-ponta. \n -\nSuas mensagens estão protegidas, pois só você e seu contato têm as chaves únicas para desbloqueá-las.</string> - <string name="direct_room_profile_not_encrypted_subtitle">As mensagens nesta sala não estão criptografadas de ponta a ponta.</string> - <string name="login_error_outdated_homeserver_warning_content">Este servidor local está executando uma versão antiga do Element. Peça ao administrador do servidor para atualizá-lo. Você pode prosseguir, mas alguns recursos poderão não funcionar corretamente.</string> - <string name="settings_labs_show_complete_history_in_encrypted_room">Exibir histórico completo em salas criptografadas</string> +\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipiente têm as chaves únicas para os destrancar.</string> + <string name="direct_room_profile_not_encrypted_subtitle">Mensagens aqui não são encriptadas ponta-a-ponta.</string> + <string name="login_error_outdated_homeserver_warning_content">Este servidorcasa está rodando uma versão antiga. Peça à/ao admin de seu servidorcasa para fazer upgrade. Você pode continuar, mas algumas funcionalidades podem não funcionar corretamente.</string> + <string name="settings_labs_show_complete_history_in_encrypted_room">Mostrar histórico completo em salas encriptadas</string> <string name="notification_unread_notified_messages_and_invitation">%1$s e %2$s</string> <string name="notification_unread_notified_messages_in_room_and_invitation">%1$s em %2$s e %3$s</string> <string name="settings_troubleshoot_test_notification_notification_clicked">A notificação tem sido clicada!</string> <string name="settings_troubleshoot_test_notification_notice">Por favor clique na notificação. Se você não vê a notificação, por favor cheque as configurações de sistema.</string> <string name="settings_troubleshoot_test_notification_title">Exibição de Notificações</string> <string name="settings_troubleshoot_test_push_notification_content">Você está visualizando a notificação! Clique em mim!</string> - <string name="settings_troubleshoot_test_push_loop_failed">Falha ao receber push. Solução podia ser reinstalar o aplicativo.</string> + <string name="settings_troubleshoot_test_push_loop_failed">Falha para receber push. Solução podia ser reinstalar o aplicativo.</string> <string name="settings_troubleshoot_test_push_loop_success">O aplicativo está recebendo PUSH</string> <string name="settings_troubleshoot_test_push_loop_waiting_for_push">O aplicativo está esperando pelo PUSH</string> <string name="search_is_not_supported_in_e2e_room">Pesquisar em salas encriptadas não é suportado ainda.</string> <string name="no_permissions_to_start_webrtc_call_in_direct_room">Você não tem permissão para começar uma chamada</string> <string name="no_permissions_to_start_conf_call_in_direct_room">Você não tem permissão para começar uma chamada de conferência</string> <string name="reset">Resettar</string> - <string name="direct_room_join_rules_invite">%1$s tornou a sala acessível somente com convite.</string> - <string name="direct_room_join_rules_invite_by_you">Você definiu que a sala só receberá integrantes com convite.</string> - <string name="direct_room_created_summary_item">%s entrou.</string> + <string name="direct_room_join_rules_invite">%1$s fez isto somente convite.</string> + <string name="direct_room_join_rules_invite_by_you">Você fez isto somente convite.</string> + <string name="direct_room_created_summary_item">%s juntou-se.</string> <string name="search_banned_user_hint">Filtrar usuárias(os) banidas(os)</string> <string name="settings_troubleshoot_test_push_loop_title">Testar Push</string> <plurals name="notification_invitations"> <item quantity="one">%d convite</item> <item quantity="other">%d convites</item> </plurals> - <string name="room_list_quick_actions_low_priority_remove">Remover baixa prioridade</string> - <string name="room_list_quick_actions_low_priority_add">Definir como baixa prioridade</string> - <string name="attachment_type_dialog_title">Adicionar imagem</string> - <string name="warning_unsaved_change_discard">Descartar alterações</string> - <string name="warning_unsaved_change">Existem alterações não salvas. Descartar as alterações\?</string> - <string name="warning_room_not_created_yet">A sala ainda não foi criada. Cancelar a criação da sala\?</string> - <string name="rotate_and_crop_screen_title">Girar e recortar</string> - <string name="create_room_settings_section">Configurações da sala</string> - <string name="create_room_topic_hint">Descrição</string> - <string name="create_room_topic_section">Descrição da sala (opcional)</string> - <string name="create_room_name_section">Nome da sala</string> + <string name="room_list_quick_actions_low_priority_remove">Remover de baixa prioridade</string> + <string name="room_list_quick_actions_low_priority_add">Adicionar a baixa prioridade</string> + <string name="attachment_type_dialog_title">Adicionar imagem de</string> + <string name="warning_unsaved_change_discard">Descartar mudanças</string> + <string name="warning_unsaved_change">Existem mudanças não-salvas. Descartar as mudanças\?</string> + <string name="warning_room_not_created_yet">A sala ainda não está criada. Cancelar a criação de sala\?</string> + <string name="rotate_and_crop_screen_title">Rotar e recortar</string> + <string name="create_room_settings_section">Configurações de sala</string> + <string name="create_room_topic_hint">Tópico</string> + <string name="create_room_topic_section">Tópico da sala (opcional)</string> + <string name="create_room_name_section">Nome de sala</string> <string name="send_bug_report_include_key_share_history">Enviar histórico de requisições de compartilhamento de chaves</string> <string name="no_more_results">Mais nenhum resultado</string> - <string name="settings_export_trail">Exportar auditoria</string> - <string name="room_member_open_or_create_dm">Enviar mensagem</string> - <string name="show_advanced">Mostrar mais</string> - <string name="hide_advanced">Esconder mais</string> - <string name="matrix_to_card_title">Link na Matrix</string> - <string name="room_created_summary_no_topic_creation_text">%s para que as pessoas saibam do que se trata esta sala.</string> - <string name="create_room_alias_empty">Digite o endereço da sala</string> - <string name="direct_room_user_list_recent_title">Recentes</string> - <string name="qr_code_not_scanned">Código QR não escaneado!</string> - <string name="invalid_qr_code_uri">Código QR inválido (URL inválido)!</string> - <string name="cannot_dm_self">Não é possível enviar mensagens para si mesmo!</string> + <string name="settings_export_trail">Exportar Auditoria</string> + <string name="room_member_open_or_create_dm">Mensagem direta</string> + <string name="show_advanced">Mostrar avançadas</string> + <string name="hide_advanced">Esconder avançadas</string> + <string name="matrix_to_card_title">Link Matrix</string> + <string name="room_created_summary_no_topic_creation_text">%s para deixar pessoas sabendo do que esta sala se trata.</string> + <string name="create_room_alias_empty">Por favor proveja um endereço de sala</string> + <string name="direct_room_user_list_recent_title">Recente</string> + <string name="qr_code_not_scanned">QR code não scannado!</string> + <string name="invalid_qr_code_uri">QR code inválido (URI Inválido)!</string> + <string name="cannot_dm_self">Não dá para enviar DM para si mesma(o)!</string> <string name="share_by_text">Compartilhar por texto</string> - <string name="phone_book_perform_lookup">Pesquisar contatos na Matrix</string> - <string name="room_settings_set_avatar">Definir foto</string> - <string name="identity_server_user_consent_not_provided">A autorização do usuário não foi fornecida.</string> - <string name="user_code_info_text">Compartilhe este código com as pessoas, para que possam escaneá-lo, de modo a adicionar seu contato e começar a conversar.</string> + <string name="phone_book_perform_lookup">Pesquisar por contatos na Matrix</string> + <string name="room_settings_set_avatar">Definir avatar</string> + <string name="identity_server_user_consent_not_provided">O consentimento de usuária(o) não tem sido provido.</string> + <string name="user_code_info_text">Compartilhe este código com pessoas para que elas possam scanná-lo para adicionar você e começar a fazer chat.</string> <string name="user_code_my_code">Meu código</string> <string name="user_code_share">Compartilhar meu código</string> - <string name="user_code_scan">Escanear um código QR</string> - <string name="not_a_valid_qr_code">Não é um código QR da Matrix válido</string> - <string name="template_invite_friends_rich_title">🔐️ Junte-se a mim no ${app_name}</string> - <string name="template_invite_friends_text">Ei, fale comigo no ${app_name}: %s</string> - <string name="invite_friends">Convidar amigos</string> + <string name="user_code_scan">Scannar um QR code</string> + <string name="not_a_valid_qr_code">Não é um QR code matrix válido</string> + <string name="template_invite_friends_rich_title">🔐️ Junte-se a mim em ${app_name}</string> + <string name="template_invite_friends_text">Hey, fale comigo em ${app_name}: %s</string> + <string name="invite_friends">Convidar amigas(os)</string> <string name="add_people">Adicionar pessoas</string> - <string name="topic_prefix">"Descrição:· "</string> - <string name="add_a_topic_link_text">Adicionar uma descrição</string> - <string name="this_is_the_beginning_of_dm">Este é o começo do seu histórico de mensagens com %s.</string> + <string name="topic_prefix">"Tópico: "</string> + <string name="add_a_topic_link_text">Adicionar um tópico</string> + <string name="this_is_the_beginning_of_dm">Este é o começo de seu histórico de mensagem direta com %s.</string> <string name="this_is_the_beginning_of_room_no_name">Este é o começo desta conversa.</string> - <string name="this_is_the_beginning_of_room">Este é o início de %s.</string> - <string name="room_settings_enable_encryption_no_permission">Você não tem permissão para ativar a criptografia nesta sala.</string> + <string name="this_is_the_beginning_of_room">Este é o começo de %s.</string> + <string name="room_settings_enable_encryption_no_permission">Você não tem permissão para ativar encriptação nesta sala.</string> <string name="create_room_in_progress">Criando sala…</string> <string name="create_room_alias_invalid">Alguns caracteres não são permitidos</string> <string name="create_room_alias_already_in_use">Este endereço já está em uso</string> - <string name="create_room_alias_hint">Endereço da sala</string> - <string name="create_room_disable_federation_description">Você pode habilitar essa opção se a sala for usada apenas para colaboração com equipes internas em seu servidor local. Essa opção não poderá ser alterada mais tarde.</string> - <string name="create_room_disable_federation_title">Impedir que qualquer pessoa que não faça parte de %s jamais entre nesta sala</string> + <string name="create_room_alias_hint">Endereço de sala</string> + <string name="create_room_disable_federation_description">Você pode ativar isto se a sala vai somente ser usada para colaborar com times internos em seu servidorcasa. Isto não poder ser mudado mais tarde.</string> + <string name="create_room_disable_federation_title">Bloquear qualquer pessoa que não é parte de %s de nunca se juntar a esta sala</string> <string name="attachment_viewer_item_x_of_y">%1$d de %2$d</string> - <string name="a11y_create_direct_message_by_qr_code">Começar uma nova conversa escaneando um código QR</string> - <string name="a11y_create_direct_message_by_mxid">Começar uma nova conversa com um ID na Matrix</string> - <string name="identity_server_consent_dialog_content">De modo a descobrir contatos a partir de pessoas que você conhece, você aceita enviar seus dados de contato (números de telefone e/ou e-mails) para o servidor de identidade configurado (%1$s)\? + <string name="a11y_create_direct_message_by_qr_code">Criar uma nova conversa direta ao scannar um QR code</string> + <string name="a11y_create_direct_message_by_mxid">Criar uma nova conversa direta por ID Matrix</string> + <string name="identity_server_consent_dialog_content">A fim de descobrir contatos existentes que você conhece, você aceita enviar seus dados de contato (números de telefone e/ou emails) para o Servidor de Identidade configurado (%1$s)\? \n -\nPara obter mais privacidade, os dados enviados serão criptografados antes de serem enviados.</string> - <string name="identity_server_consent_dialog_title">Enviar e-mails e números de telefone</string> - <string name="settings_discovery_consent_action_give_consent">Autorizar</string> - <string name="settings_discovery_consent_action_revoke">Revogar minha autorização</string> - <string name="settings_discovery_consent_notice_off">Você não autorizou o envio de e-mails e números de telefone para este servidor de identidade, de modo a descobrir outras pessoas a partir dos seus contatos.</string> - <string name="settings_discovery_consent_notice_on">Você autorizou o envio de e-mails e números de telefone para este servidor de identidade, de modo a descobrir outras pessoas a partir dos seus contatos.</string> - <string name="settings_discovery_consent_title">Enviar e-mails e números de telefone</string> +\nPara mais privacidade, os dados enviados serão hashados antes de serem enviados.</string> + <string name="identity_server_consent_dialog_title">Enviar emails e números de telefone</string> + <string name="settings_discovery_consent_action_give_consent">Dar consentimento</string> + <string name="settings_discovery_consent_action_revoke">Revogar meu consentimento</string> + <string name="settings_discovery_consent_notice_off">Você não tem dado seu consentimento para enviar emails e números de telefone para este servidor de identidade para descobrir outras(os) usuárias(os) de seus contatos.</string> + <string name="settings_discovery_consent_notice_on">Você tem dado seu consentimento para enviar emails e números de telefone para este servidor de identidade para descobrir outras(os) usuárias(os) de seus contatos.</string> + <string name="settings_discovery_consent_title">Enviar emails e números de telefone</string> <string name="direct_room_user_list_suggestions_title">Sugestões</string> <string name="direct_room_user_list_contacts_title">Contatos</string> - <string name="direct_room_user_list_known_title">Pessoas conhecidas</string> - <string name="qr_code">Código QR</string> - <string name="add_by_qr_code">Adicionar por código QR</string> - <string name="user_directory_search_hint">Pesquise por nome ou ID</string> - <string name="permissions_denied_add_contact">Aceite permissão para acessar seus contatos.</string> + <string name="direct_room_user_list_known_title">Usuárias(os) Conhecidas(os)</string> + <string name="qr_code">QR code</string> + <string name="add_by_qr_code">Adicionar por QR code</string> + <string name="user_directory_search_hint">Pesquisar por nome ou ID</string> + <string name="permissions_denied_add_contact">Aceitar permissão para acessar seus contatos.</string> <string name="permissions_denied_qr_code">Para scannear um QR code, você precisa permitir acesso a câmera.</string> <string name="start_chatting">Começar a Conversar</string> <string name="room_alias_action_publish">Publicar este endereço</string> @@ -2583,37 +2583,37 @@ <string name="room_alias_published_alias_main">Este é o endereço principal</string> <string name="room_alias_published_alias_subtitle">Endereços publicados podem ser usados por qualquer pessoa em qualquer servidor para se junta a sua sala. Para publicar um endereço, ele precisa ser definido como um endereço local primeiro.</string> <string name="room_alias_published_alias_title">Endereços Publicados</string> - <string name="room_alias_title">Endereços da Sala</string> - <string name="room_settings_alias_subtitle">Veja e gerencie endereços desta sala, e sua visibilidade no diretório de salas.</string> - <string name="room_settings_alias_title">Endereços da sala</string> + <string name="room_alias_title">Endereços de Sala</string> + <string name="room_settings_alias_subtitle">Ver e gerenciar endereços desta sala, e sua visibilidade no diretório de salas.</string> + <string name="room_settings_alias_title">Endereços de sala</string> <string name="action_add">Adicionar</string> - <string name="settings_security_pin_code_change_pin_summary">Alterar o seu PIN atual</string> - <string name="settings_security_pin_code_change_pin_title">Alterar o PIN</string> - <string name="room_preview_no_preview_join">Esta sala não pode ser visualizada. Você quer entrar nela\?</string> - <string name="room_preview_not_found">Esta sala não está acessível no momento. -\nTente novamente mais tarde, ou peça ao administrador da sala para verificar se você tem acesso.</string> + <string name="settings_security_pin_code_change_pin_summary">Mudar seu PIN atual</string> + <string name="settings_security_pin_code_change_pin_title">Mudar PIN</string> + <string name="room_preview_no_preview_join">Esta sala não pode ser previsualizada. Você quer se judar a ela\?</string> + <string name="room_preview_not_found">Esta sala não está acessível neste momento. +\nTente de novo mais tarde, ou peça a um/uma admin da sala para checar se você tem acesso.</string> <string name="room_alias_publish_to_directory_error">Incapaz de recuperar a visibilidade atual de diretório de salas (%1$s).</string> - <string name="room_alias_publish_to_directory">Publicar esta sala ao público no direitório de salas de %1$s\?</string> + <string name="room_alias_publish_to_directory">Publicar esta sala ao público no diretório de salas de %1$s\?</string> <string name="room_alias_action_unpublish">Despublicar este endereço</string> - <string name="room_alias_local_address_subtitle">Defina endereços para esta sala para que usuárias(os) possam encontrar esta sala através de eu servidor de casa (%1$s)</string> + <string name="room_alias_local_address_subtitle">Defina endereços para esta sala para que usuárias(os) possam encontrar esta sala através de seu servidorcasa (%1$s)</string> <string name="room_alias_address_hint">Novo endereço publicado (e.g. #alias:servidor)</string> <string name="room_alias_address_empty">Nenhum outro endereço publicado ainda.</string> <string name="room_alias_address_empty_can_add">Nenhum outro endereço publicado ainda, adicione um abaixo.</string> <string name="room_alias_publish">Publicar esta sala ao público no diretório de salas de %1$s\?</string> <string name="room_alias_unpublish_confirmation">Despublicar o endereço \"%1$s\"\?</string> <string name="room_settings_room_access_title">Acesso a sala</string> - <string name="room_settings_room_read_history_dialog_subtitle">Mundaças de quem pode ler o histórico só se vão aplicar a mensagens futuras nesta sala. A visibilidade do histórico existente vai ser inalterada.</string> + <string name="room_settings_room_read_history_dialog_subtitle">Mundaças de quem pode ler o histórico só se vão aplicar a mensagens futuras nesta sala. A visibilidade de histórico existente vai ser inalterada.</string> <string name="action_unpublish">Despublicar</string> - <string name="login_social_sso">login único</string> + <string name="login_social_sso">sign-on único</string> <string name="settings_show_emoji_keyboard_summary">Adicionar um botão em compositor de mensagem para abrir teclado de emoji</string> - <string name="room_permissions_notify_everyone">Notificar todo mundo</string> - <string name="default_message_emote_snow">enviar neve ❄️</string> - <string name="default_message_emote_confetti">enviar confetes 🎉</string> - <string name="command_snow">Enviar a mensagem com neve</string> - <string name="command_confetti">Enviar a mensagem com confetes</string> - <string name="login_clear_homeserver_history">Limpar o histórico</string> - <string name="login_social_signin_with">Entrar com %s</string> - <string name="login_social_signup_with">Registrar-se com %s</string> + <string name="room_permissions_notify_everyone">Notificar todas as pessoas</string> + <string name="default_message_emote_snow">envia queda de neve ❄️</string> + <string name="default_message_emote_confetti">envia confetti 🎉</string> + <string name="command_snow">Envia a dada mensagem com queda de neve</string> + <string name="command_confetti">Envia a dada mensagem com confetti</string> + <string name="login_clear_homeserver_history">Limpar histórico</string> + <string name="login_social_signin_with">Fazer signin com %s</string> + <string name="login_social_signup_with">Fazer signup com %s</string> <string name="login_social_continue_with">Continuar com %s</string> <string name="login_social_continue">Ou</string> <string name="settings_show_emoji_keyboard">Mostrar teclado de emoji</string> @@ -2623,7 +2623,7 @@ <string name="room_permissions_upgrade_the_room">Fazer upgrade da sala</string> <string name="room_permissions_send_m_room_server_acl_events">Enviar eventos m.room.server_acl</string> <string name="room_permissions_change_permissions">Mudar permissões</string> - <string name="room_permissions_change_room_name">Mudar nome da sala</string> + <string name="room_permissions_change_room_name">Mudar nome de sala</string> <string name="room_permissions_change_history_visibility">Mudar visibilidade do histórico</string> <string name="room_permissions_enable_room_encryption">Ativar encriptação da sala</string> <string name="room_permissions_change_main_address_for_the_room">Mudar endereço principal para a sala</string> @@ -2638,59 +2638,59 @@ <string name="room_permissions_default_role">Papel default</string> <string name="room_permissions_notice_read_only">Você não tem permissão para atualizar os papéis necessários para mudar várias partes da sala</string> <string name="room_permissions_notice">Selecione os papéis requeridos para mudar várias partes da sala</string> - <string name="room_settings_permissions_subtitle">Visualize e atualize os papéis requeridos para mudar várias partes da sala.</string> + <string name="room_settings_permissions_subtitle">Visualizar e atualizar os papéis requeridos para mudar várias partes da sala.</string> <string name="room_permissions_title">Permissões</string> - <string name="room_settings_permissions_title">Permissões da sala</string> + <string name="room_settings_permissions_title">Permissões de sala</string> <string name="room_participants_leave_private_warning">Esta sala não é pública. Você não vai ser capaz de se rejuntar sem um convite.</string> <string name="system_theme">Default de Sistema</string> - <string name="authentication_error">Falha ao se autenticar</string> - <string name="template_re_authentication_default_confirm_text">O ${app_name} precisa que você insira suas credenciais para executar esta ação.</string> - <string name="re_authentication_activity_title">Necessário autenticar-se novamente</string> + <string name="authentication_error">Falha para autenticar</string> + <string name="template_re_authentication_default_confirm_text">${app_name} requer que você entre suas credenciais para performar esta ação.</string> + <string name="re_authentication_activity_title">Re-Autenticação Necessitada</string> <string name="error_unauthorized">Não autorizada(o), credenciais de autenticação válidas faltando</string> - <string name="call_transfer_users_tab_title">Pessoas</string> - <string name="call_transfer_failure">Ocorreu um erro ao transferir a chamada</string> + <string name="call_transfer_users_tab_title">Usuárias(os)</string> + <string name="call_transfer_failure">Um erro ocorreu enquanto transferindo chamada</string> <string name="call_transfer_title">Transferir</string> <string name="call_transfer_connect_action">Conectar</string> <string name="call_transfer_consult_first">Consultar primeiro</string> <plurals name="call_one_active_and_other_paused"> - <item quantity="one">1 chamada em andamento (%1$s) · 1 chamada pausada</item> - <item quantity="other">1 chamada em andamento (%1$s) · %2$d chamadas pausadas</item> + <item quantity="one">1 chamada ativa (%1$s) · 1 chamada pausada</item> + <item quantity="other">1 chamada ativa (%1$s) · %2$d chamadas pausadas</item> </plurals> <plurals name="call_only_paused"> <item quantity="one">Chamada pausada</item> <item quantity="other">%1$d chamadas pausadas</item> </plurals> - <string name="call_only_active">Chamada em andamento (%1$s)</string> - <string name="call_dial_pad_lookup_error">Ocorreu um erro ao pesquisar o número de telefone</string> - <string name="call_dial_pad_title">Teclado de discagem</string> - <string name="call_tile_call_back">Ligar de volta</string> - <string name="call_tile_ended">Essa chamada foi encerrada</string> - <string name="call_tile_other_declined">%1$s recusou essa chamada</string> - <string name="call_tile_you_declined">Você recusou essa chamada %1$s</string> - <string name="call_tile_in_call">Você está nessa chamada</string> + <string name="call_only_active">Chamada ativa (%1$s)</string> + <string name="call_dial_pad_lookup_error">Houve um erro ao procurar o número de telefone</string> + <string name="call_dial_pad_title">Pad de disco</string> + <string name="call_tile_call_back">Chamar de volta</string> + <string name="call_tile_ended">Esta chamada tem terminado</string> + <string name="call_tile_other_declined">%1$s declinou esta chamada</string> + <string name="call_tile_you_declined">Você declinou esta chamada %1$s</string> + <string name="call_tile_in_call">Você está atualmente nesta chamada</string> <string name="call_tile_other_started_call">%1$s começou uma chamada</string> <string name="call_tile_you_started_call">Você começou uma chamada</string> - <string name="failed_to_initialize_cross_signing">Falha ao fazer a autoverificação</string> + <string name="failed_to_initialize_cross_signing">Falha para configurar Asinatura Cruzada</string> <string name="call_held_by_you">Você pôs a chamada em espera</string> <string name="call_held_by_user">%s pôs a chamada em espera</string> <string name="call_hold_action">Pôr em espera</string> <string name="call_resume_action">Retomar</string> <string name="action_return">Retornar</string> - <string name="a11y_trust_level_default">Nível de confiança padrão</string> - <string name="a11y_selected">Selecionado</string> + <string name="a11y_trust_level_default">Nível de confiança default</string> + <string name="a11y_selected">Selecionada</string> <string name="a11y_video">Vídeo</string> - <string name="a11y_error_some_message_not_sent">Algumas mensagens não foram enviadas</string> - <string name="a11y_delete_avatar">Remover foto de perfil</string> - <string name="a11y_change_avatar">Mudar foto de perfil</string> + <string name="a11y_error_some_message_not_sent">Algumas mensagens não têm sido enviadas</string> + <string name="a11y_delete_avatar">Deletar avatar</string> + <string name="a11y_change_avatar">Mudar avatar</string> <string name="a11y_image">Imagem</string> - <string name="a11y_import_key_from_file">Importar chave do arquivo</string> + <string name="a11y_import_key_from_file">Importar chave desde arquivo</string> <string name="a11y_open_widget">Abrir widgets</string> - <string name="a11y_screenshot">Captura de tela</string> + <string name="a11y_screenshot">Screenshot</string> <string name="settings_server_upload_size_unknown">O limite é desconhecido.</string> - <string name="settings_server_upload_size_content">O seu servidor local aceita anexos (arquivos, mídia, etc) com tamanhos de até %s.</string> + <string name="settings_server_upload_size_content">Seu servidorcasa aceita anexos (arquivos, mídia, etc.) com um tamanho de até %s.</string> <string name="settings_server_version">Versão do servidor</string> <string name="settings_server_name">Nome do servidor</string> - <string name="room_list_quick_actions_room_settings">Configurações da sala</string> + <string name="room_list_quick_actions_room_settings">Configurações de sala</string> <string name="jitsi_leave_conf_to_join_another_one_content">Sair da conferência atual e trocar para a outra\?</string> <string name="room_settings_room_version_title">Versão da sala</string> <string name="settings_room_directory_show_all_rooms_summary">Mostrar todas as salas no diretório de salas, incluindo salas com conteúdo explícito.</string> @@ -2702,54 +2702,54 @@ \nFazendo download de dados…</string> <string name="initial_sync_start_server_computing">Sinc Inicial: \nEsperando por resposta de servidor…</string> - <string name="a11y_trust_level_trusted">Nível de confiança: confiável</string> - <string name="a11y_trust_level_warning">Nível de confiança: alerta</string> - <string name="event_status_delete_all_failed_dialog_message">Deseja mesmo excluir todas as mensagens não enviadas nesta sala\?</string> - <string name="event_status_delete_all_failed_dialog_title">Excluir as mensagens não enviadas</string> - <string name="event_status_failed_messages_warning">Falha ao enviar as mensagens</string> - <string name="event_status_cancel_sending_dialog_message">Quer cancelar o envio da mensagem\?</string> - <string name="event_status_a11y_delete_all">Excluir todas as mensagens com falha</string> + <string name="a11y_trust_level_trusted">Nível de confiança confiado</string> + <string name="a11y_trust_level_warning">Nível de confiança alerta</string> + <string name="event_status_delete_all_failed_dialog_message">Você tem certeza que você quer deletar todas as mensagens não-enviadas nesta sala\?</string> + <string name="event_status_delete_all_failed_dialog_title">Deletar mensagens não-enviadas</string> + <string name="event_status_failed_messages_warning">Mensagens falharam para enviar</string> + <string name="event_status_cancel_sending_dialog_message">Você quer cancelar enviar mensagem\?</string> + <string name="event_status_a11y_delete_all">Deletar todas as mensagens falhadas</string> <string name="event_status_a11y_failed">Falhou</string> <string name="event_status_a11y_sent">Enviado</string> <string name="event_status_a11y_sending">Enviando</string> - <string name="dev_tools_event_content_hint">Conteúdo do evento</string> - <string name="dev_tools_success_state_event">Evento do estado enviado!</string> + <string name="dev_tools_event_content_hint">Conteúdo de evento</string> + <string name="dev_tools_success_state_event">Evento de estado enviado!</string> <string name="dev_tools_success_event">Evento enviado!</string> <string name="dev_tools_error_malformed_event">Evento malformado</string> - <string name="dev_tools_error_no_message_type">Tipo de mensagem ausente</string> - <string name="dev_tools_error_no_content">Nenhum conteúdo</string> - <string name="dev_tools_form_hint_event_content">Conteúdo do evento</string> - <string name="dev_tools_form_hint_state_key">Chave do estado</string> + <string name="dev_tools_error_no_message_type">Tipo de mensagem faltando</string> + <string name="dev_tools_error_no_content">Sem conteúdo</string> + <string name="dev_tools_form_hint_event_content">Conteúdo de Evento</string> + <string name="dev_tools_form_hint_state_key">Chave de Estado</string> <string name="dev_tools_form_hint_type">Tipo</string> - <string name="dev_tools_send_custom_state_event">Enviar evento de estado personalizado</string> - <string name="dev_tools_edit_content">Editar conteúdo</string> - <string name="dev_tools_state_event">Eventos do estado</string> - <string name="dev_tools_send_state_event">Enviar evento do estado</string> - <string name="dev_tools_send_custom_event">Enviar evento personalizado</string> - <string name="dev_tools_explore_room_state">Explorar o estado da sala</string> - <string name="dev_tools_menu_name">Ferramentas de desenvolvimento</string> - <string name="a11y_view_read_receipts">Ver confirmações de leitura</string> + <string name="dev_tools_send_custom_state_event">Enviar Evento de Estado Personalizado</string> + <string name="dev_tools_edit_content">Editar Conteúdo</string> + <string name="dev_tools_state_event">Eventos de Estado</string> + <string name="dev_tools_send_state_event">Enviar Evento de Estado</string> + <string name="dev_tools_send_custom_event">Enviar Evento Personalizado</string> + <string name="dev_tools_explore_room_state">Explorar Estado de Sala</string> + <string name="dev_tools_menu_name">Ferramentas Dev</string> + <string name="a11y_view_read_receipts">Visualizar recibos de leitura</string> <string name="a11y_rule_notify_off">Não notificar</string> <string name="a11y_rule_notify_silent">Notificar sem som</string> <string name="a11y_rule_notify_noisy">Notificar com som</string> - <string name="a11y_error_message_not_sent">Mensagem não enviada devido a um erro</string> - <string name="a11y_checked">Verificado</string> - <string name="a11y_close_emoji_picker">Fechar o selecionador de emojis</string> - <string name="a11y_open_emoji_picker">Abrir o selecionador de emojis</string> - <string name="a11y_unsent_draft">Esta sala tem rascunho não enviado</string> + <string name="a11y_error_message_not_sent">Mensagem não enviada devido a erro</string> + <string name="a11y_checked">Checado</string> + <string name="a11y_close_emoji_picker">Fechar Seletor de Emoji</string> + <string name="a11y_open_emoji_picker">Abrir seletor de Emoji</string> + <string name="a11y_unsent_draft">Esta sala tem rascunho não-enviado</string> <plurals name="entries"> <item quantity="one">%d entrada</item> <item quantity="other">%d entradas</item> </plurals> - <string name="settings_server_upload_size_title">Limite do envio de arquivo do servidor</string> - <string name="room_settings_room_access_restricted_description">Qualquer pessoa num espaço com esta sala pode encontrar e juntar-se a ela. Somente admins desta sala podem adicioná-la a um espaço.</string> + <string name="settings_server_upload_size_title">Limite de upload de arquivo do servidor</string> + <string name="room_settings_room_access_restricted_description">Qualquer pessoa num espaço com esta sala pode encontrá-la e juntar-se a ela. Somente admins desta sala podem adicioná-la a um espaço.</string> <string name="room_settings_room_access_restricted_title">Espaços</string> <string name="room_settings_room_access_public_description">Qualquer pessoa pode encontrar a sala e juntar-se</string> <string name="room_settings_room_access_public_title">Pública</string> <string name="room_settings_room_access_private_description">Somente pessoas convidadas podem encontrar e juntar-se</string> <string name="room_settings_room_access_private_title">Privada</string> <string name="room_settings_room_access_entry_unknown">Configuração de acesso desconhecida (%s)</string> - <string name="room_settings_room_access_entry_knock">Qualquer pessoa que possa tocar na sala, membros pdem então aceitar ou rejeitar</string> + <string name="room_settings_room_access_entry_knock">Qualquer pessoa pode tocar na sala, membros podem então aceitar ou rejeitar</string> <string name="room_settings_guest_access_title">Permitir visitantes se juntarem</string> <string name="use_as_default_and_do_not_ask_again">Usar como default e não perguntar de novo</string> <string name="option_always_ask">Sempre perguntar</string> @@ -2757,4 +2757,123 @@ <string name="spaces_invited_header">Convites</string> <string name="suggested_header">Salas Sugeridas</string> <string name="event_status_sent_message">Mensagem enviada</string> + <string name="error_file_too_big_simple">O arquivo é grande demais para fazer upload.</string> + <string name="a11y_beta">Esta funcionalidade está em beta</string> + <string name="search_hint_room_name">Pesquisar Nome</string> + <string name="send_file_step_compressing_video">Comprimindo vídeo %d%%</string> + <string name="send_file_step_compressing_image">Comprimindo imagem…</string> + <string name="give_feedback">Dar Feedback</string> + <string name="feedback_failed">O feedback falhou para ser enviado (%s)</string> + <string name="feedback_sent">Obrigado, seu feedback tem sido enviado com sucesso</string> + <string name="you_may_contact_me">Vocês podem me contactar se vocês tiverem quaisquer perguntas subsequentes</string> + <string name="send_feedback_space_info">Você está usando uma versão beta de espaços. Seu feedback vai ajudar a informar as próximas versões. Sua plataforma e nome de usuária(o) vão ser anotados para nos ajudar a usar o seu feedback tanto quanto nós pudermos.</string> + <string name="feedback">Feedback</string> + <string name="send_feedback_space_title">Feedback de espaços</string> + <string name="error_jitsi_join_conf">Desculpe, um erro ocorreu enquanto tentando se juntar à conferência</string> + <string name="command_description_join_space">Juntar-se ao Espaço com a dada id</string> + <string name="a11y_public_room">Esta sala é pública</string> + <string name="a11y_unchecked">Não-checado</string> + <string name="call_transfer_unknown_person">Pessoa desconhecida</string> + <string name="call_transfer_transfer_to_title">Transferir para %1$s</string> + <string name="call_transfer_consulting_with">Consultando com %1$s</string> + <string name="space_mark_as_not_suggested">Marcar como não sugerida(o)</string> + <string name="space_mark_as_suggested">Marcar como sugerida(o)</string> + <string name="space_suggested">Sugerida(o)</string> + <string name="suggested_rooms_pills_on_empty_text">Você não está em nenhuma sala ainda. Abaixo estão algumas salas sugeridas, mas você pode ver mais com o botão verde direito fundo.</string> + <string name="room_alias_preview_not_found">Este alias não é acessível neste momento. +\nTente de novo mais tarde, ou peça a um/uma admin de sala para checar se você tem acesso.</string> + <string name="join_anyway">Juntar-Se Mesmo Assim</string> + <string name="skip_for_now">Pular por enquanto</string> + <string name="invite_just_to_this_room_desc">Elas não vão fazer parte de %s</string> + <string name="invite_just_to_this_room">Só a esta sala</string> + <string name="invite_by_link">Compartilhar link</string> + <string name="invite_by_mxid">Convidar por nome de usuária(o)</string> + <string name="invite_by_email">Convidar por email</string> + <string name="invite_people_menu">Convidar pessoas</string> + <string name="suggested_rooms_pills_on_empty_header">Boas-vindas a %1$s, %2$s.</string> + <string name="you_are_invited">Você está convidada(o)</string> + <string name="labs_use_restricted_join_rule_desc">Aviso requer suporte de servidor e versão de sala experimental</string> + <string name="user_invites_you">%s convida você</string> + <string name="unnamed_room">Sala Não-Nomeada</string> + <string name="this_space_has_no_rooms_admin">Algumas salas podem estar escondidas porque elas são privadas e você precisa de um convite.</string> + <string name="this_space_has_no_rooms_not_admin">Algumas salas podem estar escondidas porque elas são privadas e você precisa de um convite. +\nVocê não tem permissão para adicionar salas.</string> + <string name="this_space_has_no_rooms">Este espaço não tem nenhuma sala</string> + <string name="spaces_no_server_support_description">Por favor contacte sua/seu admin de servidorcasa para mais informação</string> + <string name="spaces_no_server_support_title">Parece que seu servidorcasa não suporta Espaços ainda</string> + <string name="spaces_feeling_experimental_subspace">Se sentindo experimental\? +\nVocê pode adicionar espaços existentes a um espaço.</string> + <string name="labs_space_show_orphan_in_home">Espaço Experimental - Somente mostrar órfãos em Home</string> + <string name="space_manage_rooms_and_spaces">Gerenciar salas e espaços</string> + <string name="make_this_space_public">Fazer este espaço público</string> + <string name="space_settings_manage_rooms">Gerenciar salas</string> + <string name="looking_for_someone_not_in_space">Procurando por alguém que não está em %s\?</string> + <string name="labs_use_restricted_join_rule">Espaço Experimental - Sala Restringida.</string> + <string name="spaces_beta_welcome_to_spaces_desc">Espaços são uma nova forma de agrupar salas e pessoas.</string> + <string name="spaces_beta_welcome_to_spaces">Boas-vindas a Espaços!</string> + <string name="space_add_rooms">Adicionar salas</string> + <string name="space_add_existing_rooms">Adicionar salas e espaços existentes</string> + <string name="space_leave_prompt_msg_as_admin">Você é admin deste espaço, assegure-se que você tem transferido direito de admin a um outro membro antes de sair.</string> + <string name="space_leave_prompt_msg_private">Este espaço não é público. Você não vai ser capaz de se rejuntar sem um convite.</string> + <string name="space_leave_prompt_msg_only_you">Você é a única pessoa aqui. Se você sair, ninguém vai ser capaz de se juntar no futuro, incluindo você.</string> + <string name="space_leave_prompt_msg">Você tem certeza que você quer sair do espaço\?</string> + <string name="leave_space">Sair de Espaço</string> + <string name="space_add_child_title">Adicionar salas</string> + <string name="space_explore_activity_title">Explorar salas</string> + <plurals name="space_people_you_know"> + <item quantity="one">%d pessoa que você conhece já tem se juntado</item> + <item quantity="other">%d pessoas que você conhece já têm se juntado</item> + </plurals> + <string name="join_space">Juntar-Se a Espaço</string> + <string name="create_space">Criar Espaço</string> + <string name="share_space_link_message">Junte-se a meu espaço %1$s %2$s</string> + <string name="invite_to_space_with_name_desc">Elas vão ser capazes de explorar %s</string> + <string name="invite_to_space_with_name">Convidar a %s</string> + <string name="invite_people_to_your_space_desc">É só você no momento. %s vai ser ainda melhor com outras(os).</string> + <string name="invite_to_space">Convidar a %s</string> + <string name="invite_people_to_your_space">Convidar pessoas a seu espaço</string> + <string name="create_space_topic_hint">Descrição</string> + <string name="create_spaces_loading_message">Criando Espaço…</string> + <string name="create_spaces_default_public_random_room_name">Aleatório</string> + <string name="create_spaces_default_public_room_name">Geral</string> + <string name="create_spaces_room_private_header_desc">Vamos criar uma sala para cada uma delas. Você pode adicionar outras mais tarde também, incluindo umas já existentes.</string> + <string name="create_spaces_room_private_header">Em que coisas você está trabalhando\?</string> + <string name="create_spaces_room_public_header_desc">Nós vamos criar salas para elas. Você pode adicionar outras mais tarde também.</string> + <string name="create_spaces_room_public_header">Quais são algumas discussões que você quer ter em %s\?</string> + <string name="create_space_error_empty_field_space_name">Dê-lhe um nome para continuar.</string> + <string name="create_spaces_details_private_header">Adicione alguns detalhes para ajudar pessoas a identificá-lo. Você pode mudar isto a qualquer ponto.</string> + <string name="create_spaces_details_public_header">Adicione alguns detalhes para ajudá-lo a se destacar. Você pode mudar isto a qualquer ponto.</string> + <string name="activity_create_space_title">Criar um espaço</string> + <string name="space_type_private_desc">Somente convite, o melhor para você mesma(o) ou equipes</string> + <string name="space_type_private">Privado</string> + <string name="space_type_public_desc">Aberto para qualquer pessoa, o melhor para comunidades</string> + <string name="space_type_public">Público</string> + <string name="create_spaces_private_teammates">Um espaço privado para você & suas/seus colegas de equipe</string> + <string name="create_spaces_me_and_teammates">Eu e minhas/meus colegas de equipe</string> + <string name="create_spaces_organise_rooms">Um espaço privado para organizar suas salas</string> + <string name="create_spaces_just_me">Só eu</string> + <string name="create_spaces_make_sure_access">Assegure-se que as pessoas certas têm acesso a %s. Você pode mudar isto mais tarde.</string> + <string name="create_spaces_who_are_you_working_with">Com quem você está trabalhando\?</string> + <string name="create_spaces_join_info_help">Para se juntar a um espaço existente, você precisa de um convite.</string> + <string name="create_spaces_you_can_change_later">Você pode mudar isto mais tarde</string> + <string name="create_spaces_choose_type_label">Que tipo de espaço você quer criar\?</string> + <string name="create_spaces_type_header">Espaços são uma nova forma de agrupar salas e pessoas</string> + <string name="your_private_space">Seu espaço privado</string> + <string name="your_public_space">Seu espaço público</string> + <string name="add_space">Adicionar Espaço</string> + <string name="private_space">Espaço privado</string> + <string name="public_space">Espaço público</string> + <string name="command_description_create_space">Criar um Espaço</string> + <string name="a11y_public_space">Este Espaço é público</string> + <string name="command_description_leave_room">Sair de sala com dada id (ou sala atual se nula)</string> + <string name="directory_add_a_new_server_error_already_added">Este servidor já está presente na lista</string> + <string name="directory_add_a_new_server_error">Não dá para encontrar este servidor ou sua lista de salas</string> + <string name="directory_add_a_new_server_prompt">Entre o nome de um novo servidor que você quer explorar.</string> + <string name="directory_add_a_new_server">Adicionar um novo servidor</string> + <string name="directory_your_server">Seu servidor</string> + <string name="send_images_and_video_with_original_size">Enviar mídia com o tamanho original</string> + <plurals name="send_videos_with_original_size"> + <item quantity="one">Enviar vídeo com o tamanho original</item> + <item quantity="other">Enviar vídeos com o tamanho original</item> + </plurals> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-pt/strings.xml b/vector/src/main/res/values-pt/strings.xml index 8220b08dd4..0cf47bd339 100644 --- a/vector/src/main/res/values-pt/strings.xml +++ b/vector/src/main/res/values-pt/strings.xml @@ -2,7 +2,6 @@ <resources> <string name="summary_message">%1$s: %2$s</string> <string name="summary_user_sent_image">%1$s enviou uma imagem.</string> - <string name="notice_room_invite_no_invitee">convite de %s</string> <string name="notice_room_invite">%1$s convidou %2$s</string> <string name="notice_room_invite_you">%1$s convidou-o</string> @@ -30,55 +29,39 @@ <string name="notice_room_visibility_world_readable">todos.</string> <string name="notice_room_visibility_unknown">desconhecida (%s).</string> <string name="notice_end_to_end">%1$s ativou a criptografia ponta-a-ponta (%2$s)</string> - <string name="notice_requested_voip_conference">%1$s solicitou uma conferência VoIP</string> <string name="notice_voip_started">A conferência VoIP começou</string> <string name="notice_voip_finished">A conferência VoIP terminou</string> - <string name="notice_avatar_changed_too">(o avatar também foi alterado)</string> <string name="notice_room_name_removed">%1$s removeu o nome da sala</string> <string name="notice_room_topic_removed">%1$s removeu o tópico da sala</string> <string name="notice_profile_change_redacted">%1$s atualizou o seu perfil %2$s</string> <string name="notice_room_third_party_invite">%1$s enviou um convite para que %2$s se junte à sala</string> <string name="notice_room_third_party_registered_invite">%1$s aceitou o convite para %2$s</string> - <string name="notice_crypto_unable_to_decrypt">** Impossível decifrar: %s **</string> <string name="notice_crypto_error_unkwown_inbound_session_id">O dispositivo de quem enviou a mensagem não nos enviou as chaves para esta mensagem.</string> - <!-- Room Screen --> <string name="could_not_redact">Não foi possível apagar</string> <string name="unable_to_send_message">Não foi possível enviar a mensagem</string> - <string name="message_failed_to_upload">O envio da imagem falhou</string> - <!-- general errors --> <string name="network_error">Erro de conexão à Internet</string> <string name="matrix_error">Erro do Matrix</string> - <!-- Home Screen --> - <!-- Last seen time --> - <!-- call events --> - <!-- room error messages --> <string name="room_error_join_failed_empty_room">Ainda não é possível voltar a entrar numa sala vazia.</string> - <!-- medium friendly name --> <string name="medium_email">Endereço de e-mail</string> <string name="medium_phone_number">Número de telefone</string> - <!-- Room display name --> <string name="room_displayname_invite_from">Convite de %s</string> <string name="room_displayname_room_invite">Convite para sala</string> <string name="room_displayname_two_members">%1$s e %2$s</string> <string name="room_displayname_empty_room">Sala vazia</string> - - <string name="summary_user_sent_sticker">%1$s enviou um sticker.</string> - <string name="notice_room_update">%s fez o upgrade da sala.</string> - <string name="notice_event_redacted">Mensagem removida</string> <string name="notice_event_redacted_by">Mensagem removida por %1$s</string> <!-- titles --> @@ -1044,4 +1027,6 @@ Por favor, verifique configurações de aplicação</string> <string name="settings_system_preferences_summary">Escolha cor de LED, vibração, som…</string> <string name="notification_sync_init">A iniciar o serviço</string> <string name="title_activity_verify_device">Verificar sessão</string> + <string name="template_settings_background_fdroid_sync_mode_real_time_description">${app_name} irá sincronizar em fundo periodicamente em tempo preciso (configurável). +\nIsto terá impacto na utilização do rádio e da bateria, será exibida uma notificação permanente declarando que ${app_name} está à escuta dos eventos.</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-ro/strings.xml b/vector/src/main/res/values-ro/strings.xml index 866c827cf2..c5bae614bb 100644 --- a/vector/src/main/res/values-ro/strings.xml +++ b/vector/src/main/res/values-ro/strings.xml @@ -197,4 +197,97 @@ <string name="fab_menu_create_chat">Mesaje directe</string> <string name="room_participants_header_direct_chats">Mesaje directe</string> <string name="sign_out_bottom_sheet_dont_want_secure_messages">Nu vreau mesajele mele criptate</string> + <string name="settings_send_markdown">Format Markdown</string> + <string name="settings_devices_list">Sesiuni</string> + <string name="settings_contact">Contacte locale</string> + <string name="settings_cryptography">Criptografie</string> + <string name="settings_integrations">Integrări</string> + <string name="settings_advanced">Avansat</string> + <string name="settings_ignored_users">Utilizatori ignorați</string> + <string name="settings_notifications">Notificări</string> + <string name="settings_user_settings">Setările utilizatorului</string> + <string name="settings_privacy_policy">Politica de confidențialitate</string> + <string name="settings_copyright">Drepturi de autor</string> + <string name="settings_app_term_conditions">Termene și condiții</string> + <string name="settings_olm_version">Versiune olm</string> + <string name="settings_version">Versiune</string> + <string name="settings_background_fdroid_sync_mode_battery">Optimizat pentru baterie</string> + <string name="settings_invited_to_room">Când sunt invitat într-o cameră</string> + <string name="settings_silent_notifications_preferences">Configurează notificările silențioase</string> + <string name="settings_notification_ringtone">Sunet de notificare</string> + <string name="settings_notification_privacy_reduced">Confidențialitate redusă</string> + <string name="settings_troubleshoot_test_fcm_failed_account_missing_quick_fix">Adaugă un cont</string> + <string name="settings_troubleshoot_test_play_services_quickfix">Repară serviciile Google Play</string> + <string name="settings_troubleshoot_test_bing_settings_quickfix">Verifică setările</string> + <string name="settings_troubleshoot_test_bing_settings_title">Setări personalizate.</string> + <string name="settings_troubleshoot_test_device_settings_quickfix">Activează</string> + <string name="settings_troubleshoot_test_device_settings_title">Setările sesiunii.</string> + <string name="settings_troubleshoot_test_account_settings_quickfix">Activează</string> + <string name="settings_troubleshoot_test_account_settings_title">Setările contului.</string> + <string name="open_settings">Deschide setările</string> + <string name="settings_troubleshoot_test_system_settings_title">Setări de sistem.</string> + <string name="settings_phone_numbers">Numere de telefon</string> + <string name="settings_emails_empty">Nu a fost adăugat nicio adresă de e-mail pentru contul dumneavoastră</string> + <string name="settings_emails">Adrese de e-mail</string> + <string name="settings_add_phone_number">Adaugă un număr de telefon</string> + <string name="settings_phone_number_empty">Nu a fost adăugat niciun număr de telefon pentru contul dumneavoastră</string> + <string name="settings_phone_number">Telefon</string> + <string name="settings_add_email_address">Adaugă o adresă de e-mail</string> + <string name="settings_email_address">E-mail</string> + <string name="settings_display_name">Numele afișat</string> + <string name="settings_profile_picture">Poza de profil</string> + <string name="room_sliding_menu_settings">Setări</string> + <string name="room_settings_add_homescreen_shortcut">Adaugă la ecranul de pornire</string> + <string name="room_settings_forget">Uită</string> + <string name="room_settings_leave_conversation">Părăsește conversația</string> + <string name="room_settings_de_prioritize">Deprioritizează</string> + <string name="room_settings_favourite">Favorite</string> + <string name="room_settings_mute">Mut</string> + <string name="room_settings_mention_only">Doar mențiunile</string> + <string name="room_settings_all_messages">Toate mesajele</string> + <string name="room_permissions_change_settings">Schimbă setările</string> + <string name="space_explore_activity_title">Explorează camerele</string> + <string name="invite_people_menu">Invită persoane</string> + <string name="add_space">Adaugă spațiu</string> + <string name="room_list_catchup_welcome_title">Bine ai venit acasă!</string> + <string name="group_details_home">Acasă</string> + <string name="bottom_action_home">Acasă</string> + <string name="settings_emails_and_phone_numbers_title">E-mailuri și numere de telefon</string> + <string name="create_spaces_default_public_room_name">Generale</string> + <string name="settings_general_title">Generale</string> + <string name="preference_voice_and_video">Voce și video</string> + <string name="room_settings_category_advanced_title">Avansat</string> + <string name="preference_root_help_about">Ajutor și despre</string> + <string name="settings_labs_native_camera">Utilizați camera dispozitivului</string> + <string name="room_settings_labs_end_to_end_is_active">Criptarea end-to-end este activă</string> + <string name="room_settings_labs_pref_title">Experimental</string> + <string name="settings_security_and_privacy">Securitate și confidențialitate</string> + <string name="room_list_quick_actions_settings">Setări</string> + <string name="room_list_quick_actions_room_settings">Setările camerei</string> + <string name="settings_advanced_settings">Setări avansate</string> + <string name="settings_developer_mode">Modul dezvoltator</string> + <string name="settings">Setări</string> + <string name="room_profile_section_more_settings">Setările camerei</string> + <string name="direct_room_profile_section_more_settings">Setări</string> + <string name="settings_active_sessions_list">Sesiuni active</string> + <string name="settings_active_sessions_show_all">Afișează toate sesiunile</string> + <string name="settings_server_name">Numele serverului</string> + <string name="settings_server_version">Versiunea serverului</string> + <plurals name="settings_active_sessions_count"> + <item quantity="one">%d sesiune activă</item> + <item quantity="few">%d sesiuni active</item> + <item quantity="other">%d de sesiuni active</item> + </plurals> + <string name="settings_dev_tools">Instrumente de dezvoltare</string> + <string name="settings_troubleshoot_title">Depanare</string> + <string name="room_settings_topic_hint">Subiect</string> + <string name="room_settings_name_hint">Numele camerei</string> + <string name="settings_security_pin_code_notifications_title">Afișează conținutul în notificări</string> + <string name="soft_logout_clear_data_submit">Șterge toate datele</string> + <string name="soft_logout_clear_data_title">Șterge datele personale</string> + <string name="soft_logout_signin_password_hint">Parolă</string> + <string name="soft_logout_signin_submit">Conectare</string> + <string name="soft_logout_signin_title">Conectare</string> + <string name="ssl_logout_account">Deconectare</string> + <string name="logout">Deconectare</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index 2a597dd978..73512f103c 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -394,7 +394,7 @@ <string name="auth_forgot_password">Harruat fjalëkalimin?</string> <string name="auth_use_server_options">Përdor mundësi vetjake shërbyesi (e përparuar)</string> <string name="auth_email_validation_message">Ju lutemi, që të vazhdojë regjistrimi, kontrolloni email-in tuaj</string> - <string name="auth_recaptcha_message">Ky Shërbyes Home do të donte të sigurohej se s’jeni robot</string> + <string name="auth_recaptcha_message">Ky shërbyes Home do të donte të sigurohej se s’jeni robot</string> <string name="auth_username_in_use">Emër përdoruesi në përdorim</string> <string name="auth_home_server">Shërbyes Home:</string> <string name="auth_identity_server">Shërbyes Identitetesh:</string> @@ -1022,7 +1022,7 @@ <string name="encryption_information_unblock">Hiqe nga listë e zezë</string> <string name="encryption_information_verify_device_warning">Ripohojeni duke krahasuar sa vijon me Rregullimet e Përdoruesit te sesioni juaj tjetër:</string> <string name="encryption_information_verify_device_warning2">Nëse s’përputhen, siguria e komunikimeve tuaja mund të jetë komprometuar.</string> - <string name="directory_server_placeholder">URL Shërbyesi Home</string> + <string name="directory_server_placeholder">Emër shërbyesi</string> <plurals name="notification_unread_notified_messages_in_room_rooms"> <item quantity="one">%d dhomë</item> <item quantity="other">%d dhoma</item> @@ -2120,7 +2120,7 @@ <string name="invitations_sent_to_two_users">Ftesa u dërgua te %1$s dhe %2$s</string> <plurals name="invitations_sent_to_one_and_more_users"> <item quantity="one">U dërguan ftesa te %1$s dhe një tjetër</item> - <item quantity="other">U dërguan ftesa te %1$s dhe %2$s të tjerë</item> + <item quantity="other">U dërguan ftesa te %1$s dhe %2$d të tjerë</item> </plurals> <string name="invite_users_to_room_failure">S’ftuam dot përdorues. Ju lutemi, kontrolloni përdoruesit që doni të ftoni dhe riprovoni.</string> <string name="event_redacted">Mesazhi u fshi</string> @@ -2662,7 +2662,7 @@ \nPo shkarkohen të dhëna…</string> <string name="initial_sync_start_server_computing">Njëkohësimi Fillestar: \nPo pritet për përgjigje nga shërbyesi…</string> - <string name="spaces_beta_welcome_to_spaces_desc">Hapësirat janë mënyra për të grupuar dhoma dhe persona për punë, zbavitje ose thjesht për veten tuaj.</string> + <string name="spaces_beta_welcome_to_spaces_desc">Hapësirat janë mënyra për të grupuar dhoma dhe persona.</string> <string name="labs_use_restricted_join_rule_desc">Sinjalizimi lyp mbulim nga shërbyesi dhe version eksperimental dhome</string> <string name="labs_use_restricted_join_rule">Hapësirë Eksperimentale - Dhomë e Kufizuar.</string> <string name="you_are_invited">Jeni ftuar</string> @@ -2747,7 +2747,7 @@ <string name="make_this_space_public">Bëje publike këtë hapësirë</string> <string name="space_settings_manage_rooms">Administroni dhoma</string> <string name="looking_for_someone_not_in_space">Po kërkoni për dikë jo në %s\?</string> - <string name="user_invites_you">%1$s ju fton</string> + <string name="user_invites_you">%s ju fton</string> <string name="a11y_public_room">Kjo dhomë është publike</string> <string name="a11y_unchecked">E pakontrolluar</string> <string name="a11y_checked">U kontrollua</string> @@ -2761,4 +2761,39 @@ <string name="send_file_step_compressing_image">Po ngjeshet figurë…</string> <string name="use_as_default_and_do_not_ask_again">Përdore si parazgjedhje dhe mos pyet sërish</string> <string name="option_always_ask">Pyet përherë</string> + <string name="this_space_has_no_rooms_admin">Disa dhoma mund të jenë të fshehura, ngaqë janë private dhe mund t’ju duhet një ftesë.</string> + <string name="this_space_has_no_rooms_not_admin">Disa dhoma mund të jenë të fshehura, ngaqë janë private dhe ju duhet një ftesë. +\nS’keni leje të shtoni dhoma.</string> + <string name="this_space_has_no_rooms">Kjo hapësirë s’ka dhoma</string> + <string name="spaces_no_server_support_description">Ju lutemi, për më tepër hollësi, lidhuni me përgjegjësin e shërbyesit tuaj Home</string> + <string name="spaces_no_server_support_title">Duket sikur shërbyesi juaj Home nuk mbulon ende Hapësira</string> + <string name="spaces_feeling_experimental_subspace">Ndiheni eksperimentues\? +\nMund të shtoni te një hapësirë hapësira ekzistuese.</string> + <string name="labs_space_show_orphan_in_home">Hapësirë Eksperimentale - Shfaq jetimë te Kreu</string> + <string name="space_add_rooms">Shtoni dhoma</string> + <string name="space_leave_prompt_msg_as_admin">Jeni përgjegjës i kësaj hapësirë, sigurohuni se keni shpërngulur të drejt përgjegjësi te një anëtar tjetër, përpara braktisjes.</string> + <string name="space_leave_prompt_msg_private">Kjo hapësirë s’është publike. S’do të jeni në gjendje të rihyni pa një ftesë.</string> + <string name="space_leave_prompt_msg_only_you">Jeni personi i vetëm këtu. Nëse ikni, askush s’do të jetë në gjendje të marrë pjesë në të ardhmen, përfshi ju.</string> + <string name="invite_to_space">Ftojeni te %s</string> + <string name="a11y_beta">Kjo veçori është në fazë beta</string> + <string name="give_feedback">Jepni Përshtypje</string> + <string name="feedback_failed">Dështoi dërgimi i përshtypjeve (%s)</string> + <string name="feedback_sent">Faleminderit, përshtypjet tuaja u dërguan me sukses</string> + <string name="you_may_contact_me">Mund të lidheni me mua, nëse keni ndonjë pyetje më tej</string> + <string name="send_feedback_space_info">Po përdorni një version beta të hapësirave. Përshtypjet tuaja do të ndihmojnë në përmirësimin e versioneve të ardhshëm. Platforma dhe emri juaj i përdoruesit do të mbahen shënim, për të na ndihmuar të përdoren përshtypjet tuaja sa më shumë që të jetë e mundur.</string> + <string name="feedback">Përshtypje</string> + <string name="send_feedback_space_title">Përshtypje për hapësirat</string> + <string name="error_jitsi_join_conf">Na ndjeni, ndodhi një gabim teksa provohej të hyhej te konferenca</string> + <string name="unnamed_room">Dhomë e Paemërtuar</string> + <string name="private_space">Hapësirë private</string> + <string name="public_space">Hapësirë publike</string> + <string name="a11y_public_space">Kjo Hapësirë është publike</string> + <string name="call_transfer_unknown_person">Person i panjohur</string> + <string name="call_transfer_transfer_to_title">Shpërngule te %1$s</string> + <string name="call_transfer_consulting_with">Po konsultohet me %1$s</string> + <string name="directory_add_a_new_server_error_already_added">Ky shërbyes është tashmë i pranishëm te lista</string> + <string name="directory_add_a_new_server_error">S’gjendet dot ky shërbyes ose lista e dhomave të tij</string> + <string name="directory_add_a_new_server_prompt">Jepni emrin e e një shërbyesi të ri që doni të eksploroni.</string> + <string name="directory_add_a_new_server">Shtoni shërbyes të ri</string> + <string name="directory_your_server">Shërbyesi juaj</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 0cd51a3f0d..ce65fd9a5a 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -662,7 +662,7 @@ <string name="failed_to_load_timeline_position">%s försökte ladda en specifik punkt i det här rummets tidslinje, men kunde inte hitta den.</string> <string name="directory_server_type_homeserver">Skriv en hemserver att visa listan över offentliga rum från</string> <string name="directory_server_all_rooms_on_server">Alla rum på %s-servern</string> - <string name="directory_server_native_rooms">Alla %s-rum på Matrix</string> + <string name="directory_server_native_rooms">Alla nativa %srum</string> <plurals name="notification_unread_notified_messages_in_room_rooms"> <item quantity="one">%d rum</item> <item quantity="other">%d rum</item> @@ -1712,7 +1712,7 @@ <string name="encryption_information_verify_device_warning2">Om de inte matchar så kan kommunikationens säkerhet vara äventyrad.</string> <string name="encryption_information_verify_key_match">Jag verifierar att nycklarna matchar</string> <string name="directory_server_fail_to_retrieve_server">Servern kan vara otillgänglig eller överbelastad</string> - <string name="directory_server_placeholder">Hemserver-URL</string> + <string name="directory_server_placeholder">Servernamn</string> <string name="lock_screen_hint">Skriv här…</string> <string name="notification_unread_notified_messages_in_room">%1$s i %2$s</string> <string name="notification_unknown_new_event">Ny händelse</string> @@ -2534,9 +2534,9 @@ <string name="room_settings_alias_title">Rumsadresser</string> <string name="room_settings_room_access_title">Rumsåtkomst</string> <string name="room_settings_room_read_history_dialog_subtitle">Ändringar av vilka som kan läsa historik kommer bara gälla för framtida meddelanden i det här rummet. Synligheten för existerande historik kommer att vara oförändrad.</string> - <string name="default_message_emote_snow">skickar snö ❄️</string> + <string name="default_message_emote_snow">skickar snöfall ❄️</string> <string name="default_message_emote_confetti">skickar konfetti 🎉</string> - <string name="command_snow">Skickar det givna meddelandet med snö</string> + <string name="command_snow">Skickar det givna meddelandet med snöfall</string> <string name="command_confetti">Skickar de givna meddelandet med konfetti</string> <string name="login_clear_homeserver_history">Rensa historik</string> <string name="login_social_sso">externt konto</string> @@ -2734,7 +2734,7 @@ <string name="labs_use_restricted_join_rule_desc">Varning kräver serverstöd och experimentell rumsversion</string> <string name="labs_use_restricted_join_rule">Experimentellt utrymme - Begränsat rum.</string> <string name="you_are_invited">Du är inbjuden</string> - <string name="spaces_beta_welcome_to_spaces_desc">Utrymmen är nya sätt att gruppera rum och personer för arbete, skoj eller bara för dig själv.</string> + <string name="spaces_beta_welcome_to_spaces_desc">Utrymmen är ett nytt sätt att gruppera rum och personer.</string> <string name="spaces_beta_welcome_to_spaces">Välkommen till utrymmen!</string> <string name="space_add_existing_rooms">Lägg till existerande rum och utrymme</string> <string name="space_leave_prompt_msg">Är du säker på att du vill lämna utrymmet\?</string> @@ -2771,4 +2771,39 @@ <string name="send_file_step_compressing_image">Komprimerar bild…</string> <string name="use_as_default_and_do_not_ask_again">Använd som förval och fråga inte igen</string> <string name="option_always_ask">Fråga alltid</string> + <string name="this_space_has_no_rooms_admin">Vissa rum kan vara dolda för att de är privata och du behöver en inbjudan.</string> + <string name="this_space_has_no_rooms_not_admin">Vissa rum kan vara dolda för att de är privata och du behöver en inbjudan. +\nDu har inte behörighet att lägga till rum.</string> + <string name="this_space_has_no_rooms">Det här utrymmet har inga rum</string> + <string name="spaces_no_server_support_description">Vänligen kontakta din hemserveradmin för vidare information</string> + <string name="spaces_no_server_support_title">Det verkar som att din hemserver inte stöder utrymmen än</string> + <string name="spaces_feeling_experimental_subspace">Känner du dig äventyrlig\? +\nDu kan lägga till existerande utrymmen till ett utrymme.</string> + <string name="labs_space_show_orphan_in_home">Experimentellt utrymme - Visa bara övergivna i Hem</string> + <string name="space_add_rooms">Lägg till rum</string> + <string name="space_leave_prompt_msg_as_admin">Du är administratör för det här utrymmet, se till att du har överfört administratörsrättigheter till en annan medlem innan du lämnar.</string> + <string name="space_leave_prompt_msg_private">Det här utrymmet är inte offentligt. Du kommer inte att kunna gå med igen utan en inbjudan.</string> + <string name="space_leave_prompt_msg_only_you">Du är den enda personen här. Om du lämnar så kommer ingen kunna gå med i framtiden, inklusive du.</string> + <string name="invite_to_space">Bjud in till %s</string> + <string name="a11y_beta">Den här funktionen är i beta</string> + <string name="give_feedback">Ge återkoppling</string> + <string name="feedback_failed">Din återkoppling misslyckades att skickas (%s)</string> + <string name="feedback_sent">Tack, din återkoppling har skickats framgångsrikt</string> + <string name="you_may_contact_me">Ni kan kontakta mig om ni har några fler frågor</string> + <string name="send_feedback_space_info">Du använder en betaversion av utrymmen. Din återkoppling kommer att hjälpa till att utveckla nästa version. Din plattform och ditt användarnamn kommer att noteras för att hjälpa oss att få så mycket användning för din återkoppling som vi kan.</string> + <string name="feedback">Återkoppling</string> + <string name="send_feedback_space_title">Utrymmesåterkoppling</string> + <string name="error_jitsi_join_conf">Tyvärr så inträffade ett fel vid försök att gå med i gruppsamtalet</string> + <string name="unnamed_room">Namnlöst rum</string> + <string name="private_space">Privat utrymme</string> + <string name="public_space">Offentligt utrymme</string> + <string name="a11y_public_space">Det här utrymmet är offentligt</string> + <string name="call_transfer_unknown_person">Ökänd person</string> + <string name="call_transfer_transfer_to_title">Överför till %1$s</string> + <string name="call_transfer_consulting_with">Rådfrågar %1$s</string> + <string name="directory_add_a_new_server_error_already_added">Den här servern finns redan i listan</string> + <string name="directory_add_a_new_server_error">Kan inte hitta den här servern eller dess rumslista</string> + <string name="directory_add_a_new_server_prompt">Ange namnet för en ny server du vill utforska.</string> + <string name="directory_add_a_new_server">Lägg till en ny server</string> + <string name="directory_your_server">Din server</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-th/strings.xml b/vector/src/main/res/values-th/strings.xml index 1fbb9c70c3..a55bb93992 100644 --- a/vector/src/main/res/values-th/strings.xml +++ b/vector/src/main/res/values-th/strings.xml @@ -320,4 +320,14 @@ <string name="room_permissions_ban_users">ห้ามผู้ใช้</string> <string name="ssl_fingerprint_hash">ลายนิ้วมือ (%s):</string> <string name="room_participants_action_ignore_title">เพิกเฉยผู้ใช้</string> + <string name="settings_fail_to_update_password">ไม่สามารถอัปเดตรหัสผ่าน</string> + <string name="settings_change_password_submit">อัปเดตรหัสผ่าน</string> + <string name="settings_confirm_password">ยืนยันรหัสผ่านใหม่</string> + <string name="settings_new_password">รหัสผ่านใหม่</string> + <string name="settings_old_password">รหัสผ่านปัจจุบัน</string> + <string name="settings_select_language">เลือกภาษา</string> + <string name="settings_interface_language">ภาษา</string> + <string name="dialog_edit_hint">ค่าใหม่</string> + <string name="action_switch">สลับ</string> + <string name="settings_category_room_directory">ไดเรกทอรีห้อง</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 4d8cd05f6e..5c9bf9595e 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -91,7 +91,7 @@ </plurals> <string name="room_displayname_4_members">%1$s, %2$s, %3$s та %4$s</string> <string name="room_displayname_3_members">%1$s, %2$s та %3$s</string> - <string name="power_level_default">Типово</string> + <string name="power_level_default">Типовий</string> <string name="power_level_moderator">Модератор</string> <string name="power_level_admin">Адміністратор</string> <string name="notice_widget_removed_by_you">Ви вилучили %1$s знадіб</string> @@ -156,8 +156,8 @@ <string name="initial_sync_start_importing_account">Початкова синхронізація: \nІмпортування даних облікового запису…</string> <string name="room_displayname_empty_room_was">Порожня кімната (була %s)</string> - <string name="power_level_custom_no_value">Власний</string> - <string name="power_level_custom">Власний (%1$d)</string> + <string name="power_level_custom_no_value">Не типовий</string> + <string name="power_level_custom">Не типовий (%1$d)</string> <string name="notice_widget_modified_by_you">Ви змінили знадіб %1$s</string> <string name="notice_widget_modified">%1$s змінює знадіб %2$s</string> <string name="notice_direct_room_update_by_you">Ви оновили кімнату.</string> @@ -284,7 +284,7 @@ <string name="create_account">Зареєструватися</string> <string name="login">Увійти</string> <string name="logout">Вийти</string> - <string name="hs_url">URL сервера</string> + <string name="hs_url">URL-адреса домашнього сервера</string> <string name="identity_url">URL сервера ідентифікації</string> <string name="search">Пошук</string> <string name="start_new_chat">Почати новий чат</string> @@ -325,9 +325,9 @@ <string name="auth_use_server_options">Використовувати особливі налаштування сервера</string> <string name="auth_email_validation_message">Перевірте email для продовження реєстрації</string> <string name="auth_threepid_warning_message">Реєстрація за допомогою Email та номеру телефона водночас поки не підтримується. Лише номер телефону буде додано до облікового запису.\n\nВи можете додати email в налаштуваннях.</string> - <string name="auth_recaptcha_message">Цей сервер хоче переконатися, що ви не робот</string> + <string name="auth_recaptcha_message">Цей домашній сервер хоче переконатися, що ви не робот</string> <string name="auth_username_in_use">Логін вже використовується</string> - <string name="auth_home_server">Сервер:</string> + <string name="auth_home_server">Домашній сервер:</string> <string name="auth_identity_server">Сервер ідентифікації:</string> <string name="auth_reset_password_next_step_button">Я перевірив(ла) свою email адресу</string> <string name="auth_reset_password_message">Для скидання паролю введіть email прив\'язаний до облікового запису:</string> @@ -603,7 +603,7 @@ <string name="devices_delete_pswd">Пароль:</string> <string name="devices_delete_submit_button_label">Надіслати</string> <string name="settings_logged_in">Залоговано як</string> - <string name="settings_home_server">Cервер</string> + <string name="settings_home_server">Домашній сервер</string> <string name="settings_identity_server">Сервер ідентифікації</string> <string name="settings_user_interface">Інтерфейс користувача</string> <string name="settings_interface_language">Мова</string> @@ -756,7 +756,7 @@ <string name="select_room_directory">Вибір каталогу кімнат</string> <string name="directory_server_fail_to_retrieve_server">Можливо сервер недоступний чи перевантажений</string> <string name="directory_server_type_homeserver">Введіть сервер для показу каталогу публічних кімнат</string> - <string name="directory_server_placeholder">URL сервера</string> + <string name="directory_server_placeholder">Ім\'я сервера</string> <string name="directory_server_all_rooms_on_server">Всі кімнати на сервері %s</string> <string name="directory_server_native_rooms">Всі місцеві кімнати %s</string> <!-- historical --> @@ -1005,7 +1005,7 @@ <string name="community_name_hint">Приклад</string> <string name="community_id">ID Спільноти</string> <string name="community_id_hint">приклад</string> - <string name="group_details_home">Початок</string> + <string name="group_details_home">Домівка</string> <string name="group_details_people">Люди</string> <string name="group_details_rooms">Кімнати</string> <string name="no_users_placeholder">Немає користувачів</string> @@ -1111,7 +1111,7 @@ <string name="room_filtering_footer_create_new_direct_message">Відправити нове пряме повідомлення</string> <string name="command_description_shrug">Додає ¯\\_(ツ)_/¯ перед текстовим повідомленням</string> <string name="template_rendering_event_error_type_of_message_not_handled">${app_name} не підтримує повідомлення типу \'%1$s\'</string> - <string name="command_description_rainbow">Відправляє повідомлення розмальоване веселково</string> + <string name="command_description_rainbow">Надсилає повідомлення розмальоване веселково</string> <string name="settings_category_composer">Редактор повідомлень</string> <string name="command_description_plain">Відправляє повідомлення як текст без інтерпретації його як Markdown</string> <string name="room_message_placeholder">Повідомлення…</string> @@ -1387,7 +1387,7 @@ <string name="room_no_active_widgets">Немає активних знадобів</string> <string name="room_manage_integrations">Керувати інтеграціями</string> <string name="integration_manager_not_configured">Менеджер інтеграції не налаштовано.</string> - <string name="room_widget_webview_read_protected_media">Читати захищені DRM засоби масової інформації</string> + <string name="room_widget_webview_read_protected_media">Читати медіа захищені DRM</string> <string name="room_widget_webview_access_microphone">Використовувати мікрофон</string> <string name="room_widget_webview_access_camera">Використовувати камеру</string> <string name="room_widget_resource_decline_permission">Заблокувати все</string> @@ -1627,7 +1627,7 @@ <string name="permissions_denied_qr_code">Щоб сканувати QR-код необхідно дозволити доступ до камери.</string> <string name="return_to_call">Повернутися до виклику</string> <string name="video_call_in_progress">Триває відеовиклик…</string> - <string name="settings_call_ringtone_use_default_stun_sum">Використовуватиме %s допоміжним, коли ваш домашній сервер не пропонує такого (вашу IP-адресу буде надана під час виклику)</string> + <string name="settings_call_ringtone_use_default_stun_sum">Застосовуватиме %s допоміжним, коли ваш домашній сервер не пропонує такого (вашу IP-адресу буде надано під час виклику)</string> <string name="settings_call_ringtone_use_default_stun">Дозволити допоміжний сервер викликів</string> <string name="login_error_ssl_handshake">Ваш пристрій використовує застарілий протокол безпеки TLS, вразливий до атак, для вашої безпеки ви не зможете під\'єднатися</string> <string name="login_error_ssl_peer_unverified">Помилка SSL: особу співрозмовника не підтверджено.</string> @@ -1642,7 +1642,7 @@ <string name="room_list_quick_actions_notifications_all">Всі повідомлення</string> <string name="room_list_quick_actions_notifications_all_noisy">Всі повідомлення (гучно)</string> <string name="message_ignore_user">Нехтувати користувача</string> - <string name="unignore">Рознехтувати</string> + <string name="unignore">Не нехтувати</string> <string name="keys_backup_info_title_signature">Підпис</string> <string name="keys_backup_info_title_algorithm">Алгоритм</string> <string name="keys_backup_info_title_version">Версія</string> @@ -1817,9 +1817,9 @@ <string name="content_reported_as_inappropriate_title">Надіслано скаргу, як на неприйнятне</string> <string name="too_many_pin_failures">Забагато помилок, вам довелось вийти</string> <string name="unencrypted">Незашифроване</string> - <string name="default_message_emote_snow">надсилає сніг ❄️</string> + <string name="default_message_emote_snow">надсилає снігопад ❄️</string> <string name="default_message_emote_confetti">надсилає конфетті 🎉</string> - <string name="command_snow">Надсилає вказане повідомлення зі снігом</string> + <string name="command_snow">Надсилає вказане повідомлення зі снігопадом</string> <string name="command_confetti">Надсилає вказане повідомлення з конфетті</string> <plurals name="secure_backup_reset_devices_you_can_verify"> <item quantity="one">Показати пристрій, з якого ви можете звірити цей сеанс просто зараз</item> @@ -2058,4 +2058,32 @@ <string name="login_signin">Увійти</string> <string name="login_signin_to">Увійти до %1$s</string> <string name="login_social_signin_with">Увійти через %s</string> + <string name="create_room_encryption_description">Після увімкнення, шифрування не може бути вимкнено.</string> + <string name="create_room_encryption_title">Увімкнути шифрування</string> + <string name="room_settings_enable_encryption_dialog_submit">Увімкнути шифрування</string> + <string name="room_settings_enable_encryption_dialog_title">Увімкнути шифрування\?</string> + <string name="room_settings_enable_encryption_warning">Після увімкнення, шифрування не може бути вимкнено.</string> + <string name="command_description_rainbow_emote">Надсилає емоджі розмальоване веселково</string> + <string name="room_list_sharing_header_recent_rooms">Недавні кімнати</string> + <string name="room_member_open_or_create_dm">Безпосереднє повідомлення</string> + <string name="room_member_power_level_custom_in">Не типовий (%1$d) у %2$s</string> + <string name="room_member_power_level_custom">Не типовий</string> + <string name="notice_power_level_diff">%1$s з %2$s до %3$s</string> + <string name="notice_power_level_changed">%1$s змінює рівень доступу %2$s.</string> + <string name="notice_widget_jitsi_modified_by_you">Ви змінили відеоконференцію</string> + <string name="notice_widget_jitsi_modified">%1$s змінює відеоконференцію</string> + <string name="notice_widget_jitsi_removed_by_you">Ви завершили відеоконфернцію</string> + <string name="notice_widget_jitsi_added">%1$s розпочинає відеоконференцію</string> + <string name="notice_widget_jitsi_removed">%1$s завершує відеоконференцію</string> + <string name="notice_widget_jitsi_added_by_you">Ви розпочали відеоконференцію</string> + <string name="room_profile_section_admin">Дії адміністратора</string> + <string name="room_member_power_level_invites">Запрошення</string> + <string name="room_member_power_level_moderators">Модератори</string> + <string name="room_member_power_level_admins">Адміністратори</string> + <string name="room_profile_leaving_room">Залишення кімнати…</string> + <string name="room_member_power_level_default_in">Типово у %1$s</string> + <string name="room_member_power_level_moderator_in">Модератор у %1$s</string> + <string name="room_member_power_level_admin_in">Адміністратор у %1$s</string> + <string name="room_member_power_level_users">Користувачі</string> + <string name="spaces_invited_header">Запрошення</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-v23/theme_black.xml b/vector/src/main/res/values-v23/theme_black.xml deleted file mode 100644 index ad6abc9fbe..0000000000 --- a/vector/src/main/res/values-v23/theme_black.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <style name="AppTheme.Black.v23" parent="AppTheme.Base.Black"> - <item name="android:windowLightStatusBar">false</item> - </style> - - <style name="AppTheme.Black" parent="AppTheme.Black.v23"/> - -</resources> \ No newline at end of file diff --git a/vector/src/main/res/values-vi/strings.xml b/vector/src/main/res/values-vi/strings.xml index 1a55e22451..ec2de261f7 100644 --- a/vector/src/main/res/values-vi/strings.xml +++ b/vector/src/main/res/values-vi/strings.xml @@ -549,4 +549,242 @@ <string name="encryption_information_verify">Xác minh</string> <string name="hs_url">URL máy chủ nhà</string> <string name="action_historical">Lịch sử</string> + <string name="room_participants_leave_prompt_msg">Bạn có chắc bạn muốn rời khỏi phòng không\?</string> + <string name="room_participants_leave_prompt_title">Rời khỏi phòng</string> + <plurals name="format_time_d"> + <item quantity="other">%d ngày</item> + </plurals> + <plurals name="format_time_h"> + <item quantity="other">%d tiếng</item> + </plurals> + <plurals name="format_time_m"> + <item quantity="other">%d phút</item> + </plurals> + <plurals name="format_time_s"> + <item quantity="other">%d giây</item> + </plurals> + <string name="room_title_one_member">1 thành viên</string> + <plurals name="room_title_members"> + <item quantity="other">%d thành viên</item> + </plurals> + <plurals name="room_header_active_members_count"> + <item quantity="other">%d thành viên hoạt động</item> + </plurals> + <string name="room_creation_add_member">Thêm thành viên</string> + <string name="room_creation_title">Trò chuyện mới</string> + <string name="invite_no_identity_server_error">Thêm một máy chủ danh tính trong cài đặt của bạn để thực hiện hành động này.</string> + <string name="room_preview_room_interactions_disabled">Đây là một bản xem trước của phòng này. Các sự tương tác phòng đã bị tắt.</string> + <string name="room_preview_try_join_an_unknown_room_default">một phòng</string> + <string name="room_preview_try_join_an_unknown_room">Bạn đang cố truy cập %s. Bạn có muốn tham gia để tham dự vào cuộc thảo luận không\?</string> + <string name="room_preview_unlinked_email_warning">Lời mời này đã được gửi đến %s, nó không được liên kết với tài khoản này. +\nBạn có thể muốn đăng nhập bằng một tài khoản khác, hoặc thêm email này vào tài khoản của bạn.</string> + <string name="room_preview_invitation_format">Bạn đã được %s mời tham gia phòng này</string> + <string name="room_jump_to_first_unread">Nhảy đến tin nhắn chưa đọc đầu tiên.</string> + <string name="room_sync_in_progress">Đang đồng bộ…</string> + <string name="open_chat_header">Mở tiêu đề</string> + <string name="list_members">Liệt kê các thành viên</string> + <string name="reject">Từ chối</string> + <string name="preview">Xem trước</string> + <string name="join">Tham gia</string> + <string name="remove">Xoá</string> + <string name="_continue">Tiếp tục</string> + <string name="no">KHÔNG</string> + <string name="yes">CÓ</string> + <string name="media_slider_saved_message">Lưu vào mục tải xuống\?</string> + <string name="media_slider_saved">Đã lưu</string> + <string name="permissions_denied_add_contact">Cho phép quyền truy cập danh bạ của bạn.</string> + <string name="permissions_denied_qr_code">Để quét mã QR, bạn cần cho phép quyền truy cập máy ảnh.</string> + <string name="permissions_action_not_performed_missing_permissions">Xin lỗi. Hành động không được thực hiện do thiếu quyền</string> + <string name="template_permissions_msg_contacts_warning_other_androids">${app_name} có thể kiểm tra sổ địa chỉ của bạn để tìm những người dùng Matrix khác dựa trên email và số điện thoại của họ. +\n +\nBạn có đồng ý chia sẻ sổ địa chỉ của bạn vì mục đích này không\?</string> + <string name="template_permissions_rationale_msg_contacts">${app_name} có thể kiểm tra sổ địa chỉ của bạn để tìm những người dùng Matrix khác dựa trên email và số điện thoại của họ. Nếu bạn đồng ý chia sẻ sổ địa chỉ vì mục đích này, vui lòng cho phép quyền truy cập trên cửa sổ popup tiếp theo.</string> + <string name="template_permissions_rationale_msg_camera_and_audio">${app_name} cần quyền truy cập máy ảnh và micro của bạn để thực hiện các cuộc gọi video. +\n +\nVui lòng cho phép quyền truy cập trên các cửa sổ popup tiếp theo để có thể thực hiện cuộc gọi.</string> + <string name="permissions_rationale_msg_record_audio_explanation">" +\n +\nVui lòng cho phép quyền truy cập trên cửa sổ popup tiếp theo để có thể thực hiện cuộc gọi."</string> + <string name="template_permissions_rationale_msg_record_audio">${app_name} cần quyền truy cập micro của bạn để thực hiện các cuộc gọi âm thanh.</string> + <string name="permissions_rationale_msg_camera_explanation">" +\n +\nVui lòng cho phép quyền truy cập trên cửa sổ popup tiếp theo để có thể thực hiện cuộc gọi."</string> + <string name="template_permissions_rationale_msg_camera">${app_name} cần quyền truy cập máy ảnh để chụp ảnh và thực hiện các cuộc gọi video.</string> + <string name="template_permissions_rationale_msg_storage">${app_name} cần quyền truy cập thư viện ảnh và video của bạn để gửi và lưu các tệp đính kèm. +\n +\nVui lòng cho phép quyền truy cập trên cửa sổ popup tiếp theo để có thể gửi các tệp từ điện thoại của bạn.</string> + <string name="permissions_rationale_popup_title">Thông tin</string> + <string name="media_picker_cannot_record_video">Không thể quay video</string> + <string name="media_picker_both_capture_title">Chụp ảnh hoặc quay video</string> + <string name="call_error_answered_elsewhere">cuộc gọi đã được trả lời ở nơi khác</string> + <string name="call_error_camera_init_failed">Không thể khởi tạo máy ảnh</string> + <string name="call_error_ice_failed">Kết nối phương tiện thất bại</string> + <string name="call_error_user_not_responding">Bên ở xa không thể nhấc máy.</string> + <string name="call_hold_action">Giữ máy</string> + <string name="call_held_by_you">Bạn đã giữ máy</string> + <string name="call_held_by_user">%s đã giữ máy</string> + <string name="call_resume_action">Tiếp tục</string> + <string name="return_to_call">Quay về cuộc gọi</string> + <string name="active_call_with_duration">Cuộc gọi đang hoạt động (%s)</string> + <string name="video_call_in_progress">Cuộc gọi video đang diễn ra…</string> + <string name="call_in_progress">Cuộc gọi đang diễn ra…</string> + <string name="incoming_voice_call">Cuộc gọi thoại đến</string> + <string name="incoming_video_call">Cuộc gọi video đến</string> + <string name="incoming_call">Cuộc gọi đến</string> + <string name="call_ring">Đang gọi…</string> + <string name="call_ended">Cuộc gọi đã kết thúc</string> + <string name="settings_call_ringtone_use_default_stun_sum">Sẽ sử dụng %s làm hỗ trợ khi máy chủ nhà không có một máy chủ (địa chỉ IP của bạn sẽ được chia sẻ trong cuộc gọi)</string> + <string name="settings_call_ringtone_use_default_stun">Cho phép máy chủ hỗ trợ cuộc gọi dự phòng</string> + <string name="settings_call_category">Cuộc gọi</string> + <string name="yesterday">Hôm qua</string> + <string name="attachment_remaining_time_minutes">%1$d phút %2$d giây</string> + <string name="attachment_remaining_time_seconds">%d giây</string> + <string name="attachment_cancel_upload">Huỷ tải lên\?</string> + <string name="attachment_cancel_download">Huỷ tải xuống\?</string> + <string name="compression_opt_list_small">Nhỏ</string> + <string name="compression_opt_list_medium">Trung bình</string> + <string name="compression_opt_list_large">Lớn</string> + <string name="compression_opt_list_original">Nguyên gốc</string> + <string name="compression_options">Gửi dưới dạng</string> + <plurals name="membership_changes"> + <item quantity="other">%d thay đổi thành viên</item> + </plurals> + <string name="groups_list">Danh sách nhóm</string> + <string name="read_receipts_list">Danh sách xác nhận đã đọc</string> + <string name="template_e2e_re_request_encryption_key_dialog_content">Vui lòng khởi chạy ${app_name} trên một thiết bị khác mà có thể giải mã tin nhắn để nó có thể gửi các mã khoá vào phiên làm việc này.</string> + <string name="e2e_re_request_encryption_key_dialog_title">Đã gửi yêu cầu</string> + <string name="e2e_re_request_encryption_key_sent">Đã gửi yêu cầu mã khoá.</string> + <string name="e2e_re_request_encryption_key">Yêu cầu lại các mã khoá mã hoá từ các phiên làm việc khác của bạn.</string> + <string name="login_error_login_email_not_yet">Liên kết email mà chưa được nhấn vào</string> + <string name="login_error_limit_exceeded">Quá nhiều yêu cầu đã được gửi</string> + <string name="login_error_not_json">Đã không chứa JSON hợp lệ</string> + <string name="login_error_unknown_token">Token truy cập được chỉ định đã không được nhận ra</string> + <string name="error_unauthorized">Không được uỷ quyền, thiếu thông tin xác thực hợp lệ</string> + <string name="login_error_homeserver_not_found">Không thể kết nối đến máy chủ nhà tại URL này, vui lòng kiểm tra nó</string> + <string name="login_error_invalid_home_server">Vui lòng nhập URL hợp lệ</string> + <string name="login_error_unable_register_mail_ownership">Không thể đăng ký: lỗi sở hữu email</string> + <string name="auth_accept_policies">Vui lòng xem xét và chấp nhận chính sách của máy chủ nhà này:</string> + <string name="auth_reset_password_success_message">Mật khẩu của bạn đã được đặt lại. +\n +\nBạn đã bị đăng xuất ra khỏi tất cả phiên làm việc và sẽ không nhận thông báo đẩy nữa. Để bật lại thông báo, hãy đăng nhập lại trên mỗi thiết bị.</string> + <string name="auth_reset_password_error_unauthorized">Xác minh địa chỉ email thất bại: hãy chắc chắn là bạn đã nhấn vào liên kết trong email</string> + <string name="settings_room_directory_show_all_rooms_summary">Hiện tất cả phòng trong thư mục phòng, bao gồm cả các phòng có nội dung phản cảm.</string> + <string name="settings_room_directory_show_all_rooms">Hiện các phòng có nội dung phản cảm</string> + <string name="settings_category_room_directory">Thư mục phòng</string> + <string name="system_theme">Mặc định hệ thống</string> + <string name="notice_end_to_end_unknown_algorithm_by_you">Bạn đã bật mã hoá đầu cuối (thuật toán không được nhận ra %1$s).</string> + <string name="notice_end_to_end_unknown_algorithm">%1$s đã bật mã hoá đầu cuối (thuật toán không được nhận ra %2$s).</string> + <string name="notice_end_to_end_ok_by_you">Bạn đã bật mã hoá đầu cuối.</string> + <string name="notice_end_to_end_ok">%1$s đã bật mã hoá đầu cuối.</string> + <string name="notice_direct_room_guest_access_forbidden_by_you">Bạn đã ngăn chặn khách tham gia phòng.</string> + <string name="notice_direct_room_guest_access_forbidden">%1$s đã ngăn chặn khách tham gia phòng.</string> + <string name="notice_room_guest_access_forbidden_by_you">Bạn đã ngăn chặn khách tham gia phòng.</string> + <string name="notice_room_guest_access_forbidden">%1$s đã ngăn chặn khách tham gia phòng.</string> + <string name="notice_direct_room_guest_access_can_join_by_you">Bạn đã cho phép khách tham gia vào đây.</string> + <string name="notice_direct_room_guest_access_can_join">%1$s đã cho phép khách tham gia vào đây.</string> + <string name="notice_room_guest_access_can_join_by_you">Bạn đã cho phép khách tham gia phòng.</string> + <string name="notice_room_guest_access_can_join">%1$s đã cho phép khách tham gia phòng.</string> + <string name="notice_room_canonical_alias_no_change_by_you">Bạn đã thay đổi các địa chỉ cho phòng này.</string> + <string name="notice_room_canonical_alias_no_change">%1$s đã thay đổi các địa chỉ cho phòng này.</string> + <string name="notice_room_canonical_alias_main_and_alternative_changed_by_you">Bạn đã thay đổi các địa chỉ chính và thay thế cho phòng này.</string> + <string name="notice_room_canonical_alias_main_and_alternative_changed">%1$s đã thay đổi các địa chỉ chính và thay thế cho phòng này.</string> + <string name="notice_room_canonical_alias_alternative_changed_by_you">Bạn đã thay đổi các địa chỉ thay thế cho phòng này.</string> + <string name="notice_room_canonical_alias_alternative_changed">%1$s đã thay đổi các địa chỉ thay thế cho phòng này.</string> + <plurals name="notice_room_canonical_alias_alternative_removed_by_you"> + <item quantity="other">Bạn đã xoá các địa chỉ thay thế %1$s cho phòng này.</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_removed"> + <item quantity="other">%1$s đã xoá các địa chỉ thay thế %2$s cho phòng này.</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_added_by_you"> + <item quantity="other">Bạn đã thêm các địa chỉ thay thế %1$s cho phòng này.</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_added"> + <item quantity="other">%1$s đã thêm các địa chỉ thay thế %2$s cho phòng này.</item> + </plurals> + <string name="notice_room_canonical_alias_unset_by_you">Bạn đã xoá địa chỉ chính cho phòng này.</string> + <string name="notice_room_canonical_alias_unset">%1$s đã xoá địa chỉ chính cho phòng này.</string> + <string name="notice_room_canonical_alias_set_by_you">Bạn đã đặt địa chỉ chính cho phòng này thành %1$s.</string> + <string name="notice_room_canonical_alias_set">%1$s đã đặt địa chỉ chính cho phòng này thành %2$s.</string> + <string name="notice_room_aliases_added_and_removed_by_you">Bạn đã thêm %1$s và xoá %2$s với tư cách là các địa chỉ cho phòng này.</string> + <string name="notice_room_aliases_added_and_removed">%1$s đã thêm %2$s và xoá %3$s với tư cách là các địa chỉ cho phòng này.</string> + <plurals name="notice_room_aliases_removed_by_you"> + <item quantity="other">Bạn đã xoá %1$s với tư cách là các địa chỉ cho phòng này.</item> + </plurals> + <plurals name="notice_room_aliases_removed"> + <item quantity="other">%1$s đã xoá %2$s với tư cách là các địa chỉ cho phòng này.</item> + </plurals> + <plurals name="notice_room_aliases_added_by_you"> + <item quantity="other">Bạn đã thêm %1$s làm các địa chỉ cho phòng này.</item> + </plurals> + <plurals name="notice_room_aliases_added"> + <item quantity="other">%1$s đã thêm %2$s làm các địa chỉ cho phòng này.</item> + </plurals> + <string name="notice_room_withdraw_with_reason_by_you">Bạn đã rút lại lời mời của %1$s. Lý do: %2$s</string> + <string name="notice_room_withdraw_with_reason">%1$s đã rút lại lời mời của %2$s. Lý do: %3$s</string> + <string name="notice_room_third_party_registered_invite_with_reason_by_you">Bạn đã chấp nhận lời mời đối với %1$s. Lý do: %2$s</string> + <string name="notice_room_third_party_registered_invite_with_reason">%1$s đã chấp nhận lời mời đối với %2$s. Lý do: %3$s</string> + <string name="notice_room_third_party_revoked_invite_with_reason_by_you">Bạn đã thu hồi lời mời để %1$s tham gia phòng. Lý do: %2$s</string> + <string name="notice_room_third_party_revoked_invite_with_reason">%1$s đã thu hồi lời mời để %2$s tham gia phòng. Lý do: %3$s</string> + <string name="notice_room_third_party_invite_with_reason_by_you">Bạn đã gửi lời mời đến %1$s để tham gia phòng. Lý do: %2$s</string> + <string name="notice_room_third_party_invite_with_reason">%1$s đã gửi lời mời đến %2$s để tham gia phòng. Lý do: %3$s</string> + <string name="notice_room_ban_with_reason_by_you">Bạn đã cấm %1$s. Lý do: %2$s</string> + <string name="notice_room_ban_with_reason">%1$s đã cấm %2$s. Lý do: %3$s</string> + <string name="notice_room_unban_with_reason_by_you">Bạn đã bỏ cấm %1$s. Lý do: %2$s</string> + <string name="notice_room_unban_with_reason">%1$s đã bỏ cấm %2$s. Lý do: %3$s</string> + <string name="notice_room_kick_with_reason_by_you">Bạn đã đá %1$s. Lý do: %2$s</string> + <string name="notice_room_kick_with_reason">%1$s đã đá %2$s. Lý do: %3$s</string> + <string name="notice_room_reject_with_reason_by_you">Bạn đã từ chối lời mời. Lý do: %1$s</string> + <string name="notice_room_reject_with_reason">%1$s đã từ chối lời mời. Lý do: %2$s</string> + <string name="notice_direct_room_leave_with_reason_by_you">Bạn đã rời đi. Lý do: %1$s</string> + <string name="notice_direct_room_leave_with_reason">%1$s đã rời đi. Lý do: %2$s</string> + <string name="notice_direct_room_join_with_reason_by_you">Bạn đã tham gia. Lý do: %1$s</string> + <string name="notice_direct_room_join_with_reason">%1$s đã tham gia. Lý do: %2$s</string> + <string name="notice_room_join_with_reason_by_you">Bạn đã tham gia phòng. Lý do: %1$s</string> + <string name="notice_room_join_with_reason">%1$s đã tham gia phòng. Lý do: %2$s</string> + <string name="notice_room_invite_you_with_reason">%1$s đã mời bạn. Lý do: %2$s</string> + <string name="notice_room_invite_with_reason_by_you">Bạn đã mời %1$s. Lý do: %2$s</string> + <string name="notice_room_invite_with_reason">%1$s đã mời %2$s. Lý do: %3$s</string> + <string name="notice_room_invite_no_invitee_with_reason_by_you">Lời mời của bạn. Lý do: %1$s</string> + <string name="notice_room_invite_no_invitee_with_reason">Lời mời của %1$s. Lý do: %2$s</string> + <string name="clear_timeline_send_queue">Xoá hàng chờ gửi</string> + <string name="event_status_sending_message">Đang gửi tin nhắn…</string> + <string name="event_status_sent_message">Đã gửi tin nhắn</string> + <string name="initial_sync_start_importing_account_data">Đồng bộ ban đầu: +\nĐang nhập dữ liệu tài khoản</string> + <string name="initial_sync_start_importing_account_groups">Đồng bộ ban đầu: +\nĐang nhập các cộng đồng</string> + <string name="initial_sync_start_importing_account_left_rooms">Đồng bộ ban đầu: +\nĐang nhập các phòng đã rời khỏi</string> + <string name="initial_sync_start_importing_account_invited_rooms">Đồng bộ ban đầu: +\nĐang nhập các phòng đã mời vào</string> + <string name="initial_sync_start_importing_account_joined_rooms">Đồng bộ ban đầu: +\nĐang nhập các phòng đã tham gia</string> + <string name="initial_sync_start_importing_account_rooms">Đồng bộ ban đầu: +\nĐang nhập các phòng</string> + <string name="initial_sync_start_importing_account_crypto">Đồng bộ ban đầu: +\nĐang nhập mã hoá</string> + <string name="initial_sync_start_importing_account">Đồng bộ ban đầu: +\nĐang nhập tài khoản…</string> + <string name="initial_sync_start_downloading">Đồng bộ ban đầu: +\nĐang tải xuống dữ liệu…</string> + <string name="initial_sync_start_server_computing">Đồng bộ ban đầu: +\nĐang đợi phản hồi từ máy chủ…</string> + <string name="room_displayname_empty_room_was">Phòng trống (đã là %s)</string> + <string name="room_displayname_empty_room">Phòng trống</string> + <plurals name="room_displayname_three_and_more_members"> + <item quantity="other">%1$s và %2$d người khác</item> + </plurals> + <plurals name="room_displayname_four_and_more_members"> + <item quantity="other">%1$s, %2$s, %3$s và %4$d người khác</item> + </plurals> + <string name="room_displayname_4_members">%1$s, %2$s, %3$s và %4$s</string> + <string name="room_displayname_3_members">%1$s, %2$s và %3$s</string> + <string name="room_displayname_two_members">%1$s và %2$s</string> + <string name="room_displayname_room_invite">Lời mời vào phòng</string> + <string name="room_displayname_invite_from">Lời mời từ %s</string> + <string name="notice_room_server_acl_updated_ip_literals_not_allowed">• Máy chủ khớp với IP bây giờ sẽ bị cấm.</string> + <string name="notice_room_server_acl_updated_ip_literals_allowed">• Máy chủ khớp với IP bây giờ sẽ được cho phép.</string> + <string name="notice_room_server_acl_set_ip_literals_not_allowed">• Máy chủ khớp với IP bị cấm.</string> + <string name="notice_room_server_acl_set_ip_literals_allowed">• Máy chủ khớp với IP được cho phép.</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml index 82ec8fc36d..d3cc148943 100644 --- a/vector/src/main/res/values-zh-rCN/strings.xml +++ b/vector/src/main/res/values-zh-rCN/strings.xml @@ -3,7 +3,7 @@ <string name="summary_user_sent_image">%1$s 发送了一张图片。</string> <string name="notice_room_invite_no_invitee">%s 的邀请</string> <string name="notice_room_invite">%1$s 邀请了 %2$s</string> - <string name="notice_room_invite_you">%1$s 邀请了您</string> + <string name="notice_room_invite_you">%1$s 邀请了你</string> <string name="notice_room_join">%1$s 加入了聊天室</string> <string name="notice_room_leave">%1$s 离开了聊天室</string> <string name="notice_room_reject">%1$s 拒绝了邀请</string> @@ -73,7 +73,7 @@ <string name="initial_sync_start_importing_account_left_rooms">初始化同步: \n正在导入已离开的聊天室</string> <string name="initial_sync_start_importing_account_groups">初始化同步: -\n正在导入社区</string> +\n正在导入社群</string> <string name="initial_sync_start_importing_account_data">初始化同步: \n正在导入账号数据</string> <string name="notice_room_update">%s 升级了此聊天室。</string> @@ -82,7 +82,7 @@ <string name="notice_room_third_party_revoked_invite">%1$s 撤回了对 %2$s 加入聊天室的邀请</string> <string name="notice_room_invite_no_invitee_with_reason">%1$s 的邀请。理由:%2$s</string> <string name="notice_room_invite_with_reason">%1$s 邀请了 %2$s。理由:%3$s</string> - <string name="notice_room_invite_you_with_reason">%1$s 邀请了您。理由:%2$s</string> + <string name="notice_room_invite_you_with_reason">%1$s 邀请了你。理由:%2$s</string> <string name="notice_room_join_with_reason">%1$s 加入了聊天室。理由:%2$s</string> <string name="notice_room_leave_with_reason">%1$s 离开了聊天室。理由:%2$s</string> <string name="notice_room_reject_with_reason">%1$s 已拒绝邀请。理由:%2$s</string> @@ -100,107 +100,107 @@ <item quantity="other">%1$s 移除了 %2$s 作为此聊天室额地址。</item> </plurals> <string name="notice_room_aliases_added_and_removed">%1$s 为此聊天室新增了 %2$s 并移除 %3$s 地址。</string> - <string name="notice_room_canonical_alias_set">%1$s 将此聊天室的主地址设为了 %2$s。</string> - <string name="notice_room_canonical_alias_unset">%1$s 为此聊天室移除了主地址。</string> + <string name="notice_room_canonical_alias_set">%1$s 将此聊天室的主要地址设为了 %2$s。</string> + <string name="notice_room_canonical_alias_unset">%1$s 为此聊天室移除了主要地址。</string> <string name="notice_room_guest_access_can_join">%1$s 已允许访客加入聊天室。</string> <string name="notice_room_guest_access_forbidden">%1$s 已禁止访客加入聊天室。</string> <string name="notice_end_to_end_ok">%1$s 已开启端对端加密。</string> <string name="notice_end_to_end_unknown_algorithm">%1$s 已开启端对端加密(无法识别的演算法 %2$s)。</string> <string name="notice_room_created">%1$s 创建了这个聊天室</string> - <string name="summary_you_sent_image">您发送了一张图片。</string> - <string name="summary_you_sent_sticker">您发送了一张贴纸。</string> - <string name="notice_room_invite_no_invitee_by_you">您的邀请</string> - <string name="notice_room_created_by_you">您创建了这个聊天室</string> - <string name="notice_room_invite_by_you">您邀请了 %1$s</string> - <string name="notice_room_join_by_you">您加入了聊天室</string> - <string name="notice_room_leave_by_you">您离开了聊天室</string> - <string name="notice_room_reject_by_you">您拒绝了邀请</string> - <string name="notice_room_kick_by_you">您移除了 %1$s</string> - <string name="notice_room_unban_by_you">您解封了 %1$s</string> - <string name="notice_room_ban_by_you">您封禁了 %1$s</string> - <string name="notice_room_withdraw_by_you">您撤回了对 %1$s 的邀请</string> - <string name="notice_avatar_url_changed_by_you">您更换了您的头像</string> - <string name="notice_display_name_set_by_you">您将您的昵称设置为 %1$s</string> - <string name="notice_display_name_changed_from_by_you">您将您的昵称从 %1$s 改为 %2$s</string> - <string name="notice_display_name_removed_by_you">您移除了您的昵称 (%1$s)</string> - <string name="notice_room_topic_changed_by_you">您把主题改为:%1$s</string> - <string name="notice_room_avatar_changed">%1$s 变更了聊天室头像</string> - <string name="notice_room_avatar_changed_by_you">您变更了聊天室头像</string> - <string name="notice_room_name_changed_by_you">您把聊天室名称改为:%1$s</string> - <string name="notice_placed_video_call_by_you">您发起了一次视频通话。</string> - <string name="notice_placed_voice_call_by_you">您发起了一次语音通话。</string> + <string name="summary_you_sent_image">你发送了一张图片。</string> + <string name="summary_you_sent_sticker">你发送了一张贴纸。</string> + <string name="notice_room_invite_no_invitee_by_you">你的邀请</string> + <string name="notice_room_created_by_you">你创建了这个聊天室</string> + <string name="notice_room_invite_by_you">你邀请了 %1$s</string> + <string name="notice_room_join_by_you">你加入了聊天室</string> + <string name="notice_room_leave_by_you">你离开了聊天室</string> + <string name="notice_room_reject_by_you">你拒绝了邀请</string> + <string name="notice_room_kick_by_you">你移除了 %1$s</string> + <string name="notice_room_unban_by_you">你解封了 %1$s</string> + <string name="notice_room_ban_by_you">你封禁了 %1$s</string> + <string name="notice_room_withdraw_by_you">你撤回了对 %1$s 的邀请</string> + <string name="notice_avatar_url_changed_by_you">你更换了你的头像</string> + <string name="notice_display_name_set_by_you">你将你的昵称设置为 %1$s</string> + <string name="notice_display_name_changed_from_by_you">你将你的昵称从 %1$s 改为 %2$s</string> + <string name="notice_display_name_removed_by_you">你移除了你的昵称 (%1$s)</string> + <string name="notice_room_topic_changed_by_you">你把主题改为:%1$s</string> + <string name="notice_room_avatar_changed">%1$s 更改了聊天室头像</string> + <string name="notice_room_avatar_changed_by_you">你更改了聊天室头像</string> + <string name="notice_room_name_changed_by_you">你把聊天室名称改为:%1$s</string> + <string name="notice_placed_video_call_by_you">你发起了一次视频通话。</string> + <string name="notice_placed_voice_call_by_you">你发起了一次语音通话。</string> <string name="notice_call_candidates">%s 发送了数据以建立通话。</string> - <string name="notice_call_candidates_by_you">您发送了数据以建立通话。</string> - <string name="notice_answered_call_by_you">您接听了通话。</string> - <string name="notice_ended_call_by_you">您结束了通话。</string> - <string name="notice_made_future_room_visibility_by_you">您已让未来的聊天室记录对 %1$s 可见</string> - <string name="notice_end_to_end_by_you">您开启了端对端加密(%1$s)</string> - <string name="notice_room_update_by_you">您升级了此聊天室。</string> - <string name="notice_requested_voip_conference_by_you">您请求了 VoIP 会议</string> - <string name="notice_room_name_removed_by_you">您移除了聊天室名称</string> - <string name="notice_room_topic_removed_by_you">您移除了聊天室主题</string> + <string name="notice_call_candidates_by_you">你发送了数据以建立通话。</string> + <string name="notice_answered_call_by_you">你接听了通话。</string> + <string name="notice_ended_call_by_you">你结束了通话。</string> + <string name="notice_made_future_room_visibility_by_you">你已让未来的聊天室记录对 %1$s 可见</string> + <string name="notice_end_to_end_by_you">你开启了端对端加密(%1$s)</string> + <string name="notice_room_update_by_you">你升级了此聊天室。</string> + <string name="notice_requested_voip_conference_by_you">你请求了 VoIP 会议</string> + <string name="notice_room_name_removed_by_you">你移除了聊天室名称</string> + <string name="notice_room_topic_removed_by_you">你移除了聊天室主题</string> <string name="notice_room_avatar_removed">%1$s 移除了聊天室头像</string> - <string name="notice_room_avatar_removed_by_you">您移除了聊天室头像</string> - <string name="notice_profile_change_redacted_by_you">您更新了您的资料 %1$s</string> - <string name="notice_room_third_party_invite_by_you">您向 %1$s 发送了加入聊天室的邀请</string> - <string name="notice_room_third_party_revoked_invite_by_you">您已撤回了对 %1$s 加入聊天室的邀请</string> - <string name="notice_room_third_party_registered_invite_by_you">您接受了 %1$s 的邀请</string> + <string name="notice_room_avatar_removed_by_you">你移除了聊天室头像</string> + <string name="notice_profile_change_redacted_by_you">你更新了你的资料 %1$s</string> + <string name="notice_room_third_party_invite_by_you">你向 %1$s 发送了加入聊天室的邀请</string> + <string name="notice_room_third_party_revoked_invite_by_you">你已撤回了对 %1$s 加入聊天室的邀请</string> + <string name="notice_room_third_party_registered_invite_by_you">你接受了 %1$s 的邀请</string> <string name="notice_widget_added">%1$s 添加了 %2$s 挂件</string> - <string name="notice_widget_added_by_you">您添加了 %1$s 挂件</string> + <string name="notice_widget_added_by_you">你添加了 %1$s 挂件</string> <string name="notice_widget_removed">%1$s 移除了 %2$s 挂件</string> - <string name="notice_widget_removed_by_you">您移除了 %1$s 挂件</string> + <string name="notice_widget_removed_by_you">你移除了 %1$s 挂件</string> <string name="notice_widget_modified">%1$s 修改了 %2$s 挂件</string> - <string name="notice_widget_modified_by_you">您修改了 %1$s 挂件</string> + <string name="notice_widget_modified_by_you">你修改了 %1$s 挂件</string> <string name="power_level_admin">管理员</string> <string name="power_level_moderator">审核员</string> <string name="power_level_default">默认</string> <string name="power_level_custom">自定义(%1$d)</string> <string name="power_level_custom_no_value">自定义</string> - <string name="notice_power_level_changed_by_you">您更改了%1$s 的权力等级。</string> + <string name="notice_power_level_changed_by_you">你更改了%1$s 的权力等级。</string> <string name="notice_power_level_changed">%1$s 更改了 %2$s 的权力等级。</string> <string name="notice_power_level_diff">%1$s 从 %2$s 到 %3$s</string> - <string name="notice_room_invite_no_invitee_with_reason_by_you">您的邀请。理由:%1$s</string> - <string name="notice_room_invite_with_reason_by_you">您邀请了 %1$s。理由:%2$s</string> - <string name="notice_room_join_with_reason_by_you">您加入了聊天室。理由:%1$s</string> - <string name="notice_room_leave_with_reason_by_you">您离开了聊天室。理由:%1$s</string> - <string name="notice_room_reject_with_reason_by_you">您拒绝了邀请。理由:%1$s</string> - <string name="notice_room_kick_with_reason_by_you">您踢走了 %1$s。理由:%2$s</string> - <string name="notice_room_unban_with_reason_by_you">您解封了 %1$s。理由:%2$s</string> - <string name="notice_room_ban_with_reason_by_you">您封禁了 %1$s。理由:%2$s</string> - <string name="notice_room_third_party_invite_with_reason_by_you">您已发送邀请给 %1$s 来加入聊天室。理由:%2$s</string> - <string name="notice_room_third_party_revoked_invite_with_reason_by_you">您撤销了 %1$s 加入聊天室的邀请。理由:%2$s</string> - <string name="notice_room_third_party_registered_invite_with_reason_by_you">您接受了 %1$s 的邀请。理由:%2$s</string> - <string name="notice_room_withdraw_with_reason_by_you">您撤回了 %1$s 的邀请。理由:%2$s</string> + <string name="notice_room_invite_no_invitee_with_reason_by_you">你的邀请。理由:%1$s</string> + <string name="notice_room_invite_with_reason_by_you">你邀请了 %1$s。理由:%2$s</string> + <string name="notice_room_join_with_reason_by_you">你加入了聊天室。理由:%1$s</string> + <string name="notice_room_leave_with_reason_by_you">你离开了聊天室。理由:%1$s</string> + <string name="notice_room_reject_with_reason_by_you">你拒绝了邀请。理由:%1$s</string> + <string name="notice_room_kick_with_reason_by_you">你踢走了 %1$s。理由:%2$s</string> + <string name="notice_room_unban_with_reason_by_you">你解封了 %1$s。理由:%2$s</string> + <string name="notice_room_ban_with_reason_by_you">你封禁了 %1$s。理由:%2$s</string> + <string name="notice_room_third_party_invite_with_reason_by_you">你已发送邀请给 %1$s 来加入聊天室。理由:%2$s</string> + <string name="notice_room_third_party_revoked_invite_with_reason_by_you">你撤销了 %1$s 加入聊天室的邀请。理由:%2$s</string> + <string name="notice_room_third_party_registered_invite_with_reason_by_you">你接受了 %1$s 的邀请。理由:%2$s</string> + <string name="notice_room_withdraw_with_reason_by_you">你撤回了 %1$s 的邀请。理由:%2$s</string> <plurals name="notice_room_aliases_added_by_you"> - <item quantity="other">您新增了 %1$s 为此聊天室的地址。</item> + <item quantity="other">你新增了 %1$s 为此聊天室的地址。</item> </plurals> <plurals name="notice_room_aliases_removed_by_you"> - <item quantity="other">您移除了此聊天室的 %1$s 地址。</item> + <item quantity="other">你移除了此聊天室的 %1$s 地址。</item> </plurals> - <string name="notice_room_aliases_added_and_removed_by_you">您为此聊天室新增了 %1$s 并移除了 %2$s 地址。</string> - <string name="notice_room_canonical_alias_set_by_you">您将此聊天室的主地址设为了 %1$s。</string> - <string name="notice_room_canonical_alias_unset_by_you">您移除了此聊天室的主地址。</string> - <string name="notice_room_guest_access_can_join_by_you">您已允许访客加入聊天室。</string> - <string name="notice_room_guest_access_forbidden_by_you">您已禁止访客加入聊天室。</string> - <string name="notice_end_to_end_ok_by_you">您已开启端对端加密。</string> - <string name="notice_end_to_end_unknown_algorithm_by_you">您已开启端对端加密(无法识别的算法 %1$s)。</string> - <string name="notice_direct_room_leave_with_reason_by_you">您已离开。理由:%1$s</string> + <string name="notice_room_aliases_added_and_removed_by_you">你为此聊天室新增了 %1$s 并移除了 %2$s 地址。</string> + <string name="notice_room_canonical_alias_set_by_you">你将此聊天室的主要地址设为了 %1$s。</string> + <string name="notice_room_canonical_alias_unset_by_you">你移除了此聊天室的主要地址。</string> + <string name="notice_room_guest_access_can_join_by_you">你已允许访客加入聊天室。</string> + <string name="notice_room_guest_access_forbidden_by_you">你已禁止访客加入聊天室。</string> + <string name="notice_end_to_end_ok_by_you">你已开启端对端加密。</string> + <string name="notice_end_to_end_unknown_algorithm_by_you">你已开启端对端加密(无法识别的算法 %1$s)。</string> + <string name="notice_direct_room_leave_with_reason_by_you">你已离开。理由:%1$s</string> <string name="notice_direct_room_leave_with_reason">%1$s 已离开。理由:%2$s</string> - <string name="notice_direct_room_join_with_reason_by_you">您已加入。理由:%1$s</string> + <string name="notice_direct_room_join_with_reason_by_you">你已加入。理由:%1$s</string> <string name="notice_direct_room_join_with_reason">%1$s 已加入。理由:%2$s</string> - <string name="notice_direct_room_third_party_revoked_invite_by_you">您撤回了对 %1$s 的邀请</string> + <string name="notice_direct_room_third_party_revoked_invite_by_you">你撤回了对 %1$s 的邀请</string> <string name="notice_direct_room_third_party_revoked_invite">%1$s 撤回了对 %2$s 的邀请</string> - <string name="notice_direct_room_third_party_invite_by_you">您邀请了 %1$s</string> + <string name="notice_direct_room_third_party_invite_by_you">你邀请了 %1$s</string> <string name="notice_direct_room_third_party_invite">%1$s 邀请了 %2$s</string> - <string name="notice_direct_room_update_by_you">您在此处升级。</string> + <string name="notice_direct_room_update_by_you">你在此处升级。</string> <string name="notice_direct_room_update">%s 在此处升级。</string> - <string name="notice_made_future_direct_room_visibility_by_you">您使未来的消息对 %1$s 可见</string> + <string name="notice_made_future_direct_room_visibility_by_you">你使未来的消息对 %1$s 可见</string> <string name="notice_made_future_direct_room_visibility">%1$s 使未来的消息对 %2$s 可见</string> - <string name="notice_direct_room_leave_by_you">您离开了聊天室</string> + <string name="notice_direct_room_leave_by_you">你离开了聊天室</string> <string name="notice_direct_room_leave">%1$s 离开了聊天室</string> - <string name="notice_direct_room_join_by_you">您已加入</string> + <string name="notice_direct_room_join_by_you">你已加入</string> <string name="notice_direct_room_join">%1$s 已加入</string> - <string name="notice_direct_room_created_by_you">您创建了讨论</string> + <string name="notice_direct_room_created_by_you">你创建了讨论</string> <string name="notice_direct_room_created">%1$s 创建了讨论</string> <string name="notice_direct_room_guest_access_forbidden_by_you">你已阻止客人加入房间。</string> <string name="notice_direct_room_guest_access_forbidden">%1$s已阻止客人加入房间。</string> @@ -240,12 +240,12 @@ <string name="join">加入</string> <string name="preview">查看</string> <string name="reject">拒绝</string> - <string name="room_preview_invitation_format">%s 邀请您加入这个聊天室</string> + <string name="room_preview_invitation_format">%s 邀请你加入这个聊天室</string> <string name="room_creation_title">新的聊天</string> <string name="room_creation_add_member">添加成员</string> <string name="room_participants_leave_prompt_title">退出聊天室</string> - <string name="room_participants_leave_prompt_msg">您确定要退出聊天室吗?</string> - <string name="room_participants_remove_prompt_msg">您确定要把 %s 从这个聊天中移除吗?</string> + <string name="room_participants_leave_prompt_msg">你确定要退出聊天室吗?</string> + <string name="room_participants_remove_prompt_msg">你确定要把 %s 从这个聊天中移除吗?</string> <string name="room_participants_online">在线</string> <string name="room_participants_offline">离线</string> <string name="room_menu_search">搜索</string> @@ -263,8 +263,8 @@ <string name="action_sign_out">登出</string> <string name="disable">禁用</string> <string name="dialog_title_warning">警告</string> - <string name="send_bug_report_description">请描述您遇到的问题。您做了什么?您期望发生什么?实际上发生了什么?</string> - <string name="send_bug_report_placeholder">在这里描述您的问题</string> + <string name="send_bug_report_description">请描述你遇到的问题。你做了什么?你期望发生什么?实际上发生了什么?</string> + <string name="send_bug_report_placeholder">在这里描述你的问题</string> <string name="send_bug_report_progress">进度(%s%%)</string> <string name="hs_url">主服务器 URL</string> <string name="identity_url">身份服务器 URL</string> @@ -282,7 +282,7 @@ <string name="auth_opt_email_placeholder">电子邮箱地址(可选)</string> <string name="auth_phone_number_placeholder">手机号码</string> <string name="auth_opt_phone_number_placeholder">手机号码(可选)</string> - <string name="auth_repeat_new_password_placeholder">确认您的新密码</string> + <string name="auth_repeat_new_password_placeholder">确认你的新密码</string> <string name="auth_invalid_login_param">用户名和/或密码错误</string> <string name="auth_invalid_user_name">用户名仅可由字母、数字、点、连字符与下划线组成</string> <string name="auth_invalid_password">密码太短(至少 6 位)</string> @@ -298,8 +298,8 @@ <string name="auth_home_server">主服务器:</string> <string name="auth_identity_server">身份服务器:</string> <string name="auth_reset_password_next_step_button">我已验证了我的电子邮箱地址</string> - <string name="auth_reset_password_message">要重置您的密码,请输入与您的账号关联的电子邮箱地址:</string> - <string name="auth_reset_password_missing_email">必须输入与您账号关联的电子邮箱地址。</string> + <string name="auth_reset_password_message">要重置你的密码,请输入与你的账号关联的电子邮箱地址:</string> + <string name="auth_reset_password_missing_email">必须输入与你账号关联的电子邮箱地址。</string> <string name="auth_reset_password_missing_password">必须输入新密码。</string> <string name="login_error_must_start_http">URL 必须以 http[s]:// 开头</string> <string name="login_error_network_error">无法登录:网络错误</string> @@ -353,7 +353,7 @@ <string name="settings_new_password">新密码</string> <string name="settings_confirm_password">确认新密码</string> <string name="settings_fail_to_update_password">密码更新失败</string> - <string name="settings_password_updated">您的密码已更新</string> + <string name="settings_password_updated">你的密码已更新</string> <string name="settings_phone_number_label">手机号码</string> <string name="encryption_information_curve25519_identity_key">Curve25519 认证密钥</string> <string name="encryption_information_algorithm">算法</string> @@ -384,23 +384,23 @@ <string name="option_take_photo_video">拍摄照片或视频</string> <string name="auth_repeat_password_placeholder">重复密码</string> <string name="auth_use_server_options">使用自定义服务器选项(高级)</string> - <string name="auth_email_validation_message">请检查您的电子邮箱以继续注册</string> - <string name="auth_recaptcha_message">此主服务器想确认您不是机器人</string> + <string name="auth_email_validation_message">请检查你的电子邮箱以继续注册</string> + <string name="auth_recaptcha_message">此主服务器想确认你不是机器人</string> <string name="auth_reset_password_email_validation_message">一封电子邮件已发送至 %s。点击了其中的链接后,请点击下面。</string> - <string name="auth_reset_password_error_unauthorized">电子邮箱地址验证失败:请确保您已点击邮件中的链接</string> - <string name="auth_reset_password_success_message">密码已重置。 + <string name="auth_reset_password_error_unauthorized">电子邮箱地址验证失败:请确保你已点击邮件中的链接</string> + <string name="auth_reset_password_success_message">密码已重置。 \n -\n您已经退出所有会话,将不再收到推送通知。要重新启用通知,请在每台设备上重新登录。</string> +\n你已经退出所有会话,将不再收到推送通知。要重新启用通知,请在每台设备上重新登录。</string> <string name="compression_opt_list_original">原始</string> <string name="attachment_remaining_time_seconds">%d 秒</string> <string name="call_connected">通话已连接</string> <string name="call_connecting">通话正在连接…</string> - <string name="template_permissions_rationale_msg_storage">为发送或保存附件,${app_name} 需要权限以访问您的图片和视频库。 + <string name="template_permissions_rationale_msg_storage">为发送或保存附件,${app_name} 需要权限以访问你的图片和视频库。 \n \n请在接下来的弹出窗口中授权允许访问,以便从此设备中发送文件。</string> - <string name="template_permissions_rationale_msg_camera">${app_name} 需要权限来访问您的相机,以拍摄照片或进行视频通话。</string> - <string name="template_permissions_rationale_msg_record_audio">${app_name} 需要权限以访问您的麦克风来进行语音通话。</string> - <string name="room_preview_try_join_an_unknown_room">您试图访问聊天室 %s。您是否愿意加入这个聊天室?</string> + <string name="template_permissions_rationale_msg_camera">${app_name} 需要权限来访问你的相机,以拍摄照片或进行视频通话。</string> + <string name="template_permissions_rationale_msg_record_audio">${app_name} 需要权限以访问你的麦克风来进行语音通话。</string> + <string name="room_preview_try_join_an_unknown_room">你试图访问聊天室 %s。你是否愿意加入这个聊天室?</string> <string name="room_participants_header_admin_tools">管理工具</string> <string name="room_participants_header_direct_chats">私聊</string> <string name="room_participants_header_devices">设备列表</string> @@ -417,7 +417,7 @@ <string name="room_participants_invite_search_another_user">用户 ID,姓名或电子邮箱</string> <string name="room_participants_action_mention">提及</string> <string name="room_participants_action_devices_list">显示设备列表</string> - <string name="room_participants_invite_prompt_msg">您确定要邀请 %s 到这个聊天吗?</string> + <string name="room_participants_invite_prompt_msg">你确定要邀请 %s 到这个聊天吗?</string> <string name="people_search_local_contacts">本地联系人(%d 个)</string> <string name="room_two_users_are_typing">%1$s 和 %2$s 正在输入…</string> <string name="room_many_users_are_typing">%1$s 和 %2$s 及其他人正在输入…</string> @@ -431,7 +431,7 @@ <string name="room_resend_unsent_messages">重新发送未发送的消息</string> <string name="room_delete_unsent_messages">删除未发送的消息</string> <string name="room_message_file_not_found">文件未找到</string> - <string name="room_do_not_have_permission_to_post">您没有发送到这个聊天室的权限</string> + <string name="room_do_not_have_permission_to_post">你没有发送到这个聊天室的权限</string> <string name="ssl_trust">信任</string> <string name="ssl_do_not_trust">不信任</string> <string name="ssl_logout_account">注销</string> @@ -442,7 +442,7 @@ <string name="room_details_settings">设置</string> <string name="room_details_people_invited_group_name">已邀请</string> <string name="room_details_people_present_group_name">已加入</string> - <string name="room_event_action_report_prompt_ignore_user">您要隐藏所有来自这个用户的消息吗? + <string name="room_event_action_report_prompt_ignore_user">你要隐藏所有来自这个用户的消息吗? \n \n注意,此操作会重启应用并将花费一些时间。</string> <string name="room_event_action_cancel_upload">取消上传</string> @@ -472,8 +472,8 @@ <string name="settings_notifications">通知</string> <string name="settings_ignored_users">已忽略的用户</string> <string name="settings_contacts_app_permission">通讯录权限</string> - <string name="devices_delete_dialog_text">这个操作需要额外的身份认证。 -\n请输入您的密码以继续。</string> + <string name="devices_delete_dialog_text">这个操作需要额外的身份认证。 +\n请输入你的密码以继续。</string> <string name="devices_delete_dialog_title">身份认证</string> <string name="settings_old_password">当前密码</string> <string name="settings_unignore_user">是否重新显示所有来自 %s 的消息? @@ -485,7 +485,7 @@ <string name="settings_phone_number_verification">手机验证</string> <string name="settings_phone_number_verification_instruction">我们已经发送了一条含有一个激活码的短信。请在下面输入这个激活码。</string> <string name="settings_phone_number_verification_error_empty_code">输入激活码</string> - <string name="settings_phone_number_verification_error">在验证您的手机号码的时候发生了错误</string> + <string name="settings_phone_number_verification_error">在验证你的手机号码的时候发生了错误</string> <string name="room_settings_room_name">聊天室名称</string> <string name="room_settings_topic">主题</string> <string name="room_settings_directory_visibility">把这个聊天室列在聊天室目录中</string> @@ -505,7 +505,7 @@ <string name="room_settings_addresses_pref_title">地址</string> <string name="room_settings_labs_warning_message">这些是实验性功能,可能会出现不可预料的错误。请谨慎使用。</string> <string name="room_settings_labs_end_to_end">端对端加密</string> - <string name="room_settings_labs_end_to_end_warnings">您需要注销以启用加密。</string> + <string name="room_settings_labs_end_to_end_warnings">你需要注销以启用加密。</string> <string name="room_settings_never_send_to_unverified_devices_summary">对于当前会话,从在不此聊天室中向未验证的设备发送加密消息。</string> <string name="room_settings_addresses_no_local_addresses">这个聊天室没有本地地址</string> <string name="room_settings_addresses_add_new_address">新地址(例如 #foo:matrix.org)</string> @@ -549,22 +549,22 @@ \n请以 %1$s 或 %2$s 的形式加入</string> <string name="ongoing_conference_call_voice">语音</string> <string name="ongoing_conference_call_video">视频</string> - <string name="missing_permissions_to_start_conf_call">您需要在此聊天室中发起会议的权限</string> + <string name="missing_permissions_to_start_conf_call">你需要在此聊天室中发起会议的权限</string> <string name="send_anyway">仍然发送</string> <string name="send_bug_report">问题反馈</string> - <string name="send_bug_report_logs_description">为分析此问题,本客户端的日志将会随此问题反馈发送。本问题反馈,包括日志与截图,将不会被公开显示。若您希望仅发送上面的文字,请取消选择:</string> + <string name="send_bug_report_logs_description">为分析此问题,本客户端的日志将会随此问题反馈发送。本问题反馈,包括日志与截图,将不会被公开显示。若你希望仅发送上面的文字,请取消选择:</string> <string name="send_bug_report_sent">问题反馈发送成功</string> <string name="send_bug_report_failed">问题反馈发送失败(%s)</string> <string name="read_receipt">阅读</string> <string name="auth_invalid_token">无效令牌</string> <string name="auth_threepid_warning_message">在新的 API 出现之前,尚不支持同时使用电子邮件和电话号码注册,所以只有电话号码会被记录。 \n -\n在设置中,您可以在个人资料里添加您的电子邮件。</string> +\n在设置中,你可以在个人资料里添加你的电子邮件。</string> <string name="auth_username_in_use">用户名已被使用</string> <string name="login_error_unable_register_mail_ownership">无法注册:电子邮箱所有权验证失败</string> <string name="login_error_unknown_token">无法识别指定的访问令牌</string> <string name="login_error_bad_json">异常的 JSON</string> - <string name="login_error_login_email_not_yet">您还未点击电子邮件链接</string> + <string name="login_error_login_email_not_yet">你还未点击电子邮件链接</string> <string name="attachment_remaining_time_minutes">%1$d 分钟 %2$d 秒</string> <string name="call_ring">正在呼叫…</string> <string name="incoming_call">呼入的通话</string> @@ -582,19 +582,19 @@ <string name="permissions_rationale_msg_record_audio_explanation">" \n \n请在接下来弹出的窗口中授权允许访问。"</string> - <string name="template_permissions_rationale_msg_camera_and_audio">${app_name} 需要权限以访问您的摄像机和麦克风来进行视频通话。 + <string name="template_permissions_rationale_msg_camera_and_audio">${app_name} 需要权限以访问你的摄像机和麦克风来进行视频通话。 \n \n请在接下来的弹出窗口中授权允许访问,以便进行通话。</string> <string name="permissions_action_not_performed_missing_permissions">对不起。因为权限不足,操作已取消</string> <string name="media_slider_saved_message">保存至下载?</string> <string name="remove">移除</string> <string name="room_preview_unlinked_email_warning">此邀请已发送至未与此账号关联的 %s。 -\n您可能希望用一个不同的账号登录,或者把这个电子邮箱加入到你的账号。</string> +\n你可能希望用一个不同的账号登录,或者把这个电子邮箱加入到你的账号。</string> <string name="room_preview_room_interactions_disabled">这是此聊天室的预览。与聊天室的交互已禁用。</string> <string name="room_participants_header_call">通话</string> - <string name="room_participants_power_level_prompt">您将不能撤销这个修改,因为您正在让这个用户和您拥有相同的特权级别。 -\n您确定吗?</string> - <string name="ssl_cert_not_trust">这可能意味着有人正在恶意劫持您的流量,或者您的手机不信任远程服务器提供的数字证书。</string> + <string name="room_participants_power_level_prompt">你将不能撤销这个修改,因为你正在让这个用户和你拥有相同的特权级别。 +\n你确定吗?</string> + <string name="ssl_cert_not_trust">这可能意味着有人正在恶意劫持你的流量,或者你的手机不信任远程服务器提供的数字证书。</string> <string name="ssl_cert_new_account_expl">如果服务器管理员说这是预期的情况,请确保下面的指纹与管理员提供的指纹相匹配。</string> <string name="room_event_action_report_prompt_reason">报告这个内容的原因</string> <string name="room_recents_directory">目录</string> @@ -611,13 +611,13 @@ <string name="settings_other">其他</string> <string name="settings_notifications_targets">通知目标</string> <string name="settings_logged_in">登录为</string> - <string name="account_email_validation_message">请检查您的电子邮箱并点击里面包含的链接。完成时请点击继续。</string> - <string name="account_email_validation_error">无法验证电子邮箱地址。请检查您的邮件并点击其中的链接。完成后,请点击“继续”。</string> + <string name="account_email_validation_message">请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。</string> + <string name="account_email_validation_error">无法验证电子邮箱地址。请检查你的邮件并点击其中的链接。完成后,请点击“继续”。</string> <string name="account_email_already_used_error">此电子邮箱地址已被使用。</string> <string name="account_email_not_found_error">找不到此电子邮箱地址。</string> <string name="account_phone_number_already_used_error">此手机号码已被使用。</string> - <string name="settings_delete_notification_targets_confirmation">您确认要移除此通知目标吗?</string> - <string name="settings_delete_threepid_confirmation">您确认要移除 %1$s %2$s 吗?</string> + <string name="settings_delete_notification_targets_confirmation">你确认要移除此通知目标吗?</string> + <string name="settings_delete_threepid_confirmation">你确认要移除 %1$s %2$s 吗\?</string> <string name="settings_phone_number_error">无效的已选国家的手机号码</string> <string name="room_settings_room_photo">聊天室图片</string> <string name="room_settings_room_tag">聊天室标签</string> @@ -627,10 +627,10 @@ <string name="room_settings_tag_pref_entry_none">无</string> <string name="room_settings_room_access_warning">要链接一个聊天室,必须有一个地址。</string> <string name="room_settings_never_send_to_unverified_devices_title">仅向已验证的设备发送加密消息</string> - <string name="room_settings_addresses_disable_main_address_prompt_msg">您没有指定此聊天室的主地址。</string> - <string name="room_settings_addresses_disable_main_address_prompt_title">主地址警告</string> - <string name="room_settings_set_main_address">设置为主地址</string> - <string name="room_settings_unset_main_address">取消设置为主地址</string> + <string name="room_settings_addresses_disable_main_address_prompt_msg">你没有指定此聊天室的主要地址。</string> + <string name="room_settings_addresses_disable_main_address_prompt_title">主要地址警告</string> + <string name="room_settings_set_main_address">设置为主要地址</string> + <string name="room_settings_unset_main_address">取消设置为主要地址</string> <string name="room_settings_copy_room_id">复制聊天室 ID</string> <string name="room_settings_copy_room_address">复制聊天室地址</string> <string name="encryption_information_claimed_ed25519_fingerprint_key">声称的 Ed25519 指纹密钥</string> @@ -640,17 +640,17 @@ <string name="encryption_information_unblock">移出黑名单</string> <string name="ok">确认</string> <string name="redact">移除</string> - <string name="send_bug_report_alert_message">您似乎沮丧地摇了摇手机。您想打开问题反馈界面吗?</string> + <string name="send_bug_report_alert_message">你似乎沮丧地摇了摇手机。你想打开问题反馈界面吗?</string> <string name="send_files_in">发送至</string> <string name="read_receipts_list">已读标签清单</string> <string name="compression_options">发送为</string> - <string name="template_permissions_rationale_msg_contacts">${app_name} 可以检查您的通讯录,并基于他们的邮箱地址和电话号码,来查找其他 Matrix 用户。若您同意本应用以此目的访问您的通讯录,请在接下来的弹出窗口中授权允许访问。</string> - <string name="template_permissions_msg_contacts_warning_other_androids">${app_name} 可以检查您的通讯录,并基于他们的邮箱地址和电话号码,来查找其他 Matrix 用户。 + <string name="template_permissions_rationale_msg_contacts">${app_name} 可以检查你的通讯录,并基于他们的邮箱地址和电话号码,来查找其他 Matrix 用户。若你同意本应用以此目的访问你的通讯录,请在接下来的弹出窗口中授权允许访问。</string> + <string name="template_permissions_msg_contacts_warning_other_androids">${app_name} 可以检查你的通讯录,并基于他们的邮箱地址和电话号码,来查找其他 Matrix 用户。 \n -\n您是否同意本应用以此目的访问您的通讯录\?</string> +\n你是否同意本应用以此目的访问你的通讯录\?</string> <string name="room_participants_idle">空闲</string> <string name="people_search_filter_text">仅 Matrix 用户</string> - <string name="ssl_unexpected_existing_expl">证书已从一个先前受您的设备信任的证书更改为另一个。这<b>非常反常</b>!建议您<b>不要接受</b>此新证书。</string> + <string name="ssl_unexpected_existing_expl">证书已从一个先前受你的设备信任的证书更改为另一个。这<b>非常反常</b>!建议你<b>不要接受</b>此新证书。</string> <string name="ssl_expected_existing_expl">证书已从曾受信任的证书更改为不受信任的证书。服务器可能已更新其证书,请联系管理员并核对服务器的指纹。</string> <string name="ssl_only_accept">请仅在服务器管理员发布了与上述指纹匹配的指纹的情况下接受该证书。</string> <string name="room_details_people">成员</string> @@ -675,10 +675,10 @@ <string name="failed_to_load_timeline_position">%s 已尝试在这个聊天室的时间线上加载一个特定的时间点,但无法找到它。</string> <string name="encryption_information_name">公开名称</string> <string name="encryption_information_verify_device_warning">为验证此设备是否可信,请通过其他方式(例如面对面交换或拨打电话)与其拥有者联系,并询问他们该设备的用户设置中的密钥是否与以下密钥匹配:</string> - <string name="encryption_information_verify_device_warning2">如果它们不匹配,您通讯的安全性可能会受到影响。</string> + <string name="encryption_information_verify_device_warning2">如果它们不匹配,你通讯的安全性可能会受到影响。</string> <string name="unknown_devices_alert_message">这个聊天室包含未经验证的未知设备。 \n这意味着无法保证该设备属于其声称的用户。 -\n我们建议您在继续操作之前,先验证每个设备,但如果您愿意也可以不验证而重新发送消息。 +\n我们建议你在继续操作之前,先验证每个设备,但如果你愿意也可以不验证而重新发送消息。 \n \n未知设备:</string> <string name="title_activity_historical">历史消息</string> @@ -701,7 +701,7 @@ <string name="matrix_only_filter">只显示 Matrix 联系人</string> <string name="no_conversation_placeholder">没有对话</string> <string name="no_result_placeholder">没有结果</string> - <string name="template_no_contact_access_placeholder">您没有授予 ${app_name} 访问本地通讯录的权限</string> + <string name="template_no_contact_access_placeholder">你没有授予 ${app_name} 访问本地通讯录的权限</string> <!-- Rooms fragment --> <string name="rooms_header">聊天室</string> <string name="rooms_directory_header">聊天室目录</string> @@ -715,7 +715,7 @@ <string name="select_room_directory">选择一个聊天室目录</string> <string name="directory_server_fail_to_retrieve_server">服务器可能不可用或过载</string> <string name="directory_server_type_homeserver">请输入一个要列出公共聊天室的主服务器</string> - <string name="directory_server_placeholder">主服务器 URL</string> + <string name="directory_server_placeholder">服务器名称</string> <string name="directory_server_all_rooms_on_server">%s 服务器上的所有聊天室</string> <string name="directory_server_native_rooms">所有本地 %s 聊天室</string> <!-- historical --> @@ -727,7 +727,7 @@ <string name="room_recents_join_room_prompt">输入聊天室 ID 或者聊天室别名</string> <string name="room_jump_to_first_unread">跳到第一条未读消息。</string> <string name="settings_home_display">主页显示</string> - <string name="settings_pin_missed_notifications">置顶含有错过的通知的聊天室</string> + <string name="settings_pin_missed_notifications">固定含错过通知的聊天室</string> <string name="settings_pin_unread_messages">置顶含有未读消息的聊天室</string> <string name="settings_user_interface">用户界面</string> <string name="settings_interface_language">语言</string> @@ -758,16 +758,16 @@ <string name="black_theme">黑色主题</string> <string name="settings_notification_ringtone">通知声音</string> <string name="settings_12_24_timestamps">使用12小时制显示时间戳</string> - <string name="widget_no_power_to_manage">您需要权限来管理这个聊天室的挂件</string> + <string name="widget_no_power_to_manage">你需要权限来管理这个聊天室的挂件</string> <string name="widget_creation_failure">创建挂件失败</string> <string name="settings_labs_create_conference_with_jitsi">用 jitsi 创建会议通话</string> - <string name="widget_delete_message_confirmation">您确定要删除这个挂件吗?</string> + <string name="widget_delete_message_confirmation">你确定要删除这个挂件吗?</string> <!-- Widget Integration Manager --> <string name="widget_integration_unable_to_create">无法创建挂件。</string> <string name="widget_integration_failed_to_send_request">发送请求失败。</string> <string name="widget_integration_positive_power_level">特权级别必须是正整数。</string> - <string name="widget_integration_must_be_in_room">您不在这个聊天室。</string> - <string name="widget_integration_no_permission_in_room">您没有在当前聊天室中执行此操作的权限。</string> + <string name="widget_integration_must_be_in_room">你不在这个聊天室。</string> + <string name="widget_integration_no_permission_in_room">你没有在当前聊天室中执行此操作的权限。</string> <string name="widget_integration_missing_room_id">请求中缺失 room_id。</string> <string name="widget_integration_missing_user_id">请求中缺失 user_id。</string> <string name="widget_integration_room_not_visible">聊天室 %s 不可见。</string> @@ -777,8 +777,8 @@ <string name="call">通话</string> <string name="settings_containing_my_display_name">包含我昵称的消息</string> <string name="settings_containing_my_user_name">包含我用户名的消息</string> - <string name="you_added_a_new_device">您添加了一个新设备 “%s”,它正在请求加密密钥。</string> - <string name="your_unverified_device_requesting">您有一台未验证设备 “%s” 正在请求加密密钥。</string> + <string name="you_added_a_new_device">你添加了一个新设备 “%s”,它正在请求加密密钥。</string> + <string name="your_unverified_device_requesting">你有一台未验证设备 “%s” 正在请求加密密钥。</string> <string name="start_verification">开始验证</string> <string name="share_without_verifying">不验证而分享</string> <string name="ignore_request">忽略请求</string> @@ -802,9 +802,9 @@ <string name="loading">正在加载…</string> <string name="action_exit">退出</string> <string name="groups_invite_header">邀请</string> - <string name="start_new_chat_prompt_msg">您确定要与 %s 发起新的聊天吗?</string> - <string name="start_voice_call_prompt_msg">您确定要发起语音通话吗?</string> - <string name="start_video_call_prompt_msg">您确定要发起视频通话吗?</string> + <string name="start_new_chat_prompt_msg">你确定要与 %s 发起新的聊天吗?</string> + <string name="start_voice_call_prompt_msg">你确定要发起语音通话吗?</string> + <string name="start_video_call_prompt_msg">你确定要发起视频通话吗?</string> <string name="room_participants_ban_prompt_msg">封禁踢掉将从聊天室中踢掉他们并阻止他们再次加入。</string> <string name="room_settings_all_messages">全部消息</string> <string name="room_settings_mention_only">只限提及</string> @@ -821,11 +821,11 @@ <string name="rejoin">重新加入</string> <string name="forget_room">忘记聊天室</string> <string name="room_settings_all_messages_noisy">所有消息(响铃)</string> - <string name="title_activity_group_details">社区信息</string> + <string name="title_activity_group_details">社群信息</string> <string name="actions">操作</string> - <string name="bottom_action_groups">社区</string> - <string name="home_filter_placeholder_groups">按社区名称过滤</string> - <string name="groups_header">社区</string> + <string name="bottom_action_groups">社群</string> + <string name="home_filter_placeholder_groups">按社群名称过滤</string> + <string name="groups_header">社群</string> <string name="no_group_placeholder">没有群组</string> <string name="send_bug_report_rage_shake">摇一摇快捷反馈问题</string> <string name="groups_list">群组列表</string> @@ -839,12 +839,12 @@ <plurals name="room_title_members"> <item quantity="other">%d 位成员</item> </plurals> - <string name="room_settings_invalid_group_format_dialog_title">社区 ID 无效</string> - <string name="room_settings_invalid_group_format_dialog_body">“%s” 不是有效的社区 ID</string> + <string name="room_settings_invalid_group_format_dialog_title">社群 ID 无效</string> + <string name="room_settings_invalid_group_format_dialog_body">“%s” 不是有效的社群 ID</string> <plurals name="notification_unread_notified_messages"> <item quantity="other">%d 条未读消息</item> </plurals> - <string name="create_community">创建社区</string> + <string name="create_community">创建社群</string> <string name="list_members">显示成员</string> <string name="open_chat_header">显示顶栏</string> <plurals name="directory_search_rooms"> @@ -860,8 +860,8 @@ <item quantity="other">已启用 %d 个挂件</item> </plurals> <!-- Widget Integration Manager --> - <string name="community_name">社区名称</string> - <string name="community_id">社区 ID</string> + <string name="community_name">社群名称</string> + <string name="community_id">社群 ID</string> <string name="group_details_home">主页</string> <string name="group_details_people">用户</string> <string name="group_details_rooms">聊天室</string> @@ -869,10 +869,10 @@ <string name="no_users_placeholder">没有用户</string> <string name="joined">已加入</string> <string name="invited">已邀请</string> - <string name="filter_group_members">过滤社区成员</string> - <string name="filter_group_rooms">过滤社区聊天室</string> - <string name="has_been_kicked">您已被 %2$s 从 %1$s 中移除</string> - <string name="has_been_banned">您已被 %2$s 从 %1$s 中封禁</string> + <string name="filter_group_members">过滤社群成员</string> + <string name="filter_group_rooms">过滤社群聊天室</string> + <string name="has_been_kicked">你已被 %2$s 从 %1$s 中移除</string> + <string name="has_been_banned">你已被 %2$s 从 %1$s 中封禁</string> <string name="reason_colon">理由:%1$s</string> <string name="avatar">头像</string> <string name="receipt_avatar">已读提示头像</string> @@ -885,14 +885,14 @@ <item quantity="other">%d 条未读消息</item> </plurals> <string name="startup_notification_privacy_title">通知隐私</string> - <string name="template_startup_notification_privacy_message">${app_name} 可以在后台运行以安全隐密地管理您的通知(这可能会影响电池消耗)。</string> + <string name="template_startup_notification_privacy_message">${app_name} 可以在后台运行以安全隐密地管理你的通知(这可能会影响电池消耗)。</string> <string name="startup_notification_privacy_button_grant">获取权限</string> <string name="startup_notification_privacy_button_other">选择其他选项</string> <string name="settings_notification_privacy_fcm">• 通知通过 Firebase Cloud Messaging 发送</string> <string name="settings_notification_privacy_metadata">• 通知只含有元数据</string> <string name="settings_notification_privacy_message_content_not_shown">• 通知<b>不会显示消息内容</b></string> - <string name="room_settings_add_new_group">新的社区 ID(如 +foo:matrix.org)</string> - <string name="group_no_long_description">社区管理员没有提供这个社区的具体描述。</string> + <string name="room_settings_add_new_group">新的社群 ID(如 +foo:matrix.org)</string> + <string name="group_no_long_description">社群管理员没有提供这个社群的具体描述。</string> <string name="settings_notification_privacy_normal">标准</string> <string name="settings_notification_privacy_reduced">低隐私模式</string> <string name="settings_deactivate_account_section">停用账号</string> @@ -902,26 +902,26 @@ <string name="template_settings_opt_in_of_analytics_prompt">请允许资料分析以帮助我们改进 ${app_name}。</string> <string name="settings_opt_in_of_analytics_ok">是的,我愿意帮助!</string> <string name="deactivate_account_title">停用账号</string> - <string name="deactivate_account_content">这将使您的账号永远不再可用。您将无法登录,也不能使用相同的用户 ID 重新注册。您的账号将退出所有已加入的聊天室,您在身份服务器上的账号信息也会被删除。<b>此操作是不可逆的。</b> + <string name="deactivate_account_content">这将使你的账号永远不再可用。你将无法登录,也不能使用相同的用户 ID 重新注册。你的账号将退出所有已加入的聊天室,你在身份服务器上的账号信息也会被删除。<b>此操作是不可逆的。</b> \n -\n停用您的账号<b>不会默认忘记您已发送的消息</b>。如果您希望我们忘记您发送的消息,请勾选下面的选择框。 +\n停用你的账号<b>不会默认忘记你已发送的消息</b>。如果你希望我们忘记你发送的消息,请勾选下面的选择框。 \n -\nMatrix 中的消息可见性类似于电子邮件。我们忘记您的消息意味着您发送的消息不会被发给新注册或未注册的用户,但是已收到您的消息的注册用户依旧可以看到这些消息的副本。</string> +\nMatrix 中的消息可见性类似于电子邮件。我们忘记你的消息意味着你发送的消息不会被发给新注册或未注册的用户,但是已收到你的消息的注册用户依旧可以看到这些消息的副本。</string> <string name="deactivate_account_delete_checkbox">请在我停用账号的同时忘记我发送的所有消息(警告:这将导致未来的用户看到残缺的对话)</string> - <string name="deactivate_account_prompt_password">请输入您的密码以继续:</string> + <string name="deactivate_account_prompt_password">请输入你的密码以继续:</string> <string name="deactivate_account_submit">停用账号</string> <string name="title_activity_choose_sticker">发送贴纸</string> <string name="option_send_sticker">发送贴纸</string> - <string name="no_sticker_application_dialog_content">您目前没有启用任何贴纸包。 + <string name="no_sticker_application_dialog_content">你目前没有启用任何贴纸包。 \n \n要添加一些吗?</string> <string name="settings_notification_privacy_secure_message_content">• 通知中的消息内容<b>直接从 Matrix 主服务器安全地获取</b></string> <string name="settings_notification_privacy_nosecure_message_content">• 通知含有<b>消息与元数据</b></string> - <string name="room_settings_no_flair">此聊天室不会显示任何社区徽章</string> + <string name="room_settings_no_flair">此聊天室不会显示任何社群徽章</string> <string name="widget_integration_missing_parameter">缺少所需的参数。</string> <string name="widget_integration_invalid_parameter">无效参数。</string> <string name="community_id_hint">样例 ID</string> - <string name="dialog_user_consent_content">要想继续使用主服务器 %1$s 您必须阅读并同意其服务条款。</string> + <string name="dialog_user_consent_content">要想继续使用主服务器 %1$s 你必须阅读并同意其服务条款。</string> <string name="dialog_user_consent_submit">现在阅读</string> <string name="dialog_title_third_party_licences">第三方开源协议</string> <string name="download">下载</string> @@ -935,7 +935,7 @@ <string name="template_e2e_re_request_encryption_key_dialog_content">请在其他可解密此消息的设备上启动 ${app_name},以便其将密钥发送至当前设备。</string> <string name="lock_screen_hint">在此输入…</string> <string name="settings_labs_enable_send_voice">发送语音消息</string> - <string name="error_empty_field_your_password">请输入您的密码。</string> + <string name="error_empty_field_your_password">请输入你的密码。</string> <string name="speak">发言</string> <string name="send_bug_report_description_in_english">如果可能的话,请使用英文撰写问题描述。</string> <string name="room_message_placeholder_reply_to_encrypted">发送加密回复…</string> @@ -952,14 +952,14 @@ <string name="command_description_part_room">离开聊天室</string> <string name="command_description_topic">设置聊天室主题</string> <string name="command_description_kick_user">按照 ID 踢出用户</string> - <string name="command_description_nick">更改您显示的昵称</string> + <string name="command_description_nick">更改你显示的昵称</string> <string name="command_description_markdown">打开/关闭 markdown</string> <string name="command_description_clear_scalar_token">修复 Matrix Apps 管理</string> <string name="room_tombstone_versioned_description">这个聊天室已经被替换并且不再活跃</string> <string name="room_tombstone_continuation_link">对话在此继续</string> <string name="room_tombstone_continuation_description">这个聊天室是另一个对话的延续</string> <string name="room_tombstone_predecessor_link">点击此处查看更早的消息</string> - <string name="settings_without_flair">您目前不是任何社区的成员。</string> + <string name="settings_without_flair">你目前不是任何社群的成员。</string> <string name="missing_permissions_error">由于缺少权限,此操作无法完成。</string> <plurals name="public_room_nb_users"> <item quantity="other">%d 个用户</item> @@ -993,7 +993,7 @@ <string name="system_alerts_header">系统警告</string> <string name="resource_limit_exceeded_title">超出资源限制</string> <string name="resource_limit_contact_action">联系管理员</string> - <string name="resource_limit_contact_admin">联系您的服务管理员</string> + <string name="resource_limit_contact_admin">联系你的服务管理员</string> <string name="resource_limit_soft_default">本服务器其中一项资源已超出限制,<b>部分用户将无法登录</b>。</string> <string name="resource_limit_hard_default">本服务器其中一项资源已超出限制。</string> <string name="resource_limit_soft_mau"> 本服务器已达到每月活跃用户限制,<b>部分用户将无法登录</b>。</string> @@ -1015,7 +1015,7 @@ <string name="settings_troubleshoot_diagnostic">故障排除诊断</string> <string name="settings_troubleshoot_diagnostic_run_button_title">运行测试</string> <string name="settings_troubleshoot_diagnostic_running_status">正在测试…(%2$d 中的 %1$d)</string> - <string name="settings_troubleshoot_diagnostic_success_status">基本诊断结果正常。若您还是沒有收到通知,请提交错误报告以协助我们调查此问题。</string> + <string name="settings_troubleshoot_diagnostic_success_status">基本诊断结果正常。若你还是沒有收到通知,请提交错误报告以协助我们调查此问题。</string> <string name="settings_troubleshoot_diagnostic_failure_status_with_quickfix">一个或多个测试没有通过,请尝试建议的修复方法。</string> <string name="settings_troubleshoot_diagnostic_failure_status_no_quickfix">一个或多个测试没有通过,请提交错误反馈以协助我们调查此问题。</string> <string name="settings_troubleshoot_test_system_settings_title">系统设置。</string> @@ -1024,8 +1024,8 @@ \n请检查系统设置。</string> <string name="open_settings">打开设置</string> <string name="settings_troubleshoot_test_account_settings_title">账号设置。</string> - <string name="settings_troubleshoot_test_account_settings_success">您的账号已启用通知。</string> - <string name="settings_troubleshoot_test_account_settings_failed">您的账号已禁用通知。 + <string name="settings_troubleshoot_test_account_settings_success">你的账号已启用通知。</string> + <string name="settings_troubleshoot_test_account_settings_failed">你的账号已禁用通知。 \n请检查账号设置。</string> <string name="settings_troubleshoot_test_account_settings_quickfix">启用</string> <string name="settings_troubleshoot_test_device_settings_title">设备设置。</string> @@ -1060,9 +1060,9 @@ <string name="settings_troubleshoot_test_battery_title">电池优化</string> <string name="settings_inline_url_preview_summary">若主服务器支持此功能,在聊天中预览链接内容。</string> <string name="settings_send_typing_notifs">发送正在输入通知</string> - <string name="settings_send_typing_notifs_summary">让聊天室中的其他用户知道您正在输入。</string> + <string name="settings_send_typing_notifs_summary">让聊天室中的其他用户知道你正在输入。</string> <string name="settings_send_markdown">Markdown 格式化</string> - <string name="settings_send_markdown_summary">在消息发出之前使用 Markdown 语法格式化消息。这允许您使用高级的文字格式,例如使用星号显示斜体文字。</string> + <string name="settings_send_markdown_summary">在消息发出之前使用 Markdown 语法格式化消息。这允许你使用高级的文字格式,例如使用星号显示斜体文字。</string> <string name="settings_show_read_receipts">显示已阅回执</string> <string name="settings_show_read_receipts_summary">点击已阅回执以显示所有已经阅读过某条消息的用户。</string> <string name="settings_show_join_leave_messages">显示加入与离开事件</string> @@ -1071,11 +1071,11 @@ <string name="settings_show_avatar_display_name_changes_messages_summary">包括头像与显示名称的变动。</string> <string name="startup_notification_fdroid_battery_optim_title">后台连接</string> <string name="template_startup_notification_fdroid_battery_optim_message">${app_name} 需要保持低影响的后台连接,以便获得可靠的通知。 -\n下一个屏幕中,系统将提示您允许 ${app_name} 始终在后台运行,请点击“允许“。</string> +\n下一个屏幕中,系统将提示你允许 ${app_name} 始终在后台运行,请点击“允许“。</string> <string name="startup_notification_fdroid_battery_optim_button_grant">授予权限</string> - <string name="account_email_error">在验证您的电子邮件地址时发生了一个错误。</string> + <string name="account_email_error">在验证你的电子邮件地址时发生了一个错误。</string> <string name="settings_password">密码</string> - <string name="account_phone_number_error">在验证您的手机号码时发生了一个错误。</string> + <string name="account_phone_number_error">在验证你的手机号码时发生了一个错误。</string> <string name="account_additional_info">额外信息:%s</string> <string name="x_plus">%d+</string> <string name="plus_x">+%d</string> @@ -1088,7 +1088,7 @@ <string name="merged_events_collapse">收起</string> <string name="merged_events_expand">展开</string> <string name="unknown_error">抱歉,发生了一个错误</string> - <string name="error_lazy_loading_not_supported_by_home_server">您的主服务器尚未支持延迟加载聊天室成员,请稍候再试。</string> + <string name="error_lazy_loading_not_supported_by_home_server">你的主服务器尚未支持延迟加载聊天室成员,请稍候再试。</string> <string name="settings_lazy_loading_description">通过仅载入最近聊天中出现的聊天室成员来提升性能。</string> <string name="settings_lazy_loading_title">延迟加载聊天室成员</string> <string name="markdown_has_been_disabled">Markdown 已禁用。</string> @@ -1098,7 +1098,7 @@ <string name="settings_troubleshoot_test_service_restart_success">服务被停止,并已自动重启。</string> <string name="settings_troubleshoot_test_service_restart_failed">服务重启失败</string> <string name="settings_troubleshoot_test_service_boot_success">服务将在设备重启后启动。</string> - <string name="template_settings_troubleshoot_test_service_boot_failed">服务不会在设备重启后启动,在您打开 ${app_name} 一次之前您将不会收到消息通知。</string> + <string name="template_settings_troubleshoot_test_service_boot_failed">服务不会在设备重启后启动,在你打开 ${app_name} 一次之前你将不会收到消息通知。</string> <string name="template_settings_troubleshoot_test_bg_restricted_success">已禁用对 ${app_name} 的后台限制。此测试应使用移动数据(非Wi-Fi)进行。 \n%1$s</string> <string name="template_settings_troubleshoot_test_bg_restricted_failed">已启用对 ${app_name} 的后台限制。 @@ -1116,31 +1116,31 @@ <string name="title_activity_keys_backup_setup">密钥备份</string> <string name="title_activity_keys_backup_restore">使用备份密钥</string> <string name="keys_backup_is_not_finished_please_wait">密钥备份尚未完成,请等待…</string> - <string name="sign_out_bottom_sheet_warning_no_backup">如果您此时登出账号,您将会失去您的已加密消息</string> - <string name="sign_out_bottom_sheet_warning_backing_up">密钥备份进行中。如果您此时登出账号将无法再访问您的已加密消息。</string> - <string name="sign_out_bottom_sheet_warning_backup_not_active">您的所有设备都应当启用安全密钥备份以确保您不会失去您的已加密消息的访问权。</string> + <string name="sign_out_bottom_sheet_warning_no_backup">如果你此时登出账号,你将会失去你的已加密消息</string> + <string name="sign_out_bottom_sheet_warning_backing_up">密钥备份进行中。如果你此时登出账号将无法再访问你的已加密消息。</string> + <string name="sign_out_bottom_sheet_warning_backup_not_active">你的所有设备都应当启用安全密钥备份以确保你不会失去你的已加密消息的访问权。</string> <string name="sign_out_bottom_sheet_dont_want_secure_messages">我不想要我的已加密消息</string> <string name="sign_out_bottom_sheet_backing_up_keys">正在备份密钥…</string> <string name="keys_backup_activate">使用备份密钥</string> <string name="are_you_sure">确定吗?</string> <string name="backup">备份</string> - <string name="sign_out_bottom_sheet_will_lose_secure_messages">如果您在登出账号之前不备份密钥,您将失去您的已加密消息的访问权。</string> + <string name="sign_out_bottom_sheet_will_lose_secure_messages">如果你在登出账号之前不备份密钥,你将失去你的已加密消息的访问权。</string> <string name="stay">留下</string> <string name="skip">跳过</string> <string name="done">完成</string> <string name="abort">中止</string> - <string name="action_sign_out_confirmation_simple">您确定要登出账号吗?</string> + <string name="action_sign_out_confirmation_simple">你确定要登出账号吗?</string> <string name="settings_notification_advanced">高级通知设置</string> <string name="settings_notification_by_event">事件的通知重要程度</string> <string name="settings_troubleshoot_test_bing_settings_title">自定义设置。</string> <string name="settings_troubleshoot_test_bing_settings_success_with_warn">请注意一些消息类型已设置为静音(将会生成一条没有铃声的通知)。</string> - <string name="settings_troubleshoot_test_bing_settings_failed">有些通知已在您的自定义设置中被禁用。</string> + <string name="settings_troubleshoot_test_bing_settings_failed">有些通知已在你的自定义设置中被禁用。</string> <string name="settings_troubleshoot_test_bing_settings_failed_to_load_rules">自定义规则加载失败,请重试。</string> <string name="settings_troubleshoot_test_bing_settings_quickfix">检查设置</string> <string name="template_settings_troubleshoot_test_fcm_failed_too_many_registration">[%1$s] \n此错误不受 ${app_name} 控制,根据 Google 的说法,此错误表示该设备在 FCM 中注册了太多应用。该错误仅在应用程序数量极多的情况下发生,因此不应影响普通用户。</string> <string name="template_settings_troubleshoot_test_fcm_failed_service_not_available">[%1$s] -\n此错误不受 ${app_name} 控制。它的发生可能有几个原因。也许您稍后重试就有效了,您也可以检查一下 Google Play 服务是否被系统设置限制了数据使用,或者您的设备时钟是否正确,或者可能发生在自定义的 ROM 中。</string> +\n此错误不受 ${app_name} 控制。它的发生可能有几个原因。也许你稍后重试就有效了,你也可以检查一下 Google Play 服务是否被系统设置限制了数据使用,或者你的设备时钟是否正确,或者可能发生在自定义的 ROM 中。</string> <string name="template_settings_troubleshoot_test_fcm_failed_account_missing">[%1$s] \n此错误不受 ${app_name} 控制。此设备上没有登录 Google 账号。请打开账号管理器并添加一个 Google 账号。</string> <string name="settings_troubleshoot_test_fcm_failed_account_missing_quick_fix">添加账号</string> @@ -1156,28 +1156,28 @@ <string name="error_empty_field_enter_user_name">请输入一个用户名。</string> <string name="passphrase_empty_error_message">请输入密语</string> <string name="passphrase_passphrase_too_weak">密语太弱了</string> - <string name="template_keys_backup_passphrase_not_empty_error_message">如果您想要 ${app_name} 生成一个恢复密钥,请删除密语。</string> + <string name="template_keys_backup_passphrase_not_empty_error_message">如果你想要 ${app_name} 生成一个恢复密钥,请删除密语。</string> <string name="keys_backup_no_session_error">没有可用的 Matrix 会话</string> <string name="keys_backup_setup_step1_title">永不丢失已加密消息</string> - <string name="keys_backup_setup_step1_description">加密聊天室中的信息会被端对端加密以确保安全。只有您和拥有密钥的接收方可以读取这些信息。 + <string name="keys_backup_setup_step1_description">加密聊天室中的信息会被端对端加密以确保安全。只有你和拥有密钥的接收方可以读取这些信息。 \n -\n安全地备份您的密钥以免丢失信息。</string> +\n安全地备份你的密钥以免丢失信息。</string> <string name="keys_backup_setup">开始使用备份密钥</string> <string name="keys_backup_setup_step1_advanced">(高级)</string> <string name="keys_backup_setup_step1_manual_export">手动导出密钥</string> - <string name="keys_backup_setup_step2_text_title">使用密语保护您的备份。</string> - <string name="keys_backup_setup_step2_text_description">我们将会在主服务器上为您的密钥保存一份加密拷贝。设置一个密语来保护您的备份的安全。 + <string name="keys_backup_setup_step2_text_title">使用密语保护你的备份。</string> + <string name="keys_backup_setup_step2_text_description">我们将会在主服务器上为你的密钥保存一份加密拷贝。设置一个密语来保护你的备份的安全。 \n -\n为了最大的安全性,此密语应当与您的账号密码不同。</string> +\n为了最大的安全性,此密语应当与你的账号密码不同。</string> <string name="keys_backup_setup_step2_button_title">设置密语</string> <string name="keys_backup_setup_creating_backup">正在创建备份</string> - <string name="keys_backup_setup_step1_recovery_key_alternative">或者用一个恢复密钥来保护您的备份,将其保存到另一个安全的地方。</string> + <string name="keys_backup_setup_step1_recovery_key_alternative">或者用一个恢复密钥来保护你的备份,将其保存到另一个安全的地方。</string> <string name="keys_backup_setup_step2_skip_button_title">(高级)设置一个恢复密钥</string> <string name="keys_backup_setup_step3_success_title">成功!</string> - <string name="keys_backup_setup_step3_text_line1">正在备份您的密钥。</string> - <string name="keys_backup_setup_step3_text_line2">您的恢复密钥是一张安全网——如果您忘记了密语,您可以利用它重获您的已加密消息的访问权。 -\n请将您的恢复密钥保存在一个非常安全的地方,比如密码管理器中(或保险箱里)</string> - <string name="keys_backup_setup_step3_text_line2_no_passphrase">将您的恢复密钥保存在一个非常安全的地方,比如密码管理器中(或保险箱里)</string> + <string name="keys_backup_setup_step3_text_line1">正在备份你的密钥。</string> + <string name="keys_backup_setup_step3_text_line2">你的恢复密钥是一张安全网——如果你忘记了密语,你可以利用它重获你的已加密消息的访问权。 +\n请将你的恢复密钥保存在一个非常安全的地方,比如密码管理器中(或保险箱里)</string> + <string name="keys_backup_setup_step3_text_line2_no_passphrase">将你的恢复密钥保存在一个非常安全的地方,比如密码管理器中(或保险箱里)</string> <string name="keys_backup_setup_step3_button_title">完成</string> <string name="keys_backup_setup_step3_button_title_no_passphrase">我已经制作了一份拷贝</string> <string name="keys_backup_setup_step3_copy_button_title">保存恢复密钥</string> @@ -1192,26 +1192,26 @@ <string name="recovery_key">恢复密钥</string> <string name="unexpected_error">意外错误</string> <string name="keys_backup_setup_backup_started_title">备份开始</string> - <string name="keys_backup_setup_backup_started_message">您的加密密钥正在后台被备份到您的主服务器上。初始备份可能花费几分钟。</string> - <string name="keys_backup_setup_skip_title">您确定吗?</string> - <string name="keys_backup_setup_skip_msg">如果您登出账号或者丢失此设备,您可能再也无法访问您的信息。</string> + <string name="keys_backup_setup_backup_started_message">你的加密密钥正在后台被备份到你的主服务器上。初始备份可能花费几分钟。</string> + <string name="keys_backup_setup_skip_title">你确定吗?</string> + <string name="keys_backup_setup_skip_msg">如果你登出账号或者丢失此设备,你可能再也无法访问你的信息。</string> <string name="keys_backup_restore_is_getting_backup_version">正在获取备份的版本 …</string> - <string name="keys_backup_restore_with_passphrase">使用恢复密语解锁您的已加密历史消息</string> - <string name="keys_backup_restore_use_recovery_key">使用您的恢复密钥</string> - <string name="keys_backup_restore_with_passphrase_helper_with_link">如果不知道您的恢复密语,您可以 %s。</string> - <string name="keys_backup_restore_with_recovery_key">使用恢复密钥解锁您的已加密历史消息</string> + <string name="keys_backup_restore_with_passphrase">使用恢复密语解锁你的已加密历史消息</string> + <string name="keys_backup_restore_use_recovery_key">使用你的恢复密钥</string> + <string name="keys_backup_restore_with_passphrase_helper_with_link">如果不知道你的恢复密语,你可以 %s。</string> + <string name="keys_backup_restore_with_recovery_key">使用恢复密钥解锁你的已加密历史消息</string> <string name="keys_backup_restore_key_enter_hint">输入恢复密钥</string> <string name="keys_backup_restore_setup_recovery_key">消息恢复</string> - <string name="keys_backup_restore_with_key_helper">丢失了恢复密钥?您可以在设置中新建一个。</string> - <string name="keys_backup_passphrase_error_decrypt">无法使用此密语解密备份:请检查您输入的恢复密语是否正确。</string> - <string name="network_error_please_check_and_retry">网络错误:请检查您的网络连接并重试。</string> + <string name="keys_backup_restore_with_key_helper">丢失了恢复密钥?你可以在设置中新建一个。</string> + <string name="keys_backup_passphrase_error_decrypt">无法使用此密语解密备份:请检查你输入的恢复密语是否正确。</string> + <string name="network_error_please_check_and_retry">网络错误:请检查你的网络连接并重试。</string> <string name="keys_backup_restoring_waiting_message">正在恢复备份:</string> <string name="keys_backup_restoring_computing_key_waiting_message">正在计算恢复密钥…</string> <string name="keys_backup_restoring_downloading_backup_waiting_message">正在下载密钥…</string> <string name="keys_backup_restoring_importing_keys_waiting_message">正在导入密钥…</string> <string name="keys_backup_unlock_button">解锁历史</string> <string name="keys_backup_recovery_code_empty_error_message">请输入恢复密钥</string> - <string name="keys_backup_recovery_code_error_decrypt">无法使用此恢复密钥解密备份:请检查您输入的恢复密钥是否正确。</string> + <string name="keys_backup_recovery_code_error_decrypt">无法使用此恢复密钥解密备份:请检查你输入的恢复密钥是否正确。</string> <string name="keys_backup_restore_success_title">备份已恢复 %s !</string> <plurals name="keys_backup_restore_success_description_part1"> <item quantity="other">恢复了一个包含 %d 个密钥的备份。</item> @@ -1225,7 +1225,7 @@ <string name="keys_backup_settings_delete_backup_button">删除备份</string> <string name="keys_backup_settings_status_ok">已为此设备正确设置密钥备份。</string> <string name="keys_backup_settings_status_ko">密钥备份在此设备上未激活。</string> - <string name="keys_backup_settings_status_not_setup">您的密钥未从此设备备份。</string> + <string name="keys_backup_settings_status_not_setup">你的密钥未从此设备备份。</string> <string name="keys_backup_settings_signature_from_unknown_device">备份含有一个来自 ID 为 %s 的未知设备的签名。</string> <string name="keys_backup_settings_valid_signature_from_this_device">备份具有此设备的有效签名。</string> <string name="keys_backup_settings_valid_signature_from_verified_device">备份具有已验证设备 %s 的有效签名。</string> @@ -1237,11 +1237,11 @@ <string name="keys_backup_settings_deleting_backup">正在删除备份…</string> <string name="keys_backup_settings_delete_backup_error">备份(%s)删除失败</string> <string name="keys_backup_settings_delete_confirm_title">删除备份</string> - <string name="keys_backup_settings_delete_confirm_message">要从此服务器中删除您备份的加密密钥吗?您将无法再使用恢复密钥来读取加密的历史消息。</string> + <string name="keys_backup_settings_delete_confirm_message">要从此服务器中删除你备份的加密密钥吗?你将无法再使用恢复密钥来读取加密的历史消息。</string> <string name="new_recovery_method_popup_title">备份新密钥</string> <string name="new_recovery_method_popup_description">已检测到新的安全消息密钥备份。 \n -\n如果您并未设置新的恢复方法,可能是有攻击者试图侵入您的账号。请立即更改您的账号密码并在设置中设定一个新的恢复方法。</string> +\n如果你并未设置新的恢复方法,可能是有攻击者试图侵入你的账号。请立即更改你的账号密码并在设置中设定一个新的恢复方法。</string> <string name="new_recovery_method_popup_was_me">那是我</string> <string name="keys_backup_banner_setup_line1">永不丢失已加密消息</string> <string name="keys_backup_banner_setup_line2">开始使用备份密钥</string> @@ -1260,7 +1260,7 @@ <string name="ignore">忽略</string> <string name="auth_login_sso">以单点登录方式登录</string> <string name="login_error_unknown_host">无法连接到此 URL,请检查</string> - <string name="login_error_ssl_handshake">您的设备使用了过时的 TLS 安全协议,容易受到攻击,为保证安全,您将无法进行连接</string> + <string name="login_error_ssl_handshake">你的设备使用了过时的 TLS 安全协议,容易受到攻击,为保证安全,你将无法进行连接</string> <string name="settings_send_message_with_enter">按回车发送消息</string> <string name="settings_send_message_with_enter_summary">软键盘的 Enter 按钮将发送消息而不是添加换行符</string> <string name="settings_change_password_submit">密码更新</string> @@ -1268,7 +1268,7 @@ <string name="passwords_do_not_match">密码不匹配</string> <string name="autodiscover_invalid_response">无效的主服务器探测响应</string> <string name="autodiscover_well_known_autofill_dialog_title">自动完成服务器选项</string> - <string name="template_autodiscover_well_known_autofill_dialog_message">${app_name} 侦测到您的 userId 域名 \"%1$s\" 有自定义的服务器设置: + <string name="template_autodiscover_well_known_autofill_dialog_message">${app_name} 侦测到你的 userId 域名 \"%1$s\" 有自定义的服务器设置: \n%2$s</string> <string name="autodiscover_well_known_autofill_confirm">使用设置</string> <string name="notification_sync_init">正在初始化服务</string> @@ -1298,11 +1298,11 @@ <string name="you_added_a_new_device_with_info">一个新设备正在请求加密密钥。 \n设备名称:%1$s \n最近上线于:%2$s -\n若您未曾在另一个设备上登录,请忽略此请求。</string> +\n若你未曾在另一个设备上登录,请忽略此请求。</string> <string name="your_unverified_device_requesting_with_info">一个未验证的设备正在请求加密密钥。 \n设备名称:%1$s \n最近上线于:%2$s -\n若您未曾在另一个设备上登录,请忽略此请求。</string> +\n若你未曾在另一个设备上登录,请忽略此请求。</string> <string name="start_verification_short_label">验证</string> <string name="share_without_verifying_short_label">分享</string> <string name="key_share_request">密钥分享请求</string> @@ -1311,13 +1311,13 @@ <string name="keys_backup_setup_override_stop">终止</string> <string name="keys_backup_settings_checking_backup_state">正在检查备份状态</string> <string name="sas_verify_title">通过对比一段简短的文本字符串来验证设备。</string> - <string name="sas_security_advise">为保证尽可能高的安全性,我们建议您与对方当面交换,或使用另一种可信任的通讯方式。</string> + <string name="sas_security_advise">为保证尽可能高的安全性,我们建议你与对方当面交换,或使用另一种可信任的通讯方式。</string> <string name="sas_verify_start_button_title">开始验证</string> <string name="sas_incoming_request_title">传入的验证请求</string> <string name="sas_view_request_action">查看请求</string> <string name="sas_waiting_for_partner">正在等待对方确认…</string> <string name="sas_verified">已验证!</string> - <string name="sas_verified_successful">您已成功验证此设备。</string> + <string name="sas_verified_successful">你已成功验证此设备。</string> <string name="sas_got_it">了解了</string> <string name="sas_verifying_keys">什么都没有出现?并非所有的客户端都已支持交互式验证。使用旧版验证吧。</string> <string name="sas_legacy_verification_button_title">使用旧版验证。</string> @@ -1325,12 +1325,12 @@ <string name="sas_cancelled_dialog_title">请求已取消</string> <string name="sas_verification_request_notification_channel">交互式设备验证</string> <string name="sas_incoming_request_notif_title">验证请求</string> - <string name="sas_incoming_request_notif_content">%s 想验证您的装置</string> + <string name="sas_incoming_request_notif_content">%s 想验证你的装置</string> <string name="sas_error_unknown">未知错误</string> <string name="edit">编辑</string> <string name="reply">回复</string> <string name="global_retry">重试</string> - <string name="send_you_invite">向您发送邀请</string> + <string name="send_you_invite">向你发送邀请</string> <string name="invited_by">由 %s 邀请</string> <string name="room_list_catchup_welcome_title">欢迎回家!</string> <string name="room_list_people_empty_title">对话</string> @@ -1345,7 +1345,7 @@ <string name="create_new_room">创建新聊天室</string> <string name="action_change">修改</string> <string name="please_wait">请稍候…</string> - <string name="group_all_communities">所有社区</string> + <string name="group_all_communities">所有社群</string> <string name="room_preview_no_preview">无法预览此聊天室</string> <string name="fab_menu_create_room">聊天室</string> <string name="create_room_action_create">创建</string> @@ -1355,7 +1355,7 @@ <string name="quick_reactions">快捷响应</string> <string name="settings_general_title">通用</string> <string name="settings_preferences">选项</string> - <string name="settings_security_and_privacy">安全与隐私</string> + <string name="settings_security_and_privacy">隐私安全</string> <string name="settings_expert">高级</string> <string name="settings_push_rules">推送规则</string> <string name="settings_push_rules_no_rules">尚未定义任何推送规则</string> @@ -1376,15 +1376,15 @@ <string name="decline">拒绝</string> <string name="people_no_identity_server">没有设置身份服务器。</string> <string name="call_failed_no_ice_title">服务器的错误配置导致通话失败</string> - <string name="call_failed_no_ice_description">请要求您的主服务器 (%1$s) 的管理员配置 TURN 服务器,以使通话可靠地工作。 + <string name="call_failed_no_ice_description">请要求你的主服务器 (%1$s) 的管理员配置 TURN 服务器,以使通话可靠地工作。 \n -\n或者,您可以尝试使用 %2$s 的公共服务器,但这将不那么可靠,并且它将与该服务器共享您的 IP 地址。您也可以在“设置”中进行管理。</string> +\n或者,你可以尝试使用 %2$s 的公共服务器,但这将不那么可靠,并且它将与该服务器共享你的 IP 地址。你也可以在“设置”中进行管理。</string> <string name="call_failed_no_ice_use_alt">尝试使用 %s</string> <string name="call_failed_dont_ask_again">不要再问我</string> - <string name="auth_add_email_message_2">设置用于恢复账号的电子邮件,然后就可以让认识您的人选择性探索到您。</string> - <string name="auth_add_phone_message_2">设定电话,然后就可以让认识您的人选择性探索到您。</string> - <string name="auth_add_email_phone_message_2">设定电子邮件以供恢复账号。然后就可以让认识您的人用电子邮件或电话选择性探索到您。</string> - <string name="auth_add_email_and_phone_message_2">设定电子邮件以供恢复账号。然后就可以让认识您的人用电子邮件或电话选择性探索到您。</string> + <string name="auth_add_email_message_2">设置用于恢复账号的电子邮件,然后就可以让认识你的人选择性探索到你。</string> + <string name="auth_add_phone_message_2">设定电话,然后就可以让认识你的人选择性探索到你。</string> + <string name="auth_add_email_phone_message_2">设定电子邮件以供恢复账号。然后就可以让认识你的人用电子邮件或电话选择性探索到你。</string> + <string name="auth_add_email_and_phone_message_2">设定电子邮件以供恢复账号。然后就可以让认识你的人用电子邮件或电话选择性探索到你。</string> <string name="login_error_no_homeserver_found">這不是有效的 Matrix 服务器位置</string> <string name="login_error_homeserver_not_found">无法在此 URL 找到主服务器,请检查</string> <string name="settings_call_ringtone_use_default_stun">允许后备呼叫协助服务器</string> @@ -1396,7 +1396,7 @@ <string name="bottom_action_notification">通知</string> <string name="template_call_failed_no_connection">${app_name} 呼叫失败</string> <string name="call_failed_no_connection_description">无法建立实时连接。 -\n请要求您的主服务器管理员配置 TURN 服务器以使通话可靠工作。</string> +\n请要求你的主服务器管理员配置 TURN 服务器以使通话可靠工作。</string> <string name="call_select_sound_device">选择声音设备</string> <string name="sound_device_phone">电话</string> <string name="sound_device_speaker">扬声器</string> @@ -1409,60 +1409,60 @@ <string name="call_format_turn_hd_on">打开 HD</string> <string name="login_error_ssl_peer_unverified">SSL 错误:尚未验证对等端身份。</string> <string name="login_error_ssl_other">SSL 错误。</string> - <string name="settings_call_ringtone_use_default_stun_sum">当您的主服务器未提供时将使用 %s 作为辅助(在通话时将分享您的 IP 地址)</string> + <string name="settings_call_ringtone_use_default_stun_sum">当你的主服务器未提供时将使用 %s 作为辅助(在通话时将分享你的 IP 地址)</string> <string name="active_call_with_duration">活动通话 (%s)</string> <string name="return_to_call">返回通话</string> - <string name="invite_no_identity_server_error">在您的设置中添加身份服务器以执行此操作。</string> + <string name="invite_no_identity_server_error">在你的设置中添加身份服务器以执行此操作。</string> <string name="room_participants_action_cancel_invite">取消邀请</string> - <string name="room_participants_power_level_demote_warning_title">降低您自己的级别?</string> - <string name="room_participants_power_level_demote_warning_prompt">您家无法撤销此操作因为您正在降低您的级别,如果您是聊天室中最后一个特权用户将无法恢复特权。</string> + <string name="room_participants_power_level_demote_warning_title">降低你自己的级别?</string> + <string name="room_participants_power_level_demote_warning_prompt">你家无法撤销此操作因为你正在降低你的级别,如果你是聊天室中最后一个特权用户将无法恢复特权。</string> <string name="room_participants_power_level_demote">降级</string> <string name="room_participants_action_ignore_title">忽略用户</string> - <string name="room_participants_action_ignore_prompt_msg">忽略此用户将从您共享的聊天室移除他们的消息。 + <string name="room_participants_action_ignore_prompt_msg">忽略此用户将从你共享的聊天室移除他们的消息。 \n -\n您随时可以在通用设置中反转此操作。</string> +\n你随时可以在通用设置中反转此操作。</string> <string name="room_participants_action_unignore_title">取消忽略用户</string> <string name="room_participants_action_unignore_prompt_msg">取消忽略此用户将重新显示来自他们的全部消息。</string> <string name="room_participants_action_cancel_invite_title">取消邀请</string> - <string name="room_participants_action_cancel_invite_prompt_msg">您确定想要取消邀请此用户吗?</string> + <string name="room_participants_action_cancel_invite_prompt_msg">你确定想要取消邀请此用户吗?</string> <string name="room_participants_kick_title">踢掉用户</string> <string name="room_participants_kick_reason">踢掉理由</string> <string name="room_participants_kick_prompt_msg">踢掉用户将从此聊天室移除他们。 \n -\n为防止他们再次加入,您应当封禁他们。</string> +\n为防止他们再次加入,你应当封禁他们。</string> <string name="room_participants_ban_title">封禁用户</string> <string name="room_participants_ban_reason">封禁理由</string> <string name="room_participants_unban_title">取消封禁用户</string> <string name="room_participants_unban_prompt_msg">取消封禁用户将允许他们再次加入聊天室。</string> - <string name="settings_add_3pid_confirm_password_title">确认您的密码</string> - <string name="template_settings_add_3pid_flow_not_supported">您无法在 ${app_name} 移动版中这么做</string> + <string name="settings_add_3pid_confirm_password_title">确认你的密码</string> + <string name="template_settings_add_3pid_flow_not_supported">你无法在 ${app_name} 移动版中这么做</string> <string name="settings_add_3pid_authentication_needed">需要身份认证</string> <string name="settings_background_fdroid_sync_mode">后台同步模式</string> <string name="settings_background_fdroid_sync_mode_battery">电池优化</string> <string name="template_settings_background_fdroid_sync_mode_battery_description">${app_name} 将在后台以保留设备有限资源(电池)的方式同步。 -\n取决于您的设备资源状态,同步可能被操作系统推迟。</string> +\n取决于你的设备资源状态,同步可能被操作系统推迟。</string> <string name="settings_background_fdroid_sync_mode_real_time">实时优化</string> <string name="template_settings_background_fdroid_sync_mode_real_time_description">${app_name} 将在后台定期准时同步(可配置)。 \n这将影响网络和电池的使用,将显示一个永久通知表明 ${app_name} 正在监听事件。</string> <string name="settings_background_fdroid_sync_mode_disabled">无后台同步</string> - <string name="settings_background_fdroid_sync_mode_disabled_description">应用在后台时您不会收到消息通知。</string> + <string name="settings_background_fdroid_sync_mode_disabled_description">应用在后台时你不会收到消息通知。</string> <string name="settings_background_sync_update_error">更新设置失败。</string> <string name="settings_set_workmanager_delay">偏好同步间隔</string> <string name="settings_set_workmanager_delay_summary">%s \n取决于资源(电量)或设备状态(睡眠)同步可能会延迟。</string> <string name="settings_integrations">集成</string> <string name="settings_integrations_summary">使用集成管理器管理机器人,桥接,部件和贴纸包。 -\n集成管理器接收配置数据,可以代表您修改部件,发送聊天室邀请及设置特权等级。</string> +\n集成管理器接收配置数据,可以代表你修改部件,发送聊天室邀请及设置特权等级。</string> <string name="settings_secure_backup_section_title">安全备份</string> <string name="settings_secure_backup_manage">管理</string> <string name="settings_secure_backup_setup">设置安全备份</string> <string name="settings_secure_backup_reset">重置安全备份</string> <string name="settings_secure_backup_enter_to_setup">在此设备上设置</string> - <string name="settings_secure_backup_section_info">通过在您的服务器上备份加密密钥,防止失去对加密信息和数据的访问。</string> - <string name="reset_secure_backup_title">为您已有的备份生成新的安全密钥或设置新的安全口令。</string> - <string name="reset_secure_backup_warning">这将替换您的当前密钥或短语。</string> + <string name="settings_secure_backup_section_info">通过在你的服务器上备份加密密钥,防止失去对加密信息和数据的访问。</string> + <string name="reset_secure_backup_title">为你已有的备份生成新的安全密钥或设置新的安全口令。</string> + <string name="reset_secure_backup_warning">这将替换你的当前密钥或短语。</string> <string name="settings_discovery_category">发现</string> - <string name="settings_discovery_manage">管理您的发现设置。</string> + <string name="settings_discovery_manage">管理你的发现设置。</string> <string name="settings_integration_allow">允许集成</string> <string name="settings_integration_manager">集成管理器</string> <string name="disabled_integration_dialog_title">集成已禁用</string> @@ -1470,8 +1470,8 @@ <plurals name="room_settings_banned_users_count"> <item quantity="other">%d 个封禁用户</item> </plurals> - <string name="encryption_information_device_name_with_warning">公开名称(对与您通讯的人可见)</string> - <string name="device_name_warning">会话的公开名称对与您通讯的人可见</string> + <string name="encryption_information_device_name_with_warning">公开名称(对与你通讯的人可见)</string> + <string name="device_name_warning">会话的公开名称对与你通讯的人可见</string> <string name="encryption_exported_successfully">成功导出密钥</string> <string name="notification_ticker_text_dm">%1$s: %2$s</string> <string name="notification_ticker_text_group">%1$s: %2$s %3$s</string> @@ -1487,10 +1487,10 @@ <string name="room_widget_reload">重载挂件</string> <string name="room_widget_open_in_browser">在浏览器中打开</string> <string name="room_widget_revoke_access">撤消我的访问权限</string> - <string name="room_widget_permission_display_name">您的昵称</string> - <string name="room_widget_permission_avatar_url">您的头像 URL</string> - <string name="room_widget_permission_user_id">您的用户 ID</string> - <string name="room_widget_permission_theme">您的主题</string> + <string name="room_widget_permission_display_name">你的昵称</string> + <string name="room_widget_permission_avatar_url">你的头像 URL</string> + <string name="room_widget_permission_user_id">你的用户 ID</string> + <string name="room_widget_permission_theme">你的主题</string> <string name="room_widget_permission_widget_id">挂件 ID</string> <string name="room_widget_permission_room_id">聊天室 ID</string> <string name="room_widget_resource_permission_title">挂件想使用以下资源:</string> @@ -1502,17 +1502,17 @@ <string name="integration_manager_not_configured">未配置集成管理器。</string> <string name="widget_integration_review_terms">若要继续请接受服务条款。</string> <string name="recovery_key_export_saved">恢复密钥已保存。</string> - <string name="keys_backup_setup_override_backup_prompt_tile">您的主服务器上已存在备份</string> - <string name="keys_backup_setup_override_backup_prompt_description">您似乎已在另一个会话中设置密钥备份。您想要将其替换为正在创建的吗?</string> + <string name="keys_backup_setup_override_backup_prompt_tile">你的主服务器上已存在备份</string> + <string name="keys_backup_setup_override_backup_prompt_description">你似乎已在另一个会话中设置密钥备份。你想要将其替换为正在创建的吗?</string> <string name="secure_backup_banner_setup_line1">安全备份</string> <string name="secure_backup_banner_setup_line2">保护加密信息及数据的访问权</string> <string name="secure_backup_setup">设置安全备份</string> - <string name="invalid_or_expired_credentials">由于无效或过期的凭据您已登出。</string> - <string name="sas_incoming_request_description">验证此会话以将其标记为可信任。当使用端对端加密消息时,信任参与者的会话可以使您更加安心。</string> - <string name="sas_incoming_request_description_2">验证会话将标记其为可信任,同时将您的会话对对方标记为可信任。</string> + <string name="invalid_or_expired_credentials">由于无效或过期的凭据你已登出。</string> + <string name="sas_incoming_request_description">验证此会话以将其标记为可信任。当使用端对端加密消息时,信任参与者的会话可以使你更加安心。</string> + <string name="sas_incoming_request_description_2">验证会话将标记其为可信任,同时将你的会话对对方标记为可信任。</string> <string name="sas_emoji_description">通过确认以下表情符号出现在对方的屏幕上来验证此会话</string> <string name="sas_decimal_description">通过确认屏幕上对方显示以下数字来验证此会话</string> - <string name="sas_incoming_verification_request_dialog">您收到传入验证请求。</string> + <string name="sas_incoming_verification_request_dialog">你收到传入验证请求。</string> <string name="sas_verified_successful_description">与此用户的安全消息端对端加密,无法被第三方读取。</string> <string name="sas_cancelled_by_other">对方取消了验证。 \n%s</string> @@ -1528,22 +1528,22 @@ <string name="sas_error_m_invalid_message">收到一条无效消息</string> <string name="sas_error_m_key_mismatch">密钥不匹配</string> <string name="sas_error_m_user_error">用户不匹配</string> - <string name="identity_server_not_defined">您未使用身份服务器</string> - <string name="identity_server_not_defined_for_password_reset">未配置身份服务器,需要重置您的密码。</string> - <string name="error_user_already_logged_in">您似乎正在试图连接到另一个主服务器。您想要登出吗?</string> + <string name="identity_server_not_defined">你未使用身份服务器</string> + <string name="identity_server_not_defined_for_password_reset">未配置身份服务器,需要重置你的密码。</string> + <string name="error_user_already_logged_in">你似乎正在试图连接到另一个主服务器。你想要登出吗?</string> <string name="room_list_empty">加入一个聊天室开始使用应用。</string> - <string name="room_list_catchup_empty_title">您已经跟上了!</string> - <string name="room_list_catchup_empty_body">您没有未读消息</string> + <string name="room_list_catchup_empty_title">你已经跟上了!</string> + <string name="room_list_catchup_empty_body">你没有未读消息</string> <string name="room_list_catchup_welcome_body">从这里跟上未读消息</string> - <string name="room_list_people_empty_body">您的私聊消息将显示在此处。点击右下角的 + 开始一些对话。</string> - <string name="room_list_rooms_empty_body">您的聊天室将显示在此处。点击右下角的 + 来找到现有的聊天室或者创建你自己的聊天室。</string> + <string name="room_list_people_empty_body">你的私聊消息将显示在此处。点击右下角的 + 开始一些对话。</string> + <string name="room_list_rooms_empty_body">你的聊天室将显示在此处。点击右下角的 + 来找到现有的聊天室或者创建你自己的聊天室。</string> <string name="event_redacted">消息已删除</string> <string name="settings_show_redacted">显示已移除消息</string> <string name="settings_show_redacted_summary">对已移除消息显示占位符</string> <string name="event_redacted_by_admin_reason">聊天室管理员主持的事件</string> <string name="last_edited_info_message">最后由 %1$s 编辑于 %2$s</string> <string name="malformed_message">格式错误事件,无法显示</string> - <string name="error_no_network">无网络。请检查您的网络连接。</string> + <string name="error_no_network">无网络。请检查你的网络连接。</string> <string name="change_room_directory_network">更改网络</string> <string name="template_room_preview_world_readable_room_not_supported_yet">${app_name} 尚不支持公开聊天室预览</string> <string name="fab_menu_create_chat">私聊消息</string> @@ -1555,11 +1555,11 @@ <string name="keys_backup_unable_to_get_keys_backup_data">获取密钥备份数据时发生错误</string> <string name="import_e2e_keys_from_file">从文件 \"%1$s\" 导入端对端密钥。</string> <string name="settings_other_third_party_notices">其他第三方通知</string> - <string name="navigate_to_room_when_already_in_the_room">您已经在查看此聊天室!</string> + <string name="navigate_to_room_when_already_in_the_room">你已经在查看此聊天室!</string> <string name="settings_troubleshoot_test_token_registration_quick_fix">注册令牌</string> <string name="send_suggestion">提出建议</string> - <string name="send_suggestion_content">请在下方写下您的建议。</string> - <string name="send_suggestion_report_placeholder">请在此描述您的建议</string> + <string name="send_suggestion_content">请在下方写下你的建议。</string> + <string name="send_suggestion_report_placeholder">请在此描述你的建议</string> <string name="send_suggestion_sent">谢谢,建议已成功发送</string> <string name="send_suggestion_failed">建议发送失败 (%s)</string> <string name="settings_labs_show_hidden_events_in_timeline">在时间线上显示隐藏事件</string> @@ -1574,7 +1574,7 @@ <string name="message_edits">消息编辑</string> <string name="no_message_edits_found">未找到编辑</string> <string name="room_filtering_filter_hint">过滤对话…</string> - <string name="room_filtering_footer_title">找不到您要找的?</string> + <string name="room_filtering_footer_title">找不到你要找的?</string> <string name="room_filtering_footer_create_new_room">创建新聊天室</string> <string name="room_filtering_footer_create_new_direct_message">发送新私聊消息</string> <string name="room_filtering_footer_open_room_directory">查看聊天室目录</string> @@ -1598,28 +1598,28 @@ <string name="disconnect_identity_server">断开身份服务器</string> <string name="add_identity_server">配置身份服务器</string> <string name="change_identity_server">更改身份服务器</string> - <string name="settings_discovery_identity_server_info">您正在使用 %1$s 与您知道的现有联系人相互发现。</string> - <string name="settings_discovery_identity_server_info_none">您当前未使用身份服务器。若要与您知道的现有联系人相互发现,请在下方配置。</string> + <string name="settings_discovery_identity_server_info">你正在使用 %1$s 与你知道的现有联系人相互发现。</string> + <string name="settings_discovery_identity_server_info_none">你当前未使用身份服务器。若要与你知道的现有联系人相互发现,请在下方配置。</string> <string name="settings_discovery_emails_title">可发现电子邮件地址</string> - <string name="settings_discovery_no_mails">发现选项将在您添加电子邮件后出现。</string> - <string name="settings_discovery_no_msisdn">发现选项将在您添加电话号码后出现。</string> - <string name="settings_discovery_disconnect_identity_server_info">与您的身份服务器断开意味着您将无法被其它用户发现并且无法通过电子邮件和电话邀请他人。</string> + <string name="settings_discovery_no_mails">发现选项将在你添加电子邮件后出现。</string> + <string name="settings_discovery_no_msisdn">发现选项将在你添加电话号码后出现。</string> + <string name="settings_discovery_disconnect_identity_server_info">与你的身份服务器断开意味着你将无法被其它用户发现并且无法通过电子邮件和电话邀请他人。</string> <string name="settings_discovery_msisdn_title">可发现电话号码</string> - <string name="settings_discovery_confirm_mail">我们向 %s 给您发送了确认电子邮件,检查您的电子邮件并点击确认链接</string> - <string name="settings_discovery_confirm_mail_not_clicked">我们向 %s 给您发送了确认电子邮件,请先检查您的电子邮件并点击确认链接</string> + <string name="settings_discovery_confirm_mail">我们向 %s 给你发送了确认电子邮件,检查你的电子邮件并点击确认链接</string> + <string name="settings_discovery_confirm_mail_not_clicked">我们向 %s 给你发送了确认电子邮件,请先检查你的电子邮件并点击确认链接</string> <string name="settings_discovery_mail_pending">正在等待</string> <string name="settings_discovery_enter_identity_server">输入身份服务器 URL</string> <string name="settings_discovery_bad_identity_server">无法连接到身份服务器</string> <string name="settings_discovery_please_enter_server">请输入身份服务器 url</string> <string name="settings_discovery_no_terms_title">身份服务器无服务条款</string> - <string name="settings_discovery_no_terms">您选择的身份服务器无任何服务条款。仅在您信任服务所有者时继续</string> + <string name="settings_discovery_no_terms">你选择的身份服务器无任何服务条款。仅在你信任服务所有者时继续</string> <string name="settings_text_message_sent">已向 %s 发送文字消息。请输入它包含的验证码。</string> <string name="settings_text_message_sent_wrong_code">验证码不正确。</string> - <string name="settings_discovery_disconnect_with_bound_pid">您当前在身份服务器 %1$s 上分享电子邮件地址或电话号码。您需要重连接 %2$s 已停止分享。</string> - <string name="settings_agree_to_terms">同意身份服务器 (%s) 服务条款使您可以通过电子邮件地址或电话号码被发现。</string> + <string name="settings_discovery_disconnect_with_bound_pid">你当前在身份服务器 %1$s 上分享电子邮件地址或电话号码。你需要重连接 %2$s 已停止分享。</string> + <string name="settings_agree_to_terms">同意身份服务器 (%s) 服务条款使你可以通过电子邮件地址或电话号码被发现。</string> <string name="labs_allow_extended_logging">启用详细日志。</string> - <string name="labs_allow_extended_logging_summary">当您发送 RageShake 时详细日志将帮助开发者提供更多日志。即使启用,应用也不会记录消息内容或任何其他私有数据。</string> - <string name="error_terms_not_accepted">接收您的主服务器条款和条件后请重试。</string> + <string name="labs_allow_extended_logging_summary">当你发送 RageShake 时详细日志将帮助开发者提供更多日志。即使启用,应用也不会记录消息内容或任何其他私有数据。</string> + <string name="error_terms_not_accepted">接收你的主服务器条款和条件后请重试。</string> <string name="error_network_timeout">服务器似乎响应时间太长,这可能是由于连接不良或服务器错误引起的。 请稍后再试。</string> <string name="send_attachment">发送附件</string> <string name="a11y_open_drawer">打开导航菜单</string> @@ -1659,20 +1659,20 @@ <string name="report_content_custom_submit">报告</string> <string name="block_user">忽略用户</string> <string name="content_reported_title">内容已报告</string> - <string name="content_reported_content">此内容已报告。 -\n -\n如果您不希望再看到此用户的更多内容,您可以忽略他们以隐藏他们的信息。</string> - <string name="content_reported_as_spam_title">报告为垃圾信息</string> - <string name="content_reported_as_spam_content">此内容已报告为垃圾信息。 -\n -\n如果您不希望再看到此用户的更多内容,您可以忽略他们以隐藏他们的信息。</string> - <string name="content_reported_as_inappropriate_title">报告为不合适的内容</string> - <string name="content_reported_as_inappropriate_content">此内容已报告为不合适。 -\n -\n如果您不希望再看到此用户的更多内容,您可以忽略他们以隐藏他们的消息。</string> - <string name="template_permissions_rationale_msg_keys_backup_export">${app_name} 需要权限以在磁盘上保存您的端对端密钥。 + <string name="content_reported_content">此内容已报告。 \n -\n请在接下来的弹出窗口中授权允许访问,以便您手动导出密钥。</string> +\n如果你不希望再看到此用户的更多内容,你可以忽略他们以隐藏他们的信息。</string> + <string name="content_reported_as_spam_title">报告为垃圾信息</string> + <string name="content_reported_as_spam_content">此内容已报告为垃圾信息。 +\n +\n如果你不希望再看到此用户的更多内容,你可以忽略他们以隐藏他们的信息。</string> + <string name="content_reported_as_inappropriate_title">报告为不合适的内容</string> + <string name="content_reported_as_inappropriate_content">此内容已报告为不合适。 +\n +\n如果你不希望再看到此用户的更多内容,你可以忽略他们以隐藏他们的消息。</string> + <string name="template_permissions_rationale_msg_keys_backup_export">${app_name} 需要权限以在磁盘上保存你的端对端密钥。 +\n +\n请在接下来的弹出窗口中授权允许访问,以便你手动导出密钥。</string> <string name="no_network_indicator">目前没有网络连接</string> <string name="message_ignore_user">忽略用户</string> <string name="room_list_quick_actions_notifications_all_noisy">全部消息(嘈杂)</string> @@ -1684,21 +1684,21 @@ <string name="room_list_quick_actions_favorite_remove">从收藏中移除</string> <string name="room_list_quick_actions_leave">离开聊天室</string> <string name="notice_member_no_changes">%1$s 未做更改</string> - <string name="notice_member_no_changes_by_you">您未做更改</string> - <string name="no_ignored_users">您未忽略任何用户</string> + <string name="notice_member_no_changes_by_you">你未做更改</string> + <string name="no_ignored_users">你未忽略任何用户</string> <string name="help_long_click_on_room_for_more_options">长按聊天室查看更多选项</string> <string name="room_join_rules_public">%1$s 将聊天室设为对任何知道链接的用户公开。</string> - <string name="room_join_rules_public_by_you">您将聊天室设为对任何知道链接的用户公开。</string> + <string name="room_join_rules_public_by_you">你将聊天室设为对任何知道链接的用户公开。</string> <string name="room_join_rules_invite">%1$s 将聊天室设为仅限邀请。</string> - <string name="room_join_rules_invite_by_you">您将聊天室设为仅限邀请。</string> + <string name="room_join_rules_invite_by_you">你将聊天室设为仅限邀请。</string> <string name="timeline_unread_messages">未读消息</string> <string name="login_splash_title">这是你的对话。拥有它。</string> <string name="login_splash_text1">与人们私聊或群聊</string> <string name="login_splash_text2">通过加密保证对话私密</string> - <string name="login_splash_text3">扩展 & 自定义您的体验</string> + <string name="login_splash_text3">扩展 & 自定义你的体验</string> <string name="login_splash_submit">开始吧</string> <string name="login_server_title">选择服务器</string> - <string name="login_server_text">就像电子邮件,账号有一个家,尽管您可以与任何人聊天</string> + <string name="login_server_text">就像电子邮件,账号有一个家,尽管你可以与任何人聊天</string> <string name="login_server_matrix_org_text">在最大的公共服务器上免费加入数百万用户</string> <string name="login_server_modular_text">面向组织的高级托管</string> <string name="login_server_modular_learn_more">了解更多</string> @@ -1715,51 +1715,51 @@ <string name="login_server_url_form_modular_hint">Element Matrix 服务地址</string> <string name="login_server_url_form_other_hint">地址</string> <string name="login_server_url_form_modular_text">面向组织的高级托管</string> - <string name="login_server_url_form_modular_notice">输入 Modular Element 或您想使用的服务器地址</string> - <string name="login_server_url_form_common_notice">输入您想使用的服务器的地址</string> + <string name="login_server_url_form_modular_notice">输入 Modular Element 或你想使用的服务器地址</string> + <string name="login_server_url_form_common_notice">输入你想使用的服务器的地址</string> <string name="login_sso_error_message">载入页面时出错:%1$s (%2$d)</string> <string name="login_mode_not_supported">应用无法登录到此主服务器。主服务器支持以下登录类型:%1$s。 \n -\n您想要通过网页客户端登录吗?</string> +\n你想要通过网页客户端登录吗?</string> <string name="login_registration_disabled">抱歉,此服务器不接受新账号。</string> <string name="login_registration_not_supported">应用无法在此服务器上创建账号。 \n -\n您想要通过网页客户端注册吗?</string> +\n你想要通过网页客户端注册吗?</string> <string name="login_login_with_email_error">电子邮件未关联到任何账号。</string> <string name="login_reset_password_on">在 %1$s 上重置密码</string> - <string name="login_reset_password_notice">验证邮件将发送到您的收件箱以确认设置您的新密码。</string> + <string name="login_reset_password_notice">验证邮件将发送到你的收件箱以确认设置你的新密码。</string> <string name="login_reset_password_submit">下一个</string> <string name="login_reset_password_email_hint">电子邮件</string> <string name="login_reset_password_password_hint">新密码</string> <string name="login_reset_password_warning_title">注意!</string> - <string name="login_reset_password_warning_content">更改您的密码将重置所有会话上的端对端加密密钥,从而使加密聊天记录无法读取。在重设密码之前,请设置“密钥备份”或从另一个会话中导出聊天室密钥。</string> + <string name="login_reset_password_warning_content">更改你的密码将重置所有会话上的端对端加密密钥,从而使加密聊天记录无法读取。在重设密码之前,请设置“密钥备份”或从另一个会话中导出聊天室密钥。</string> <string name="login_reset_password_warning_submit">继续</string> <string name="login_reset_password_error_not_found">电子邮件未链接到任何账号</string> - <string name="login_reset_password_mail_confirmation_title">检查您的收件箱</string> + <string name="login_reset_password_mail_confirmation_title">检查你的收件箱</string> <string name="login_reset_password_mail_confirmation_notice">验证电子邮件已发送到 %1$s。</string> - <string name="login_reset_password_mail_confirmation_notice_2">点击链接以确认您的新密码。跟随包含的链接验证后,请点击下方。</string> + <string name="login_reset_password_mail_confirmation_notice_2">点击链接以确认你的新密码。跟随包含的链接验证后,请点击下方。</string> <string name="login_reset_password_mail_confirmation_submit">我已验证我的电子邮件地址</string> <string name="login_reset_password_success_title">成功!</string> - <string name="login_reset_password_success_notice">您的密码已重置。</string> - <string name="login_reset_password_success_notice_2">您已登出全部会话,不会再接收到推送通知。若要重新启用通知,请在每个设备上再次登录。</string> + <string name="login_reset_password_success_notice">你的密码已重置。</string> + <string name="login_reset_password_success_notice_2">你已登出全部会话,不会再接收到推送通知。若要重新启用通知,请在每个设备上再次登录。</string> <string name="login_reset_password_success_submit">返回登录</string> <string name="login_reset_password_cancel_confirmation_title">注意</string> - <string name="login_reset_password_cancel_confirmation_content">您的密码尚未更改。 + <string name="login_reset_password_cancel_confirmation_content">你的密码尚未更改。 \n \n是否中止密码更改过程?</string> <string name="login_set_email_title">设置电子邮件地址</string> - <string name="login_set_email_notice">设置电子邮件用于恢复您的账号。之后,您可以选择允许您认识的人通过电子邮件发现您。</string> + <string name="login_set_email_notice">设置电子邮件用于恢复你的账号。之后,你可以选择允许你认识的人通过电子邮件发现你。</string> <string name="login_set_email_mandatory_hint">电子邮件</string> <string name="login_set_email_optional_hint">电子邮件(可选)</string> <string name="login_set_email_submit">下一个</string> <string name="login_set_msisdn_title">设置电话号码</string> - <string name="login_set_msisdn_notice">设置电话号码,以选择允许您认识的人发现您。</string> + <string name="login_set_msisdn_notice">设置电话号码,以选择允许你认识的人发现你。</string> <string name="login_set_msisdn_notice2">请使用国际格式。</string> <string name="login_set_msisdn_mandatory_hint">电话号码</string> <string name="login_set_msisdn_optional_hint">电话号码(可选)</string> <string name="login_set_msisdn_submit">下一个</string> <string name="login_msisdn_confirm_title">确认电话号码</string> - <string name="login_msisdn_confirm_notice">我们向 %1$s 发送了验证码。在下方输入它以验证您的身份。</string> + <string name="login_msisdn_confirm_notice">我们向 %1$s 发送了验证码。在下方输入它以验证你的身份。</string> <string name="login_msisdn_confirm_hint">输入验证码</string> <string name="login_msisdn_confirm_send_again">重新发送</string> <string name="login_msisdn_confirm_submit">下一个</string> @@ -1772,7 +1772,7 @@ <string name="login_signup_submit">下一个</string> <string name="login_signup_error_user_in_use">用户名已占用</string> <string name="login_signup_cancel_confirmation_title">注意</string> - <string name="login_signup_cancel_confirmation_content">您的账号尚未创建。 + <string name="login_signup_cancel_confirmation_content">你的账号尚未创建。 \n \n是否中止注册过程?</string> <string name="login_a11y_choose_matrix_org">选择 matrix.org</string> @@ -1780,51 +1780,51 @@ <string name="login_a11y_choose_other">选择自定义主服务器</string> <string name="login_a11y_captcha_container">请进行人机验证</string> <string name="login_terms_title">接受条款以继续</string> - <string name="login_wait_for_email_title">请检查您的电子邮件</string> + <string name="login_wait_for_email_title">请检查你的电子邮件</string> <string name="login_wait_for_email_notice">我们向 %1$s 发送了电子邮件。 \n请点击其中包含的链接继续账号创建。</string> <string name="login_validation_code_is_not_correct">输入的验证码不正确。请检查。</string> <string name="login_error_outdated_homeserver_title">过时的主服务器</string> - <string name="login_error_outdated_homeserver_content">此主服务器运行的版本过旧以至于无法连接。要求您的主服务器管理员升级。</string> + <string name="login_error_outdated_homeserver_content">此主服务器运行的版本过旧以至于无法连接。要求你的主服务器管理员升级。</string> <plurals name="login_error_limit_exceeded_retry_after"> - <item quantity="other">发送了太多请求。您可以在 %1$d 秒后重试…</item> + <item quantity="other">发送了太多请求。你可以在 %1$d 秒后重试…</item> </plurals> - <string name="login_connect_using_matrix_id_notice">或者,如果您已经拥有账号并知道您的 Matrix 标识符和密码,您可以使用这种方式:</string> + <string name="login_connect_using_matrix_id_notice">或者,如果你已经拥有账号并知道你的 Matrix 标识符和密码,你可以使用这种方式:</string> <string name="login_connect_using_matrix_id_submit">使用 Matrix ID 登录</string> <string name="login_signin_matrix_id_title">使用 Matrix ID 登录</string> - <string name="login_signin_matrix_id_notice">如果您在主服务器上设置了账号,在下方使用您的 Matrix ID(例 @user:domain.com)和密码。</string> + <string name="login_signin_matrix_id_notice">如果你在主服务器上设置了账号,在下方使用你的 Matrix ID(例 @user:domain.com)和密码。</string> <string name="login_signin_matrix_id_hint">Matrix ID</string> - <string name="login_signin_matrix_id_password_notice">如果您不知道您的密码,返回并重置。</string> + <string name="login_signin_matrix_id_password_notice">如果你不知道你的密码,返回并重置。</string> <string name="login_signin_matrix_id_error_invalid_matrix_id">这不是一个有效的用户标识符。期望的格式:\'@user:homeserver.org\'</string> - <string name="autodiscover_well_known_error">无法找到有效的主服务器。请检查您的标识符</string> - <string name="signed_out_title">您已登出</string> + <string name="autodiscover_well_known_error">无法找到有效的主服务器。请检查你的标识符</string> + <string name="signed_out_title">你已登出</string> <string name="signed_out_notice">这可能由于多种原因: \n -\n• 您已在其他会话中更改了您的密码。 +\n• 你已在其他会话中更改了你的密码。 \n -\n• 您已从其他会话删除了此会话。 +\n• 你已从其他会话删除了此会话。 \n -\n• 您的服务器管理员出于安全原因已取消您的访问权限。</string> +\n• 你的服务器管理员出于安全原因已取消你的访问权限。</string> <string name="signed_out_submit">重新登录</string> - <string name="soft_logout_title">您已登出</string> + <string name="soft_logout_title">你已登出</string> <string name="soft_logout_signin_title">登录</string> - <string name="soft_logout_signin_notice">您的主服务器 (%1$s) 管理员将您从您的账号 %2$s (%3$s) 登出。</string> - <string name="soft_logout_signin_e2e_warning_notice">登录以恢复仅存储在此设备上的加密密钥。 您需要使用它们在任何设备上阅读所有安全消息。</string> + <string name="soft_logout_signin_notice">你的主服务器 (%1$s) 管理员将你从你的账号 %2$s (%3$s) 登出。</string> + <string name="soft_logout_signin_e2e_warning_notice">登录以恢复仅存储在此设备上的加密密钥。 你需要使用它们在任何设备上阅读所有安全消息。</string> <string name="soft_logout_signin_submit">登录</string> <string name="soft_logout_signin_password_hint">密码</string> <string name="soft_logout_clear_data_title">清除个人数据</string> - <string name="soft_logout_clear_data_notice">注意:您的个人数据(包括加密密钥)仍存储在此设备上。 + <string name="soft_logout_clear_data_notice">注意:你的个人数据(包括加密密钥)仍存储在此设备上。 \n -\n如果您不再使用此设备,或想登录另一个账号,请清除它。</string> +\n如果你不再使用此设备,或想登录另一个账号,请清除它。</string> <string name="soft_logout_clear_data_submit">清除全部数据</string> <string name="soft_logout_clear_data_dialog_title">清除数据</string> <string name="soft_logout_clear_data_dialog_content">是否清除当前存储在此设备上的全部数据? -\n再次登录以访问您的账号数据和消息。</string> - <string name="soft_logout_clear_data_dialog_e2e_warning_content">除非您登录以恢复加密密钥,否则您将无法访问安全消息。</string> +\n再次登录以访问你的账号数据和消息。</string> + <string name="soft_logout_clear_data_dialog_e2e_warning_content">除非你登录以恢复加密密钥,否则你将无法访问安全消息。</string> <string name="soft_logout_clear_data_dialog_submit">清除数据</string> - <string name="template_soft_logout_sso_not_same_user_error">当前会话用于用户 %1$s 而您提供了用户 %2$s 的凭证。${app_name} 不支持此功能。 + <string name="template_soft_logout_sso_not_same_user_error">当前会话用于用户 %1$s 而你提供了用户 %2$s 的凭证。${app_name} 不支持此功能。 \n请先清除数据,然后重新登录另一个账号。</string> - <string name="permalink_malformed">您的 matrix.to 链接更是不正确</string> + <string name="permalink_malformed">你的 matrix.to 链接更是不正确</string> <string name="bug_report_error_too_short">描述太短</string> <string name="notification_initial_sync">初始同步…</string> <string name="settings_show_devices_list">查看我的全部会话</string> @@ -1844,7 +1844,7 @@ <string name="command_description_shrug">在明文消息前添加 ¯\\_(ツ)_/¯</string> <string name="create_room_encryption_title">启用加密</string> <string name="create_room_encryption_description">加密一经启用,便无法禁用。</string> - <string name="login_error_threepid_denied">您的电子邮件域无权注册此服务器</string> + <string name="login_error_threepid_denied">你的电子邮件域无权注册此服务器</string> <string name="verification_conclusion_warning">未信任的登录</string> <string name="verification_sas_match">匹配</string> <string name="verification_sas_do_not_match">不匹配</string> @@ -1854,10 +1854,10 @@ <string name="verification_conclusion_not_secure">不安全</string> <string name="verification_conclusion_compromised">以下其中一项可能会受到威胁: \n -\n - 您的主服务器 -\n - 您验证的用户连接到的主服务器 -\n - 您或其它用户的网络连接 -\n - 您或其他用户的设备</string> +\n - 你的主服务器 +\n - 你验证的用户连接到的主服务器 +\n - 你或其它用户的网络连接 +\n - 你或其他用户的设备</string> <string name="sent_a_video">视频。</string> <string name="sent_an_image">图片。</string> <string name="sent_an_audio_file">音频</string> @@ -1865,21 +1865,21 @@ <string name="send_a_sticker">贴纸</string> <string name="verification_request_waiting">正在等待…</string> <string name="verification_request_other_cancelled">%s 已取消</string> - <string name="verification_request_you_cancelled">您已取消</string> + <string name="verification_request_you_cancelled">你已取消</string> <string name="verification_request_other_accepted">%s 已接受</string> - <string name="verification_request_you_accepted">您已接受</string> + <string name="verification_request_you_accepted">你已接受</string> <string name="verification_sent">验证已发送</string> <string name="verification_request">验证请求</string> <string name="verification_verify_device">验证此会话</string> <string name="verification_verify_device_manually">手动验证</string> - <string name="you">您</string> + <string name="you">你</string> <string name="verification_scan_notice">使用其他用户的设备扫描此码以安全地相互验证</string> <string name="verification_scan_their_code">扫描他们的码</string> <string name="verification_scan_emoji_title">无法扫描</string> - <string name="verification_scan_emoji_subtitle">如果您不在现场,请比较表情符号</string> + <string name="verification_scan_emoji_subtitle">如果你不在现场,请比较表情符号</string> <string name="verification_no_scan_emoji_title">通过比较表情符号验证</string> <string name="verify_by_emoji_title">通过表情验证</string> - <string name="verify_by_emoji_description">如果您无法扫描上方的码,通过比较简短独特的表情序列验证。</string> + <string name="verify_by_emoji_description">如果你无法扫描上方的码,通过比较简短独特的表情序列验证。</string> <string name="a13n_qr_code_description">二维码图片</string> <string name="verification_verify_user">验证 %s</string> <string name="verification_verified_user">已验证 %s</string> @@ -1890,7 +1890,7 @@ <string name="room_profile_not_encrypted_subtitle">此聊天室的消息未经端对端加密。</string> <string name="room_profile_encrypted_subtitle">该聊天室的消息已被端对端加密。 \n -\n您的消息受加密保护,并且只有您和消息接收者拥有唯一解密密钥。</string> +\n你的消息受加密保护,并且只有你和消息接收者拥有唯一解密密钥。</string> <string name="room_profile_section_security">安全</string> <string name="room_profile_section_security_learn_more">了解更多</string> <string name="room_profile_section_more">更多</string> @@ -1916,7 +1916,7 @@ <string name="template_rendering_event_error_type_of_message_not_handled">${app_name} 无法处理类型为 \'%1$s\' 的消息</string> <string name="template_rendering_event_error_exception">${app_name} 在渲染 id 为 \'%1$s\' 的事件内容时遇到了一个问题</string> <string name="unignore">取消忽略</string> - <string name="verify_cannot_cross_sign">该会话无法与您的其他会话共享此验证。 + <string name="verify_cannot_cross_sign">该会话无法与你的其他会话共享此验证。 \n验证将保存在本地,并在此应用的未来版本中共享。</string> <string name="room_list_sharing_header_recent_rooms">最近使用的聊天室</string> <string name="room_list_sharing_header_other_rooms">其他聊天室</string> @@ -1934,7 +1934,7 @@ <string name="verification_emoji_notice">比较独特表情,确保它们以相同顺序出现。</string> <string name="verification_code_notice">与其他用户设备上显示的代码比较。</string> <string name="verification_conclusion_ok_notice">与此用户的消息端对端加密,无法被第三方读取。</string> - <string name="verification_conclusion_ok_self_notice">您的新会话已验证。它可以访问您的加密消息,其他用户会将其视为可信任。</string> + <string name="verification_conclusion_ok_self_notice">你的新会话已验证。它可以访问你的加密消息,其他用户会将其视为可信任。</string> <string name="encryption_information_cross_signing_state">交叉签名</string> <string name="encryption_information_dg_xsigning_complete">交叉签名已启用 \n设备上的私钥。</string> @@ -1944,14 +1944,14 @@ <string name="encryption_information_dg_xsigning_not_trusted">交叉签名已启用。 \n密钥未信任</string> <string name="encryption_information_dg_xsigning_disabled">交叉签名未启用</string> - <string name="settings_hs_admin_e2e_disabled">您的服务器管理员已默认禁用私有聊天室和私聊消息端对端加密。</string> + <string name="settings_hs_admin_e2e_disabled">你的服务器管理员已默认禁用私有聊天室和私聊消息端对端加密。</string> <string name="settings_active_sessions_list">激活会话</string> <string name="settings_active_sessions_show_all">显示全部会话</string> <string name="settings_active_sessions_manage">管理会话</string> <string name="settings_active_sessions_signout_device">登出此会话</string> <string name="settings_failed_to_get_crypto_device_info">加密信息不可用</string> - <string name="settings_active_sessions_verified_device_desc">此会话对安全消息可信因为您已验证它:</string> - <string name="settings_active_sessions_unverified_device_desc">验证此会话以将其标记为可信,并授予其访问加密消息的权限。如果您未登录此会话,则您的账号可能已被盗:</string> + <string name="settings_active_sessions_verified_device_desc">此会话对安全消息可信因为你已验证它:</string> + <string name="settings_active_sessions_unverified_device_desc">验证此会话以将其标记为可信,并授予其访问加密消息的权限。如果你未登录此会话,则你的账号可能已被盗:</string> <plurals name="settings_active_sessions_count"> <item quantity="other">%d 个活动会话</item> </plurals> @@ -1968,7 +1968,7 @@ <string name="not_trusted">未信任</string> <string name="verification_profile_device_verified_because">此会话可信任,可以用于收发加密消息,因为 %1$s(%2$s)已验证了它:</string> <string name="verification_profile_device_new_signing">%1$s (%2$s) 使用新会话登录:</string> - <string name="verification_profile_device_untrust_info">在此用户信任此会话之前,发送到该会话和从该会话发送的消息均标有警告。或者,您可以手动进行验证。</string> + <string name="verification_profile_device_untrust_info">在此用户信任此会话之前,发送到该会话和从该会话发送的消息均标有警告。或者,你可以手动进行验证。</string> <string name="initialize_cross_signing">初始化交叉签名</string> <string name="reset_cross_signing">重置密钥</string> <string name="a11y_qr_code_for_verification">二维码</string> @@ -1988,19 +1988,19 @@ <string name="poll_item_selected_aria">已选选项</string> <string name="command_description_poll">创建简单调查</string> <string name="verification_cannot_access_other_session">使用恢复密语或密钥</string> - <string name="verification_use_passphrase">如果您无法访问已有会话</string> + <string name="verification_use_passphrase">如果你无法访问已有会话</string> <string name="new_signin">新登录</string> <string name="enter_secret_storage_invalid">无法在存储中找到秘密</string> <string name="enter_secret_storage_passphrase">输入秘密存储密语</string> <string name="enter_secret_storage_passphrase_warning">警告:</string> - <string name="enter_secret_storage_passphrase_warning_text">您应仅在可信任的设备上访问秘密存储</string> + <string name="enter_secret_storage_passphrase_warning_text">你应仅在可信任的设备上访问秘密存储</string> <string name="message_action_item_redact">移除…</string> - <string name="share_confirm_room">您想要发送此附件到 %1$s 吗?</string> + <string name="share_confirm_room">你想要发送此附件到 %1$s 吗?</string> <plurals name="send_images_with_original_size"> <item quantity="other">发送原始尺寸图片</item> </plurals> <string name="delete_event_dialog_title">确认移除</string> - <string name="delete_event_dialog_content">您确实想要移除(删除)此事件吗?注意如果您删除聊天室名或话题更改,可以撤销更改。</string> + <string name="delete_event_dialog_content">你确实想要移除(删除)此事件吗?注意如果你删除聊天室名或话题更改,可以撤销更改。</string> <string name="delete_event_dialog_reason_checkbox">附加理由</string> <string name="delete_event_dialog_reason_hint">编辑理由</string> <string name="event_redacted_by_user_reason_with_reason">事件被用户删除,理由:%1$s</string> @@ -2008,23 +2008,23 @@ <string name="settings_key_requests">密钥请求</string> <string name="e2e_use_keybackup">解锁加密消息历史</string> <string name="refresh">刷新</string> - <string name="new_session">新登录。是您吗?</string> + <string name="new_session">新登录。是你吗?</string> <string name="new_session_review">轻按以审核和验证</string> <string name="verify_new_session_notice">使用此会话验证新的会话,授权访问加密消息。</string> <string name="verify_new_session_was_not_me">这不是我</string> - <string name="verify_new_session_compromized">您的账号可能已被盗用</string> - <string name="verify_cancel_self_verification_from_untrusted">如果您取消,您将无法在此设备上读取加密消息,其他用户不会信任它</string> - <string name="verify_cancel_self_verification_from_trusted">如果您取消,您将无法在新设备上读取加密消息,其他用户不会信任它</string> - <string name="verify_cancel_other">如果您现在取消将不会验证 %1$s (%2$s)。在他们的用户个人档案中重新开始。</string> + <string name="verify_new_session_compromized">你的账号可能已被盗用</string> + <string name="verify_cancel_self_verification_from_untrusted">如果你取消,你将无法在此设备上读取加密消息,其他用户不会信任它</string> + <string name="verify_cancel_self_verification_from_trusted">如果你取消,你将无法在新设备上读取加密消息,其他用户不会信任它</string> + <string name="verify_cancel_other">如果你现在取消将不会验证 %1$s (%2$s)。在他们的用户个人档案中重新开始。</string> <string name="verify_not_me_self_verification">以下其中一项可能有风险: \n -\n- 您的密码 -\n- 您的主服务器 +\n- 你的密码 +\n- 你的主服务器 \n- 此设备或其它设备 \n- 设备使用的网络连接 \n -\n我们推荐您在设置中立即更换您的密码和恢复密钥。</string> - <string name="verify_cancelled_notice">通过设置验证您的设备。</string> +\n我们推荐你在设置中立即更换你的密码和恢复密钥。</string> + <string name="verify_cancelled_notice">通过设置验证你的设备。</string> <string name="verification_cancelled">验证已取消</string> <string name="recovery_passphrase">恢复密语</string> <string name="message_key">消息密钥</string> @@ -2032,17 +2032,17 @@ <string name="set_recovery_passphrase">设置 %s</string> <string name="generate_message_key">生成消息密钥</string> <string name="confirm_recovery_passphrase">确认 %s</string> - <string name="enter_account_password">输入您的 %s 以继续。</string> - <string name="bootstrap_info_confirm_text">再次输入您的 %s 确认。</string> - <string name="bootstrap_dont_reuse_pwd">不要使用您的账号密码。</string> + <string name="enter_account_password">输入你的 %s 以继续。</string> + <string name="bootstrap_info_confirm_text">再次输入你的 %s 确认。</string> + <string name="bootstrap_dont_reuse_pwd">不要使用你的账号密码。</string> <string name="bootstrap_info_text_2">输入只有你知道的安全口令,用于保护服务器上的秘密。</string> <string name="bootstrap_loading_text">这可能会花费数秒,请耐心等待。</string> <string name="bootstrap_loading_title">设置恢复。</string> - <string name="your_recovery_key">您的恢复密钥</string> + <string name="your_recovery_key">你的恢复密钥</string> <string name="bootstrap_finish_title">完成了!</string> <string name="keep_it_safe">保持安全</string> <string name="finish">完成</string> - <string name="bootstrap_save_key_description">使用此 %1$s 作为安全网以防您忘记您的 %2$s。</string> + <string name="bootstrap_save_key_description">使用此 %1$s 作为安全网以防你忘记你的 %2$s。</string> <string name="bootstrap_crosssigning_progress_initializing">发布创建的身份密钥</string> <string name="bootstrap_crosssigning_progress_pbkdf2">从密语生成安全密钥</string> <string name="bootstrap_crosssigning_progress_default_key">正在定义 SSSS 默认密钥</string> @@ -2050,9 +2050,9 @@ <string name="bootstrap_crosssigning_progress_save_usk">正在同步用户密钥</string> <string name="bootstrap_crosssigning_progress_save_ssk">正在同步自签名密钥</string> <string name="bootstrap_crosssigning_progress_key_backup">正在设置密钥备份</string> - <string name="bootstrap_cross_signing_success">您的 %2$s 和 %1$s 已设置。 + <string name="bootstrap_cross_signing_success">你的 %2$s 和 %1$s 已设置。 \n -\n请安全地保管它。如果您丢失了全部活动会话您将需要使用它们解锁加密消息和安全信息。</string> +\n请安全地保管它。如果你丢失了全部活动会话你将需要使用它们解锁加密消息和安全信息。</string> <string name="bootstrap_crosssigning_print_it">将它打印出来并存放在安全的地方</string> <string name="command_description_spoiler">发送爆雷信息</string> <string name="spoiler">爆雷</string> @@ -2063,21 +2063,21 @@ <string name="keys_backup_restore_success_title_already_up_to_date">密钥已是最新!</string> <string name="bootstrap_info_text">保护与解锁已加密消息并信任 %s。</string> <string name="bootstrap_crosssigning_save_usb">保存到优盘或者备份盘</string> - <string name="bootstrap_crosssigning_save_cloud">复制到您的个人云存储</string> - <string name="auth_flow_not_supported">您无法在移动设备上执行此操作</string> - <string name="bootstrap_skip_text">设置恢复密语让您能够保护和解锁加密信息并信任设备。 + <string name="bootstrap_crosssigning_save_cloud">复制到你的个人云存储</string> + <string name="auth_flow_not_supported">你无法在移动设备上执行此操作</string> + <string name="bootstrap_skip_text">设置恢复密语让你能够保护和解锁加密信息并信任设备。 \n -\n如果您不希望设置文本密码,那么生成密钥亦可。</string> - <string name="bootstrap_skip_text_no_gen_key">设置恢复密语让您能够保护和解锁加密信息并信任设备。</string> - <string name="bootstrap_cancel_text">如果您现在取消,那么当您失去登录权限时也会丢失加密的信息和数据。 +\n如果你不希望设置文本密码,那么生成密钥亦可。</string> + <string name="bootstrap_skip_text_no_gen_key">设置恢复密语让你能够保护和解锁加密信息并信任设备。</string> + <string name="bootstrap_cancel_text">如果你现在取消,那么当你失去登录权限时也会丢失加密的信息和数据。 \n -\n您也可以通过设置菜单来建立保护备份以及管理您的密钥。</string> +\n你也可以通过设置菜单来建立保护备份以及管理你的密钥。</string> <string name="encryption_enabled">加密开启</string> <string name="encryption_enabled_tile_description">本聊天室信息已经端对端加密。验证成员时,请查看其个人档案以了解更多信息。</string> <string name="encryption_not_enabled">加密未开启</string> <string name="encryption_unknown_algorithm_tile_description">不支持本聊天室使用的加密方式</string> <string name="room_created_summary_item">%s 创建并配置了聊天室。</string> - <string name="room_created_summary_item_by_you">您创建并配置了聊天室。</string> + <string name="room_created_summary_item_by_you">你创建并配置了聊天室。</string> <string name="qr_code_scanned_self_verif_notice">接近完成!另外的设备是否正显示相同的盾牌图标?</string> <string name="qr_code_scanned_verif_waiting_notice">接近完成!等候确认……</string> <string name="qr_code_scanned_verif_waiting">正在等候 %s…</string> @@ -2095,8 +2095,8 @@ <string name="room_message_placeholder">消息…</string> <string name="upgrade_security">加密升级可用</string> <string name="setup_cross_signing">启用交叉签名</string> - <string name="security_prompt_text">验证您自己和其他人以保证您的聊天安全</string> - <string name="bootstrap_enter_recovery">输入您的 %s 以继续</string> + <string name="security_prompt_text">验证你自己和其他人以保证你的聊天安全</string> + <string name="bootstrap_enter_recovery">输入你的 %s 以继续</string> <string name="use_file">使用文件</string> <string name="enter_backup_passphrase">输入 %s</string> <string name="backup_recovery_passphrase">恢复密语</string> @@ -2110,9 +2110,9 @@ <string name="bootstrap_progress_generating_ssss_recovery">从恢复密钥生成 SSSS 密钥</string> <string name="bootstrap_progress_storing_in_sss">正在在 SSSS 中保存密钥备份秘密</string> <string name="new_session_review_with_info">%1$s (%2$s)</string> - <string name="bootstrap_migration_enter_backup_password">输入您的密钥备份密语以继续。</string> - <string name="bootstrap_migration_use_recovery_key">使用您的密钥备份恢复密钥</string> - <string name="bootstrap_migration_with_passphrase_helper_with_link">不知道您的密钥备份密语,您可以 %s。</string> + <string name="bootstrap_migration_enter_backup_password">输入你的密钥备份密语以继续。</string> + <string name="bootstrap_migration_use_recovery_key">使用你的密钥备份恢复密钥</string> + <string name="bootstrap_migration_with_passphrase_helper_with_link">不知道你的密钥备份密语,你可以 %s。</string> <string name="bootstrap_migration_backup_recovery_key">密钥备份恢复密钥</string> <string name="settings_security_prevent_screenshots_title">阻止应用内屏幕截图</string> <string name="settings_security_prevent_screenshots_summary">启用此设置添加 FLAG_SECURE 到所有活动。重启应用使更改生效。</string> @@ -2126,31 +2126,31 @@ <string name="template_app_ios_android">${app_name} iOS \n${app_name} Android</string> <string name="or_other_mx_capabale_client">或其他能够交叉签名的 Matrix 客户端</string> - <string name="template_use_latest_app">在您的其他设备上使用最新的 ${app_name}:</string> + <string name="template_use_latest_app">在你的其他设备上使用最新的 ${app_name}:</string> <string name="command_description_discard_session">强制丢弃加密聊天室中的当前出站群组会话</string> <string name="command_description_discard_session_not_handled">仅在加密聊天室中支持</string> - <string name="enter_secret_storage_passphrase_or_key">使用您的 %1$s 或使用您的 %2$s 继续。</string> + <string name="enter_secret_storage_passphrase_or_key">使用你的 %1$s 或使用你的 %2$s 继续。</string> <string name="use_recovery_key">使用恢复密钥</string> - <string name="enter_secret_storage_input_key">选择您的恢复密钥,或手动输入或从剪贴板粘贴</string> - <string name="keys_backup_recovery_key_error_decrypt">无法使用此恢复密钥解密备份:请确认您输入了正确的恢复密钥。</string> + <string name="enter_secret_storage_input_key">选择你的恢复密钥,或手动输入或从剪贴板粘贴</string> + <string name="keys_backup_recovery_key_error_decrypt">无法使用此恢复密钥解密备份:请确认你输入了正确的恢复密钥。</string> <string name="failed_to_access_secure_storage">访问安全存储失败</string> <string name="unencrypted">未加密</string> <string name="encrypted_unverified">由未验证设备加密</string> - <string name="review_logins">查看您的登录位置</string> - <string name="verify_other_sessions">验证您的全部会话确保您的账号和消息安全</string> - <string name="verify_this_session">验证访问您的账号的新登录:%1$s</string> + <string name="review_logins">查看你的登录位置</string> + <string name="verify_other_sessions">验证你的全部会话确保你的账号和消息安全</string> + <string name="verify_this_session">验证访问你的账号的新登录:%1$s</string> <string name="cross_signing_verify_by_text">使用文本手动验证</string> <string name="crosssigning_verify_session">验证登录</string> <string name="cross_signing_verify_by_emoji">使用表情交互式验证</string> - <string name="confirm_your_identity">通过从您的其他会话验证此登录确认您的身份,授权它访问您的加密消息。</string> + <string name="confirm_your_identity">通过从你的其他会话验证此登录确认你的身份,授权它访问你的加密消息。</string> <string name="mark_as_verified">标记为信任</string> <string name="error_empty_field_choose_user_name">请选择用户名。</string> <string name="error_empty_field_choose_password">请选择密码。</string> <string name="external_link_confirmation_title">仔细检查此链接</string> - <string name="external_link_confirmation_message">链接 %1$s 正在将您带到另一个站点:%2$s。 + <string name="external_link_confirmation_message">链接 %1$s 正在将你带到另一个站点:%2$s。 \n -\n您确定想要继续吗?</string> - <string name="create_room_dm_failure">我们无法创建您的私聊消息。请检查您要邀请的用户并重试。</string> +\n你确定想要继续吗?</string> + <string name="create_room_dm_failure">我们无法创建你的私聊消息。请检查你要邀请的用户并重试。</string> <string name="add_members_to_room">添加成员</string> <string name="invite_users_to_room_action_invite">邀请</string> <string name="inviting_users_to_room">正在邀请用户…</string> @@ -2160,7 +2160,7 @@ <plurals name="invitations_sent_to_one_and_more_users"> <item quantity="other">邀请已发送到 %1$s 和 %2$d等</item> </plurals> - <string name="invite_users_to_room_failure">我们无法邀请用户,请检查您想要邀请的用户并重试。</string> + <string name="invite_users_to_room_failure">我们无法邀请用户,请检查你想要邀请的用户并重试。</string> <string name="choose_locale_current_locale_title">当前语言</string> <string name="choose_locale_other_locales_title">其他可用语言</string> <string name="choose_locale_loading_locales">正在载入可用语言…</string> @@ -2170,12 +2170,12 @@ <string name="identity_server_error_outdated_home_server">无法执行此操作。主服务器已过期。</string> <string name="identity_server_error_no_identity_server_configured">请先配置身份服务器。</string> <string name="identity_server_error_terms_not_signed">请先在设置中接受身份服务器的条款。</string> - <string name="template_identity_server_error_bulk_sha256_not_supported">为了您的隐私,${app_name} 仅支持发送用户电子邮件和电话号码的哈希值。</string> + <string name="template_identity_server_error_bulk_sha256_not_supported">为了你的隐私,${app_name} 仅支持发送用户电子邮件和电话号码的哈希值。</string> <string name="identity_server_error_binding_error">关联失败。</string> <string name="identity_server_error_no_current_binding_error">目前与此标识符没有关联。</string> - <string name="identity_server_set_default_notice">您的主服务器(%1$s)建议使用 %2$s 作为您的身份服务器</string> + <string name="identity_server_set_default_notice">你的主服务器(%1$s)建议使用 %2$s 作为你的身份服务器</string> <string name="identity_server_set_default_submit">使用 %1$s</string> - <string name="identity_server_set_alternative_notice">或者,您可以输入任何其他身份服务器 URL</string> + <string name="identity_server_set_alternative_notice">或者,你可以输入任何其他身份服务器 URL</string> <string name="identity_server_set_alternative_notice_no_default">输入身份服务器 URL</string> <string name="identity_server_set_alternative_submit">提交</string> <string name="power_level_edit_title">设置角色</string> @@ -2187,69 +2187,69 @@ <string name="a11y_start_camera">启动相机</string> <string name="settings_setup_secure_backup">设置安全备份</string> <string name="bottom_sheet_setup_secure_backup_title">安全备份</string> - <string name="bottom_sheet_setup_secure_backup_subtitle">通过在您的服务器上备份加密密钥,防止失去对加密信息和数据的访问。</string> + <string name="bottom_sheet_setup_secure_backup_subtitle">通过在你的服务器上备份加密密钥,防止失去对加密信息和数据的访问。</string> <string name="bottom_sheet_setup_secure_backup_submit">设置</string> <string name="bottom_sheet_setup_secure_backup_security_key_title">使用安全密钥</string> <string name="bottom_sheet_setup_secure_backup_security_key_subtitle">生成安全密钥存储在安全的地方如密码管理器或保险箱。</string> <string name="bottom_sheet_setup_secure_backup_security_phrase_title">使用安全口令</string> - <string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">输入仅有您知道的安全口令,生成备份用的密钥。</string> - <string name="bottom_sheet_save_your_recovery_key_title">保存您的安全密钥</string> - <string name="bottom_sheet_save_your_recovery_key_content">将您的安全密钥存储在安全的地方,例如密码管理器或保险箱。</string> + <string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">输入仅有你知道的安全口令,生成备份用的密钥。</string> + <string name="bottom_sheet_save_your_recovery_key_title">保存你的安全密钥</string> + <string name="bottom_sheet_save_your_recovery_key_content">将你的安全密钥存储在安全的地方,例如密码管理器或保险箱。</string> <string name="set_a_security_phrase_title">设置安全口令</string> - <string name="set_a_security_phrase_notice">输入只有您知道的安全口令,用于保护您的服务器上的秘密。</string> + <string name="set_a_security_phrase_notice">输入只有你知道的安全口令,用于保护你的服务器上的秘密。</string> <string name="set_a_security_phrase_hint">安全口令</string> - <string name="set_a_security_phrase_again_notice">再次输入您的安全口令以确认。</string> - <string name="save_your_security_key_title">保存您的安全密钥</string> - <string name="save_your_security_key_notice">将您的安全密钥存储在安全的地方如密码管理器或保险箱。</string> + <string name="set_a_security_phrase_again_notice">再次输入你的安全口令以确认。</string> + <string name="save_your_security_key_title">保存你的安全密钥</string> + <string name="save_your_security_key_notice">将你的安全密钥存储在安全的地方如密码管理器或保险箱。</string> <string name="room_settings_name_hint">聊天室名称</string> <string name="room_settings_topic_hint">主题</string> - <string name="room_settings_save_success">您已成功更改聊天室设置</string> - <string name="notice_crypto_unable_to_decrypt_final">您无法访问此消息</string> + <string name="room_settings_save_success">你已成功更改聊天室设置</string> + <string name="notice_crypto_unable_to_decrypt_final">你无法访问此消息</string> <string name="notice_crypto_unable_to_decrypt_friendly">正在等待此消息,可能会花费一些时间</string> <string name="crypto_utd">无法解密</string> - <string name="notice_crypto_unable_to_decrypt_friendly_desc">由于端对端加密,您可能需要等待某人的消息到达因为加密密钥未正确发送给您。</string> - <string name="crypto_error_withheld_blacklisted">您无法访问此消息因为您已屏蔽此发送者</string> - <string name="crypto_error_withheld_unverified">您无法访问此消息,因为您的会话不被发送者信任</string> - <string name="crypto_error_withheld_generic">您无法访问此消息因为发送者有意不发送密钥</string> + <string name="notice_crypto_unable_to_decrypt_friendly_desc">由于端对端加密,你可能需要等待某人的消息到达因为加密密钥未正确发送给你。</string> + <string name="crypto_error_withheld_blacklisted">你无法访问此消息因为你已屏蔽此发送者</string> + <string name="crypto_error_withheld_unverified">你无法访问此消息,因为你的会话不被发送者信任</string> + <string name="crypto_error_withheld_generic">你无法访问此消息因为发送者有意不发送密钥</string> <string name="notice_crypto_unable_to_decrypt_merged">正在等待加密历史</string> <string name="disclaimer_title">Riot 现已成为 Element!</string> - <string name="disclaimer_content">我们很高兴地宣布我们改名了!您的应用已经更新到最新版本,并且您已登录您的账号。</string> + <string name="disclaimer_content">我们很高兴地宣布我们改名了!你的应用已经更新到最新版本,并且你已登录你的账号。</string> <string name="disclaimer_negative_button">明白了</string> <string name="disclaimer_positive_button">了解更多</string> <string name="save_recovery_key_chooser_hint">将恢复密钥保存到</string> <string name="add_from_phone_book">从我的通讯录添加</string> - <string name="empty_phone_book">您的通讯录是空的</string> + <string name="empty_phone_book">你的通讯录是空的</string> <string name="phone_book_title">通讯录</string> <string name="search_in_my_contacts">搜索我的联系人</string> - <string name="loading_contact_book">正在获取您的联系人…</string> - <string name="empty_contact_book">您的通讯录是空的</string> + <string name="loading_contact_book">正在获取你的联系人…</string> + <string name="empty_contact_book">你的通讯录是空的</string> <string name="contacts_book_title">通讯录</string> <string name="three_pid_revoke_invite_dialog_title">撤销邀请</string> <string name="three_pid_revoke_invite_dialog_content">是否撤销对 %1$s 的邀请?</string> <string name="member_banned_by">被 %1$s 封禁</string> <string name="failed_to_unban">解封用户失败</string> <string name="alert_push_are_disabled_title">推送通知已禁用</string> - <string name="alert_push_are_disabled_description">查看您的设置以启用推送通知</string> + <string name="alert_push_are_disabled_description">查看你的设置以启用推送通知</string> <string name="create_pin_title">选择 PIN 以确保安全</string> <string name="create_pin_confirm_title">确认 PIN</string> <string name="create_pin_confirm_failure">验证 PIN 失败,请输入新的。</string> - <string name="auth_pin_title">输入您的 PIN</string> + <string name="auth_pin_title">输入你的 PIN</string> <string name="auth_pin_forgot">忘记 PIN?</string> <string name="auth_pin_reset_title">重置 PIN</string> <string name="auth_pin_new_pin_action">新 PIN</string> - <string name="auth_pin_reset_content">为重置您的 PIN,您将需要重新登录并创建新的。</string> + <string name="auth_pin_reset_content">为重置你的 PIN,你将需要重新登录并创建新的。</string> <string name="settings_security_pin_code_title">启用 PIN</string> - <string name="settings_security_pin_code_summary">如果您想要重置您的 PIN,点按忘记 PIN 登出并重置。</string> + <string name="settings_security_pin_code_summary">如果你想要重置你的 PIN,点按忘记 PIN 登出并重置。</string> <string name="auth_pin_confirm_to_disable_title">确认 PIN 并禁用 PIN</string> <string name="settings_call_show_confirmation_dialog_title">防止意外通话</string> <string name="settings_call_show_confirmation_dialog_summary">发起通话之前要求确认</string> - <string name="no_permissions_to_start_conf_call">您没有权限在此聊天室发起会议通话</string> + <string name="no_permissions_to_start_conf_call">你没有权限在此聊天室发起会议通话</string> <string name="conference_call_in_progress">会议正在进行!</string> <string name="video_meeting">发起视频会议</string> <string name="audio_meeting">发起音频会议</string> - <string name="audio_video_meeting_description">会议使用 Jitsi 安全与许可政策。您的会议进行期间当前聊天室内的所有人将看到加入邀请。</string> - <string name="cannot_call_yourself">您无法呼叫您自己</string> - <string name="cannot_call_yourself_with_invite">您无法与自己通话,请等待参与者接受邀请</string> + <string name="audio_video_meeting_description">会议使用 Jitsi 安全与许可政策。你的会议进行期间当前聊天室内的所有人将看到加入邀请。</string> + <string name="cannot_call_yourself">你无法呼叫你自己</string> + <string name="cannot_call_yourself_with_invite">你无法与自己通话,请等待参与者接受邀请</string> <string name="failed_to_add_widget">添加挂件失败</string> <string name="failed_to_remove_widget">移除挂件失败</string> <plurals name="encryption_import_room_keys_success"> @@ -2267,27 +2267,27 @@ <item quantity="other">错误代码,剩余 %d 次尝试</item> </plurals> <string name="wrong_pin_message_last_remaining_attempt">注意!登出前最后一次尝试!</string> - <string name="too_many_pin_failures">错误次数过多,您已被登出</string> + <string name="too_many_pin_failures">错误次数过多,你已被登出</string> <string name="auth_msisdn_already_defined">此电话号码已定义。</string> - <string name="settings_phone_number_empty">您的账号尚未添加电话号码</string> + <string name="settings_phone_number_empty">你的账号尚未添加电话号码</string> <string name="settings_emails">电子邮件地址</string> - <string name="settings_emails_empty">您的账号尚未添加电子邮件</string> + <string name="settings_emails_empty">你的账号尚未添加电子邮件</string> <string name="settings_phone_numbers">电话号码</string> <string name="settings_remove_three_pid_confirmation_content">移除 %s?</string> - <string name="error_threepid_auth_failed">请确认您已点击我们向您发送的电子邮件中的链接。</string> + <string name="error_threepid_auth_failed">请确认你已点击我们向你发送的电子邮件中的链接。</string> <string name="settings_emails_and_phone_numbers_title">电子邮件和电话号码</string> - <string name="settings_emails_and_phone_numbers_summary">管理链接到您的 Matrix 账号的电子邮件和电话号码</string> + <string name="settings_emails_and_phone_numbers_summary">管理链接到你的 Matrix 账号的电子邮件和电话号码</string> <string name="settings_text_message_sent_hint">代码</string> <string name="login_msisdn_notice">请使用国际格式(电话号码必须以 ‘+’ 开始)</string> - <string name="confirm_your_identity_quad_s">通过验证此登录确认您的身份,授权它访问加密信息。</string> - <string name="error_opening_banned_room">无法打开您被封禁的聊天室。</string> + <string name="confirm_your_identity_quad_s">通过验证此登录确认你的身份,授权它访问加密信息。</string> + <string name="error_opening_banned_room">无法打开你被封禁的聊天室。</string> <string name="room_error_not_found">无法找到此聊天室。请确认它存在。</string> - <string name="no_permissions_to_start_webrtc_call">您没有权限在此聊天室发起通话</string> + <string name="no_permissions_to_start_webrtc_call">你没有权限在此聊天室发起通话</string> <plurals name="seconds"> <item quantity="other">%d 秒</item> </plurals> <string name="settings_show_room_member_state_events">显示聊天室成员状态事件</string> - <string name="settings_show_room_member_state_events_summary">包括邀请/加入/离开/踢掉/封禁事件和头像/昵称变更。</string> + <string name="settings_show_room_member_state_events_summary">包括邀请/加入/离开/踢掉/封禁事件和头像/昵称更改。</string> <string name="sent_a_poll">轮询</string> <string name="sent_a_bot_buttons">机器人按钮</string> <string name="sent_a_reaction">回应:%s</string> @@ -2311,22 +2311,22 @@ <plurals name="secure_backup_reset_devices_you_can_verify"> <item quantity="other">显示 %d 部设备,这些设备是你现在可以验证的</item> </plurals> - <string name="secure_backup_reset_no_history">您将重新启动,没有历史记录,消息,受信任的设备或受信任的用户</string> - <string name="secure_backup_reset_if_you_reset_all">如果您重置一切</string> + <string name="secure_backup_reset_no_history">你将重新启动,没有历史记录,消息,受信任的设备或受信任的用户</string> + <string name="secure_backup_reset_if_you_reset_all">如果你重置一切</string> <string name="secure_backup_reset_all_no_other_devices">仅当没有其他设备可用来验证此设备时,才执行此操作。</string> - <string name="secure_backup_reset_all">重置一切</string> + <string name="secure_backup_reset_all">全部重置</string> <string name="bad_passphrase_key_reset_all_action">忘记或丢失了所有的恢复选项?重置一切</string> - <string name="direct_room_created_summary_item_by_you">您已加入。</string> + <string name="direct_room_created_summary_item_by_you">你已加入。</string> <string name="direct_room_created_summary_item">%s 已加入。</string> <string name="direct_room_encryption_enabled_tile_description">此聊天室的消息是端对端加密的。</string> <string name="direct_room_profile_section_more_leave">离开</string> <string name="direct_room_profile_section_more_settings">设置</string> <string name="direct_room_profile_encrypted_subtitle">此处的消息已被端对端加密。 \n -\n您的消息受加密保护,并且只有您和消息接收者拥有唯一解密密钥。</string> +\n你的消息受加密保护,并且只有你和消息接收者拥有唯一解密密钥。</string> <string name="direct_room_profile_not_encrypted_subtitle">此处的消息未经端对端加密。</string> - <string name="login_error_outdated_homeserver_warning_content">此主服务器正在运行较旧版本。要求您的主服务器管理员升级。您可以继续,但一些功能可能无法正确工作。</string> - <string name="direct_room_join_rules_invite_by_you">您仅发出此邀请。</string> + <string name="login_error_outdated_homeserver_warning_content">此主服务器正在运行较旧版本。要求你的主服务器管理员升级。你可以继续,但一些功能可能无法正确工作。</string> + <string name="direct_room_join_rules_invite_by_you">你仅发出此邀请。</string> <string name="direct_room_join_rules_invite">%1$s 仅发出此邀请。</string> <string name="settings_labs_show_complete_history_in_encrypted_room">在加密聊天室显示完整历史</string> <string name="notification_unread_notified_messages_and_invitation">%1$s 和 %2$s</string> @@ -2335,20 +2335,20 @@ <item quantity="other">%d 个邀请</item> </plurals> <string name="settings_troubleshoot_test_notification_notification_clicked">通知已点击!</string> - <string name="settings_troubleshoot_test_notification_notice">请点击通知。如果您未看到通知,请检查系统设置。</string> + <string name="settings_troubleshoot_test_notification_notice">请点击通知。如果你未看到通知,请检查系统设置。</string> <string name="settings_troubleshoot_test_notification_title">通知显示</string> - <string name="settings_troubleshoot_test_push_notification_content">您正在查看通知!点我!</string> + <string name="settings_troubleshoot_test_push_notification_content">你正在查看通知!点我!</string> <string name="settings_troubleshoot_test_push_loop_failed">接受推送失败。重装应用或可解决。</string> <string name="settings_troubleshoot_test_push_loop_success">应用正在接受推送</string> <string name="settings_troubleshoot_test_push_loop_waiting_for_push">应用正在等待推送</string> <string name="settings_troubleshoot_test_push_loop_title">测试推送</string> <string name="search_is_not_supported_in_e2e_room">尚不支持在加密聊天室中搜索。</string> <string name="search_banned_user_hint">过滤被封禁的用户</string> - <string name="no_permissions_to_start_webrtc_call_in_direct_room">您没有权限发起通话</string> - <string name="no_permissions_to_start_conf_call_in_direct_room">您没有权限发起会议通话</string> + <string name="no_permissions_to_start_webrtc_call_in_direct_room">你没有权限发起通话</string> + <string name="no_permissions_to_start_conf_call_in_direct_room">你没有权限发起会议通话</string> <string name="reset">重置</string> - <string name="permissions_denied_add_contact">允许访问您的联系人。</string> - <string name="permissions_denied_qr_code">如需扫描二维码,您须允许相机访问权限。</string> + <string name="permissions_denied_add_contact">允许访问你的联系人。</string> + <string name="permissions_denied_qr_code">如需扫描二维码,你须允许相机访问权限。</string> <string name="no_more_results">没有更多结果</string> <string name="start_chatting">开始畅聊</string> <string name="room_alias_delete_confirmation">删除地址 \"%1$s\"?</string> @@ -2356,9 +2356,9 @@ <string name="room_alias_published_alias_add_manually_submit">发布</string> <string name="room_alias_published_alias_add_manually">手动发布新地址</string> <string name="room_alias_published_other">其它发布的地址:</string> - <string name="room_alias_main_address_hint">主地址</string> - <string name="room_alias_published_alias_main">这是主地址</string> - <string name="room_alias_published_alias_subtitle">发布的地址可以被任何服务器上的任何人用来加入您的聊天室。要发布一个地址,它必须先被设为一个本地地址。</string> + <string name="room_alias_main_address_hint">主要地址</string> + <string name="room_alias_published_alias_main">这是主要地址</string> + <string name="room_alias_published_alias_subtitle">发布的地址可以被任何服务器上的任何人用来加入你的聊天室。要发布一个地址,它必须先被设为一个本地地址。</string> <string name="room_alias_published_alias_title">发布的地址</string> <string name="room_alias_title">聊天室地址</string> <string name="room_settings_alias_subtitle">查看和管理此聊天室的地址,以及它在聊天室目录中的可见性。</string> @@ -2376,18 +2376,18 @@ <string name="topic_prefix">"话题: "</string> <string name="add_a_topic_link_text">添加一个话题</string> <string name="room_created_summary_no_topic_creation_text">%s 使人们知道此聊天室关于什么。</string> - <string name="this_is_the_beginning_of_dm">这是您和 %s 的私聊消息历史记录的开始。</string> + <string name="this_is_the_beginning_of_dm">这是你和 %s 的私聊消息历史记录的开始。</string> <string name="this_is_the_beginning_of_room_no_name">这是此对话的开始。</string> <string name="this_is_the_beginning_of_room">这是 %s 的开始。</string> <string name="settings_export_trail">导出审计</string> - <string name="room_settings_enable_encryption_no_permission">您没有权限在此聊天室启用加密。</string> + <string name="room_settings_enable_encryption_no_permission">你没有权限在此聊天室启用加密。</string> <string name="room_member_open_or_create_dm">私聊消息</string> <string name="create_room_in_progress">正在创建聊天室…</string> <string name="create_room_alias_invalid">一些字符不被允许</string> <string name="create_room_alias_empty">请提供一个聊天室地址</string> <string name="create_room_alias_already_in_use">此地址已被使用</string> <string name="create_room_alias_hint">聊天室地址</string> - <string name="create_room_disable_federation_description">您可以启用此选项如果此聊天室将仅用于您的主服务器上的内部团队协作。此选项之后无法更改。</string> + <string name="create_room_disable_federation_description">你可以启用此选项如果此聊天室将仅用于你的主服务器上的内部团队协作。此选项之后无法更改。</string> <string name="create_room_disable_federation_title">屏蔽不是 %s 一部分的任何人加入此聊天室</string> <string name="hide_advanced">隐藏高级</string> <string name="show_advanced">显示高级</string> @@ -2404,14 +2404,14 @@ <string name="attachment_type_dialog_title">添加图像自</string> <string name="a11y_create_direct_message_by_qr_code">通过扫描二维码创建新的私聊对话</string> <string name="a11y_create_direct_message_by_mxid">通过 Matrix ID 创建新的私聊对话</string> - <string name="identity_server_consent_dialog_content">为发现您已知的现存联系人,您是否接受发送您的联系人数据(电话号码和/或电子邮件)到已配置的身份服务器(%1$s)? + <string name="identity_server_consent_dialog_content">为发现你已知的现存联系人,你是否接受发送你的联系人数据(电话号码和/或电子邮件)到已配置的身份服务器(%1$s)? \n \n为加强隐私,发送的数据将在发送前计算散列值。</string> <string name="identity_server_consent_dialog_title">发送电子邮件和电话号码</string> <string name="settings_discovery_consent_action_give_consent">授予许可</string> <string name="settings_discovery_consent_action_revoke">撤销我的许可</string> - <string name="settings_discovery_consent_notice_off">您尚未同意发送电子邮件和电话号码到身份服务器以从您的联系人发现其他用户。</string> - <string name="settings_discovery_consent_notice_on">您已同意发送电子邮件和电话号码到身份服务器以从您的联系人发现其他用户。</string> + <string name="settings_discovery_consent_notice_off">你尚未同意发送电子邮件和电话号码到身份服务器以从你的联系人发现其他用户。</string> + <string name="settings_discovery_consent_notice_on">你已同意发送电子邮件和电话号码到身份服务器以从你的联系人发现其他用户。</string> <string name="settings_discovery_consent_title">发送电子邮件和电话号码</string> <string name="direct_room_user_list_suggestions_title">建议</string> <string name="direct_room_user_list_contacts_title">联系人</string> @@ -2424,16 +2424,16 @@ <string name="create_room_topic_hint">主题</string> <string name="create_room_topic_section">聊天室话题(可选)</string> <string name="create_room_name_section">聊天室名称</string> - <string name="room_preview_no_preview_join">此聊天室无法预览。您想加入吗?</string> + <string name="room_preview_no_preview_join">此聊天室无法预览。你想加入吗?</string> <string name="room_preview_not_found">目前无法访问此聊天室。 -\n请稍候重试,或询问聊天室管理员以确认您是否拥有访问权限。</string> +\n请稍候重试,或询问聊天室管理员以确认你是否拥有访问权限。</string> <string name="room_alias_publish_to_directory_error">无法获取当前聊天室目录可见性(%1$s)。</string> <string name="room_alias_publish_to_directory">是否将此聊天室发布至 %1$s 的聊天室目录中?</string> <string name="room_alias_action_unpublish">取消发布此地址</string> <string name="room_alias_action_publish">发布此地址</string> <string name="room_alias_local_address_add">添加本地地址</string> <string name="room_alias_local_address_empty">此聊天室没有本地地址</string> - <string name="room_alias_local_address_subtitle">为此聊天室设置地址以便用户通过您的主服务器(%1$s)找到此聊天室</string> + <string name="room_alias_local_address_subtitle">为此聊天室设置地址以便用户通过你的主服务器(%1$s)找到此聊天室</string> <string name="room_alias_local_address_title">本地地址</string> <string name="room_alias_address_hint">新的发布的地址(例如 #alias:server)</string> <string name="room_alias_address_empty">尚无其他已发布地址。</string> @@ -2450,7 +2450,7 @@ <string name="room_permissions_change_room_name">更改聊天室名称</string> <string name="room_permissions_change_history_visibility">更改历史记录可见性</string> <string name="room_permissions_enable_room_encryption">启用聊天室加密</string> - <string name="room_permissions_change_main_address_for_the_room">更改聊天室主地址</string> + <string name="room_permissions_change_main_address_for_the_room">更改聊天室主要地址</string> <string name="room_permissions_change_room_avatar">更改聊天室头像</string> <string name="room_permissions_modify_widgets">修改挂件</string> <string name="room_permissions_notify_everyone">通知每个人</string> @@ -2461,13 +2461,13 @@ <string name="room_permissions_invite_users">邀请用户</string> <string name="room_permissions_send_messages">发送消息</string> <string name="room_permissions_default_role">默认角色</string> - <string name="room_permissions_notice_read_only">您没有权限更新更改聊天室多个部分所需角色</string> + <string name="room_permissions_notice_read_only">你没有权限更新更改聊天室多个部分所需角色</string> <string name="room_permissions_notice">选择更改聊天室各个部分所需的角色</string> <string name="room_permissions_title">权限</string> <string name="room_settings_permissions_subtitle">需要查看和更新角色以更改聊天室多个部分。</string> <string name="room_settings_permissions_title">聊天室权限</string> - <string name="room_participants_leave_private_warning">此聊天室不公开。您没有邀请将无法重新加入。</string> - <string name="call_held_by_you">您保持通话</string> + <string name="room_participants_leave_private_warning">此聊天室不公开。你没有邀请将无法重新加入。</string> + <string name="call_held_by_you">你保持通话</string> <string name="call_held_by_user">%s 保持通话</string> <string name="call_hold_action">保持</string> <string name="call_resume_action">继续</string> @@ -2487,10 +2487,10 @@ </plurals> <string name="re_authentication_activity_title">需要重新验证</string> <string name="event_status_a11y_delete_all">删除失败的消息</string> - <string name="event_status_cancel_sending_dialog_message">您确定要取消发送消息吗?</string> + <string name="event_status_cancel_sending_dialog_message">你确定要取消发送消息吗?</string> <string name="event_status_failed_messages_warning">消息发送失败</string> <string name="event_status_delete_all_failed_dialog_title">删除未发送的消息</string> - <string name="event_status_delete_all_failed_dialog_message">您确定要删除此聊天室中所有未发送的消息吗?</string> + <string name="event_status_delete_all_failed_dialog_message">你确定要删除此聊天室中所有未发送的消息吗?</string> <string name="event_status_a11y_failed">失败</string> <string name="dev_tools_success_state_event">状态事件已发送!</string> <string name="dev_tools_success_event">事件已发送!</string> @@ -2512,7 +2512,7 @@ <string name="call_transfer_users_tab_title">用户</string> <string name="call_tile_call_back">回拨</string> <string name="call_tile_other_started_call">%1$s 发起了通话</string> - <string name="call_tile_you_started_call">您发起了通话</string> + <string name="call_tile_you_started_call">你发起了通话</string> <plurals name="entries"> <item quantity="other">%d 个条目</item> </plurals> @@ -2534,11 +2534,11 @@ <string name="room_displayname_4_members">%1$s,%2$s,%3$s 和 %4$s</string> <string name="room_displayname_3_members">%1$s,%2$s 和 %3$s</string> <string name="notice_widget_jitsi_added">%1$s 发起了视频会议</string> - <string name="notice_widget_jitsi_added_by_you">您发起了视频会议</string> + <string name="notice_widget_jitsi_added_by_you">你发起了视频会议</string> <string name="notice_widget_jitsi_removed">%1$s 启用了视频会议</string> - <string name="notice_widget_jitsi_removed_by_you">您启用了视频会议</string> + <string name="notice_widget_jitsi_removed_by_you">你启用了视频会议</string> <string name="notice_widget_jitsi_modified">%1$s 修改了视频会议</string> - <string name="notice_widget_jitsi_modified_by_you">您修改了视频会议</string> + <string name="notice_widget_jitsi_modified_by_you">你修改了视频会议</string> <string name="room_settings_set_avatar">设置头像</string> <string name="room_list_quick_actions_room_settings">聊天室设置</string> <string name="room_settings_room_version_title">聊天室版本</string> @@ -2558,10 +2558,10 @@ <string name="notice_room_server_acl_updated_title_by_you">你修改了此聊天室的服务器访问控制列表。</string> <string name="notice_room_server_acl_updated_title">%s 修改了此聊天室的服务器访问控制列表。</string> <string name="notice_room_server_acl_set_title">%s 为此聊天室设置了服务器访问控制列表。</string> - <string name="notice_room_server_acl_set_title_by_you">您为此聊天室设置了服务器访问控制列表。</string> + <string name="notice_room_server_acl_set_title_by_you">你为此聊天室设置了服务器访问控制列表。</string> <string name="phone_book_perform_lookup">在 Matrix 上查找联系人</string> <string name="identity_server_user_consent_not_provided">用户尚未同意条款。</string> - <string name="user_code_info_text">分享此二维码,其他人扫描后即可添加您,并开始聊天。</string> + <string name="user_code_info_text">分享此二维码,其他人扫描后即可添加你,并开始聊天。</string> <string name="user_code_my_code">我的二维码</string> <string name="user_code_share">分享我的二维码</string> <string name="dev_tools_error_no_message_type">消息类型缺失</string> @@ -2575,4 +2575,192 @@ <string name="a11y_import_key_from_file">从文件中导入密钥</string> <string name="a11y_error_message_not_sent">发生错误,消息未能发送</string> <string name="dev_tools_form_hint_state_key">状态键</string> + <string name="this_space_has_no_rooms_admin">有些聊天室可能被隐藏,因为其为私有聊天室,你需要得到邀请。</string> + <string name="this_space_has_no_rooms_not_admin">有些聊天室可能被隐藏,因为其为私有聊天室,你需要得到邀请。 +\n你没有权限添加聊天室。</string> + <string name="this_space_has_no_rooms">此空间没有聊天室</string> + <string name="spaces_no_server_support_description">请联系你的主服务器管理员以取得进一步资讯</string> + <string name="spaces_no_server_support_title">看来你的主服务器尚未支持空间</string> + <string name="spaces_feeling_experimental_subspace">想要做点实验? +\n你可以将现有的空间添加到其他空间中。</string> + <string name="labs_space_show_orphan_in_home">实验性空间 - 仅在首页显示无人看管的聊天室</string> + <string name="space_manage_rooms_and_spaces">管理聊天室和空间</string> + <string name="space_mark_as_not_suggested">标记为不建议</string> + <string name="space_mark_as_suggested">标记为建议</string> + <string name="space_suggested">建议</string> + <string name="make_this_space_public">使此空间公开</string> + <string name="space_settings_manage_rooms">管理聊天室</string> + <string name="looking_for_someone_not_in_space">正在寻找不在 %s 中的人?</string> + <string name="user_invites_you">%s 邀请了你</string> + <string name="labs_use_restricted_join_rule_desc">警告!需要服务支持实验性聊天室版本</string> + <string name="labs_use_restricted_join_rule">实验性空间 - 受限的聊天室。</string> + <string name="you_are_invited">你被邀请</string> + <string name="create_spaces_type_header">空间是一种将聊天室和人们进行分组的新方式</string> + <string name="spaces_beta_welcome_to_spaces_desc">空间是一种将聊天室和人们进行重新分组的新方式。</string> + <string name="spaces_beta_welcome_to_spaces">欢迎来到空间!</string> + <string name="space_add_rooms">添加聊天室</string> + <string name="space_add_existing_rooms">添加现有聊天室和空间</string> + <string name="space_leave_prompt_msg_as_admin">你是此空间的管理员,请确保你在离开前已将管理权限转让给另一位成员。</string> + <string name="space_leave_prompt_msg_private">此空间并非公开空间。你将无法在没有邀请的情况下重新加入。</string> + <string name="space_leave_prompt_msg_only_you">你是这唯一的人。如果你离开,包括你在内的所有人都将无法加入此空间。</string> + <string name="space_leave_prompt_msg">你确定你想要离开此空间吗?</string> + <string name="leave_space">离开空间</string> + <string name="space_add_child_title">添加聊天室</string> + <string name="space_explore_activity_title">探索聊天室</string> + <plurals name="space_people_you_know"> + <item quantity="other">你认识的 %d 个人已加入</item> + </plurals> + <string name="suggested_rooms_pills_on_empty_header">欢迎来到 %1$s,%2$s。</string> + <string name="suggested_rooms_pills_on_empty_text">你还没有任何聊天室。下面是一些推荐的聊天室,你也可以通过右下方的按钮查看更多。</string> + <string name="room_alias_preview_not_found">此别名当前无法被访问。 +\n请稍后再试,或询问聊天室管理员你身份有权访问。</string> + <string name="join_anyway">无论以何种方式加入</string> + <string name="join_space">加入空间</string> + <string name="create_space">创建空间</string> + <string name="skip_for_now">暂且略过</string> + <string name="share_space_link_message">加入我的空间 %1$s %2$s</string> + <string name="invite_just_to_this_room_desc">他们不会成为 %s 的一部分</string> + <string name="invite_just_to_this_room">刚到此房间</string> + <string name="invite_to_space_with_name_desc">他们将可以探索 %s</string> + <string name="invite_to_space_with_name">邀请至 %s</string> + <string name="invite_by_link">分享链接</string> + <string name="invite_by_mxid">通过用户名进行邀请</string> + <string name="invite_by_email">通过电子邮件进行邀请</string> + <string name="invite_people_to_your_space_desc">此刻仅有你自己。%s 与他人一道会更好。</string> + <string name="invite_to_space">邀请至 %s</string> + <string name="invite_people_menu">邀请人们</string> + <string name="invite_people_to_your_space">邀请人们加入你的空间</string> + <string name="create_space_topic_hint">描述</string> + <string name="create_spaces_loading_message">正在创建空间……</string> + <string name="create_spaces_default_public_random_room_name">随机</string> + <string name="create_spaces_default_public_room_name">一般性</string> + <string name="create_spaces_room_private_header_desc">让我们为每个主题创建一个聊天室。你也可以稍后再进行增加,包括现有聊天室。</string> + <string name="create_spaces_room_private_header">你在做些什么?</string> + <string name="create_spaces_room_public_header_desc">我们将会为此创建聊天室。你也可以在稍后增加更多。</string> + <string name="create_spaces_room_public_header">你希望在 %s 中进行哪些讨论?</string> + <string name="create_space_error_empty_field_space_name">为它取名以继续。</string> + <string name="create_spaces_details_private_header">增加一些详细信息以帮助人们识别。你可以随时更改这些信息。</string> + <string name="create_spaces_details_public_header">增加一些详细信息以帮助其脱颖而出。你可以随时更改这些详细信息。</string> + <string name="activity_create_space_title">创建空间</string> + <string name="space_type_private_desc">仅邀请,最适合你自己或团队</string> + <string name="space_type_private">私有</string> + <string name="space_type_public_desc">对任何人开放,最适合社群</string> + <string name="space_type_public">公开</string> + <string name="create_spaces_private_teammates">供你和你的伙伴使用的私有空间</string> + <string name="create_spaces_me_and_teammates">我和伙伴</string> + <string name="create_spaces_organise_rooms">用于整理你聊天室的私有空间</string> + <string name="create_spaces_just_me">仅我</string> + <string name="create_spaces_make_sure_access">确保对的人可以访问 %s。你可以稍后进行更改。</string> + <string name="create_spaces_who_are_you_working_with">你与谁一同工作?</string> + <string name="create_spaces_join_info_help">要加入现有空间,你需要获得邀请。</string> + <string name="create_spaces_you_can_change_later">你可以稍后更改</string> + <string name="create_spaces_choose_type_label">你想要创建哪种类型的空间?</string> + <string name="your_private_space">你的私有空间</string> + <string name="your_public_space">你的公开空间</string> + <string name="add_space">添加空间</string> + <string name="command_description_leave_room">离开指定 id 的聊天室(如果为空值则为当前所处的聊天室)</string> + <string name="command_description_join_space">使用指定的 id 加入空间</string> + <string name="command_description_create_space">创建空间</string> + <string name="a11y_public_room">此聊天室为公开聊天室</string> + <string name="a11y_unchecked">未检查</string> + <string name="a11y_open_widget">开启挂件</string> + <string name="a11y_screenshot">屏幕截图</string> + <string name="template_re_authentication_default_confirm_text">${app_name} 要求你输入凭据才能执行此操作。</string> + <string name="call_transfer_failure">呼叫转移时发生错误</string> + <string name="call_transfer_consult_first">先询问</string> + <plurals name="call_one_active_and_other_paused"> + <item quantity="other">1 个通话中(%1$s) · %2$d 暂停通话</item> + </plurals> + <string name="call_dial_pad_lookup_error">查找电话号码时发生了错误</string> + <string name="call_tile_ended">此通话已结束</string> + <string name="call_tile_other_declined">%1$s 拒绝了此通话</string> + <string name="call_tile_you_declined">你拒绝了此通话 %1$s</string> + <string name="call_tile_in_call">你当前正处于此通话中</string> + <string name="warning_unsaved_change">有未保存的更改。要放弃更改吗?</string> + <string name="warning_room_not_created_yet">聊天室尚未创建。取消创建聊天室?</string> + <string name="qr_code_not_scanned">未扫描二维码!</string> + <string name="invalid_qr_code_uri">无效的二维码(无效的 URI)!</string> + <string name="cannot_dm_self">无法向你自己发送私聊消息!</string> + <string name="share_by_text">通过文字分享</string> + <string name="settings_security_pin_code_change_pin_summary">更改你当前的 PIN</string> + <string name="settings_security_pin_code_change_pin_title">更改 PIN</string> + <string name="template_invite_friends_rich_title">🔐️ 在 ${app_name} 上加入我的行列</string> + <string name="template_invite_friends_text">嗨,和我在 ${app_name} 上聊天吧:%s</string> + <string name="send_images_and_video_with_original_size">发送原始大小的媒体</string> + <plurals name="send_videos_with_original_size"> + <item quantity="other">发送原始大小的视频</item> + </plurals> + <string name="settings_server_upload_size_unknown">限制未知。</string> + <string name="settings_server_upload_size_content">你的主服务器能接受大小最大为 %s 的附件(文件、媒体等)。</string> + <string name="settings_server_upload_size_title">服务器文件上传限制</string> + <string name="error_file_too_big_simple">此文件过大,无法上传。</string> + <string name="a11y_beta">此功能仍处于测试中</string> + <string name="search_hint_room_name">搜索名称</string> + <string name="send_file_step_compressing_video">正在压缩视频 %d%%</string> + <string name="send_file_step_compressing_image">正在压缩图片……</string> + <string name="give_feedback">意见反馈</string> + <string name="feedback_failed">反馈发送失败(%s)</string> + <string name="feedback_sent">感谢,你的反馈已成功送达</string> + <string name="you_may_contact_me">如果你后续有任何问题,欢迎联系我</string> + <string name="send_feedback_space_info">你正在使用空间的测试版。你的反馈将有助于改善下一版本。我们将会记录你的平台和用户名以帮助我们尽我们所能多发挥你的反馈的作用。</string> + <string name="feedback">反馈</string> + <string name="send_feedback_space_title">空间反馈</string> + <string name="jitsi_leave_conf_to_join_another_one_content">离开当前的回忆并切换至其他会议?</string> + <string name="error_jitsi_join_conf">抱歉,在尝试加入会议时发生了错误</string> + <string name="room_settings_room_access_restricted_description">所有在此空间中的人都可以找到并加入它。仅有此聊天室的管理员可以将其添加到空间中。</string> + <string name="room_settings_room_access_restricted_title">空间</string> + <string name="room_settings_room_access_public_description">任何人都能找到聊天室并加入</string> + <string name="room_settings_room_access_public_title">公开</string> + <string name="room_settings_room_access_private_description">仅有被邀请的人才能找到并加入</string> + <string name="room_settings_room_access_private_title">私有</string> + <string name="room_settings_room_access_entry_unknown">未知的访问设置(%s)</string> + <string name="room_settings_room_access_entry_knock">任何人都可以要求加入聊天室,成员可以接受或拒绝</string> + <string name="room_settings_guest_access_title">允许访客加入</string> + <string name="use_as_default_and_do_not_ask_again">设置为默认值,并不再询问</string> + <string name="option_always_ask">总是询问</string> + <string name="spaces_header">空间</string> + <string name="spaces_invited_header">邀请</string> + <string name="settings_room_directory_show_all_rooms_summary">显示聊天室目录中的所有聊天室,包括带有脏标的聊天室。</string> + <string name="settings_room_directory_show_all_rooms">显示带有脏标的聊天室</string> + <string name="settings_category_room_directory">聊天室目录</string> + <string name="suggested_header">推荐的聊天室</string> + <string name="dialog_edit_hint">新值</string> + <string name="notice_room_canonical_alias_no_change_by_you">你更改了此聊天室的地址。</string> + <string name="notice_room_canonical_alias_no_change">%1$s 更改了此聊天室的地址。</string> + <string name="notice_room_canonical_alias_main_and_alternative_changed_by_you">你为此聊天室更改了主要和备用地址。</string> + <string name="notice_room_canonical_alias_main_and_alternative_changed">%1$s 已为此聊天室更改了主要和备用地址。</string> + <string name="notice_room_canonical_alias_alternative_changed">%1$s 更改了此聊天室的备用地址。</string> + <string name="notice_room_canonical_alias_alternative_changed_by_you">你已为此聊天室更改了备用地址。</string> + <plurals name="notice_room_canonical_alias_alternative_removed_by_you"> + <item quantity="other">你已为此聊天室移除了备用地址 %1$s。</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_removed"> + <item quantity="other">%1$s 已为此聊天室移除了备用地址 %2$s。</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_added_by_you"> + <item quantity="other">你已为此聊天室添加了备用地址 %1$s。</item> + </plurals> + <plurals name="notice_room_canonical_alias_alternative_added"> + <item quantity="other">%1$s 已为此聊天室添加了备用地址 %2$s。</item> + </plurals> + <string name="event_status_sent_message">消息已发送</string> + <string name="notice_room_server_acl_allow_is_empty">🎉 所有服务器都被禁止参与!此聊天室已无法再使用。</string> + <string name="notice_room_server_acl_updated_no_change">无更改。</string> + <string name="notice_room_server_acl_updated_ip_literals_not_allowed">• 服务器匹配 IP 常量,现已被封禁。</string> + <string name="notice_room_server_acl_updated_ip_literals_allowed">• 服务器匹配 IP 常量,现已被允许。</string> + <string name="notice_room_server_acl_updated_was_allowed">• 服务器符合 %s 已从允许列表中移除。</string> + <string name="notice_room_server_acl_updated_allowed">• 服务器符合 %s 现已被允许。</string> + <string name="notice_room_server_acl_updated_was_banned">• 服务器符合 %s 已从封禁列表中移除。</string> + <string name="unnamed_room">未命名的聊天室</string> + <string name="private_space">私有空间</string> + <string name="public_space">公开空间</string> + <string name="a11y_public_space">此空间为公开空间</string> + <string name="call_transfer_unknown_person">陌生人</string> + <string name="call_transfer_transfer_to_title">转移给 %1$s</string> + <string name="call_transfer_consulting_with">与 %1$s 商量</string> + <string name="directory_add_a_new_server_error_already_added">该服务器已经存在于列表中</string> + <string name="directory_add_a_new_server_error">找不到此服务器或它的聊天室列表</string> + <string name="directory_add_a_new_server_prompt">输入你想要探索的新服务器的名称。</string> + <string name="directory_add_a_new_server">添加一个新的服务器</string> + <string name="directory_your_server">你的服务器</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index b495cea7c9..1c67fdbbcd 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -885,7 +885,7 @@ <string name="select_room_directory">選擇一個聊天室目錄</string> <string name="directory_server_fail_to_retrieve_server">伺服器可能不可用或超載</string> <string name="directory_server_type_homeserver">輸入一個主伺服器來列出所有公開聊天室</string> - <string name="directory_server_placeholder">家伺服器 URL</string> + <string name="directory_server_placeholder">伺服器名稱</string> <string name="directory_server_all_rooms_on_server">在 %s 伺服器上的所有聊天室</string> <string name="directory_server_native_rooms">所有本地 %s 聊天室</string> <string name="lock_screen_hint">在此輸入…</string> @@ -2486,9 +2486,9 @@ <string name="room_settings_room_read_history_dialog_subtitle">對可讀取歷史紀錄的人的變更將僅試用於此聊天室中的未來訊息。現有歷史紀錄的可見性將保持不便。</string> <string name="action_unpublish">取消發佈</string> <string name="action_add">新增</string> - <string name="default_message_emote_snow">傳送雪 ❄️</string> + <string name="default_message_emote_snow">傳送下雪特效 ❄️</string> <string name="default_message_emote_confetti">傳送五彩紙屑 🎉</string> - <string name="command_snow">與雪一同傳送指定的訊息</string> + <string name="command_snow">與下雪特效一同傳送指定的訊息</string> <string name="command_confetti">與五彩紙屑一同傳送指定的訊息</string> <string name="login_clear_homeserver_history">清除歷史紀錄</string> <string name="login_social_sso">單一登入</string> @@ -2625,7 +2625,7 @@ <string name="labs_use_restricted_join_rule_desc">警告需要伺服器支援與實驗性聊天室版本</string> <string name="labs_use_restricted_join_rule">實驗性空間 - 受限制的聊天室。</string> <string name="you_are_invited">您被邀請了</string> - <string name="spaces_beta_welcome_to_spaces_desc">空間是將聊天室與夥伴依工作、娛樂或是您自己的喜好分組的方式。</string> + <string name="spaces_beta_welcome_to_spaces_desc">空間是將聊天室與人們分組的新方式。</string> <string name="spaces_beta_welcome_to_spaces">歡迎使用空間!</string> <string name="space_add_existing_rooms">新增既有的聊天室與空間</string> <string name="space_leave_prompt_msg">您確定您想要離開空間嗎?</string> @@ -2718,4 +2718,39 @@ <string name="send_file_step_compressing_image">正在壓縮圖片……</string> <string name="use_as_default_and_do_not_ask_again">預設使用,不再詢問</string> <string name="option_always_ask">總是詢問</string> + <string name="this_space_has_no_rooms_admin">有些聊天室可能是隱藏的,因為其為私人聊天室,您需要邀請。</string> + <string name="this_space_has_no_rooms_not_admin">有些聊天室可能是隱藏的,因為其為私人聊天室,您需要邀請。 +\n您沒有權限新增聊天室。</string> + <string name="this_space_has_no_rooms">此空間沒有聊天室</string> + <string name="spaces_no_server_support_description">請聯絡您的家伺服器管理員以取得進一步的資訊</string> + <string name="spaces_no_server_support_title">看來您的家伺服器尚未支援空間</string> + <string name="spaces_feeling_experimental_subspace">想要做點實驗嗎? +\n您可以將既有的空間新增至其他空間中。</string> + <string name="labs_space_show_orphan_in_home">實驗性空間,僅在首頁顯示無人看管的聊天室</string> + <string name="space_add_rooms">新增聊天室</string> + <string name="space_leave_prompt_msg_as_admin">您是此空間的管理員,請確保在您離開前已將管理權轉交給另一個成員。</string> + <string name="space_leave_prompt_msg_private">此空間並非公開。您將無法在無邀請的狀況下重新加入。</string> + <string name="space_leave_prompt_msg_only_you">您是這裡唯一的人。如果您離開,包含您在內的所有人都將無法加入。</string> + <string name="invite_to_space">邀請至 %s</string> + <string name="a11y_beta">此功能仍在測試版</string> + <string name="give_feedback">給予回饋</string> + <string name="feedback_failed">回饋傳送失敗 (%s)</string> + <string name="feedback_sent">謝謝,您的回饋已成功傳送</string> + <string name="you_may_contact_me">如果您有任何後續的問題,歡迎聯絡我</string> + <string name="send_feedback_space_info">您正在使用空間的測試版本。您的回饋有助於改善未來的版本。我們將會紀錄您的平台與使用者名稱以協助我們使用您的回饋。</string> + <string name="feedback">回饋</string> + <string name="send_feedback_space_title">空間回饋</string> + <string name="error_jitsi_join_conf">抱歉,嘗試加入會議時發生錯誤</string> + <string name="unnamed_room">未命名聊天室</string> + <string name="private_space">私人空間</string> + <string name="public_space">公開空間</string> + <string name="a11y_public_space">此空間是公開的</string> + <string name="call_transfer_unknown_person">未知的人</string> + <string name="call_transfer_transfer_to_title">轉移至 %1$s</string> + <string name="call_transfer_consulting_with">與 %1$s 進行諮詢</string> + <string name="directory_add_a_new_server_error_already_added">此伺服器已在清單中</string> + <string name="directory_add_a_new_server_error">找不到此伺服器或其聊天室清單</string> + <string name="directory_add_a_new_server_prompt">輸入您想要探索的新伺服器名稱。</string> + <string name="directory_add_a_new_server">加入新的伺服器</string> + <string name="directory_your_server">您的伺服器</string> </resources> \ No newline at end of file diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 0dbb65a138..50be146af8 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -771,6 +771,7 @@ <string name="yes">YES</string> <string name="no">NO</string> <string name="_continue">Continue</string> + <string name="continue_anyway">Continue Anyway</string> <!-- Actions --> <string name="remove">Remove</string> @@ -782,7 +783,7 @@ <string name="list_members">List members</string> <string name="open_chat_header">Open header</string> <string name="room_sync_in_progress">Syncing…</string> - <string name="room_jump_to_first_unread">Jump to first unread message.</string> + <string name="room_jump_to_first_unread">Jump to unread</string> <!-- Room Preview --> <string name="room_preview_invitation_format">You have been invited to join this room by %s</string> @@ -1413,6 +1414,8 @@ <!-- room settings : alias --> <string name="room_settings_alias_title">Room addresses</string> <string name="room_settings_alias_subtitle">See and managed addresses of this room, and its visibility in the room directory.</string> + <string name="space_settings_alias_title">Space addresses</string> + <string name="space_settings_alias_subtitle">See and managed addresses of this space.</string> <string name="room_alias_title">Room Addresses</string> <string name="room_alias_published_alias_title">Published Addresses</string> @@ -2584,6 +2587,7 @@ <string name="create_room_disable_federation_description">You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.</string> <string name="create_room_alias_hint">Room address</string> + <string name="create_space_alias_hint">Space address</string> <string name="create_room_alias_already_in_use">This address is already in use</string> <string name="create_room_alias_empty">Please provide a room address</string> <string name="create_room_alias_invalid">Some characters are not allowed</string> @@ -3400,6 +3404,10 @@ <string name="this_space_has_no_rooms_admin">Some rooms may be hidden because they’re private and you need an invite.</string> <string name="unnamed_room">Unnamed Room</string> + + <string name="teammate_spaces_arent_quite_ready">"Teammate spaces aren’t quite ready but you can still give them a try"</string> + <string name="teammate_spaces_might_not_join">"At the moment people might not be able to join any private rooms you make.\n\nWe’ll be improving this as part of the beta, but just wanted to let you know."</string> + <string name="error_failed_to_join_room">Sorry, an error occurred while trying to join: %s</string> <string name="a11y_start_voice_message">Start Voice Message</string> <string name="voice_message_slide_to_cancel">Slide to cancel</string> diff --git a/vector/src/main/res/values/styles_dial_pad.xml b/vector/src/main/res/values/styles_dial_pad.xml deleted file mode 100644 index 9a2737c0d4..0000000000 --- a/vector/src/main/res/values/styles_dial_pad.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <style name="DialpadKeyNumberStyle"> - <item name="android:textColor">?vctr_content_primary</item> - <item name="android:textSize">@dimen/dialpad_key_numbers_default_size</item> - <item name="android:fontFamily">sans-serif-light</item> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_marginBottom">@dimen/dialpad_key_number_default_margin_bottom</item> - <item name="android:gravity">center</item> - </style> -</resources> \ No newline at end of file diff --git a/vector/src/main/res/values/styles_riot.xml b/vector/src/main/res/values/styles_riot.xml deleted file mode 100644 index 56f7f95d87..0000000000 --- a/vector/src/main/res/values/styles_riot.xml +++ /dev/null @@ -1,235 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <!-- ************************ Common items ************************ --> - - <!-- toolbar styles--> - <style name="VectorToolbarStyleWithPadding" parent="Widget.MaterialComponents.Toolbar"> - <!-- main text --> - <item name="titleTextAppearance">@style/Vector.Toolbar.Title</item> - <item name="subtitleTextAppearance">@style/Vector.Toolbar.SubTitle</item> - <item name="android:background">?android:colorBackground</item> - </style> - - <style name="ActionModeTheme" parent="Widget.AppCompat.ActionMode"> - <item name="background">?android:colorBackground</item> - <item name="titleTextStyle">@style/Vector.Toolbar.Title</item> - <item name="subtitleTextStyle">@style/Vector.Toolbar.SubTitle</item> - <item name="actionMenuTextColor">?colorOnPrimary</item> - </style> - - <style name="VectorToolbarStyle" parent="VectorToolbarStyleWithPadding"> - <item name="contentInsetStartWithNavigation">0dp</item> - </style> - - <style name="Vector.Toolbar.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title"> - <item name="android:textSize">20sp</item> - <item name="android:fontFamily">"sans-serif-medium"</item> - </style> - - <style name="Vector.Toolbar.SubTitle" parent="TextAppearance.Widget.AppCompat.Toolbar.Subtitle"> - <item name="android:textSize">16sp</item> - <item name="android:fontFamily">"sans-serif"</item> - </style> - - <style name="Vector.Toolbar.Profile" parent="@style/ThemeOverlay.AppCompat.ActionBar"> - <item name="colorControlNormal">?colorSecondary</item> - </style> - - <style name="VectorAppBarLayoutStyle" parent="Widget.MaterialComponents.AppBarLayout.Primary"> - <item name="android:background">?android:colorBackground</item> - </style> - - <style name="VectorAlertDialogStyleLight" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog"> - <item name="colorPrimary">@color/palette_element_green</item> - <item name="colorSecondary">@color/palette_element_green</item> - <item name="colorSurface">@color/element_system_light</item> - <item name="colorOnSurface">@color/element_content_primary_light</item> - <item name="colorError">@color/element_alert_light</item> - <!--item name="alertDialogStyle">@style/MaterialAlertDialog.App</item> - <item name="materialAlertDialogTitleTextStyle">@style/MaterialAlertDialog.App.Title.Text</item> - <item name="buttonBarPositiveButtonStyle">@style/Widget.App.Button</item> - <item name="buttonBarNeutralButtonStyle">@style/Widget.App.Button</item--> - </style> - - <style name="VectorAlertDialogStyleDark" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog"> - <item name="colorPrimary">@color/palette_element_green</item> - <item name="colorSecondary">@color/palette_element_green</item> - <item name="colorSurface">@color/element_system_dark</item> - <item name="colorOnSurface">@color/element_content_primary_dark</item> - <item name="colorError">@color/element_alert_dark</item> - <!--item name="alertDialogStyle">@style/MaterialAlertDialog.App</item> - <item name="materialAlertDialogTitleTextStyle">@style/MaterialAlertDialog.App.Title.Text</item> - <item name="buttonBarPositiveButtonStyle">@style/Widget.App.Button</item> - <item name="buttonBarNeutralButtonStyle">@style/Widget.App.Button</item--> - </style> - - <!-- TextInputLayout --> - <style name="VectorTextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox" /> - - <style name="Vector.PopupMenuBase" parent="Widget.AppCompat.PopupMenu"> - <item name="android:textColor">?vctr_content_primary</item> - <item name="android:textSize">16sp</item> - <item name="android:dropDownHorizontalOffset">0dp</item> - <item name="android:dropDownVerticalOffset">0dp</item> - </style> - - <!-- actionbar icons color --> - <style name="Vector.ActionBarTheme" parent="ThemeOverlay.MaterialComponents.ActionBar"> - <item name="colorControlNormal">?vctr_content_primary</item> - </style> - - <!-- custom action bar --> - <style name="Vector.Styled.ActionBar" parent="Widget.MaterialComponents.Toolbar"> - <item name="android:background">?colorPrimary</item> - <item name="background">?colorPrimary</item> - - <!-- remove shadow under the action bar --> - <item name="elevation">0dp</item> - - <!-- main text --> - <item name="titleTextStyle">@style/ActionBarTitleText</item> - - <!-- sub text --> - <item name="subtitleTextStyle">@style/ActionBarSubTitleText</item> - </style> - - <!-- main text --> - <style name="ActionBarTitleText" parent="TextAppearance.AppCompat.Widget.ActionBar.Title"> - <item name="android:textColor">?vctr_content_primary</item> - <item name="android:fontFamily">"sans-serif-medium"</item> - <item name="android:textSize">20sp</item> - </style> - - <!-- sub text --> - <style name="ActionBarSubTitleText" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle"> - <item name="android:textColor">?vctr_content_primary</item> - <item name="android:fontFamily">"sans-serif-medium"</item> - <item name="android:textSize">12sp</item> - </style> - - <!-- Styles for login screen --> - <style name="LoginEditTextStyle" parent="Widget.AppCompat.EditText"> - <item name="android:textSize">16sp</item> - </style> - - - <style name="VectorSearchView" parent="Widget.AppCompat.SearchView"> - <item name="searchIcon">@drawable/ic_search</item> - <item name="closeIcon">@drawable/ic_x_gray</item> - <item name="iconifiedByDefault">false</item> - </style> - - <!-- BottomSheet theming --> - <style name="Vector.BottomSheet.Light" parent="Theme.MaterialComponents.Light.BottomSheetDialog"> - <item name="colorPrimary">@color/element_accent_light</item> - <item name="colorSecondary">@color/palette_element_green</item> - <item name="colorSurface">@color/element_background_light</item> - <item name="colorOnSurface">@color/element_content_primary_light</item> - <item name="colorError">@color/element_alert_light</item> - <!-- Default color for text View --> - <item name="android:textColorTertiary">@color/element_content_primary_light</item> - <item name="android:textColorLink">@color/element_link_light</item> - </style> - - <style name="Vector.BottomSheet.Dark" parent="Theme.MaterialComponents.BottomSheetDialog"> - <item name="colorPrimary">@color/element_accent_dark</item> - <item name="colorSecondary">@color/palette_element_green</item> - <item name="colorSurface">@color/element_background_dark</item> - <item name="colorOnSurface">@color/element_content_primary_dark</item> - <item name="colorError">@color/element_alert_dark</item> - <!-- Default color for text View --> - <item name="android:textColorTertiary">@color/element_content_primary_dark</item> - <item name="android:textColorLink">@color/element_link_dark</item> - </style> - - <style name="Vector.BottomSheet.Black" parent="Vector.BottomSheet.Dark"> - <item name="colorSurface">@color/element_background_black</item> - </style> - - <style name="TimelineContentStubBaseParams"> - <item name="android:layout_width">match_parent</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_marginStart">8dp</item> - <item name="android:layout_marginLeft">8dp</item> - <item name="android:layout_marginEnd">8dp</item> - <item name="android:layout_marginRight">8dp</item> - <item name="android:layout_marginBottom">4dp</item> - <item name="android:layout_marginTop">4dp</item> - </style> - - <style name="VectorLabel"> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_width">wrap_content</item> - <item name="android:paddingLeft">12dp</item> - <item name="android:paddingRight">12dp</item> - <item name="android:paddingTop">4dp</item> - <item name="android:paddingBottom">4dp</item> - <item name="android:textSize">15sp</item> - <item name="android:textColor">?vctr_fab_label_color</item> - <item name="android:background">@drawable/vector_label_background</item> - </style> - - <style name="BottomSheetItemTextMain"> - <item name="android:fontFamily">sans-serif-medium</item> - <item name="android:layout_width">0dp</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_weight">1</item> - <item name="android:ellipsize">end</item> - <item name="android:lines">1</item> - <item name="android:textColor">?vctr_content_primary</item> - <item name="android:textSize">16sp</item> - </style> - - <style name="BottomSheetItemTextSecondary"> - <item name="android:fontFamily">sans-serif</item> - <item name="android:layout_width">0dp</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_weight">1</item> - <item name="android:ellipsize">end</item> - <item name="android:maxLines">2</item> - <item name="android:textColor">?vctr_content_secondary</item> - <item name="android:textSize">14sp</item> - </style> - - <style name="BottomSheetItemTime"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:lines">1</item> - <item name="android:textColor">?vctr_content_secondary</item> - <item name="android:textSize">12sp</item> - </style> - - - <style name="AttachmentTypeSelectorButton"> - <item name="android:layout_width">56dp</item> - <item name="android:layout_height">56dp</item> - <item name="android:scaleType">center</item> - </style> - - <style name="AttachmentTypeSelectorLabel"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:textColor">?vctr_content_primary</item> - <item name="android:textSize">14sp</item> - <item name="android:layout_marginTop">8dp</item> - </style> - - <style name="FileProgressBar" parent="android:Widget.ProgressBar.Horizontal"> - <item name="android:indeterminateOnly">false</item> - <item name="android:progressDrawable">@drawable/file_progress_bar</item> - <item name="android:minHeight">10dp</item> - <item name="android:maxHeight">40dp</item> - </style> - - <style name="ComposerEditTextStyle" parent="Widget.AppCompat.EditText"> - <item name="android:background">@android:color/transparent</item> - <item name="android:inputType">textCapSentences|textMultiLine</item> - <item name="android:maxLines">12</item> - <item name="android:minHeight">48dp</item> - <item name="android:padding">8dp</item> - <item name="android:textSize">15sp</item> - <item name="android:textColor">?vctr_message_text_color</item> - </style> - -</resources> \ No newline at end of file diff --git a/vector/src/main/res/values/text_appearances.xml b/vector/src/main/res/values/text_appearances.xml deleted file mode 100644 index 750dcaf10e..0000000000 --- a/vector/src/main/res/values/text_appearances.xml +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ Copyright 2019 New Vector Ltd - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android"> - - <style name="TextAppearance.Vector.Title" parent="TextAppearance.AppCompat"> - <item name="android:textSize">16sp</item> - <item name="android:fontFamily">sans-serif-medium</item> - <item name="android:textStyle">normal</item> - <item name="android:textColor">?vctr_content_primary</item> - </style> - - <style name="TextAppearance.Vector.Subtitle" parent="TextAppearance.AppCompat"> - <item name="android:textSize">14sp</item> - <item name="android:fontFamily">sans-serif</item> - <item name="android:textStyle">normal</item> - <item name="android:textColor">?vctr_content_secondary</item> - </style> - - <style name="TextAppearance.Vector.Subtitle2" parent="TextAppearance.AppCompat"> - <item name="android:textSize">14sp</item> - <item name="android:fontFamily">sans-serif-medium</item> - <item name="android:textStyle">normal</item> - <item name="android:textColor">?vctr_content_secondary</item> - </style> - - <style name="TextAppearance.Vector.Login.Title" parent="TextAppearance.AppCompat"> - <item name="android:textSize">20sp</item> - <item name="android:fontFamily">sans-serif-medium</item> - <item name="android:textStyle">bold</item> - <item name="android:textColor">?vctr_content_primary</item> - </style> - - <style name="TextAppearance.Vector.Login.Title.Small"> - <item name="android:textSize">15sp</item> - </style> - - <style name="TextAppearance.Vector.Login.Text" parent="TextAppearance.AppCompat"> - <item name="android:textSize">16sp</item> - <item name="android:fontFamily">sans-serif</item> - <item name="android:textStyle">normal</item> - <item name="android:textColor">?vctr_content_secondary</item> - </style> - - <style name="TextAppearance.Vector.Login.Text.Small"> - <item name="android:textSize">12sp</item> - <item name="android:textColor">?vctr_content_secondary</item> - </style> - -</resources> \ No newline at end of file