Merge remote-tracking branch 'nheko-im/master' into privacy_screen

This commit is contained in:
Joseph Donofry 2021-02-01 18:42:38 -05:00
commit 53c653a228
No known key found for this signature in database
GPG Key ID: E8A1D78EF044B0CB
74 changed files with 14313 additions and 8493 deletions

View File

@ -26,6 +26,7 @@ If applicable, add screenshots to help explain your problem.
### System: ### System:
- Nheko version: <!-- Get the version from the settings menu (bottom left corner) --> - Nheko version: <!-- Get the version from the settings menu (bottom left corner) -->
- Profile used: <!-- If you are not using the default profile, mention it here -->
- Installation method: <!-- AppImage, some repository, local build etc --> - Installation method: <!-- AppImage, some repository, local build etc -->
- Operating System: - Operating System:
- Qt version: <!-- If you compiled it yourself --> - Qt version: <!-- If you compiled it yourself -->

View File

@ -1,5 +1,43 @@
# Changelog # Changelog
## [0.8.1] -- 2021-01-27
### Features
- `/plain` and `/md` commands to override the current markdown setting. (contributed by lorendb)
- Allow persistent hiding of rooms with a specific tag (or from a community) via a context menu.
- Allow open media messages in an external program immediately. (contributed by rnhmjoj)
### Improvements
- Use async dbus connection for notifications. (contributed by lorendb)
- Update Hungarian translations. (contributed by maxigaz)
- Update Finnish translations. (contributed by Priit)
- Update Malayalam translations. (contributed by vachan-maker)
- Update Dutch translations. (contributed by Glael)
- Store splitter size across restarts.
- Add a border around the completer. (contributed by lorendb)
- Request keys for messages with unknown message indices (once per restart, when they are shown).
- Move the database location to XDG_DATA_DIR. (contributed by rnhmjoj)
- Reload the timeline after key backup import.
- Autoclose completer on `space`, when there are no matches.
- Make completer only react, when the mouse cursor is moved.
### Bugfixes
- Fix unhandled exception, when a device has no keys.
- Fix some cmake warnings regarding GNUInstallDirs.
- Fix tags being broken. If you have no tags showing up, you may want to logout and login again.
- Fix versionOk being called on the wrong thread. (contributed by Jedi18)
- Fix font tags showing up in media message filenames.
- Fix user profile in dark themes showing the wrong colors. (contributed by lorendb)
- Fix emoji category switching on old Qt versions. (contributed by lorendb)
- Fix old messages being replayed after a limited timeline.
- Fix empty secrets being returned from the wallet breaking verification.
- Make matrix link chat invites create a direct chat.
- Fix focus handling on room change or reply button clicks.
- Fix username completion deleting the character before it.
## [0.8.0] -- 2021-01-21 ## [0.8.0] -- 2021-01-21
### Highlights ### Highlights

View File

@ -72,15 +72,16 @@ if(${CMAKE_VERSION} VERSION_LESS "3.14.0")
endmacro() endmacro()
endif() endif()
include(GNUInstallDirs)
# Include Qt basic functions # Include Qt basic functions
include(QtCommon) include(QtCommon)
project(nheko LANGUAGES CXX C) project(nheko LANGUAGES CXX C)
include(GNUInstallDirs)
set(CPACK_PACKAGE_VERSION_MAJOR "0") set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "8") set(CPACK_PACKAGE_VERSION_MINOR "8")
set(CPACK_PACKAGE_VERSION_PATCH "0") set(CPACK_PACKAGE_VERSION_PATCH "1")
set(PROJECT_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR}) set(PROJECT_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR})
set(PROJECT_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR}) set(PROJECT_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR})
set(PROJECT_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH}) set(PROJECT_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH})
@ -260,7 +261,7 @@ set(SRC_FILES
# Emoji # Emoji
src/emoji/EmojiModel.cpp src/emoji/EmojiModel.cpp
src/emoji/Provider_new.cpp src/emoji/Provider.cpp
# Timeline # Timeline
@ -354,13 +355,13 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare( FetchContent_Declare(
MatrixClient MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
GIT_TAG v0.4.0 GIT_TAG v0.4.1
) )
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "") set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
FetchContent_MakeAvailable(MatrixClient) FetchContent_MakeAvailable(MatrixClient)
else() else()
find_package(MatrixClient 0.4.0 REQUIRED) find_package(MatrixClient 0.4.1 REQUIRED)
endif() endif()
if(USE_BUNDLED_OLM) if(USE_BUNDLED_OLM)
include(FetchContent) include(FetchContent)

View File

@ -2,7 +2,7 @@ nheko
---- ----
[![Build Status](https://nheko.im/nheko-reborn/nheko/badges/master/pipeline.svg)](https://nheko.im/nheko-reborn/nheko/-/pipelines/latest) [![Build Status](https://nheko.im/nheko-reborn/nheko/badges/master/pipeline.svg)](https://nheko.im/nheko-reborn/nheko/-/pipelines/latest)
[![Build status](https://ci.appveyor.com/api/projects/status/07qrqbfylsg4hw2h/branch/master?svg=true)](https://ci.appveyor.com/project/redsky17/nheko/branch/master) [![Build status](https://ci.appveyor.com/api/projects/status/07qrqbfylsg4hw2h/branch/master?svg=true)](https://ci.appveyor.com/project/redsky17/nheko/branch/master)
[![Stable Version](https://img.shields.io/badge/download-stable-green.svg)](https://github.com/Nheko-Reborn/nheko/releases/v0.8.0) [![Stable Version](https://img.shields.io/badge/download-stable-green.svg)](https://github.com/Nheko-Reborn/nheko/releases/v0.8.1)
[![Nightly](https://img.shields.io/badge/download-nightly-green.svg)](https://matrix-static.neko.dev/room/!TshDrgpBNBDmfDeEGN:neko.dev/) [![Nightly](https://img.shields.io/badge/download-nightly-green.svg)](https://matrix-static.neko.dev/room/!TshDrgpBNBDmfDeEGN:neko.dev/)
[![#nheko-reborn:matrix.org](https://img.shields.io/matrix/nheko-reborn:matrix.org.svg?label=%23nheko-reborn:matrix.org)](https://matrix.to/#/#nheko-reborn:matrix.org) [![#nheko-reborn:matrix.org](https://img.shields.io/matrix/nheko-reborn:matrix.org.svg?label=%23nheko-reborn:matrix.org)](https://matrix.to/#/#nheko-reborn:matrix.org)
[![AUR: nheko](https://img.shields.io/badge/AUR-nheko-blue.svg)](https://aur.archlinux.org/packages/nheko) [![AUR: nheko](https://img.shields.io/badge/AUR-nheko-blue.svg)](https://aur.archlinux.org/packages/nheko)

View File

@ -23,15 +23,15 @@ build:
install: install:
- set QT_DIR=C:\Qt\5.15\msvc2019_64 - set QT_DIR=C:\Qt\5.15\msvc2019_64
- set PATH=C:\Strawberry\perl\bin;%PATH%;%QT_DIR%\bin - set PATH=C:\Strawberry\perl\bin;C:\Python39-x64;%PATH%;%QT_DIR%\bin
- call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
build_script: build_script:
# VERSION format: branch-master/branch-1.2 # VERSION format: branch-master/branch-1.2
# INSTVERSION format: x.y.z # INSTVERSION format: x.y.z
# WINVERSION format: 9999.0.0.123/1.2.0.234 # WINVERSION format: 9999.0.0.123/1.2.0.234
- if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.8.0 - if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.8.1
- if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.8.0 - if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.8.1
- if "%APPVEYOR_REPO_TAG%"=="false" if "%APPVEYOR_REPO_BRANCH%"=="master" set INSTVERSION=9999.0 - if "%APPVEYOR_REPO_TAG%"=="false" if "%APPVEYOR_REPO_BRANCH%"=="master" set INSTVERSION=9999.0
- if "%APPVEYOR_REPO_TAG%"=="false" set WINVERSION=%INSTVERSION%.0.%APPVEYOR_BUILD_NUMBER% - if "%APPVEYOR_REPO_TAG%"=="false" set WINVERSION=%INSTVERSION%.0.%APPVEYOR_BUILD_NUMBER%
# VERSION format: v1.2.3/v1.3.4 # VERSION format: v1.2.3/v1.3.4
@ -46,7 +46,6 @@ build_script:
- echo %DATE% - echo %DATE%
# Build nheko # Build nheko
#- cmake -G "Visual Studio 15 2017 Win64" -H. -Bbuild
- cmake -G "Visual Studio 16 2019" -A x64 -H. -Bbuild - cmake -G "Visual Studio 16 2019" -A x64 -H. -Bbuild
-DHUNTER_ROOT="C:\hunter" -DHUNTER_ROOT="C:\hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF
@ -91,9 +90,9 @@ after_build:
- copy %BUILD%\deploy\installer\cleanup\package.xml installer\packages\io.github.nhekoreborn.nheko.cleanup\meta - copy %BUILD%\deploy\installer\cleanup\package.xml installer\packages\io.github.nhekoreborn.nheko.cleanup\meta
- copy %BUILD%\deploy\installer\cleanup\installscript.qs installer\packages\io.github.nhekoreborn.nheko.cleanup\meta - copy %BUILD%\deploy\installer\cleanup\installscript.qs installer\packages\io.github.nhekoreborn.nheko.cleanup\meta
# Amend version and date # Amend version and date
- sed -i "s/__VERSION__/0.8.0/" installer\config\config.xml - sed -i "s/__VERSION__/0.8.1/" installer\config\config.xml
- sed -i "s/__VERSION__/0.8.0/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml - sed -i "s/__VERSION__/0.8.1/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
- sed -i "s/__VERSION__/0.8.0/" installer\packages\io.github.nhekoreborn.nheko.cleanup\meta\package.xml - sed -i "s/__VERSION__/0.8.1/" installer\packages\io.github.nhekoreborn.nheko.cleanup\meta\package.xml
- sed -i "s/__DATE__/%DATE%/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml - sed -i "s/__DATE__/%DATE%/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
- sed -i "s/__DATE__/%DATE%/" installer\packages\io.github.nhekoreborn.nheko.cleanup\meta\package.xml - sed -i "s/__DATE__/%DATE%/" installer\packages\io.github.nhekoreborn.nheko.cleanup\meta\package.xml
# Copy nheko data # Copy nheko data

View File

@ -220,8 +220,8 @@
"name": "mtxclient", "name": "mtxclient",
"sources": [ "sources": [
{ {
"commit": "2d6e3f79917ce2065a54ca32e6a9f9d42c0b6347", "commit": "4951190c938740defa0988d98d5e861038622936",
"tag": "v0.4.0", "tag": "v0.4.1",
"type": "git", "type": "git",
"url": "https://github.com/Nheko-Reborn/mtxclient.git" "url": "https://github.com/Nheko-Reborn/mtxclient.git"
} }

File diff suppressed because it is too large Load Diff

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -606,19 +622,37 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished"> <translation type="unfinished">
@ -1266,12 +1300,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1352,6 +1386,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1464,7 +1503,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1487,7 +1526,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation> <translation>Du bist dem Raum beigetreten.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>Eingeladener Benutzer: %1</translation> <translation>Eingeladener Benutzer: %1</translation>
</message> </message>
@ -274,13 +274,18 @@
<message> <message>
<location line="+54"/> <location line="+54"/>
<source>Failed to kick %1 from %2: %3</source> <source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation> <translation>Kontte %1 nicht aus %2 entfernen: %3</translation>
</message> </message>
</context> </context>
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation>Verstecke Räume mit diesem Tag oder aus dieser Community</translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Alle Räume</translation> <translation>Alle Räume</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation> <translation>-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation>-- Verschlüsseltes Event (Schlüssel passt nicht für diesen Nachrichtenindex) --</translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation>Alle Dateien (*)</translation> <translation>Alle Dateien (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation> <translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation>
</message> </message>
@ -599,7 +610,12 @@ Wenn Nheko deinen Server nicht automatisch erkennen kann, wird es dich nach dem
<translation>Passwort</translation> <translation>Passwort</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation>Dein Passwort.</translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Gerätename</translation> <translation>Gerätename</translation>
</message> </message>
@ -609,7 +625,17 @@ Wenn Nheko deinen Server nicht automatisch erkennen kann, wird es dich nach dem
<translation>Ein Name für dieses Gerät. Dieser wird der anderen Seite gezeigt, wenn das Gerät verifiziert wird. Wenn nichts angeben wird, wird einer generiert.</translation> <translation>Ein Name für dieses Gerät. Dieser wird der anderen Seite gezeigt, wenn das Gerät verifiziert wird. Wenn nichts angeben wird, wird einer generiert.</translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation>Heimserveradresse</translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation>dein.server:8787</translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation>Die Adresse unter der dein Heimserver erreichbar ist. <translation>Die Adresse unter der dein Heimserver erreichbar ist.
@ -617,12 +643,20 @@ Beispiel: https://mein.server:8787</translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>ANMELDEN</translation> <translation>ANMELDEN</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<location line="+157"/>
<location line="+11"/>
<source>You have entered an invalid Matrix ID e.g @joe:matrix.org</source>
<translation>Du hast eine invalide Matrix ID eingegeben. Normalerwise sehen die so aus: @joe:matrix.org</translation>
</message>
<message>
<location line="-132"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Automatische Erkennung fehlgeschlagen. Antwort war fehlerhaft.</translation> <translation>Automatische Erkennung fehlgeschlagen. Antwort war fehlerhaft.</translation>
</message> </message>
@ -767,7 +801,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Schreibe eine Nachricht</translation> <translation>Schreibe eine Nachricht</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation>Emoji</translation> <translation>Emoji</translation>
</message> </message>
@ -874,7 +908,7 @@ Beispiel: https://mein.server:8787</translation>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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>Benutze ein separates profil, wodurch mehrere Accounts und Nhekoinstanzen zur gleichen Zeit verwendet werden können.</translation> <translation>Benutze ein separates profil, wodurch mehrere Accounts und Nhekoinstanzen zur gleichen Zeit verwendet werden können.</translation>
</message> </message>
@ -977,7 +1011,7 @@ Beispiel: https://mein.server:8787</translation>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>keine Version gespeichert</translation> <translation>keine Version gespeichert</translation>
</message> </message>
@ -1019,7 +1053,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Fügt einen Tag hinzu oder entfernt ihn.</translation> <translation>Fügt einen Tag hinzu oder entfernt ihn.</translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation>Neuer Tag...</translation> <translation>Neuer Tag...</translation>
@ -1119,7 +1153,7 @@ Beispiel: https://mein.server:8787</translation>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Nachricht zurückziehen fehlgeschlagen: %1</translation> <translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
</message> </message>
@ -1130,7 +1164,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Event konnte nicht verschlüsselt werden, senden wurde abgebrochen!</translation> <translation>Event konnte nicht verschlüsselt werden, senden wurde abgebrochen!</translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Bild speichern</translation> <translation>Bild speichern</translation>
</message> </message>
@ -1150,7 +1184,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Datei speichern</translation> <translation>Datei speichern</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1269,12 +1303,12 @@ Beispiel: https://mein.server:8787</translation>
<translation>%1 hat das Anklopfen zurückgezogen.</translation> <translation>%1 hat das Anklopfen zurückgezogen.</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation> <translation>Du bist dem Raum beigetreten.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>Hat das Anklopfen von %1 abgewiesen.</translation> <translation>Hat das Anklopfen von %1 abgewiesen.</translation>
</message> </message>
@ -1355,6 +1389,11 @@ Beispiel: https://mein.server:8787</translation>
<source>Save as</source> <source>Save as</source>
<translation>Speichern unter...</translation> <translation>Speichern unter...</translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Öffne in externen Programm</translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1467,7 +1506,7 @@ Beispiel: https://mein.server:8787</translation>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation>Verifizieren</translation> <translation>Verifizieren</translation>
</message> </message>
@ -1490,7 +1529,7 @@ Beispiel: https://mein.server:8787</translation>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Ins Benachrichtigungsfeld minimieren</translation> <translation>Ins Benachrichtigungsfeld minimieren</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Όλα τα αρχεία (*)</translation> <translation type="unfinished">Όλα τα αρχεία (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Κωδικός</translation> <translation>Κωδικός</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -606,19 +622,37 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>ΕΙΣΟΔΟΣ</translation> <translation>ΕΙΣΟΔΟΣ</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Γράψε ένα μήνυμα...</translation> <translation type="unfinished">Γράψε ένα μήνυμα...</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation type="unfinished">Αποθήκευση Εικόνας</translation> <translation type="unfinished">Αποθήκευση Εικόνας</translation>
</message> </message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished"> <translation type="unfinished">
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Ελαχιστοποίηση</translation> <translation>Ελαχιστοποίηση</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>You joined this room.</translation> <translation>You joined this room.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>Invited user: %1</translation> <translation>Invited user: %1</translation>
</message> </message>
@ -274,13 +274,18 @@
<message> <message>
<location line="+54"/> <location line="+54"/>
<source>Failed to kick %1 from %2: %3</source> <source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation> <translation>Failed to kick %1 from %2: %3</translation>
</message> </message>
</context> </context>
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation>Hide rooms with this tag or from this community</translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>All rooms</translation> <translation>All rooms</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <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> <translation>-- Encrypted Event (No keys found for decryption) --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation>-- Encrypted Event (Key not valid for this index) --</translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation>All Files (*)</translation> <translation>All Files (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation>Failed to upload media. Please try again.</translation> <translation>Failed to upload media. Please try again.</translation>
</message> </message>
@ -599,7 +610,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Password</translation> <translation>Password</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation>Your password.</translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Device name</translation> <translation>Device name</translation>
</message> </message>
@ -609,7 +625,17 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>A name for this device, which will be shown to others, when verifying your devices. If none is provided a default is used.</translation> <translation>A name for this device, which will be shown to others, when verifying your devices. If none is provided a default is used.</translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation>Homeserver address</translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation>server.my:8787</translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation>The address that can be used to contact you homeservers client API. <translation>The address that can be used to contact you homeservers client API.
@ -617,12 +643,20 @@ Example: https://server.my:8787</translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>LOGIN</translation> <translation>LOGIN</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Autodiscovery failed. Received malformed response.</translation> <translation>Autodiscovery failed. Received malformed response.</translation>
</message> </message>
@ -767,7 +801,7 @@ Example: https://server.my:8787</translation>
<translation>Write a message</translation> <translation>Write a message</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation>Emoji</translation> <translation>Emoji</translation>
</message> </message>
@ -874,7 +908,7 @@ Example: https://server.my:8787</translation>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <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> </message>
@ -977,7 +1011,7 @@ Example: https://server.my:8787</translation>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>no version stored</translation> <translation>no version stored</translation>
</message> </message>
@ -1019,7 +1053,7 @@ Example: https://server.my:8787</translation>
<translation>Adds or removes the specified tag.</translation> <translation>Adds or removes the specified tag.</translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation>New tag</translation> <translation>New tag</translation>
@ -1119,7 +1153,7 @@ Example: https://server.my:8787</translation>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Message redaction failed: %1</translation> <translation>Message redaction failed: %1</translation>
</message> </message>
@ -1130,7 +1164,7 @@ Example: https://server.my:8787</translation>
<translation>Failed to encrypt event, sending aborted!</translation> <translation>Failed to encrypt event, sending aborted!</translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Save image</translation> <translation>Save image</translation>
</message> </message>
@ -1150,7 +1184,7 @@ Example: https://server.my:8787</translation>
<translation>Save file</translation> <translation>Save file</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1269,12 +1303,12 @@ Example: https://server.my:8787</translation>
<translation>%1 redacted their knock.</translation> <translation>%1 redacted their knock.</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>You joined this room.</translation> <translation>You joined this room.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>Rejected the knock from %1.</translation> <translation>Rejected the knock from %1.</translation>
</message> </message>
@ -1355,6 +1389,11 @@ Example: https://server.my:8787</translation>
<source>Save as</source> <source>Save as</source>
<translation>Save as</translation> <translation>Save as</translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Open in external program</translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1467,7 +1506,7 @@ Example: https://server.my:8787</translation>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation>Verify</translation> <translation>Verify</translation>
</message> </message>
@ -1490,7 +1529,7 @@ Example: https://server.my:8787</translation>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Minimize to tray</translation> <translation>Minimize to tray</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Vi aliĝis ĉi tiun ĉambron.</translation> <translation>Vi aliĝis ĉi tiun ĉambron.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -281,7 +281,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Ĉiuj ĉambroj</translation> <translation>Ĉiuj ĉambroj</translation>
</message> </message>
@ -475,11 +480,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -558,7 +569,7 @@
<translation type="unfinished">Ĉiuj dosieroj (*)</translation> <translation type="unfinished">Ĉiuj dosieroj (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -597,7 +608,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished">Pasvorto</translation> <translation type="unfinished">Pasvorto</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Aparata nomo</translation> <translation>Aparata nomo</translation>
</message> </message>
@ -608,7 +624,17 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Nomo por ĉi tiu aparato, montrot al aliaj, kiam kontrolant viajn aparatojn. Se neniom provizitis, defaŭlto uzit.</translation> <translation>Nomo por ĉi tiu aparato, montrot al aliaj, kiam kontrolant viajn aparatojn. Se neniom provizitis, defaŭlto uzit.</translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translatorcomment>API should be valid for the EO translation of application programming interface.</translatorcomment> <translatorcomment>API should be valid for the EO translation of application programming interface.</translatorcomment>
@ -617,13 +643,21 @@ Ekzemplo: https://servisto.mia:8787</translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translatorcomment>Maybe shouldn&apos;t be imperative?</translatorcomment> <translatorcomment>Maybe shouldn&apos;t be imperative?</translatorcomment>
<translation>ENSALUTU</translation> <translation>ENSALUTU</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -768,7 +802,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished">Skribu mesaĝon...</translation> <translation type="unfinished">Skribu mesaĝon...</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -875,7 +909,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -978,7 +1012,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1020,7 +1054,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation>Nova etikedo...</translation> <translation>Nova etikedo...</translation>
@ -1122,7 +1156,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1133,7 +1167,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1153,7 +1187,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1274,12 +1308,12 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Vi aliĝis ĉi tiun ĉambron.</translation> <translation>Vi aliĝis ĉi tiun ĉambron.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1360,6 +1394,11 @@ Ekzemplo: https://servisto.mia:8787</translation>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1472,7 +1511,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1495,7 +1534,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Sa liitusid selle jututoaga.</translation> <translation>Sa liitusid selle jututoaga.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>Kutsutud kasutaja: %1</translation> <translation>Kutsutud kasutaja: %1</translation>
</message> </message>
@ -274,13 +274,18 @@
<message> <message>
<location line="+54"/> <location line="+54"/>
<source>Failed to kick %1 from %2: %3</source> <source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation> <translation>Kasutaja %1 väljamüksamine %2 jututoast ei õnnestunud: %3</translation>
</message> </message>
</context> </context>
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation>Peida sellest kogukonnast antud sildiga jututoad</translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Kõik jututoad</translation> <translation>Kõik jututoad</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <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> <translation>-- Krüptitud sündmus (Dekrüptimisvõtmeid ei leidunud) --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation>-- Krüptitud sündmus (võti pole selle indeksi jaoks sobilik) --</translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation>Kõik failid (*)</translation> <translation>Kõik failid (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation> <translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation>
</message> </message>
@ -599,7 +610,12 @@ Kui Nheko ei suuda tuvastada sinu koduserverit, siis ta kuvab sulle andmevälja
<translation>Salasõna</translation> <translation>Salasõna</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation>Sinu salasõna.</translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Seadme nimi</translation> <translation>Seadme nimi</translation>
</message> </message>
@ -609,7 +625,17 @@ Kui Nheko ei suuda tuvastada sinu koduserverit, siis ta kuvab sulle andmevälja
<translation>Selle seadme nimi, mida näidetakse verifitseerimise ajal teisele kasutajatele. Kui sa ise nime ei pane, siis kasutame automaatselt pandud nime.</translation> <translation>Selle seadme nimi, mida näidetakse verifitseerimise ajal teisele kasutajatele. Kui sa ise nime ei pane, siis kasutame automaatselt pandud nime.</translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation>Koduserveri aadress</translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation>server.minu:8787</translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation>Aadress, mida sinu koduserveri kliendipoole API kasutab. <translation>Aadress, mida sinu koduserveri kliendipoole API kasutab.
@ -617,12 +643,20 @@ Näiteks: https://server.minu:8787</translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>LOGI SISSE</translation> <translation>LOGI SISSE</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Koduserveri automaatne tuvastamine ei õnnestunud: päringuvastus oli vigane.</translation> <translation>Koduserveri automaatne tuvastamine ei õnnestunud: päringuvastus oli vigane.</translation>
</message> </message>
@ -767,7 +801,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Kirjuta sõnum</translation> <translation>Kirjuta sõnum</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation>Emoji</translation> <translation>Emoji</translation>
</message> </message>
@ -874,7 +908,7 @@ Näiteks: https://server.minu:8787</translation>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation>Loo unikaalne profiil, mis võimaldab sul logida samaaegselt sisse erinevatele kasutajakontodele ning käivitada mitu Nheko programmiakent.</translation>
</message> </message>
@ -977,7 +1011,7 @@ Näiteks: https://server.minu:8787</translation>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>salvestatud versiooni ei leidu</translation> <translation>salvestatud versiooni ei leidu</translation>
</message> </message>
@ -1019,7 +1053,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Lisab või eemaldab selle sildi.</translation> <translation>Lisab või eemaldab selle sildi.</translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation>Uus silt</translation> <translation>Uus silt</translation>
@ -1119,7 +1153,7 @@ Näiteks: https://server.minu:8787</translation>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation> <translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation>
</message> </message>
@ -1130,7 +1164,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Sündmuse krüptimine ei õnnestunud, katkestame saatmise!</translation> <translation>Sündmuse krüptimine ei õnnestunud, katkestame saatmise!</translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Salvesta pilt</translation> <translation>Salvesta pilt</translation>
</message> </message>
@ -1150,7 +1184,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Salvesta fail</translation> <translation>Salvesta fail</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1269,12 +1303,12 @@ Näiteks: https://server.minu:8787</translation>
<translation>%1 muutis oma koputust jututoa uksele.</translation> <translation>%1 muutis oma koputust jututoa uksele.</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Sa liitusid jututoaga.</translation> <translation>Sa liitusid jututoaga.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>Lükkas tagasi %1 koputuse jututoa uksele.</translation> <translation>Lükkas tagasi %1 koputuse jututoa uksele.</translation>
</message> </message>
@ -1355,6 +1389,11 @@ Näiteks: https://server.minu:8787</translation>
<source>Save as</source> <source>Save as</source>
<translation>Salvesta kui</translation> <translation>Salvesta kui</translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Ava välise rakendusega</translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1467,7 +1506,7 @@ Näiteks: https://server.minu:8787</translation>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation>Verifitseeri</translation> <translation>Verifitseeri</translation>
</message> </message>
@ -1490,7 +1529,7 @@ Näiteks: https://server.minu:8787</translation>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Vähenda tegumiribale</translation> <translation>Vähenda tegumiribale</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -94,7 +94,7 @@
<message> <message>
<location line="+11"/> <location line="+11"/>
<source>Accept</source> <source>Accept</source>
<translation type="unfinished">Hyväksy</translation> <translation>Hyväksy</translation>
</message> </message>
<message> <message>
<location line="+12"/> <location line="+12"/>
@ -109,7 +109,7 @@
<message> <message>
<location line="+13"/> <location line="+13"/>
<source>Decline</source> <source>Decline</source>
<translation type="unfinished">Hylkää</translation> <translation>Hylkää</translation>
</message> </message>
<message> <message>
<location line="-28"/> <location line="-28"/>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Kaikki huoneet</translation> <translation>Kaikki huoneet</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation> <translation>-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -554,10 +565,10 @@
<message> <message>
<location line="+0"/> <location line="+0"/>
<source>All Files (*)</source> <source>All Files (*)</source>
<translation type="unfinished">Kaikki Tiedostot (*)</translation> <translation>Kaikki Tiedostot (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Salasana</translation> <translation>Salasana</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Laitteen nimi</translation> <translation>Laitteen nimi</translation>
</message> </message>
@ -606,19 +622,37 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>KIRJAUDU</translation> <translation>KIRJAUDU</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Palvelimen tietojen hakeminen epäonnistui: virheellinen vastaus.</translation> <translation>Palvelimen tietojen hakeminen epäonnistui: virheellinen vastaus.</translation>
</message> </message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation>Kirjoita viesti</translation> <translation>Kirjoita viesti</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished">Emoji</translation> <translation type="unfinished">Emoji</translation>
</message> </message>
@ -856,7 +890,7 @@ Example: https://server.my:8787</source>
<message> <message>
<location line="+13"/> <location line="+13"/>
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Peruuta</translation> <translation>Peruuta</translation>
</message> </message>
</context> </context>
<context> <context>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>ei tallennettua versiota</translation> <translation>ei tallennettua versiota</translation>
</message> </message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Viestin muokkaus epäonnistui: %1</translation> <translation>Viestin muokkaus epäonnistui: %1</translation>
</message> </message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Tallenna kuva</translation> <translation>Tallenna kuva</translation>
</message> </message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Pienennä ilmoitusalueelle</translation> <translation>Pienennä ilmoitusalueelle</translation>
</message> </message>
@ -1856,7 +1895,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message> <message>
<location line="+0"/> <location line="+0"/>
<source>All Files (*)</source> <source>All Files (*)</source>
<translation type="unfinished">Kaikki Tiedostot (*)</translation> <translation>Kaikki Tiedostot (*)</translation>
</message> </message>
<message> <message>
<location line="+225"/> <location line="+225"/>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation> <translation>Vous avez rejoint ce salon.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>%1 a é invité(e)</translation> <translation>%1 a é invité(e)</translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Tous les salons</translation> <translation>Tous les salons</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <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> <translation>-- Évènement chiffré (pas de clé trouvée pour le déchiffrement) --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation>Tous les types de fichiers (*)</translation> <translation>Tous les types de fichiers (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation>Échec de l&apos;envoi du média. Veuillez réessayer.</translation> <translation>Échec de l&apos;envoi du média. Veuillez réessayer.</translation>
</message> </message>
@ -599,7 +610,12 @@ Si Nheko n&apos;arrive pas à trouver votre serveur, il vous proposera de l&apos
<translation>Mot de passe</translation> <translation>Mot de passe</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Nom de l&apos;appareil</translation> <translation>Nom de l&apos;appareil</translation>
</message> </message>
@ -609,7 +625,17 @@ Si Nheko n&apos;arrive pas à trouver votre serveur, il vous proposera de l&apos
<translation>Un nom pour cet appareil, qui sera montré aux autres utilisateurs lorsque ceux-ci le vérifieront. Si aucun n&apos;est fourni, un nom par défaut est utilisé.</translation> <translation>Un nom pour cet appareil, qui sera montré aux autres utilisateurs lorsque ceux-ci le vérifieront. Si aucun n&apos;est fourni, un nom par défaut est utilisé.</translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation>L&apos;adresse qui peut être utilisée pour joindre l&apos;API client de votre serveur. <translation>L&apos;adresse qui peut être utilisée pour joindre l&apos;API client de votre serveur.
@ -617,12 +643,20 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>CONNEXION</translation> <translation>CONNEXION</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Échec de la découverte automatique. Réponse mal formatée reçue.</translation> <translation>Échec de la découverte automatique. Réponse mal formatée reçue.</translation>
</message> </message>
@ -767,7 +801,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Écrivez un message</translation> <translation>Écrivez un message</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation>Émoji</translation> <translation>Émoji</translation>
</message> </message>
@ -874,7 +908,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation>Créer un profil unique, vous permettant de vous connecter simultanément à plusieurs comptes et à lancer plusieurs instances de nheko.</translation>
</message> </message>
@ -977,7 +1011,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>pas de version enregistrée</translation> <translation>pas de version enregistrée</translation>
</message> </message>
@ -1019,7 +1053,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Ajoute ou retire l&apos;étiquette spécifiée.</translation> <translation>Ajoute ou retire l&apos;étiquette spécifiée.</translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation>Nouvelle étiquette</translation> <translation>Nouvelle étiquette</translation>
@ -1119,7 +1153,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Échec de la suppression du message&#xa0;: %1</translation> <translation>Échec de la suppression du message&#xa0;: %1</translation>
</message> </message>
@ -1130,7 +1164,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Échec du chiffrement de l&apos;évènement, envoi abandonné&#x202f;!</translation> <translation>Échec du chiffrement de l&apos;évènement, envoi abandonné&#x202f;!</translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Enregistrer l&apos;image</translation> <translation>Enregistrer l&apos;image</translation>
</message> </message>
@ -1150,7 +1184,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Enregistrer le fichier</translation> <translation>Enregistrer le fichier</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1269,12 +1303,12 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>%1 ne frappe plus au salon.</translation> <translation>%1 ne frappe plus au salon.</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation> <translation>Vous avez rejoint ce salon.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>%1 a é rejeté après avoir frappé au salon.</translation> <translation>%1 a é rejeté après avoir frappé au salon.</translation>
</message> </message>
@ -1355,6 +1389,11 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<source>Save as</source> <source>Save as</source>
<translation>Enregistrer sous</translation> <translation>Enregistrer sous</translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1467,7 +1506,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation>Vérifier</translation> <translation>Vérifier</translation>
</message> </message>
@ -1490,7 +1529,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Réduire à la barre des tâches</translation> <translation>Réduire à la barre des tâches</translation>
</message> </message>

File diff suppressed because it is too large Load Diff

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation> <translation>Sei entrato in questa stanza.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>Invitato utente: %1</translation> <translation>Invitato utente: %1</translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Tutte le stanze</translation> <translation>Tutte le stanze</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- Evento Criptato (Chiavi per la decriptazione non trovate) --</translation> <translation type="unfinished">-- Evento Criptato (Chiavi per la decriptazione non trovate) --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Tutti i File (*)</translation> <translation type="unfinished">Tutti i File (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished">Impossibile inviare il file multimediale. Per favore riprova.</translation> <translation type="unfinished">Impossibile inviare il file multimediale. Per favore riprova.</translation>
</message> </message>
@ -599,7 +610,12 @@ Se Nheko non conclude la ricerca del tuo homeserver, ti mostrerà un campo in cu
<translation>Password</translation> <translation>Password</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Nome del dispositivo</translation> <translation>Nome del dispositivo</translation>
</message> </message>
@ -609,7 +625,17 @@ Se Nheko non conclude la ricerca del tuo homeserver, ti mostrerà un campo in cu
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation>L&apos;indirizzo che può essere usato per contattare le API client del tuo homeserver. <translation>L&apos;indirizzo che può essere usato per contattare le API client del tuo homeserver.
@ -617,12 +643,20 @@ Esempio: https://server.mio:8787</translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>ACCEDI</translation> <translation>ACCEDI</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Ricerca automatica fallita. Ricevuta risposta malformata.</translation> <translation>Ricerca automatica fallita. Ricevuta risposta malformata.</translation>
</message> </message>
@ -767,7 +801,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished">Scrivi un messaggio</translation> <translation type="unfinished">Scrivi un messaggio</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished">Emoji</translation> <translation type="unfinished">Emoji</translation>
</message> </message>
@ -874,7 +908,7 @@ Esempio: https://server.mio:8787</translation>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -977,7 +1011,7 @@ Esempio: https://server.mio:8787</translation>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>nessuna versione memorizzata</translation> <translation>nessuna versione memorizzata</translation>
</message> </message>
@ -1019,7 +1053,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished">Aggiungi o rimuovi il tag specificato.</translation> <translation type="unfinished">Aggiungi o rimuovi il tag specificato.</translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1119,7 +1153,7 @@ Esempio: https://server.mio:8787</translation>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Oscuramento del messaggio fallito: %1</translation> <translation>Oscuramento del messaggio fallito: %1</translation>
</message> </message>
@ -1130,7 +1164,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Salva immagine</translation> <translation>Salva immagine</translation>
</message> </message>
@ -1150,7 +1184,7 @@ Esempio: https://server.mio:8787</translation>
<translation>Salva file</translation> <translation>Salva file</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1269,12 +1303,12 @@ Esempio: https://server.mio:8787</translation>
<translation>%1 ha oscurato la sua bussata.</translation> <translation>%1 ha oscurato la sua bussata.</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation> <translation>Sei entrato in questa stanza.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>Rifiutata la bussata di %1.</translation> <translation>Rifiutata la bussata di %1.</translation>
</message> </message>
@ -1355,6 +1389,11 @@ Esempio: https://server.mio:8787</translation>
<source>Save as</source> <source>Save as</source>
<translation>Salva come</translation> <translation>Salva come</translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1467,7 +1506,7 @@ Esempio: https://server.mio:8787</translation>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1490,7 +1529,7 @@ Esempio: https://server.mio:8787</translation>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Minimizza nella tray</translation> <translation>Minimizza nella tray</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>: %1</translation> <translation>: %1</translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation></translation> <translation></translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- () --</translation> <translation type="unfinished">-- () --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished"> (*)</translation> <translation type="unfinished"> (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation></translation> <translation></translation>
</message> </message>
@ -606,19 +622,37 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">...</translation> <translation type="unfinished">...</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation></translation> <translation></translation>
</message> </message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>: %1</translation> <translation>: %1</translation>
</message> </message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation></translation> <translation></translation>
</message> </message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation></translation> <translation></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1264,12 +1298,12 @@ Example: https://server.my:8787</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
@ -1350,6 +1384,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1462,7 +1501,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1485,7 +1524,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation></translation> <translation></translation>
</message> </message>

2452
resources/langs/nheko_ml.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -51,9 +51,9 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation>Je bent lid geworden van deze kamer.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -122,13 +122,13 @@
<message> <message>
<location filename="../../src/ChatPage.cpp" line="+211"/> <location filename="../../src/ChatPage.cpp" line="+211"/>
<source>Failed to invite user: %1</source> <source>Failed to invite user: %1</source>
<translation type="unfinished"></translation> <translation>Gebruiker uitnodigen mislukt: %1</translation>
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation type="unfinished"></translation> <translation>Gebruiker uitgenodigd: %1</translation>
</message> </message>
<message> <message>
<location line="-500"/> <location line="-500"/>
@ -138,7 +138,7 @@
<message> <message>
<location line="+456"/> <location line="+456"/>
<source>Room %1 created.</source> <source>Room %1 created.</source>
<translation type="unfinished"></translation> <translation>Kamer %1 gecreëerd.</translation>
</message> </message>
<message> <message>
<location line="+27"/> <location line="+27"/>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Alle bestanden (*)</translation> <translation type="unfinished">Alle bestanden (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Wachtwoord</translation> <translation>Wachtwoord</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -606,19 +622,37 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>INLOGGEN</translation> <translation>INLOGGEN</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Typ een bericht...</translation> <translation type="unfinished">Typ een bericht...</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation type="unfinished">Afbeelding opslaan</translation> <translation type="unfinished">Afbeelding opslaan</translation>
</message> </message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished"> <translation type="unfinished">
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished">Je bent lid geworden van deze kamer.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Minimaliseren naar systeemvak</translation> <translation>Minimaliseren naar systeemvak</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Dołączyłeś(-ł) do tego pokoju.</translation> <translation>Dołączyłeś(-ł) do tego pokoju.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Wszystkie pokoje</translation> <translation>Wszystkie pokoje</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <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> <translation>-- Zdarzenie szyfrowania (Nie znaleziono kluczy deszyfrujących)</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Wszystkie pliki (*)</translation> <translation type="unfinished">Wszystkie pliki (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -598,7 +609,12 @@ Jeżeli Nheko nie odnajdzie Twojego serwera domowego, wyświetli formularz umoż
<translation>Hasło</translation> <translation>Hasło</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Nazwa urządzenia</translation> <translation>Nazwa urządzenia</translation>
</message> </message>
@ -608,19 +624,37 @@ Jeżeli Nheko nie odnajdzie Twojego serwera domowego, wyświetli formularz umoż
<translation>Nazwa dla tego urządzenia, będzie ona widoczna dla innych użytkowników, kiedy będą weryfikować Twoje urządzenia. Jeżeli żadna nie jest podana, używana jest domyślna.</translation> <translation>Nazwa dla tego urządzenia, będzie ona widoczna dla innych użytkowników, kiedy będą weryfikować Twoje urządzenia. Jeżeli żadna nie jest podana, używana jest domyślna.</translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>ZALOGUJ</translation> <translation>ZALOGUJ</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Automatyczne odkrywanie zakończone niepowodzeniem. Otrzymano nieprawidłową odpowiedź.</translation> <translation>Automatyczne odkrywanie zakończone niepowodzeniem. Otrzymano nieprawidłową odpowiedź.</translation>
</message> </message>
@ -765,7 +799,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Napisz wiadomość</translation> <translation type="unfinished">Napisz wiadomość</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished">Emoji</translation> <translation type="unfinished">Emoji</translation>
</message> </message>
@ -872,7 +906,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation>Stwórz unikalny profil, który pozwoli Ci na zalogowanie się do kilku kont jednocześnie i uruchomienie wielu instancji Nheko.</translation>
</message> </message>
@ -975,7 +1009,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1017,7 +1051,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1117,7 +1151,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation> <translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
</message> </message>
@ -1128,7 +1162,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation type="unfinished">Zapisz obraz</translation> <translation type="unfinished">Zapisz obraz</translation>
</message> </message>
@ -1148,7 +1182,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished"> <translation type="unfinished">
@ -1268,12 +1302,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished">Dołączyłeś(-ł) do tego pokoju.</translation> <translation type="unfinished">Dołączyłeś(-ł) do tego pokoju.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1354,6 +1388,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1466,7 +1505,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1489,7 +1528,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Zminimalizuj do paska zadań</translation> <translation>Zminimalizuj do paska zadań</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -606,19 +622,37 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished"> <translation type="unfinished">
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Te-ai alăturat camerei.</translation> <translation>Te-ai alăturat camerei.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>Utilizator invitat: %1</translation> <translation>Utilizator invitat: %1</translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Toate camerele</translation> <translation>Toate camerele</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Toate fișierele (*)</translation> <translation type="unfinished">Toate fișierele (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -599,7 +610,12 @@ Dacă Nheko nu vă poate găsi homeserverul, vă va arăta un câmp pentru intro
<translation>Parolă</translation> <translation>Parolă</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Nume dispozitiv</translation> <translation>Nume dispozitiv</translation>
</message> </message>
@ -609,7 +625,17 @@ Dacă Nheko nu vă poate găsi homeserverul, vă va arăta un câmp pentru intro
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation>Adresa la care se poate contacta APIul homeserverului dumneavoastră. <translation>Adresa la care se poate contacta APIul homeserverului dumneavoastră.
@ -617,12 +643,20 @@ Exemplu: https://serverul.meu:8787</translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>CONECTARE</translation> <translation>CONECTARE</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Autodescoperirea a eșuat. Răspunsul primit este defectuos.</translation> <translation>Autodescoperirea a eșuat. Răspunsul primit este defectuos.</translation>
</message> </message>
@ -767,7 +801,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -874,7 +908,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -977,7 +1011,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>nicio versiune stocată</translation> <translation>nicio versiune stocată</translation>
</message> </message>
@ -1019,7 +1053,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1119,7 +1153,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Redactare mesaj eșuată: %1</translation> <translation>Redactare mesaj eșuată: %1</translation>
</message> </message>
@ -1130,7 +1164,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Salvați imaginea</translation> <translation>Salvați imaginea</translation>
</message> </message>
@ -1150,7 +1184,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Salvați fișier</translation> <translation>Salvați fișier</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1270,12 +1304,12 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>%1 și-a redactat ciocănitul.</translation> <translation>%1 și-a redactat ciocănitul.</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Te-ai alăturat camerei.</translation> <translation>Te-ai alăturat camerei.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>Ciocănit refuzat de la %1.</translation> <translation>Ciocănit refuzat de la %1.</translation>
</message> </message>
@ -1356,6 +1390,11 @@ Exemplu: https://serverul.meu:8787</translation>
<source>Save as</source> <source>Save as</source>
<translation>Salvare ca</translation> <translation>Salvare ca</translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1468,7 +1507,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1491,7 +1530,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Minimizează în bara de notificări</translation> <translation>Minimizează în bara de notificări</translation>
</message> </message>

View File

@ -6,18 +6,18 @@
<message> <message>
<location filename="../qml/voip/ActiveCallBar.qml" line="+66"/> <location filename="../qml/voip/ActiveCallBar.qml" line="+66"/>
<source>Calling...</source> <source>Calling...</source>
<translation type="unfinished"></translation> <translation>Вызов...</translation>
</message> </message>
<message> <message>
<location line="+10"/> <location line="+10"/>
<location line="+10"/> <location line="+10"/>
<source>Connecting...</source> <source>Connecting...</source>
<translation type="unfinished"></translation> <translation>Соединение...</translation>
</message> </message>
<message> <message>
<location line="+76"/> <location line="+76"/>
<source>Toggle camera view</source> <source>Toggle camera view</source>
<translation type="unfinished"></translation> <translation>Сменить вид камеры</translation>
</message> </message>
<message> <message>
<location line="+13"/> <location line="+13"/>
@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Вы присоединились к этой комнате.</translation> <translation>Вы присоединились к этой комнате.</translation>
</message> </message>
@ -61,17 +61,17 @@
<message> <message>
<location filename="../qml/voip/CallInvite.qml" line="+66"/> <location filename="../qml/voip/CallInvite.qml" line="+66"/>
<source>Video Call</source> <source>Video Call</source>
<translation type="unfinished">Видео Звонок</translation> <translation>Видео Звонок</translation>
</message> </message>
<message> <message>
<location line="+0"/> <location line="+0"/>
<source>Voice Call</source> <source>Voice Call</source>
<translation type="unfinished">Голосовой Звонок</translation> <translation>Голосовой Звонок</translation>
</message> </message>
<message> <message>
<location line="+62"/> <location line="+62"/>
<source>No microphone found.</source> <source>No microphone found.</source>
<translation type="unfinished">Микрофон не найден.</translation> <translation>Микрофон не найден.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>Приглашенный пользователь: %1</translation> <translation>Приглашенный пользователь: %1</translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Все комнаты</translation> <translation>Все комнаты</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Зашифрованное событие (Нет найдено ключей для дешифрования) --</translation> <translation>-- Зашифрованное событие (Нет найдено ключей для дешифрования) --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation>Все файлы (*)</translation> <translation>Все файлы (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation>Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation> <translation>Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation>
</message> </message>
@ -599,7 +610,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Пароль</translation> <translation>Пароль</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Имя устройства</translation> <translation>Имя устройства</translation>
</message> </message>
@ -609,7 +625,17 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Имя устройства, которое будет отображаться для других, когда верифицируют ваше устройство. Если не предоставить имя устройста,то будет использоваться имя по умолчанию.</translation> <translation>Имя устройства, которое будет отображаться для других, когда верифицируют ваше устройство. Если не предоставить имя устройста,то будет использоваться имя по умолчанию.</translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation>Адрес который будет использоваться для связи клиентского API вашего домашнего сервера. <translation>Адрес который будет использоваться для связи клиентского API вашего домашнего сервера.
@ -617,12 +643,20 @@ Example: https://server.my:8787</source>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>ВОЙТИ</translation> <translation>ВОЙТИ</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Автообноружение не удалось. Получен поврежденный ответ.</translation> <translation>Автообноружение не удалось. Получен поврежденный ответ.</translation>
</message> </message>
@ -767,7 +801,7 @@ Example: https://server.my:8787</source>
<translation>Написать сообщение</translation> <translation>Написать сообщение</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation>Эмоджи</translation> <translation>Эмоджи</translation>
</message> </message>
@ -874,7 +908,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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>Создать уникальный профиль, который позволяет вести несколько аккаунтов и запускать множество сущностей nheko. </translation> <translation>Создать уникальный профиль, который позволяет вести несколько аккаунтов и запускать множество сущностей nheko. </translation>
</message> </message>
@ -977,7 +1011,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>нет сохраненной версии</translation> <translation>нет сохраненной версии</translation>
</message> </message>
@ -1019,7 +1053,7 @@ Example: https://server.my:8787</source>
<translation>Добавить или удалить выбранные тэг.</translation> <translation>Добавить или удалить выбранные тэг.</translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation>Добавить новый тег для комнаты</translation> <translation>Добавить новый тег для комнаты</translation>
@ -1119,7 +1153,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Ошибка редактирования сообщения: %1</translation> <translation>Ошибка редактирования сообщения: %1</translation>
</message> </message>
@ -1130,7 +1164,7 @@ Example: https://server.my:8787</source>
<translation>Не удалось зашифровать сообщение, отправка отменена!</translation> <translation>Не удалось зашифровать сообщение, отправка отменена!</translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Сохранить изображение</translation> <translation>Сохранить изображение</translation>
</message> </message>
@ -1150,7 +1184,7 @@ Example: https://server.my:8787</source>
<translation>Сохранить файл</translation> <translation>Сохранить файл</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1270,12 +1304,12 @@ Example: https://server.my:8787</source>
<translation>%1 отредактировал его &quot;стук&quot;.</translation> <translation>%1 отредактировал его &quot;стук&quot;.</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Вы присоединились к этой комнате.</translation> <translation>Вы присоединились к этой комнате.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>Отверг &quot;стук&quot; от %1</translation> <translation>Отверг &quot;стук&quot; от %1</translation>
</message> </message>
@ -1356,6 +1390,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation>Сохранить как</translation> <translation>Сохранить как</translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1468,7 +1507,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation>Верифицировать</translation> <translation>Верифицировать</translation>
</message> </message>
@ -1491,7 +1530,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Сворачивать в системную панель</translation> <translation>Сворачивать в системную панель</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -606,19 +622,37 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished"> <translation type="unfinished">
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Du gick med i detta rum.</translation> <translation>Du gick med i detta rum.</translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>Bjöd in användare: %1</translation> <translation>Bjöd in användare: %1</translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation>Alla rum</translation> <translation>Alla rum</translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <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> <translation>-- Krypterat Event (Inga nycklar kunde hittas för dekryptering) --</translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation>Alla Filer (*)</translation> <translation>Alla Filer (*)</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation>Kunde inte ladda upp media. Vänligen försök igen.</translation> <translation>Kunde inte ladda upp media. Vänligen försök igen.</translation>
</message> </message>
@ -599,7 +610,12 @@ Om Nheko inte kan hitta din hemserver automatiskt kommer ett fält dyka upp där
<translation>Lösenord</translation> <translation>Lösenord</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation>Enhetsnamn</translation> <translation>Enhetsnamn</translation>
</message> </message>
@ -609,7 +625,17 @@ Om Nheko inte kan hitta din hemserver automatiskt kommer ett fält dyka upp där
<translation>Ett namn för denna enhet. Namnet kommer synas för andra när du verifierar dina enheter. Om du inte förser ett namn kommer ett standardnamn användas.</translation> <translation>Ett namn för denna enhet. Namnet kommer synas för andra när du verifierar dina enheter. Om du inte förser ett namn kommer ett standardnamn användas.</translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation>Addressen som kan användas för att kontakta din hemservers klient-API. <translation>Addressen som kan användas för att kontakta din hemservers klient-API.
@ -617,12 +643,20 @@ Exempel: https://server.my:8787</translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation>INLOGGNING</translation> <translation>INLOGGNING</translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation>Autouppslag misslyckades. Mottog felkonstruerat svar.</translation> <translation>Autouppslag misslyckades. Mottog felkonstruerat svar.</translation>
</message> </message>
@ -767,7 +801,7 @@ Exempel: https://server.my:8787</translation>
<translation>Skriv ett meddelande</translation> <translation>Skriv ett meddelande</translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation>Emoji</translation> <translation>Emoji</translation>
</message> </message>
@ -874,7 +908,7 @@ Exempel: https://server.my:8787</translation>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation>Skapa en unik profil, vilket tillåter dig att logga in flera konton samtidigt och starta flera instanser av Nheko.</translation>
</message> </message>
@ -977,7 +1011,7 @@ Exempel: https://server.my:8787</translation>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation>ingen version lagrad</translation> <translation>ingen version lagrad</translation>
</message> </message>
@ -1019,7 +1053,7 @@ Exempel: https://server.my:8787</translation>
<translation>Lägger till eller tar bort den angivna taggen.</translation> <translation>Lägger till eller tar bort den angivna taggen.</translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation>Ny tagg</translation> <translation>Ny tagg</translation>
@ -1119,7 +1153,7 @@ Exempel: https://server.my:8787</translation>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation>Kunde inte maskera meddelande: %1</translation> <translation>Kunde inte maskera meddelande: %1</translation>
</message> </message>
@ -1130,7 +1164,7 @@ Exempel: https://server.my:8787</translation>
<translation>Kunde inte kryptera event, sändning avbruten!</translation> <translation>Kunde inte kryptera event, sändning avbruten!</translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation>Spara bild</translation> <translation>Spara bild</translation>
</message> </message>
@ -1150,7 +1184,7 @@ Exempel: https://server.my:8787</translation>
<translation>Spara fil</translation> <translation>Spara fil</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation> <translation>
@ -1269,12 +1303,12 @@ Exempel: https://server.my:8787</translation>
<translation>%1 maskerade sin knackning.</translation> <translation>%1 maskerade sin knackning.</translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation>Du gick med i detta rum.</translation> <translation>Du gick med i detta rum.</translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation>Avvisade knackningen från %1.</translation> <translation>Avvisade knackningen från %1.</translation>
</message> </message>
@ -1355,6 +1389,11 @@ Exempel: https://server.my:8787</translation>
<source>Save as</source> <source>Save as</source>
<translation>Spara som</translation> <translation>Spara som</translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1467,7 +1506,7 @@ Exempel: https://server.my:8787</translation>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation>Bekräfta</translation> <translation>Bekräfta</translation>
</message> </message>
@ -1490,7 +1529,7 @@ Exempel: https://server.my:8787</translation>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation>Minimera till systemtråg</translation> <translation>Minimera till systemtråg</translation>
</message> </message>

View File

@ -51,7 +51,7 @@
<context> <context>
<name>Cache</name> <name>Cache</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1951"/> <location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -126,7 +126,7 @@
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<location line="+779"/> <location line="+796"/>
<source>Invited user: %1</source> <source>Invited user: %1</source>
<translation>: %1</translation> <translation>: %1</translation>
</message> </message>
@ -280,7 +280,12 @@
<context> <context>
<name>CommunitiesListItem</name> <name>CommunitiesListItem</name>
<message> <message>
<location filename="../../src/CommunitiesListItem.cpp" line="+133"/> <location filename="../../src/CommunitiesListItem.cpp" line="+26"/>
<source>Hide rooms with this tag or from this community</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+153"/>
<source>All rooms</source> <source>All rooms</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -474,11 +479,17 @@
<context> <context>
<name>EventStore</name> <name>EventStore</name>
<message> <message>
<location filename="../../src/timeline/EventStore.cpp" line="+548"/> <location filename="../../src/timeline/EventStore.cpp" line="+559"/>
<source>-- Encrypted Event (No keys found for decryption) --</source> <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> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>-- Encrypted Event (Key not valid for this index) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted with this key since it is not valid for this index </comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+32"/> <location line="+32"/>
<location line="+63"/> <location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">*</translation> <translation type="unfinished">*</translation>
</message> </message>
<message> <message>
<location line="+334"/> <location line="+340"/>
<source>Failed to upload media. Please try again.</source> <source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+2"/>
<source>Your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Device name</source> <source>Device name</source>
<translation></translation> <translation></translation>
</message> </message>
@ -606,19 +622,37 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+4"/>
<source>Homeserver address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>The address that can be used to contact you homeservers client API. <source>The address that can be used to contact you homeservers client API.
Example: https://server.my:8787</source> Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+19"/> <location line="+19"/>
<location line="+217"/> <location line="+218"/>
<source>LOGIN</source> <source>LOGIN</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="-104"/> <location line="-151"/>
<location line="+11"/>
<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"/>
<source>Autodiscovery failed. Received malformed response.</source> <source>Autodiscovery failed. Received malformed response.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+152"/> <location line="+170"/>
<source>Emoji</source> <source>Emoji</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>QCoreApplication</name> <name>QCoreApplication</name>
<message> <message>
<location filename="../../src/main.cpp" line="+182"/> <location filename="../../src/main.cpp" line="+179"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> <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> <translation type="unfinished"></translation>
</message> </message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>RoomInfo</name> <name>RoomInfo</name>
<message> <message>
<location filename="../../src/Cache.cpp" line="+1859"/> <location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source> <source>no version stored</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+38"/> <location line="+39"/>
<source>New tag...</source> <source>New tag...</source>
<comment>Add a new tag to the room</comment> <comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>TimelineModel</name> <name>TimelineModel</name>
<message> <message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/> <location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source> <source>Message redaction failed: %1</source>
<translation type="unfinished">%1</translation> <translation type="unfinished">%1</translation>
</message> </message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+156"/> <location line="+164"/>
<source>Save image</source> <source>Save image</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location line="+129"/> <location line="+143"/>
<source>%1 and %2 are typing.</source> <source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished"> <translation type="unfinished">
@ -1264,12 +1298,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="-749"/> <location line="-771"/>
<source>You joined this room.</source> <source>You joined this room.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+751"/> <location line="+773"/>
<source>Rejected the knock from %1.</source> <source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1350,6 +1384,11 @@ Example: https://server.my:8787</source>
<source>Save as</source> <source>Save as</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location line="+51"/> <location line="+51"/>
<source>No room open</source> <source>No room open</source>
@ -1462,7 +1501,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserProfile</name> <name>UserProfile</name>
<message> <message>
<location filename="../qml/UserProfile.qml" line="+53"/> <location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source> <source>Verify</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1485,7 +1524,7 @@ Example: https://server.my:8787</source>
<context> <context>
<name>UserSettingsPage</name> <name>UserSettingsPage</name>
<message> <message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/> <location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source> <source>Minimize to tray</source>
<translation></translation> <translation></translation>
</message> </message>

View File

@ -43,6 +43,7 @@
<url type="homepage">https://github.com/Nheko-Reborn/nheko</url> <url type="homepage">https://github.com/Nheko-Reborn/nheko</url>
<update_contact>https://github.com/Nheko-Reborn</update_contact> <update_contact>https://github.com/Nheko-Reborn</update_contact>
<releases> <releases>
<release date="2021-01-27" version="0.8.1"/>
<release date="2021-01-21" version="0.8.0"/> <release date="2021-01-21" version="0.8.0"/>
<release date="2020-06-12" version="0.7.2"/> <release date="2020-06-12" version="0.7.2"/>
<release date="2020-04-24" version="0.7.1"/> <release date="2020-04-24" version="0.7.1"/>

View File

@ -11,6 +11,7 @@ Popup {
property string completerName property string completerName
property var completer property var completer
property bool bottomToTop: true property bool bottomToTop: true
property alias count: listView.count
signal completionClicked(string completion) signal completionClicked(string completion)
@ -57,9 +58,9 @@ Popup {
completer = undefined; completer = undefined;
} }
} }
padding: 0 padding: 1
onAboutToShow: currentIndex = -1 onAboutToShow: currentIndex = -1
height: listView.contentHeight height: listView.contentHeight + 2 // + 2 for the padding on top and bottom
Connections { Connections {
onTimelineChanged: completer = null onTimelineChanged: completer = null
@ -84,7 +85,7 @@ Popup {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onEntered: popup.currentIndex = model.index onPositionChanged: popup.currentIndex = model.index
onClicked: popup.completionClicked(completer.completionAt(model.index)) onClicked: popup.completionClicked(completer.completionAt(model.index))
Ripple { Ripple {
@ -183,6 +184,7 @@ Popup {
color: colors.base color: colors.base
implicitHeight: popup.contentHeight implicitHeight: popup.contentHeight
implicitWidth: popup.contentWidth implicitWidth: popup.contentWidth
border.color: colors.mid
} }
} }

View File

@ -98,29 +98,28 @@ Rectangle {
clip: true clip: true
boundsBehavior: Flickable.StopAtBounds boundsBehavior: Flickable.StopAtBounds
flickableDirection: Flickable.VerticalFlick flickableDirection: Flickable.VerticalFlick
implicitWidth: textArea.width implicitWidth: messageInput.width
implicitHeight: textArea.height implicitHeight: messageInput.height
contentWidth: textArea.width contentWidth: messageInput.width
contentHeight: textArea.height contentHeight: messageInput.height
TextArea { TextArea {
id: textArea id: messageInput
property int completerTriggeredAt: -1 property int completerTriggeredAt: -1
function insertCompletion(completion) { function insertCompletion(completion) {
textArea.remove(completerTriggeredAt, cursorPosition); messageInput.remove(completerTriggeredAt, cursorPosition);
textArea.insert(cursorPosition, completion); messageInput.insert(cursorPosition, completion);
} }
function openCompleter(pos, type) { function openCompleter(pos, type) {
completerTriggeredAt = pos; completerTriggeredAt = pos;
popup.completerName = type; popup.completerName = type;
popup.open(); popup.open();
popup.completer.setSearchString(textArea.getText(completerTriggeredAt, cursorPosition)); popup.completer.setSearchString(messageInput.getText(completerTriggeredAt, cursorPosition));
} }
text: "asfkajsdf"
selectByMouse: true selectByMouse: true
placeholderText: qsTr("Write a message...") placeholderText: qsTr("Write a message...")
//placeholderTextColor: colors.buttonText //placeholderTextColor: colors.buttonText
@ -152,7 +151,7 @@ Rectangle {
popup.close(); popup.close();
} }
if (popup.opened) if (popup.opened)
popup.completer.setSearchString(textArea.getText(completerTriggeredAt, cursorPosition)); popup.completer.setSearchString(messageInput.getText(completerTriggeredAt, cursorPosition));
} }
onSelectionStartChanged: TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text) onSelectionStartChanged: TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text)
@ -163,17 +162,21 @@ Rectangle {
if (event.matches(StandardKey.Paste)) { if (event.matches(StandardKey.Paste)) {
TimelineManager.timeline.input.paste(false); TimelineManager.timeline.input.paste(false);
event.accepted = true; event.accepted = true;
} else if (event.key == Qt.Key_Space) {
if (popup.opened && popup.count <= 0)
popup.close();
} else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_U) { } else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_U) {
textArea.clear(); messageInput.clear();
} else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_P) { } else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_P) {
textArea.text = TimelineManager.timeline.input.previousText(); messageInput.text = TimelineManager.timeline.input.previousText();
} else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_N) { } else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_N) {
textArea.text = TimelineManager.timeline.input.nextText(); messageInput.text = TimelineManager.timeline.input.nextText();
} else if (event.key == Qt.Key_At) { } else if (event.key == Qt.Key_At) {
textArea.openCompleter(cursorPosition, "user"); messageInput.openCompleter(cursorPosition, "user");
popup.open(); popup.open();
} else if (event.key == Qt.Key_Colon) { } else if (event.key == Qt.Key_Colon) {
textArea.openCompleter(cursorPosition, "emoji"); messageInput.openCompleter(cursorPosition, "emoji");
popup.open(); popup.open();
} else if (event.key == Qt.Key_Escape && popup.opened) { } else if (event.key == Qt.Key_Escape && popup.opened) {
completerTriggeredAt = -1; completerTriggeredAt = -1;
@ -186,13 +189,13 @@ Rectangle {
popup.completerName = ""; popup.completerName = "";
popup.close(); popup.close();
if (currentCompletion) { if (currentCompletion) {
textArea.insertCompletion(currentCompletion); messageInput.insertCompletion(currentCompletion);
event.accepted = true; event.accepted = true;
return ; return ;
} }
} }
TimelineManager.timeline.input.send(); TimelineManager.timeline.input.send();
textArea.clear(); messageInput.clear();
event.accepted = true; event.accepted = true;
} else if (event.key == Qt.Key_Tab) { } else if (event.key == Qt.Key_Tab) {
event.accepted = true; event.accepted = true;
@ -201,19 +204,22 @@ Rectangle {
} else { } else {
var pos = cursorPosition - 1; var pos = cursorPosition - 1;
while (pos > -1) { while (pos > -1) {
var t = textArea.getText(pos, pos + 1); var t = messageInput.getText(pos, pos + 1);
console.log('"' + t + '"'); console.log('"' + t + '"');
if (t == '@' || t == ' ' || t == '\t') { if (t == '@') {
textArea.openCompleter(pos, "user"); messageInput.openCompleter(pos, "user");
return ;
} else if (t == ' ' || t == '\t') {
messageInput.openCompleter(pos + 1, "user");
return ; return ;
} else if (t == ':') { } else if (t == ':') {
textArea.openCompleter(pos, "emoji"); messageInput.openCompleter(pos, "emoji");
return ; return ;
} }
pos = pos - 1; pos = pos - 1;
} }
// At start of input // At start of input
textArea.openCompleter(0, "user"); messageInput.openCompleter(0, "user");
} }
} else if (event.key == Qt.Key_Up && popup.opened) { } else if (event.key == Qt.Key_Up && popup.opened) {
event.accepted = true; event.accepted = true;
@ -226,33 +232,40 @@ Rectangle {
background: null background: null
Connections { Connections {
onTimelineChanged: { onActiveTimelineChanged: {
textArea.clear(); messageInput.clear();
textArea.append(TimelineManager.timeline.input.text()); messageInput.append(TimelineManager.timeline.input.text());
textArea.completerTriggeredAt = -1; messageInput.completerTriggeredAt = -1;
popup.completerName = ""; popup.completerName = "";
messageInput.forceActiveFocus();
} }
target: TimelineManager target: TimelineManager
} }
Connections { Connections {
onCompletionClicked: textArea.insertCompletion(completion) onCompletionClicked: messageInput.insertCompletion(completion)
target: popup target: popup
} }
Completer { Completer {
id: popup id: popup
x: textArea.completerTriggeredAt >= 0 ? textArea.positionToRectangle(textArea.completerTriggeredAt).x : 0 x: messageInput.completerTriggeredAt >= 0 ? messageInput.positionToRectangle(messageInput.completerTriggeredAt).x : 0
y: textArea.completerTriggeredAt >= 0 ? textArea.positionToRectangle(textArea.completerTriggeredAt).y - height : 0 y: messageInput.completerTriggeredAt >= 0 ? messageInput.positionToRectangle(messageInput.completerTriggeredAt).y - height : 0
} }
Connections { Connections {
ignoreUnknownSignals: true ignoreUnknownSignals: true
onInsertText: textArea.insert(textArea.cursorPosition, text) onInsertText: messageInput.insert(messageInput.cursorPosition, text)
target: TimelineManager.timeline ? TimelineManager.timeline.input : null target: TimelineManager.timeline ? TimelineManager.timeline.input : null
} }
Connections {
ignoreUnknownSignals: true
onReplyChanged: messageInput.forceActiveFocus()
target: TimelineManager.timeline
}
MouseArea { MouseArea {
// workaround for wrong cursor shape on some platforms // workaround for wrong cursor shape on some platforms
anchors.fill: parent anchors.fill: parent
@ -284,7 +297,7 @@ Rectangle {
ToolTip.visible: hovered ToolTip.visible: hovered
ToolTip.text: qsTr("Emoji") ToolTip.text: qsTr("Emoji")
onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(emojiButton, function(emoji) { onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(emojiButton, function(emoji) {
textArea.insert(textArea.cursorPosition, emoji); messageInput.insert(messageInput.cursorPosition, emoji);
}) })
} }
@ -299,7 +312,7 @@ Rectangle {
ToolTip.text: qsTr("Send") ToolTip.text: qsTr("Send")
onClicked: { onClicked: {
TimelineManager.timeline.input.send(); TimelineManager.timeline.input.send();
textArea.clear(); messageInput.clear();
} }
} }

View File

@ -35,7 +35,7 @@ Page {
colors: palette colors: palette
model: EmojiProxyModel { model: EmojiProxyModel {
category: EmojiCategory.People category: Emoji.Category.People
sourceModel: EmojiModel { sourceModel: EmojiModel {
} }
@ -125,6 +125,13 @@ Page {
onTriggered: TimelineManager.timeline.saveMedia(messageContextMenu.eventId) onTriggered: TimelineManager.timeline.saveMedia(messageContextMenu.eventId)
} }
MenuItem {
visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker
height: visible ? implicitHeight : 0
text: qsTr("Open in external program")
onTriggered: TimelineManager.timeline.openMedia(messageContextMenu.eventId)
}
} }
Rectangle { Rectangle {

View File

@ -10,10 +10,19 @@ ApplicationWindow {
property var profile property var profile
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
height: 650 height: 650
width: 420 width: 420
minimumHeight: 420 minimumHeight: 420
palette: colors palette: colors
color: colors.window
title: profile.isGlobalUserProfile ? "Global User Profile" : "Room User Profile"
Shortcut {
sequence: StandardKey.Cancel
onActivated: userProfileDialog.close()
}
ColumnLayout { ColumnLayout {
id: contentL id: contentL
@ -32,13 +41,42 @@ ApplicationWindow {
onClicked: TimelineManager.openImageOverlay(TimelineManager.timeline.avatarUrl(userid), TimelineManager.timeline.data.id) onClicked: TimelineManager.openImageOverlay(TimelineManager.timeline.avatarUrl(userid), TimelineManager.timeline.data.id)
} }
Label { TextInput {
id: displayUsername
property bool isUsernameEditingAllowed
readOnly: !isUsernameEditingAllowed
text: profile.displayName text: profile.displayName
fontSizeMode: Text.HorizontalFit
font.pixelSize: 20 font.pixelSize: 20
color: TimelineManager.userColor(profile.userid, colors.window) color: TimelineManager.userColor(profile.userid, colors.window)
font.bold: true font.bold: true
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
selectByMouse: true
onAccepted: {
profile.changeUsername(displayUsername.text)
displayUsername.isUsernameEditingAllowed = false
}
ImageButton {
visible: profile.isSelf
anchors.leftMargin: 5
anchors.left: displayUsername.right
anchors.verticalCenter: displayUsername.verticalCenter
image: displayUsername.isUsernameEditingAllowed ? ":/icons/icons/ui/checkmark.png" : ":/icons/icons/ui/edit.png"
onClicked: {
if (displayUsername.isUsernameEditingAllowed) {
profile.changeUsername(displayUsername.text)
displayUsername.isUsernameEditingAllowed = false
} else {
displayUsername.isUsernameEditingAllowed = true
displayUsername.focus = true
displayUsername.selectAll()
}
}
}
} }
MatrixText { MatrixText {

View File

@ -194,7 +194,6 @@ Rectangle {
Text { Text {
Layout.fillWidth: true Layout.fillWidth: true
text: model.data.body text: model.data.body
textFormat: Text.PlainText
elide: Text.ElideRight elide: Text.ElideRight
color: colors.text color: colors.text
} }

View File

@ -126,7 +126,7 @@ Popup {
interval: 350 // tweak as needed? interval: 350 // tweak as needed?
onTriggered: { onTriggered: {
emojiPopup.model.filter = emojiSearch.text; emojiPopup.model.filter = emojiSearch.text;
emojiPopup.model.category = EmojiCategory.Search; emojiPopup.model.category = Emoji.Category.Search;
} }
} }
@ -178,42 +178,42 @@ Popup {
// TODO: Would like to get 'simple' icons for the categories // TODO: Would like to get 'simple' icons for the categories
ListElement { ListElement {
image: ":/icons/icons/emoji-categories/people.png" image: ":/icons/icons/emoji-categories/people.png"
category: EmojiCategory.People category: Emoji.Category.People
} }
ListElement { ListElement {
image: ":/icons/icons/emoji-categories/nature.png" image: ":/icons/icons/emoji-categories/nature.png"
category: EmojiCategory.Nature category: Emoji.Category.Nature
} }
ListElement { ListElement {
image: ":/icons/icons/emoji-categories/foods.png" image: ":/icons/icons/emoji-categories/foods.png"
category: EmojiCategory.Food category: Emoji.Category.Food
} }
ListElement { ListElement {
image: ":/icons/icons/emoji-categories/activity.png" image: ":/icons/icons/emoji-categories/activity.png"
category: EmojiCategory.Activity category: Emoji.Category.Activity
} }
ListElement { ListElement {
image: ":/icons/icons/emoji-categories/travel.png" image: ":/icons/icons/emoji-categories/travel.png"
category: EmojiCategory.Travel category: Emoji.Category.Travel
} }
ListElement { ListElement {
image: ":/icons/icons/emoji-categories/objects.png" image: ":/icons/icons/emoji-categories/objects.png"
category: EmojiCategory.Objects category: Emoji.Category.Objects
} }
ListElement { ListElement {
image: ":/icons/icons/emoji-categories/symbols.png" image: ":/icons/icons/emoji-categories/symbols.png"
category: EmojiCategory.Symbols category: Emoji.Category.Symbols
} }
ListElement { ListElement {
image: ":/icons/icons/emoji-categories/flags.png" image: ":/icons/icons/emoji-categories/flags.png"
category: EmojiCategory.Flags category: Emoji.Category.Flags
} }
} }
@ -224,21 +224,21 @@ Popup {
hoverEnabled: true hoverEnabled: true
ToolTip.text: { ToolTip.text: {
switch (model.category) { switch (model.category) {
case EmojiCategory.People: case Emoji.Category.People:
return qsTr('People'); return qsTr('People');
case EmojiCategory.Nature: case Emoji.Category.Nature:
return qsTr('Nature'); return qsTr('Nature');
case EmojiCategory.Food: case Emoji.Category.Food:
return qsTr('Food'); return qsTr('Food');
case EmojiCategory.Activity: case Emoji.Category.Activity:
return qsTr('Activity'); return qsTr('Activity');
case EmojiCategory.Travel: case Emoji.Category.Travel:
return qsTr('Travel'); return qsTr('Travel');
case EmojiCategory.Objects: case Emoji.Category.Objects:
return qsTr('Objects'); return qsTr('Objects');
case EmojiCategory.Symbols: case Emoji.Category.Symbols:
return qsTr('Symbols'); return qsTr('Symbols');
case EmojiCategory.Flags: case Emoji.Category.Flags:
return qsTr('Flags'); return qsTr('Flags');
} }
} }
@ -295,7 +295,7 @@ Popup {
ToolTip.visible: hovered ToolTip.visible: hovered
onClicked: { onClicked: {
// clear any filters // clear any filters
emojiPopup.model.category = EmojiCategory.Search; emojiPopup.model.category = Emoji.Category.Search;
gridView.positionViewAtBeginning(); gridView.positionViewAtBeginning();
emojiSearch.forceActiveFocus(); emojiSearch.forceActiveFocus();
} }

View File

@ -155,11 +155,12 @@ RoomInfoListItem > Avatar {
CommunitiesListItem { CommunitiesListItem {
qproperty-highlightedBackgroundColor: #4d84c7; qproperty-highlightedBackgroundColor: #4d84c7;
qproperty-disabledBackgroundColor: palette(mid);
qproperty-hoverBackgroundColor: rgb(67, 70, 77); qproperty-hoverBackgroundColor: rgb(67, 70, 77);
qproperty-backgroundColor: #2d3139; qproperty-backgroundColor: #2d3139;
qproperty-avatarBgColor: #202228; qproperty-avatarBgColor: #202228;
qproperty-avatarFgColor: palette(window); qproperty-avatarFgColor: black;
} }
LoadingIndicator { LoadingIndicator {

View File

@ -122,11 +122,12 @@ RoomInfoListItem > Avatar {
CommunitiesListItem { CommunitiesListItem {
qproperty-highlightedBackgroundColor: #38A3D8; qproperty-highlightedBackgroundColor: #38A3D8;
qproperty-disabledBackgroundColor: palette(mid);
qproperty-hoverBackgroundColor: rgb(70, 77, 93); qproperty-hoverBackgroundColor: rgb(70, 77, 93);
qproperty-backgroundColor: #f2f5f8; qproperty-backgroundColor: #f2f5f8;
qproperty-avatarBgColor: #eee; qproperty-avatarBgColor: #eee;
qproperty-avatarFgColor: black; qproperty-avatarFgColor: palette(buttonText);
} }
#ChatPageLoadSpinner { #ChatPageLoadSpinner {

View File

@ -118,6 +118,7 @@ RoomInfoListItem > Avatar {
CommunitiesListItem { CommunitiesListItem {
qproperty-highlightedBackgroundColor: palette(highlight); qproperty-highlightedBackgroundColor: palette(highlight);
qproperty-disabledBackgroundColor: palette(mid);
qproperty-hoverBackgroundColor: palette(light); qproperty-hoverBackgroundColor: palette(light);
qproperty-backgroundColor: palette(window); qproperty-backgroundColor: palette(window);

View File

@ -11,26 +11,13 @@ class Emoji(object):
self.code = repr(code.encode('utf-8'))[1:].strip("'") self.code = repr(code.encode('utf-8'))[1:].strip("'")
self.shortname = shortname self.shortname = shortname
def generate_code(emojis, category):
tmpl = Template('''
const std::vector<Emoji> emoji::Provider::{{ category }} = {
// {{ category.capitalize() }}
{%- for e in emoji %}
Emoji{QString::fromUtf8("{{ e.code }}"), "{{ e.shortname }}", emoji::EmojiCategory::{{ category.capitalize() }}},
{%- endfor %}
};
''')
d = dict(category=category, emoji=emojis)
print(tmpl.render(d))
def generate_qml_list(**kwargs): def generate_qml_list(**kwargs):
tmpl = Template(''' tmpl = Template('''
const QVector<Emoji> emoji::Provider::emoji = { const QVector<Emoji> emoji::Provider::emoji = {
{%- for c in kwargs.items() %} {%- for c in kwargs.items() %}
// {{ c[0].capitalize() }} // {{ c[0].capitalize() }}
{%- for e in c[1] %} {%- for e in c[1] %}
Emoji{QString::fromUtf8("{{ e.code }}"), "{{ e.shortname }}", emoji::EmojiCategory::{{ c[0].capitalize() }}}, Emoji{QString::fromUtf8("{{ e.code }}"), "{{ e.shortname }}", emoji::Emoji::Category::{{ c[0].capitalize() }}},
{%- endfor %} {%- endfor %}
{%- endfor %} {%- endfor %}
}; };
@ -93,12 +80,4 @@ if __name__ == '__main__':
# Use xclip to pipe the output to clipboard. # Use xclip to pipe the output to clipboard.
# e.g ./codegen.py emoji.json | xclip -sel clip # e.g ./codegen.py emoji.json | xclip -sel clip
generate_code(people, 'people') generate_qml_list(people=people, nature=nature, food=food, activity=activity, travel=travel, objects=objects, symbols=symbols, flags=flags)
generate_code(nature, 'nature')
generate_code(food, 'food')
generate_code(activity, 'activity')
generate_code(travel, 'travel')
generate_code(objects, 'objects')
generate_code(symbols, 'symbols')
generate_code(flags, 'flags')
generate_qml_list(people=people, nature=nature, food=food, activity=activity, travel=travel, objects=objects, symbols=symbols, flags=flags)

View File

@ -169,13 +169,35 @@ Cache::setup()
nhlog::db()->debug("setting up cache"); nhlog::db()->debug("setting up cache");
// Previous location of the cache directory
auto oldCache = QString("%1/%2%3")
.arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation))
.arg(QString::fromUtf8(localUserId_.toUtf8().toHex()))
.arg(QString::fromUtf8(settings->profile().toUtf8().toHex()));
cacheDirectory_ = QString("%1/%2%3") cacheDirectory_ = QString("%1/%2%3")
.arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) .arg(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation))
.arg(QString::fromUtf8(localUserId_.toUtf8().toHex())) .arg(QString::fromUtf8(localUserId_.toUtf8().toHex()))
.arg(QString::fromUtf8(settings->profile().toUtf8().toHex())); .arg(QString::fromUtf8(settings->profile().toUtf8().toHex()));
bool isInitial = !QFile::exists(cacheDirectory_); bool isInitial = !QFile::exists(cacheDirectory_);
// NOTE: If both cache directories exist it's better to do nothing: it
// could mean a previous migration failed or was interrupted.
bool needsMigration = isInitial && QFile::exists(oldCache);
if (needsMigration) {
nhlog::db()->info("found old state directory, migrating");
if (!QDir().rename(oldCache, cacheDirectory_)) {
throw std::runtime_error(("Unable to migrate the old state directory (" +
oldCache + ") to the new location (" +
cacheDirectory_ + ")")
.toStdString()
.c_str());
}
nhlog::db()->info("completed state migration");
}
env_ = lmdb::env::create(); env_ = lmdb::env::create();
env_.set_mapsize(DB_SIZE); env_.set_mapsize(DB_SIZE);
env_.set_max_dbs(MAX_DBS); env_.set_max_dbs(MAX_DBS);
@ -305,6 +327,7 @@ Cache::importSessionKeys(const mtx::crypto::ExportedSessionKeys &keys)
auto exported_session = mtx::crypto::import_session(s.session_key); auto exported_session = mtx::crypto::import_session(s.session_key);
saveInboundMegolmSession(index, std::move(exported_session)); saveInboundMegolmSession(index, std::move(exported_session));
ChatPage::instance()->receivedSessionKey(index.room_id, index.session_id);
} }
} }
@ -639,6 +662,10 @@ Cache::secret(const std::string &name)
"Restoring secret '{}' failed: {}", name, job.errorString().toStdString()); "Restoring secret '{}' failed: {}", name, job.errorString().toStdString());
return std::nullopt; return std::nullopt;
} }
if (secret.isEmpty()) {
nhlog::db()->debug("Restored empty secret '{}'.", name);
return std::nullopt;
}
return secret.toStdString(); return secret.toStdString();
} }
@ -1235,11 +1262,11 @@ Cache::saveState(const mtx::responses::Sync &res)
updatedInfo.avatar_url = getRoomAvatarUrl(txn, statesdb, membersdb).toStdString(); updatedInfo.avatar_url = getRoomAvatarUrl(txn, statesdb, membersdb).toStdString();
updatedInfo.version = getRoomVersion(txn, statesdb).toStdString(); updatedInfo.version = getRoomVersion(txn, statesdb).toStdString();
bool has_new_tags = false;
// Process the account_data associated with this room // Process the account_data associated with this room
if (!room.second.account_data.events.empty()) { if (!room.second.account_data.events.empty()) {
auto accountDataDb = getAccountDataDb(txn, room.first); auto accountDataDb = getAccountDataDb(txn, room.first);
bool has_new_tags = false;
for (const auto &evt : room.second.account_data.events) { for (const auto &evt : room.second.account_data.events) {
std::visit( std::visit(
[&txn, &accountDataDb](const auto &event) { [&txn, &accountDataDb](const auto &event) {
@ -1266,21 +1293,21 @@ Cache::saveState(const mtx::responses::Sync &res)
nhlog::db()->debug("Fully read: {}", fr->content.event_id); nhlog::db()->debug("Fully read: {}", fr->content.event_id);
} }
} }
if (!has_new_tags) { }
// retrieve the old tags, they haven't changed if (!has_new_tags) {
lmdb::val data; // retrieve the old tags, they haven't changed
if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room.first), data)) { lmdb::val data;
try { if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room.first), data)) {
RoomInfo tmp = json::parse( try {
std::string_view(data.data(), data.size())); RoomInfo tmp =
updatedInfo.tags = tmp.tags; json::parse(std::string_view(data.data(), data.size()));
} catch (const json::exception &e) { updatedInfo.tags = tmp.tags;
nhlog::db()->warn( } catch (const json::exception &e) {
"failed to parse room info: room_id ({}), {}: {}", nhlog::db()->warn(
room.first, "failed to parse room info: room_id ({}), {}: {}",
std::string(data.data(), data.size()), room.first,
e.what()); std::string(data.data(), data.size()),
} e.what());
} }
} }
} }

View File

@ -111,7 +111,11 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
connect(sidebarActions_, &SideBarActions::joinRoom, this, &ChatPage::joinRoom); connect(sidebarActions_, &SideBarActions::joinRoom, this, &ChatPage::joinRoom);
connect(sidebarActions_, &SideBarActions::createRoom, this, &ChatPage::createRoom); connect(sidebarActions_, &SideBarActions::createRoom, this, &ChatPage::createRoom);
user_info_widget_ = new UserInfoWidget(sideBar_); user_info_widget_ = new UserInfoWidget(sideBar_);
connect(user_info_widget_, &UserInfoWidget::openGlobalUserProfile, this, [this]() {
view_manager_->activeTimeline()->openUserProfile(utils::localUser(), true);
});
user_mentions_popup_ = new popups::UserMentions(); user_mentions_popup_ = new popups::UserMentions();
room_list_ = new RoomList(userSettings, sideBar_); room_list_ = new RoomList(userSettings, sideBar_);
connect(room_list_, &RoomList::joinRoom, this, &ChatPage::joinRoom); connect(room_list_, &RoomList::joinRoom, this, &ChatPage::joinRoom);
@ -267,10 +271,27 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
[this](const QString &groupId) { [this](const QString &groupId) {
current_community_ = groupId; current_community_ = groupId;
if (groupId == "world") if (groupId == "world") {
room_list_->removeFilter(); auto hidden = communitiesList_->hiddenTagsAndCommunities();
else std::set<QString> roomsToHide = communitiesList_->roomList(groupId);
room_list_->applyFilter(communitiesList_->roomList(groupId)); for (const auto &hiddenTag : hidden) {
auto temp = communitiesList_->roomList(hiddenTag);
roomsToHide.insert(temp.begin(), temp.end());
}
room_list_->removeFilter(roomsToHide);
} else {
auto hidden = communitiesList_->hiddenTagsAndCommunities();
hidden.erase(current_community_);
auto roomsToShow = communitiesList_->roomList(groupId);
for (const auto &hiddenTag : hidden) {
for (const auto &r : communitiesList_->roomList(hiddenTag))
roomsToShow.erase(r);
}
room_list_->applyFilter(roomsToShow);
}
}); });
connect(&notificationsManager, connect(&notificationsManager,
@ -1299,8 +1320,10 @@ ChatPage::startChat(QString userid)
mtx::requests::CreateRoom req; mtx::requests::CreateRoom req;
req.preset = mtx::requests::Preset::PrivateChat; req.preset = mtx::requests::Preset::PrivateChat;
req.visibility = mtx::common::RoomVisibility::Private; req.visibility = mtx::common::RoomVisibility::Private;
if (utils::localUser() != userid) if (utils::localUser() != userid) {
req.invite = {userid.toStdString()}; req.invite = {userid.toStdString()};
req.is_direct = true;
}
emit ChatPage::instance()->createRoom(req); emit ChatPage::instance()->createRoom(req);
} }

View File

@ -3,6 +3,7 @@
#include "Logging.h" #include "Logging.h"
#include "MatrixClient.h" #include "MatrixClient.h"
#include "Splitter.h" #include "Splitter.h"
#include "UserSettingsPage.h"
#include <mtx/responses/groups.hpp> #include <mtx/responses/groups.hpp>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
@ -125,9 +126,15 @@ CommunitiesList::setTagsForRoom(const QString &room_id, const std::vector<std::s
void void
CommunitiesList::addCommunity(const std::string &group_id) CommunitiesList::addCommunity(const std::string &group_id)
{ {
auto hiddenTags = UserSettings::instance()->hiddenTags();
const auto id = QString::fromStdString(group_id); const auto id = QString::fromStdString(group_id);
CommunitiesListItem *list_item = new CommunitiesListItem(id, scrollArea_); CommunitiesListItem *list_item = new CommunitiesListItem(id, scrollArea_);
if (hiddenTags.contains(id))
list_item->setDisabled(true);
communities_.emplace(id, QSharedPointer<CommunitiesListItem>(list_item)); communities_.emplace(id, QSharedPointer<CommunitiesListItem>(list_item));
contentsLayout_->insertWidget(contentsLayout_->count() - 1, list_item); contentsLayout_->insertWidget(contentsLayout_->count() - 1, list_item);
@ -135,6 +142,21 @@ CommunitiesList::addCommunity(const std::string &group_id)
&CommunitiesListItem::clicked, &CommunitiesListItem::clicked,
this, this,
&CommunitiesList::highlightSelectedCommunity); &CommunitiesList::highlightSelectedCommunity);
connect(list_item, &CommunitiesListItem::isDisabledChanged, this, [this]() {
for (const auto &community : communities_) {
if (community.second->isPressed()) {
emit highlightSelectedCommunity(community.first);
break;
}
}
auto hiddenTags = hiddenTagsAndCommunities();
// Qt < 5.14 compat
QStringList hiddenTags_;
for (auto &&t : hiddenTags)
hiddenTags_.push_back(t);
UserSettings::instance()->setHiddenTags(hiddenTags_);
});
if (group_id.empty() || group_id.front() != '+') if (group_id.empty() || group_id.front() != '+')
return; return;
@ -157,7 +179,9 @@ CommunitiesList::addCommunity(const std::string &group_id)
connect(this, connect(this,
&CommunitiesList::groupRoomsRetrieved, &CommunitiesList::groupRoomsRetrieved,
this, this,
[this](const QString &id, const std::map<QString, bool> &rooms) { [this](const QString &id, const std::set<QString> &rooms) {
nhlog::ui()->info(
"Fetched rooms for {}: {}", id.toStdString(), rooms.size());
if (communities_.find(id) == communities_.end()) if (communities_.find(id) == communities_.end())
return; return;
@ -179,9 +203,9 @@ CommunitiesList::addCommunity(const std::string &group_id)
return; return;
} }
std::map<QString, bool> room_ids; std::set<QString> room_ids;
for (const auto &room : res.at("chunk")) for (const auto &room : res.at("chunk"))
room_ids.emplace(QString::fromStdString(room.at("room_id")), true); room_ids.emplace(QString::fromStdString(room.at("room_id")));
emit groupRoomsRetrieved(id, room_ids); emit groupRoomsRetrieved(id, room_ids);
}); });
@ -256,7 +280,7 @@ CommunitiesList::fetchCommunityAvatar(const QString &id, const QString &avatarUr
}); });
} }
std::map<QString, bool> std::set<QString>
CommunitiesList::roomList(const QString &id) const CommunitiesList::roomList(const QString &id) const
{ {
if (communityExists(id)) if (communityExists(id))
@ -277,6 +301,18 @@ CommunitiesList::currentTags() const
return tags; return tags;
} }
std::set<QString>
CommunitiesList::hiddenTagsAndCommunities() const
{
std::set<QString> hiddenTags;
for (auto &entry : communities_) {
if (entry.second->isDisabled())
hiddenTags.insert(entry.first);
}
return hiddenTags;
}
void void
CommunitiesList::sortEntries() CommunitiesList::sortEntries()
{ {

View File

@ -24,17 +24,18 @@ public:
void addCommunity(const std::string &id); void addCommunity(const std::string &id);
void removeCommunity(const QString &id) { communities_.erase(id); }; void removeCommunity(const QString &id) { communities_.erase(id); };
std::map<QString, bool> roomList(const QString &id) const; std::set<QString> roomList(const QString &id) const;
void syncTags(const std::map<QString, RoomInfo> &info); void syncTags(const std::map<QString, RoomInfo> &info);
void setTagsForRoom(const QString &id, const std::vector<std::string> &tags); void setTagsForRoom(const QString &id, const std::vector<std::string> &tags);
std::vector<std::string> currentTags() const; std::vector<std::string> currentTags() const;
std::set<QString> hiddenTagsAndCommunities() const;
signals: signals:
void communityChanged(const QString &id); void communityChanged(const QString &id);
void avatarRetrieved(const QString &id, const QPixmap &img); void avatarRetrieved(const QString &id, const QPixmap &img);
void groupProfileRetrieved(const QString &group_id, const mtx::responses::GroupProfile &); void groupProfileRetrieved(const QString &group_id, const mtx::responses::GroupProfile &);
void groupRoomsRetrieved(const QString &group_id, const std::map<QString, bool> &res); void groupRoomsRetrieved(const QString &group_id, const std::set<QString> &res);
public slots: public slots:
void updateCommunityAvatar(const QString &id, const QPixmap &img); void updateCommunityAvatar(const QString &id, const QPixmap &img);

View File

@ -1,5 +1,6 @@
#include "CommunitiesListItem.h" #include "CommunitiesListItem.h"
#include <QMenu>
#include <QMouseEvent> #include <QMouseEvent>
#include "Utils.h" #include "Utils.h"
@ -20,18 +21,28 @@ CommunitiesListItem::CommunitiesListItem(QString group_id, QWidget *parent)
rippleOverlay_->setClipPath(path); rippleOverlay_->setClipPath(path);
rippleOverlay_->setClipping(true); rippleOverlay_->setClipping(true);
if (groupId_ == "world") menu_ = new QMenu(this);
avatar_ = QPixmap(":/icons/icons/ui/world.png"); hideRoomsWithTagAction_ =
else if (groupId_ == "tag:m.favourite") new QAction(tr("Hide rooms with this tag or from this community"), this);
avatar_ = QPixmap(":/icons/icons/ui/star.png"); hideRoomsWithTagAction_->setCheckable(true);
else if (groupId_ == "tag:m.lowpriority") menu_->addAction(hideRoomsWithTagAction_);
avatar_ = QPixmap(":/icons/icons/ui/lowprio.png"); connect(menu_, &QMenu::aboutToShow, this, [this]() {
else if (groupId_.startsWith("tag:")) hideRoomsWithTagAction_->setChecked(isDisabled_);
avatar_ = QPixmap(":/icons/icons/ui/tag.png"); });
connect(hideRoomsWithTagAction_, &QAction::triggered, this, [this](bool checked) {
this->setDisabled(checked);
});
updateTooltip(); updateTooltip();
} }
void
CommunitiesListItem::contextMenuEvent(QContextMenuEvent *event)
{
menu_->popup(event->globalPos());
}
void void
CommunitiesListItem::setName(QString name) CommunitiesListItem::setName(QString name)
{ {
@ -48,6 +59,16 @@ CommunitiesListItem::setPressedState(bool state)
} }
} }
void
CommunitiesListItem::setDisabled(bool state)
{
if (isDisabled_ != state) {
isDisabled_ = state;
update();
emit isDisabledChanged();
}
}
void void
CommunitiesListItem::mousePressEvent(QMouseEvent *event) CommunitiesListItem::mousePressEvent(QMouseEvent *event)
{ {
@ -80,22 +101,47 @@ CommunitiesListItem::paintEvent(QPaintEvent *)
if (isPressed_) if (isPressed_)
p.fillRect(rect(), highlightedBackgroundColor_); p.fillRect(rect(), highlightedBackgroundColor_);
else if (isDisabled_)
p.fillRect(rect(), disabledBackgroundColor_);
else if (underMouse()) else if (underMouse())
p.fillRect(rect(), hoverBackgroundColor_); p.fillRect(rect(), hoverBackgroundColor_);
else else
p.fillRect(rect(), backgroundColor_); p.fillRect(rect(), backgroundColor_);
if (avatar_.isNull()) { if (avatar_.isNull()) {
QFont font; QPixmap source;
font.setPointSizeF(font.pointSizeF() * 1.3); if (groupId_ == "world")
p.setFont(font); source = QPixmap(":/icons/icons/ui/world.png");
else if (groupId_ == "tag:m.favourite")
source = QPixmap(":/icons/icons/ui/star.png");
else if (groupId_ == "tag:m.lowpriority")
source = QPixmap(":/icons/icons/ui/lowprio.png");
else if (groupId_.startsWith("tag:"))
source = QPixmap(":/icons/icons/ui/tag.png");
p.drawLetterAvatar(utils::firstChar(resolveName()), if (source.isNull()) {
avatarFgColor_, QFont font;
avatarBgColor_, font.setPointSizeF(font.pointSizeF() * 1.3);
width(), p.setFont(font);
height(),
IconSize); p.drawLetterAvatar(utils::firstChar(resolveName()),
avatarFgColor_,
avatarBgColor_,
width(),
height(),
IconSize);
} else {
QPainter painter(&source);
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
painter.fillRect(source.rect(), avatarFgColor_);
painter.end();
const int imageSz = 32;
p.drawPixmap(
QRect(
(width() - imageSz) / 2, (height() - imageSz) / 2, imageSz, imageSz),
source);
}
} else { } else {
p.save(); p.save();

View File

@ -3,17 +3,22 @@
#include <QSharedPointer> #include <QSharedPointer>
#include <QWidget> #include <QWidget>
#include <set>
#include "Config.h" #include "Config.h"
#include "ui/Theme.h" #include "ui/Theme.h"
class RippleOverlay; class RippleOverlay;
class QMouseEvent; class QMouseEvent;
class QMenu;
class CommunitiesListItem : public QWidget class CommunitiesListItem : public QWidget
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor highlightedBackgroundColor READ highlightedBackgroundColor WRITE Q_PROPERTY(QColor highlightedBackgroundColor READ highlightedBackgroundColor WRITE
setHighlightedBackgroundColor) setHighlightedBackgroundColor)
Q_PROPERTY(QColor disabledBackgroundColor READ disabledBackgroundColor WRITE
setDisabledBackgroundColor)
Q_PROPERTY( Q_PROPERTY(
QColor hoverBackgroundColor READ hoverBackgroundColor WRITE setHoverBackgroundColor) QColor hoverBackgroundColor READ hoverBackgroundColor WRITE setHoverBackgroundColor)
Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)
@ -26,16 +31,18 @@ public:
void setName(QString name); void setName(QString name);
bool isPressed() const { return isPressed_; } bool isPressed() const { return isPressed_; }
bool isDisabled() const { return isDisabled_; }
void setAvatar(const QImage &img); void setAvatar(const QImage &img);
void setRooms(std::map<QString, bool> room_ids) { room_ids_ = std::move(room_ids); } void setRooms(std::set<QString> room_ids) { room_ids_ = std::move(room_ids); }
void addRoom(const QString &id) { room_ids_[id] = true; } void addRoom(const QString &id) { room_ids_.insert(id); }
void delRoom(const QString &id) { room_ids_.erase(id); } void delRoom(const QString &id) { room_ids_.erase(id); }
std::map<QString, bool> rooms() const { return room_ids_; } std::set<QString> rooms() const { return room_ids_; }
bool is_tag() const { return groupId_.startsWith("tag:"); } bool is_tag() const { return groupId_.startsWith("tag:"); }
QColor highlightedBackgroundColor() const { return highlightedBackgroundColor_; } QColor highlightedBackgroundColor() const { return highlightedBackgroundColor_; }
QColor disabledBackgroundColor() const { return disabledBackgroundColor_; }
QColor hoverBackgroundColor() const { return hoverBackgroundColor_; } QColor hoverBackgroundColor() const { return hoverBackgroundColor_; }
QColor backgroundColor() const { return backgroundColor_; } QColor backgroundColor() const { return backgroundColor_; }
@ -43,6 +50,7 @@ public:
QColor avatarBgColor() const { return avatarBgColor_; } QColor avatarBgColor() const { return avatarBgColor_; }
void setHighlightedBackgroundColor(QColor &color) { highlightedBackgroundColor_ = color; } void setHighlightedBackgroundColor(QColor &color) { highlightedBackgroundColor_ = color; }
void setDisabledBackgroundColor(QColor &color) { disabledBackgroundColor_ = color; }
void setHoverBackgroundColor(QColor &color) { hoverBackgroundColor_ = color; } void setHoverBackgroundColor(QColor &color) { hoverBackgroundColor_ = color; }
void setBackgroundColor(QColor &color) { backgroundColor_ = color; } void setBackgroundColor(QColor &color) { backgroundColor_ = color; }
@ -56,13 +64,16 @@ public:
signals: signals:
void clicked(const QString &group_id); void clicked(const QString &group_id);
void isDisabledChanged();
public slots: public slots:
void setPressedState(bool state); void setPressedState(bool state);
void setDisabled(bool state);
protected: protected:
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
void contextMenuEvent(QContextMenuEvent *event) override;
private: private:
const int IconSize = 36; const int IconSize = 36;
@ -70,20 +81,24 @@ private:
QString resolveName() const; QString resolveName() const;
void updateTooltip(); void updateTooltip();
std::map<QString, bool> room_ids_; std::set<QString> room_ids_;
QString name_; QString name_;
QString groupId_; QString groupId_;
QPixmap avatar_; QPixmap avatar_;
QColor highlightedBackgroundColor_; QColor highlightedBackgroundColor_;
QColor disabledBackgroundColor_;
QColor hoverBackgroundColor_; QColor hoverBackgroundColor_;
QColor backgroundColor_; QColor backgroundColor_;
QColor avatarFgColor_; QColor avatarFgColor_;
QColor avatarBgColor_; QColor avatarBgColor_;
bool isPressed_ = false; bool isPressed_ = false;
bool isDisabled_ = false;
RippleOverlay *rippleOverlay_; RippleOverlay *rippleOverlay_;
QMenu *menu_;
QAction *hideRoomsWithTagAction_;
}; };

View File

@ -120,7 +120,7 @@ LoginPage::LoginPage(QWidget *parent)
password_input_ = new TextField(this); password_input_ = new TextField(this);
password_input_->setLabel(tr("Password")); password_input_->setLabel(tr("Password"));
password_input_->setEchoMode(QLineEdit::Password); password_input_->setEchoMode(QLineEdit::Password);
password_input_->setToolTip("Your password."); password_input_->setToolTip(tr("Your password."));
deviceName_ = new TextField(this); deviceName_ = new TextField(this);
deviceName_->setLabel(tr("Device name")); deviceName_->setLabel(tr("Device name"));
@ -129,8 +129,8 @@ LoginPage::LoginPage(QWidget *parent)
"If none is provided a default is used.")); "If none is provided a default is used."));
serverInput_ = new TextField(this); serverInput_ = new TextField(this);
serverInput_->setLabel("Homeserver address"); serverInput_->setLabel(tr("Homeserver address"));
serverInput_->setPlaceholderText("matrix.org"); serverInput_->setPlaceholderText(tr("server.my:8787"));
serverInput_->setToolTip(tr("The address that can be used to contact you homeservers " serverInput_->setToolTip(tr("The address that can be used to contact you homeservers "
"client API.\nExample: https://server.my:8787")); "client API.\nExample: https://server.my:8787"));
serverInput_->hide(); serverInput_->hide();
@ -174,8 +174,9 @@ LoginPage::LoginPage(QWidget *parent)
setLayout(top_layout_); setLayout(top_layout_);
connect(this, &LoginPage::versionOkCb, this, &LoginPage::versionOk); connect(this, &LoginPage::versionOkCb, this, &LoginPage::versionOk, Qt::QueuedConnection);
connect(this, &LoginPage::versionErrorCb, this, &LoginPage::versionError); connect(
this, &LoginPage::versionErrorCb, this, &LoginPage::versionError, Qt::QueuedConnection);
connect(back_button_, SIGNAL(clicked()), this, SLOT(onBackButtonClicked())); connect(back_button_, SIGNAL(clicked()), this, SLOT(onBackButtonClicked()));
connect(login_button_, SIGNAL(clicked()), this, SLOT(onLoginButtonClicked())); connect(login_button_, SIGNAL(clicked()), this, SLOT(onLoginButtonClicked()));
@ -216,7 +217,7 @@ LoginPage::onMatrixIdEntered()
if (!matrixid_input_->isValid()) { if (!matrixid_input_->isValid()) {
error_matrixid_label_->show(); error_matrixid_label_->show();
showError(error_matrixid_label_, showError(error_matrixid_label_,
"You have entered an invalid Matrix ID e.g @joe:matrix.org"); tr("You have entered an invalid Matrix ID e.g @joe:matrix.org"));
return; return;
} else { } else {
error_matrixid_label_->setText(""); error_matrixid_label_->setText("");
@ -227,7 +228,7 @@ LoginPage::onMatrixIdEntered()
user = parse<User>(matrixid_input_->text().toStdString()); user = parse<User>(matrixid_input_->text().toStdString());
} catch (const std::exception &) { } catch (const std::exception &) {
showError(error_matrixid_label_, showError(error_matrixid_label_,
"You have entered an invalid Matrix ID e.g @joe:matrix.org"); tr("You have entered an invalid Matrix ID e.g @joe:matrix.org"));
return; return;
} }
@ -322,7 +323,7 @@ LoginPage::checkHomeserverVersion()
break; break;
} }
} }
emit versionOk(loginMethod_); emit versionOkCb(loginMethod_);
}); });
}); });
} }
@ -384,7 +385,7 @@ LoginPage::onLoginButtonClicked()
if (!matrixid_input_->isValid()) { if (!matrixid_input_->isValid()) {
error_matrixid_label_->show(); error_matrixid_label_->show();
showError(error_matrixid_label_, showError(error_matrixid_label_,
"You have entered an invalid Matrix ID e.g @joe:matrix.org"); tr("You have entered an invalid Matrix ID e.g @joe:matrix.org"));
return; return;
} else { } else {
error_matrixid_label_->setText(""); error_matrixid_label_->setText("");
@ -395,7 +396,7 @@ LoginPage::onLoginButtonClicked()
user = parse<User>(matrixid_input_->text().toStdString()); user = parse<User>(matrixid_input_->text().toStdString());
} catch (const std::exception &) { } catch (const std::exception &) {
showError(error_matrixid_label_, showError(error_matrixid_label_,
"You have entered an invalid Matrix ID e.g @joe:matrix.org"); tr("You have entered an invalid Matrix ID e.g @joe:matrix.org"));
return; return;
} }

View File

@ -61,10 +61,15 @@ class MainWindow : public QMainWindow
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(int x READ x CONSTANT)
Q_PROPERTY(int y READ y CONSTANT)
Q_PROPERTY(int width READ width CONSTANT)
Q_PROPERTY(int height READ height CONSTANT)
public: public:
explicit MainWindow(QWidget *parent = nullptr); explicit MainWindow(QWidget *parent = nullptr);
static MainWindow *instance() { return instance_; }; static MainWindow *instance() { return instance_; }
void saveCurrentWindowSize(); void saveCurrentWindowSize();
void openLeaveRoomDialog(const QString &room_id); void openLeaveRoomDialog(const QString &room_id);

View File

@ -1,6 +1,7 @@
#include "MatrixClient.h" #include "MatrixClient.h"
#include <memory> #include <memory>
#include <set>
#include <QMetaType> #include <QMetaType>
#include <QObject> #include <QObject>
@ -21,6 +22,7 @@ Q_DECLARE_METATYPE(nlohmann::json)
Q_DECLARE_METATYPE(std::string) Q_DECLARE_METATYPE(std::string)
Q_DECLARE_METATYPE(std::vector<std::string>) Q_DECLARE_METATYPE(std::vector<std::string>)
Q_DECLARE_METATYPE(std::vector<QString>) Q_DECLARE_METATYPE(std::vector<QString>)
Q_DECLARE_METATYPE(std::set<QString>)
namespace { namespace {
auto client_ = std::make_shared<mtx::http::Client>(); auto client_ = std::make_shared<mtx::http::Client>();
@ -55,6 +57,7 @@ init()
qRegisterMetaType<std::vector<std::string>>(); qRegisterMetaType<std::vector<std::string>>();
qRegisterMetaType<std::vector<QString>>(); qRegisterMetaType<std::vector<QString>>();
qRegisterMetaType<std::map<QString, bool>>("std::map<QString, bool>"); qRegisterMetaType<std::map<QString, bool>>("std::map<QString, bool>");
qRegisterMetaType<std::set<QString>>();
} }
} // namespace http } // namespace http

View File

@ -890,12 +890,15 @@ decryptEvent(const MegolmSessionIndex &index,
std::string msg_str; std::string msg_str;
try { try {
auto session = cache::client()->getInboundMegolmSession(index); auto session = cache::client()->getInboundMegolmSession(index);
auto res = auto res =
olm::client()->decrypt_group_message(session.get(), event.content.ciphertext); olm::client()->decrypt_group_message(session.get(), event.content.ciphertext);
msg_str = std::string((char *)res.data.data(), res.data.size()); msg_str = std::string((char *)res.data.data(), res.data.size());
} catch (const lmdb::error &e) { } catch (const lmdb::error &e) {
return {DecryptionErrorCode::DbError, e.what(), std::nullopt}; return {DecryptionErrorCode::DbError, e.what(), std::nullopt};
} catch (const mtx::crypto::olm_exception &e) { } catch (const mtx::crypto::olm_exception &e) {
if (e.error_code() == mtx::crypto::OlmErrorCode::UNKNOWN_MESSAGE_INDEX)
return {DecryptionErrorCode::MissingSessionIndex, e.what(), std::nullopt};
return {DecryptionErrorCode::DecryptionFailed, e.what(), std::nullopt}; return {DecryptionErrorCode::DecryptionFailed, e.what(), std::nullopt};
} }
@ -961,6 +964,13 @@ send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::s
auto d = deviceKeys->device_keys.at(device); auto d = deviceKeys->device_keys.at(device);
if (!d.keys.count("curve25519:" + device) ||
!d.keys.count("ed25519:" + device)) {
nhlog::crypto()->warn("Skipping device {} since it has no keys!",
device);
continue;
}
auto session = auto session =
cache::getLatestOlmSession(d.keys.at("curve25519:" + device)); cache::getLatestOlmSession(d.keys.at("curve25519:" + device));
if (!session || force_new_session) { if (!session || force_new_session) {

View File

@ -17,11 +17,13 @@ enum class DecryptionErrorCode
{ {
MissingSession, // Session was not found, retrieve from backup or request from other devices MissingSession, // Session was not found, retrieve from backup or request from other devices
// and try again // and try again
DbError, // DB read failed MissingSessionIndex, // Session was found, but it does not reach back enough to this index,
DecryptionFailed, // libolm error // retrieve from backup or request from other devices and try again
ParsingFailed, // Failed to parse the actual event DbError, // DB read failed
ReplayAttack, // Megolm index reused DecryptionFailed, // libolm error
UnknownFingerprint, // Unknown device Fingerprint ParsingFailed, // Failed to parse the actual event
ReplayAttack, // Megolm index reused
UnknownFingerprint, // Unknown device Fingerprint
}; };
struct DecryptionResult struct DecryptionResult

View File

@ -17,6 +17,7 @@
#include <QDateTime> #include <QDateTime>
#include <QInputDialog> #include <QInputDialog>
#include <QMenu>
#include <QMouseEvent> #include <QMouseEvent>
#include <QPainter> #include <QPainter>
#include <QSettings> #include <QSettings>
@ -32,7 +33,6 @@
#include "Splitter.h" #include "Splitter.h"
#include "UserSettingsPage.h" #include "UserSettingsPage.h"
#include "Utils.h" #include "Utils.h"
#include "ui/Menu.h"
#include "ui/Ripple.h" #include "ui/Ripple.h"
#include "ui/RippleOverlay.h" #include "ui/RippleOverlay.h"
@ -98,7 +98,7 @@ RoomInfoListItem::init(QWidget *parent)
bubbleDiameter_ = QFontMetrics(unreadCountFont_).averageCharWidth() * 3; bubbleDiameter_ = QFontMetrics(unreadCountFont_).averageCharWidth() * 3;
menu_ = new Menu(this); menu_ = new QMenu(this);
leaveRoom_ = new QAction(tr("Leave room"), this); leaveRoom_ = new QAction(tr("Leave room"), this);
connect(leaveRoom_, &QAction::triggered, this, [this]() { emit leaveRoom(roomId_); }); connect(leaveRoom_, &QAction::triggered, this, [this]() { emit leaveRoom(roomId_); });
@ -145,11 +145,12 @@ RoomInfoListItem::init(QWidget *parent)
tagAction->setWhatsThis(tr("Adds or removes the specified tag.", tagAction->setWhatsThis(tr("Adds or removes the specified tag.",
"WhatsThis hint for tag menu actions")); "WhatsThis hint for tag menu actions"));
for (const auto &riTag : roomInfo.tags) for (const auto &riTag : roomInfo.tags) {
if (riTag == tag) { if (riTag == tag) {
tagAction->setChecked(true); tagAction->setChecked(true);
break; break;
} }
}
connect(tagAction, &QAction::triggered, this, [this, tag](bool checked) { connect(tagAction, &QAction::triggered, this, [this, tag](bool checked) {
if (checked) if (checked)

View File

@ -28,7 +28,7 @@
#include "UserSettingsPage.h" #include "UserSettingsPage.h"
#include "ui/Avatar.h" #include "ui/Avatar.h"
class Menu; class QMenu;
class RippleOverlay; class RippleOverlay;
class RoomInfoListItem : public QWidget class RoomInfoListItem : public QWidget
@ -178,7 +178,7 @@ private:
DescInfo lastMsgInfo_; DescInfo lastMsgInfo_;
Menu *menu_; QMenu *menu_;
QAction *leaveRoom_; QAction *leaveRoom_;
bool isPressed_ = false; bool isPressed_ = false;

View File

@ -50,8 +50,8 @@ RoomList::RoomList(QSharedPointer<UserSettings> userSettings, QWidget *parent)
QScroller::grabGesture(scrollArea_, QScroller::TouchGesture); QScroller::grabGesture(scrollArea_, QScroller::TouchGesture);
QScroller::grabGesture(scrollArea_, QScroller::LeftMouseButtonGesture); QScroller::grabGesture(scrollArea_, QScroller::LeftMouseButtonGesture);
// The scrollbar on macOS will hide itself when not active so it won't interfere // The scrollbar on macOS will hide itself when not active so it won't interfere
// with the content. // with the content.
#if not defined(Q_OS_MAC) #if not defined(Q_OS_MAC)
scrollArea_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrollArea_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
#endif #endif
@ -411,20 +411,24 @@ RoomList::closeJoinRoomDialog(bool isJoining, QString roomAlias)
} }
void void
RoomList::removeFilter() RoomList::removeFilter(const std::set<QString> &roomsToHide)
{ {
setUpdatesEnabled(false); setUpdatesEnabled(false);
for (int i = 0; i < contentsLayout_->count(); i++) { for (int i = 0; i < contentsLayout_->count(); i++) {
auto widget = auto widget =
qobject_cast<RoomInfoListItem *>(contentsLayout_->itemAt(i)->widget()); qobject_cast<RoomInfoListItem *>(contentsLayout_->itemAt(i)->widget());
if (widget) if (widget) {
widget->show(); if (roomsToHide.find(widget->roomId()) == roomsToHide.end())
widget->show();
else
widget->hide();
}
} }
setUpdatesEnabled(true); setUpdatesEnabled(true);
} }
void void
RoomList::applyFilter(const std::map<QString, bool> &filter) RoomList::applyFilter(const std::set<QString> &filter)
{ {
// Disabling paint updates will resolve issues with screen flickering on big room lists. // Disabling paint updates will resolve issues with screen flickering on big room lists.
setUpdatesEnabled(false); setUpdatesEnabled(false);

View File

@ -23,6 +23,8 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWidget> #include <QWidget>
#include <set>
#include "CacheStructs.h" #include "CacheStructs.h"
#include "UserSettingsPage.h" #include "UserSettingsPage.h"
@ -54,9 +56,9 @@ public:
void addInvitedRoom(const QString &room_id, const RoomInfo &info); void addInvitedRoom(const QString &room_id, const RoomInfo &info);
void removeRoom(const QString &room_id, bool reset); void removeRoom(const QString &room_id, bool reset);
//! Hide rooms that are not present in the given filter. //! Hide rooms that are not present in the given filter.
void applyFilter(const std::map<QString, bool> &rooms); void applyFilter(const std::set<QString> &rooms);
//! Show all the available rooms. //! Show all the available rooms.
void removeFilter(); void removeFilter(const std::set<QString> &roomsToHide);
void updateRoom(const QString &room_id, const RoomInfo &info); void updateRoom(const QString &room_id, const RoomInfo &info);
void cleanupInvites(const std::map<QString, bool> &invites); void cleanupInvites(const std::map<QString, bool> &invites);

View File

@ -37,20 +37,22 @@ Splitter::restoreSizes(int fallback)
int savedWidth = settings.value("sidebar/width").toInt(); int savedWidth = settings.value("sidebar/width").toInt();
auto left = widget(0); auto left = widget(0);
if (savedWidth == 0) { if (savedWidth <= 0) {
hideSidebar(); hideSidebar();
return; return;
} else if (savedWidth == sz_.small) { } else if (savedWidth <= sz_.small) {
if (left) { if (left) {
left->setMinimumWidth(sz_.small); left->setMinimumWidth(sz_.small);
left->setMaximumWidth(sz_.small); left->setMaximumWidth(sz_.small);
return; return;
} }
} else if (savedWidth < sz_.normal) {
savedWidth = sz_.normal;
} }
left->setMinimumWidth(sz_.normal); left->setMinimumWidth(sz_.normal);
left->setMaximumWidth(2 * sz_.normal); left->setMaximumWidth(2 * sz_.normal);
setSizes({sz_.normal, fallback - sz_.normal}); setSizes({savedWidth, fallback - savedWidth});
setStretchFactor(0, 0); setStretchFactor(0, 0);
setStretchFactor(1, 1); setStretchFactor(1, 1);

View File

@ -125,6 +125,10 @@ UserInfoWidget::UserInfoWidget(QWidget *parent)
ChatPage::instance()->setStatus(text); ChatPage::instance()->setStatus(text);
}); });
auto userProfileAction = menu->addAction(tr("User Profile Settings"));
connect(
userProfileAction, &QAction::triggered, this, [this]() { emit openGlobalUserProfile(); });
#if 0 // disable presence menu until issues in synapse are resolved #if 0 // disable presence menu until issues in synapse are resolved
auto setAutoPresence = menu->addAction(tr("Set presence automatically")); auto setAutoPresence = menu->addAction(tr("Set presence automatically"));
connect(setAutoPresence, &QAction::triggered, this, []() { connect(setAutoPresence, &QAction::triggered, this, []() {

View File

@ -51,6 +51,9 @@ protected:
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
void contextMenuEvent(QContextMenuEvent *) override; void contextMenuEvent(QContextMenuEvent *) override;
signals:
void openGlobalUserProfile();
private: private:
Avatar *userAvatar_; Avatar *userAvatar_;

View File

@ -81,6 +81,7 @@ UserSettings::load(std::optional<QString> profile)
hasAlertOnNotification_ = settings.value("user/alert_on_notification", false).toBool(); hasAlertOnNotification_ = settings.value("user/alert_on_notification", false).toBool();
startInTray_ = settings.value("user/window/start_in_tray", false).toBool(); startInTray_ = settings.value("user/window/start_in_tray", false).toBool();
groupView_ = settings.value("user/group_view", true).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(); buttonsInTimeline_ = settings.value("user/timeline/buttons", true).toBool();
timelineMaxWidth_ = settings.value("user/timeline/max_width", 0).toInt(); timelineMaxWidth_ = settings.value("user/timeline/max_width", 0).toInt();
messageHoverHighlight_ = messageHoverHighlight_ =
@ -186,6 +187,13 @@ UserSettings::setGroupView(bool state)
save(); save();
} }
void
UserSettings::setHiddenTags(QStringList hiddenTags)
{
hiddenTags_ = hiddenTags;
save();
}
void void
UserSettings::setMarkdown(bool state) UserSettings::setMarkdown(bool state)
{ {
@ -564,6 +572,7 @@ UserSettings::save()
settings.setValue("minor_events", sortByImportance_); settings.setValue("minor_events", sortByImportance_);
settings.setValue("read_receipts", readReceipts_); settings.setValue("read_receipts", readReceipts_);
settings.setValue("group_view", groupView_); settings.setValue("group_view", groupView_);
settings.setValue("hidden_tags", hiddenTags_);
settings.setValue("markdown_enabled", markdown_); settings.setValue("markdown_enabled", markdown_);
settings.setValue("desktop_notifications", hasDesktopNotifications_); settings.setValue("desktop_notifications", hasDesktopNotifications_);
settings.setValue("alert_on_notification", hasAlertOnNotification_); settings.setValue("alert_on_notification", hasAlertOnNotification_);

View File

@ -150,6 +150,7 @@ public:
void setAccessToken(QString accessToken); void setAccessToken(QString accessToken);
void setDeviceId(QString deviceId); void setDeviceId(QString deviceId);
void setHomeserver(QString homeserver); void setHomeserver(QString homeserver);
void setHiddenTags(QStringList hiddenTags);
QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; } QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; }
bool messageHoverHighlight() const { return messageHoverHighlight_; } bool messageHoverHighlight() const { return messageHoverHighlight_; }
@ -190,6 +191,7 @@ public:
QString accessToken() const { return accessToken_; } QString accessToken() const { return accessToken_; }
QString deviceId() const { return deviceId_; } QString deviceId() const { return deviceId_; }
QString homeserver() const { return homeserver_; } QString homeserver() const { return homeserver_; }
QStringList hiddenTags() const { return hiddenTags_; }
signals: signals:
void groupViewStateChanged(bool state); void groupViewStateChanged(bool state);
@ -269,6 +271,7 @@ private:
QString accessToken_; QString accessToken_;
QString deviceId_; QString deviceId_;
QString homeserver_; QString homeserver_;
QStringList hiddenTags_;
static QSharedPointer<UserSettings> instance_; static QSharedPointer<UserSettings> instance_;
}; };

View File

@ -55,8 +55,7 @@ utils::codepointIsEmoji(uint code)
{ {
// TODO: Be more precise here. // TODO: Be more precise here.
return (code >= 0x2600 && code <= 0x27bf) || (code >= 0x2b00 && code <= 0x2bff) || return (code >= 0x2600 && code <= 0x27bf) || (code >= 0x2b00 && code <= 0x2bff) ||
(code >= 0x1f300 && code <= 0x1f3ff) || (code >= 0x1f000 && code <= 0x1faff) || (code >= 0x1f000 && code <= 0x1faff) || code == 0x200d || code == 0xfe0f;
code == 0x200d;
} }
QString QString

View File

@ -63,14 +63,14 @@ EmojiProxyModel::EmojiProxyModel(QObject *parent)
EmojiProxyModel::~EmojiProxyModel() {} EmojiProxyModel::~EmojiProxyModel() {}
EmojiCategory Emoji::Category
EmojiProxyModel::category() const EmojiProxyModel::category() const
{ {
return category_; return category_;
} }
void void
EmojiProxyModel::setCategory(EmojiCategory cat) EmojiProxyModel::setCategory(Emoji::Category cat)
{ {
if (category_ == cat) { if (category_ == cat) {
return; return;
@ -106,7 +106,7 @@ EmojiProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent
const Emoji emoji = index.data(static_cast<int>(EmojiModel::Roles::Emoji)).value<Emoji>(); const Emoji emoji = index.data(static_cast<int>(EmojiModel::Roles::Emoji)).value<Emoji>();
// TODO: Add favorites / recently used // TODO: Add favorites / recently used
if (category_ != EmojiCategory::Search) { if (category_ != Emoji::Category::Search) {
return emoji.category == category_; return emoji.category == category_;
} }

View File

@ -36,15 +36,15 @@ class EmojiProxyModel : public QSortFilterProxyModel
Q_OBJECT Q_OBJECT
Q_PROPERTY( Q_PROPERTY(
emoji::EmojiCategory category READ category WRITE setCategory NOTIFY categoryChanged) emoji::Emoji::Category category READ category WRITE setCategory NOTIFY categoryChanged)
Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged) Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged)
public: public:
explicit EmojiProxyModel(QObject *parent = nullptr); explicit EmojiProxyModel(QObject *parent = nullptr);
~EmojiProxyModel() override; ~EmojiProxyModel() override;
EmojiCategory category() const; Emoji::Category category() const;
void setCategory(EmojiCategory cat); void setCategory(Emoji::Category cat);
QString filter() const; QString filter() const;
void setFilter(const QString &filter); void setFilter(const QString &filter);
@ -57,7 +57,7 @@ protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
private: private:
EmojiCategory category_ = EmojiCategory::Search; Emoji::Category category_ = Emoji::Category::Search;
emoji::Provider emoji_provider_; emoji::Provider emoji_provider_;
}; };
} }

File diff suppressed because it is too large Load Diff

View File

@ -26,32 +26,32 @@
namespace emoji { namespace emoji {
Q_NAMESPACE Q_NAMESPACE
enum class EmojiCategory
{
People,
Nature,
Food,
Activity,
Travel,
Objects,
Symbols,
Flags,
Search
};
Q_ENUM_NS(EmojiCategory)
struct Emoji struct Emoji
{ {
Q_GADGET Q_GADGET
public:
enum class Category
{
People,
Nature,
Food,
Activity,
Travel,
Objects,
Symbols,
Flags,
Search
};
Q_ENUM(Category)
Q_PROPERTY(const QString &unicode MEMBER unicode) Q_PROPERTY(const QString &unicode MEMBER unicode)
Q_PROPERTY(const QString &shortName MEMBER shortName) Q_PROPERTY(const QString &shortName MEMBER shortName)
Q_PROPERTY(emoji::EmojiCategory category MEMBER category) Q_PROPERTY(emoji::Emoji::Category category MEMBER category)
public: public:
QString unicode; QString unicode;
QString shortName; QString shortName;
EmojiCategory category; Category category;
}; };
class Provider class Provider

View File

@ -93,9 +93,9 @@ screenCenter(int width, int height)
} }
void void
createCacheDirectory() createStandardDirectory(QStandardPaths::StandardLocation path)
{ {
auto dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); auto dir = QStandardPaths::writableLocation(path);
if (!QDir().mkpath(dir)) { if (!QDir().mkpath(dir)) {
throw std::runtime_error( throw std::runtime_error(
@ -188,7 +188,8 @@ main(int argc, char *argv[])
http::init(); http::init();
createCacheDirectory(); createStandardDirectory(QStandardPaths::CacheLocation);
createStandardDirectory(QStandardPaths::AppDataLocation);
registerSignalHandlers(); registerSignalHandlers();

View File

@ -47,7 +47,6 @@ public:
private: private:
QDBusInterface dbus; QDBusInterface dbus;
uint showNotification(const QString summary, const QString text, const QImage image);
void closeNotification(uint id); void closeNotification(uint id);
// notification ID to (room ID, event ID) // notification ID to (room ID, event ID)

View File

@ -1,10 +1,12 @@
#include "notifications/Manager.h" #include "notifications/Manager.h"
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDBusMetaType>
#include <QDBusPendingCallWatcher>
#include <QDBusPendingReply>
#include <QDebug> #include <QDebug>
#include <QImage> #include <QImage>
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusMessage>
#include <QtDBus/QDBusMetaType>
NotificationsManager::NotificationsManager(QObject *parent) NotificationsManager::NotificationsManager(QObject *parent)
: QObject(parent) : QObject(parent)
@ -36,6 +38,12 @@ NotificationsManager::NotificationsManager(QObject *parent)
SLOT(notificationReplied(uint, QString))); SLOT(notificationReplied(uint, QString)));
} }
/**
* This function is based on code from
* https://github.com/rohieb/StratumsphereTrayIcon
* Copyright (C) 2012 Roland Hieber <rohieb@rohieb.name>
* Licensed under the GNU General Public License, version 3
*/
void void
NotificationsManager::postNotification(const QString &roomid, NotificationsManager::postNotification(const QString &roomid,
const QString &eventid, const QString &eventid,
@ -43,30 +51,16 @@ NotificationsManager::postNotification(const QString &roomid,
const QString &sender, const QString &sender,
const QString &text, const QString &text,
const QImage &icon) const QImage &icon)
{
uint id = showNotification(roomname, sender + ": " + text, icon);
notificationIds[id] = roomEventId{roomid, eventid};
}
/**
* This function is based on code from
* https://github.com/rohieb/StratumsphereTrayIcon
* Copyright (C) 2012 Roland Hieber <rohieb@rohieb.name>
* Licensed under the GNU General Public License, version 3
*/
uint
NotificationsManager::showNotification(const QString summary,
const QString text,
const QImage image)
{ {
QVariantMap hints; QVariantMap hints;
hints["image-data"] = image; hints["image-data"] = icon;
hints["sound-name"] = "message-new-instant"; hints["sound-name"] = "message-new-instant";
QList<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << "nheko"; // app_name argumentList << "nheko"; // app_name
argumentList << (uint)0; // replace_id argumentList << (uint)0; // replace_id
argumentList << ""; // app_icon argumentList << ""; // app_icon
argumentList << summary; // summary argumentList << roomname; // summary
argumentList << text; // body argumentList << sender + ": " + text; // body
// The list of actions has always the action name and then a localized version of that // The list of actions has always the action name and then a localized version of that
// action. Currently we just use an empty string for that. // action. Currently we just use an empty string for that.
// TODO(Nico): Look into what to actually put there. // TODO(Nico): Look into what to actually put there.
@ -79,31 +73,33 @@ NotificationsManager::showNotification(const QString summary,
static QDBusInterface notifyApp("org.freedesktop.Notifications", static QDBusInterface notifyApp("org.freedesktop.Notifications",
"/org/freedesktop/Notifications", "/org/freedesktop/Notifications",
"org.freedesktop.Notifications"); "org.freedesktop.Notifications");
QDBusMessage reply = QDBusPendingCall call = notifyApp.asyncCallWithArgumentList("Notify", argumentList);
notifyApp.callWithArgumentList(QDBus::AutoDetect, "Notify", argumentList); auto watcher = new QDBusPendingCallWatcher{call, this};
if (reply.type() == QDBusMessage::ErrorMessage) { connect(
qDebug() << "D-Bus Error:" << reply.errorMessage(); watcher, &QDBusPendingCallWatcher::finished, this, [watcher, this, roomid, eventid]() {
return 0; if (watcher->reply().type() == QDBusMessage::ErrorMessage)
} else { qDebug() << "D-Bus Error:" << watcher->reply().errorMessage();
return reply.arguments().first().toUInt(); else
} notificationIds[watcher->reply().arguments().first().toUInt()] =
return true; roomEventId{roomid, eventid};
watcher->deleteLater();
});
} }
void void
NotificationsManager::closeNotification(uint id) NotificationsManager::closeNotification(uint id)
{ {
QList<QVariant> argumentList;
argumentList << (uint)id; // replace_id
static QDBusInterface closeCall("org.freedesktop.Notifications", static QDBusInterface closeCall("org.freedesktop.Notifications",
"/org/freedesktop/Notifications", "/org/freedesktop/Notifications",
"org.freedesktop.Notifications"); "org.freedesktop.Notifications");
QDBusMessage reply = auto call = closeCall.asyncCall("CloseNotification", (uint)id); // replace_id
closeCall.callWithArgumentList(QDBus::AutoDetect, "CloseNotification", argumentList); auto watcher = new QDBusPendingCallWatcher{call, this};
if (reply.type() == QDBusMessage::ErrorMessage) { connect(watcher, &QDBusPendingCallWatcher::finished, this, [watcher, this]() {
qDebug() << "D-Bus Error:" << reply.errorMessage(); if (watcher->reply().type() == QDBusMessage::ErrorMessage) {
} qDebug() << "D-Bus Error:" << watcher->reply().errorMessage();
};
watcher->deleteLater();
});
} }
void void

View File

@ -229,6 +229,9 @@ EventStore::clearTimeline()
} }
nhlog::ui()->info("Range {} {}", this->last, this->first); nhlog::ui()->info("Range {} {}", this->last, this->first);
decryptedEvents_.clear();
events_.clear();
emit endResetModel(); emit endResetModel();
} }
@ -239,9 +242,12 @@ EventStore::receivedSessionKey(const std::string &session_id)
return; return;
auto request = pending_key_requests.at(session_id); auto request = pending_key_requests.at(session_id);
pending_key_requests.erase(session_id);
olm::send_key_request_for(request.events.front(), request.request_id, true); // Don't request keys again until Nheko is restarted (for now)
pending_key_requests[session_id].events.clear();
if (!request.events.empty())
olm::send_key_request_for(request.events.front(), request.request_id, true);
for (const auto &e : request.events) { for (const auto &e : request.events) {
auto idx = idToIndex(e.event_id); auto idx = idToIndex(e.event_id);
@ -265,6 +271,9 @@ EventStore::handleSync(const mtx::responses::Timeline &events)
emit beginResetModel(); emit beginResetModel();
this->first = std::numeric_limits<uint64_t>::max(); this->first = std::numeric_limits<uint64_t>::max();
this->last = std::numeric_limits<uint64_t>::max(); this->last = std::numeric_limits<uint64_t>::max();
decryptedEvents_.clear();
events_.clear();
emit endResetModel(); emit endResetModel();
return; return;
} }
@ -273,6 +282,9 @@ EventStore::handleSync(const mtx::responses::Timeline &events)
emit beginResetModel(); emit beginResetModel();
this->last = range->last; this->last = range->last;
this->first = range->first; this->first = range->first;
decryptedEvents_.clear();
events_.clear();
emit endResetModel(); emit endResetModel();
} else if (range->last > this->last) { } else if (range->last > this->last) {
emit beginInsertRows(toExternalIdx(this->last + 1), toExternalIdx(range->last)); emit beginInsertRows(toExternalIdx(this->last + 1), toExternalIdx(range->last));
@ -543,12 +555,21 @@ EventStore::decryptEvent(const IdIndex &idx,
if (decryptionResult.error) { if (decryptionResult.error) {
switch (*decryptionResult.error) { switch (*decryptionResult.error) {
case olm::DecryptionErrorCode::MissingSession: { case olm::DecryptionErrorCode::MissingSession:
dummy.content.body = case olm::DecryptionErrorCode::MissingSessionIndex: {
tr("-- Encrypted Event (No keys found for decryption) --", if (decryptionResult.error == olm::DecryptionErrorCode::MissingSession)
"Placeholder, when the message was not decrypted yet or can't be " dummy.content.body =
"decrypted.") tr("-- Encrypted Event (No keys found for decryption) --",
.toStdString(); "Placeholder, when the message was not decrypted yet or can't "
"be "
"decrypted.")
.toStdString();
else
dummy.content.body =
tr("-- Encrypted Event (Key not valid for this index) --",
"Placeholder, when the message can't be decrypted with this "
"key since it is not valid for this index ")
.toStdString();
nhlog::crypto()->info("Could not find inbound megolm session ({}, {}, {})", nhlog::crypto()->info("Could not find inbound megolm session ({}, {}, {})",
index.room_id, index.room_id,
index.session_id, index.session_id,
@ -760,7 +781,8 @@ EventStore::fetchMore()
if (cache::client()->previousBatchToken(room_id_) != opts.from) { if (cache::client()->previousBatchToken(room_id_) != opts.from) {
nhlog::net()->warn("Cache cleared while fetching more messages, dropping " nhlog::net()->warn("Cache cleared while fetching more messages, dropping "
"/messages response"); "/messages response");
emit fetchedMore(); if (!opts.to.empty())
emit fetchedMore();
return; return;
} }
if (err) { if (err) {

View File

@ -251,12 +251,14 @@ InputBar::openFileSelection()
} }
void void
InputBar::message(QString msg) InputBar::message(QString msg, MarkdownOverride useMarkdown)
{ {
mtx::events::msg::Text text = {}; mtx::events::msg::Text text = {};
text.body = msg.trimmed().toStdString(); text.body = msg.trimmed().toStdString();
if (ChatPage::instance()->userSettings()->markdown()) { if ((ChatPage::instance()->userSettings()->markdown() &&
useMarkdown == MarkdownOverride::NOT_SPECIFIED) ||
useMarkdown == MarkdownOverride::ON) {
text.formatted_body = utils::markdownToHtml(msg).toStdString(); text.formatted_body = utils::markdownToHtml(msg).toStdString();
// Don't send formatted_body, when we don't need to // Don't send formatted_body, when we don't need to
@ -477,6 +479,10 @@ InputBar::command(QString command, QString args)
room->clearTimeline(); room->clearTimeline();
} else if (command == "rotate-megolm-session") { } else if (command == "rotate-megolm-session") {
cache::dropOutboundMegolmSession(room->roomId().toStdString()); cache::dropOutboundMegolmSession(room->roomId().toStdString());
} else if (command == "md") {
message(args, MarkdownOverride::ON);
} else if (command == "plain") {
message(args, MarkdownOverride::OFF);
} }
} }

View File

@ -12,6 +12,13 @@ class QMimeData;
class QDropEvent; class QDropEvent;
class QStringList; class QStringList;
enum class MarkdownOverride
{
NOT_SPECIFIED, // no override set
ON,
OFF,
};
class InputBar : public QObject class InputBar : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -41,7 +48,7 @@ public slots:
void updateState(int selectionStart, int selectionEnd, int cursorPosition, QString text); void updateState(int selectionStart, int selectionEnd, int cursorPosition, QString text);
void openFileSelection(); void openFileSelection();
bool uploading() const { return uploading_; } bool uploading() const { return uploading_; }
void message(QString body); void message(QString body, MarkdownOverride useMarkdown = MarkdownOverride::NOT_SPECIFIED);
QObject *completerFor(QString completerName); QObject *completerFor(QString completerName);

View File

@ -5,6 +5,7 @@
#include <type_traits> #include <type_traits>
#include <QCache> #include <QCache>
#include <QDesktopServices>
#include <QFileDialog> #include <QFileDialog>
#include <QMimeDatabase> #include <QMimeDatabase>
#include <QRegularExpression> #include <QRegularExpression>
@ -353,7 +354,8 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
return QVariant(emojiCount); return QVariant(emojiCount);
} }
case Body: case Body:
return QVariant(utils::replaceEmoji(QString::fromStdString(body(event)))); return QVariant(
utils::replaceEmoji(QString::fromStdString(body(event)).toHtmlEscaped()));
case FormattedBody: { case FormattedBody: {
const static QRegularExpression replyFallback( const static QRegularExpression replyFallback(
"<mx-reply>.*</mx-reply>", QRegularExpression::DotMatchesEverythingOption); "<mx-reply>.*</mx-reply>", QRegularExpression::DotMatchesEverythingOption);
@ -797,9 +799,9 @@ TimelineModel::viewDecryptedRawMessage(QString id) const
} }
void void
TimelineModel::openUserProfile(QString userid) TimelineModel::openUserProfile(QString userid, bool global)
{ {
emit openProfile(new UserProfile(room_id_, userid, manager_, this)); emit openProfile(new UserProfile(global ? "" : room_id_, userid, manager_, this));
} }
void void
@ -1072,6 +1074,14 @@ TimelineModel::addPendingMessage(mtx::events::collections::TimelineEvents event)
std::visit(SendMessageVisitor{this}, event); std::visit(SendMessageVisitor{this}, event);
} }
void
TimelineModel::openMedia(QString eventId)
{
cacheMedia(eventId, [](QString filename) {
QDesktopServices::openUrl(QUrl::fromLocalFile(filename));
});
}
bool bool
TimelineModel::saveMedia(QString eventId) const TimelineModel::saveMedia(QString eventId) const
{ {
@ -1148,7 +1158,7 @@ TimelineModel::saveMedia(QString eventId) const
} }
void void
TimelineModel::cacheMedia(QString eventId) TimelineModel::cacheMedia(QString eventId, std::function<void(const QString)> callback)
{ {
mtx::events::collections::TimelineEvents *event = events.get(eventId.toStdString(), ""); mtx::events::collections::TimelineEvents *event = events.get(eventId.toStdString(), "");
if (!event) if (!event)
@ -1168,12 +1178,13 @@ TimelineModel::cacheMedia(QString eventId)
QString suffix = QMimeDatabase().mimeTypeForName(mimeType).preferredSuffix(); QString suffix = QMimeDatabase().mimeTypeForName(mimeType).preferredSuffix();
const auto url = mxcUrl.toStdString(); const auto url = mxcUrl.toStdString();
const auto name = QString(mxcUrl).remove("mxc://");
QFileInfo filename(QString("%1/media_cache/%2.%3") QFileInfo filename(QString("%1/media_cache/%2.%3")
.arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation))
.arg(QString(mxcUrl).remove("mxc://")) .arg(name)
.arg(suffix)); .arg(suffix));
if (QDir::cleanPath(filename.path()) != filename.path()) { if (QDir::cleanPath(name) != name) {
nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url); nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url);
return; return;
} }
@ -1182,15 +1193,18 @@ TimelineModel::cacheMedia(QString eventId)
if (filename.isReadable()) { if (filename.isReadable()) {
emit mediaCached(mxcUrl, filename.filePath()); emit mediaCached(mxcUrl, filename.filePath());
if (callback) {
callback(filename.filePath());
}
return; return;
} }
http::client()->download( http::client()->download(
url, url,
[this, mxcUrl, filename, url, encryptionInfo](const std::string &data, [this, callback, mxcUrl, filename, url, encryptionInfo](const std::string &data,
const std::string &, const std::string &,
const std::string &, const std::string &,
mtx::http::RequestErr err) { mtx::http::RequestErr err) {
if (err) { if (err) {
nhlog::net()->warn("failed to retrieve image {}: {} {}", nhlog::net()->warn("failed to retrieve image {}: {} {}",
url, url,
@ -1212,6 +1226,10 @@ TimelineModel::cacheMedia(QString eventId)
file.write(QByteArray(temp.data(), (int)temp.size())); file.write(QByteArray(temp.data(), (int)temp.size()));
file.close(); file.close();
if (callback) {
callback(filename.filePath());
}
} catch (const std::exception &e) { } catch (const std::exception &e) {
nhlog::ui()->warn("Error while saving file to: {}", e.what()); nhlog::ui()->warn("Error while saving file to: {}", e.what());
} }
@ -1220,6 +1238,12 @@ TimelineModel::cacheMedia(QString eventId)
}); });
} }
void
TimelineModel::cacheMedia(QString eventId)
{
cacheMedia(eventId, NULL);
}
QString QString
TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg) TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg)
{ {

View File

@ -212,14 +212,16 @@ public:
Q_INVOKABLE void viewRawMessage(QString id) const; Q_INVOKABLE void viewRawMessage(QString id) const;
Q_INVOKABLE void viewDecryptedRawMessage(QString id) const; Q_INVOKABLE void viewDecryptedRawMessage(QString id) const;
Q_INVOKABLE void openUserProfile(QString userid); Q_INVOKABLE void openUserProfile(QString userid, bool global = false);
Q_INVOKABLE void replyAction(QString id); Q_INVOKABLE void replyAction(QString id);
Q_INVOKABLE void readReceiptsAction(QString id) const; Q_INVOKABLE void readReceiptsAction(QString id) const;
Q_INVOKABLE void redactEvent(QString id); Q_INVOKABLE void redactEvent(QString id);
Q_INVOKABLE int idToIndex(QString id) const; Q_INVOKABLE int idToIndex(QString id) const;
Q_INVOKABLE QString indexToId(int index) const; Q_INVOKABLE QString indexToId(int index) const;
Q_INVOKABLE void openMedia(QString eventId);
Q_INVOKABLE void cacheMedia(QString eventId); Q_INVOKABLE void cacheMedia(QString eventId);
Q_INVOKABLE bool saveMedia(QString eventId) const; Q_INVOKABLE bool saveMedia(QString eventId) const;
void cacheMedia(QString eventId, std::function<void(const QString filename)> callback);
std::vector<::Reaction> reactions(const std::string &event_id) std::vector<::Reaction> reactions(const std::string &event_id)
{ {

View File

@ -128,6 +128,10 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
"UserProfile needs to be instantiated on the C++ side"); "UserProfile needs to be instantiated on the C++ side");
static auto self = this; static auto self = this;
qmlRegisterSingletonType<MainWindow>(
"im.nheko", 1, 0, "MainWindow", [](QQmlEngine *, QJSEngine *) -> QObject * {
return MainWindow::instance();
});
qmlRegisterSingletonType<TimelineViewManager>( qmlRegisterSingletonType<TimelineViewManager>(
"im.nheko", 1, 0, "TimelineManager", [](QQmlEngine *, QJSEngine *) -> QObject * { "im.nheko", 1, 0, "TimelineManager", [](QQmlEngine *, QJSEngine *) -> QObject * {
return self; return self;

View File

@ -7,6 +7,8 @@
#include "mtx/responses/crypto.hpp" #include "mtx/responses/crypto.hpp"
#include "timeline/TimelineModel.h" #include "timeline/TimelineModel.h"
#include "timeline/TimelineViewManager.h" #include "timeline/TimelineViewManager.h"
#include <mtx/responses.hpp>
#include <mtx/responses/common.hpp>
UserProfile::UserProfile(QString roomid, UserProfile::UserProfile(QString roomid,
QString userid, QString userid,
@ -44,6 +46,23 @@ UserProfile::UserProfile(QString roomid,
} }
deviceList_.reset(deviceList_.deviceList_); deviceList_.reset(deviceList_.deviceList_);
}); });
connect(this,
&UserProfile::globalUsernameRetrieved,
this,
&UserProfile::setGlobalUsername,
Qt::QueuedConnection);
http::client()->get_profile(
userid_.toStdString(),
[this](const mtx::responses::Profile &res, mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn("failed to retrieve own profile info");
return;
}
emit globalUsernameRetrieved(QString::fromStdString(res.display_name));
});
} }
QHash<int, QByteArray> QHash<int, QByteArray>
@ -97,7 +116,7 @@ UserProfile::userid()
QString QString
UserProfile::displayName() UserProfile::displayName()
{ {
return cache::displayName(roomid_, userid_); return isGlobalUserProfile() ? globalUsername : cache::displayName(roomid_, userid_);
} }
QString QString
@ -106,6 +125,12 @@ UserProfile::avatarUrl()
return cache::avatarUrl(roomid_, userid_); return cache::avatarUrl(roomid_, userid_);
} }
bool
UserProfile::isGlobalUserProfile() const
{
return roomid_ == "";
}
bool bool
UserProfile::getUserStatus() UserProfile::getUserStatus()
{ {
@ -213,6 +238,40 @@ UserProfile::startChat()
ChatPage::instance()->startChat(this->userid_); ChatPage::instance()->startChat(this->userid_);
} }
void
UserProfile::changeUsername(QString username)
{
if (isGlobalUserProfile()) {
// change global
http::client()->set_displayname(
username.toStdString(), [this](mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn("could not change username");
return;
}
});
} else {
// change room username
mtx::events::state::Member member;
member.display_name = username.toStdString();
member.avatar_url =
cache::avatarUrl(roomid_,
QString::fromStdString(http::client()->user_id().to_string()))
.toStdString();
member.membership = mtx::events::state::Membership::Join;
http::client()->send_state_event(
roomid_.toStdString(),
http::client()->user_id().to_string(),
member,
[](mtx::responses::EventId, mtx::http::RequestErr err) {
if (err)
nhlog::net()->error("Failed to set room displayname: {}",
err->matrix_error.error);
});
}
}
void void
UserProfile::verify(QString device) UserProfile::verify(QString device)
{ {
@ -228,3 +287,10 @@ UserProfile::unverify(QString device)
{ {
cache::markDeviceUnverified(userid_.toStdString(), device.toStdString()); cache::markDeviceUnverified(userid_.toStdString(), device.toStdString());
} }
void
UserProfile::setGlobalUsername(const QString &globalUser)
{
globalUsername = globalUser;
emit displayNameChanged();
}

View File

@ -79,10 +79,11 @@ private:
class UserProfile : public QObject class UserProfile : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString displayName READ displayName CONSTANT) Q_PROPERTY(QString displayName READ displayName NOTIFY displayNameChanged)
Q_PROPERTY(QString userid READ userid CONSTANT) Q_PROPERTY(QString userid READ userid CONSTANT)
Q_PROPERTY(QString avatarUrl READ avatarUrl CONSTANT) Q_PROPERTY(QString avatarUrl READ avatarUrl CONSTANT)
Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList CONSTANT) Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList CONSTANT)
Q_PROPERTY(bool isGlobalUserProfile READ isGlobalUserProfile CONSTANT)
Q_PROPERTY(bool isUserVerified READ getUserStatus NOTIFY userStatusChanged) Q_PROPERTY(bool isUserVerified READ getUserStatus NOTIFY userStatusChanged)
Q_PROPERTY( Q_PROPERTY(
bool userVerificationEnabled READ userVerificationEnabled NOTIFY userStatusChanged) bool userVerificationEnabled READ userVerificationEnabled NOTIFY userStatusChanged)
@ -98,6 +99,7 @@ public:
QString userid(); QString userid();
QString displayName(); QString displayName();
QString avatarUrl(); QString avatarUrl();
bool isGlobalUserProfile() const;
bool getUserStatus(); bool getUserStatus();
bool userVerificationEnabled() const; bool userVerificationEnabled() const;
bool isSelf() const; bool isSelf() const;
@ -109,12 +111,19 @@ public:
// Q_INVOKABLE void ignoreUser(); // Q_INVOKABLE void ignoreUser();
Q_INVOKABLE void kickUser(); Q_INVOKABLE void kickUser();
Q_INVOKABLE void startChat(); Q_INVOKABLE void startChat();
Q_INVOKABLE void changeUsername(QString username);
signals: signals:
void userStatusChanged(); void userStatusChanged();
void displayNameChanged();
void globalUsernameRetrieved(const QString &globalUser);
protected slots:
void setGlobalUsername(const QString &globalUser);
private: private:
QString roomid_, userid_; QString roomid_, userid_;
QString globalUsername;
DeviceInfoModel deviceList_; DeviceInfoModel deviceList_;
bool isUserVerified = false; bool isUserVerified = false;
bool hasMasterKey = false; bool hasMasterKey = false;