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:
- 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 -->
- Operating System:
- Qt version: <!-- If you compiled it yourself -->

View File

@ -1,5 +1,43 @@
# 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
### Highlights

View File

@ -72,15 +72,16 @@ if(${CMAKE_VERSION} VERSION_LESS "3.14.0")
endmacro()
endif()
include(GNUInstallDirs)
# Include Qt basic functions
include(QtCommon)
project(nheko LANGUAGES CXX C)
include(GNUInstallDirs)
set(CPACK_PACKAGE_VERSION_MAJOR "0")
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_MINOR ${CPACK_PACKAGE_VERSION_MINOR})
set(PROJECT_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH})
@ -260,7 +261,7 @@ set(SRC_FILES
# Emoji
src/emoji/EmojiModel.cpp
src/emoji/Provider_new.cpp
src/emoji/Provider.cpp
# Timeline
@ -354,13 +355,13 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare(
MatrixClient
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_TESTS OFF CACHE INTERNAL "")
FetchContent_MakeAvailable(MatrixClient)
else()
find_package(MatrixClient 0.4.0 REQUIRED)
find_package(MatrixClient 0.4.1 REQUIRED)
endif()
if(USE_BUNDLED_OLM)
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://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/)
[![#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)

View File

@ -23,15 +23,15 @@ build:
install:
- 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
build_script:
# VERSION format: branch-master/branch-1.2
# INSTVERSION format: x.y.z
# 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 VERSION=0.8.0
- if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.8.1
- 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" set WINVERSION=%INSTVERSION%.0.%APPVEYOR_BUILD_NUMBER%
# VERSION format: v1.2.3/v1.3.4
@ -46,7 +46,6 @@ build_script:
- echo %DATE%
# Build nheko
#- cmake -G "Visual Studio 15 2017 Win64" -H. -Bbuild
- cmake -G "Visual Studio 16 2019" -A x64 -H. -Bbuild
-DHUNTER_ROOT="C:\hunter"
-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\installscript.qs installer\packages\io.github.nhekoreborn.nheko.cleanup\meta
# Amend version and date
- sed -i "s/__VERSION__/0.8.0/" 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.0/" installer\packages\io.github.nhekoreborn.nheko.cleanup\meta\package.xml
- sed -i "s/__VERSION__/0.8.1/" installer\config\config.xml
- sed -i "s/__VERSION__/0.8.1/" installer\packages\io.github.nhekoreborn.nheko\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.cleanup\meta\package.xml
# Copy nheko data

View File

@ -220,8 +220,8 @@
"name": "mtxclient",
"sources": [
{
"commit": "2d6e3f79917ce2065a54ca32e6a9f9d42c0b6347",
"tag": "v0.4.0",
"commit": "4951190c938740defa0988d98d5e861038622936",
"tag": "v0.4.1",
"type": "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>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</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>
</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>
<translation type="unfinished"></translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation type="unfinished">
@ -1266,12 +1300,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1352,6 +1386,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1464,7 +1503,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1487,7 +1526,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>Eingeladener Benutzer: %1</translation>
</message>
@ -274,13 +274,18 @@
<message>
<location line="+54"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
<translation>Kontte %1 nicht aus %2 entfernen: %3</translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Alle Räume</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<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>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation>Alle Dateien (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation>
</message>
@ -599,7 +610,12 @@ Wenn Nheko deinen Server nicht automatisch erkennen kann, wird es dich nach dem
<translation>Passwort</translation>
</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>
<translation>Gerätename</translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation>Die Adresse unter der dein Heimserver erreichbar ist.
@ -617,12 +643,20 @@ Beispiel: https://mein.server:8787</translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>ANMELDEN</translation>
</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>
<translation>Automatische Erkennung fehlgeschlagen. Antwort war fehlerhaft.</translation>
</message>
@ -767,7 +801,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Schreibe eine Nachricht</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -874,7 +908,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>QCoreApplication</name>
<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>
<translation>Benutze ein separates profil, wodurch mehrere Accounts und Nhekoinstanzen zur gleichen Zeit verwendet werden können.</translation>
</message>
@ -977,7 +1011,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>keine Version gespeichert</translation>
</message>
@ -1019,7 +1053,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Fügt einen Tag hinzu oder entfernt ihn.</translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Neuer Tag...</translation>
@ -1119,7 +1153,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
</message>
@ -1130,7 +1164,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Event konnte nicht verschlüsselt werden, senden wurde abgebrochen!</translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Bild speichern</translation>
</message>
@ -1150,7 +1184,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Datei speichern</translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1269,12 +1303,12 @@ Beispiel: https://mein.server:8787</translation>
<translation>%1 hat das Anklopfen zurückgezogen.</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>Hat das Anklopfen von %1 abgewiesen.</translation>
</message>
@ -1355,6 +1389,11 @@ Beispiel: https://mein.server:8787</translation>
<source>Save as</source>
<translation>Speichern unter...</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Öffne in externen Programm</translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1467,7 +1506,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation>Verifizieren</translation>
</message>
@ -1490,7 +1529,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Ins Benachrichtigungsfeld minimieren</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Όλα τα αρχεία (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Κωδικός</translation>
</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>
<translation type="unfinished"></translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>ΕΙΣΟΔΟΣ</translation>
</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>
<translation type="unfinished"></translation>
</message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Γράψε ένα μήνυμα...</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation type="unfinished">Αποθήκευση Εικόνας</translation>
</message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation type="unfinished">
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Ελαχιστοποίηση</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>Invited user: %1</translation>
</message>
@ -274,13 +274,18 @@
<message>
<location line="+54"/>
<source>Failed to kick %1 from %2: %3</source>
<translation type="unfinished"></translation>
<translation>Failed to kick %1 from %2: %3</translation>
</message>
</context>
<context>
<name>CommunitiesListItem</name>
<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>
<translation>All rooms</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<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>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation>All Files (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation>Failed to upload media. Please try again.</translation>
</message>
@ -599,7 +610,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Password</translation>
</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>
<translation>Device name</translation>
</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>
</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.
Example: https://server.my:8787</source>
<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>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>LOGIN</translation>
</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>
<translation>Autodiscovery failed. Received malformed response.</translation>
</message>
@ -767,7 +801,7 @@ Example: https://server.my:8787</translation>
<translation>Write a message</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -874,7 +908,7 @@ Example: https://server.my:8787</translation>
<context>
<name>QCoreApplication</name>
<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>
<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>
@ -977,7 +1011,7 @@ Example: https://server.my:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>no version stored</translation>
</message>
@ -1019,7 +1053,7 @@ Example: https://server.my:8787</translation>
<translation>Adds or removes the specified tag.</translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>New tag</translation>
@ -1119,7 +1153,7 @@ Example: https://server.my:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Message redaction failed: %1</translation>
</message>
@ -1130,7 +1164,7 @@ Example: https://server.my:8787</translation>
<translation>Failed to encrypt event, sending aborted!</translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Save image</translation>
</message>
@ -1150,7 +1184,7 @@ Example: https://server.my:8787</translation>
<translation>Save file</translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1269,12 +1303,12 @@ Example: https://server.my:8787</translation>
<translation>%1 redacted their knock.</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>Rejected the knock from %1.</translation>
</message>
@ -1355,6 +1389,11 @@ Example: https://server.my:8787</translation>
<source>Save as</source>
<translation>Save as</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Open in external program</translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1467,7 +1506,7 @@ Example: https://server.my:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation>Verify</translation>
</message>
@ -1490,7 +1529,7 @@ Example: https://server.my:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Minimize to tray</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -281,7 +281,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Ĉiuj ĉambroj</translation>
</message>
@ -475,11 +480,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -558,7 +569,7 @@
<translation type="unfinished">Ĉiuj dosieroj (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</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>
</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>
<translation>Aparata nomo</translation>
</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>
</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.
Example: https://server.my:8787</source>
<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>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translatorcomment>Maybe shouldn&apos;t be imperative?</translatorcomment>
<translation>ENSALUTU</translation>
</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>
<translation type="unfinished"></translation>
</message>
@ -768,7 +802,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished">Skribu mesaĝon...</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -875,7 +909,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -978,7 +1012,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1020,7 +1054,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Nova etikedo...</translation>
@ -1122,7 +1156,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1133,7 +1167,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1153,7 +1187,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1274,12 +1308,12 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1360,6 +1394,11 @@ Ekzemplo: https://servisto.mia:8787</translation>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1472,7 +1511,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1495,7 +1534,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Sa liitusid selle jututoaga.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>Kutsutud kasutaja: %1</translation>
</message>
@ -274,13 +274,18 @@
<message>
<location line="+54"/>
<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>
</context>
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Kõik jututoad</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<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>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation>Kõik failid (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation>
</message>
@ -599,7 +610,12 @@ Kui Nheko ei suuda tuvastada sinu koduserverit, siis ta kuvab sulle andmevälja
<translation>Salasõna</translation>
</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>
<translation>Seadme nimi</translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation>Aadress, mida sinu koduserveri kliendipoole API kasutab.
@ -617,12 +643,20 @@ Näiteks: https://server.minu:8787</translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>LOGI SISSE</translation>
</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>
<translation>Koduserveri automaatne tuvastamine ei õnnestunud: päringuvastus oli vigane.</translation>
</message>
@ -767,7 +801,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Kirjuta sõnum</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -874,7 +908,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>QCoreApplication</name>
<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>
<translation>Loo unikaalne profiil, mis võimaldab sul logida samaaegselt sisse erinevatele kasutajakontodele ning käivitada mitu Nheko programmiakent.</translation>
</message>
@ -977,7 +1011,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>salvestatud versiooni ei leidu</translation>
</message>
@ -1019,7 +1053,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Lisab või eemaldab selle sildi.</translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Uus silt</translation>
@ -1119,7 +1153,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation>
</message>
@ -1130,7 +1164,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Sündmuse krüptimine ei õnnestunud, katkestame saatmise!</translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Salvesta pilt</translation>
</message>
@ -1150,7 +1184,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Salvesta fail</translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1269,12 +1303,12 @@ Näiteks: https://server.minu:8787</translation>
<translation>%1 muutis oma koputust jututoa uksele.</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>Sa liitusid jututoaga.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>Lükkas tagasi %1 koputuse jututoa uksele.</translation>
</message>
@ -1355,6 +1389,11 @@ Näiteks: https://server.minu:8787</translation>
<source>Save as</source>
<translation>Salvesta kui</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation>Ava välise rakendusega</translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1467,7 +1506,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation>Verifitseeri</translation>
</message>
@ -1490,7 +1529,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Vähenda tegumiribale</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -94,7 +94,7 @@
<message>
<location line="+11"/>
<source>Accept</source>
<translation type="unfinished">Hyväksy</translation>
<translation>Hyväksy</translation>
</message>
<message>
<location line="+12"/>
@ -109,7 +109,7 @@
<message>
<location line="+13"/>
<source>Decline</source>
<translation type="unfinished">Hylkää</translation>
<translation>Hylkää</translation>
</message>
<message>
<location line="-28"/>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Kaikki huoneet</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<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>
</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>
<location line="+32"/>
<location line="+63"/>
@ -554,10 +565,10 @@
<message>
<location line="+0"/>
<source>All Files (*)</source>
<translation type="unfinished">Kaikki Tiedostot (*)</translation>
<translation>Kaikki Tiedostot (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Salasana</translation>
</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>
<translation>Laitteen nimi</translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>KIRJAUDU</translation>
</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>
<translation>Palvelimen tietojen hakeminen epäonnistui: virheellinen vastaus.</translation>
</message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation>Kirjoita viesti</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished">Emoji</translation>
</message>
@ -856,7 +890,7 @@ Example: https://server.my:8787</source>
<message>
<location line="+13"/>
<source>Cancel</source>
<translation type="unfinished">Peruuta</translation>
<translation>Peruuta</translation>
</message>
</context>
<context>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>ei tallennettua versiota</translation>
</message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Viestin muokkaus epäonnistui: %1</translation>
</message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Tallenna kuva</translation>
</message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Pienennä ilmoitusalueelle</translation>
</message>
@ -1856,7 +1895,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location line="+0"/>
<source>All Files (*)</source>
<translation type="unfinished">Kaikki Tiedostot (*)</translation>
<translation>Kaikki Tiedostot (*)</translation>
</message>
<message>
<location line="+225"/>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>%1 a é invité(e)</translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Tous les salons</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<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>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation>Tous les types de fichiers (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation>Échec de l&apos;envoi du média. Veuillez réessayer.</translation>
</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>
</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>
<translation>Nom de l&apos;appareil</translation>
</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>
</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.
Example: https://server.my:8787</source>
<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>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>CONNEXION</translation>
</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>
<translation>Échec de la découverte automatique. Réponse mal formatée reçue.</translation>
</message>
@ -767,7 +801,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Écrivez un message</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation>Émoji</translation>
</message>
@ -874,7 +908,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>QCoreApplication</name>
<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>
<translation>Créer un profil unique, vous permettant de vous connecter simultanément à plusieurs comptes et à lancer plusieurs instances de nheko.</translation>
</message>
@ -977,7 +1011,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>pas de version enregistrée</translation>
</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>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Nouvelle étiquette</translation>
@ -1119,7 +1153,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Échec de la suppression du message&#xa0;: %1</translation>
</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>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Enregistrer l&apos;image</translation>
</message>
@ -1150,7 +1184,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Enregistrer le fichier</translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1269,12 +1303,12 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>%1 ne frappe plus au salon.</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>%1 a é rejeté après avoir frappé au salon.</translation>
</message>
@ -1355,6 +1389,11 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<source>Save as</source>
<translation>Enregistrer sous</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1467,7 +1506,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation>Vérifier</translation>
</message>
@ -1490,7 +1529,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Réduire à la barre des tâches</translation>
</message>

File diff suppressed because it is too large Load Diff

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>Invitato utente: %1</translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Tutte le stanze</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<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>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Tutti i File (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished">Impossibile inviare il file multimediale. Per favore riprova.</translation>
</message>
@ -599,7 +610,12 @@ Se Nheko non conclude la ricerca del tuo homeserver, ti mostrerà un campo in cu
<translation>Password</translation>
</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>
<translation>Nome del dispositivo</translation>
</message>
@ -609,7 +625,17 @@ Se Nheko non conclude la ricerca del tuo homeserver, ti mostrerà un campo in cu
<translation type="unfinished"></translation>
</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.
Example: https://server.my:8787</source>
<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>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>ACCEDI</translation>
</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>
<translation>Ricerca automatica fallita. Ricevuta risposta malformata.</translation>
</message>
@ -767,7 +801,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished">Scrivi un messaggio</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished">Emoji</translation>
</message>
@ -874,7 +908,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -977,7 +1011,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>nessuna versione memorizzata</translation>
</message>
@ -1019,7 +1053,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished">Aggiungi o rimuovi il tag specificato.</translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1119,7 +1153,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Oscuramento del messaggio fallito: %1</translation>
</message>
@ -1130,7 +1164,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Salva immagine</translation>
</message>
@ -1150,7 +1184,7 @@ Esempio: https://server.mio:8787</translation>
<translation>Salva file</translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1269,12 +1303,12 @@ Esempio: https://server.mio:8787</translation>
<translation>%1 ha oscurato la sua bussata.</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>Rifiutata la bussata di %1.</translation>
</message>
@ -1355,6 +1389,11 @@ Esempio: https://server.mio:8787</translation>
<source>Save as</source>
<translation>Salva come</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1467,7 +1506,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1490,7 +1529,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Minimizza nella tray</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>: %1</translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation></translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- () --</translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished"> (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation></translation>
</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>
<translation></translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation></translation>
</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>
<translation></translation>
</message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">...</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation></translation>
</message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>: %1</translation>
</message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation></translation>
</message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1264,12 +1298,12 @@ Example: https://server.my:8787</source>
<translation>%1</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>%1</translation>
</message>
@ -1350,6 +1384,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1462,7 +1501,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1485,7 +1524,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation></translation>
</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>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
<translation>Je bent lid geworden van deze kamer.</translation>
</message>
</context>
<context>
@ -122,13 +122,13 @@
<message>
<location filename="../../src/ChatPage.cpp" line="+211"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
<translation>Gebruiker uitnodigen mislukt: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
<translation>Gebruiker uitgenodigd: %1</translation>
</message>
<message>
<location line="-500"/>
@ -138,7 +138,7 @@
<message>
<location line="+456"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
<translation>Kamer %1 gecreëerd.</translation>
</message>
<message>
<location line="+27"/>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Alle bestanden (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Wachtwoord</translation>
</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>
<translation type="unfinished"></translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>INLOGGEN</translation>
</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>
<translation type="unfinished"></translation>
</message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Typ een bericht...</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation type="unfinished">Afbeelding opslaan</translation>
</message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation type="unfinished">
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Je bent lid geworden van deze kamer.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Minimaliseren naar systeemvak</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Dołączyłeś(-ł) do tego pokoju.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Wszystkie pokoje</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<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>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Wszystkie pliki (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -598,7 +609,12 @@ Jeżeli Nheko nie odnajdzie Twojego serwera domowego, wyświetli formularz umoż
<translation>Hasło</translation>
</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>
<translation>Nazwa urządzenia</translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>ZALOGUJ</translation>
</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>
<translation>Automatyczne odkrywanie zakończone niepowodzeniem. Otrzymano nieprawidłową odpowiedź.</translation>
</message>
@ -765,7 +799,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Napisz wiadomość</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished">Emoji</translation>
</message>
@ -872,7 +906,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation>Stwórz unikalny profil, który pozwoli Ci na zalogowanie się do kilku kont jednocześnie i uruchomienie wielu instancji Nheko.</translation>
</message>
@ -975,7 +1009,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1017,7 +1051,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1117,7 +1151,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
</message>
@ -1128,7 +1162,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation type="unfinished">Zapisz obraz</translation>
</message>
@ -1148,7 +1182,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation type="unfinished">
@ -1268,12 +1302,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished">Dołączyłeś(-ł) do tego pokoju.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1354,6 +1388,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1466,7 +1505,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1489,7 +1528,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Zminimalizuj do paska zadań</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</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>
</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>
<translation type="unfinished"></translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation type="unfinished">
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Te-ai alăturat camerei.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>Utilizator invitat: %1</translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Toate camerele</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">Toate fișierele (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</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>
</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>
<translation>Nume dispozitiv</translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation>Adresa la care se poate contacta APIul homeserverului dumneavoastră.
@ -617,12 +643,20 @@ Exemplu: https://serverul.meu:8787</translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>CONECTARE</translation>
</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>
<translation>Autodescoperirea a eșuat. Răspunsul primit este defectuos.</translation>
</message>
@ -767,7 +801,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -874,7 +908,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -977,7 +1011,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>nicio versiune stocată</translation>
</message>
@ -1019,7 +1053,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1119,7 +1153,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Redactare mesaj eșuată: %1</translation>
</message>
@ -1130,7 +1164,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Salvați imaginea</translation>
</message>
@ -1150,7 +1184,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Salvați fișier</translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1270,12 +1304,12 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>%1 și-a redactat ciocănitul.</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>Te-ai alăturat camerei.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>Ciocănit refuzat de la %1.</translation>
</message>
@ -1356,6 +1390,11 @@ Exemplu: https://serverul.meu:8787</translation>
<source>Save as</source>
<translation>Salvare ca</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1468,7 +1507,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1491,7 +1530,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Minimizează în bara de notificări</translation>
</message>

View File

@ -6,18 +6,18 @@
<message>
<location filename="../qml/voip/ActiveCallBar.qml" line="+66"/>
<source>Calling...</source>
<translation type="unfinished"></translation>
<translation>Вызов...</translation>
</message>
<message>
<location line="+10"/>
<location line="+10"/>
<source>Connecting...</source>
<translation type="unfinished"></translation>
<translation>Соединение...</translation>
</message>
<message>
<location line="+76"/>
<source>Toggle camera view</source>
<translation type="unfinished"></translation>
<translation>Сменить вид камеры</translation>
</message>
<message>
<location line="+13"/>
@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Вы присоединились к этой комнате.</translation>
</message>
@ -61,17 +61,17 @@
<message>
<location filename="../qml/voip/CallInvite.qml" line="+66"/>
<source>Video Call</source>
<translation type="unfinished">Видео Звонок</translation>
<translation>Видео Звонок</translation>
</message>
<message>
<location line="+0"/>
<source>Voice Call</source>
<translation type="unfinished">Голосовой Звонок</translation>
<translation>Голосовой Звонок</translation>
</message>
<message>
<location line="+62"/>
<source>No microphone found.</source>
<translation type="unfinished">Микрофон не найден.</translation>
<translation>Микрофон не найден.</translation>
</message>
</context>
<context>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>Приглашенный пользователь: %1</translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Все комнаты</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Зашифрованное событие (Нет найдено ключей для дешифрования) --</translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation>Все файлы (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation>Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation>
</message>
@ -599,7 +610,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Пароль</translation>
</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>
<translation>Имя устройства</translation>
</message>
@ -609,7 +625,17 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation>Имя устройства, которое будет отображаться для других, когда верифицируют ваше устройство. Если не предоставить имя устройста,то будет использоваться имя по умолчанию.</translation>
</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.
Example: https://server.my:8787</source>
<translation>Адрес который будет использоваться для связи клиентского API вашего домашнего сервера.
@ -617,12 +643,20 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>ВОЙТИ</translation>
</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>
<translation>Автообноружение не удалось. Получен поврежденный ответ.</translation>
</message>
@ -767,7 +801,7 @@ Example: https://server.my:8787</source>
<translation>Написать сообщение</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation>Эмоджи</translation>
</message>
@ -874,7 +908,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation>Создать уникальный профиль, который позволяет вести несколько аккаунтов и запускать множество сущностей nheko. </translation>
</message>
@ -977,7 +1011,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>нет сохраненной версии</translation>
</message>
@ -1019,7 +1053,7 @@ Example: https://server.my:8787</source>
<translation>Добавить или удалить выбранные тэг.</translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Добавить новый тег для комнаты</translation>
@ -1119,7 +1153,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Ошибка редактирования сообщения: %1</translation>
</message>
@ -1130,7 +1164,7 @@ Example: https://server.my:8787</source>
<translation>Не удалось зашифровать сообщение, отправка отменена!</translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Сохранить изображение</translation>
</message>
@ -1150,7 +1184,7 @@ Example: https://server.my:8787</source>
<translation>Сохранить файл</translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1270,12 +1304,12 @@ Example: https://server.my:8787</source>
<translation>%1 отредактировал его &quot;стук&quot;.</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>Вы присоединились к этой комнате.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>Отверг &quot;стук&quot; от %1</translation>
</message>
@ -1356,6 +1390,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation>Сохранить как</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1468,7 +1507,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation>Верифицировать</translation>
</message>
@ -1491,7 +1530,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Сворачивать в системную панель</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</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>
</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>
<translation type="unfinished"></translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation type="unfinished">
@ -1265,12 +1299,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1351,6 +1385,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1463,7 +1502,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1486,7 +1525,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation>Du gick med i detta rum.</translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>Bjöd in användare: %1</translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation>Alla rum</translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<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>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation>Alla Filer (*)</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation>Kunde inte ladda upp media. Vänligen försök igen.</translation>
</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>
</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>
<translation>Enhetsnamn</translation>
</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>
</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.
Example: https://server.my:8787</source>
<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>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation>INLOGGNING</translation>
</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>
<translation>Autouppslag misslyckades. Mottog felkonstruerat svar.</translation>
</message>
@ -767,7 +801,7 @@ Exempel: https://server.my:8787</translation>
<translation>Skriv ett meddelande</translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -874,7 +908,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>QCoreApplication</name>
<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>
<translation>Skapa en unik profil, vilket tillåter dig att logga in flera konton samtidigt och starta flera instanser av Nheko.</translation>
</message>
@ -977,7 +1011,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation>ingen version lagrad</translation>
</message>
@ -1019,7 +1053,7 @@ Exempel: https://server.my:8787</translation>
<translation>Lägger till eller tar bort den angivna taggen.</translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation>Ny tagg</translation>
@ -1119,7 +1153,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation>Kunde inte maskera meddelande: %1</translation>
</message>
@ -1130,7 +1164,7 @@ Exempel: https://server.my:8787</translation>
<translation>Kunde inte kryptera event, sändning avbruten!</translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation>Spara bild</translation>
</message>
@ -1150,7 +1184,7 @@ Exempel: https://server.my:8787</translation>
<translation>Spara fil</translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation>
@ -1269,12 +1303,12 @@ Exempel: https://server.my:8787</translation>
<translation>%1 maskerade sin knackning.</translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation>Du gick med i detta rum.</translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation>Avvisade knackningen från %1.</translation>
</message>
@ -1355,6 +1389,11 @@ Exempel: https://server.my:8787</translation>
<source>Save as</source>
<translation>Spara som</translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1467,7 +1506,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation>Bekräfta</translation>
</message>
@ -1490,7 +1529,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation>Minimera till systemtråg</translation>
</message>

View File

@ -51,7 +51,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1951"/>
<location filename="../../src/Cache.cpp" line="+1978"/>
<source>You joined this room.</source>
<translation></translation>
</message>
@ -126,7 +126,7 @@
</message>
<message>
<location line="+4"/>
<location line="+779"/>
<location line="+796"/>
<source>Invited user: %1</source>
<translation>: %1</translation>
</message>
@ -280,7 +280,12 @@
<context>
<name>CommunitiesListItem</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -474,11 +479,17 @@
<context>
<name>EventStore</name>
<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>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</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>
<location line="+32"/>
<location line="+63"/>
@ -557,7 +568,7 @@
<translation type="unfinished">*</translation>
</message>
<message>
<location line="+334"/>
<location line="+340"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -596,7 +607,12 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<translation></translation>
</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>
<translation></translation>
</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>
</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.
Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+217"/>
<location line="+218"/>
<source>LOGIN</source>
<translation></translation>
</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>
<translation type="unfinished"></translation>
</message>
@ -763,7 +797,7 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+152"/>
<location line="+170"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -870,7 +904,7 @@ Example: https://server.my:8787</source>
<context>
<name>QCoreApplication</name>
<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>
<translation type="unfinished"></translation>
</message>
@ -973,7 +1007,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+1859"/>
<location filename="../../src/Cache.cpp" line="+1868"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1015,7 +1049,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+38"/>
<location line="+39"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
@ -1115,7 +1149,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+864"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">%1</translation>
</message>
@ -1126,7 +1160,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+164"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1146,7 +1180,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+129"/>
<location line="+143"/>
<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>
<translation type="unfinished">
@ -1264,12 +1298,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-749"/>
<location line="-771"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+751"/>
<location line="+773"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1350,6 +1384,11 @@ Example: https://server.my:8787</source>
<source>Save as</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Open in external program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+51"/>
<source>No room open</source>
@ -1462,7 +1501,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+53"/>
<location filename="../qml/UserProfile.qml" line="+54"/>
<source>Verify</source>
<translation type="unfinished"></translation>
</message>
@ -1485,7 +1524,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+781"/>
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
<source>Minimize to tray</source>
<translation></translation>
</message>

View File

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

View File

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

View File

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

View File

@ -35,7 +35,7 @@ Page {
colors: palette
model: EmojiProxyModel {
category: EmojiCategory.People
category: Emoji.Category.People
sourceModel: EmojiModel {
}
@ -125,6 +125,13 @@ Page {
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 {

View File

@ -10,10 +10,19 @@ ApplicationWindow {
property var profile
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
height: 650
width: 420
minimumHeight: 420
palette: colors
color: colors.window
title: profile.isGlobalUserProfile ? "Global User Profile" : "Room User Profile"
Shortcut {
sequence: StandardKey.Cancel
onActivated: userProfileDialog.close()
}
ColumnLayout {
id: contentL
@ -32,13 +41,42 @@ ApplicationWindow {
onClicked: TimelineManager.openImageOverlay(TimelineManager.timeline.avatarUrl(userid), TimelineManager.timeline.data.id)
}
Label {
TextInput {
id: displayUsername
property bool isUsernameEditingAllowed
readOnly: !isUsernameEditingAllowed
text: profile.displayName
fontSizeMode: Text.HorizontalFit
font.pixelSize: 20
color: TimelineManager.userColor(profile.userid, colors.window)
font.bold: true
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 {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -11,26 +11,13 @@ class Emoji(object):
self.code = repr(code.encode('utf-8'))[1:].strip("'")
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):
tmpl = Template('''
const QVector<Emoji> emoji::Provider::emoji = {
{%- for c in kwargs.items() %}
// {{ c[0].capitalize() }}
{%- 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 %}
};
@ -93,12 +80,4 @@ if __name__ == '__main__':
# Use xclip to pipe the output to clipboard.
# e.g ./codegen.py emoji.json | xclip -sel clip
generate_code(people, 'people')
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)
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");
// 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")
.arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation))
.arg(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation))
.arg(QString::fromUtf8(localUserId_.toUtf8().toHex()))
.arg(QString::fromUtf8(settings->profile().toUtf8().toHex()));
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_.set_mapsize(DB_SIZE);
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);
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());
return std::nullopt;
}
if (secret.isEmpty()) {
nhlog::db()->debug("Restored empty secret '{}'.", name);
return std::nullopt;
}
return secret.toStdString();
}
@ -1235,11 +1262,11 @@ Cache::saveState(const mtx::responses::Sync &res)
updatedInfo.avatar_url = getRoomAvatarUrl(txn, statesdb, membersdb).toStdString();
updatedInfo.version = getRoomVersion(txn, statesdb).toStdString();
bool has_new_tags = false;
// Process the account_data associated with this room
if (!room.second.account_data.events.empty()) {
auto accountDataDb = getAccountDataDb(txn, room.first);
bool has_new_tags = false;
for (const auto &evt : room.second.account_data.events) {
std::visit(
[&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);
}
}
if (!has_new_tags) {
// retrieve the old tags, they haven't changed
lmdb::val data;
if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room.first), data)) {
try {
RoomInfo tmp = json::parse(
std::string_view(data.data(), data.size()));
updatedInfo.tags = tmp.tags;
} catch (const json::exception &e) {
nhlog::db()->warn(
"failed to parse room info: room_id ({}), {}: {}",
room.first,
std::string(data.data(), data.size()),
e.what());
}
}
if (!has_new_tags) {
// retrieve the old tags, they haven't changed
lmdb::val data;
if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room.first), data)) {
try {
RoomInfo tmp =
json::parse(std::string_view(data.data(), data.size()));
updatedInfo.tags = tmp.tags;
} catch (const json::exception &e) {
nhlog::db()->warn(
"failed to parse room info: room_id ({}), {}: {}",
room.first,
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::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();
room_list_ = new RoomList(userSettings, sideBar_);
connect(room_list_, &RoomList::joinRoom, this, &ChatPage::joinRoom);
@ -267,10 +271,27 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
[this](const QString &groupId) {
current_community_ = groupId;
if (groupId == "world")
room_list_->removeFilter();
else
room_list_->applyFilter(communitiesList_->roomList(groupId));
if (groupId == "world") {
auto hidden = communitiesList_->hiddenTagsAndCommunities();
std::set<QString> roomsToHide = 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,
@ -1299,8 +1320,10 @@ ChatPage::startChat(QString userid)
mtx::requests::CreateRoom req;
req.preset = mtx::requests::Preset::PrivateChat;
req.visibility = mtx::common::RoomVisibility::Private;
if (utils::localUser() != userid)
req.invite = {userid.toStdString()};
if (utils::localUser() != userid) {
req.invite = {userid.toStdString()};
req.is_direct = true;
}
emit ChatPage::instance()->createRoom(req);
}

View File

@ -3,6 +3,7 @@
#include "Logging.h"
#include "MatrixClient.h"
#include "Splitter.h"
#include "UserSettingsPage.h"
#include <mtx/responses/groups.hpp>
#include <nlohmann/json.hpp>
@ -125,9 +126,15 @@ CommunitiesList::setTagsForRoom(const QString &room_id, const std::vector<std::s
void
CommunitiesList::addCommunity(const std::string &group_id)
{
auto hiddenTags = UserSettings::instance()->hiddenTags();
const auto id = QString::fromStdString(group_id);
CommunitiesListItem *list_item = new CommunitiesListItem(id, scrollArea_);
if (hiddenTags.contains(id))
list_item->setDisabled(true);
communities_.emplace(id, QSharedPointer<CommunitiesListItem>(list_item));
contentsLayout_->insertWidget(contentsLayout_->count() - 1, list_item);
@ -135,6 +142,21 @@ CommunitiesList::addCommunity(const std::string &group_id)
&CommunitiesListItem::clicked,
this,
&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() != '+')
return;
@ -157,7 +179,9 @@ CommunitiesList::addCommunity(const std::string &group_id)
connect(this,
&CommunitiesList::groupRoomsRetrieved,
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())
return;
@ -179,9 +203,9 @@ CommunitiesList::addCommunity(const std::string &group_id)
return;
}
std::map<QString, bool> room_ids;
std::set<QString> room_ids;
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);
});
@ -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
{
if (communityExists(id))
@ -277,6 +301,18 @@ CommunitiesList::currentTags() const
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
CommunitiesList::sortEntries()
{

View File

@ -24,17 +24,18 @@ public:
void addCommunity(const std::string &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 setTagsForRoom(const QString &id, const std::vector<std::string> &tags);
std::vector<std::string> currentTags() const;
std::set<QString> hiddenTagsAndCommunities() const;
signals:
void communityChanged(const QString &id);
void avatarRetrieved(const QString &id, const QPixmap &img);
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:
void updateCommunityAvatar(const QString &id, const QPixmap &img);

View File

@ -1,5 +1,6 @@
#include "CommunitiesListItem.h"
#include <QMenu>
#include <QMouseEvent>
#include "Utils.h"
@ -20,18 +21,28 @@ CommunitiesListItem::CommunitiesListItem(QString group_id, QWidget *parent)
rippleOverlay_->setClipPath(path);
rippleOverlay_->setClipping(true);
if (groupId_ == "world")
avatar_ = QPixmap(":/icons/icons/ui/world.png");
else if (groupId_ == "tag:m.favourite")
avatar_ = QPixmap(":/icons/icons/ui/star.png");
else if (groupId_ == "tag:m.lowpriority")
avatar_ = QPixmap(":/icons/icons/ui/lowprio.png");
else if (groupId_.startsWith("tag:"))
avatar_ = QPixmap(":/icons/icons/ui/tag.png");
menu_ = new QMenu(this);
hideRoomsWithTagAction_ =
new QAction(tr("Hide rooms with this tag or from this community"), this);
hideRoomsWithTagAction_->setCheckable(true);
menu_->addAction(hideRoomsWithTagAction_);
connect(menu_, &QMenu::aboutToShow, this, [this]() {
hideRoomsWithTagAction_->setChecked(isDisabled_);
});
connect(hideRoomsWithTagAction_, &QAction::triggered, this, [this](bool checked) {
this->setDisabled(checked);
});
updateTooltip();
}
void
CommunitiesListItem::contextMenuEvent(QContextMenuEvent *event)
{
menu_->popup(event->globalPos());
}
void
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
CommunitiesListItem::mousePressEvent(QMouseEvent *event)
{
@ -80,22 +101,47 @@ CommunitiesListItem::paintEvent(QPaintEvent *)
if (isPressed_)
p.fillRect(rect(), highlightedBackgroundColor_);
else if (isDisabled_)
p.fillRect(rect(), disabledBackgroundColor_);
else if (underMouse())
p.fillRect(rect(), hoverBackgroundColor_);
else
p.fillRect(rect(), backgroundColor_);
if (avatar_.isNull()) {
QFont font;
font.setPointSizeF(font.pointSizeF() * 1.3);
p.setFont(font);
QPixmap source;
if (groupId_ == "world")
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()),
avatarFgColor_,
avatarBgColor_,
width(),
height(),
IconSize);
if (source.isNull()) {
QFont font;
font.setPointSizeF(font.pointSizeF() * 1.3);
p.setFont(font);
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 {
p.save();

View File

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

View File

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

View File

@ -61,10 +61,15 @@ class MainWindow : public QMainWindow
{
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:
explicit MainWindow(QWidget *parent = nullptr);
static MainWindow *instance() { return instance_; };
static MainWindow *instance() { return instance_; }
void saveCurrentWindowSize();
void openLeaveRoomDialog(const QString &room_id);

View File

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

View File

@ -890,12 +890,15 @@ decryptEvent(const MegolmSessionIndex &index,
std::string msg_str;
try {
auto session = cache::client()->getInboundMegolmSession(index);
auto res =
olm::client()->decrypt_group_message(session.get(), event.content.ciphertext);
msg_str = std::string((char *)res.data.data(), res.data.size());
} catch (const lmdb::error &e) {
return {DecryptionErrorCode::DbError, e.what(), std::nullopt};
} 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};
}
@ -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);
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 =
cache::getLatestOlmSession(d.keys.at("curve25519:" + device));
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
// and try again
DbError, // DB read failed
DecryptionFailed, // libolm error
ParsingFailed, // Failed to parse the actual event
ReplayAttack, // Megolm index reused
UnknownFingerprint, // Unknown device Fingerprint
MissingSessionIndex, // Session was found, but it does not reach back enough to this index,
// retrieve from backup or request from other devices and try again
DbError, // DB read failed
DecryptionFailed, // libolm error
ParsingFailed, // Failed to parse the actual event
ReplayAttack, // Megolm index reused
UnknownFingerprint, // Unknown device Fingerprint
};
struct DecryptionResult

View File

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

View File

@ -28,7 +28,7 @@
#include "UserSettingsPage.h"
#include "ui/Avatar.h"
class Menu;
class QMenu;
class RippleOverlay;
class RoomInfoListItem : public QWidget
@ -178,7 +178,7 @@ private:
DescInfo lastMsgInfo_;
Menu *menu_;
QMenu *menu_;
QAction *leaveRoom_;
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::LeftMouseButtonGesture);
// The scrollbar on macOS will hide itself when not active so it won't interfere
// with the content.
// The scrollbar on macOS will hide itself when not active so it won't interfere
// with the content.
#if not defined(Q_OS_MAC)
scrollArea_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
#endif
@ -411,20 +411,24 @@ RoomList::closeJoinRoomDialog(bool isJoining, QString roomAlias)
}
void
RoomList::removeFilter()
RoomList::removeFilter(const std::set<QString> &roomsToHide)
{
setUpdatesEnabled(false);
for (int i = 0; i < contentsLayout_->count(); i++) {
auto widget =
qobject_cast<RoomInfoListItem *>(contentsLayout_->itemAt(i)->widget());
if (widget)
widget->show();
if (widget) {
if (roomsToHide.find(widget->roomId()) == roomsToHide.end())
widget->show();
else
widget->hide();
}
}
setUpdatesEnabled(true);
}
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.
setUpdatesEnabled(false);

View File

@ -23,6 +23,8 @@
#include <QVBoxLayout>
#include <QWidget>
#include <set>
#include "CacheStructs.h"
#include "UserSettingsPage.h"
@ -54,9 +56,9 @@ public:
void addInvitedRoom(const QString &room_id, const RoomInfo &info);
void removeRoom(const QString &room_id, bool reset);
//! 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.
void removeFilter();
void removeFilter(const std::set<QString> &roomsToHide);
void updateRoom(const QString &room_id, const RoomInfo &info);
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();
auto left = widget(0);
if (savedWidth == 0) {
if (savedWidth <= 0) {
hideSidebar();
return;
} else if (savedWidth == sz_.small) {
} else if (savedWidth <= sz_.small) {
if (left) {
left->setMinimumWidth(sz_.small);
left->setMaximumWidth(sz_.small);
return;
}
} else if (savedWidth < sz_.normal) {
savedWidth = sz_.normal;
}
left->setMinimumWidth(sz_.normal);
left->setMaximumWidth(2 * sz_.normal);
setSizes({sz_.normal, fallback - sz_.normal});
setSizes({savedWidth, fallback - savedWidth});
setStretchFactor(0, 0);
setStretchFactor(1, 1);

View File

@ -125,6 +125,10 @@ UserInfoWidget::UserInfoWidget(QWidget *parent)
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
auto setAutoPresence = menu->addAction(tr("Set presence automatically"));
connect(setAutoPresence, &QAction::triggered, this, []() {

View File

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

View File

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

View File

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

View File

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

View File

@ -63,14 +63,14 @@ EmojiProxyModel::EmojiProxyModel(QObject *parent)
EmojiProxyModel::~EmojiProxyModel() {}
EmojiCategory
Emoji::Category
EmojiProxyModel::category() const
{
return category_;
}
void
EmojiProxyModel::setCategory(EmojiCategory cat)
EmojiProxyModel::setCategory(Emoji::Category cat)
{
if (category_ == cat) {
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>();
// TODO: Add favorites / recently used
if (category_ != EmojiCategory::Search) {
if (category_ != Emoji::Category::Search) {
return emoji.category == category_;
}

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

@ -1,10 +1,12 @@
#include "notifications/Manager.h"
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDBusMetaType>
#include <QDBusPendingCallWatcher>
#include <QDBusPendingReply>
#include <QDebug>
#include <QImage>
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusMessage>
#include <QtDBus/QDBusMetaType>
NotificationsManager::NotificationsManager(QObject *parent)
: QObject(parent)
@ -36,6 +38,12 @@ NotificationsManager::NotificationsManager(QObject *parent)
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
NotificationsManager::postNotification(const QString &roomid,
const QString &eventid,
@ -43,30 +51,16 @@ NotificationsManager::postNotification(const QString &roomid,
const QString &sender,
const QString &text,
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;
hints["image-data"] = image;
hints["image-data"] = icon;
hints["sound-name"] = "message-new-instant";
QList<QVariant> argumentList;
argumentList << "nheko"; // app_name
argumentList << (uint)0; // replace_id
argumentList << ""; // app_icon
argumentList << summary; // summary
argumentList << text; // body
argumentList << "nheko"; // app_name
argumentList << (uint)0; // replace_id
argumentList << ""; // app_icon
argumentList << roomname; // summary
argumentList << sender + ": " + text; // body
// 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.
// TODO(Nico): Look into what to actually put there.
@ -79,31 +73,33 @@ NotificationsManager::showNotification(const QString summary,
static QDBusInterface notifyApp("org.freedesktop.Notifications",
"/org/freedesktop/Notifications",
"org.freedesktop.Notifications");
QDBusMessage reply =
notifyApp.callWithArgumentList(QDBus::AutoDetect, "Notify", argumentList);
if (reply.type() == QDBusMessage::ErrorMessage) {
qDebug() << "D-Bus Error:" << reply.errorMessage();
return 0;
} else {
return reply.arguments().first().toUInt();
}
return true;
QDBusPendingCall call = notifyApp.asyncCallWithArgumentList("Notify", argumentList);
auto watcher = new QDBusPendingCallWatcher{call, this};
connect(
watcher, &QDBusPendingCallWatcher::finished, this, [watcher, this, roomid, eventid]() {
if (watcher->reply().type() == QDBusMessage::ErrorMessage)
qDebug() << "D-Bus Error:" << watcher->reply().errorMessage();
else
notificationIds[watcher->reply().arguments().first().toUInt()] =
roomEventId{roomid, eventid};
watcher->deleteLater();
});
}
void
NotificationsManager::closeNotification(uint id)
{
QList<QVariant> argumentList;
argumentList << (uint)id; // replace_id
static QDBusInterface closeCall("org.freedesktop.Notifications",
"/org/freedesktop/Notifications",
"org.freedesktop.Notifications");
QDBusMessage reply =
closeCall.callWithArgumentList(QDBus::AutoDetect, "CloseNotification", argumentList);
if (reply.type() == QDBusMessage::ErrorMessage) {
qDebug() << "D-Bus Error:" << reply.errorMessage();
}
auto call = closeCall.asyncCall("CloseNotification", (uint)id); // replace_id
auto watcher = new QDBusPendingCallWatcher{call, this};
connect(watcher, &QDBusPendingCallWatcher::finished, this, [watcher, this]() {
if (watcher->reply().type() == QDBusMessage::ErrorMessage) {
qDebug() << "D-Bus Error:" << watcher->reply().errorMessage();
};
watcher->deleteLater();
});
}
void

View File

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

View File

@ -251,12 +251,14 @@ InputBar::openFileSelection()
}
void
InputBar::message(QString msg)
InputBar::message(QString msg, MarkdownOverride useMarkdown)
{
mtx::events::msg::Text text = {};
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();
// Don't send formatted_body, when we don't need to
@ -477,6 +479,10 @@ InputBar::command(QString command, QString args)
room->clearTimeline();
} else if (command == "rotate-megolm-session") {
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 QStringList;
enum class MarkdownOverride
{
NOT_SPECIFIED, // no override set
ON,
OFF,
};
class InputBar : public QObject
{
Q_OBJECT
@ -41,7 +48,7 @@ public slots:
void updateState(int selectionStart, int selectionEnd, int cursorPosition, QString text);
void openFileSelection();
bool uploading() const { return uploading_; }
void message(QString body);
void message(QString body, MarkdownOverride useMarkdown = MarkdownOverride::NOT_SPECIFIED);
QObject *completerFor(QString completerName);

View File

@ -5,6 +5,7 @@
#include <type_traits>
#include <QCache>
#include <QDesktopServices>
#include <QFileDialog>
#include <QMimeDatabase>
#include <QRegularExpression>
@ -353,7 +354,8 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
return QVariant(emojiCount);
}
case Body:
return QVariant(utils::replaceEmoji(QString::fromStdString(body(event))));
return QVariant(
utils::replaceEmoji(QString::fromStdString(body(event)).toHtmlEscaped()));
case FormattedBody: {
const static QRegularExpression replyFallback(
"<mx-reply>.*</mx-reply>", QRegularExpression::DotMatchesEverythingOption);
@ -797,9 +799,9 @@ TimelineModel::viewDecryptedRawMessage(QString id) const
}
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
@ -1072,6 +1074,14 @@ TimelineModel::addPendingMessage(mtx::events::collections::TimelineEvents event)
std::visit(SendMessageVisitor{this}, event);
}
void
TimelineModel::openMedia(QString eventId)
{
cacheMedia(eventId, [](QString filename) {
QDesktopServices::openUrl(QUrl::fromLocalFile(filename));
});
}
bool
TimelineModel::saveMedia(QString eventId) const
{
@ -1148,7 +1158,7 @@ TimelineModel::saveMedia(QString eventId) const
}
void
TimelineModel::cacheMedia(QString eventId)
TimelineModel::cacheMedia(QString eventId, std::function<void(const QString)> callback)
{
mtx::events::collections::TimelineEvents *event = events.get(eventId.toStdString(), "");
if (!event)
@ -1168,12 +1178,13 @@ TimelineModel::cacheMedia(QString eventId)
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")
.arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation))
.arg(QString(mxcUrl).remove("mxc://"))
.arg(name)
.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);
return;
}
@ -1182,15 +1193,18 @@ TimelineModel::cacheMedia(QString eventId)
if (filename.isReadable()) {
emit mediaCached(mxcUrl, filename.filePath());
if (callback) {
callback(filename.filePath());
}
return;
}
http::client()->download(
url,
[this, mxcUrl, filename, url, encryptionInfo](const std::string &data,
const std::string &,
const std::string &,
mtx::http::RequestErr err) {
[this, callback, mxcUrl, filename, url, encryptionInfo](const std::string &data,
const std::string &,
const std::string &,
mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn("failed to retrieve image {}: {} {}",
url,
@ -1212,6 +1226,10 @@ TimelineModel::cacheMedia(QString eventId)
file.write(QByteArray(temp.data(), (int)temp.size()));
file.close();
if (callback) {
callback(filename.filePath());
}
} catch (const std::exception &e) {
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
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 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 readReceiptsAction(QString id) const;
Q_INVOKABLE void redactEvent(QString id);
Q_INVOKABLE int idToIndex(QString id) const;
Q_INVOKABLE QString indexToId(int index) const;
Q_INVOKABLE void openMedia(QString eventId);
Q_INVOKABLE void cacheMedia(QString eventId);
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)
{

View File

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

View File

@ -7,6 +7,8 @@
#include "mtx/responses/crypto.hpp"
#include "timeline/TimelineModel.h"
#include "timeline/TimelineViewManager.h"
#include <mtx/responses.hpp>
#include <mtx/responses/common.hpp>
UserProfile::UserProfile(QString roomid,
QString userid,
@ -44,6 +46,23 @@ UserProfile::UserProfile(QString roomid,
}
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>
@ -97,7 +116,7 @@ UserProfile::userid()
QString
UserProfile::displayName()
{
return cache::displayName(roomid_, userid_);
return isGlobalUserProfile() ? globalUsername : cache::displayName(roomid_, userid_);
}
QString
@ -106,6 +125,12 @@ UserProfile::avatarUrl()
return cache::avatarUrl(roomid_, userid_);
}
bool
UserProfile::isGlobalUserProfile() const
{
return roomid_ == "";
}
bool
UserProfile::getUserStatus()
{
@ -213,6 +238,40 @@ UserProfile::startChat()
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
UserProfile::verify(QString device)
{
@ -228,3 +287,10 @@ UserProfile::unverify(QString device)
{
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
{
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 avatarUrl READ avatarUrl 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 userVerificationEnabled READ userVerificationEnabled NOTIFY userStatusChanged)
@ -98,6 +99,7 @@ public:
QString userid();
QString displayName();
QString avatarUrl();
bool isGlobalUserProfile() const;
bool getUserStatus();
bool userVerificationEnabled() const;
bool isSelf() const;
@ -109,12 +111,19 @@ public:
// Q_INVOKABLE void ignoreUser();
Q_INVOKABLE void kickUser();
Q_INVOKABLE void startChat();
Q_INVOKABLE void changeUsername(QString username);
signals:
void userStatusChanged();
void displayNameChanged();
void globalUsernameRetrieved(const QString &globalUser);
protected slots:
void setGlobalUsername(const QString &globalUser);
private:
QString roomid_, userid_;
QString globalUsername;
DeviceInfoModel deviceList_;
bool isUserVerified = false;
bool hasMasterKey = false;