Merge remote-tracking branch 'origin/master' into nheko_loading_spinner

pull/646/head
Joseph Donofry 3 years ago
commit 1d204ce94c
No known key found for this signature in database
GPG Key ID: E8A1D78EF044B0CB
  1. 20
      .gitlab-ci.yml
  2. 3
      AppImageBuilder.yml
  3. 138
      CMakeLists.txt
  4. 23
      README.md
  5. 4
      appveyor.yml
  6. 3
      cmake/nheko.h
  7. 51
      io.github.NhekoReborn.Nheko.yaml
  8. 1
      resources/icons/ui/user-friends-solid.svg
  9. 508
      resources/langs/nheko_cs.ts
  10. 613
      resources/langs/nheko_de.ts
  11. 512
      resources/langs/nheko_el.ts
  12. 540
      resources/langs/nheko_en.ts
  13. 1058
      resources/langs/nheko_eo.ts
  14. 524
      resources/langs/nheko_es.ts
  15. 550
      resources/langs/nheko_et.ts
  16. 638
      resources/langs/nheko_fi.ts
  17. 546
      resources/langs/nheko_fr.ts
  18. 550
      resources/langs/nheko_hu.ts
  19. 723
      resources/langs/nheko_it.ts
  20. 524
      resources/langs/nheko_ja.ts
  21. 516
      resources/langs/nheko_ml.ts
  22. 512
      resources/langs/nheko_nl.ts
  23. 524
      resources/langs/nheko_pl.ts
  24. 2713
      resources/langs/nheko_pt_BR.ts
  25. 508
      resources/langs/nheko_pt_PT.ts
  26. 524
      resources/langs/nheko_ro.ts
  27. 738
      resources/langs/nheko_ru.ts
  28. 504
      resources/langs/nheko_si.ts
  29. 546
      resources/langs/nheko_sv.ts
  30. 514
      resources/langs/nheko_zh_CN.ts
  31. 3
      resources/qml/Avatar.qml
  32. 45
      resources/qml/ChatPage.qml
  33. 160
      resources/qml/CommunitiesList.qml
  34. 2
      resources/qml/ElidedLabel.qml
  35. 1
      resources/qml/ImageButton.qml
  36. 3
      resources/qml/MatrixText.qml
  37. 24
      resources/qml/MessageView.qml
  38. 38
      resources/qml/RoomList.qml
  39. 2
      resources/qml/Root.qml
  40. 78
      resources/qml/TimelineView.qml
  41. 20
      resources/qml/components/AdaptiveLayout.qml
  42. 6
      resources/qml/components/AdaptiveLayoutElement.qml
  43. 9
      resources/qml/delegates/MessageDelegate.qml
  44. 1
      resources/qml/delegates/Reply.qml
  45. 1
      resources/qml/device-verification/Success.qml
  46. 4
      resources/qml/dialogs/InputDialog.qml
  47. 422
      resources/qml/emoji/EmojiPicker.qml
  48. 1
      resources/res.qrc
  49. 506
      src/Cache.cpp
  50. 6
      src/Cache.h
  51. 4
      src/CacheStructs.h
  52. 89
      src/Cache_p.h
  53. 6
      src/ChatPage.cpp
  54. 13
      src/LoginPage.cpp
  55. 9
      src/Olm.cpp
  56. 2
      src/Olm.h
  57. 145
      src/RegisterPage.cpp
  58. 6
      src/RegisterPage.h
  59. 37
      src/UserSettingsPage.cpp
  60. 12
      src/UserSettingsPage.h
  61. 7
      src/Utils.cpp
  62. 4
      src/Utils.h
  63. 3
      src/WebRTCSession.cpp
  64. 39
      src/main.cpp
  65. 118
      src/timeline/CommunitiesModel.cpp
  66. 24
      src/timeline/CommunitiesModel.h
  67. 62
      src/timeline/EventStore.cpp
  68. 2
      src/timeline/EventStore.h
  69. 2
      src/timeline/InputBar.cpp
  70. 364
      src/timeline/RoomlistModel.cpp
  71. 35
      src/timeline/RoomlistModel.h
  72. 49
      src/timeline/TimelineModel.cpp
  73. 12
      src/timeline/TimelineModel.h
  74. 38
      src/timeline/TimelineViewManager.cpp
  75. 2
      src/ui/RoomSettings.cpp
  76. 2
      src/ui/Theme.cpp
  77. 8
      src/ui/UserProfile.cpp
  78. 1
      third_party/SingleApplication-3.3.0/.github/FUNDING.yml
  79. 56
      third_party/SingleApplication-3.3.0/.github/workflows/build-cmake.yml
  80. 0
      third_party/SingleApplication-3.3.0/.gitignore
  81. 6
      third_party/SingleApplication-3.3.0/CHANGELOG.md
  82. 0
      third_party/SingleApplication-3.3.0/CMakeLists.txt
  83. 0
      third_party/SingleApplication-3.3.0/LICENSE
  84. 0
      third_party/SingleApplication-3.3.0/README.md
  85. 0
      third_party/SingleApplication-3.3.0/SingleApplication
  86. 0
      third_party/SingleApplication-3.3.0/Windows.md
  87. 12
      third_party/SingleApplication-3.3.0/examples/basic/CMakeLists.txt
  88. 5
      third_party/SingleApplication-3.3.0/examples/basic/basic.pro
  89. 10
      third_party/SingleApplication-3.3.0/examples/basic/main.cpp
  90. 21
      third_party/SingleApplication-3.3.0/examples/calculator/CMakeLists.txt
  91. 73
      third_party/SingleApplication-3.3.0/examples/calculator/button.cpp
  92. 68
      third_party/SingleApplication-3.3.0/examples/calculator/button.h
  93. 406
      third_party/SingleApplication-3.3.0/examples/calculator/calculator.cpp
  94. 117
      third_party/SingleApplication-3.3.0/examples/calculator/calculator.h
  95. 11
      third_party/SingleApplication-3.3.0/examples/calculator/calculator.pro
  96. 71
      third_party/SingleApplication-3.3.0/examples/calculator/main.cpp
  97. 20
      third_party/SingleApplication-3.3.0/examples/sending_arguments/CMakeLists.txt
  98. 28
      third_party/SingleApplication-3.3.0/examples/sending_arguments/main.cpp
  99. 12
      third_party/SingleApplication-3.3.0/examples/sending_arguments/messagereceiver.cpp
  100. 15
      third_party/SingleApplication-3.3.0/examples/sending_arguments/messagereceiver.h
  101. Some files were not shown because too many files have changed in this diff Show More

@ -27,20 +27,21 @@ build-gcc7:
- update-alternatives --install /usr/bin/g++ g++ "/usr/bin/${CXX}" 10
- update-alternatives --set gcc "/usr/bin/${CC}"
- update-alternatives --set g++ "/usr/bin/${CXX}"
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH="/usr/lib/ccache:${PATH}"
- export CMAKE_BUILD_PARALLEL_LEVEL=$(cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l)
- export PATH="/usr/local/bin/:${PATH}"
- . "/opt/qt${QT_PKG}/bin/qt${QT_PKG}-env.sh" || true
- mkdir -p .deps/usr .hunter
- mkdir -p build
- cmake -GNinja -H. -Bbuild
-DCMAKE_INSTALL_PREFIX=.deps/usr
-DHUNTER_ROOT=".hunter"
-DHUNTER_ROOT="../.hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
-DCI_BUILD=ON
- cmake --build build
after_script:
- mv ../.hunter .hunter
cache:
key: "$CI_JOB_NAME"
paths:
@ -55,13 +56,14 @@ build-macos:
- brew reinstall --force python3
- brew bundle --file=./.ci/macos/Brewfile --force --cleanup
- pip3 install dmgbuild
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH=/usr/local/opt/qt/bin/:${PATH}
- export CMAKE_PREFIX_PATH=/usr/local/opt/qt5
- cmake -GNinja -H. -Bbuild
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DCMAKE_INSTALL_PREFIX=.deps/usr
-DHUNTER_ROOT=".hunter"
-DHUNTER_ROOT="../.hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DHUNTER_CONFIGURATION_TYPES=RelWithDebInfo
-DUSE_BUNDLED_OPENSSL=ON
@ -69,6 +71,7 @@ build-macos:
-DCI_BUILD=ON
- cmake --build build
after_script:
- mv ../.hunter .hunter
- ./.ci/macos/deploy.sh
- ./.ci/upload-nightly-gitlab.sh artifacts/nheko-${CI_COMMIT_SHORT_SHA}.dmg
artifacts:
@ -143,7 +146,7 @@ linting:
image: alpine:latest
tags: [docker]
before_script:
- apk update && apk add clang make git python3 py3-pip
- apk update && apk add clang-extra-tools make git python3 py3-pip
- export PATH="$PATH:/root/.local/bin"
- pip3 install --user reuse
script:
@ -164,7 +167,7 @@ appimage-amd64:
# update appimage-builder (optional)
- pip3 install --upgrade git+https://www.opencode.net/azubieta/appimagecraft.git
- apt-get install -y qt5-default qtdeclarative5-dev qttools5-dev qtscript5-dev qtquickcontrols2-5-dev qtmultimedia5-dev libqt5svg5-dev liblmdb-dev libssl-dev git ninja-build qt5keychain-dev libgtest-dev ccache
- apt-get install -y qt5-default qtdeclarative5-dev qttools5-dev qtscript5-dev qtquickcontrols2-5-dev qtmultimedia5-dev libqt5svg5-dev liblmdb-dev libssl-dev git ninja-build qt5keychain-dev libgtest-dev ccache libevent-dev libcurl4-openssl-dev
- wget https://github.com/Kitware/CMake/releases/download/v3.19.0/cmake-3.19.0-Linux-x86_64.sh && sh cmake-3.19.0-Linux-x86_64.sh --skip-license --prefix=/usr/local
- /usr/sbin/update-ccache-symlinks
script:
@ -174,7 +177,6 @@ appimage-amd64:
-DHUNTER_ROOT=".hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF
-DHUNTER_CONFIGURATION_TYPES=Release
-DUSE_BUNDLED_BOOST=ON
-DUSE_BUNDLED_SPDLOG=ON
-DUSE_BUNDLED_OLM=ON
-DUSE_BUNDLED_GTEST=OFF
@ -184,8 +186,10 @@ appimage-amd64:
-DUSE_BUNDLED_MTXCLIENT=ON
-DUSE_BUNDLED_LMDB=OFF
-DUSE_BUNDLED_LMDBXX=ON
-DUSE_BUNDLED_TWEENY=ON
-DUSE_BUNDLED_QTKEYCHAIN=OFF
-DUSE_BUNDLED_LIBEVENT=OFF
-DUSE_BUNDLED_LIBCURL=OFF
-DUSE_BUNDLED_COEURL=ON
- DESTDIR=`pwd`/AppDir ninja -C build install/local
- DESTDIR=`pwd`/AppDir ninja -C build _deps/cmark-build/src/install
- mkdir -p AppDir/usr/lib/x86_64-linux-gnu AppDir/lib/x86_64-linux-gnu

@ -38,8 +38,11 @@ AppDir:
- kimageformat-plugins
- libbs2b0
- libbz2-1.0
- libcurl4
- libelf1
- libexpat1
- libevent-core-2.1-6
- libevent-pthreads-2.1-6
- libhogweed4
- libjpeg-turbo8
- libkf5archive5

@ -18,29 +18,24 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "compile as PIC by default")
option(HUNTER_ENABLED "Enable Hunter package manager" OFF)
include("cmake/HunterGate.cmake")
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.23.288.tar.gz"
SHA1 "6c9b2bc606d86ae31f96a62fc68f0a593024815b"
)
URL "https://github.com/cpp-pm/hunter/archive/v0.23.305.tar.gz"
SHA1 "fc8d7a6dac2fa23681847b3872d88d3839b657b0"
)
option(USE_BUNDLED_BOOST "Use the bundled version of Boost." ${HUNTER_ENABLED})
option(USE_BUNDLED_SPDLOG "Use the bundled version of spdlog."
${HUNTER_ENABLED})
option(USE_BUNDLED_SPDLOG "Use the bundled version of spdlog." ${HUNTER_ENABLED})
option(USE_BUNDLED_OLM "Use the bundled version of libolm." ${HUNTER_ENABLED})
option(USE_BUNDLED_GTEST "Use the bundled version of Google Test."
${HUNTER_ENABLED})
option(USE_BUNDLED_CMARK "Use the bundled version of cmark."
${HUNTER_ENABLED})
option(USE_BUNDLED_JSON "Use the bundled version of nlohmann json."
${HUNTER_ENABLED})
option(USE_BUNDLED_OPENSSL "Use the bundled version of OpenSSL."
OFF)
option(USE_BUNDLED_GTEST "Use the bundled version of Google Test." ${HUNTER_ENABLED})
option(USE_BUNDLED_CMARK "Use the bundled version of cmark." ${HUNTER_ENABLED})
option(USE_BUNDLED_JSON "Use the bundled version of nlohmann json." ${HUNTER_ENABLED})
option(USE_BUNDLED_OPENSSL "Use the bundled version of OpenSSL." OFF)
option(USE_BUNDLED_MTXCLIENT "Use the bundled version of the Matrix Client library." ${HUNTER_ENABLED})
option(USE_BUNDLED_LMDB "Use the bundled version of lmdb."
${HUNTER_ENABLED})
option(USE_BUNDLED_LMDBXX "Use the bundled version of lmdb++."
${HUNTER_ENABLED})
option(USE_BUNDLED_QTKEYCHAIN "Use the bundled version of Qt5Keychain."
option(USE_BUNDLED_LMDB "Use the bundled version of lmdb." ${HUNTER_ENABLED})
option(USE_BUNDLED_LMDBXX "Use the bundled version of lmdb++." ${HUNTER_ENABLED})
option(USE_BUNDLED_QTKEYCHAIN "Use the bundled version of Qt5Keychain." ${HUNTER_ENABLED})
option(USE_BUNDLED_COEURL "Use a bundled version of the Curl wrapper"
${HUNTER_ENABLED})
option(USE_BUNDLED_LIBEVENT "Use the bundled version of spdlog." ${HUNTER_ENABLED})
option(USE_BUNDLED_LIBCURL "Use the bundled version of spdlog." ${HUNTER_ENABLED})
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
@ -119,6 +114,38 @@ if (BUILD_DOCS)
endif (DOXYGEN_FOUND)
endif()
#
## coeurl
#
## Need to repeat all libevent deps?!?
if (USE_BUNDLED_LIBEVENT)
hunter_add_package(Libevent)
find_package(Libevent CONFIG REQUIRED)
else()
find_package(PkgConfig REQUIRED)
pkg_check_modules(libevent_core REQUIRED IMPORTED_TARGET libevent_core)
if (WIN32)
pkg_check_modules(libevent_windows REQUIRED IMPORTED_TARGET libevent_windows)
else()
pkg_check_modules(libevent_pthreads REQUIRED IMPORTED_TARGET
libevent_pthreads)
endif()
endif()
# curl
if (USE_BUNDLED_LIBCURL)
hunter_add_package(CURL)
find_package(CURL CONFIG REQUIRED)
else()
find_package(PkgConfig REQUIRED)
pkg_check_modules(libcurl REQUIRED IMPORTED_TARGET libcurl)
endif()
# spdlog
if(USE_BUNDLED_SPDLOG)
hunter_add_package(spdlog)
endif()
find_package(spdlog 1.0.0 CONFIG REQUIRED)
#
# LMDB
@ -137,7 +164,7 @@ endif()
#
# Discover Qt dependencies.
#
find_package(Qt5 COMPONENTS Core Widgets LinguistTools Concurrent Svg Multimedia Qml QuickControls2 QuickWidgets REQUIRED)
find_package(Qt5 5.12 COMPONENTS Core Widgets LinguistTools Concurrent Svg Multimedia Qml QuickControls2 QuickWidgets REQUIRED)
find_package(Qt5QuickCompiler)
find_package(Qt5DBus)
@ -156,7 +183,7 @@ if (USE_BUNDLED_QTKEYCHAIN)
set(BUILD_TEST_APPLICATION OFF CACHE INTERNAL "")
FetchContent_MakeAvailable(qt5keychain)
else()
find_package(Qt5Keychain REQUIRED)
find_package(Qt5Keychain REQUIRED)
endif()
if (APPLE)
@ -238,7 +265,10 @@ set(PROJECT_VERSION ${CPACK_PACKAGE_VERSION})
message(STATUS "Version: ${PROJECT_VERSION}")
cmake_host_system_information(RESULT BUILD_HOST QUERY HOSTNAME)
set(BUILD_USER $ENV{USER})
include(CheckSymbolExists)
check_symbol_exists(backtrace_symbols_fd "execinfo.h" HAVE_BACKTRACE_SYMBOLS_FD)
configure_file(cmake/nheko.h config/nheko.h)
@ -261,7 +291,7 @@ set(SRC_FILES
# Emoji
src/emoji/EmojiModel.cpp
src/emoji/Provider.cpp
src/emoji/Provider.cpp
# Timeline
@ -301,8 +331,8 @@ set(SRC_FILES
src/ui/ToggleButton.cpp
src/ui/UserProfile.cpp
# Generic notification stuff
src/notifications/Manager.cpp
# Generic notification stuff
src/notifications/Manager.cpp
src/AvatarProvider.cpp
src/BlurhashProvider.cpp
@ -339,13 +369,6 @@ set(SRC_FILES
include(FeatureSummary)
if(USE_BUNDLED_BOOST)
hunter_add_package(Boost COMPONENTS iostreams system thread)
endif()
find_package(Boost 1.70 REQUIRED
COMPONENTS iostreams
system
thread)
if(USE_BUNDLED_OPENSSL)
hunter_add_package(OpenSSL)
@ -356,7 +379,7 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare(
MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
GIT_TAG 5d2f055ea9403770039ddf66b1900f890cd5cde7
GIT_TAG 9ecaefe377d4dab688caee186e4a263cb7f105e8
)
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
@ -369,7 +392,7 @@ if(USE_BUNDLED_OLM)
FetchContent_Declare(
Olm
GIT_REPOSITORY https://gitlab.matrix.org/matrix-org/olm.git
GIT_TAG 3.1.4
GIT_TAG 3.2.4
)
set(OLM_TESTS OFF CACHE INTERNAL "")
FetchContent_MakeAvailable(Olm)
@ -417,10 +440,10 @@ set_package_properties(nlohmann_json PROPERTIES
if(USE_BUNDLED_LMDBXX)
include(FetchContent)
FetchContent_Declare(
lmdbxx
URL "https://raw.githubusercontent.com/hoytech/lmdbxx/1.0.0/lmdb++.h"
DOWNLOAD_NO_EXTRACT TRUE
)
lmdbxx
URL "https://raw.githubusercontent.com/hoytech/lmdbxx/1.0.0/lmdb++.h"
DOWNLOAD_NO_EXTRACT TRUE
)
if(NOT lmdbxx_POPULATED)
FetchContent_Populate(lmdbxx)
endif()
@ -458,7 +481,7 @@ endif()
# single instance functionality
set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication")
add_subdirectory(third_party/SingleApplication-3.2.0-dc8042b/)
add_subdirectory(third_party/SingleApplication-3.3.0/)
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
@ -587,6 +610,10 @@ if(WIN32)
target_compile_definitions(nheko PRIVATE _WIN32_WINNT=0x0601)
else()
add_executable (nheko ${OS_BUNDLE} ${NHEKO_DEPS})
if (HAVE_BACKTRACE_SYMBOLS_FD AND NOT CMAKE_BUILD_TYPE STREQUAL "Release")
set_target_properties(nheko PROPERTIES ENABLE_EXPORTS ON)
endif()
endif()
if(APPLE)
@ -604,14 +631,11 @@ target_include_directories(nheko PRIVATE src includes third_party/blurhash third
# Fixup bundled keychain include dirs
if (USE_BUNDLED_QTKEYCHAIN)
target_include_directories(nheko PRIVATE ${qt5keychain_SOURCE_DIR} ${qt5keychain_BINARY_DIR})
target_include_directories(nheko PRIVATE ${qt5keychain_SOURCE_DIR} ${qt5keychain_BINARY_DIR})
endif()
target_link_libraries(nheko PRIVATE
MatrixClient::MatrixClient
Boost::iostreams
Boost::system
Boost::thread
cmark::cmark
spdlog::spdlog
Qt5::Widgets
@ -628,11 +652,11 @@ target_link_libraries(nheko PRIVATE
SingleApplication::SingleApplication)
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0")
target_precompile_headers(nheko
PRIVATE
<string>
<algorithm>
)
target_precompile_headers(nheko
PRIVATE
<string>
<algorithm>
)
endif()
if (TARGET PkgConfig::GSTREAMER)
@ -644,6 +668,24 @@ if (TARGET PkgConfig::GSTREAMER)
endif()
endif()
if(USE_BUNDLED_COEURL)
include(FetchContent)
FetchContent_Declare(
coeurl
GIT_REPOSITORY https://nheko.im/Nheko-Reborn/coeurl.git
GIT_TAG 417821a07cfe4429b08a2efed5e480a498087afd
)
FetchContent_MakeAvailable(coeurl)
target_link_libraries(nheko PUBLIC coeurl::coeurl)
elseif(coeurl_DIR)
find_package(coeurl CONFIG REQUIRED)
target_link_libraries(nheko PUBLIC coeurl::coeurl)
else()
find_package(PkgConfig REQUIRED)
pkg_check_modules(coeurl REQUIRED IMPORTED_TARGET coeurl)
target_link_libraries(nheko PUBLIC PkgConfig::coeurl)
endif()
if(MSVC)
target_link_libraries(nheko PRIVATE ntdll)
endif()

@ -19,9 +19,10 @@ Help us with translations so as many people as possible will be able to use nhek
### Note regarding End-to-End encryption
Currently the implementation is at best a **proof of concept** and it should only be used for
testing purposes. Most importantly, it is missing device verification, so while your messages
and media are encrypted, nheko doesn't verify who gets the messages.
The current implementation works in most cases, but you may need to bootstrap
your cross-signing keys in a different client. The implementation may also still
have bugs, so don't rely on it for security. Online keybackup isn't supported,
but you can use offline keybackup. Most other cases should be fine though.
## Features
@ -114,6 +115,15 @@ with [homebrew](https://brew.sh/):
```sh
brew install --cask nheko
```
#### Windows
with [Chocolatey](https://chocolatey.org/):
```posh
choco install nheko-reborn
```
### FAQ
##
@ -127,10 +137,10 @@ brew install --cask nheko
- Qt5 (5.12 or greater). Required for overlapping hover handlers in Qml.
- CMake 3.15 or greater. (Lower version may work, but may break boost linking)
- [mtxclient](https://github.com/Nheko-Reborn/mtxclient)
- [coeurl](https://nheko.im/nheko-reborn/coeurl)
- [LMDB](https://symas.com/lightning-memory-mapped-database/)
- [lmdb++](https://github.com/hoytech/lmdbxx)
- [cmark](https://github.com/commonmark/cmark) 0.29 or greater.
- Boost 1.70 or greater.
- [libolm](https://gitlab.matrix.org/matrix-org/olm)
- [spdlog](https://github.com/gabime/spdlog)
- [GStreamer](https://gitlab.freedesktop.org/gstreamer) 1.18.0 or greater (optional, needed for VoIP support).
@ -154,7 +164,6 @@ If you experience build issues and you are trying to link `mtxclient` library wi
The bundle flags are currently:
- USE_BUNDLED_BOOST
- USE_BUNDLED_SPDLOG
- USE_BUNDLED_OLM
- USE_BUNDLED_GTEST
@ -164,7 +173,9 @@ The bundle flags are currently:
- USE_BUNDLED_MTXCLIENT
- USE_BUNDLED_LMDB
- USE_BUNDLED_LMDBXX
- USE_BUNDLED_TWEENY
- USE_BUNDLED_COEURL
- USE_BUNDLED_LIBCURL
- USE_BUNDLED_LIBEVENT
A note on bundled OpenSSL: You need to explicitly enable it and it will not be using your system certificate directory by default, if you enable it. You need to override that at runtime with the SSL_CERT_FILE variable. On Windows it will still be using your system certificates though, since it loads them from the system store instead of the OpenSSL directory.

@ -15,8 +15,8 @@ environment:
cache:
- c:\hunter\ -> appveyor.yml
- build\_deps -> appveyor.yml
- c:\hunter\ -> appveyor.yml, CMakeLists.txt
- build\_deps -> appveyor.yml, CMakeLists.txt
build:
verbosity: minimal

@ -1,6 +1,7 @@
namespace nheko {
constexpr auto version = "${PROJECT_VERSION}";
constexpr auto build_user = "${BUILD_USER}@${BUILD_HOST}";
constexpr auto build_os = "${CMAKE_HOST_SYSTEM_NAME}";
constexpr auto enable_debug_log = ${SPDLOG_DEBUG_ON};
}
# cmakedefine01 HAVE_BACKTRACE_SYMBOLS_FD

@ -16,7 +16,9 @@ finish-args:
- --socket=wayland
- --socket=x11
- --talk-name=org.freedesktop.Notifications
- --talk-name=org.kde.StatusNotifierWatcher
- --talk-name=org.freedesktop.secrets
- --talk-name=org.freedesktop.StatusNotifierItem
- --talk-name=org.kde.*
cleanup:
- /include
- /bin/mdb*
@ -35,6 +37,19 @@ modules:
- prefix=/app
no-autogen: true
subdir: libraries/liblmdb
- name: libevent
buildsystem: autotools
config-opts:
- --disable-shared
- --prefix=/app
- --disable-openssl
sources:
- sha256: 92e6de1be9ec176428fd2367677e61ceffc2ee1cb119035037a27d346b0403bb
type: archive
url: https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
make-install-args:
- prefix=/app
no-autogen: true
- name: cmark
buildsystem: cmake-ninja
builddir: true
@ -61,9 +76,9 @@ modules:
buildsystem: cmake-ninja
name: olm
sources:
- commit: 6753595300767dd70150831dbbe6f92d64e75038
- commit: 64afab93645957846d936a19b8501dbd3f2cc4a1
disable-shallow-clone: true
tag: 3.1.4
tag: 3.2.4
type: git
url: https://gitlab.matrix.org/matrix-org/olm.git
- config-opts:
@ -85,16 +100,6 @@ modules:
- sha256: d51a3a8d3efbb1139d7608e28782ea9efea7e7933157e8ff8184901efd8ee760
type: archive
url: https://github.com/nlohmann/json/archive/v3.7.0.tar.gz
- build-commands:
- ./bootstrap.sh --with-libraries=thread,system,iostreams --prefix=/app
- ./b2 -d0 variant=release link=static threading=multi --layout=system
- ./b2 -d0 install
buildsystem: simple
name: boost
sources:
- sha256: 59c9b274bc451cf91a9ba1dd2c7fdcaf5d60b1b3aa83f2c9fa143417cc660722
type: archive
url: https://sourceforge.net/projects/boost/files/boost/1.72.0/boost_1_72_0.tar.bz2
- buildsystem: meson
name: gstreamer
sources:
@ -140,6 +145,14 @@ modules:
tag: 1.18.3
type: git
url: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git
- buildsystem: meson
config-opts:
- -Ddefault_library=static
name: coeurl
sources:
- commit: 417821a07cfe4429b08a2efed5e480a498087afd
type: git
url: https://nheko.im/nheko-reborn/coeurl.git
- config-opts:
- -DBUILD_LIB_TESTS=OFF
- -DBUILD_LIB_EXAMPLES=OFF
@ -148,19 +161,9 @@ modules:
buildsystem: cmake-ninja
name: mtxclient
sources:
- commit: 5d2f055ea9403770039ddf66b1900f890cd5cde7
- commit: 9ecaefe377d4dab688caee186e4a263cb7f105e8
type: git
url: https://github.com/Nheko-Reborn/mtxclient.git
- config-opts:
- -DCMAKE_BUILD_TYPE=Release
- -DTWEENY_BUILD_DOCUMENTATION=OFF
- -DTWEENY_BUILD_EXAMPLES=OFF
buildsystem: cmake-ninja
name: tweeny
sources:
- sha256: 482857256a7235646004682912badb6521d361ed6987c8ebdae7986bf64ce694
type: archive
url: https://github.com/mobius3/tweeny/archive/43f4130f7e4a67c19d870b60864bc2862c19b81f.tar.gz
- config-opts:
- -DCMAKE_BUILD_TYPE=Release
- -DLMDBXX_INCLUDE_DIR=.deps/lmdbxx

@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="user-friends" class="svg-inline--fa fa-user-friends fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M192 256c61.9 0 112-50.1 112-112S253.9 32 192 32 80 82.1 80 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C51.6 288 0 339.6 0 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zM480 256c53 0 96-43 96-96s-43-96-96-96-96 43-96 96 43 96 96 96zm48 32h-3.8c-13.9 4.8-28.6 8-44.2 8s-30.3-3.2-44.2-8H432c-20.4 0-39.2 5.9-55.7 15.4 24.4 26.3 39.7 61.2 39.7 99.8v38.4c0 2.2-.5 4.3-.6 6.4H592c26.5 0 48-21.5 48-48 0-61.9-50.1-112-112-112z"></path></svg>

After

Width:  |  Height:  |  Size: 747 B

@ -53,14 +53,6 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -255,7 +247,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@ -265,13 +257,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
@ -301,55 +293,66 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
@ -779,6 +782,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -808,13 +816,13 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-72"/>
<location line="-80"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+72"/>
<location line="+80"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,73 +1229,111 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1590,17 +1703,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1621,12 +1739,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1642,85 +1755,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1777,54 +1830,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1864,7 +1869,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1887,8 +1892,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1896,7 +1901,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2698,23 +2703,10 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

File diff suppressed because it is too large Load Diff

@ -53,14 +53,6 @@
<translation type="unfinished">Άκυρο</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -255,7 +247,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@ -265,13 +257,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
@ -301,55 +293,66 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished">Διάλεξε ένα αρχείο</translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished">Όλα τα αρχεία (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Κενός κωδικός</translation>
</message>
@ -785,6 +788,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Όνομα χρήστη</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Κωδικός</translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>ΕΓΓΡΑΦΗ</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Ο κωδικός δεν αποτελείται από αρκετους χαρακτήρες</translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation>Οι κωδικοί δεν ταιριίαζουν</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Λανθασμένο όνομα διακομιστή</translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,74 +1229,112 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation>Βγές</translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished">Βγές</translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Αποδοχή</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Απόρριψη</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Αποδοχή</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Απόρριψη</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Άκυρο</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Νέα συνομιλία</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1589,17 +1702,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1620,12 +1738,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1641,85 +1754,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1776,54 +1829,6 @@ Example: https://server.my:8787</source>
<translation>Έξοδος</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1863,7 +1868,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1886,8 +1891,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1895,7 +1900,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Ελαχιστοποίηση</translation>
</message>
@ -2697,23 +2702,10 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

@ -53,14 +53,6 @@
<translation>Cancel</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>Failed to invite user: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>Invited user: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation>Confirm join</translation>
</message>
@ -164,13 +156,13 @@
<translation>Room %1 created.</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation>Confirm invite</translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Do you really want to invite %1 (%2)?</translation>
</message>
@ -235,12 +227,12 @@
<translation>Unbanned user: %1</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Do you really want to start a private chat with %1?</translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation>Cache migration failed!</translation>
</message>
@ -255,7 +247,7 @@
<translation>The cache on your disk is newer than this version of Nheko supports. Please update or clear your cache.</translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Failed to restore OLM account. Please login again.</translation>
</message>
@ -265,13 +257,13 @@
<translation>Failed to restore save data. Please login again.</translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation>Please try to login again: %1</translation>
</message>
@ -301,55 +293,66 @@
<translation>Failed to leave room: %1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation>Failed to kick %1 from %2: %3</translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<translation>Hide rooms with this tag or from this community</translation>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation>Hide rooms with this tag or from this space by default.</translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation>All rooms</translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation>Favourite rooms</translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation>Shows all rooms without filtering.</translation>
</message>
<message>
<location line="+30"/>
<source>Favourites</source>
<translation>Favourites</translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation>Low priority rooms</translation>
<source>Rooms you have favourited.</source>
<translation>Rooms you have favourited.</translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation>Low Priority</translation>
</message>
<message>
<location line="+2"/>
<source>Rooms with low priority.</source>
<translation>Rooms with low priority.</translation>
</message>
<message>
<location line="+7"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<translation>Server Notices</translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<translation> (tag)</translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<translation> (community)</translation>
<source>Messages from your server or administrator.</source>
<translation>Messages from your server or administrator.</translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation>Decrypt secrets</translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Encrypted Event (No keys found for decryption) --</translation>
@ -529,7 +532,7 @@
<translation>-- Encrypted Event (Key not valid for this index) --</translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation>Select a file</translation>
</message>
@ -614,7 +617,7 @@
<translation>All Files (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation>Failed to upload media. Please try again.</translation>
</message>
@ -695,13 +698,13 @@ Example: https://server.my:8787</translation>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation>You have entered an invalid Matrix ID e.g @joe:matrix.org</translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Autodiscovery failed. Received malformed response.</translation>
</message>
@ -711,7 +714,7 @@ Example: https://server.my:8787</translation>
<translation>Autodiscovery failed. Unknown error while requesting .well-known.</translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>The required endpoints were not found. Possibly not a Matrix server.</translation>
</message>
@ -726,12 +729,12 @@ Example: https://server.my:8787</translation>
<translation>An unknown error occured. Make sure the homeserver domain is valid.</translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation>SSO LOGIN</translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Empty password</translation>
</message>
@ -783,6 +786,11 @@ Example: https://server.my:8787</translation>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation>%1 changed the room avatar</translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation>%1 created and configured room: %2</translation>
</message>
@ -812,13 +820,13 @@ Example: https://server.my:8787</translation>
<translation>%1 answered the call.</translation>
</message>
<message>
<location line="-72"/>
<location line="-80"/>
<location line="+9"/>
<source>removed</source>
<translation>removed</translation>
</message>
<message>
<location line="+72"/>
<location line="+80"/>
<source>%1 ended the call.</source>
<translation>%1 ended the call.</translation>
</message>
@ -864,7 +872,7 @@ Example: https://server.my:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation>Edit</translation>
</message>
@ -883,6 +891,76 @@ Example: https://server.my:8787</translation>
<source>Options</source>
<translation>Options</translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation>&amp;Copy</translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation>Copy &amp;link location</translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation>Re&amp;act</translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation>Repl&amp;y</translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation>&amp;Edit</translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation>Read receip&amp;ts</translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation>&amp;Forward</translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation>&amp;Mark as read</translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation>View raw message</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation>View decrypted raw message</translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation>Remo&amp;ve message</translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation>&amp;Save as</translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation>&amp;Open in external program</translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation>Copy link to eve&amp;nt</translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1022,7 +1100,7 @@ Example: https://server.my:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation>unimplemented event: </translation>
</message>
@ -1030,7 +1108,7 @@ Example: https://server.my:8787</translation>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</translation>
</message>
@ -1048,18 +1126,18 @@ Example: https://server.my:8787</translation>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Username</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Password</translation>
</message>
@ -1084,22 +1162,47 @@ Example: https://server.my:8787</translation>
<translation>A server that allows registration. Since matrix is decentralized, you need to first find a server you can register on or host your own.</translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>REGISTER</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation>No supported registration flows!</translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation>One or more fields have invalid inputs. Please correct those issues and try again.</translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Autodiscovery failed. Received malformed response.</translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation>Autodiscovery failed. Unknown error while requesting .well-known.</translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>The required endpoints were not found. Possibly not a Matrix server.</translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation>Received malformed response. Make sure the homeserver domain is valid.</translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation>An unknown error occured. Make sure the homeserver domain is valid.</translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Password is not long enough (min 8 chars)</translation>
</message>
@ -1109,7 +1212,7 @@ Example: https://server.my:8787</translation>
<translation>Passwords don&apos;t match</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Invalid server name</translation>
</message>
@ -1117,7 +1220,7 @@ Example: https://server.my:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation>Close</translation>
</message>
@ -1130,74 +1233,112 @@ Example: https://server.my:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation>no version stored</translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation>New tag</translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation>Enter the tag you want to use:</translation>
</message>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<location line="+7"/>
<source>Leave room</source>
<translation>Leave room</translation>
</message>
<message>
<location line="+7"/>
<location line="+5"/>
<source>Tag room as:</source>
<translation>Tag room as:</translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation>Favourite</translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<translation>Low Priority</translation>
<location line="+2"/>
<source>Low priority</source>
<translation>Low priority</translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<translation>Server Notice</translation>
<location line="+2"/>
<source>Server notice</source>
<translation>Server notice</translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<translation>Adds or removes the specified tag.</translation>
<location line="+13"/>
<source>Create new tag...</source>
<translation>Create new tag...</translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>New tag</translation>
<location line="+222"/>
<source>Accept</source>
<translation>Accept</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<translation>New Tag</translation>
<location line="+21"/>
<source>Decline</source>
<translation>Decline</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation>Status Message</translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<translation>Tag:</translation>
<source>Enter your status message:</source>
<translation>Enter your status message:</translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Accept</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation>Profile settings</translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Decline</translation>
<location line="+5"/>
<source>Set status message</source>
<translation>Set status message</translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation>Logout</translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation>Start a new chat</translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation>Join a room</translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation>Create a new room</translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation>Room directory</translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation>User settings</translation>
</message>
</context>
<context>
@ -1388,34 +1529,6 @@ E2E implementation until device verification is completed.</translation>
<translation>Cancel</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation>User settings</translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Create new room</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation>Join a room</translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation>Start a new chat</translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation>Room directory</translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1442,7 +1555,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation>Successful Verification</translation>
</message>
@ -1460,7 +1573,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation>Message redaction failed: %1</translation>
</message>
@ -1595,17 +1708,22 @@ E2E implementation until device verification is completed.</translation>
<translation>%1 was banned.</translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation>Reason: %1</translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation>%1 redacted their knock.</translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation>%1 has changed their avatar and changed their display name to %2.</translation>
</message>
@ -1626,12 +1744,7 @@ E2E implementation until device verification is completed.</translation>
<translation>%1 left after having already left!</translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation>Reason: %1</translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation>%1 knocked.</translation>
</message>
@ -1647,85 +1760,25 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation>Copy</translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation>Copy link location</translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation>React</translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation>Reply</translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation>Edit</translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation>Read receipts</translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation>Forward</translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation>Mark as read</translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation>View raw message</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation>View decrypted raw message</translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation>Remove message</translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation>Save as</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Open in external program</translation>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation>No room open</translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<translation>Copy link to event</translation>
<location line="+127"/>
<source>%1 member(s)</source>
<translation>%1 member(s)</translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<translation>No room open</translation>
<location line="+46"/>
<source>Back to room list</source>
<translation>Back to room list</translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</translation>
</message>
@ -1782,54 +1835,6 @@ E2E implementation until device verification is completed.</translation>
<translation>Quit</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation>Logout</translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation>Set custom status message</translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation>Custom status message</translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation>Status:</translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation>User Profile Settings</translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation>Set presence automatically</translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation>Online</translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation>Unavailable</translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation>Offline</translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1869,7 +1874,7 @@ E2E implementation until device verification is completed.</translation>
<translation>Unverify</translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation>Select an avatar</translation>
</message>
@ -1892,8 +1897,8 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Default</translation>
</message>
@ -1901,7 +1906,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Minimize to tray</translation>
</message>
@ -2716,23 +2721,10 @@ Media size: %2
<translation>%1 ended a call</translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation>This Room</translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation>All Rooms</translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation>Unknown Message Type</translation>
</message>

File diff suppressed because it is too large Load Diff

@ -53,14 +53,6 @@
<translation>Cancelar</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>Te has unido a esta sala.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>No se pudo invitar al usuario: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>Usuario invitado: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
<translation>La migración de la caché a la versión actual ha fallado. Esto puede deberse a distintos motivos. Por favor, reporte el incidente y mientras tanto intente usar una versión anterior. También puede probar a borrar la caché manualmente.</translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -161,16 +153,16 @@
<message>
<location line="+44"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
<translation>Sala %1 creada.</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
<translation>Confirmar invitación</translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -182,7 +174,7 @@
<message>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
<translation>Confirmar expulsión</translation>
</message>
<message>
<location line="+1"/>
@ -192,7 +184,7 @@
<message>
<location line="+16"/>
<source>Kicked user: %1</source>
<translation type="unfinished"></translation>
<translation>Se ha expulsado a %1</translation>
</message>
<message>
<location line="+10"/>
@ -235,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -255,7 +247,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@ -265,13 +257,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
@ -301,55 +293,66 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
@ -779,6 +782,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -808,13 +816,13 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-72"/>
<location line="-80"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+72"/>
<location line="+80"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,74 +1229,112 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Aceptar</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Rechazar</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation type="unfinished">Aceptar</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation type="unfinished">Rechazar</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Cancelar</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1599,17 +1712,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished">Te has unido a esta sala.</translation>
</message>
<message>
<location line="+878"/>
<location line="+885"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1620,12 +1738,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1641,85 +1754,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1776,54 +1829,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1863,7 +1868,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1886,8 +1891,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1895,7 +1900,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2697,23 +2702,10 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

@ -53,14 +53,6 @@
<translation>Katkesta</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>Sa liitusid selle jututoaga.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>Kutse saatmine kasutajale ei õnnestunud: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>Kutsutud kasutaja: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Puhverdatud andmete muutmine sobivaks rakenduse praeguse versiooniga ei õnnestunud. Sellel võib olla erinevaid põhjuseid. Palun saada meile veateade ja seni kasuta vanemat rakenduse versiooni. Aga kui sa soovid proovida, siis kustuta puhverdatud andmed käsitsi.</translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation>Kinnita liitumine</translation>
</message>
@ -164,13 +156,13 @@
<translation>%1 jututuba on loodud.</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation>Kinnita kutse</translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Kas sa tõesti soovid saata kutset kasutajale %1 (%2)?</translation>
</message>
@ -235,12 +227,12 @@
<translation>Suhtluskeeld eemaldatud: %1</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Kas sa kindlasti soovid alustada otsevestlust kasutajaga %1?</translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation>Puhvri versiooniuuendus ebaõnnestus!</translation>
</message>
@ -255,7 +247,7 @@
<translation>Sinu andmekandjale salvestatud puhvri versioon on uuem, kui käesolev Nheko versioon kasutada oskab. Palun tee Nheko uuendus või kustuta puhverdatud andmed.</translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>OLM konto taastamine ei õnnestunud. Palun logi uuesti sisse.</translation>
</message>
@ -265,13 +257,13 @@
<translation>Salvestatud andmete taastamine ei õnnestunud. Palun logi uuesti sisse.</translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Krüptovõtmete kasutusele võtmine ei õnnestunud. Koduserveri vastus päringule: %1 %2. Palun proovi hiljem uuesti.</translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation>Palun proovi uuesti sisse logida: %1</translation>
</message>
@ -301,55 +293,66 @@
<translation>Jututoast lahkumine ei õnnestunud: %1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation>Kasutaja %1 väljamüksamine %2 jututoast ei õnnestunud: %3</translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<translation>Peida sellest kogukonnast antud sildiga jututoad</translation>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation>Vaikimisi peida selle sildiga jututoad.</translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation>Kõik jututoad</translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation>Eelistatud jututoad</translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation>Näita kõiki jututubasid nii, et filter pole kasutusel.</translation>
</message>
<message>
<location line="+30"/>
<source>Favourites</source>
<translation>Lemmikud</translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation>Vähetähtsad jututoad</translation>
<source>Rooms you have favourited.</source>
<translation>Jututoad, mis sa oled märkinud lemmikuteks.</translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation>Vähetähtis</translation>
</message>
<message>
<location line="+2"/>
<source>Rooms with low priority.</source>
<translation>Väheolulised jututoad.</translation>
</message>
<message>
<location line="+7"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<translation>Serveriteated</translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<translation> (silt)</translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<translation> (kogukond)</translation>
<source>Messages from your server or administrator.</source>
<translation>Sõnumid sinu serverilt või selle haldajalt.</translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation>Dekrüpti andmed</translation>
</message>
@ -501,23 +504,23 @@
<message>
<location line="+4"/>
<source>Encrypted by a verified device</source>
<translation type="unfinished"></translation>
<translation>Krüptitud verifitseeritud seadmes</translation>
</message>
<message>
<location line="+2"/>
<source>Encrypted by an unverified device, but you have trusted that user so far.</source>
<translation type="unfinished"></translation>
<translation>Krüptitud verifitseerimata seadmes, aga sa oled selle kasutajat seni usaldanud.</translation>
</message>
<message>
<location line="+2"/>
<source>Encrypted by an unverified device</source>
<translation type="unfinished"></translation>
<translation>Krüptitud verifitseerimata seadmes</translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Krüptitud sündmus (Dekrüptimisvõtmeid ei leidunud) --</translation>
@ -529,7 +532,7 @@
<translation>-- Krüptitud sündmus (võti pole selle indeksi jaoks sobilik) --</translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -598,13 +601,13 @@
<message>
<location filename="../qml/ForwardCompleter.qml" line="+44"/>
<source>Forward Message</source>
<translation type="unfinished"></translation>
<translation>Suuna sõnum edasi</translation>
</message>
</context>
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation>Vali fail</translation>
</message>
@ -614,7 +617,7 @@
<translation>Kõik failid (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation>
</message>
@ -695,13 +698,13 @@ Näiteks: https://server.minu:8787</translation>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation>Sisestatud Matrix&apos;i kasutajatunnus on vigane - peaks olema @kasutaja:server.tld</translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Koduserveri automaatne tuvastamine ei õnnestunud: päringuvastus oli vigane.</translation>
</message>
@ -711,7 +714,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Koduserveri automaatne tuvastamine ei õnnestunud: tundmatu viga .well-known päringu tegemisel.</translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>Protokolli järgi nõutavaid lõpppunkte ei leidunud. Ilmselt pole tegemist Matrix&apos;i serveriga.</translation>
</message>
@ -726,12 +729,12 @@ Näiteks: https://server.minu:8787</translation>
<translation>Tekkis teadmata viga. Palun kontrolli, et koduserveri domeen on õige.</translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation>ÜHEKORDNE SISSELOGIMINE</translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Tühi salasõna</translation>
</message>
@ -783,6 +786,11 @@ Näiteks: https://server.minu:8787</translation>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation>%1 muutis jututoa tunnuspilti</translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation>%1 lõi ja seadistas jututoa: %2</translation>
</message>
@ -812,13 +820,13 @@ Näiteks: https://server.minu:8787</translation>
<translation>%1 vastas kõnele.</translation>
</message>
<message>
<location line="-72"/>
<location line="-80"/>
<location line="+9"/>
<source>removed</source>
<translation>eemaldatud</translation>
</message>
<message>
<location line="+72"/>
<location line="+80"/>
<source>%1 ended the call.</source>
<translation>%1 lõpetas kõne.</translation>
</message>
@ -858,13 +866,13 @@ Näiteks: https://server.minu:8787</translation>
<message>
<location line="+11"/>
<source>You don&apos;t have permission to send messages in this room</source>
<translation type="unfinished"></translation>
<translation>Sul puuduvad selles jututoas õigused sõnumite saatmiseks</translation>
</message>
</context>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation>Muuda</translation>
</message>
@ -883,6 +891,76 @@ Näiteks: https://server.minu:8787</translation>
<source>Options</source>
<translation>Valikud</translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation>&amp;Kopeeri</translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation>Kopeeri &amp;lingi asukoht</translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation>Re&amp;ageeri</translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation>&amp;Vasta</translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation>&amp;Muuda</translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation>Lugemis&amp;teatised</translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation>&amp;Edasta</translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation>&amp;Märgi loetuks</translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation>Näita sõnumi lähtekoodi</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation>Näita sõnumi dekrüptitud lähtekoodi</translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation>Eemal&amp;da sõnum</translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation>&amp;Salvesta kui</translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation>&amp;Ava välise rakendusega</translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation>Kopeeri sündmuse li&amp;nk</translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1022,7 +1100,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation>implementeerimata sündmus: </translation>
</message>
@ -1030,7 +1108,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation>Loo unikaalne profiil, mis võimaldab sul logida samaaegselt sisse erinevatele kasutajakontodele ning käivitada mitu Nheko programmiakent.</translation>
</message>
@ -1048,18 +1126,18 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Kasutajanimi</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Kasutajanimi ei tohi olla tühi ning võib sisaldada vaid a-z, 0-9, ., _, =, -, / tähemärke.</translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Salasõna</translation>
</message>
@ -1084,22 +1162,47 @@ Näiteks: https://server.minu:8787</translation>
<translation>See on server, kus sa oma kasutajakonto registreerid. Kuna Matrix on hajutatud suhtlusvõrk, siis esmalt pead leidma sulle sobiliku koduserveri või panema püsti täitsa oma enda koduserveri.</translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>REGISTREERI</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation>Selline registreerimise töövoog pole toetatud!</translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation>Ühel või enamal andmeväljal on vigane väärtus. Palun paranda vead ja proovi uuesti.</translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Koduserveri automaatne tuvastamine ei õnnestunud: päringuvastus oli vigane.</translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation>Koduserveri automaatne tuvastamine ei õnnestunud: tundmatu viga .well-known päringu tegemisel.</translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>Protokolli järgi nõutavaid lõpppunkte ei leidunud. Ilmselt pole tegemist Matrix&apos;i serveriga.</translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation>Päringule sain tagasi vigase vastuse. Palun kontrolli, et koduserveri domeen oleks õige.</translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation>Tekkis teadmata viga. Palun kontrolli, et koduserveri domeen on õige.</translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Salasõna pole piisavalt pikk (vähemalt 8 tähemärki)</translation>
</message>
@ -1109,7 +1212,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Salasõnad ei klapi omavahel</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Vigane koduserveri nimi</translation>
</message>
@ -1117,7 +1220,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation>Sulge</translation>
</message>
@ -1130,74 +1233,112 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation>salvestatud versiooni ei leidu</translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation>Uus silt</translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation>Kirjuta silt, mida soovid kasutada:</translation>
</message>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<location line="+7"/>
<source>Leave room</source>
<translation>Lahku jututoast</translation>
</message>
<message>
<location line="+7"/>
<location line="+5"/>
<source>Tag room as:</source>
<translation>Lisa jututoale silt:</translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation>Lemmik</translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation>Vähetähtis</translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation>Serveriteade</translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<translation>Lisab või eemaldab selle sildi.</translation>
<location line="+13"/>
<source>Create new tag...</source>
<translation>Loo uus silt...</translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Uus silt</translation>
<location line="+222"/>
<source>Accept</source>
<translation>Nõustu</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<translation>Uus silt</translation>
<location line="+21"/>
<source>Decline</source>
<translation>Keeldu</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation>Olekuteade</translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<translation>Silt:</translation>
<source>Enter your status message:</source>
<translation>Sisesta oma olekuteade:</translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Nõustu</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation>Profiili seadistused</translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Ei nõustu</translation>
<location line="+5"/>
<source>Set status message</source>
<translation>Sisesta olekuteade</translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation>Logi välja</translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation>Alusta uut vestlust</translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation>Liitu jututoaga</translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation>Loo uus jututuba</translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation>Jututubade loend</translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation>Kasutaja seadistused</translation>
</message>
</context>
<context>
@ -1388,34 +1529,6 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>Loobu</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation>Kasutaja seadistused</translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Loo uus jututuba</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation>Liitu jututoaga</translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation>Alusta uut vestlust</translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation>Jututubade loend</translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1442,7 +1555,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation>Verifitseerimine õnnestus</translation>
</message>
@ -1460,7 +1573,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation>
</message>
@ -1595,24 +1708,29 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>Kasutaja %1 sai suhtluskeelu.</translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation>Põhjus: %1</translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation>%1 muutis oma koputust jututoa uksele.</translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation>Sa liitusid jututoaga.</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
<translation>%1 muutis oma tunnuspilti ja seadistas uueks kuvatavaks nimeks %2.</translation>
</message>
<message>
<location line="+5"/>
<source>%1 has changed their display name to %2.</source>
<translation type="unfinished"></translation>
<translation>%1 seadistas uueks kuvatavaks nimeks %2.</translation>
</message>
<message>
<location line="+31"/>
@ -1626,12 +1744,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>%1 lahkus jututoast peale seda, kui ta juba oli lahkunud!</translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation>Põhjus: %1</translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation>%1 müksati välja.</translation>
</message>
@ -1647,85 +1760,25 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation>Reageeri</translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation>Vasta</translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation>Muuda</translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation>Lugemisteatised</translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation>Märgi loetuks</translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation>Näita sõnumi lähtekoodi</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation>Näita sõnumi dekrüptitud lähtekoodi</translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation>Eemalda sõnum</translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation>Salvesta kui</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Ava välise rakendusega</translation>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation>Ühtegi jututuba pole avatud</translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<translation type="unfinished"></translation>
<location line="+127"/>
<source>%1 member(s)</source>
<translation>%1 liige(t)</translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<translation>Ühtegi jututuba pole avatud</translation>
<location line="+46"/>
<source>Back to room list</source>
<translation>Tagasi jututubade loendisse</translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Ühtegi krüptitud vestlust selle kasutajaga ei leidunud. Palun loo temaga krüptitud vestlus ja proovi uuesti.</translation>
</message>
@ -1782,54 +1835,6 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>Lõpeta töö</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation>Logi välja</translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation>Kirjuta kohandatud olekuteade</translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation>Kohandatud olekuteade</translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation>Olek:</translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation>Kasutajaprofiili seadistused</translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation>Määra oma võrguolek automaatselt</translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation>Võrgus</translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation>Pole kättesaadav</translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation>Pole võrgus</translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1869,7 +1874,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>Võta verifitseerimine tagasi</translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation>Vali tunnuspilt</translation>
</message>
@ -1892,8 +1897,8 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Vaikimisi</translation>
</message>
@ -1901,7 +1906,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Vähenda tegumiribale</translation>
</message>
@ -2716,23 +2721,10 @@ Meedia suurus: %2
<translation>%1 lõpetas kõne</translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation>See jututuba</translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation>Kõik jututoad</translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation>Tundmatu sõnumitüüp</translation>
</message>

File diff suppressed because it is too large Load Diff

@ -53,14 +53,6 @@
<translation>Annuler</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>Échec lors de l&apos;invitation de %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>%1 a é invité(e)</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>La migration du cache vers la version actuelle a échoué. Cela peut arriver pour différentes raisons. Signalez le problème et essayez d&apos;utiliser une ancienne version en attendant. Vous pouvez également supprimer le cache manuellement.</translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation>Confirmez la participation</translation>
</message>
@ -164,13 +156,13 @@
<translation>Salon %1 créé.</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation>Confirmer l&apos;invitation</translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Voulez-vous vraiment inviter %1 (%2)&#x202f;?</translation>
</message>
@ -235,12 +227,12 @@
<translation>%1 n&apos;est plus banni(e)</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Voulez-vous vraimer commencer une discussion privée avec %1 ?</translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation>Échec de la migration du cache&#x202f;!</translation>
</message>
@ -255,7 +247,7 @@
<translation>Le cache sur votre disque est plus récent que cette version de Nheko ne supporte. Veuillez mettre à jour ou supprimer votre cache.</translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Échec de la restauration du compte OLM. Veuillez vous reconnecter.</translation>
</message>
@ -265,13 +257,13 @@
<translation>Échec de la restauration des données sauvegardées. Veuillez vous reconnecter.</translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Échec de la configuration des clés de chiffrement. Réponse du serveur&#xa0;: %1 %2. Veuillez réessayer plus tard.</translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation>Veuillez vous reconnecter&#xa0;: %1</translation>
</message>
@ -301,55 +293,66 @@
<translation>Impossible de quitter le salon&#xa0;: %1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation>Échec de l&apos;expulsion de %1 depuis %2&#x202f;&#x202f;: %3</translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<translation>Cacher les salons portant cette étiquette ou appartenant à cette communauté</translation>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation>Tous les salons</translation>
<translation type="unfinished">Tous les salons</translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation>Salons favoris</translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation>Salons basse priorité</translation>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<translation>Notifications du serveur</translation>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished">Basse priorité</translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<translation> (étiquette)</translation>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<translation> (communauté)</translation>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished">Notifications du serveur</translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation>Déchiffrer les secrets</translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Évènement chiffré (pas de clé trouvée pour le déchiffrement) --</translation>
@ -529,7 +532,7 @@
<translation>-- Événement chiffré (clé invalide pour cet index) --</translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation>Sélectionnez un fichier</translation>
</message>
@ -614,7 +617,7 @@
<translation>Tous les types de fichiers (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation>Échec de l&apos;envoi du média. Veuillez réessayer.</translation>
</message>
@ -695,13 +698,13 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation>Vous avez entré un identifiant Matrix invalide (exemple correct&#x202f;: @moi&#x202f;:mon.serveur.fr)</translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Échec de la découverte automatique. Réponse mal formatée reçue.</translation>
</message>
@ -711,7 +714,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Échec de la découverte automatique. Erreur inconnue lors de la demande de .well-known.</translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>Les chemins requis n&apos;ont pas é trouvés. Possible qu&apos;il ne s&apos;agisse pas d&apos;un serveur Matrix.</translation>
</message>
@ -726,12 +729,12 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Une erreur inconnue est survenue. Vérifiez que le nom de domaine du serveur est valide.</translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation>CONNEXION SSO</translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Mot de passe vide</translation>
</message>
@ -789,6 +792,11 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation>%1 a créé et configuré le salon&#xa0;: %2</translation>
</message>
@ -864,7 +872,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation>Modifier</translation>
</message>
@ -883,6 +891,76 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<source>Options</source>
<translation>Options</translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished">Voir le message brut</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished">Voir le message déchiffré brut</translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1022,7 +1100,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation>Évènement non implémenté&#xa0;: </translation>
</message>
@ -1030,7 +1108,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation>Créer un profil unique, vous permettant de vous connecter simultanément à plusieurs comptes et à lancer plusieurs instances de nheko.</translation>
</message>
@ -1048,18 +1126,18 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Nom d&apos;utilisateur</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Le nom d&apos;utilisateur ne doit pas être vide, et ne peut contenir que les caractères a à z, 0 à 9, et «&#x202f;. _ = - /&#x202f;».</translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Mot de passe</translation>
</message>
@ -1084,22 +1162,47 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Un serveur qui autorise les créations de compte. Matrix étant décentralisé, vous devez tout d&apos;abord trouver un serveur sur lequel vous pouvez vous inscrire, ou bien héberger le vôtre.</translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>S&apos;ENREGISTRER</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation>Pas de méthode d&apos;inscription supportée&#xa0;!</translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation>Un ou plusieurs champs ont des entrées invalides. Veuillez les corriger et réessayer.</translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished">Échec de la découverte automatique. Réponse mal formatée reçue.</translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished">Échec de la découverte automatique. Erreur inconnue lors de la demande de .well-known.</translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished">Les chemins requis n&apos;ont pas é trouvés. Possible qu&apos;il ne s&apos;agisse pas d&apos;un serveur Matrix.</translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Réponse mal formée reçue. Vérifiez que le nom de domaine du serveur est valide.</translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Une erreur inconnue est survenue. Vérifiez que le nom de domaine du serveur est valide.</translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Le mot de passe n&apos;est pas assez long (8 caractères minimum)</translation>
</message>
@ -1109,7 +1212,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Les mots de passe ne sont pas identiques</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Le nom du serveur est invalide</translation>
</message>
@ -1117,7 +1220,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation>Fermer</translation>
</message>
@ -1130,74 +1233,112 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation>pas de version enregistrée</translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation>Quitter le salon</translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished">Quitter le salon</translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation>Étiqueter le salon comme&#xa0;:</translation>
<translation type="unfinished">Étiqueter le salon comme&#xa0;:</translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation>Favori</translation>
<translation type="unfinished">Favori</translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<translation>Basse priorité</translation>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<translation>Notification du serveur</translation>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<translation>Ajoute ou retire l&apos;étiquette spécifiée.</translation>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Nouvelle étiquette</translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<translation>Nouvelle étiquette</translation>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<translation>Étiquette&#xa0;:</translation>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Accepter</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Décliner</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished">Se déconnecter</translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished">Commencer une discussion</translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished">Rejoindre un salon</translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished">Annuaire des salons</translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished">Paramètres utilisateur</translation>
</message>
</context>
<context>
@ -1388,34 +1529,6 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation type="unfinished">Annuler</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation>Paramètres utilisateur</translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Créer un nouveau salon</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation>Rejoindre un salon</translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation>Commencer une discussion</translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation>Annuaire des salons</translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1442,7 +1555,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation>Vérification réussie</translation>
</message>
@ -1460,7 +1573,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation>Échec de la suppression du message&#xa0;: %1</translation>
</message>
@ -1595,17 +1708,22 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation>%1 a é banni.</translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation>%1 ne frappe plus au salon.</translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1626,12 +1744,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation>%1 a quitté le salon après l&apos;avoir déjà quitté&#x202f;!</translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation>Raison&#xa0;: %1</translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation>%1 a frappé au salon.</translation>
</message>
@ -1647,85 +1760,25 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation>Réagir</translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation>Réponse</translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation>Modifier</translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation>Accusés de lecture</translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation>Marquer comme lu</translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation>Voir le message brut</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation>Voir le message déchiffré brut</translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation>Retirer le message</translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation>Enregistrer sous</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Ouvrir dans une application externe</translation>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation>Aucun salon ouvert</translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<translation type="unfinished"></translation>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished">%1 membre(s)</translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<translation>Aucun salon ouvert</translation>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished">Revenir à la liste des salons</translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Pas de discussion privée et chiffrée trouvée avec cet utilisateur. Créez-en une et réessayez.</translation>
</message>
@ -1782,54 +1835,6 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation>Quitter</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation>Se déconnecter</translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation>Choisir un message de statut personnalisé</translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation>Message de statut personnalisé</translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation>Statut&#xa0;:</translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation>Paramètres du profil utilisateur</translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation>Changer la présence automatiquement</translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation>En ligne</translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation>Non disponible</translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation>Hors ligne</translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1869,7 +1874,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation>-vérifier</translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation>Sélectionner un avatar</translation>
</message>
@ -1892,8 +1897,8 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Défaut</translation>
</message>
@ -1901,7 +1906,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Réduire à la barre des tâches</translation>
</message>
@ -2718,23 +2723,10 @@ Taille du média : %2
<translation>%1 a terminé un appel</translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation>Ce salon</translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation>Tous les salons</translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation>Type du message inconnu</translation>
</message>

@ -53,14 +53,6 @@
<translation>Mégse</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>Csatlakoztál ehhez a szobához.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>Nem sikerült meghívni a felhasználót: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>A felhasználó meg lett hívva: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>A gyorsítótár átvitele a jelenlegi verzióhoz nem sikerült. Ennek több oka is lehet. Kérlek, írj egy hibajelentést és egyelőre próbálj meg egy régebbi verziót használni! Alternatív megoldásként megprobálhatod eltávolítani a gyorsítótárat kézzel.</translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation>Csatlakozás megerősítése</translation>
</message>
@ -164,13 +156,13 @@
<translation>A %1 nevű szoba létre lett hozva.</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation>Meghívás megerősítése</translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Biztos, hogy meg akarod hívni a következő felhasználót: %1 (%2)?</translation>
</message>
@ -235,12 +227,12 @@
<translation>Kitiltás feloldva a felhasználónak: %1</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Biztosan privát csevegést akarsz indítani %1 felhasználóval?</translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation>Gyorsítótár migráció nem sikerült!</translation>
</message>
@ -255,7 +247,7 @@
<translation>A lemezeden lévő gyorsítótár újabb, mint amit a Nheko jelenlegi verziója támogat. Kérlek, frissítsd vagy töröld a gyorsítótárat!</translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Nem sikerült visszaállítani az OLM fiókot. Kérlek, jelentkezz be ismét!</translation>
</message>
@ -265,13 +257,13 @@
<translation>Nem sikerült visszaállítani a mentési adatot. Kérlek, jelentkezz be ismét!</translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Nem sikerült beállítani a titkosítási kulcsokat. Válasz a szervertől: %1 %2. Kérlek, próbáld újra később!</translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation>Kérlek, próbálj meg bejelentkezni újra: %1</translation>
</message>
@ -301,55 +293,66 @@
<translation>Nem sikerült elhagyni a szobát: %1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation>Nem sikerült kirúgni %1 felhasználót %2 szobából: %3</translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<translation>Az ilyen címkével ellátott vagy közösséghez tartozó szobák elrejtése</translation>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation>Az összes szoba</translation>
<translation type="unfinished">Az összes szoba</translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation>Kedvenc szobák</translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation>Alacsony prioritású szobák</translation>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<translation>Szerverértesítések</translation>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished">Alacsony prioritású</translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<translation> (címke)</translation>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<translation> (közösség)</translation>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished">Szerverértesítések</translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation>Titkos tároló feloldása</translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Titkosított esemény (Nem találhatók kulcsok a titkosítás feloldásához) --</translation>
@ -529,7 +532,7 @@
<translation>-- Titkosított esemény (a kulcs nem érvényes ehhez az indexhez) --</translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation>Fájl kiválasztása</translation>
</message>
@ -614,7 +617,7 @@
<translation>Minden fájl (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation>Nem sikerült feltölteni a médiafájlt. Kérlek, próbáld újra!</translation>
</message>
@ -695,13 +698,13 @@ Példa: https://szerver.em:8787</translation>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation>Érvénytelen Matrixazonosítót adtál meg. Példa: @janos:matrix.org</translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Az automatikus felderítés nem sikerült. Helytelen válasz érkezett.</translation>
</message>
@ -711,7 +714,7 @@ Példa: https://szerver.em:8787</translation>
<translation>Az automatikus felderítés nem sikerült. Ismeretlen hiba a .well-known lekérése közben.</translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>Nem találhatók szükséges végpontok. Lehet, hogy nem egy Matrixszerver.</translation>
</message>
@ -726,12 +729,12 @@ Példa: https://szerver.em:8787</translation>
<translation>Egy ismeretlen hiba történt. Ellenőrizd, hogy a homeszervered domainje helyes.</translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation>SSO BEJELENTKEZÉS</translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Üres jelszó</translation>
</message>
@ -783,6 +786,11 @@ Példa: https://szerver.em:8787</translation>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation>%1 létrehozta és beállította a következő szobát: %2</translation>
</message>
@ -812,13 +820,13 @@ Példa: https://szerver.em:8787</translation>
<translation>%1 fogadta a hívást.</translation>
</message>
<message>
<location line="-72"/>
<location line="-80"/>
<location line="+9"/>
<source>removed</source>
<translation>eltávolítva</translation>
</message>
<message>
<location line="+72"/>
<location line="+80"/>
<source>%1 ended the call.</source>
<translation>%1 befejezte a hívást.</translation>
</message>
@ -864,7 +872,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation>Szerkesztés</translation>
</message>
@ -883,6 +891,76 @@ Példa: https://szerver.em:8787</translation>
<source>Options</source>
<translation>Műveletek</translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished">Nyers üzenet megtekintése</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished">Előzőleg titkosított nyers üzenet megtekintése</translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1022,7 +1100,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation>nem implementált esemény: </translation>
</message>
@ -1030,7 +1108,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation>Egy egyedi profil létrehozása, amellyel be tudsz jelentkezni egyszerre több fiókon keresztül és a Nheko több példányát is tudod futtatni.</translation>
</message>
@ -1048,18 +1126,18 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Felhasználónév</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>A felhasználónév nem lehet üres és csak a következő karaktereket tartalmazhatja: a-z, 0-9, ., _, =, - és /.</translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Jelszó</translation>
</message>
@ -1084,22 +1162,47 @@ Példa: https://szerver.em:8787</translation>
<translation>Egy szerver, amelyen engedélyezve vannak a regisztrációk. Mivel a Matrix decentralizált, először találnod kell egy szervert, ahol regisztrálhatsz, vagy be kell állítanod a saját szervered.</translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>REGISZTRÁCIÓ</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation>Nem támogatott regisztrációs folyamat!</translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation>Egy vagy több mező tartalma nem helyes. Kérlek, javítsd ki azokat a hibákat, és próbáld újra!</translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished">Az automatikus felderítés nem sikerült. Helytelen válasz érkezett.</translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished">Az automatikus felderítés nem sikerült. Ismeretlen hiba a .well-known lekérése közben.</translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished">Nem találhatók szükséges végpontok. Lehet, hogy nem egy Matrixszerver.</translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Helytelen válasz érkezett. Ellenőrizd, hogy a homeszervered domainje helyes.</translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Egy ismeretlen hiba történt. Ellenőrizd, hogy a homeszervered domainje helyes.</translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>A jelszó nem elég hosszú (legalább 8 karakter)</translation>
</message>
@ -1109,7 +1212,7 @@ Példa: https://szerver.em:8787</translation>
<translation>A jelszavak nem egyeznek</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Nem megfelelő szervernév</translation>
</message>
@ -1117,7 +1220,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation>Bezárás</translation>
</message>
@ -1130,74 +1233,112 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation>nincs tárolva verzió</translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation>Szoba elhagyása</translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished">Szoba elhagyása</translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation>Szoba megcímkézése:</translation>
<translation type="unfinished">Szoba megcímkézése:</translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation>Kedvenc</translation>
<translation type="unfinished">Kedvenc</translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<translation>Alacsony prioritású</translation>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<translation>Szerverértesítés</translation>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<translation>Hozzáadja vagy eltávolítja az adott címkét.</translation>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Új címke</translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Elfogadás</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<translation>Új címke</translation>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Elutasítás</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<translation>Címke:</translation>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Elfogadás</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Elutasítás</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished">Kijelentkezés</translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished">Új csevegés indítása</translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished">Csatlakozás egy szobához</translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished">Szobák jegyzéke</translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished">Felhasználói beállítások</translation>
</message>
</context>
<context>
@ -1388,34 +1529,6 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>Mégse</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation>Felhasználói beállítások</translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Új szoba létrehozása</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation>Csatlakozás egy szobához</translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation>Új csevegés indítása</translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation>Szobák jegyzéke</translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1442,7 +1555,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation>Sikeres hitelesítés</translation>
</message>
@ -1460,7 +1573,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation>Az üzenet visszavonása nem sikerült: %1</translation>
</message>
@ -1594,17 +1707,22 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>%1 ki lett tiltva.</translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation>%1 visszavonta a kopogását.</translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation>Csatlakoztál ehhez a szobához.</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1625,12 +1743,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>%1 távozott, miután már egyszer távozott!</translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation>Ok: %1</translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation>%1 kopogott.</translation>
</message>
@ -1646,85 +1759,25 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation>Reakció</translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation>Válasz</translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation>Szerkesztés</translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation>Olvasási jegyek</translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation>Megjelölés olvasottként</translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation>Nyers üzenet megtekintése</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation>Előzőleg titkosított nyers üzenet megtekintése</translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation>Üzenet eltávolítása</translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation>Mentés másként</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Megnyitás külső programban</translation>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation>Nincs nyitott szoba</translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<translation type="unfinished"></translation>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished">%1 tag</translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<translation>Nincs nyitott szoba</translation>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished">Vissza a szobák listájára</translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Nem található titkosított privát csevegés ezzel a felhasználóval. Hozz létre egy titkosított privát csevegést vele, és próbáld újra!</translation>
</message>
@ -1781,54 +1834,6 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>Kilépés</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation>Kijelentkezés</translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation>Egyéni állapotüzenet megadása</translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation>Egyéni állapotüzenet</translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation>Állapot:</translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation>Felhasználói profil beállításai</translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation>Elérhetőség megadása automatikusan</translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation>Bejelentkezve</translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation>Nem elérhető</translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation>Kiejelentkezve</translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1868,7 +1873,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>Hitelesítés visszavonása</translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation>Profilkép kiválasztása</translation>
</message>
@ -1891,8 +1896,8 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Alapértelmezett</translation>
</message>
@ -1900,7 +1905,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Kicsinyítés a tálcára</translation>
</message>
@ -2716,23 +2721,10 @@ Média mérete: %2
<translation>%1 befejezett egy hívást</translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation>Ez a szoba</translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation>Az összes szoba</translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation>Ismeretlen üzenettípus</translation>
</message>

File diff suppressed because it is too large Load Diff

@ -53,14 +53,6 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation>: %1</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -255,7 +247,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>OLMアカウントを復元できませんでした</translation>
</message>
@ -265,13 +257,13 @@
<translation></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>: %1 %2. </translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation>: %1</translation>
</message>
@ -301,55 +293,66 @@
<translation>: %1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation></translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation></translation>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<translation> ()</translation>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<translation> ()</translation>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- () --</translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished"> (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation>.well-known要求時の不明なエラー</translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>Matrixサーバーではないかもしれません</translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation></translation>
</message>
@ -785,6 +788,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation>: </translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation></translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation></translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation></translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished">.well-known要求時の不明なエラー</translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished">Matrixサーバーではないかもしれません</translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation> (8)</translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation></translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,74 +1229,112 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation></translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation></translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation></translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation></translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation></translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation>: %1</translation>
</message>
@ -1588,17 +1701,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation>%1</translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1619,12 +1737,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">退%1退!</translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation>%1</translation>
</message>
@ -1640,85 +1753,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation></translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation></translation>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<translation></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1775,54 +1828,6 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1862,7 +1867,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1885,8 +1890,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1894,7 +1899,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation></translation>
</message>
@ -2698,23 +2703,10 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation></translation>
</message>

@ -53,14 +53,6 @@
<translation></translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>ി ിി .</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>ി ിി : %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>ി :% 1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation>%1 ി ി</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation> </translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -255,7 +247,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@ -265,13 +257,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
@ -301,55 +293,66 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation> ി</translation>
<translation type="unfinished"> ി</translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation>ി ി</translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation> ി</translation>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation> ി</translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
@ -779,6 +782,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -808,13 +816,13 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-72"/>
<location line="-80"/>
<location line="+9"/>
<source>removed</source>
<translation></translation>
</message>
<message>
<location line="+72"/>
<location line="+80"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,74 +1229,112 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">ിി</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation type="unfinished">ിി</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1589,17 +1702,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished">ി ിി .</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1620,12 +1738,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1641,85 +1754,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1776,54 +1829,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1863,7 +1868,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1886,8 +1891,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1895,7 +1900,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2697,23 +2702,10 @@ Media size: %2
<translation>%1 ിി</translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation> ി</translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation> ി</translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

@ -53,14 +53,6 @@
<translation type="unfinished">Annuleren</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>Je bent lid geworden van deze kamer.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>Gebruiker uitnodigen mislukt: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>Gebruiker uitgenodigd: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation>Kamer %1 gecreëerd.</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -255,7 +247,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@ -265,13 +257,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
@ -301,55 +293,66 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished">Kies een bestand</translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished">Alle bestanden (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Leeg wachtwoord</translation>
</message>
@ -785,6 +788,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Gebruikersnaam</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Wachtwoord</translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>REGISTREREN</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Het wachtwoord is niet lang genoeg (minimaal 8 tekens)</translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation>De wachtwoorden komen niet overeen</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Ongeldige servernaam</translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,74 +1229,112 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation>Kamer verlaten</translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished">Kamer verlaten</translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Accepteren</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Afwijzen</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Accepteren</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Afwijzen</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished">Kamer betreden</translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Annuleren</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Nieuwe kamer creëren</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation>Kamer betreden</translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1589,17 +1702,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished">Je bent lid geworden van deze kamer.</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1620,12 +1738,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1641,85 +1754,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation type="unfinished">Leesbevestigingen</translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1776,54 +1829,6 @@ Example: https://server.my:8787</source>
<translation>Afsluiten</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1863,7 +1868,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1886,8 +1891,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1895,7 +1900,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Minimaliseren naar systeemvak</translation>
</message>
@ -2699,23 +2704,10 @@ Mediagrootte: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

@ -53,14 +53,6 @@
<translation>Anuluj</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>Dołączyłeś(-ł) do tego pokoju.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>Nie udało się zaprosić użytkownika: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Czy na pewno chcesz zaprosić %1 (%2)?</translation>
</message>
@ -235,12 +227,12 @@
<translation>Odblokowano użytkownika: %1</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation>Nie udało się przenieść pamięci podręcznej!</translation>
</message>
@ -255,7 +247,7 @@
<translation>Pamięć podręczna na Twoim dysku jest nowsza niż wersja obsługiwana przez Nheko. Zaktualizuj lub wyczyść pamięć podręczną.</translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Nie udało się przywrócić konta OLM. Spróbuj zalogować się ponownie.</translation>
</message>
@ -265,13 +257,13 @@
<translation>Nie udało się przywrócić zapisanych danych. Spróbuj zalogować się ponownie.</translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Nie udało się ustawić kluczy szyfrujących. Odpowiedź serwera: %1 %2. Spróbuj ponownie później.</translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation>Spróbuj zalogować się ponownie: %1</translation>
</message>
@ -301,55 +293,66 @@
<translation>Nie udało się opuścić pokoju: %1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation>Wszystkie pokoje</translation>
<translation type="unfinished">Wszystkie pokoje</translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation>Ulubione pokoje</translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation>Pokoje o niskim priorytecie</translation>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<translation>Ogłoszenia serwera</translation>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<translation> (tag)</translation>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<translation> (społeczność)</translation>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished">Ogłoszenia serwera</translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Zdarzenie szyfrowania (Nie znaleziono kluczy deszyfrujących)</translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished">Wybierz plik</translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished">Wszystkie pliki (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -693,13 +696,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Automatyczne odkrywanie zakończone niepowodzeniem. Otrzymano nieprawidłową odpowiedź.</translation>
</message>
@ -709,7 +712,7 @@ Example: https://server.my:8787</source>
<translation>Automatyczne odkrywanie zakończone niepowodzeniem. Napotkano nieznany błąd. .well-known.</translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>Nie odnaleziono wymaganych punktów końcowych. To może nie być serwer Matriksa.</translation>
</message>
@ -724,12 +727,12 @@ Example: https://server.my:8787</source>
<translation>Wystąpił nieznany błąd. Upewnij się, że domena serwera domowego jest prawidłowa.</translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation>Logowanie SSO</translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Puste hasło</translation>
</message>
@ -787,6 +790,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation>%1 utworzył i skonfigurował pokój: %2</translation>
</message>
@ -862,7 +870,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -881,6 +889,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1020,7 +1098,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation>Niezaimplementowane wydarzenie: </translation>
</message>
@ -1028,7 +1106,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation>Stwórz unikalny profil, który pozwoli Ci na zalogowanie się do kilku kont jednocześnie i uruchomienie wielu instancji Nheko.</translation>
</message>
@ -1046,18 +1124,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Nazwa użytkownika</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Nazwa użytkownika nie może być pusta i może zawierać wyłącznie znaki a-z, 0-9, ., _, =, -, i /.</translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Hasło</translation>
</message>
@ -1082,22 +1160,47 @@ Example: https://server.my:8787</source>
<translation>Serwer, który pozwala na rejestrację. Ponieważ Matrix jest zdecentralizowany, musisz najpierw znaleźć serwer który pozwala na rejestrację bądź hostować swój własny.</translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>ZAREJESTRUJ</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation>Nie wspierana procedura rejestracji!</translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished">Automatyczne odkrywanie zakończone niepowodzeniem. Otrzymano nieprawidłową odpowiedź.</translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished">Automatyczne odkrywanie zakończone niepowodzeniem. Napotkano nieznany błąd. .well-known.</translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished">Nie odnaleziono wymaganych punktów końcowych. To może nie być serwer Matriksa.</translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Otrzymano nieprawidłową odpowiedź. Upewnij się, że domena serwera domowego jest prawidłowa.</translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Wystąpił nieznany błąd. Upewnij się, że domena serwera domowego jest prawidłowa.</translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Hasło jest zbyt krótkie (min. 8 znaków)</translation>
</message>
@ -1107,7 +1210,7 @@ Example: https://server.my:8787</source>
<translation>Hasła nie pasują do siebie</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Nieprawidłowa nazwa serwera</translation>
</message>
@ -1115,7 +1218,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation>Zamknij</translation>
</message>
@ -1128,74 +1231,112 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation>Opuść pokój</translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished">Opuść pokój</translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Akceptuj</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Odrzuć</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Akceptuj</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Odrzuć</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished">Wyloguj</translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished">Utwórz nowy czat</translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished">Dołącz do pokoju</translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished">Katalog pokojów</translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished">Ustawienia użytkownika</translation>
</message>
</context>
<context>
@ -1384,34 +1525,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Anuluj</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation>Ustawienia użytkownika</translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Utwórz nowy pokój</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation>Dołącz do pokoju</translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation>Utwórz nowy czat</translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation>Katalog pokojów</translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1438,7 +1551,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1456,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
</message>
@ -1592,17 +1705,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished">Dołączyłeś(-ł) do tego pokoju.</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1623,12 +1741,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1644,85 +1757,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation>Potwierdzenia przeczytania</translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1779,54 +1832,6 @@ Example: https://server.my:8787</source>
<translation>Zakończ</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation>Wyloguj</translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1866,7 +1871,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished">Wybierz awatar</translation>
</message>
@ -1889,8 +1894,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1898,7 +1903,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Zminimalizuj do paska zadań</translation>
</message>
@ -2702,23 +2707,10 @@ Rozmiar multimediów: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

File diff suppressed because it is too large Load Diff

@ -53,14 +53,6 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -255,7 +247,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@ -265,13 +257,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
@ -301,55 +293,66 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
@ -779,6 +782,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -808,13 +816,13 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-72"/>
<location line="-80"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+72"/>
<location line="+80"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,73 +1229,111 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1589,17 +1702,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1620,12 +1738,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1641,85 +1754,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1776,54 +1829,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1863,7 +1868,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1886,8 +1891,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1895,7 +1900,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2697,23 +2702,10 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

@ -53,14 +53,6 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>Te-ai alăturat camerei.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>Nu s-a putut invita utilizatorul: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>Utilizator invitat: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Nu s-a putut muta cache-ul pe versiunea curentă. Acest lucru poate avea diferite cauze. rugăm deschideți un issue și încercați folosiți o versiune mai veche între timp. O altă opțiune ar fi încercați ștergeți cache-ul manual.</translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation>Camera %1 a fost creată.</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation>Utilizator dezinterzis: %1</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation>Nu s-a putut migra cache-ul!</translation>
</message>
@ -255,7 +247,7 @@
<translation>Cache-ul de pe disc este mai nou decât versiunea pe care Nheko o suportă. rugăm actualizați sau ștergeți cache-ul.</translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Nu s-a putut restabili contul OLM. rugăm reconectați.</translation>
</message>
@ -265,13 +257,13 @@
<translation>Nu s-au putut restabili datele salvate. rugăm reconectați.</translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Nu s-au putut stabili cheile. Răspunsul serverului: %1 %2. rugăm încercați mai târziu.</translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation> rugăm reconectați: %1</translation>
</message>
@ -301,55 +293,66 @@
<translation>Nu s-a putut părăsi camera: %1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation>Toate camerele</translation>
<translation type="unfinished">Toate camerele</translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation>Camere favorite</translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation>Camere cu prioritate scăzută</translation>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<translation> (etichetă)</translation>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<translation> (comunitate)</translation>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished">Toate fișierele (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -695,13 +698,13 @@ Exemplu: https://serverul.meu:8787</translation>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Autodescoperirea a eșuat. Răspunsul primit este defectuos.</translation>
</message>
@ -711,7 +714,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Autodescoperirea a eșuat. Eroare necunoscută la solicitarea .well-known.</translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>Punctele finale necesare nu au fost găsite. Posibil a nu fi un server Matrix.</translation>
</message>
@ -726,12 +729,12 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>A apărut o eroare necunoscută. Verificați ca domeniul homeserverului fie valid.</translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation>CONECTARE SSO</translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Parolă necompletată</translation>
</message>
@ -789,6 +792,11 @@ Exemplu: https://serverul.meu:8787</translation>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation>%1 a creat și configurat camera: %2</translation>
</message>
@ -864,7 +872,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -883,6 +891,76 @@ Exemplu: https://serverul.meu:8787</translation>
<source>Options</source>
<translation type="unfinished">Opțiuni</translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished">Vedeți mesajul brut</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished">Vedeți mesajul brut decriptat</translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1022,7 +1100,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation>eveniment neimplementat: </translation>
</message>
@ -1030,7 +1108,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1048,18 +1126,18 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Nume de utilizator</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Numele de utilizator nu poate fi gol, și trebuie conțină doar caracterele a-z, 0-9, ., =, - și /.</translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Parolă</translation>
</message>
@ -1084,22 +1162,47 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Un server care permite înregistrarea. Deoarece Matrix este decentralizat, trebuie găsiți un server pe care înregistrați sau găzduiți propriul server.</translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>ÎNREGISTRARE</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation>Fluxuri de înregistrare nesuportate!</translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished">Autodescoperirea a eșuat. Răspunsul primit este defectuos.</translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished">Autodescoperirea a eșuat. Eroare necunoscută la solicitarea .well-known.</translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished">Punctele finale necesare nu au fost găsite. Posibil a nu fi un server Matrix.</translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Răspuns eronat primit. Verificați ca domeniul homeserverului fie valid.</translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">A apărut o eroare necunoscută. Verificați ca domeniul homeserverului fie valid.</translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Parola nu este destul de lungă (minim 8 caractere)</translation>
</message>
@ -1109,7 +1212,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Parolele nu se potrivesc</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Nume server invalid</translation>
</message>
@ -1117,7 +1220,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished">Închide</translation>
</message>
@ -1130,74 +1233,112 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation>nicio versiune stocată</translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation>Părăsește camera</translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished">Părăsește camera</translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Acceptare</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Refuzare</translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Acceptare</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Refuzare</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished">Deconectare</translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished">Începe o nouă conversație</translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished">Alătură-te unei camere</translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished">Registru de camere</translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished">Setări utilizator</translation>
</message>
</context>
<context>
@ -1386,34 +1527,6 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation>Setări utilizator</translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Crează cameră nouă</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation>Alătură-te unei camere</translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation>Începe o nouă conversație</translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation>Registru de camere</translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1440,7 +1553,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1458,7 +1571,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation>Redactare mesaj eșuată: %1</translation>
</message>
@ -1594,17 +1707,22 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>%1 a fost interzis(ă).</translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation>%1 și-a redactat ciocănitul.</translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation>Te-ai alăturat camerei.</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1625,12 +1743,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>%1 a părăsit camera după ce a părăsit-o deja înainte!</translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation>Motiv: %1</translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation>%1 a ciocănit.</translation>
</message>
@ -1646,85 +1759,25 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation>Răspuns</translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation>Confirmări de citire</translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation>Marcați ca citit</translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation>Vedeți mesajul brut</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation>Vedeți mesajul brut decriptat</translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation>Salvare ca</translation>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation>Nicio cameră deschisă</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<translation>Nicio cameră deschisă</translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1781,54 +1834,6 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Ieșire</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation>Deconectare</translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1868,7 +1873,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished">Selectează un avatar</translation>
</message>
@ -1891,8 +1896,8 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1900,7 +1905,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Minimizează în bara de notificări</translation>
</message>
@ -2704,23 +2709,10 @@ Dimensiune media: %2
<translation>%1 a încheiat un apel</translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation>Această cameră</translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation>Toate camerele</translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation>Tip mesaj necunoscut</translation>
</message>

File diff suppressed because it is too large Load Diff

@ -53,14 +53,6 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -255,7 +247,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@ -265,13 +257,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
@ -301,55 +293,66 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
@ -785,6 +788,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,73 +1229,111 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1589,17 +1702,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1620,12 +1738,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1641,85 +1754,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1776,54 +1829,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1863,7 +1868,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1886,8 +1891,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1895,7 +1900,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2697,23 +2702,10 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

@ -53,14 +53,6 @@
<translation>Avbryt</translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation>Du gick med i detta rum.</translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>Kunde inte bjuda in användare: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>Bjöd in användare: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Kunde inte migrera cachen till den nuvarande versionen. Detta kan bero flera anledningar, vänligen rapportera problemet och prova en äldre version under tiden. Du kan också försöka att manuellt radera cachen.</translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation>Rum %1 skapat.</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation>Bekräfta inbjudan</translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Är du säker att du vill bjuda in %1 (%2)?</translation>
</message>
@ -235,12 +227,12 @@
<translation>Hävde bannlysningen av användare: %1</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation>Cache-migration misslyckades!</translation>
</message>
@ -255,7 +247,7 @@
<translation>Cachen ditt lagringsmedia är nyare än vad denna version av Nheko stödjer. Vänligen uppdatera eller rensa din cache.</translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Kunde inte återställa OLM-konto. Vänligen logga in nytt.</translation>
</message>
@ -265,13 +257,13 @@
<translation>Kunde inte återställa sparad data. Vänligen logga in nytt.</translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Kunde inte sätta upp krypteringsnycklar. Svar från servern: %1 %2. Vänligen försök igen senare.</translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation>Vänligen försök logga in nytt: %1</translation>
</message>
@ -301,55 +293,66 @@
<translation>Kunde inte lämna rum: %1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation>Alla rum</translation>
<translation type="unfinished">Alla rum</translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation>Favoritrum</translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<translation>Lågprioritetsrum</translation>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<translation>Servernotiser</translation>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished">Låg prioritet</translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<translation> (tagg)</translation>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<translation> (community)</translation>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished">Servernotiser</translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation>Dekryptera hemliga nycklar</translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Krypterat Event (Inga nycklar kunde hittas för dekryptering) --</translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation>Välj en fil</translation>
</message>
@ -614,7 +617,7 @@
<translation>Alla Filer (*)</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation>Kunde inte ladda upp media. Vänligen försök igen.</translation>
</message>
@ -695,13 +698,13 @@ Exempel: https://server.my:8787</translation>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation>Autouppslag misslyckades. Mottog felkonstruerat svar.</translation>
</message>
@ -711,7 +714,7 @@ Exempel: https://server.my:8787</translation>
<translation>Autouppslag misslyckades. Okänt fel uppstod vid begäran av .well-known.</translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation>Kunde inte hitta de nödvändiga ändpunkterna. Möjligtvis inte en Matrix-server.</translation>
</message>
@ -726,12 +729,12 @@ Exempel: https://server.my:8787</translation>
<translation>Ett okänt fel uppstod. Se till att hemserver-domänen är giltig.</translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation>SSO INLOGGNING</translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation>Tomt lösenord</translation>
</message>
@ -783,6 +786,11 @@ Exempel: https://server.my:8787</translation>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation>%1 skapade och konfigurerade rum: %2</translation>
</message>
@ -812,13 +820,13 @@ Exempel: https://server.my:8787</translation>
<translation>%1 besvarade samtalet.</translation>
</message>
<message>
<location line="-72"/>
<location line="-80"/>
<location line="+9"/>
<source>removed</source>
<translation>borttagen</translation>
</message>
<message>
<location line="+72"/>
<location line="+80"/>
<source>%1 ended the call.</source>
<translation>%1 avslutade samtalet.</translation>
</message>
@ -864,7 +872,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -883,6 +891,76 @@ Exempel: https://server.my:8787</translation>
<source>Options</source>
<translation type="unfinished">Alternativ</translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished">Visa meddelandekälla</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished">Visa dekrypterad meddelandekälla</translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1022,7 +1100,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation>ej implementerat event: </translation>
</message>
@ -1030,7 +1108,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation>Skapa en unik profil, vilket tillåter dig att logga in flera konton samtidigt och starta flera instanser av Nheko.</translation>
</message>
@ -1048,18 +1126,18 @@ Exempel: https://server.my:8787</translation>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation>Användarnamn</translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Användarnamnet kan inte vara tomt, och måste enbart innehålla tecknen a-z, 0-9, ., _, =, -, och /.</translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation>Lösenord</translation>
</message>
@ -1084,22 +1162,47 @@ Exempel: https://server.my:8787</translation>
<translation>En server som tillåter registrering. Eftersom matrix är decentraliserat behöver du först hitta en server du kan registrera dig , eller upprätta en egen hand.</translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation>REGISTRERA</translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation>Inga stödda registreringsflöden!</translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation>Ett eller flera fält har ogiltigt innehåll. Vänligen korrigera problemen och försök igen.</translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished">Autouppslag misslyckades. Mottog felkonstruerat svar.</translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished">Autouppslag misslyckades. Okänt fel uppstod vid begäran av .well-known.</translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished">Kunde inte hitta de nödvändiga ändpunkterna. Möjligtvis inte en Matrix-server.</translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Mottog felkonstruerat svar. Se till att hemserver-domänen är giltig.</translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished">Ett okänt fel uppstod. Se till att hemserver-domänen är giltig.</translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Lösenordet är inte långt nog (minst 8 tecken)</translation>
</message>
@ -1109,7 +1212,7 @@ Exempel: https://server.my:8787</translation>
<translation>Lösenorden stämmer inte överens</translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation>Ogiltigt servernamn</translation>
</message>
@ -1117,7 +1220,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation>Stäng</translation>
</message>
@ -1130,74 +1233,112 @@ Exempel: https://server.my:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation>ingen version lagrad</translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation>Lämna rum</translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished">Lämna rum</translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation>Tagga rum som:</translation>
<translation type="unfinished">Tagga rum som:</translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation>Favorit</translation>
<translation type="unfinished">Favorit</translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<translation>Låg prioritet</translation>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<translation>Servernotis</translation>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<translation>Lägger till eller tar bort den angivna taggen.</translation>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Ny tagg</translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Godkänn</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<translation>Ny tagg</translation>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<translation>Tagg:</translation>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation>Godkänn</translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation>Avvisa</translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished">Logga ut</translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished">Starta en ny chatt</translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"> med i ett rum</translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished">Rumkatalog</translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished">Användarinställningar</translation>
</message>
</context>
<context>
@ -1386,34 +1527,6 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished">Avbryt</translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation>Användarinställningar</translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation>Skapa nytt rum</translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation> med i ett rum</translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation>Starta en ny chatt</translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation>Rumkatalog</translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1440,7 +1553,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation>Lyckad verifikation</translation>
</message>
@ -1458,7 +1571,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation>Kunde inte maskera meddelande: %1</translation>
</message>
@ -1593,17 +1706,22 @@ Exempel: https://server.my:8787</translation>
<translation>%1 blev bannlyst.</translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation>%1 maskerade sin knackning.</translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation>Du gick med i detta rum.</translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1624,12 +1742,7 @@ Exempel: https://server.my:8787</translation>
<translation>%1 lämnade efter att redan ha lämnat!</translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation>Anledning: %1</translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation>%1 knackade.</translation>
</message>
@ -1645,85 +1758,25 @@ Exempel: https://server.my:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation>Reagera</translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation>Svara</translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation>Läskvitton</translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation>Markera som läst</translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation>Visa meddelandekälla</translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation>Visa dekrypterad meddelandekälla</translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation>Ta bort meddelande</translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation>Spara som</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation>Inget rum öppet</translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<translation>Inget rum öppet</translation>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished">Tillbaka till rumlista</translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Ingen krypterad privat chatt med denna användare kunde hittas. Skapa en krypterad privat chatt med användaren och försök igen.</translation>
</message>
@ -1780,54 +1833,6 @@ Exempel: https://server.my:8787</translation>
<translation>Avsluta</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation>Logga ut</translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation>Sätt statusmeddelande</translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation>Statusmeddelande</translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation>Status:</translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation>Sätt närvaro automatiskt</translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation>Online</translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation>Otillgänglig</translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation>Offline</translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1867,7 +1872,7 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation>Välj en avatar</translation>
</message>
@ -1890,8 +1895,8 @@ Exempel: https://server.my:8787</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1899,7 +1904,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation>Minimera till systemtråg</translation>
</message>
@ -2711,23 +2716,10 @@ Mediastorlek: %2
<translation>%1 lade </translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation>Detta Rum</translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation>Alla Rum</translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation>Okänd meddelandetyp</translation>
</message>

@ -53,14 +53,6 @@
<translation></translation>
</message>
</context>
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+2016"/>
<source>You joined this room.</source>
<translation></translation>
</message>
</context>
<context>
<name>CallInvite</name>
<message>
@ -133,23 +125,23 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+204"/>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<source>Failed to invite user: %1</source>
<translation>: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+809"/>
<location line="+665"/>
<source>Invited user: %1</source>
<translation>: %1</translation>
</message>
<message>
<location line="-509"/>
<location line="-456"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>使</translation>
</message>
<message>
<location line="+412"/>
<location line="+360"/>
<source>Confirm join</source>
<translation type="unfinished"></translation>
</message>
@ -164,13 +156,13 @@
<translation>%1</translation>
</message>
<message>
<location line="+35"/>
<location line="+324"/>
<location line="+34"/>
<location line="+280"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-323"/>
<location line="-279"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -235,12 +227,12 @@
<translation>: %1</translation>
</message>
<message>
<location line="+227"/>
<location line="+183"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-818"/>
<location line="-721"/>
<source>Cache migration failed!</source>
<translation></translation>
</message>
@ -255,7 +247,7 @@
<translation>Nheko版本新Nheko或手动清除缓存</translation>
</message>
<message>
<location line="+50"/>
<location line="+48"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation> OLM </translation>
</message>
@ -265,13 +257,13 @@
<translation></translation>
</message>
<message>
<location line="+145"/>
<location line="+101"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>: %1 %2</translation>
</message>
<message>
<location line="+34"/>
<location line="+123"/>
<location line="+117"/>
<source>Please try to login again: %1</source>
<translation>%1</translation>
</message>
@ -301,55 +293,66 @@
<translation>%1</translation>
</message>
<message>
<location line="+61"/>
<location line="+60"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<name>CommunitiesList</name>
<message>
<location filename="../../src/CommunitiesListItem.cpp" line="+30"/>
<source>Hide rooms with this tag or from this community</source>
<location filename="../qml/CommunitiesList.qml" line="+44"/>
<source>Hide rooms with this tag or from this space by default.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunitiesModel</name>
<message>
<location line="+153"/>
<location filename="../../src/timeline/CommunitiesModel.cpp" line="+37"/>
<source>All rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Favourite rooms</source>
<translation></translation>
<location line="+2"/>
<source>Shows all rooms without filtering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Low priority rooms</source>
<location line="+30"/>
<source>Favourites</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<source>Rooms you have favourited.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Low Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<location line="+2"/>
<source> (tag)</source>
<source>Rooms with low priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source> (community)</source>
<location line="+7"/>
<source>Server Notices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Messages from your server or administrator.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+228"/>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -517,7 +520,7 @@
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+616"/>
<location filename="../../src/timeline/EventStore.cpp" line="+663"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
@ -529,7 +532,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+32"/>
<location line="+35"/>
<location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
@ -604,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+232"/>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -614,7 +617,7 @@
<translation type="unfinished">*</translation>
</message>
<message>
<location line="+418"/>
<location line="+417"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -691,13 +694,13 @@ Example: https://server.my:8787</source>
<message>
<location line="+84"/>
<location line="+11"/>
<location line="+160"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-132"/>
<location line="-131"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
@ -707,7 +710,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+25"/>
<location line="+24"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation> Matrix </translation>
</message>
@ -722,12 +725,12 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="-171"/>
<location line="-168"/>
<source>SSO LOGIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+267"/>
<location line="+264"/>
<source>Empty password</source>
<translation></translation>
</message>
@ -785,6 +788,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+9"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
@ -860,7 +868,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+82"/>
<location filename="../qml/MessageView.qml" line="+83"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
@ -879,6 +887,76 @@ Example: https://server.my:8787</source>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy &amp;link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Re&amp;act</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Repl&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receip&amp;ts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&amp;Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>&amp;Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remo&amp;ve message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&amp;Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to eve&amp;nt</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewVerificationRequest</name>
@ -1018,7 +1096,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+8"/>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1026,7 +1104,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<message>
<location filename="../../src/main.cpp" line="+167"/>
<location filename="../../src/main.cpp" line="+200"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
<translation type="unfinished"></translation>
</message>
@ -1044,18 +1122,18 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
<location filename="../../src/RegisterPage.cpp" line="+77"/>
<location filename="../../src/RegisterPage.cpp" line="+78"/>
<source>Username</source>
<translation></translation>
</message>
<message>
<location line="+2"/>
<location line="+287"/>
<location line="+305"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-283"/>
<location line="-301"/>
<source>Password</source>
<translation></translation>
</message>
@ -1080,22 +1158,47 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+35"/>
<source>REGISTER</source>
<translation></translation>
</message>
<message>
<location line="+62"/>
<location line="+73"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+210"/>
<location line="+213"/>
<source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-26"/>
<location line="+23"/>
<source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
<source>The required endpoints were not found. Possibly not a Matrix server.</source>
<translation type="unfinished"> Matrix </translation>
</message>
<message>
<location line="+6"/>
<source>Received malformed response. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>An unknown error occured. Make sure the homeserver domain is valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>8</translation>
</message>
@ -1105,7 +1208,7 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Invalid server name</source>
<translation></translation>
</message>
@ -1113,7 +1216,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+49"/>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1126,74 +1229,112 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1813"/>
<location filename="../../src/Cache.cpp" line="+4009"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomInfoListItem</name>
<name>RoomList</name>
<message>
<location filename="../../src/RoomInfoListItem.cpp" line="+89"/>
<source>Leave room</source>
<translation></translation>
<location filename="../qml/RoomList.qml" line="+56"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+18"/>
<location line="+14"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<location line="+2"/>
<source>Low priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<location line="+2"/>
<source>Server notice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
<location line="+13"/>
<source>Create new tag...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<source>Enter your status message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+169"/>
<source>Accept</source>
<translation></translation>
<location line="+10"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Decline</source>
<translation></translation>
<location line="+5"/>
<source>Set status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<source>Logout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<source>Start a new chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Join a room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Create a new room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>Room directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>User settings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1382,34 +1523,6 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SideBarActions</name>
<message>
<location filename="../../src/SideBarActions.cpp" line="+44"/>
<source>User settings</source>
<translation></translation>
</message>
<message>
<location line="+7"/>
<source>Create new room</source>
<translation></translation>
</message>
<message>
<location line="+1"/>
<source>Join a room</source>
<translation></translation>
</message>
<message>
<location line="+16"/>
<source>Start a new chat</source>
<translation></translation>
</message>
<message>
<location line="+15"/>
<source>Room directory</source>
<translation></translation>
</message>
</context>
<context>
<name>StatusIndicator</name>
<message>
@ -1436,7 +1549,7 @@ Example: https://server.my:8787</source>
<context>
<name>Success</name>
<message>
<location filename="../qml/device-verification/Success.qml" line="+10"/>
<location filename="../qml/device-verification/Success.qml" line="+11"/>
<source>Successful Verification</source>
<translation type="unfinished"></translation>
</message>
@ -1454,7 +1567,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1044"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">%1</translation>
</message>
@ -1588,17 +1701,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-11"/>
<location line="+9"/>
<source>Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-20"/>
<source>%1 redacted their knock.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-876"/>
<location line="-883"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+842"/>
<location line="+849"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1619,12 +1737,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<source> Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="+10"/>
<source>%1 knocked.</source>
<translation type="unfinished"></translation>
</message>
@ -1640,85 +1753,25 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+125"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Read receipts</source>
<translation></translation>
</message>
<message>
<location line="+6"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Mark as read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>View raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>View decrypted raw message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Remove message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<location filename="../qml/TimelineView.qml" line="+27"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Copy link to event</source>
<location line="+127"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+57"/>
<source>No room open</source>
<location line="+46"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+570"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1775,54 +1828,6 @@ Example: https://server.my:8787</source>
<translation>退</translation>
</message>
</context>
<context>
<name>UserInfoWidget</name>
<message>
<location filename="../../src/UserInfoWidget.cpp" line="+82"/>
<source>Logout</source>
<translation></translation>
</message>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User Profile Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserProfile</name>
<message>
@ -1862,7 +1867,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/UserProfile.cpp" line="+301"/>
<location filename="../../src/ui/UserProfile.cpp" line="+307"/>
<source>Select an avatar</source>
<translation type="unfinished"></translation>
</message>
@ -1885,8 +1890,8 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+340"/>
<location filename="../../src/UserSettingsPage.h" line="+186"/>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
@ -1894,7 +1899,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+553"/>
<location line="+524"/>
<source>Minimize to tray</source>
<translation></translation>
</message>
@ -2698,23 +2703,10 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>
<message>
<location filename="../../src/popups/UserMentions.cpp" line="+68"/>
<source>This Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>All Rooms</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>utils</name>
<message>
<location filename="../../src/Utils.h" line="+4"/>
<location line="+4"/>
<source>Unknown Message Type</source>
<translation type="unfinished"></translation>
</message>

@ -14,6 +14,7 @@ Rectangle {
property alias url: img.source
property string userid
property string displayName
property alias textColor: label.color
signal clicked(var mouse)
@ -26,6 +27,8 @@ Rectangle {
}
Label {
id: label
anchors.fill: parent
text: TimelineManager.escapeEmoji(displayName ? String.fromCodePoint(displayName.codePointAt(0)) : "")
textFormat: Text.RichText

@ -3,7 +3,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick 2.9
import QtQuick.Controls 2.13
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import "components"
import im.nheko 1.0
@ -17,19 +17,30 @@ Rectangle {
id: adaptiveView
anchors.fill: parent
singlePageMode: width < communityListC.maximumWidth + roomListC.maximumWidth + timlineViewC.minimumWidth
singlePageMode: communityListC.preferredWidth + roomListC.preferredWidth + timlineViewC.minimumWidth > width
pageIndex: Rooms.currentRoom ? 2 : 1
AdaptiveLayoutElement {
id: communityListC
minimumWidth: Nheko.avatarSize * 2 + Nheko.paddingSmall * 2
collapsedWidth: Nheko.avatarSize + Nheko.paddingSmall * 2
preferredWidth: Nheko.avatarSize + Nheko.paddingSmall * 2
maximumWidth: Nheko.avatarSize * 7 + Nheko.paddingSmall * 2
visible: Settings.groupView
minimumWidth: communitiesList.avatarSize * 4 + Nheko.paddingMedium * 2
collapsedWidth: communitiesList.avatarSize + 2 * Nheko.paddingMedium
preferredWidth: Settings.communityListWidth >= minimumWidth ? Settings.communityListWidth : collapsedWidth
maximumWidth: communitiesList.avatarSize * 10 + 2 * Nheko.paddingMedium
Rectangle {
color: Nheko.theme.sidebarBackground
CommunitiesList {
id: communitiesList
collapsed: parent.collapsed
}
Binding {
target: Settings
property: 'communityListWidth'
value: communityListC.preferredWidth
when: !adaptiveView.singlePageMode
delayed: true
}
}
@ -37,9 +48,9 @@ Rectangle {
AdaptiveLayoutElement {
id: roomListC
minimumWidth: Nheko.avatarSize * 5 + Nheko.paddingSmall * 2
preferredWidth: Nheko.avatarSize * 5 + Nheko.paddingSmall * 2
maximumWidth: Nheko.avatarSize * 10 + Nheko.paddingSmall * 2
minimumWidth: roomlist.avatarSize * 4 + Nheko.paddingSmall * 2
preferredWidth: Settings.roomListWidth >= minimumWidth ? Settings.roomListWidth : roomlist.avatarSize * 5 + Nheko.paddingSmall * 2
maximumWidth: roomlist.avatarSize * 10 + Nheko.paddingSmall * 2
collapsedWidth: roomlist.avatarSize + 2 * Nheko.paddingMedium
RoomList {
@ -48,12 +59,20 @@ Rectangle {
collapsed: parent.collapsed
}
Binding {
target: Settings
property: 'roomListWidth'
value: roomListC.preferredWidth
when: !adaptiveView.singlePageMode
delayed: true
}
}
AdaptiveLayoutElement {
id: timlineViewC
minimumWidth: 400
minimumWidth: fontMetrics.averageCharacterWidth * 40 + Nheko.avatarSize + 2 * Nheko.paddingMedium
TimelineView {
id: timeline
@ -70,7 +89,7 @@ Rectangle {
anchors.fill: parent
visible: Settings.privacyScreen
screenTimeout: Settings.privacyScreenTimeout
timelineRoot: timeline
timelineRoot: adaptiveView
}
}

@ -0,0 +1,160 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import "./dialogs"
import Qt.labs.platform 1.1 as Platform
import QtQml 2.12
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import im.nheko 1.0
Page {
//leftPadding: Nheko.paddingSmall
//rightPadding: Nheko.paddingSmall
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 1.6)
property bool collapsed: false
ListView {
id: communitiesList
anchors.left: parent.left
anchors.right: parent.right
height: parent.height
model: Communities
ScrollHelper {
flickable: parent
anchors.fill: parent
enabled: !Settings.mobileMode
}
Platform.Menu {
id: communityContextMenu
property string tagId
function show(id_, tags_) {
tagId = id_;
open();
}
Platform.MenuItem {
text: qsTr("Hide rooms with this tag or from this space by default.")
onTriggered: Communities.toggleTagId(communityContextMenu.tagId)
}
}
delegate: Rectangle {
id: communityItem
property color background: Nheko.colors.window
property color importantText: Nheko.colors.text
property color unimportantText: Nheko.colors.buttonText
property color bubbleBackground: Nheko.colors.highlight
property color bubbleText: Nheko.colors.highlightedText
color: background
height: avatarSize + 2 * Nheko.paddingMedium
width: ListView.view.width
state: "normal"
ToolTip.visible: hovered.hovered && collapsed
ToolTip.text: model.tooltip
states: [
State {
name: "highlight"
when: (hovered.hovered || model.hidden) && !(Communities.currentTagId == model.id)
PropertyChanges {
target: communityItem
background: Nheko.colors.dark
importantText: Nheko.colors.brightText
unimportantText: Nheko.colors.brightText
bubbleBackground: Nheko.colors.highlight
bubbleText: Nheko.colors.highlightedText
}
},
State {
name: "selected"
when: Communities.currentTagId == model.id
PropertyChanges {
target: communityItem
background: Nheko.colors.highlight
importantText: Nheko.colors.highlightedText
unimportantText: Nheko.colors.highlightedText
bubbleBackground: Nheko.colors.highlightedText
bubbleText: Nheko.colors.highlight
}
}
]
TapHandler {
margin: -Nheko.paddingSmall
acceptedButtons: Qt.RightButton
onSingleTapped: communityContextMenu.show(model.id)
gesturePolicy: TapHandler.ReleaseWithinBounds
}
TapHandler {
margin: -Nheko.paddingSmall
onSingleTapped: Communities.setCurrentTagId(model.id)
onLongPressed: communityContextMenu.show(model.id)
}
HoverHandler {
id: hovered
margin: -Nheko.paddingSmall
}
RowLayout {
spacing: Nheko.paddingMedium
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
Avatar {
id: avatar
enabled: false
Layout.alignment: Qt.AlignVCenter
height: avatarSize
width: avatarSize
url: {
if (model.avatarUrl.startsWith("mxc://"))
return model.avatarUrl.replace("mxc://", "image://MxcImage/");
else
return "image://colorimage/" + model.avatarUrl + "?" + communityItem.unimportantText;
}
displayName: model.displayName
color: communityItem.background
}
ElidedLabel {
visible: !collapsed
Layout.alignment: Qt.AlignVCenter
color: communityItem.importantText
elideWidth: parent.width - avatar.width - Nheko.paddingMedium
fullText: model.displayName
textFormat: Text.PlainText
}
Item {
Layout.fillWidth: true
}
}
}
}
background: Rectangle {
color: Nheko.theme.sidebarBackground
}
}

@ -3,7 +3,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick 2.9
import QtQuick.Controls 2.13
import QtQuick.Controls 2.5
import im.nheko 1.0
Label {

@ -26,6 +26,7 @@ AbstractButton {
// Workaround, can't get icon.source working for now...
anchors.fill: parent
source: image != "" ? ("image://colorimage/" + image + "?" + ((button.hovered && changeColorOnHover) ? highlightColor : buttonTextColor)) : ""
fillMode: Image.PreserveAspectFit
}
CursorShape {

@ -12,7 +12,8 @@ TextEdit {
focus: false
wrapMode: Text.Wrap
selectByMouse: !Settings.mobileMode
enabled: selectByMouse
// this always has to be enabled, otherwise you can't click links anymore!
//enabled: selectByMouse
color: Nheko.colors.text
onLinkActivated: Nheko.openLink(link)
ToolTip.visible: hoveredLink

@ -449,14 +449,14 @@ ScrollView {
Platform.MenuItem {
visible: messageContextMenu.text
enabled: visible
text: qsTr("Copy")
text: qsTr("&Copy")
onTriggered: Clipboard.text = messageContextMenu.text
}
Platform.MenuItem {
visible: messageContextMenu.link
enabled: visible
text: qsTr("Copy link location")
text: qsTr("Copy &link location")
onTriggered: Clipboard.text = messageContextMenu.link
}
@ -464,7 +464,7 @@ ScrollView {
id: reactionOption
visible: room ? room.permissions.canSend(MtxEvent.Reaction) : false
text: qsTr("React")
text: qsTr("Re&act")
onTriggered: emojiPopup.show(null, function(emoji) {
room.input.reaction(messageContextMenu.eventId, emoji);
})
@ -472,25 +472,25 @@ ScrollView {
Platform.MenuItem {
visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
text: qsTr("Reply")
text: qsTr("Repl&y")
onTriggered: room.replyAction(messageContextMenu.eventId)
}
Platform.MenuItem {
visible: messageContextMenu.isEditable && (room ? room.permissions.canSend(MtxEvent.TextMessage) : false)
enabled: visible
text: qsTr("Edit")
text: qsTr("&Edit")
onTriggered: room.editAction(messageContextMenu.eventId)
}
Platform.MenuItem {
text: qsTr("Read receipts")
text: qsTr("Read receip&ts")
onTriggered: room.readReceiptsAction(messageContextMenu.eventId)
}
Platform.MenuItem {
visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker || messageContextMenu.eventType == MtxEvent.TextMessage || messageContextMenu.eventType == MtxEvent.LocationMessage || messageContextMenu.eventType == MtxEvent.EmoteMessage || messageContextMenu.eventType == MtxEvent.NoticeMessage
text: qsTr("Forward")
text: qsTr("&Forward")
onTriggered: {
var forwardMess = forwardCompleterComponent.createObject(timelineRoot);
forwardMess.setMessageEventId(messageContextMenu.eventId);
@ -499,7 +499,7 @@ ScrollView {
}
Platform.MenuItem {
text: qsTr("Mark as read")
text: qsTr("&Mark as read")
}
Platform.MenuItem {
@ -517,28 +517,28 @@ ScrollView {
Platform.MenuItem {
visible: (room ? room.permissions.canRedact() : false) || messageContextMenu.isSender
text: qsTr("Remove message")
text: qsTr("Remo&ve message")
onTriggered: room.redactEvent(messageContextMenu.eventId)
}
Platform.MenuItem {
visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker
enabled: visible
text: qsTr("Save as")
text: qsTr("&Save as")
onTriggered: room.saveMedia(messageContextMenu.eventId)
}
Platform.MenuItem {
visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker
enabled: visible
text: qsTr("Open in external program")
text: qsTr("&Open in external program")
onTriggered: room.openMedia(messageContextMenu.eventId)
}
Platform.MenuItem {
visible: messageContextMenu.eventId
enabled: visible
text: qsTr("Copy link to event")
text: qsTr("Copy link to eve&nt")
onTriggered: room.copyLinkToEvent(messageContextMenu.eventId)
}

@ -4,9 +4,9 @@
import "./dialogs"
import Qt.labs.platform 1.1 as Platform
import QtQml 2.13
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQml 2.12
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import im.nheko 1.0
@ -32,8 +32,8 @@ Page {
Connections {
onActiveTimelineChanged: {
roomlist.positionViewAtIndex(Rooms.roomidToIndex(TimelineManager.timeline.roomId()), ListView.Contain);
console.log("Test" + TimelineManager.timeline.roomId() + " " + Rooms.roomidToIndex(TimelineManager.timeline.roomId));
roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId()), ListView.Contain);
console.log("Test" + Rooms.currentRoom.roomId() + " " + Rooms.roomidToIndex(Rooms.currentRoom.roomId()));
}
target: TimelineManager
}
@ -70,7 +70,7 @@ Page {
}
Instantiator {
model: Communities.tags
model: Communities.tagsWithDefault
onObjectAdded: roomContextMenu.insertItem(index + 2, object)
onObjectRemoved: roomContextMenu.removeItem(object)
@ -121,7 +121,7 @@ Page {
states: [
State {
name: "highlight"
when: hovered.hovered && !(TimelineManager.timeline && model.roomId == TimelineManager.timeline.roomId())
when: hovered.hovered && !(Rooms.currentRoom && model.roomId == Rooms.currentRoom.roomId())
PropertyChanges {
target: roomItem
@ -255,6 +255,8 @@ Page {
Label {
id: timestamp
visible: !model.isInvite && !model.isSpace
width: visible ? 0 : undefined
Layout.alignment: Qt.AlignRight | Qt.AlignBottom
font.pixelSize: fontMetrics.font.pixelSize * 0.9
color: roomItem.unimportantText
@ -266,12 +268,11 @@ Page {
RowLayout {
Layout.fillWidth: true
spacing: 0
visible: !model.isInvite
visible: !model.isInvite && !model.isSpace
height: visible ? 0 : undefined
ElidedLabel {
color: roomItem.unimportantText
font.weight: Font.Thin
font.pixelSize: fontMetrics.font.pixelSize * 0.9
elideWidth: textContent.width - (notificationBubble.visible ? notificationBubble.width : 0) - Nheko.paddingSmall
fullText: model.lastMessage
@ -447,6 +448,8 @@ Page {
RowLayout {
id: userInfoGrid
property var profile: Nheko.currentUser
spacing: Nheko.paddingMedium
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
@ -457,9 +460,9 @@ Page {
Layout.alignment: Qt.AlignVCenter
Layout.preferredWidth: fontMetrics.lineSpacing * 2
Layout.preferredHeight: fontMetrics.lineSpacing * 2
url: Nheko.currentUser.avatarUrl.replace("mxc://", "image://MxcImage/")
displayName: Nheko.currentUser.displayName
userid: Nheko.currentUser.userid
url: (userInfoGrid.profile ? userInfoGrid.profile.avatarUrl : "").replace("mxc://", "image://MxcImage/")
displayName: userInfoGrid.profile ? userInfoGrid.profile.displayName : ""
userid: userInfoGrid.profile ? userInfoGrid.profile.userid : ""
}
ColumnLayout {
@ -476,17 +479,16 @@ Page {
Layout.alignment: Qt.AlignBottom
font.pointSize: fontMetrics.font.pointSize * 1.1
font.weight: Font.DemiBold
fullText: Nheko.currentUser.displayName
fullText: userInfoGrid.profile ? userInfoGrid.profile.displayName : ""
elideWidth: col.width
}
ElidedLabel {
Layout.alignment: Qt.AlignTop
color: Nheko.colors.buttonText
font.weight: Font.Thin
font.pointSize: fontMetrics.font.pointSize * 0.9
elideWidth: col.width
fullText: Nheko.currentUser.userid
fullText: userInfoGrid.profile ? userInfoGrid.profile.userid : ""
}
}
@ -541,7 +543,7 @@ Page {
anchors.margins: Nheko.paddingMedium
ImageButton {
Layout.alignment: Qt.AlignBottom | Qt.AlignLeft
Layout.fillWidth: true
hoverEnabled: true
width: 22
height: 22
@ -570,7 +572,7 @@ Page {
ImageButton {
visible: !collapsed
Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter
Layout.fillWidth: true
hoverEnabled: true
width: 22
height: 22
@ -582,7 +584,7 @@ Page {
ImageButton {
visible: !collapsed
Layout.alignment: Qt.AlignBottom | Qt.AlignRight
Layout.fillWidth: true
hoverEnabled: true
width: 22
height: 22

@ -9,7 +9,7 @@ import "./voip"
import Qt.labs.platform 1.1 as Platform
import QtGraphicalEffects 1.0
import QtQuick 2.9
import QtQuick.Controls 2.13
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import QtQuick.Window 2.2
import im.nheko 1.0

@ -11,7 +11,7 @@ import "./ui"
import Qt.labs.platform 1.1 as Platform
import QtGraphicalEffects 1.0
import QtQuick 2.9
import QtQuick.Controls 2.13
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import QtQuick.Window 2.2
import im.nheko 1.0
@ -44,7 +44,8 @@ Item {
ColumnLayout {
id: timelineLayout
visible: room != null
visible: room != null && !room.isSpace
enabled: visible
anchors.fill: parent
spacing: 0
@ -130,6 +131,79 @@ Item {
}
ColumnLayout {
visible: room != null && room.isSpace
enabled: visible
anchors.fill: parent
anchors.margins: Nheko.paddingLarge
spacing: Nheko.paddingLarge
Avatar {
url: room ? room.roomAvatarUrl.replace("mxc://", "image://MxcImage/") : ""
displayName: room ? room.roomName : ""
height: 130
width: 130
Layout.alignment: Qt.AlignHCenter
enabled: false
}
MatrixText {
text: room ? room.roomName : ""
font.pixelSize: 24
Layout.alignment: Qt.AlignHCenter
}
MatrixText {
text: qsTr("%1 member(s)").arg(room ? room.roomMemberCount : 0)
Layout.alignment: Qt.AlignHCenter
}
ScrollView {
Layout.alignment: Qt.AlignHCenter
width: timelineView.width - Nheko.paddingLarge * 2
TextArea {
text: TimelineManager.escapeEmoji(room ? room.roomTopic : "")
wrapMode: TextEdit.WordWrap
textFormat: TextEdit.RichText
readOnly: true
background: null
selectByMouse: true
color: Nheko.colors.text
horizontalAlignment: TextEdit.AlignHCenter
onLinkActivated: Nheko.openLink(link)
CursorShape {
anchors.fill: parent
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
}
}
Item {
Layout.fillHeight: true
}
}
ImageButton {
id: backToRoomsButton
anchors.top: parent.top
anchors.left: parent.left
anchors.margins: Nheko.paddingMedium
width: Nheko.avatarSize
height: Nheko.avatarSize
visible: room != null && room.isSpace && showBackButton
enabled: visible
image: ":/icons/icons/ui/angle-pointing-to-left.png"
ToolTip.visible: hovered
ToolTip.text: qsTr("Back to room list")
onClicked: Rooms.resetCurrentRoom()
}
NhekoDropArea {
anchors.fill: parent
roomid: room ? room.roomId() : ""

@ -2,9 +2,9 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.12
import im.nheko 1.0
Container {
@ -87,6 +87,13 @@ Container {
x: parent.preferredWidth
z: 3
CursorShape {
height: parent.height
width: container.splitterGrabMargin * 2
x: -container.splitterGrabMargin
cursorShape: Qt.SizeHorCursor
}
DragHandler {
id: dragHandler
@ -96,9 +103,9 @@ Container {
xAxis.minimum: splitter.minimumWidth - 1
xAxis.maximum: splitter.maximumWidth
margin: container.splitterGrabMargin
dragThreshold: 0
//dragThreshold: 0
grabPermissions: PointerHandler.CanTakeOverFromAnything | PointerHandler.ApprovesTakeOverByHandlersOfSameType
cursorShape: Qt.SizeHorCursor
//cursorShape: Qt.SizeHorCursor
onActiveChanged: {
if (!active)
splitter.parent.preferredWidth = splitter.x;
@ -107,9 +114,10 @@ Container {
}
HoverHandler {
//cursorShape: Qt.SizeHorCursor
enabled: !container.singlePageMode
margin: container.splitterGrabMargin
cursorShape: Qt.SizeHorCursor
}
}

@ -2,9 +2,9 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.12
Item {
property int minimumWidth: 100

@ -148,6 +148,15 @@ Item {
}
DelegateChoice {
roleValue: MtxEvent.Avatar
NoticeMessage {
text: qsTr("%1 changed the room avatar").arg(model.data.userName)
}
}
DelegateChoice {
roleValue: MtxEvent.RoomCreate

@ -60,6 +60,7 @@ Item {
MessageDelegate {
id: reply
enabled: false
width: parent.width
isReply: true
}

@ -5,6 +5,7 @@
import QtQuick 2.3
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.10
import im.nheko 1.0
Pane {
property string title: qsTr("Successful Verification")

@ -3,8 +3,8 @@
// SPDX-License-Identifier: GPL-3.0-or-later
import ".."
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import im.nheko 1.0

@ -35,244 +35,268 @@ Menu {
modal: true
focus: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
height: columnView.implicitHeight + 4
width: columnView.implicitWidth
ColumnLayout {
id: columnView
spacing: 0
anchors.leftMargin: 3
anchors.rightMargin: 3
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.topMargin: 2
// Search field
TextField {
id: emojiSearch
//width: gridView.width - 6
Layout.topMargin: 3
Layout.preferredWidth: 7 * 52 + 20 - 6
placeholderText: qsTr("Search")
selectByMouse: true
rightPadding: clearSearch.width
onTextChanged: searchTimer.restart()
onVisibleChanged: {
if (visible)
forceActiveFocus();
//height: columnView.implicitHeight + 4
//width: columnView.implicitWidth
width: 7 * 52 + 20
Rectangle {
color: Nheko.colors.window
height: columnView.implicitHeight + 4
width: 7 * 52 + 20
ColumnLayout {
id: columnView
spacing: 0
anchors.leftMargin: 3
anchors.rightMargin: 3
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.topMargin: 2
// Search field
TextField {
id: emojiSearch
Layout.topMargin: 3
Layout.preferredWidth: 7 * 52 + 20 - 6
palette: Nheko.colors
background: null
placeholderTextColor: Nheko.colors.buttonText
color: Nheko.colors.text
placeholderText: qsTr("Search")
selectByMouse: true
rightPadding: clearSearch.width
onTextChanged: searchTimer.restart()
onVisibleChanged: {
if (visible)
forceActiveFocus();
}
}
Timer {
id: searchTimer
Timer {
id: searchTimer
interval: 350 // tweak as needed?
onTriggered: {
emojiPopup.model.searchString = emojiSearch.text;
emojiPopup.model.category = Emoji.Category.Search;
interval: 350 // tweak as needed?
onTriggered: {
emojiPopup.model.searchString = emojiSearch.text;
emojiPopup.model.category = Emoji.Category.Search;
}
}
}
ToolButton {
id: clearSearch
ToolButton {
id: clearSearch
visible: emojiSearch.text !== ''
icon.source: "image://colorimage/:/icons/icons/ui/round-remove-button.png?" + (clearSearch.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText)
focusPolicy: Qt.NoFocus
onClicked: emojiSearch.clear()
visible: emojiSearch.text !== ''
icon.source: "image://colorimage/:/icons/icons/ui/round-remove-button.png?" + (clearSearch.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText)
focusPolicy: Qt.NoFocus
onClicked: emojiSearch.clear()
hoverEnabled: true
background: null
anchors {
verticalCenter: parent.verticalCenter
right: parent.right
}
// clear the default hover effects.
anchors {
verticalCenter: parent.verticalCenter
right: parent.right
}
// clear the default hover effects.
Image {
height: parent.height - 2 * Nheko.paddingSmall
width: height
source: "image://colorimage/:/icons/icons/ui/round-remove-button.png?" + (clearSearch.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText)
anchors {
verticalCenter: parent.verticalCenter
right: parent.right
margins: Nheko.paddingSmall
}
}
background: Item {
}
}
}
// emoji grid
GridView {
id: gridView
// emoji grid
GridView {
id: gridView
Layout.preferredHeight: cellHeight * 5
Layout.preferredWidth: 7 * 52 + 20
Layout.leftMargin: 4
cellWidth: 52
cellHeight: 52
boundsBehavior: Flickable.StopAtBounds
clip: true
currentIndex: -1 // prevent sorting from stealing focus
// Individual emoji
delegate: AbstractButton {
width: 48
height: 48
hoverEnabled: true
ToolTip.text: model.shortName
ToolTip.visible: hovered
// TODO: maybe add favorites at some point?
onClicked: {
console.debug("Picked " + model.unicode);
emojiPopup.close();
callback(model.unicode);
}
Layout.preferredHeight: cellHeight * 5
Layout.preferredWidth: 7 * 52 + 20
Layout.leftMargin: 4
cellWidth: 52
cellHeight: 52
boundsBehavior: Flickable.StopAtBounds
clip: true
currentIndex: -1 // prevent sorting from stealing focus
// give the emoji a little oomf
DropShadow {
width: parent.width
height: parent.height
horizontalOffset: 3
verticalOffset: 3
radius: 8
samples: 17
color: "#80000000"
source: parent.contentItem
}
// Individual emoji
delegate: AbstractButton {
width: 48
height: 48
hoverEnabled: true
ToolTip.text: model.shortName
ToolTip.visible: hovered
// TODO: maybe add favorites at some point?
onClicked: {
console.debug("Picked " + model.unicode);
emojiPopup.close();
callback(model.unicode);
}
// give the emoji a little oomf
DropShadow {
width: parent.width
height: parent.height
horizontalOffset: 3
verticalOffset: 3
radius: 8
samples: 17
color: "#80000000"
source: parent.contentItem
}
contentItem: Text {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.family: Settings.emojiFont
font.pixelSize: 36
text: model.unicode
color: Nheko.colors.text
}
background: Rectangle {
anchors.fill: parent
color: hovered ? Nheko.colors.highlight : 'transparent'
radius: 5
}
contentItem: Text {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.family: Settings.emojiFont
font.pixelSize: 36
text: model.unicode
}
background: Rectangle {
anchors.fill: parent
color: hovered ? Nheko.colors.highlight : 'transparent'
radius: 5
ScrollBar.vertical: ScrollBar {
id: emojiScroll
}
}
ScrollBar.vertical: ScrollBar {
id: emojiScroll
// Separator
Rectangle {
visible: emojiSearch.text === ''
Layout.fillWidth: true
Layout.preferredHeight: 1
color: emojiPopup.Nheko.theme.separator
}
}
// Category picker row
RowLayout {
visible: emojiSearch.text === ''
Layout.bottomMargin: 0
Layout.preferredHeight: 42
implicitHeight: 42
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
// Display the normal categories
Repeater {
model: ListModel {
// TODO: Would like to get 'simple' icons for the categories
ListElement {
image: ":/icons/icons/emoji-categories/people.png"
category: Emoji.Category.People
}
// Separator
Rectangle {
visible: emojiSearch.text === ''
Layout.fillWidth: true
Layout.preferredHeight: 1
color: emojiPopup.Nheko.colors.alternateBase
}
ListElement {
image: ":/icons/icons/emoji-categories/nature.png"
category: Emoji.Category.Nature
}
// Category picker row
RowLayout {
visible: emojiSearch.text === ''
Layout.bottomMargin: 0
Layout.preferredHeight: 42
implicitHeight: 42
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
// Display the normal categories
Repeater {
model: ListModel {
// TODO: Would like to get 'simple' icons for the categories
ListElement {
image: ":/icons/icons/emoji-categories/people.png"
category: Emoji.Category.People
}
ListElement {
image: ":/icons/icons/emoji-categories/foods.png"
category: Emoji.Category.Food
}
ListElement {
image: ":/icons/icons/emoji-categories/nature.png"
category: Emoji.Category.Nature
}
ListElement {
image: ":/icons/icons/emoji-categories/activity.png"
category: Emoji.Category.Activity
}
ListElement {
image: ":/icons/icons/emoji-categories/foods.png"
category: Emoji.Category.Food
}
ListElement {
image: ":/icons/icons/emoji-categories/travel.png"
category: Emoji.Category.Travel
}
ListElement {
image: ":/icons/icons/emoji-categories/activity.png"
category: Emoji.Category.Activity
}
ListElement {
image: ":/icons/icons/emoji-categories/objects.png"
category: Emoji.Category.Objects
}
ListElement {
image: ":/icons/icons/emoji-categories/travel.png"
category: Emoji.Category.Travel
}
ListElement {
image: ":/icons/icons/emoji-categories/symbols.png"
category: Emoji.Category.Symbols
}
ListElement {
image: ":/icons/icons/emoji-categories/objects.png"
category: Emoji.Category.Objects
}
ListElement {
image: ":/icons/icons/emoji-categories/flags.png"
category: Emoji.Category.Flags
}
ListElement {
image: ":/icons/icons/emoji-categories/symbols.png"
category: Emoji.Category.Symbols
}
ListElement {
image: ":/icons/icons/emoji-categories/flags.png"
category: Emoji.Category.Flags
}
delegate: AbstractButton {
Layout.preferredWidth: 36
Layout.preferredHeight: 36
hoverEnabled: true
ToolTip.text: {
switch (model.category) {
case Emoji.Category.People:
return qsTr('People');
case Emoji.Category.Nature:
return qsTr('Nature');
case Emoji.Category.Food:
return qsTr('Food');
case Emoji.Category.Activity:
return qsTr('Activity');
case Emoji.Category.Travel:
return qsTr('Travel');
case Emoji.Category.Objects:
return qsTr('Objects');
case Emoji.Category.Symbols:
return qsTr('Symbols');
case Emoji.Category.Flags:
return qsTr('Flags');
}
}
ToolTip.visible: hovered
onClicked: {
//emojiPopup.model.category = model.category;
gridView.positionViewAtIndex(emojiPopup.model.sourceModel.categoryToIndex(model.category), GridView.Beginning);
}
}
MouseArea {
id: mouseArea
delegate: AbstractButton {
Layout.preferredWidth: 36
Layout.preferredHeight: 36
hoverEnabled: true
ToolTip.text: {
switch (model.category) {
case Emoji.Category.People:
return qsTr('People');
case Emoji.Category.Nature:
return qsTr('Nature');
case Emoji.Category.Food:
return qsTr('Food');
case Emoji.Category.Activity:
return qsTr('Activity');
case Emoji.Category.Travel:
return qsTr('Travel');
case Emoji.Category.Objects:
return qsTr('Objects');
case Emoji.Category.Symbols:
return qsTr('Symbols');
case Emoji.Category.Flags:
return qsTr('Flags');
anchors.fill: parent
onPressed: mouse.accepted = false
cursorShape: Qt.PointingHandCursor
}
}
ToolTip.visible: hovered
onClicked: {
//emojiPopup.model.category = model.category;
gridView.positionViewAtIndex(emojiPopup.model.sourceModel.categoryToIndex(model.category), GridView.Beginning);
}
MouseArea {
id: mouseArea
anchors.fill: parent
onPressed: mouse.accepted = false
cursorShape: Qt.PointingHandCursor
}
contentItem: Image {
horizontalAlignment: Image.AlignHCenter
verticalAlignment: Image.AlignVCenter
fillMode: Image.Pad
sourceSize.width: 32
sourceSize.height: 32
source: "image://colorimage/" + model.image + "?" + (hovered ? Nheko.colors.highlight : Nheko.colors.buttonText)
}
contentItem: Image {
horizontalAlignment: Image.AlignHCenter
verticalAlignment: Image.AlignVCenter
fillMode: Image.Pad
sourceSize.width: 32
sourceSize.height: 32
source: "image://colorimage/" + model.image + "?" + (hovered ? Nheko.colors.highlight : Nheko.colors.buttonText)
}
background: Rectangle {
anchors.fill: parent
color: emojiPopup.model.category === model.category ? Qt.hsla(highlightHue, highlightSat, highlightLight, 0.2) : 'transparent'
radius: 5
border.color: emojiPopup.model.category === model.category ? Nheko.colors.highlight : 'transparent'
}
background: Rectangle {
anchors.fill: parent
color: emojiPopup.model.category === model.category ? Qt.hsla(highlightHue, highlightSat, highlightLight, 0.2) : 'transparent'
radius: 5
border.color: emojiPopup.model.category === model.category ? Nheko.colors.highlight : 'transparent'
}
}

@ -125,6 +125,7 @@
<file>qml/Root.qml</file>
<file>qml/ChatPage.qml</file>
<file>qml/CommunitiesList.qml</file>
<file>qml/RoomList.qml</file>
<file>qml/TimelineView.qml</file>
<file>qml/Avatar.qml</file>

@ -55,6 +55,10 @@ constexpr auto BATCH_SIZE = 100;
//! Format: room_id -> RoomInfo
constexpr auto ROOMS_DB("rooms");
constexpr auto INVITES_DB("invites");
//! maps each room to its parent space (id->id)
constexpr auto SPACES_PARENTS_DB("space_parents");
//! maps each space to its current children (id->id)
constexpr auto SPACES_CHILDREN_DB("space_children");
//! Information that must be kept between sync requests.
constexpr auto SYNC_STATE_DB("sync_state");
//! Read receipts per room/event.
@ -237,12 +241,14 @@ Cache::setup()
env_.open(cacheDirectory_.toStdString().c_str());
}
auto txn = lmdb::txn::begin(env_);
syncStateDb_ = lmdb::dbi::open(txn, SYNC_STATE_DB, MDB_CREATE);
roomsDb_ = lmdb::dbi::open(txn, ROOMS_DB, MDB_CREATE);
invitesDb_ = lmdb::dbi::open(txn, INVITES_DB, MDB_CREATE);
readReceiptsDb_ = lmdb::dbi::open(txn, READ_RECEIPTS_DB, MDB_CREATE);
notificationsDb_ = lmdb::dbi::open(txn, NOTIFICATIONS_DB, MDB_CREATE);
auto txn = lmdb::txn::begin(env_);
syncStateDb_ = lmdb::dbi::open(txn, SYNC_STATE_DB, MDB_CREATE);
roomsDb_ = lmdb::dbi::open(txn, ROOMS_DB, MDB_CREATE);
spacesChildrenDb_ = lmdb::dbi::open(txn, SPACES_CHILDREN_DB, MDB_CREATE | MDB_DUPSORT);
spacesParentsDb_ = lmdb::dbi::open(txn, SPACES_PARENTS_DB, MDB_CREATE | MDB_DUPSORT);
invitesDb_ = lmdb::dbi::open(txn, INVITES_DB, MDB_CREATE);
readReceiptsDb_ = lmdb::dbi::open(txn, READ_RECEIPTS_DB, MDB_CREATE);
notificationsDb_ = lmdb::dbi::open(txn, NOTIFICATIONS_DB, MDB_CREATE);
// Device management
devicesDb_ = lmdb::dbi::open(txn, DEVICES_DB, MDB_CREATE);
@ -899,7 +905,9 @@ Cache::runMigrations()
std::reverse(oldMessages.events.begin(),
oldMessages.events.end());
// save messages using the new method
saveTimelineMessages(txn, room_id, oldMessages);
auto eventsDb = getEventsDb(txn, room_id);
saveTimelineMessages(
txn, eventsDb, room_id, oldMessages);
}
// delete old messages db
@ -1194,24 +1202,73 @@ Cache::saveState(const mtx::responses::Sync &res)
auto userKeyCacheDb = getUserKeysDb(txn);
std::set<std::string> spaces_with_updates;
std::set<std::string> rooms_with_space_updates;
// Save joined rooms
for (const auto &room : res.rooms.join) {
auto statesdb = getStatesDb(txn, room.first);
auto stateskeydb = getStatesKeyDb(txn, room.first);
auto membersdb = getMembersDb(txn, room.first);
saveStateEvents(
txn, statesdb, stateskeydb, membersdb, room.first, room.second.state.events);
saveStateEvents(
txn, statesdb, stateskeydb, membersdb, room.first, room.second.timeline.events);
saveTimelineMessages(txn, room.first, room.second.timeline);
auto eventsDb = getEventsDb(txn, room.first);
saveStateEvents(txn,
statesdb,
stateskeydb,
membersdb,
eventsDb,
room.first,
room.second.state.events);
saveStateEvents(txn,
statesdb,
stateskeydb,
membersdb,
eventsDb,
room.first,
room.second.timeline.events);
saveTimelineMessages(txn, eventsDb, room.first, room.second.timeline);
RoomInfo updatedInfo;
updatedInfo.name = getRoomName(txn, statesdb, membersdb).toStdString();
updatedInfo.topic = getRoomTopic(txn, statesdb).toStdString();
updatedInfo.avatar_url = getRoomAvatarUrl(txn, statesdb, membersdb).toStdString();
updatedInfo.version = getRoomVersion(txn, statesdb).toStdString();
updatedInfo.is_space = getRoomIsSpace(txn, statesdb);
if (updatedInfo.is_space) {
bool space_updates = false;
for (const auto &e : room.second.state.events)
if (std::holds_alternative<StateEvent<state::space::Child>>(e) ||
std::holds_alternative<StateEvent<state::PowerLevels>>(e))
space_updates = true;
for (const auto &e : room.second.timeline.events)
if (std::holds_alternative<StateEvent<state::space::Child>>(e) ||
std::holds_alternative<StateEvent<state::PowerLevels>>(e))
space_updates = true;
if (space_updates)
spaces_with_updates.insert(room.first);
}
{
bool room_has_space_update = false;
for (const auto &e : room.second.state.events) {
if (auto se = std::get_if<StateEvent<state::space::Parent>>(&e)) {
spaces_with_updates.insert(se->state_key);
room_has_space_update = true;
}
}
for (const auto &e : room.second.timeline.events) {
if (auto se = std::get_if<StateEvent<state::space::Parent>>(&e)) {
spaces_with_updates.insert(se->state_key);
room_has_space_update = true;
}
}
if (room_has_space_update)
rooms_with_space_updates.insert(room.first);
}
bool has_new_tags = false;
// Process the account_data associated with this room
@ -1291,6 +1348,8 @@ Cache::saveState(const mtx::responses::Sync &res)
removeLeftRooms(txn, res.rooms.leave);
updateSpaces(txn, spaces_with_updates, std::move(rooms_with_space_updates));
txn.commit();
std::map<QString, bool> readStatus;
@ -1339,6 +1398,7 @@ Cache::saveInvites(lmdb::txn &txn, const std::map<std::string, mtx::responses::I
updatedInfo.topic = getInviteRoomTopic(txn, statesdb).toStdString();
updatedInfo.avatar_url =
getInviteRoomAvatarUrl(txn, statesdb, membersdb).toStdString();
updatedInfo.is_space = getInviteRoomIsSpace(txn, statesdb);
updatedInfo.is_invite = true;
invitesDb_.put(txn, room.first, json(updatedInfo).dump());
@ -1427,27 +1487,6 @@ Cache::roomsWithStateUpdates(const mtx::responses::Sync &res)
return rooms;
}
std::vector<std::string>
Cache::roomsWithTagUpdates(const mtx::responses::Sync &res)
{
using namespace mtx::events;
std::vector<std::string> rooms;
for (const auto &room : res.rooms.join) {
bool hasUpdates = false;
for (const auto &evt : room.second.account_data.events) {
if (std::holds_alternative<AccountDataEvent<account_data::Tags>>(evt)) {
hasUpdates = true;
}
}
if (hasUpdates)
rooms.emplace_back(room.first);
}
return rooms;
}
RoomInfo
Cache::singleRoomInfo(const std::string &room_id)
{
@ -1681,6 +1720,27 @@ Cache::storeEvent(const std::string &room_id,
txn.commit();
}
void
Cache::replaceEvent(const std::string &room_id,
const std::string &event_id,
const mtx::events::collections::TimelineEvent &event)
{
auto txn = lmdb::txn::begin(env_);
auto eventsDb = getEventsDb(txn, room_id);
auto relationsDb = getRelationsDb(txn, room_id);
auto event_json = mtx::accessors::serialize_event(event.data).dump();
{
eventsDb.del(txn, event_id);
eventsDb.put(txn, event_id, event_json);
for (auto relation : mtx::accessors::relations(event.data).relations) {
relationsDb.put(txn, relation.event_id, event_id);
}
}
txn.commit();
}
std::vector<std::string>
Cache::relatedEvents(const std::string &room_id, const std::string &event_id)
{
@ -1712,6 +1772,13 @@ Cache::relatedEvents(const std::string &room_id, const std::string &event_id)
return related_ids;
}
size_t
Cache::memberCount(const std::string &room_id)
{
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
return getMembersDb(txn, room_id).size(txn);
}
QMap<QString, RoomInfo>
Cache::roomInfo(bool withInvites)
{
@ -1727,8 +1794,6 @@ Cache::roomInfo(bool withInvites)
while (roomsCursor.get(room_id, room_data, MDB_NEXT)) {
RoomInfo tmp = json::parse(std::move(room_data));
tmp.member_count = getMembersDb(txn, std::string(room_id)).size(txn);
tmp.msgInfo = getLastMessageInfo(txn, std::string(room_id));
result.insert(QString::fromStdString(std::string(room_id)), std::move(tmp));
}
roomsCursor.close();
@ -1955,96 +2020,6 @@ Cache::getTimelineEventId(const std::string &room_id, uint64_t index)
return std::string(val);
}
DescInfo
Cache::getLastMessageInfo(lmdb::txn &txn, const std::string &room_id)
{
lmdb::dbi orderDb;
try {
orderDb = getOrderToMessageDb(txn, room_id);
} catch (lmdb::runtime_error &e) {
nhlog::db()->error("Can't open db for room '{}', probably doesn't exist yet. ({})",
room_id,
e.what());
return {};
}
lmdb::dbi eventsDb;
try {
eventsDb = getEventsDb(txn, room_id);
} catch (lmdb::runtime_error &e) {
nhlog::db()->error("Can't open db for room '{}', probably doesn't exist yet. ({})",
room_id,
e.what());
return {};
}
lmdb::dbi membersdb;
try {
membersdb = getMembersDb(txn, room_id);
} catch (lmdb::runtime_error &e) {
nhlog::db()->error("Can't open db for room '{}', probably doesn't exist yet. ({})",
room_id,
e.what());
return {};
}
if (orderDb.size(txn) == 0)
return DescInfo{};
const auto local_user = utils::localUser();
DescInfo fallbackDesc{};
std::string_view indexVal, event_id;
auto cursor = lmdb::cursor::open(txn, orderDb);
bool first = true;
while (cursor.get(indexVal, event_id, first ? MDB_LAST : MDB_PREV)) {
first = false;
std::string_view event;
bool success = eventsDb.get(txn, event_id, event);
if (!success)
continue;
auto obj = json::parse(event);
if (fallbackDesc.event_id.isEmpty() && obj["type"] == "m.room.member" &&
obj["state_key"] == local_user.toStdString() &&
obj["content"]["membership"] == "join") {
uint64_t ts = obj["origin_server_ts"];
auto time = QDateTime::fromMSecsSinceEpoch(ts);
fallbackDesc = DescInfo{QString::fromStdString(obj["event_id"]),
local_user,
tr("You joined this room."),
utils::descriptiveTime(time),
ts,
time};
}
if (!(obj["type"] == "m.room.message" || obj["type"] == "m.sticker" ||
obj["type"] == "m.call.invite" || obj["type"] == "m.call.answer" ||
obj["type"] == "m.call.hangup" || obj["type"] == "m.room.encrypted"))
continue;
mtx::events::collections::TimelineEvent te;
mtx::events::collections::from_json(obj, te);
std::string_view info;
MemberInfo m;
if (membersdb.get(txn, obj["sender"].get<std::string>(), info)) {
m = json::parse(std::string_view(info.data(), info.size()));
}
cursor.close();
return utils::getMessageDescription(
te.data, local_user, QString::fromStdString(m.name));
}
cursor.close();
return fallbackDesc;
}
QHash<QString, RoomInfo>
Cache::invites()
{
@ -2316,6 +2291,29 @@ Cache::getRoomVersion(lmdb::txn &txn, lmdb::dbi &statesdb)
return QString("1");
}
bool
Cache::getRoomIsSpace(lmdb::txn &txn, lmdb::dbi &statesdb)
{
using namespace mtx::events;
using namespace mtx::events::state;
std::string_view event;
bool res = statesdb.get(txn, to_string(mtx::events::EventType::RoomCreate), event);
if (res) {
try {
StateEvent<Create> msg = json::parse(event);
return msg.content.type == mtx::events::state::room_type::space;
} catch (const json::exception &e) {
nhlog::db()->warn("failed to parse m.room.create event: {}", e.what());
}
}
nhlog::db()->warn("m.room.create event is missing room version, assuming version \"1\"");
return false;
}
std::optional<mtx::events::state::CanonicalAlias>
Cache::getRoomAliases(const std::string &roomid)
{
@ -2443,6 +2441,27 @@ Cache::getInviteRoomTopic(lmdb::txn &txn, lmdb::dbi &db)
return QString();
}
bool
Cache::getInviteRoomIsSpace(lmdb::txn &txn, lmdb::dbi &db)
{
using namespace mtx::events;
using namespace mtx::events::state;
std::string_view event;
bool res = db.get(txn, to_string(mtx::events::EventType::RoomCreate), event);
if (res) {
try {
StrippedEvent<Create> msg = json::parse(event);
return msg.content.type == mtx::events::state::room_type::space;
} catch (const json::exception &e) {
nhlog::db()->warn("failed to parse m.room.topic event: {}", e.what());
}
}
return false;
}
std::vector<std::string>
Cache::joinedRooms()
{
@ -2479,47 +2498,12 @@ Cache::getMember(const std::string &room_id, const std::string &user_id)
return m;
}
} catch (std::exception &e) {
nhlog::db()->warn("Failed to read member ({}): {}", user_id, e.what());
nhlog::db()->warn(
"Failed to read member ({}) in room ({}): {}", user_id, room_id, e.what());
}
return std::nullopt;
}
std::vector<RoomSearchResult>
Cache::searchRooms(const std::string &query, std::uint8_t max_items)
{
std::multimap<int, std::pair<std::string, RoomInfo>> items;
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
auto cursor = lmdb::cursor::open(txn, roomsDb_);
std::string_view room_id, room_data;
while (cursor.get(room_id, room_data, MDB_NEXT)) {
RoomInfo tmp = json::parse(room_data);
const int score = utils::levenshtein_distance(
query, QString::fromStdString(tmp.name).toLower().toStdString());
items.emplace(score, std::make_pair(room_id, tmp));
}
cursor.close();
auto end = items.begin();
if (items.size() >= max_items)
std::advance(end, max_items);
else if (items.size() > 0)
std::advance(end, items.size());
std::vector<RoomSearchResult> results;
for (auto it = items.begin(); it != end; it++) {
results.push_back(RoomSearchResult{it->second.first, it->second.second});
}
txn.commit();
return results;
}
std::vector<RoomMember>
Cache::getMembers(const std::string &room_id, std::size_t startIndex, std::size_t len)
{
@ -2578,11 +2562,12 @@ void
Cache::savePendingMessage(const std::string &room_id,
const mtx::events::collections::TimelineEvent &message)
{
auto txn = lmdb::txn::begin(env_);
auto txn = lmdb::txn::begin(env_);
auto eventsDb = getEventsDb(txn, room_id);
mtx::responses::Timeline timeline;
timeline.events.push_back(message.data);
saveTimelineMessages(txn, room_id, timeline);
saveTimelineMessages(txn, eventsDb, room_id, timeline);
auto pending = getPendingMessagesDb(txn, room_id);
@ -2650,13 +2635,13 @@ Cache::removePendingStatus(const std::string &room_id, const std::string &txn_id
void
Cache::saveTimelineMessages(lmdb::txn &txn,
lmdb::dbi &eventsDb,
const std::string &room_id,
const mtx::responses::Timeline &res)
{
if (res.events.empty())
return;
auto eventsDb = getEventsDb(txn, room_id);
auto relationsDb = getRelationsDb(txn, room_id);
auto orderDb = getEventOrderDb(txn, room_id);
@ -3181,6 +3166,147 @@ Cache::deleteOldData() noexcept
}
}
void
Cache::updateSpaces(lmdb::txn &txn,
const std::set<std::string> &spaces_with_updates,
std::set<std::string> rooms_with_updates)
{
if (spaces_with_updates.empty() && rooms_with_updates.empty())
return;
for (const auto &space : spaces_with_updates) {
// delete old entries
{
auto cursor = lmdb::cursor::open(txn, spacesChildrenDb_);
bool first = true;
std::string_view sp = space, space_child = "";
if (cursor.get(sp, space_child, MDB_SET)) {
while (cursor.get(
sp, space_child, first ? MDB_FIRST_DUP : MDB_NEXT_DUP)) {
first = false;
spacesParentsDb_.del(txn, space_child, space);
}
}
cursor.close();
spacesChildrenDb_.del(txn, space);
}
for (const auto &event :
getStateEventsWithType<mtx::events::state::space::Child>(txn, space)) {
if (event.content.via.has_value() && event.state_key.size() > 3 &&
event.state_key.at(0) == '!') {
spacesChildrenDb_.put(txn, space, event.state_key);
spacesParentsDb_.put(txn, event.state_key, space);
}
}
}
const auto space_event_type = to_string(mtx::events::EventType::RoomPowerLevels);
for (const auto &room : rooms_with_updates) {
for (const auto &event :
getStateEventsWithType<mtx::events::state::space::Parent>(txn, room)) {
if (event.content.via.has_value() && event.state_key.size() > 3 &&
event.state_key.at(0) == '!') {
const std::string &space = event.state_key;
auto pls =
getStateEvent<mtx::events::state::PowerLevels>(txn, space);
if (!pls)
continue;
if (pls->content.user_level(event.sender) >=
pls->content.state_level(space_event_type)) {
spacesChildrenDb_.put(txn, space, room);
spacesParentsDb_.put(txn, room, space);
}
}
}
}
}
QMap<QString, std::optional<RoomInfo>>
Cache::spaces()
{
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
QMap<QString, std::optional<RoomInfo>> ret;
{
auto cursor = lmdb::cursor::open(txn, spacesChildrenDb_);
bool first = true;
std::string_view space_id, space_child;
while (cursor.get(space_id, space_child, first ? MDB_FIRST : MDB_NEXT)) {
first = false;
if (!space_child.empty()) {
std::string_view room_data;
if (roomsDb_.get(txn, space_id, room_data)) {
RoomInfo tmp = json::parse(std::move(room_data));
ret.insert(
QString::fromUtf8(space_id.data(), space_id.size()), tmp);
} else {
ret.insert(
QString::fromUtf8(space_id.data(), space_id.size()),
std::nullopt);
}
}
}
cursor.close();
}
return ret;
}
std::vector<std::string>
Cache::getParentRoomIds(const std::string &room_id)
{
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
std::vector<std::string> roomids;
{
auto cursor = lmdb::cursor::open(txn, spacesParentsDb_);
bool first = true;
std::string_view sp = room_id, space_parent;
if (cursor.get(sp, space_parent, MDB_SET)) {
while (cursor.get(sp, space_parent, first ? MDB_FIRST_DUP : MDB_NEXT_DUP)) {
first = false;
if (!space_parent.empty())
roomids.emplace_back(space_parent);
}
}
cursor.close();
}
return roomids;
}
std::vector<std::string>
Cache::getChildRoomIds(const std::string &room_id)
{
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
std::vector<std::string> roomids;
{
auto cursor = lmdb::cursor::open(txn, spacesChildrenDb_);
bool first = true;
std::string_view sp = room_id, space_child;
if (cursor.get(sp, space_child, MDB_SET)) {
while (cursor.get(sp, space_child, first ? MDB_FIRST_DUP : MDB_NEXT_DUP)) {
first = false;
if (!space_child.empty())
roomids.emplace_back(space_child);
}
}
cursor.close();
}
return roomids;
}
std::optional<mtx::events::collections::RoomAccountDataEvents>
Cache::getAccountData(lmdb::txn &txn, mtx::events::EventType type, const std::string &room_id)
{
@ -3451,6 +3577,10 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query
if (!updateToWrite.master_keys.keys.empty() &&
update.master_keys.keys != updateToWrite.master_keys.keys) {
nhlog::db()->debug("Master key of {} changed:\nold: {}\nnew: {}",
user,
updateToWrite.master_keys.keys.size(),
update.master_keys.keys.size());
updateToWrite.master_key_changed = true;
}
@ -3458,25 +3588,31 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query
updateToWrite.self_signing_keys = update.self_signing_keys;
updateToWrite.user_signing_keys = update.user_signing_keys;
// If we have keys for the device already, only update the signatures.
auto oldDeviceKeys = std::move(updateToWrite.device_keys);
updateToWrite.device_keys.clear();
// Don't insert keys, which we have seen once already
for (const auto &[device_id, device_keys] : update.device_keys) {
if (updateToWrite.device_keys.count(device_id) &&
updateToWrite.device_keys.at(device_id).keys ==
device_keys.keys) {
updateToWrite.device_keys.at(device_id).signatures =
device_keys.signatures;
if (oldDeviceKeys.count(device_id) &&
oldDeviceKeys.at(device_id).keys == device_keys.keys) {
// this is safe, since the keys are the same
updateToWrite.device_keys[device_id] = device_keys;
} else {
bool keyReused = false;
for (const auto &[key_id, key] : device_keys.keys) {
(void)key_id;
if (updateToWrite.seen_device_keys.count(key)) {
nhlog::crypto()->warn(
"Key '{}' reused by ({}: {})",
key,
user,
device_id);
keyReused = true;
break;
}
}
if (!updateToWrite.device_keys.count(device_id) &&
!keyReused)
if (!keyReused && !oldDeviceKeys.count(device_id))
updateToWrite.device_keys[device_id] = device_keys;
}
@ -3858,6 +3994,7 @@ to_json(json &j, const RoomInfo &info)
j["avatar_url"] = info.avatar_url;
j["version"] = info.version;
j["is_invite"] = info.is_invite;
j["is_space"] = info.is_space;
j["join_rule"] = info.join_rule;
j["guest_access"] = info.guest_access;
@ -3877,6 +4014,7 @@ from_json(const json &j, RoomInfo &info)
info.version = j.value(
"version", QCoreApplication::translate("RoomInfo", "no version stored").toStdString());
info.is_invite = j.at("is_invite");
info.is_space = j.value("is_space", false);
info.join_rule = j.at("join_rule");
info.guest_access = j.at("guest_access");
@ -4132,12 +4270,6 @@ getRoomAvatarUrl(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb)
return instance_->getRoomAvatarUrl(txn, statesdb, membersdb);
}
QString
getRoomVersion(lmdb::txn &txn, lmdb::dbi &statesdb)
{
return instance_->getRoomVersion(txn, statesdb);
}
std::vector<RoomMember>
getMembers(const std::string &room_id, std::size_t startIndex, std::size_t len)
{
@ -4279,11 +4411,7 @@ roomsWithStateUpdates(const mtx::responses::Sync &res)
{
return instance_->roomsWithStateUpdates(res);
}
std::vector<std::string>
roomsWithTagUpdates(const mtx::responses::Sync &res)
{
return instance_->roomsWithTagUpdates(res);
}
std::map<QString, RoomInfo>
getRoomInfo(const std::vector<std::string> &rooms)
{
@ -4303,12 +4431,6 @@ calculateRoomReadStatus()
instance_->calculateRoomReadStatus();
}
std::vector<RoomSearchResult>
searchRooms(const std::string &query, std::uint8_t max_items)
{
return instance_->searchRooms(query, max_items);
}
void
markSentNotification(const std::string &event_id)
{

@ -79,9 +79,6 @@ getRoomTopic(lmdb::txn &txn, lmdb::dbi &statesdb);
//! Retrieve the room avatar's url if any.
QString
getRoomAvatarUrl(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb);
//! Retrieve the version of the room if any.
QString
getRoomVersion(lmdb::txn &txn, lmdb::dbi &statesdb);
//! Retrieve member info from a room.
std::vector<RoomMember>
@ -166,9 +163,6 @@ calculateRoomReadStatus(const std::string &room_id);
void
calculateRoomReadStatus();
std::vector<RoomSearchResult>
searchRooms(const std::string &query, std::uint8_t max_items = 5);
void
markSentNotification(const std::string &event_id);
//! Removes an event from the sent notifications.

@ -76,13 +76,13 @@ struct RoomInfo
std::string version;
//! Whether or not the room is an invite.
bool is_invite = false;
//! Wheter or not the room is a space
bool is_space = false;
//! Total number of members in the room.
size_t member_count = 0;
//! Who can access to the room.
mtx::events::state::JoinRule join_rule = mtx::events::state::JoinRule::Public;
bool guest_access = false;
//! Metadata describing the last message in the timeline.
DescInfo msgInfo;
//! The list of tags associated with this room
std::vector<std::string> tags;
};

@ -72,6 +72,7 @@ public:
std::optional<mtx::events::state::CanonicalAlias> getRoomAliases(const std::string &roomid);
QHash<QString, RoomInfo> invites();
std::optional<RoomInfo> invite(std::string_view roomid);
QMap<QString, std::optional<RoomInfo>> spaces();
//! Calculate & return the name of the room.
QString getRoomName(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb);
@ -84,6 +85,8 @@ public:
QString getRoomAvatarUrl(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb);
//! Retrieve the version of the room if any.
QString getRoomVersion(lmdb::txn &txn, lmdb::dbi &statesdb);
//! Retrieve if the room is a space
bool getRoomIsSpace(lmdb::txn &txn, lmdb::dbi &statesdb);
//! Get a specific state event
template<typename T>
@ -98,6 +101,7 @@ public:
std::vector<RoomMember> getMembers(const std::string &room_id,
std::size_t startIndex = 0,
std::size_t len = 30);
size_t memberCount(const std::string &room_id);
void saveState(const mtx::responses::Sync &res);
bool isInitialized();
@ -146,7 +150,6 @@ public:
RoomInfo singleRoomInfo(const std::string &room_id);
std::vector<std::string> roomsWithStateUpdates(const mtx::responses::Sync &res);
std::vector<std::string> roomsWithTagUpdates(const mtx::responses::Sync &res);
std::map<QString, RoomInfo> getRoomInfo(const std::vector<std::string> &rooms);
//! Calculates which the read status of a room.
@ -154,9 +157,6 @@ public:
bool calculateRoomReadStatus(const std::string &room_id);
void calculateRoomReadStatus();
std::vector<RoomSearchResult> searchRooms(const std::string &query,
std::uint8_t max_items = 5);
void markSentNotification(const std::string &event_id);
//! Removes an event from the sent notifications.
void removeReadNotification(const std::string &event_id);
@ -184,6 +184,9 @@ public:
void storeEvent(const std::string &room_id,
const std::string &event_id,
const mtx::events::collections::TimelineEvent &event);
void replaceEvent(const std::string &room_id,
const std::string &event_id,
const mtx::events::collections::TimelineEvent &event);
std::vector<std::string> relatedEvents(const std::string &room_id,
const std::string &event_id);
@ -219,6 +222,8 @@ public:
void deleteOldData() noexcept;
//! Retrieve all saved room ids.
std::vector<std::string> getRoomIds(lmdb::txn &txn);
std::vector<std::string> getParentRoomIds(const std::string &room_id);
std::vector<std::string> getChildRoomIds(const std::string &room_id);
//! Mark a room that uses e2e encryption.
void setEncryptedRoom(lmdb::txn &txn, const std::string &room_id);
@ -324,12 +329,13 @@ private:
QString getInviteRoomName(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb);
QString getInviteRoomTopic(lmdb::txn &txn, lmdb::dbi &statesdb);
QString getInviteRoomAvatarUrl(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb);
bool getInviteRoomIsSpace(lmdb::txn &txn, lmdb::dbi &db);
std::optional<MemberInfo> getMember(const std::string &room_id, const std::string &user_id);
std::string getLastEventId(lmdb::txn &txn, const std::string &room_id);
DescInfo getLastMessageInfo(lmdb::txn &txn, const std::string &room_id);
void saveTimelineMessages(lmdb::txn &txn,
lmdb::dbi &eventsDb,
const std::string &room_id,
const mtx::responses::Timeline &res);
@ -348,11 +354,12 @@ private:
lmdb::dbi &statesdb,
lmdb::dbi &stateskeydb,
lmdb::dbi &membersdb,
lmdb::dbi &eventsDb,
const std::string &room_id,
const std::vector<T> &events)
{
for (const auto &e : events)
saveStateEvent(txn, statesdb, stateskeydb, membersdb, room_id, e);
saveStateEvent(txn, statesdb, stateskeydb, membersdb, eventsDb, room_id, e);
}
template<class T>
@ -360,6 +367,7 @@ private:
lmdb::dbi &statesdb,
lmdb::dbi &stateskeydb,
lmdb::dbi &membersdb,
lmdb::dbi &eventsDb,
const std::string &room_id,
const T &event)
{
@ -396,8 +404,10 @@ private:
}
std::visit(
[&txn, &statesdb, &stateskeydb](auto e) {
if constexpr (isStateEvent(e))
[&txn, &statesdb, &stateskeydb, &eventsDb](auto e) {
if constexpr (isStateEvent(e)) {
eventsDb.put(txn, e.event_id, json(e).dump());
if (e.type != EventType::Unsupported) {
if (e.state_key.empty())
statesdb.put(
@ -412,6 +422,7 @@ private:
})
.dump());
}
}
},
event);
}
@ -427,20 +438,22 @@ private:
if (room_id.empty())
return std::nullopt;
const auto typeStr = to_string(type);
std::string_view value;
if (state_key.empty()) {
auto db = getStatesDb(txn, room_id);
if (!db.get(txn, to_string(type), value)) {
if (!db.get(txn, typeStr, value)) {
return std::nullopt;
}
} else {
auto db = getStatesKeyDb(txn, room_id);
std::string d = json::object({{"key", state_key}}).dump();
std::string_view data = d;
auto db = getStatesKeyDb(txn, room_id);
std::string d = json::object({{"key", state_key}}).dump();
std::string_view data = d;
std::string_view typeStrV = typeStr;
auto cursor = lmdb::cursor::open(txn, db);
if (!cursor.get(state_key, data, MDB_GET_BOTH))
if (!cursor.get(typeStrV, data, MDB_GET_BOTH))
return std::nullopt;
try {
@ -460,6 +473,47 @@ private:
}
}
template<typename T>
std::vector<mtx::events::StateEvent<T>> getStateEventsWithType(lmdb::txn &txn,
const std::string &room_id)
{
constexpr auto type = mtx::events::state_content_to_type<T>;
static_assert(type != mtx::events::EventType::Unsupported,
"Not a supported type in state events.");
if (room_id.empty())
return {};
std::vector<mtx::events::StateEvent<T>> events;
{
auto db = getStatesKeyDb(txn, room_id);
auto eventsDb = getEventsDb(txn, room_id);
const auto typeStr = to_string(type);
std::string_view typeStrV = typeStr;
std::string_view data;
std::string_view value;
auto cursor = lmdb::cursor::open(txn, db);
bool first = true;
if (cursor.get(typeStrV, data, MDB_SET)) {
while (cursor.get(
typeStrV, data, first ? MDB_FIRST_DUP : MDB_NEXT_DUP)) {
first = false;
if (eventsDb.get(txn,
json::parse(data)["id"].get<std::string>(),
value))
events.push_back(
json::parse(value)
.get<mtx::events::StateEvent<T>>());
}
}
}
return events;
}
void saveInvites(lmdb::txn &txn,
const std::map<std::string, mtx::responses::InvitedRoom> &rooms);
@ -479,6 +533,10 @@ private:
}
}
void updateSpaces(lmdb::txn &txn,
const std::set<std::string> &spaces_with_updates,
std::set<std::string> rooms_with_updates);
lmdb::dbi getPendingReceiptsDb(lmdb::txn &txn)
{
return lmdb::dbi::open(txn, "pending_receipts", MDB_CREATE);
@ -545,8 +603,8 @@ private:
lmdb::dbi getStatesKeyDb(lmdb::txn &txn, const std::string &room_id)
{
auto db =
lmdb::dbi::open(txn, std::string(room_id + "/state_by_key").c_str(), MDB_CREATE);
auto db = lmdb::dbi::open(
txn, std::string(room_id + "/state_by_key").c_str(), MDB_CREATE | MDB_DUPSORT);
lmdb::dbi_set_dupsort(txn, db, compare_state_key);
return db;
}
@ -608,6 +666,7 @@ private:
lmdb::env env_;
lmdb::dbi syncStateDb_;
lmdb::dbi roomsDb_;
lmdb::dbi spacesChildrenDb_, spacesParentsDb_;
lmdb::dbi invitesDb_;
lmdb::dbi readReceiptsDb_;
lmdb::dbi notificationsDb_;

@ -550,7 +550,7 @@ ChatPage::startInitialSync()
nhlog::net()->error("initial sync error: {} {} {} {}",
err->parse_error,
status_code,
err->error_code.message(),
err->error_code,
err_code);
// non http related errors
@ -674,10 +674,10 @@ ChatPage::trySync()
return;
}
nhlog::net()->error("initial sync error: {} {} {} {}",
nhlog::net()->error("sync error: {} {} {} {}",
err->parse_error,
status_code,
err->error_code.message(),
err->error_code,
err_code);
emit tryDelayedSyncCb();
return;

@ -263,9 +263,7 @@ LoginPage::onMatrixIdEntered()
http::client()->well_known([this](const mtx::responses::WellKnown &res,
mtx::http::RequestErr err) {
if (err) {
using namespace boost::beast::http;
if (err->status_code == status::not_found) {
if (err->status_code == 404) {
nhlog::net()->info("Autodiscovery: No .well-known.");
checkHomeserverVersion();
return;
@ -282,8 +280,9 @@ LoginPage::onMatrixIdEntered()
emit versionErrorCb(tr("Autodiscovery failed. Unknown error when "
"requesting .well-known."));
nhlog::net()->error("Autodiscovery failed. Unknown error when "
"requesting .well-known. {}",
err->error_code.message());
"requesting .well-known. {} {}",
err->status_code,
err->error_code);
return;
}
@ -301,9 +300,7 @@ LoginPage::checkHomeserverVersion()
http::client()->versions(
[this](const mtx::responses::Versions &, mtx::http::RequestErr err) {
if (err) {
using namespace boost::beast::http;
if (err->status_code == status::not_found) {
if (err->status_code == 404) {
emit versionErrorCb(tr("The required endpoints were not found. "
"Possibly not a Matrix server."));
return;

@ -206,8 +206,11 @@ handle_olm_message(const OlmMessage &msg)
for (const auto &cipher : msg.ciphertext) {
// We skip messages not meant for the current device.
if (cipher.first != my_key)
if (cipher.first != my_key) {
nhlog::crypto()->debug(
"Skipping message for {} since we are {}.", cipher.first, my_key);
continue;
}
const auto type = cipher.second.type;
nhlog::crypto()->info("type: {}", type == 0 ? "OLM_PRE_KEY" : "OLM_MESSAGE");
@ -661,8 +664,10 @@ try_olm_decryption(const std::string &sender_key, const mtx::events::msg::OlmCip
for (const auto &id : session_ids) {
auto session = cache::getOlmSession(sender_key, id);
if (!session)
if (!session) {
nhlog::crypto()->warn("Unknown olm session: {}:{}", sender_key, id);
continue;
}
mtx::crypto::BinaryBuf text;

@ -4,8 +4,6 @@
#pragma once
#include <boost/optional.hpp>
#include <memory>
#include <mtx/events.hpp>
#include <mtx/events/encrypted.hpp>

@ -11,6 +11,7 @@
#include <QtMath>
#include <mtx/responses/register.hpp>
#include <mtx/responses/well-known.hpp>
#include "Config.h"
#include "Logging.h"
@ -108,6 +109,10 @@ RegisterPage::RegisterPage(QWidget *parent)
error_password_confirmation_label_->setWordWrap(true);
error_password_confirmation_label_->hide();
error_server_label_ = new QLabel(this);
error_server_label_->setWordWrap(true);
error_server_label_->hide();
form_layout_->addWidget(username_input_, Qt::AlignHCenter);
form_layout_->addWidget(error_username_label_, Qt::AlignHCenter);
form_layout_->addWidget(password_input_, Qt::AlignHCenter);
@ -115,6 +120,7 @@ RegisterPage::RegisterPage(QWidget *parent)
form_layout_->addWidget(password_confirmation_, Qt::AlignHCenter);
form_layout_->addWidget(error_password_confirmation_label_, Qt::AlignHCenter);
form_layout_->addWidget(server_input_, Qt::AlignHCenter);
form_layout_->addWidget(error_server_label_, Qt::AlignHCenter);
button_layout_ = new QHBoxLayout();
button_layout_->setSpacing(0);
@ -140,6 +146,17 @@ RegisterPage::RegisterPage(QWidget *parent)
top_layout_->addWidget(error_label_, 0, Qt::AlignHCenter);
top_layout_->addStretch(1);
connect(
this,
&RegisterPage::versionErrorCb,
this,
[this](const QString &msg) {
error_server_label_->show();
server_input_->setValid(false);
showError(error_server_label_, msg);
},
Qt::QueuedConnection);
connect(back_button_, SIGNAL(clicked()), this, SLOT(onBackButtonClicked()));
connect(register_button_, SIGNAL(clicked()), this, SLOT(onRegisterButtonClicked()));
@ -272,7 +289,7 @@ RegisterPage::RegisterPage(QWidget *parent)
}
// The server requires registration flows.
if (err->status_code == boost::beast::http::status::unauthorized) {
if (err->status_code == 401) {
if (err->matrix_error.unauthorized.flows.empty()) {
nhlog::net()->warn(
"failed to retrieve registration flows: ({}) "
@ -351,10 +368,12 @@ RegisterPage::checkFields()
error_username_label_->setText("");
error_password_label_->setText("");
error_password_confirmation_label_->setText("");
error_server_label_->setText("");
error_username_label_->hide();
error_password_label_->hide();
error_password_confirmation_label_->hide();
error_server_label_->hide();
password_confirmation_->setValid(true);
server_input_->setValid(true);
@ -379,7 +398,8 @@ RegisterPage::checkFields()
all_fields_good = false;
} else if (server_input_->isModified() &&
(!server_input_->hasAcceptableInput() || server_input_->text().isEmpty())) {
showError(tr("Invalid server name"));
error_server_label_->show();
showError(error_server_label_, tr("Invalid server name"));
server_input_->setValid(false);
all_fields_good = false;
}
@ -406,51 +426,110 @@ RegisterPage::onRegisterButtonClicked()
http::client()->set_server(server);
http::client()->verify_certificates(
!UserSettings::instance()->disableCertificateValidation());
http::client()->registration(
username,
password,
[this, username, password](const mtx::responses::Register &res,
mtx::http::RequestErr err) {
if (!err) {
http::client()->set_user(res.user_id);
http::client()->set_access_token(res.access_token);
emit registerOk();
return;
}
http::client()->well_known(
[this, username, password](const mtx::responses::WellKnown &res,
mtx::http::RequestErr err) {
if (err) {
if (err->status_code == 404) {
nhlog::net()->info("Autodiscovery: No .well-known.");
checkVersionAndRegister(username, password);
return;
}
// The server requires registration flows.
if (err->status_code == boost::beast::http::status::unauthorized) {
if (err->matrix_error.unauthorized.flows.empty()) {
nhlog::net()->warn(
"failed to retrieve registration flows1: ({}) "
"{}",
static_cast<int>(err->status_code),
err->matrix_error.error);
emit errorOccurred();
emit registerErrorCb(
QString::fromStdString(err->matrix_error.error));
if (!err->parse_error.empty()) {
emit versionErrorCb(tr(
"Autodiscovery failed. Received malformed response."));
nhlog::net()->error(
"Autodiscovery failed. Received malformed response.");
return;
}
emit registrationFlow(
username, password, err->matrix_error.unauthorized);
emit versionErrorCb(tr("Autodiscovery failed. Unknown error when "
"requesting .well-known."));
nhlog::net()->error("Autodiscovery failed. Unknown error when "
"requesting .well-known. {} {}",
err->status_code,
err->error_code);
return;
}
nhlog::net()->error(
"failed to register: status_code ({}), matrix_error({})",
static_cast<int>(err->status_code),
err->matrix_error.error);
emit registerErrorCb(QString::fromStdString(err->matrix_error.error));
emit errorOccurred();
nhlog::net()->info("Autodiscovery: Discovered '" +
res.homeserver.base_url + "'");
http::client()->set_server(res.homeserver.base_url);
checkVersionAndRegister(username, password);
});
emit registering();
}
}
void
RegisterPage::checkVersionAndRegister(const std::string &username, const std::string &password)
{
http::client()->versions(
[this, username, password](const mtx::responses::Versions &, mtx::http::RequestErr err) {
if (err) {
if (err->status_code == 404) {
emit versionErrorCb(tr("The required endpoints were not found. "
"Possibly not a Matrix server."));
return;
}
if (!err->parse_error.empty()) {
emit versionErrorCb(tr("Received malformed response. Make sure "
"the homeserver domain is valid."));
return;
}
emit versionErrorCb(tr(
"An unknown error occured. Make sure the homeserver domain is valid."));
return;
}
http::client()->registration(
username,
password,
[this, username, password](const mtx::responses::Register &res,
mtx::http::RequestErr err) {
if (!err) {
http::client()->set_user(res.user_id);
http::client()->set_access_token(res.access_token);
emit registerOk();
return;
}
// The server requires registration flows.
if (err->status_code == 401) {
if (err->matrix_error.unauthorized.flows.empty()) {
nhlog::net()->warn(
"failed to retrieve registration flows1: ({}) "
"{}",
static_cast<int>(err->status_code),
err->matrix_error.error);
emit errorOccurred();
emit registerErrorCb(
QString::fromStdString(err->matrix_error.error));
return;
}
emit registrationFlow(
username, password, err->matrix_error.unauthorized);
return;
}
nhlog::net()->error(
"failed to register: status_code ({}), matrix_error({})",
static_cast<int>(err->status_code),
err->matrix_error.error);
emit registerErrorCb(QString::fromStdString(err->matrix_error.error));
emit errorOccurred();
});
});
}
void
RegisterPage::paintEvent(QPaintEvent *)
{

@ -31,6 +31,10 @@ protected:
signals:
void backButtonClicked();
void errorOccurred();
//! Used to trigger the corresponding slot outside of the main thread.
void versionErrorCb(const QString &err);
void registering();
void registerOk();
void registerErrorCb(const QString &msg);
@ -52,6 +56,7 @@ private:
bool checkOneField(QLabel *label, const TextField *t_field, const QString &msg);
bool checkFields();
void showError(QLabel *label, const QString &msg);
void checkVersionAndRegister(const std::string &username, const std::string &password);
QVBoxLayout *top_layout_;
QHBoxLayout *back_layout_;
@ -63,6 +68,7 @@ private:
QLabel *error_username_label_;
QLabel *error_password_label_;
QLabel *error_password_confirmation_label_;
QLabel *error_server_label_;
FlatButton *back_button_;
RaisedButton *register_button_;

@ -64,10 +64,14 @@ void
UserSettings::load(std::optional<QString> profile)
{
QSettings settings;
tray_ = settings.value("user/window/tray", false).toBool();
tray_ = settings.value("user/window/tray", false).toBool();
startInTray_ = settings.value("user/window/start_in_tray", false).toBool();
roomListWidth_ = settings.value("user/sidebar/room_list_width", -1).toInt();
communityListWidth_ = settings.value("user/sidebar/community_list_width", -1).toInt();
hasDesktopNotifications_ = settings.value("user/desktop_notifications", true).toBool();
hasAlertOnNotification_ = settings.value("user/alert_on_notification", false).toBool();
startInTray_ = settings.value("user/window/start_in_tray", false).toBool();
groupView_ = settings.value("user/group_view", true).toBool();
hiddenTags_ = settings.value("user/hidden_tags", QStringList{}).toStringList();
buttonsInTimeline_ = settings.value("user/timeline/buttons", true).toBool();
@ -175,10 +179,11 @@ UserSettings::setMobileMode(bool state)
void
UserSettings::setGroupView(bool state)
{
if (groupView_ != state)
emit groupViewStateChanged(state);
if (groupView_ == state)
return;
groupView_ = state;
emit groupViewStateChanged(state);
save();
}
@ -248,6 +253,24 @@ UserSettings::setTimelineMaxWidth(int state)
emit timelineMaxWidthChanged(state);
save();
}
void
UserSettings::setCommunityListWidth(int state)
{
if (state == communityListWidth_)
return;
communityListWidth_ = state;
emit communityListWidthChanged(state);
save();
}
void
UserSettings::setRoomListWidth(int state)
{
if (state == roomListWidth_)
return;
roomListWidth_ = state;
emit roomListWidthChanged(state);
save();
}
void
UserSettings::setDesktopNotifications(bool state)
@ -571,6 +594,11 @@ UserSettings::save()
settings.setValue("start_in_tray", startInTray_);
settings.endGroup(); // window
settings.beginGroup("sidebar");
settings.setValue("community_list_width", communityListWidth_);
settings.setValue("room_list_width", roomListWidth_);
settings.endGroup(); // window
settings.beginGroup("timeline");
settings.setValue("buttons", buttonsInTimeline_);
settings.setValue("message_hover_highlight", messageHoverHighlight_);
@ -586,6 +614,7 @@ UserSettings::save()
settings.setValue("mobile_mode", mobileMode_);
settings.setValue("font_size", baseFontSize_);
settings.setValue("typing_notifications", typingNotifications_);
settings.setValue("sort_by_unread", sortByImportance_);
settings.setValue("minor_events", sortByImportance_);
settings.setValue("read_receipts", readReceipts_);
settings.setValue("group_view", groupView_);

@ -61,6 +61,10 @@ class UserSettings : public QObject
NOTIFY privacyScreenTimeoutChanged)
Q_PROPERTY(int timelineMaxWidth READ timelineMaxWidth WRITE setTimelineMaxWidth NOTIFY
timelineMaxWidthChanged)
Q_PROPERTY(
int roomListWidth READ roomListWidth WRITE setRoomListWidth NOTIFY roomListWidthChanged)
Q_PROPERTY(int communityListWidth READ communityListWidth WRITE setCommunityListWidth NOTIFY
communityListWidthChanged)
Q_PROPERTY(bool mobileMode READ mobileMode WRITE setMobileMode NOTIFY mobileModeChanged)
Q_PROPERTY(double fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged)
Q_PROPERTY(QString font READ font WRITE setFontFamily NOTIFY fontChanged)
@ -129,6 +133,8 @@ public:
void setSortByImportance(bool state);
void setButtonsInTimeline(bool state);
void setTimelineMaxWidth(int state);
void setCommunityListWidth(int state);
void setRoomListWidth(int state);
void setDesktopNotifications(bool state);
void setAlertOnNotification(bool state);
void setAvatarCircles(bool state);
@ -178,6 +184,8 @@ public:
return hasDesktopNotifications() || hasAlertOnNotification();
}
int timelineMaxWidth() const { return timelineMaxWidth_; }
int communityListWidth() const { return communityListWidth_; }
int roomListWidth() const { return roomListWidth_; }
double fontSize() const { return baseFontSize_; }
QString font() const { return font_; }
QString emojiFont() const
@ -227,6 +235,8 @@ signals:
void privacyScreenChanged(bool state);
void privacyScreenTimeoutChanged(int state);
void timelineMaxWidthChanged(int state);
void roomListWidthChanged(int state);
void communityListWidthChanged(int state);
void mobileModeChanged(bool mode);
void fontSizeChanged(double state);
void fontChanged(QString state);
@ -276,6 +286,8 @@ private:
bool shareKeysWithTrustedUsers_;
bool mobileMode_;
int timelineMaxWidth_;
int roomListWidth_;
int communityListWidth_;
double baseFontSize_;
QString font_;
QString emojiFont_;

@ -679,11 +679,10 @@ utils::hashQString(const QString &input)
return hash;
}
QString
utils::generateContrastingHexColor(const QString &input, const QString &background)
QColor
utils::generateContrastingHexColor(const QString &input, const QColor &backgroundCol)
{
const QColor backgroundCol(background);
const qreal backgroundLum = luminance(background);
const qreal backgroundLum = luminance(backgroundCol);
// Create a color for the input
auto hash = hashQString(input);

@ -301,8 +301,8 @@ hashQString(const QString &input);
//! Generate a color (matching #RRGGBB) that has an acceptable contrast to background that is based
//! on the input string.
QString
generateContrastingHexColor(const QString &input, const QString &background);
QColor
generateContrastingHexColor(const QString &input, const QColor &background);
//! Given two luminance values, compute the contrast ratio between them.
qreal

@ -41,8 +41,7 @@ using webrtc::CallType;
using webrtc::State;
WebRTCSession::WebRTCSession()
: QObject()
, devices_(CallDevices::instance())
: devices_(CallDevices::instance())
{
qRegisterMetaType<webrtc::CallType>();
qmlRegisterUncreatableMetaObject(

@ -40,15 +40,48 @@
QQmlDebuggingEnabler enabler;
#endif
#if defined(Q_OS_LINUX)
#include <boost/stacktrace.hpp>
#if HAVE_BACKTRACE_SYMBOLS_FD
#include <csignal>
#include <execinfo.h>
#include <fcntl.h>
#include <unistd.h>
void
stacktraceHandler(int signum)
{
std::signal(signum, SIG_DFL);
boost::stacktrace::safe_dump_to("./nheko-backtrace.dump");
// boost::stacktrace::safe_dump_to("./nheko-backtrace.dump");
// see
// https://stackoverflow.com/questions/77005/how-to-automatically-generate-a-stacktrace-when-my-program-crashes/77336#77336
void *array[50];
size_t size;
// get void*'s for all entries on the stack
size = backtrace(array, 50);
// print out all the frames to stderr
fprintf(stderr, "Error: signal %d:\n", signum);
backtrace_symbols_fd(array, size, STDERR_FILENO);
int file = ::open("/tmp/nheko-crash.dump",
O_CREAT | O_WRONLY | O_TRUNC
#if defined(S_IWUSR) && defined(S_IRUSR)
,
S_IWUSR | S_IRUSR
#elif defined(S_IWRITE) && defined(S_IREAD)
,
S_IWRITE | S_IREAD
#endif
);
if (file != -1) {
constexpr char header[] = "Error: signal\n";
[[maybe_unused]] auto ret = write(file, header, std::size(header) - 1);
backtrace_symbols_fd(array, size, file);
close(file);
}
std::raise(SIGABRT);
}

@ -21,6 +21,8 @@ CommunitiesModel::roleNames() const
{DisplayName, "displayName"},
{Tooltip, "tooltip"},
{ChildrenHidden, "childrenHidden"},
{Hidden, "hidden"},
{Id, "id"},
};
}
@ -37,11 +39,28 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
return tr("Shows all rooms without filtering.");
case CommunitiesModel::Roles::ChildrenHidden:
return false;
case CommunitiesModel::Roles::Hidden:
return false;
case CommunitiesModel::Roles::Id:
return "";
}
} else if (index.row() - 1 < tags_.size()) {
auto tag = tags_.at(index.row() - 1);
} else if (index.row() - 1 < spaceOrder_.size()) {
auto id = spaceOrder_.at(index.row() - 1);
switch (role) {
case CommunitiesModel::Roles::AvatarUrl:
return QString::fromStdString(spaces_.at(id).avatar_url);
case CommunitiesModel::Roles::DisplayName:
case CommunitiesModel::Roles::Tooltip:
return QString::fromStdString(spaces_.at(id).name);
case CommunitiesModel::Roles::ChildrenHidden:
return true;
case CommunitiesModel::Roles::Hidden:
return hiddentTagIds_.contains("space:" + id);
case CommunitiesModel::Roles::Id:
return "space:" + id;
}
} else if (index.row() - 1 < tags_.size() + spaceOrder_.size()) {
auto tag = tags_.at(index.row() - 1 - spaceOrder_.size());
if (tag == "m.favourite") {
switch (role) {
case CommunitiesModel::Roles::AvatarUrl:
@ -54,7 +73,7 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
} else if (tag == "m.lowpriority") {
switch (role) {
case CommunitiesModel::Roles::AvatarUrl:
return QString(":/icons/icons/ui/star.png");
return QString(":/icons/icons/ui/lowprio.png");
case CommunitiesModel::Roles::DisplayName:
return tr("Low Priority");
case CommunitiesModel::Roles::Tooltip:
@ -74,15 +93,16 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
case CommunitiesModel::Roles::AvatarUrl:
return QString(":/icons/icons/ui/tag.png");
case CommunitiesModel::Roles::DisplayName:
return tag.right(2);
case CommunitiesModel::Roles::Tooltip:
return tag.right(2);
return tag.mid(2);
}
}
switch (role) {
case CommunitiesModel::Roles::Hidden:
return hiddentTagIds_.contains("tag:" + tag);
case CommunitiesModel::Roles::ChildrenHidden:
return UserSettings::instance()->hiddenTags().contains("tag:" + tag);
return true;
case CommunitiesModel::Roles::Id:
return "tag:" + tag;
}
@ -93,22 +113,35 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
void
CommunitiesModel::initializeSidebar()
{
beginResetModel();
tags_.clear();
spaceOrder_.clear();
spaces_.clear();
std::set<std::string> ts;
for (const auto &e : cache::roomInfo()) {
for (const auto &t : e.tags) {
if (t.find("u.") == 0 || t.find("m." == 0)) {
ts.insert(t);
std::vector<RoomInfo> tempSpaces;
auto infos = cache::roomInfo();
for (auto it = infos.begin(); it != infos.end(); it++) {
if (it.value().is_space) {
spaceOrder_.push_back(it.key());
spaces_[it.key()] = it.value();
} else {
for (const auto &t : it.value().tags) {
if (t.find("u.") == 0 || t.find("m." == 0)) {
ts.insert(t);
}
}
}
}
beginResetModel();
tags_.clear();
for (const auto &t : ts)
tags_.push_back(QString::fromStdString(t));
hiddentTagIds_ = UserSettings::instance()->hiddenTags();
endResetModel();
emit tagsChanged();
emit hiddenTagsChanged();
}
void
@ -117,6 +150,7 @@ CommunitiesModel::clear()
beginResetModel();
tags_.clear();
endResetModel();
resetCurrentTagId();
emit tagsChanged();
}
@ -133,6 +167,25 @@ CommunitiesModel::sync(const mtx::responses::Rooms &rooms)
mtx::events::AccountDataEvent<mtx::events::account_data::Tags>>(e)) {
tagsUpdated = true;
}
for (const auto &e : room.state.events)
if (std::holds_alternative<
mtx::events::StateEvent<mtx::events::state::space::Child>>(e) ||
std::holds_alternative<
mtx::events::StateEvent<mtx::events::state::space::Parent>>(e)) {
tagsUpdated = true;
}
for (const auto &e : room.timeline.events)
if (std::holds_alternative<
mtx::events::StateEvent<mtx::events::state::space::Child>>(e) ||
std::holds_alternative<
mtx::events::StateEvent<mtx::events::state::space::Parent>>(e)) {
tagsUpdated = true;
}
}
for (const auto &[roomid, room] : rooms.leave) {
(void)room;
if (spaceOrder_.contains(QString::fromStdString(roomid)))
tagsUpdated = true;
}
if (tagsUpdated)
@ -143,16 +196,51 @@ void
CommunitiesModel::setCurrentTagId(QString tagId)
{
if (tagId.startsWith("tag:")) {
auto tag = tagId.remove(0, 4);
auto tag = tagId.mid(4);
for (const auto &t : tags_) {
if (t == tag) {
this->currentTagId_ = tagId;
emit currentTagIdChanged();
emit currentTagIdChanged(currentTagId_);
return;
}
}
} else if (tagId.startsWith("space:")) {
auto tag = tagId.mid(6);
for (const auto &t : spaceOrder_) {
if (t == tag) {
this->currentTagId_ = tagId;
emit currentTagIdChanged(currentTagId_);
return;
}
}
}
this->currentTagId_ = "";
emit currentTagIdChanged();
emit currentTagIdChanged(currentTagId_);
}
void
CommunitiesModel::toggleTagId(QString tagId)
{
if (hiddentTagIds_.contains(tagId)) {
hiddentTagIds_.removeOne(tagId);
UserSettings::instance()->setHiddenTags(hiddentTagIds_);
} else {
hiddentTagIds_.push_back(tagId);
UserSettings::instance()->setHiddenTags(hiddentTagIds_);
}
if (tagId.startsWith("tag:")) {
auto idx = tags_.indexOf(tagId.mid(4));
if (idx != -1)
emit dataChanged(index(idx + 1 + spaceOrder_.size()),
index(idx + 1 + spaceOrder_.size()),
{Hidden});
} else if (tagId.startsWith("space:")) {
auto idx = spaceOrder_.indexOf(tagId.mid(6));
if (idx != -1)
emit dataChanged(index(idx + 1), index(idx + 1), {Hidden});
}
emit hiddenTagsChanged();
}

@ -11,12 +11,15 @@
#include <mtx/responses/sync.hpp>
#include "CacheStructs.h"
class CommunitiesModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(QString currentTagId READ currentTagId WRITE setCurrentTagId NOTIFY
currentTagIdChanged RESET resetCurrentTagId)
Q_PROPERTY(QStringList tags READ tags NOTIFY tagsChanged)
Q_PROPERTY(QStringList tagsWithDefault READ tagsWithDefault NOTIFY tagsChanged)
public:
enum Roles
@ -25,6 +28,7 @@ public:
DisplayName,
Tooltip,
ChildrenHidden,
Hidden,
Id,
};
@ -33,7 +37,7 @@ public:
int rowCount(const QModelIndex &parent = QModelIndex()) const override
{
(void)parent;
return 1 + tags_.size();
return 1 + tags_.size() + spaceOrder_.size();
}
QVariant data(const QModelIndex &index, int role) const override;
@ -46,15 +50,29 @@ public slots:
void resetCurrentTagId()
{
currentTagId_.clear();
emit currentTagIdChanged();
emit currentTagIdChanged(currentTagId_);
}
QStringList tags() const { return tags_; }
QStringList tagsWithDefault() const
{
QStringList tagsWD = tags_;
tagsWD.prepend("m.lowpriority");
tagsWD.prepend("m.favourite");
tagsWD.removeOne("m.server_notice");
tagsWD.removeDuplicates();
return tagsWD;
}
void toggleTagId(QString tagId);
signals:
void currentTagIdChanged();
void currentTagIdChanged(QString tagId);
void hiddenTagsChanged();
void tagsChanged();
private:
QStringList tags_;
QString currentTagId_;
QStringList hiddentTagIds_;
QStringList spaceOrder_;
std::map<QString, RoomInfo> spaces_;
};

@ -185,6 +185,48 @@ EventStore::EventStore(std::string room_id, QObject *)
[this](std::string txn_id, std::string event_id) {
nhlog::ui()->debug("sent {}", txn_id);
// Replace the event_id in pending edits/replies/redactions with the actual
// event_id of this event. This allows one to edit and reply to events that are
// currently pending.
// FIXME (introduced by balsoft): this doesn't work for encrypted events, but
// allegedly it's hard to fix so I'll leave my first contribution at that
for (auto related_event_id : cache::client()->relatedEvents(room_id_, txn_id)) {
if (cache::client()->getEvent(room_id_, related_event_id)) {
auto related_event =
cache::client()->getEvent(room_id_, related_event_id).value();
auto relations = mtx::accessors::relations(related_event.data);
// Replace the blockquote in fallback reply
auto related_text =
std::get_if<mtx::events::RoomEvent<mtx::events::msg::Text>>(
&related_event.data);
if (related_text && relations.reply_to() == txn_id) {
size_t index =
related_text->content.formatted_body.find(txn_id);
if (index != std::string::npos) {
related_text->content.formatted_body.replace(
index, event_id.length(), event_id);
}
}
for (mtx::common::Relation &rel : relations.relations) {
if (rel.event_id == txn_id)
rel.event_id = event_id;
}
mtx::accessors::set_relations(related_event.data, relations);
cache::client()->replaceEvent(
room_id_, related_event_id, related_event);
auto idx = idToIndex(related_event_id);
events_by_id_.remove({room_id_, related_event_id});
events_.remove({room_id_, toInternalIdx(*idx)});
}
}
http::client()->read_event(
room_id_, event_id, [this, event_id](mtx::http::RequestErr err) {
if (err) {
@ -193,6 +235,11 @@ EventStore::EventStore(std::string room_id, QObject *)
}
});
auto idx = idToIndex(event_id);
if (idx)
emit dataChanged(*idx, *idx);
cache::client()->removePendingStatus(room_id_, txn_id);
this->current_txn = "";
this->current_txn_error_count = 0;
@ -628,6 +675,9 @@ EventStore::decryptEvent(const IdIndex &idx,
index.room_id,
index.session_id,
e.sender);
// we may not want to request keys during initial sync and such
if (suppressKeyRequests)
break;
// TODO: Check if this actually works and look in key backup
auto copy = e;
copy.room_id = room_id_;
@ -769,6 +819,18 @@ EventStore::decryptEvent(const IdIndex &idx,
return asCacheEntry(std::move(decryptionResult.event.value()));
}
void
EventStore::enableKeyRequests(bool suppressKeyRequests_)
{
if (!suppressKeyRequests_) {
for (const auto &key : decryptedEvents_.keys())
if (key.room == this->room_id_)
decryptedEvents_.remove(key);
suppressKeyRequests = false;
} else
suppressKeyRequests = true;
}
mtx::events::collections::TimelineEvents *
EventStore::get(std::string id, std::string_view related_to, bool decrypt, bool resolve_edits)
{

@ -115,6 +115,7 @@ public slots:
void addPending(mtx::events::collections::TimelineEvents event);
void receivedSessionKey(const std::string &session_id);
void clearTimeline();
void enableKeyRequests(bool suppressKeyRequests_);
private:
std::vector<mtx::events::collections::TimelineEvents> edits(const std::string &event_id);
@ -142,4 +143,5 @@ private:
std::string current_txn;
int current_txn_error_count = 0;
bool noMoreMessages = false;
bool suppressKeyRequests = true;
};

@ -296,7 +296,7 @@ InputBar::message(QString msg, MarkdownOverride useMarkdown, bool rainbowify)
firstLine = false;
body = QString("> <%1> %2\n").arg(related.quoted_user).arg(line);
} else {
body = QString("%1\n> %2\n").arg(body).arg(line);
body += QString("> %1\n").arg(line);
}
}

@ -33,6 +33,27 @@ RoomlistModel::RoomlistModel(TimelineViewManager *parent)
&RoomlistModel::totalUnreadMessageCountUpdated,
ChatPage::instance(),
&ChatPage::unreadMessages);
connect(
this,
&RoomlistModel::fetchedPreview,
this,
[this](QString roomid, RoomInfo info) {
if (this->previewedRooms.contains(roomid)) {
this->previewedRooms.insert(roomid, std::move(info));
auto idx = this->roomidToIndex(roomid);
emit dataChanged(index(idx),
index(idx),
{
Roles::RoomName,
Roles::AvatarUrl,
Roles::IsSpace,
Roles::IsPreviewFetched,
Qt::DisplayRole,
});
}
},
Qt::QueuedConnection);
}
QHash<int, QByteArray>
@ -51,6 +72,7 @@ RoomlistModel::roleNames() const
{IsInvite, "isInvite"},
{IsSpace, "isSpace"},
{Tags, "tags"},
{ParentSpaces, "parentSpaces"},
};
}
@ -60,6 +82,16 @@ RoomlistModel::data(const QModelIndex &index, int role) const
if (index.row() >= 0 && static_cast<size_t>(index.row()) < roomids.size()) {
auto roomid = roomids.at(index.row());
if (role == Roles::ParentSpaces) {
auto parents = cache::client()->getParentRoomIds(roomid.toStdString());
QStringList list;
for (const auto &t : parents)
list.push_back(QString::fromStdString(t));
return list;
} else if (role == Roles::RoomId) {
return roomid;
}
if (models.contains(roomid)) {
auto room = models.value(roomid);
switch (role) {
@ -67,8 +99,6 @@ RoomlistModel::data(const QModelIndex &index, int role) const
return room->roomAvatarUrl();
case Roles::RoomName:
return room->plainRoomName();
case Roles::RoomId:
return room->roomId();
case Roles::LastMessage:
return room->lastMessage().body;
case Roles::Time:
@ -84,7 +114,10 @@ RoomlistModel::data(const QModelIndex &index, int role) const
case Roles::NotificationCount:
return room->notificationCount();
case Roles::IsInvite:
return false;
case Roles::IsSpace:
return room->isSpace();
case Roles::IsPreview:
return false;
case Roles::Tags: {
auto info = cache::singleRoomInfo(roomid.toStdString());
@ -103,14 +136,12 @@ RoomlistModel::data(const QModelIndex &index, int role) const
return QString::fromStdString(room.avatar_url);
case Roles::RoomName:
return QString::fromStdString(room.name);
case Roles::RoomId:
return roomid;
case Roles::LastMessage:
return room.msgInfo.body;
return QString();
case Roles::Time:
return room.msgInfo.descriptiveTime;
return QString();
case Roles::Timestamp:
return QVariant(static_cast<quint64>(room.msgInfo.timestamp));
return QVariant(static_cast<quint64>(0));
case Roles::HasUnreadMessages:
case Roles::HasLoudNotification:
return false;
@ -120,13 +151,77 @@ RoomlistModel::data(const QModelIndex &index, int role) const
return true;
case Roles::IsSpace:
return false;
case Roles::IsPreview:
return false;
case Roles::Tags:
return QStringList();
default:
return {};
}
} else if (previewedRooms.contains(roomid) &&
previewedRooms.value(roomid).has_value()) {
auto room = previewedRooms.value(roomid).value();
switch (role) {
case Roles::AvatarUrl:
return QString::fromStdString(room.avatar_url);
case Roles::RoomName:
return QString::fromStdString(room.name);
case Roles::LastMessage:
return tr("Previewing this room");
case Roles::Time:
return QString();
case Roles::Timestamp:
return QVariant(static_cast<quint64>(0));
case Roles::HasUnreadMessages:
case Roles::HasLoudNotification:
return false;
case Roles::NotificationCount:
return 0;
case Roles::IsInvite:
return false;
case Roles::IsSpace:
return room.is_space;
case Roles::IsPreview:
return true;
case Roles::IsPreviewFetched:
return true;
case Roles::Tags:
return QStringList();
default:
return {};
}
} else {
return {};
if (role == Roles::IsPreview)
return true;
else if (role == Roles::IsPreviewFetched)
return false;
fetchPreview(roomid);
switch (role) {
case Roles::AvatarUrl:
return QString();
case Roles::RoomName:
return tr("No preview available");
case Roles::LastMessage:
return QString();
case Roles::Time:
return QString();
case Roles::Timestamp:
return QVariant(static_cast<quint64>(0));
case Roles::HasUnreadMessages:
case Roles::HasLoudNotification:
return false;
case Roles::NotificationCount:
return 0;
case Roles::IsInvite:
return false;
case Roles::IsSpace:
return false;
case Roles::Tags:
return QStringList();
default:
return {};
}
}
} else {
return {};
@ -230,25 +325,111 @@ RoomlistModel::addRoom(const QString &room_id, bool suppressInsertNotification)
newRoom->updateLastMessage();
bool wasInvite = invites.contains(room_id);
if (!suppressInsertNotification && !wasInvite)
beginInsertRows(QModelIndex(), (int)roomids.size(), (int)roomids.size());
std::vector<QString> previewsToAdd;
if (newRoom->isSpace()) {
auto childs = cache::client()->getChildRoomIds(room_id.toStdString());
for (const auto &c : childs) {
auto id = QString::fromStdString(c);
if (!(models.contains(id) || invites.contains(id) ||
previewedRooms.contains(id))) {
previewsToAdd.push_back(std::move(id));
}
}
}
models.insert(room_id, std::move(newRoom));
bool wasInvite = invites.contains(room_id);
bool wasPreview = previewedRooms.contains(room_id);
if (!suppressInsertNotification &&
((!wasInvite && !wasPreview) || !previewedRooms.empty()))
// if the old room was already in the list, don't add it. Also add all
// previews at the same time.
beginInsertRows(QModelIndex(),
(int)roomids.size(),
(int)(roomids.size() + previewsToAdd.size() -
((wasInvite || wasPreview) ? 0 : 1)));
models.insert(room_id, std::move(newRoom));
if (wasInvite) {
auto idx = roomidToIndex(room_id);
invites.remove(room_id);
emit dataChanged(index(idx), index(idx));
} else if (wasPreview) {
auto idx = roomidToIndex(room_id);
previewedRooms.remove(room_id);
emit dataChanged(index(idx), index(idx));
} else {
roomids.push_back(room_id);
}
for (auto p : previewsToAdd) {
previewedRooms.insert(p, std::nullopt);
roomids.push_back(std::move(p));
}
if (!suppressInsertNotification && !wasInvite)
endInsertRows();
}
}
void
RoomlistModel::fetchPreview(QString roomid_) const
{
std::string roomid = roomid_.toStdString();
http::client()->get_state_event<mtx::events::state::Create>(
roomid,
"",
[this, roomid](const mtx::events::state::Create &c, mtx::http::RequestErr err) {
bool is_space = false;
if (!err) {
is_space = c.type == mtx::events::state::room_type::space;
}
http::client()->get_state_event<mtx::events::state::Avatar>(
roomid,
"",
[this, roomid, is_space](const mtx::events::state::Avatar &a,
mtx::http::RequestErr) {
auto avatar_url = a.url;
http::client()->get_state_event<mtx::events::state::Topic>(
roomid,
"",
[this, roomid, avatar_url, is_space](
const mtx::events::state::Topic &t, mtx::http::RequestErr) {
auto topic = t.topic;
http::client()->get_state_event<mtx::events::state::Name>(
roomid,
"",
[this, roomid, topic, avatar_url, is_space](
const mtx::events::state::Name &n,
mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn(
"Failed to fetch name event to "
"create preview for {}",
roomid);
}
// don't even add a preview, if we got not a single
// response
if (n.name.empty() && avatar_url.empty() &&
topic.empty())
return;
RoomInfo info{};
info.name = n.name;
info.is_space = is_space;
info.avatar_url = avatar_url;
info.topic = topic;
const_cast<RoomlistModel *>(this)->fetchedPreview(
QString::fromStdString(roomid), info);
});
});
});
});
}
void
RoomlistModel::sync(const mtx::responses::Rooms &rooms)
{
@ -324,6 +505,7 @@ RoomlistModel::initializeRooms()
models.clear();
roomids.clear();
invites.clear();
currentRoom_ = nullptr;
invites = cache::client()->invites();
for (const auto &id : invites.keys())
@ -407,11 +589,15 @@ RoomlistModel::setCurrentRoom(QString roomid)
namespace {
enum NotificationImportance : short
{
ImportanceDisabled = -1,
ImportanceDisabled = -3,
NoPreview = -2,
Preview = -1,
AllEventsRead = 0,
NewMessage = 1,
NewMentions = 2,
Invite = 3
Invite = 3,
SubSpace = 4,
CurrentSpace = 5,
};
}
@ -421,7 +607,18 @@ FilteredRoomlistModel::calculateImportance(const QModelIndex &idx) const
// Returns the degree of importance of the unread messages in the room.
// If sorting by importance is disabled in settings, this only ever
// returns ImportanceDisabled or Invite
if (sourceModel()->data(idx, RoomlistModel::IsInvite).toBool()) {
if (sourceModel()->data(idx, RoomlistModel::IsSpace).toBool()) {
if (filterType == FilterBy::Space &&
filterStr == sourceModel()->data(idx, RoomlistModel::RoomId).toString())
return CurrentSpace;
else
return SubSpace;
} else if (sourceModel()->data(idx, RoomlistModel::IsPreview).toBool()) {
if (sourceModel()->data(idx, RoomlistModel::IsPreviewFetched).toBool())
return Preview;
else
return NoPreview;
} else if (sourceModel()->data(idx, RoomlistModel::IsInvite).toBool()) {
return Invite;
} else if (!this->sortByImportance) {
return ImportanceDisabled;
@ -433,6 +630,7 @@ FilteredRoomlistModel::calculateImportance(const QModelIndex &idx) const
return AllEventsRead;
}
}
bool
FilteredRoomlistModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
@ -485,6 +683,140 @@ FilteredRoomlistModel::FilteredRoomlistModel(RoomlistModel *model, QObject *pare
sort(0);
}
void
FilteredRoomlistModel::updateHiddenTagsAndSpaces()
{
hiddenTags.clear();
hiddenSpaces.clear();
for (const auto &t : UserSettings::instance()->hiddenTags()) {
if (t.startsWith("tag:"))
hiddenTags.push_back(t.mid(4));
else if (t.startsWith("space:"))
hiddenSpaces.push_back(t.mid(6));
}
invalidateFilter();
}
bool
FilteredRoomlistModel::filterAcceptsRow(int sourceRow, const QModelIndex &) const
{
if (filterType == FilterBy::Nothing) {
if (sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::IsPreview)
.toBool()) {
return false;
}
if (sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::IsSpace)
.toBool()) {
return false;
}
if (!hiddenTags.empty()) {
auto tags =
sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::Tags)
.toStringList();
for (const auto &t : tags)
if (hiddenTags.contains(t))
return false;
}
if (!hiddenSpaces.empty()) {
auto parents =
sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::ParentSpaces)
.toStringList();
for (const auto &t : parents)
if (hiddenSpaces.contains(t))
return false;
}
return true;
} else if (filterType == FilterBy::Tag) {
if (sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::IsPreview)
.toBool()) {
return false;
}
if (sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::IsSpace)
.toBool()) {
return false;
}
auto tags = sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::Tags)
.toStringList();
if (!tags.contains(filterStr))
return false;
if (!hiddenTags.empty()) {
for (const auto &t : tags)
if (t != filterStr && hiddenTags.contains(t))
return false;
}
if (!hiddenSpaces.empty()) {
auto parents =
sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::ParentSpaces)
.toStringList();
for (const auto &t : parents)
if (hiddenSpaces.contains(t))
return false;
}
return true;
} else if (filterType == FilterBy::Space) {
if (filterStr == sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::RoomId)
.toString())
return true;
auto parents =
sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::ParentSpaces)
.toStringList();
if (!parents.contains(filterStr))
return false;
if (!hiddenTags.empty()) {
auto tags =
sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::Tags)
.toStringList();
for (const auto &t : tags)
if (hiddenTags.contains(t))
return false;
}
if (!hiddenSpaces.empty()) {
for (const auto &t : parents)
if (hiddenSpaces.contains(t))
return false;
}
if (sourceModel()
->data(sourceModel()->index(sourceRow, 0), RoomlistModel::IsSpace)
.toBool() &&
!parents.contains(filterStr)) {
return false;
}
return true;
} else {
return true;
}
}
void
FilteredRoomlistModel::toggleTag(QString roomid, QString tag, bool on)
{
@ -532,7 +864,7 @@ FilteredRoomlistModel::previousRoom()
if (r) {
int idx = roomidToIndex(r->roomId());
idx--;
if (idx > 0) {
if (idx >= 0) {
setCurrentRoom(
data(index(idx, 0), RoomlistModel::Roles::RoomId).toString());
}

@ -37,7 +37,10 @@ public:
NotificationCount,
IsInvite,
IsSpace,
IsPreview,
IsPreviewFetched,
Tags,
ParentSpaces,
};
RoomlistModel(TimelineViewManager *parent = nullptr);
@ -86,15 +89,18 @@ private slots:
signals:
void totalUnreadMessageCountUpdated(int unreadMessages);
void currentRoomChanged();
void fetchedPreview(QString roomid, RoomInfo info);
private:
void addRoom(const QString &room_id, bool suppressInsertNotification = false);
void fetchPreview(QString roomid) const;
TimelineViewManager *manager = nullptr;
std::vector<QString> roomids;
QHash<QString, RoomInfo> invites;
QHash<QString, QSharedPointer<TimelineModel>> models;
std::map<QString, bool> roomReadStatus;
QHash<QString, std::optional<RoomInfo>> previewedRooms;
QSharedPointer<TimelineModel> currentRoom_;
@ -109,6 +115,7 @@ class FilteredRoomlistModel : public QSortFilterProxyModel
public:
FilteredRoomlistModel(RoomlistModel *model, QObject *parent = nullptr);
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;
bool filterAcceptsRow(int sourceRow, const QModelIndex &) const override;
public slots:
int roomidToIndex(QString roomid)
@ -128,6 +135,24 @@ public slots:
void nextRoom();
void previousRoom();
void updateFilterTag(QString tagId)
{
if (tagId.startsWith("tag:")) {
filterType = FilterBy::Tag;
filterStr = tagId.mid(4);
} else if (tagId.startsWith("space:")) {
filterType = FilterBy::Space;
filterStr = tagId.mid(6);
} else {
filterType = FilterBy::Nothing;
filterStr.clear();
}
invalidateFilter();
}
void updateHiddenTagsAndSpaces();
signals:
void currentRoomChanged();
@ -135,4 +160,14 @@ private:
short int calculateImportance(const QModelIndex &idx) const;
RoomlistModel *roomlistmodel;
bool sortByImportance = true;
enum class FilterBy
{
Tag,
Space,
Nothing,
};
QString filterStr = "";
FilterBy filterType = FilterBy::Nothing;
QStringList hiddenTags, hiddenSpaces;
};

@ -320,6 +320,10 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
{
lastMessage_.timestamp = 0;
if (auto create =
cache::client()->getStateEvent<mtx::events::state::Create>(room_id.toStdString()))
this->isSpace_ = create->content.type == mtx::events::state::room_type::space;
connect(
this,
&TimelineModel::redactionFailed,
@ -376,6 +380,27 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
this->updateFlowEventId(event_id);
});
// When a message is sent, check if the current edit/reply relates to that message,
// and update the event_id so that it points to the sent message and not the pending one.
connect(&events,
&EventStore::messageSent,
this,
[this](std::string txn_id, std::string event_id) {
if (edit_.toStdString() == txn_id) {
edit_ = QString::fromStdString(event_id);
emit editChanged(edit_);
}
if (reply_.toStdString() == txn_id) {
reply_ = QString::fromStdString(event_id);
emit replyChanged(reply_);
}
});
connect(manager_,
&TimelineViewManager::initialSyncChanged,
&events,
&EventStore::enableKeyRequests);
showEventTimer.callOnTimeout(this, &TimelineModel::scrollTimerEvent);
}
@ -507,6 +532,10 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
const static QRegularExpression matchImgUri(
"(<img [^>]*)src=\"mxc://([^\"]*)\"([^>]*>)");
formattedBody_.replace(matchImgUri, "\\1 src=\"image://mxcImage/\\2\"\\3");
// Same regex but for single quotes around the src
const static QRegularExpression matchImgUri2(
"(<img [^>]*)src=\'mxc://([^\']*)\'([^>]*>)");
formattedBody_.replace(matchImgUri2, "\\1 src=\"image://mxcImage/\\2\"\\3");
const static QRegularExpression matchEmoticonHeight(
"(<img data-mx-emoticon [^>]*)height=\"([^\"]*)\"([^>]*>)");
formattedBody_.replace(matchEmoticonHeight,
@ -568,10 +597,8 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
case IsEdited:
return QVariant(relations(event).replaces().has_value());
case IsEditable:
return QVariant(!is_state_event(event) &&
mtx::accessors::sender(event) ==
http::client()->user_id().to_string() &&
!event_id(event).empty() && event_id(event).front() == '$');
return QVariant(!is_state_event(event) && mtx::accessors::sender(event) ==
http::client()->user_id().to_string());
case IsEncrypted: {
auto id = event_id(event);
auto encrypted_event = events.get(id, "", false);
@ -757,6 +784,7 @@ TimelineModel::syncState(const mtx::responses::State &s)
} else if (std::holds_alternative<StateEvent<state::Member>>(e)) {
emit roomAvatarUrlChanged();
emit roomNameChanged();
emit roomMemberCountChanged();
}
}
}
@ -813,6 +841,7 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline)
} else if (std::holds_alternative<StateEvent<state::Member>>(e)) {
emit roomAvatarUrlChanged();
emit roomNameChanged();
emit roomMemberCountChanged();
}
}
updateLastMessage();
@ -1787,7 +1816,8 @@ TimelineModel::formatMemberEvent(QString id)
}
if (event->content.reason != "") {
rendered += tr(" Reason: %1").arg(QString::fromStdString(event->content.reason));
rendered +=
" " + tr("Reason: %1").arg(QString::fromStdString(event->content.reason));
}
return rendered;
@ -1796,9 +1826,6 @@ TimelineModel::formatMemberEvent(QString id)
void
TimelineModel::setEdit(QString newEdit)
{
if (edit_.startsWith('m'))
return;
if (newEdit.isEmpty()) {
resetEdit();
return;
@ -1921,3 +1948,9 @@ TimelineModel::roomTopic() const
return utils::replaceEmoji(utils::linkifyMessage(
QString::fromStdString(info[room_id_].topic).toHtmlEscaped()));
}
int
TimelineModel::roomMemberCount() const
{
return (int)cache::client()->memberCount(room_id_.toStdString());
}

@ -161,6 +161,8 @@ class TimelineModel : public QAbstractListModel
Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged)
Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged)
Q_PROPERTY(int roomMemberCount READ roomMemberCount NOTIFY roomMemberCountChanged)
Q_PROPERTY(bool isSpace READ isSpace CONSTANT)
Q_PROPERTY(InputBar *input READ input CONSTANT)
Q_PROPERTY(Permissions *permissions READ permissions NOTIFY permissionsChanged)
@ -262,6 +264,8 @@ public:
RelatedInfo relatedInfo(QString id);
DescInfo lastMessage() const { return lastMessage_; }
bool isSpace() const { return isSpace_; }
int roomMemberCount() const;
public slots:
void setCurrentIndex(int index);
@ -348,6 +352,7 @@ signals:
void roomNameChanged();
void roomTopicChanged();
void roomAvatarUrlChanged();
void roomMemberCountChanged();
void permissionsChanged();
void forwardToRoom(mtx::events::collections::TimelineEvents *e, QString roomId);
@ -366,9 +371,6 @@ private:
QString room_id_;
bool decryptDescription = true;
bool m_paginationInProgress = false;
QString currentId, currentReadId;
QString reply_, edit_;
QString textBeforeEdit, replyBeforeEdit;
@ -388,6 +390,10 @@ private:
friend struct SendMessageVisitor;
int notification_count = 0, highlight_count = 0;
bool decryptDescription = true;
bool m_paginationInProgress = false;
bool isSpace_ = false;
};
template<class T>

@ -107,8 +107,7 @@ QColor
TimelineViewManager::userColor(QString id, QColor background)
{
if (!userColors.contains(id))
userColors.insert(
id, QColor(utils::generateContrastingHexColor(id, background.name())));
userColors.insert(id, QColor(utils::generateContrastingHexColor(id, background)));
return userColors.value(id);
}
@ -195,7 +194,17 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
});
qmlRegisterSingletonType<RoomlistModel>(
"im.nheko", 1, 0, "Rooms", [](QQmlEngine *, QJSEngine *) -> QObject * {
return new FilteredRoomlistModel(self->rooms_);
auto ptr = new FilteredRoomlistModel(self->rooms_);
connect(self->communities_,
&CommunitiesModel::currentTagIdChanged,
ptr,
&FilteredRoomlistModel::updateFilterTag);
connect(self->communities_,
&CommunitiesModel::hiddenTagsChanged,
ptr,
&FilteredRoomlistModel::updateHiddenTagsAndSpaces);
return ptr;
});
qmlRegisterSingletonType<RoomlistModel>(
"im.nheko", 1, 0, "Communities", [](QQmlEngine *, QJSEngine *) -> QObject * {
@ -386,18 +395,17 @@ TimelineViewManager::openImageOverlayInternal(QString eventId, QImage img)
imgDialog->showFullScreen();
auto room = rooms_->currentRoom();
connect(
imgDialog, &dialogs::ImageOverlay::saving, room, [this, eventId, imgDialog, room]() {
// hide the overlay while presenting the save dialog for better
// cross platform support.
imgDialog->hide();
if (!room->saveMedia(eventId)) {
imgDialog->show();
} else {
imgDialog->close();
}
});
connect(imgDialog, &dialogs::ImageOverlay::saving, room, [eventId, imgDialog, room]() {
// hide the overlay while presenting the save dialog for better
// cross platform support.
imgDialog->hide();
if (!room->saveMedia(eventId)) {
imgDialog->show();
} else {
imgDialog->close();
}
});
}
void

@ -181,7 +181,7 @@ RoomSettings::RoomSettings(QString roomid, QObject *parent)
roomid_.toStdString(),
[this](const mtx::pushrules::PushRule &rule, mtx::http::RequestErr &err) {
if (err) {
if (err->status_code == boost::beast::http::status::not_found)
if (err->status_code == 404)
http::client()->get_pushrules(
"global",
"room",

@ -47,7 +47,7 @@ Theme::paletteFromTheme(std::string_view theme)
darkActive.setColor(QPalette::ToolTipBase, darkActive.base().color());
darkActive.setColor(QPalette::ToolTipText, darkActive.text().color());
darkActive.setColor(QPalette::Link, QColor("#38a3d8"));
darkActive.setColor(QPalette::ButtonText, "#727274");
darkActive.setColor(QPalette::ButtonText, "#828284");
return darkActive;
} else {
return original;

@ -39,7 +39,8 @@ UserProfile::UserProfile(QString roomid,
getGlobalProfileData();
}
if (!cache::client() || !cache::client()->isDatabaseReady())
if (!cache::client() || !cache::client()->isDatabaseReady() ||
!ChatPage::instance()->timelineManager())
return;
connect(cache::client(),
@ -127,10 +128,7 @@ UserProfile::displayName()
QString
UserProfile::avatarUrl()
{
return (isGlobalUserProfile() && globalAvatarUrl != "")
? globalAvatarUrl
: cache::avatarUrl(roomid_, userid_);
;
return isGlobalUserProfile() ? globalAvatarUrl : cache::avatarUrl(roomid_, userid_);
}
bool

@ -0,0 +1,56 @@
name: "CI: Build Test"
on: [push, pull_request]
jobs:
build:
strategy:
matrix:
qt_version: [5.12.6, 5.13.2, 5.14.0, 5.15.0, 6.0.0]
platform: [ubuntu-20.04, windows-latest, macos-latest]
include:
- qt_version: 6.0.0
additional_arguments: -D QT_DEFAULT_MAJOR_VERSION=6
- platform: ubuntu-20.04
CXXFLAGS: -Wall -Wextra -pedantic -Werror
- platform: macos-latest
CXXFLAGS: -Wall -Wextra -pedantic -Werror
- platform: windows-latest
CXXFLAGS: /W4 /WX
runs-on: ${{ matrix.platform }}
env:
CXXFLAGS: ${{ matrix.CXXFLAGS }}
steps:
- uses: actions/checkout@v2.3.4
- name: Install Qt
uses: jurplel/install-qt-action@v2.11.1
with:
version: ${{ matrix.qt_version }}
- name: cmake
run: cmake . ${{ matrix.additional_arguments }}
- name: cmake build
run: cmake --build .
- name: Build example - basic (cmake)
working-directory: examples/basic/
run: |
cmake . ${{ matrix.additional_arguments }}
cmake --build .
- name: Build example - calculator (cmake)
working-directory: examples/calculator/
run: |
cmake . ${{ matrix.additional_arguments }}
cmake --build .
- name: Build example - sending_arguments (cmake)
working-directory: examples/sending_arguments/
run: |
cmake . ${{ matrix.additional_arguments }}
cmake --build .

@ -3,6 +3,12 @@ Changelog
If by accident I have forgotten to credit someone in the CHANGELOG, email me and I will fix it.
__3.3.0__
---------
* Fixed message fragmentation issue causing crashes and incorrectly and inconsistently received messages. - _Nils Jeisecke_
__3.2.0__
---------

@ -0,0 +1,12 @@
cmake_minimum_required(VERSION 3.7.0)
project(basic LANGUAGES CXX)
# SingleApplication base class
set(QAPPLICATION_CLASS QCoreApplication)
add_subdirectory(../.. SingleApplication)
add_executable(basic main.cpp)
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication)

@ -0,0 +1,5 @@
# Single Application implementation
include(../../singleapplication.pri)
DEFINES += QAPPLICATION_CLASS=QCoreApplication
SOURCES += main.cpp

@ -0,0 +1,10 @@
#include <singleapplication.h>
int main(int argc, char *argv[])
{
SingleApplication app( argc, argv );
qWarning() << "Started a new instance";
return app.exec();
}

@ -0,0 +1,21 @@
cmake_minimum_required(VERSION 3.7.0)
project(calculator LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
# SingleApplication base class
set(QAPPLICATION_CLASS QApplication)
add_subdirectory(../.. SingleApplication)
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED)
add_executable(${PROJECT_NAME}
button.h
calculator.h
button.cpp
calculator.cpp
main.cpp
)
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication)

@ -0,0 +1,73 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtWidgets>
#include "button.h"
//! [0]
Button::Button(const QString &text, QWidget *parent)
: QToolButton(parent)
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
setText(text);
}
//! [0]
//! [1]
QSize Button::sizeHint() const
//! [1] //! [2]
{
QSize size = QToolButton::sizeHint();
size.rheight() += 20;
size.rwidth() = qMax(size.width(), size.height());
return size;
}
//! [2]

@ -0,0 +1,68 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef BUTTON_H
#define BUTTON_H
#include <QToolButton>
//! [0]
class Button : public QToolButton
{
Q_OBJECT
public:
explicit Button(const QString &text, QWidget *parent = 0);
QSize sizeHint() const Q_DECL_OVERRIDE;
};
//! [0]
#endif

@ -0,0 +1,406 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtWidgets>
#include <cmath>
#include "button.h"
#include "calculator.h"
//! [0]
Calculator::Calculator(QWidget *parent)
: QWidget(parent)
{
sumInMemory = 0.0;
sumSoFar = 0.0;
factorSoFar = 0.0;
waitingForOperand = true;
//! [0]
//! [1]
display = new QLineEdit("0");
//! [1] //! [2]
display->setReadOnly(true);
display->setAlignment(Qt::AlignRight);
display->setMaxLength(15);
QFont font = display->font();
font.setPointSize(font.pointSize() + 8);
display->setFont(font);
//! [2]
//! [4]
for (int i = 0; i < NumDigitButtons; ++i) {
digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked()));
}
Button *pointButton = createButton(".", SLOT(pointClicked()));
Button *changeSignButton = createButton("\302\261", SLOT(changeSignClicked()));
Button *backspaceButton = createButton("Backspace", SLOT(backspaceClicked()));
Button *clearButton = createButton("Clear", SLOT(clear()));
Button *clearAllButton = createButton("Clear All", SLOT(clearAll()));
Button *clearMemoryButton = createButton("MC", SLOT(clearMemory()));
Button *readMemoryButton = createButton("MR", SLOT(readMemory()));
Button *setMemoryButton = createButton("MS", SLOT(setMemory()));
Button *addToMemoryButton = createButton("M+", SLOT(addToMemory()));
Button *divisionButton = createButton("\303\267", SLOT(multiplicativeOperatorClicked()));
Button *timesButton = createButton("\303\227", SLOT(multiplicativeOperatorClicked()));
Button *minusButton = createButton("-", SLOT(additiveOperatorClicked()));
Button *plusButton = createButton("+", SLOT(additiveOperatorClicked()));
Button *squareRootButton = createButton("Sqrt", SLOT(unaryOperatorClicked()));
Button *powerButton = createButton("x\302\262", SLOT(unaryOperatorClicked()));
Button *reciprocalButton = createButton("1/x", SLOT(unaryOperatorClicked()));
Button *equalButton = createButton("=", SLOT(equalClicked()));
//! [4]
//! [5]
QGridLayout *mainLayout = new QGridLayout;
//! [5] //! [6]
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
mainLayout->addWidget(display, 0, 0, 1, 6);
mainLayout->addWidget(backspaceButton, 1, 0, 1, 2);
mainLayout->addWidget(clearButton, 1, 2, 1, 2);
mainLayout->addWidget(clearAllButton, 1, 4, 1, 2);
mainLayout->addWidget(clearMemoryButton, 2, 0);
mainLayout->addWidget(readMemoryButton, 3, 0);
mainLayout->addWidget(setMemoryButton, 4, 0);
mainLayout->addWidget(addToMemoryButton, 5, 0);
for (int i = 1; i < NumDigitButtons; ++i) {
int row = ((9 - i) / 3) + 2;
int column = ((i - 1) % 3) + 1;
mainLayout->addWidget(digitButtons[i], row, column);
}
mainLayout->addWidget(digitButtons[0], 5, 1);
mainLayout->addWidget(pointButton, 5, 2);
mainLayout->addWidget(changeSignButton, 5, 3);
mainLayout->addWidget(divisionButton, 2, 4);
mainLayout->addWidget(timesButton, 3, 4);
mainLayout->addWidget(minusButton, 4, 4);
mainLayout->addWidget(plusButton, 5, 4);
mainLayout->addWidget(squareRootButton, 2, 5);
mainLayout->addWidget(powerButton, 3, 5);
mainLayout->addWidget(reciprocalButton, 4, 5);
mainLayout->addWidget(equalButton, 5, 5);
setLayout(mainLayout);
setWindowTitle("Calculator");
}
//! [6]
//! [7]
void Calculator::digitClicked()
{
Button *clickedButton = qobject_cast<Button *>(sender());
int digitValue = clickedButton->text().toInt();
if (display->text() == "0" && digitValue == 0.0)
return;
if (waitingForOperand) {
display->clear();
waitingForOperand = false;
}
display->setText(display->text() + QString::number(digitValue));
}
//! [7]
//! [8]
void Calculator::unaryOperatorClicked()
//! [8] //! [9]
{
Button *clickedButton = qobject_cast<Button *>(sender());
QString clickedOperator = clickedButton->text();
double operand = display->text().toDouble();
double result = 0.0;
if (clickedOperator == "Sqrt") {
if (operand < 0.0) {
abortOperation();
return;
}
result = std::sqrt(operand);
} else if (clickedOperator == "x\302\262") {
result = std::pow(operand, 2.0);
} else if (clickedOperator == "1/x") {
if (operand == 0.0) {
abortOperation();
return;
}
result = 1.0 / operand;
}
display->setText(QString::number(result));
waitingForOperand = true;
}
//! [9]
//! [10]
void Calculator::additiveOperatorClicked()
//! [10] //! [11]
{
Button *clickedButton = qobject_cast<Button *>(sender());
QString clickedOperator = clickedButton->text();
double operand = display->text().toDouble();
//! [11] //! [12]
if (!pendingMultiplicativeOperator.isEmpty()) {
//! [12] //! [13]
if (!calculate(operand, pendingMultiplicativeOperator)) {
abortOperation();
return;
}
display->setText(QString::number(factorSoFar));
operand = factorSoFar;
factorSoFar = 0.0;
pendingMultiplicativeOperator.clear();
}
//! [13] //! [14]
if (!pendingAdditiveOperator.isEmpty()) {
//! [14] //! [15]
if (!calculate(operand, pendingAdditiveOperator)) {
abortOperation();
return;
}
display->setText(QString::number(sumSoFar));
} else {
sumSoFar = operand;
}
//! [15] //! [16]
pendingAdditiveOperator = clickedOperator;
//! [16] //! [17]
waitingForOperand = true;
}
//! [17]
//! [18]
void Calculator::multiplicativeOperatorClicked()
{
Button *clickedButton = qobject_cast<Button *>(sender());
QString clickedOperator = clickedButton->text();
double operand = display->text().toDouble();
if (!pendingMultiplicativeOperator.isEmpty()) {
if (!calculate(operand, pendingMultiplicativeOperator)) {
abortOperation();
return;
}
display->setText(QString::number(factorSoFar));
} else {
factorSoFar = operand;
}
pendingMultiplicativeOperator = clickedOperator;
waitingForOperand = true;
}
//! [18]
//! [20]
void Calculator::equalClicked()
{
double operand = display->text().toDouble();
if (!pendingMultiplicativeOperator.isEmpty()) {
if (!calculate(operand, pendingMultiplicativeOperator)) {
abortOperation();
return;
}
operand = factorSoFar;
factorSoFar = 0.0;
pendingMultiplicativeOperator.clear();
}
if (!pendingAdditiveOperator.isEmpty()) {
if (!calculate(operand, pendingAdditiveOperator)) {
abortOperation();
return;
}
pendingAdditiveOperator.clear();
} else {
sumSoFar = operand;
}
display->setText(QString::number(sumSoFar));
sumSoFar = 0.0;
waitingForOperand = true;
}
//! [20]
//! [22]
void Calculator::pointClicked()
{
if (waitingForOperand)
display->setText("0");
if (!display->text().contains('.'))
display->setText(display->text() + ".");
waitingForOperand = false;
}
//! [22]
//! [24]
void Calculator::changeSignClicked()
{
QString text = display->text();
double value = text.toDouble();
if (value > 0.0) {
text.prepend("-");
} else if (value < 0.0) {
text.remove(0, 1);
}
display->setText(text);
}
//! [24]
//! [26]
void Calculator::backspaceClicked()
{
if (waitingForOperand)
return;
QString text = display->text();
text.chop(1);
if (text.isEmpty()) {
text = "0";
waitingForOperand = true;
}
display->setText(text);
}
//! [26]
//! [28]
void Calculator::clear()
{
if (waitingForOperand)
return;
display->setText("0");
waitingForOperand = true;
}
//! [28]
//! [30]
void Calculator::clearAll()
{
sumSoFar = 0.0;
factorSoFar = 0.0;
pendingAdditiveOperator.clear();
pendingMultiplicativeOperator.clear();
display->setText("0");
waitingForOperand = true;
}
//! [30]
//! [32]
void Calculator::clearMemory()
{
sumInMemory = 0.0;
}
void Calculator::readMemory()
{
display->setText(QString::number(sumInMemory));
waitingForOperand = true;
}
void Calculator::setMemory()
{
equalClicked();
sumInMemory = display->text().toDouble();
}
void Calculator::addToMemory()
{
equalClicked();
sumInMemory += display->text().toDouble();
}
//! [32]
//! [34]
Button *Calculator::createButton(const QString &text, const char *member)
{
Button *button = new Button(text);
connect(button, SIGNAL(clicked()), this, member);
return button;
}
//! [34]
//! [36]
void Calculator::abortOperation()
{
clearAll();
display->setText("####");
}
//! [36]
//! [38]
bool Calculator::calculate(double rightOperand, const QString &pendingOperator)
{
if (pendingOperator == "+") {
sumSoFar += rightOperand;
} else if (pendingOperator == "-") {
sumSoFar -= rightOperand;
} else if (pendingOperator == "\303\227") {
factorSoFar *= rightOperand;
} else if (pendingOperator == "\303\267") {
if (rightOperand == 0.0)
return false;
factorSoFar /= rightOperand;
}
return true;
}
//! [38]

@ -0,0 +1,117 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QLineEdit;
QT_END_NAMESPACE
class Button;
//! [0]
class Calculator : public QWidget
{
Q_OBJECT
public:
Calculator(QWidget *parent = 0);
private slots:
void digitClicked();
void unaryOperatorClicked();
void additiveOperatorClicked();
void multiplicativeOperatorClicked();
void equalClicked();
void pointClicked();
void changeSignClicked();
void backspaceClicked();
void clear();
void clearAll();
void clearMemory();
void readMemory();
void setMemory();
void addToMemory();
//! [0]
//! [1]
private:
//! [1] //! [2]
Button *createButton(const QString &text, const char *member);
void abortOperation();
bool calculate(double rightOperand, const QString &pendingOperator);
//! [2]
//! [3]
double sumInMemory;
//! [3] //! [4]
double sumSoFar;
//! [4] //! [5]
double factorSoFar;
//! [5] //! [6]
QString pendingAdditiveOperator;
//! [6] //! [7]
QString pendingMultiplicativeOperator;
//! [7] //! [8]
bool waitingForOperand;
//! [8]
//! [9]
QLineEdit *display;
//! [9] //! [10]
enum { NumDigitButtons = 10 };
Button *digitButtons[NumDigitButtons];
};
//! [10]
#endif

@ -0,0 +1,11 @@
QT += widgets
HEADERS = button.h \
calculator.h
SOURCES = button.cpp \
calculator.cpp \
main.cpp
# Single Application implementation
include(../../singleapplication.pri)
DEFINES += QAPPLICATION_CLASS=QApplication

@ -0,0 +1,71 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QApplication>
#include <singleapplication.h>
#include "calculator.h"
int main(int argc, char *argv[])
{
SingleApplication app(argc, argv);
Calculator calc;
QObject::connect( &app, &SingleApplication::instanceStarted, [ &calc ]() {
calc.raise();
calc.activateWindow();
});
calc.show();
return app.exec();
}

@ -0,0 +1,20 @@
cmake_minimum_required(VERSION 3.7.0)
project(sending_arguments LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
# SingleApplication base class
set(QAPPLICATION_CLASS QCoreApplication)
add_subdirectory(../.. SingleApplication)
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED)
add_executable(${PROJECT_NAME}
main.cpp
messagereceiver.cpp
messagereceiver.h
main.cpp
)
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication)

@ -0,0 +1,28 @@
#include <singleapplication.h>
#include "messagereceiver.h"
int main(int argc, char *argv[])
{
// Allow secondary instances
SingleApplication app( argc, argv, true );
MessageReceiver msgReceiver;
// If this is a secondary instance
if( app.isSecondary() ) {
app.sendMessage( app.arguments().join(' ').toUtf8() );
qDebug() << "App already running.";
qDebug() << "Primary instance PID: " << app.primaryPid();
qDebug() << "Primary instance user: " << app.primaryUser();
return 0;
} else {
QObject::connect(
&app,
&SingleApplication::receivedMessage,
&msgReceiver,
&MessageReceiver::receivedMessage
);
}
return app.exec();
}

@ -0,0 +1,12 @@
#include <QDebug>
#include "messagereceiver.h"
MessageReceiver::MessageReceiver(QObject *parent) : QObject(parent)
{
}
void MessageReceiver::receivedMessage(int instanceId, QByteArray message)
{
qDebug() << "Received message from instance: " << instanceId;
qDebug() << "Message Text: " << message;
}

@ -0,0 +1,15 @@
#ifndef MESSAGERECEIVER_H
#define MESSAGERECEIVER_H
#include <QObject>
class MessageReceiver : public QObject
{
Q_OBJECT
public:
explicit MessageReceiver(QObject *parent = 0);
public slots:
void receivedMessage( int instanceId, QByteArray message );
};
#endif // MESSAGERECEIVER_H

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

Loading…
Cancel
Save