Merge branch 'master' into room_settings_qml
This commit is contained in:
commit
8400540428
@ -280,6 +280,7 @@ set(SRC_FILES
|
|||||||
src/ui/InfoMessage.cpp
|
src/ui/InfoMessage.cpp
|
||||||
src/ui/Label.cpp
|
src/ui/Label.cpp
|
||||||
src/ui/LoadingIndicator.cpp
|
src/ui/LoadingIndicator.cpp
|
||||||
|
src/ui/NhekoCursorShape.cpp
|
||||||
src/ui/NhekoDropArea.cpp
|
src/ui/NhekoDropArea.cpp
|
||||||
src/ui/OverlayModal.cpp
|
src/ui/OverlayModal.cpp
|
||||||
src/ui/OverlayWidget.cpp
|
src/ui/OverlayWidget.cpp
|
||||||
@ -298,6 +299,7 @@ set(SRC_FILES
|
|||||||
src/AvatarProvider.cpp
|
src/AvatarProvider.cpp
|
||||||
src/BlurhashProvider.cpp
|
src/BlurhashProvider.cpp
|
||||||
src/Cache.cpp
|
src/Cache.cpp
|
||||||
|
src/CallDevices.cpp
|
||||||
src/CallManager.cpp
|
src/CallManager.cpp
|
||||||
src/ChatPage.cpp
|
src/ChatPage.cpp
|
||||||
src/ColorImageProvider.cpp
|
src/ColorImageProvider.cpp
|
||||||
@ -355,7 +357,7 @@ if(USE_BUNDLED_MTXCLIENT)
|
|||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
MatrixClient
|
MatrixClient
|
||||||
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
|
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
|
||||||
GIT_TAG v0.4.1
|
GIT_TAG fee5298f068394958c2de935836a2c145f273906
|
||||||
)
|
)
|
||||||
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
|
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
|
||||||
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
|
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
|
||||||
@ -493,6 +495,7 @@ qt5_wrap_cpp(MOC_HEADERS
|
|||||||
src/ui/Label.h
|
src/ui/Label.h
|
||||||
src/ui/FloatingButton.h
|
src/ui/FloatingButton.h
|
||||||
src/ui/Menu.h
|
src/ui/Menu.h
|
||||||
|
src/ui/NhekoCursorShape.h
|
||||||
src/ui/NhekoDropArea.h
|
src/ui/NhekoDropArea.h
|
||||||
src/ui/OverlayWidget.h
|
src/ui/OverlayWidget.h
|
||||||
src/ui/SnackBar.h
|
src/ui/SnackBar.h
|
||||||
@ -512,6 +515,7 @@ qt5_wrap_cpp(MOC_HEADERS
|
|||||||
src/AvatarProvider.h
|
src/AvatarProvider.h
|
||||||
src/BlurhashProvider.h
|
src/BlurhashProvider.h
|
||||||
src/Cache_p.h
|
src/Cache_p.h
|
||||||
|
src/CallDevices.h
|
||||||
src/CallManager.h
|
src/CallManager.h
|
||||||
src/ChatPage.h
|
src/ChatPage.h
|
||||||
src/CommunitiesList.h
|
src/CommunitiesList.h
|
||||||
@ -645,7 +649,7 @@ if(QML_DEBUGGING)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(NOT MSVC)
|
if(NOT MSVC AND NOT HAIKU)
|
||||||
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug" OR CI_BUILD)
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug" OR CI_BUILD)
|
||||||
target_compile_options(nheko PRIVATE "-Werror")
|
target_compile_options(nheko PRIVATE "-Werror")
|
||||||
endif()
|
endif()
|
||||||
|
@ -116,9 +116,7 @@ brew install --cask nheko
|
|||||||
|
|
||||||
### Build Requirements
|
### Build Requirements
|
||||||
|
|
||||||
- Qt5 (5.10 or greater). Qt 5.7 adds support for color font rendering with
|
- Qt5 (5.12 or greater). Required for overlapping hover handlers in Qml.
|
||||||
Freetype, which is essential to properly support emoji, 5.8 adds some features
|
|
||||||
to make interopability with Qml easier, 5.10 makes sliders actually visible with different palettes.
|
|
||||||
- CMake 3.15 or greater. (Lower version may work, but may break boost linking)
|
- CMake 3.15 or greater. (Lower version may work, but may break boost linking)
|
||||||
- [mtxclient](https://github.com/Nheko-Reborn/mtxclient)
|
- [mtxclient](https://github.com/Nheko-Reborn/mtxclient)
|
||||||
- [LMDB](https://symas.com/lightning-memory-mapped-database/)
|
- [LMDB](https://symas.com/lightning-memory-mapped-database/)
|
||||||
@ -205,7 +203,7 @@ and mtxclient (needs to be build separately).
|
|||||||
```bash
|
```bash
|
||||||
sudo apt install cmake gcc make automake liblmdb-dev \
|
sudo apt install cmake gcc make automake liblmdb-dev \
|
||||||
qt5-default libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev \
|
qt5-default libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev \
|
||||||
qml-module-qtgstreamer qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools \
|
qml-module-qtgstreamer qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev \
|
||||||
qml-module-qtgraphicaleffects qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts \
|
qml-module-qtgraphicaleffects qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts \
|
||||||
qt5keychain-dev
|
qt5keychain-dev
|
||||||
```
|
```
|
||||||
|
@ -220,8 +220,7 @@
|
|||||||
"name": "mtxclient",
|
"name": "mtxclient",
|
||||||
"sources": [
|
"sources": [
|
||||||
{
|
{
|
||||||
"commit": "4951190c938740defa0988d98d5e861038622936",
|
"commit": "fee5298f068394958c2de935836a2c145f273906",
|
||||||
"tag": "v0.4.1",
|
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
|
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1300,12 +1305,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1329,7 +1334,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1347,7 +1362,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1356,6 +1371,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1480,7 +1500,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1503,7 +1528,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1522,11 +1547,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1546,12 +1600,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1604,6 +1663,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1714,7 +1796,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1724,7 +1806,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1799,7 +1881,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1819,17 +1901,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1899,7 +1981,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1995,7 +2077,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Du bist dem Raum beigetreten.</translation>
|
<translation>Du bist dem Raum beigetreten.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Nutzer konnte nicht eingeladen werden: %1</translation>
|
<translation>Nutzer konnte nicht eingeladen werden: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>Eingeladener Benutzer: %1</translation>
|
<translation>Eingeladener Benutzer: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
|
<translation>-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation>Alle Dateien (*)</translation>
|
<translation>Alle Dateien (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation>
|
<translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<translation>Schreibe eine Nachricht…</translation>
|
<translation>Schreibe eine Nachricht…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation>Emoji</translation>
|
<translation>Emoji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>Senden</translation>
|
<translation>Senden</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Schließen</translation>
|
<translation>Schließen</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>keine Version gespeichert</translation>
|
<translation>keine Version gespeichert</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
|
<translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1303,12 +1308,12 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<translation>%1 hat das Anklopfen zurückgezogen.</translation>
|
<translation>%1 hat das Anklopfen zurückgezogen.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Du bist dem Raum beigetreten.</translation>
|
<translation>Du bist dem Raum beigetreten.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>Hat das Anklopfen von %1 abgewiesen.</translation>
|
<translation>Hat das Anklopfen von %1 abgewiesen.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1332,7 +1337,17 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reaktion senden</translation>
|
<translation>Reaktion senden</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1350,7 +1365,7 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reaktion senden</translation>
|
<translation>Reaktion senden</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1359,6 +1374,11 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Antworten</translation>
|
<translation>Antworten</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1483,7 +1503,12 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<translation>Status:</translation>
|
<translation>Status:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation>Setze Präsenz automatisch</translation>
|
<translation>Setze Präsenz automatisch</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1506,7 +1531,7 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation>Verifizieren</translation>
|
<translation>Verifizieren</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1525,11 +1550,40 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation>Kicke den Nutzer</translation>
|
<translation>Kicke den Nutzer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">Wähle einen Avatar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Alle Dateien (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished">Die ausgewählte Datei ist kein Bild</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished">Fehler beim Lesen der DateI: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Ins Benachrichtigungsfeld minimieren</translation>
|
<translation>Ins Benachrichtigungsfeld minimieren</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1549,12 +1603,17 @@ Beispiel: https://mein.server:8787</translation>
|
|||||||
<translation>Runde Profilbilder</translation>
|
<translation>Runde Profilbilder</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation>Profil: %1</translation>
|
<translation>Profil: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation>TELEFONATE</translation>
|
<translation>TELEFONATE</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1609,6 +1668,29 @@ Betrifft nur Nachrichten in verschlüsselten Chats.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Zeige Buttons in der Historie</translation>
|
<translation>Zeige Buttons in der Historie</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1725,7 +1807,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
|
|||||||
<translation>Teile Schlüssel mit verifizierten Nutzern und Geräten</translation>
|
<translation>Teile Schlüssel mit verifizierten Nutzern und Geräten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation>IM CACHE</translation>
|
<translation>IM CACHE</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1735,7 +1817,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
|
|||||||
<translation>NICHT IM CACHE</translation>
|
<translation>NICHT IM CACHE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Skalierungsfaktor</translation>
|
<translation>Skalierungsfaktor</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1810,7 +1892,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
|
|||||||
<translation>Gerätefingerabdruck</translation>
|
<translation>Gerätefingerabdruck</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Sitzungsschlüssel</translation>
|
<translation>Sitzungsschlüssel</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1830,17 +1912,17 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
|
|||||||
<translation>VERSCHLÜSSELUNG</translation>
|
<translation>VERSCHLÜSSELUNG</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>ALLGEMEINES</translation>
|
<translation>ALLGEMEINES</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>OBERFLÄCHE</translation>
|
<translation>OBERFLÄCHE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation>Touchscreenmodus</translation>
|
<translation>Touchscreenmodus</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1910,7 +1992,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
|
|||||||
<translation>Alle Dateien (*)</translation>
|
<translation>Alle Dateien (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Öffne Sessions Datei</translation>
|
<translation>Öffne Sessions Datei</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -2006,7 +2088,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Gestern</translation>
|
<translation>Gestern</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished">Όλα τα αρχεία (*)</translation>
|
<translation type="unfinished">Όλα τα αρχεία (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished">Γράψε ένα μήνυμα...</translation>
|
<translation type="unfinished">Γράψε ένα μήνυμα...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1299,12 +1304,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1328,7 +1333,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1346,7 +1361,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1355,6 +1370,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1479,7 +1499,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1502,7 +1527,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1521,11 +1546,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Όλα τα αρχεία (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Ελαχιστοποίηση</translation>
|
<translation>Ελαχιστοποίηση</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1545,12 +1599,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1603,6 +1662,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1713,7 +1795,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1723,7 +1805,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1798,7 +1880,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1818,17 +1900,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>ΓΕΝΙΚΑ</translation>
|
<translation>ΓΕΝΙΚΑ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1898,7 +1980,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished">Όλα τα αρχεία (*)</translation>
|
<translation type="unfinished">Όλα τα αρχεία (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1994,7 +2076,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>You joined this room.</translation>
|
<translation>You joined this room.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Failed to invite user: %1</translation>
|
<translation>Failed to invite user: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>Invited user: %1</translation>
|
<translation>Invited user: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Encrypted Event (No keys found for decryption) --</translation>
|
<translation>-- Encrypted Event (No keys found for decryption) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation>All Files (*)</translation>
|
<translation>All Files (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation>Failed to upload media. Please try again.</translation>
|
<translation>Failed to upload media. Please try again.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Example: https://server.my:8787</translation>
|
|||||||
<translation>Write a message…</translation>
|
<translation>Write a message…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation>Emoji</translation>
|
<translation>Emoji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>Send</translation>
|
<translation>Send</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Example: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Close</translation>
|
<translation>Close</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation>Cancel edit</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>no version stored</translation>
|
<translation>no version stored</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Example: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Message redaction failed: %1</translation>
|
<translation>Message redaction failed: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1303,12 +1308,12 @@ Example: https://server.my:8787</translation>
|
|||||||
<translation>%1 redacted their knock.</translation>
|
<translation>%1 redacted their knock.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>You joined this room.</translation>
|
<translation>You joined this room.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>Rejected the knock from %1.</translation>
|
<translation>Rejected the knock from %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1332,7 +1337,17 @@ Example: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation>Edit</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation>Edited</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>React</translation>
|
<translation>React</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1350,7 +1365,7 @@ Example: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>React</translation>
|
<translation>React</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1359,6 +1374,11 @@ Example: https://server.my:8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Reply</translation>
|
<translation>Reply</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation>Edit</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1483,7 +1503,12 @@ Example: https://server.my:8787</translation>
|
|||||||
<translation>Status:</translation>
|
<translation>Status:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation>User Profile Settings</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation>Set presence automatically</translation>
|
<translation>Set presence automatically</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1506,7 +1531,7 @@ Example: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation>Verify</translation>
|
<translation>Verify</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1525,11 +1550,40 @@ Example: https://server.my:8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation>Kick the user</translation>
|
<translation>Kick the user</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation>Select an avatar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation>All Files (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation>The selected file is not an image</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation>Error while reading file: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation>Default</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Minimize to tray</translation>
|
<translation>Minimize to tray</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1549,12 +1603,17 @@ Example: https://server.my:8787</translation>
|
|||||||
<translation>Circular Avatars</translation>
|
<translation>Circular Avatars</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation>profile: %1</translation>
|
<translation>profile: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation>Default</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation>CALLS</translation>
|
<translation>CALLS</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1609,6 +1668,32 @@ Only affects messages in encrypted chats.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation>Privacy Screen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation>When the window loses focus, the timeline will
|
||||||
|
be blurred.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation>Privacy screen timeout (in seconds [0 - 3600])</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Show buttons in timeline</translation>
|
<translation>Show buttons in timeline</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1725,7 +1810,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Share keys with verified users and devices</translation>
|
<translation>Share keys with verified users and devices</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation>CACHED</translation>
|
<translation>CACHED</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1735,7 +1820,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>NOT CACHED</translation>
|
<translation>NOT CACHED</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Scale factor</translation>
|
<translation>Scale factor</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1810,7 +1895,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Device Fingerprint</translation>
|
<translation>Device Fingerprint</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Session Keys</translation>
|
<translation>Session Keys</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1830,17 +1915,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>ENCRYPTION</translation>
|
<translation>ENCRYPTION</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>GENERAL</translation>
|
<translation>GENERAL</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>INTERFACE</translation>
|
<translation>INTERFACE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation>Touchscreen mode</translation>
|
<translation>Touchscreen mode</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1910,7 +1995,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>All Files (*)</translation>
|
<translation>All Files (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Open Sessions File</translation>
|
<translation>Open Sessions File</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -2006,7 +2091,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Yesterday</translation>
|
<translation>Yesterday</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
|
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -480,7 +480,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -569,7 +569,7 @@
|
|||||||
<translation type="unfinished">Ĉiuj dosieroj (*)</translation>
|
<translation type="unfinished">Ĉiuj dosieroj (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -802,12 +802,12 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<translation type="unfinished">Skribu mesaĝon...</translation>
|
<translation type="unfinished">Skribu mesaĝon...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>Sendu</translation>
|
<translation>Sendu</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1004,15 +1004,20 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1156,7 +1161,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1308,12 +1313,12 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
|
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1337,7 +1342,17 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reagu</translation>
|
<translation>Reagu</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1355,7 +1370,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reagu</translation>
|
<translation>Reagu</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1364,6 +1379,11 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Respondu</translation>
|
<translation>Respondu</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1488,7 +1508,12 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1511,7 +1536,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1530,11 +1555,40 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Ĉiuj dosieroj (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1554,12 +1608,17 @@ Ekzemplo: https://servisto.mia:8787</translation>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1612,6 +1671,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1722,7 +1804,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1732,7 +1814,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1807,7 +1889,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1827,17 +1909,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1907,7 +1989,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished">Ĉiuj dosieroj (*)</translation>
|
<translation type="unfinished">Ĉiuj dosieroj (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -2004,7 +2086,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Hieraŭ</translation>
|
<translation>Hieraŭ</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Sa liitusid selle jututoaga.</translation>
|
<translation>Sa liitusid selle jututoaga.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Kutse saatmine kasutajale ei õnnestunud: %1</translation>
|
<translation>Kutse saatmine kasutajale ei õnnestunud: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>Kutsutud kasutaja: %1</translation>
|
<translation>Kutsutud kasutaja: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Krüptitud sündmus (Dekrüptimisvõtmeid ei leidunud) --</translation>
|
<translation>-- Krüptitud sündmus (Dekrüptimisvõtmeid ei leidunud) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation>Kõik failid (*)</translation>
|
<translation>Kõik failid (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation>
|
<translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<translation>Kirjuta sõnum…</translation>
|
<translation>Kirjuta sõnum…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation>Emoji</translation>
|
<translation>Emoji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>Saada</translation>
|
<translation>Saada</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Sulge</translation>
|
<translation>Sulge</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation>Tühista muudatused</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>salvestatud versiooni ei leidu</translation>
|
<translation>salvestatud versiooni ei leidu</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation>
|
<translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1303,12 +1308,12 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<translation>%1 muutis oma koputust jututoa uksele.</translation>
|
<translation>%1 muutis oma koputust jututoa uksele.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Sa liitusid jututoaga.</translation>
|
<translation>Sa liitusid jututoaga.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>Lükkas tagasi %1 koputuse jututoa uksele.</translation>
|
<translation>Lükkas tagasi %1 koputuse jututoa uksele.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1332,7 +1337,17 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation>Muuda</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation>Muudetud</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reageeri</translation>
|
<translation>Reageeri</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1350,7 +1365,7 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reageeri</translation>
|
<translation>Reageeri</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1359,6 +1374,11 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Vasta</translation>
|
<translation>Vasta</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation>Muuda</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1483,7 +1503,12 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<translation>Olek:</translation>
|
<translation>Olek:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation>Kasutajaprofiili seadistused</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation>Määra oma võrguolek automaatselt</translation>
|
<translation>Määra oma võrguolek automaatselt</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1506,7 +1531,7 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation>Verifitseeri</translation>
|
<translation>Verifitseeri</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1525,11 +1550,40 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation>Müksa kasutaja välja</translation>
|
<translation>Müksa kasutaja välja</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation>Vali tunnuspilt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation>Kõik failid (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation>Valitud fail ei ole pildifail</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation>Viga faili lugemisel: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation>Vaikimisi</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Vähenda tegumiribale</translation>
|
<translation>Vähenda tegumiribale</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1549,12 +1603,17 @@ Näiteks: https://server.minu:8787</translation>
|
|||||||
<translation>Ümmargused tunnuspildid</translation>
|
<translation>Ümmargused tunnuspildid</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation>Profiil: %1</translation>
|
<translation>Profiil: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation>Vaikimisi</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation>KÕNED</translation>
|
<translation>KÕNED</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1609,6 +1668,32 @@ Kehtib vaid läbivalt krüptitud vestluste puhul.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation>Privaatsust tagav sirm</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation>Kui aken kaotab fookuse,
|
||||||
|
siis ajajoone vaade hägustub.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation>Viivitus privaatsussirmi sisselülitamisel (sekundites [0 - 3600])</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation>Seadista aeg sekundites, mille möödumisel
|
||||||
|
peale akna fookuse kadumist ajajoone vaade hägustub.
|
||||||
|
0 hägustab vaate koheselt. Pikim viivitus saab olla 1 tund (3600 sekundit)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Näita ajajoonel nuppe</translation>
|
<translation>Näita ajajoonel nuppe</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1725,7 +1810,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
|
|||||||
<translation>Jaga võtmeid verifitseeritud kasutajate ja seadmetega</translation>
|
<translation>Jaga võtmeid verifitseeritud kasutajate ja seadmetega</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation>PUHVERDATUD</translation>
|
<translation>PUHVERDATUD</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1735,7 +1820,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
|
|||||||
<translation>PUHVERDAMATA</translation>
|
<translation>PUHVERDAMATA</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Mastaabitegur</translation>
|
<translation>Mastaabitegur</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1810,7 +1895,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
|
|||||||
<translation>Seadme sõrmejälg</translation>
|
<translation>Seadme sõrmejälg</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Sessioonivõtmed</translation>
|
<translation>Sessioonivõtmed</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1830,17 +1915,17 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
|
|||||||
<translation>KRÜPTIMINE</translation>
|
<translation>KRÜPTIMINE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>ÜLDISED SEADISTUSED</translation>
|
<translation>ÜLDISED SEADISTUSED</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>LIIDES</translation>
|
<translation>LIIDES</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation>Puuteekraani režiim</translation>
|
<translation>Puuteekraani režiim</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1910,7 +1995,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
|
|||||||
<translation>Kõik failid (*)</translation>
|
<translation>Kõik failid (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Ava sessioonide fail</translation>
|
<translation>Ava sessioonide fail</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -2006,7 +2091,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Eile</translation>
|
<translation>Eile</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -6,13 +6,13 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../qml/voip/ActiveCallBar.qml" line="+66"/>
|
<location filename="../qml/voip/ActiveCallBar.qml" line="+66"/>
|
||||||
<source>Calling...</source>
|
<source>Calling...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Soitetaan...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+10"/>
|
<location line="+10"/>
|
||||||
<location line="+10"/>
|
<location line="+10"/>
|
||||||
<source>Connecting...</source>
|
<source>Connecting...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Yhdistetään...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+76"/>
|
<location line="+76"/>
|
||||||
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -89,7 +89,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location line="+16"/>
|
<location line="+16"/>
|
||||||
<source>Devices</source>
|
<source>Devices</source>
|
||||||
<translation type="unfinished">Laitteet</translation>
|
<translation>Laitteet</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+11"/>
|
<location line="+11"/>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
|
<translation>-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
|
||||||
@ -560,7 +560,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/InputBar.cpp" line="+227"/>
|
<location filename="../../src/timeline/InputBar.cpp" line="+227"/>
|
||||||
<source>Select a file</source>
|
<source>Select a file</source>
|
||||||
<translation type="unfinished">Valitse tiedosto</translation>
|
<translation>Valitse tiedosto</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+0"/>
|
<location line="+0"/>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation>Kaikki Tiedostot (*)</translation>
|
<translation>Kaikki Tiedostot (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -789,7 +789,7 @@ Example: https://server.my:8787</source>
|
|||||||
<message>
|
<message>
|
||||||
<location line="+26"/>
|
<location line="+26"/>
|
||||||
<source>Send a file</source>
|
<source>Send a file</source>
|
||||||
<translation type="unfinished">Lähetä tiedosto</translation>
|
<translation>Lähetä tiedosto</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+60"/>
|
<location line="+60"/>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>Kirjoita viesti…</translation>
|
<translation>Kirjoita viesti…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished">Emoji</translation>
|
<translation>Emoji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Sulje</translation>
|
<translation>Sulje</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>ei tallennettua versiota</translation>
|
<translation>ei tallennettua versiota</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Viestin muokkaus epäonnistui: %1</translation>
|
<translation>Viestin muokkaus epäonnistui: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1299,12 +1304,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1328,7 +1333,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1346,7 +1361,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1355,6 +1370,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1479,7 +1499,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1502,7 +1527,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1521,11 +1546,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation>Valitse profiilikuva</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation>Kaikki Tiedostot (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation>Valittu tiedosto ei ole kuva</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation>Virhe lukiessa tiedostoa: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Pienennä ilmoitusalueelle</translation>
|
<translation>Pienennä ilmoitusalueelle</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1545,12 +1599,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1603,6 +1662,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1713,7 +1795,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1723,7 +1805,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Mittakerroin</translation>
|
<translation>Mittakerroin</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1798,7 +1880,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Laitteen sormenjälki</translation>
|
<translation>Laitteen sormenjälki</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Istunnon avaimet</translation>
|
<translation>Istunnon avaimet</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1818,17 +1900,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>SALAUS</translation>
|
<translation>SALAUS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>YLEISET ASETUKSET</translation>
|
<translation>YLEISET ASETUKSET</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1890,7 +1972,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<message>
|
<message>
|
||||||
<location line="+54"/>
|
<location line="+54"/>
|
||||||
<source>Select a file</source>
|
<source>Select a file</source>
|
||||||
<translation type="unfinished">Valitse tiedosto</translation>
|
<translation>Valitse tiedosto</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+0"/>
|
<location line="+0"/>
|
||||||
@ -1898,7 +1980,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Kaikki Tiedostot (*)</translation>
|
<translation>Kaikki Tiedostot (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Avaa Istuntoavaintiedosto</translation>
|
<translation>Avaa Istuntoavaintiedosto</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1994,7 +2076,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Eilen</translation>
|
<translation>Eilen</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Vous avez rejoint ce salon.</translation>
|
<translation>Vous avez rejoint ce salon.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Échec lors de l'invitation de %1</translation>
|
<translation>Échec lors de l'invitation de %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>%1 a été invité(e)</translation>
|
<translation>%1 a été invité(e)</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Évènement chiffré (pas de clé trouvée pour le déchiffrement) --</translation>
|
<translation>-- Évènement chiffré (pas de clé trouvée pour le déchiffrement) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation>Tous les types de fichiers (*)</translation>
|
<translation>Tous les types de fichiers (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation>Échec de l'envoi du média. Veuillez réessayer.</translation>
|
<translation>Échec de l'envoi du média. Veuillez réessayer.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<translation>Écrivez un message…</translation>
|
<translation>Écrivez un message…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation>Émoji</translation>
|
<translation>Émoji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>Envoyer</translation>
|
<translation>Envoyer</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Fermer</translation>
|
<translation>Fermer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>pas de version enregistrée</translation>
|
<translation>pas de version enregistrée</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Échec de la suppression du message : %1</translation>
|
<translation>Échec de la suppression du message : %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1303,12 +1308,12 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<translation>%1 ne frappe plus au salon.</translation>
|
<translation>%1 ne frappe plus au salon.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Vous avez rejoint ce salon.</translation>
|
<translation>Vous avez rejoint ce salon.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>%1 a été rejeté après avoir frappé au salon.</translation>
|
<translation>%1 a été rejeté après avoir frappé au salon.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1332,7 +1337,17 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Réagir</translation>
|
<translation>Réagir</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1350,7 +1365,7 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Réagir</translation>
|
<translation>Réagir</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1359,6 +1374,11 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Réponse</translation>
|
<translation>Réponse</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1483,7 +1503,12 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<translation>Statut :</translation>
|
<translation>Statut :</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation>Changer la présence automatiquement</translation>
|
<translation>Changer la présence automatiquement</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1506,7 +1531,7 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation>Vérifier</translation>
|
<translation>Vérifier</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1525,11 +1550,40 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation>Expulser l'utilisateur</translation>
|
<translation>Expulser l'utilisateur</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">Sélectionner un avatar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Tous les types de fichiers (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished">Le fichier sélectionné n'est pas une image</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished">Erreur lors de la lecture du fichier  : %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Réduire à la barre des tâches</translation>
|
<translation>Réduire à la barre des tâches</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1549,12 +1603,17 @@ Exemple : https ://monserveur.example.com :8787</translation>
|
|||||||
<translation>Avatars circulaires</translation>
|
<translation>Avatars circulaires</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation>profil : %1</translation>
|
<translation>profil : %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation>APPELS</translation>
|
<translation>APPELS</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1609,6 +1668,29 @@ Cela n'affecte que les messages des salons chiffrés.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Montrer les boutons dans la discussion</translation>
|
<translation>Montrer les boutons dans la discussion</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1726,7 +1808,7 @@ Cela met l'application en évidence dans la barre des tâches.</translation
|
|||||||
<translation>Partager vos clés avec les utilisateurs et appareils que vous avez vérifiés</translation>
|
<translation>Partager vos clés avec les utilisateurs et appareils que vous avez vérifiés</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation>EN CACHE</translation>
|
<translation>EN CACHE</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1736,7 +1818,7 @@ Cela met l'application en évidence dans la barre des tâches.</translation
|
|||||||
<translation>PAS DANS LE CACHE</translation>
|
<translation>PAS DANS LE CACHE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Facteur d'échelle</translation>
|
<translation>Facteur d'échelle</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1811,7 +1893,7 @@ Cela met l'application en évidence dans la barre des tâches.</translation
|
|||||||
<translation>Empreinte de l'appareil</translation>
|
<translation>Empreinte de l'appareil</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Clés de session</translation>
|
<translation>Clés de session</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1831,17 +1913,17 @@ Cela met l'application en évidence dans la barre des tâches.</translation
|
|||||||
<translation>CHIFFREMENT</translation>
|
<translation>CHIFFREMENT</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>GÉNÉRAL</translation>
|
<translation>GÉNÉRAL</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>INTERFACE</translation>
|
<translation>INTERFACE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation>Mode écran tactile</translation>
|
<translation>Mode écran tactile</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1911,7 +1993,7 @@ Cela met l'application en évidence dans la barre des tâches.</translation
|
|||||||
<translation>Tous les types de fichiers (*)</translation>
|
<translation>Tous les types de fichiers (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Ouvrir fichier de sessions</translation>
|
<translation>Ouvrir fichier de sessions</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -2007,7 +2089,7 @@ Cela met l'application en évidence dans la barre des tâches.</translation
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Hier</translation>
|
<translation>Hier</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Csatlakoztál ehhez a szobához.</translation>
|
<translation>Csatlakoztál ehhez a szobához.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Nem sikerült meghívni a felhasználót: %1</translation>
|
<translation>Nem sikerült meghívni a felhasználót: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>A felhasználó meg lett hívva: %1</translation>
|
<translation>A felhasználó meg lett hívva: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Titkosított esemény (Nem találhatók kulcsok a titkosítás feloldásához) --</translation>
|
<translation>-- Titkosított esemény (Nem találhatók kulcsok a titkosítás feloldásához) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation>Minden fájl (*)</translation>
|
<translation>Minden fájl (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation>Nem sikerült feltölteni a médiafájlt. Kérlek, próbáld újra!</translation>
|
<translation>Nem sikerült feltölteni a médiafájlt. Kérlek, próbáld újra!</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<translation>Írj egy üzenetet…</translation>
|
<translation>Írj egy üzenetet…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation>Hangulatjelek</translation>
|
<translation>Hangulatjelek</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>Küldés</translation>
|
<translation>Küldés</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Bezárás</translation>
|
<translation>Bezárás</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation>Szerkesztés megszakítása</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>nincs tárolva verzió</translation>
|
<translation>nincs tárolva verzió</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Az üzenet visszavonása nem sikerült: %1</translation>
|
<translation>Az üzenet visszavonása nem sikerült: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1302,12 +1307,12 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<translation>%1 visszavonta a kopogását.</translation>
|
<translation>%1 visszavonta a kopogását.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Csatlakoztál ehhez a szobához.</translation>
|
<translation>Csatlakoztál ehhez a szobához.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>Kopogás elutasítva tőle: %1.</translation>
|
<translation>Kopogás elutasítva tőle: %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1331,7 +1336,17 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation>Szerkesztés</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation>Szerkesztve</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reakció</translation>
|
<translation>Reakció</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1349,7 +1364,7 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reakció</translation>
|
<translation>Reakció</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1358,6 +1373,11 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Válasz</translation>
|
<translation>Válasz</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation>Szerkesztés</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1482,7 +1502,12 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<translation>Állapot:</translation>
|
<translation>Állapot:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation>Felhasználói profil beállításai</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation>Elérhetőség megadása automatikusan</translation>
|
<translation>Elérhetőség megadása automatikusan</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1505,7 +1530,7 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation>Hitelesítés</translation>
|
<translation>Hitelesítés</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1524,11 +1549,40 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation>A felhasználó kirúgása</translation>
|
<translation>A felhasználó kirúgása</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation>Profilkép kiválasztása</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation>Minden fájl (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation>A kiválasztott fájl nem egy kép</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation>Hiba a fájl olvasása közben: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation>Alapértelmezett</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Kicsinyítés a tálcára</translation>
|
<translation>Kicsinyítés a tálcára</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1548,12 +1602,17 @@ Példa: https://szerver.em:8787</translation>
|
|||||||
<translation>Kerekített profilképek</translation>
|
<translation>Kerekített profilképek</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation>profil: %1</translation>
|
<translation>profil: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation>Alapértelmezett</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation>HÍVÁSOK</translation>
|
<translation>HÍVÁSOK</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1608,6 +1667,33 @@ Csak a titkosított csevegések üzeneteire vonatkozik.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation>Idővonal automatikus kitakarása</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation>Amikor az ablak elveszíti a fókuszt,
|
||||||
|
az idővonal homályosítva lesz.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation>Idővonal kitakarása ennyi idő után (másodpercben, 0 és 3600 között)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation>Add meg, hány másodperc elteltével homályosuljon el az idővonal,
|
||||||
|
miután az ablak elveszíti a fókuszt!
|
||||||
|
Ha azonnal el legyen homályosítva fókuszvesztéskor, állítsd
|
||||||
|
0-ra! A maximális érték 1 óra (3600 másodperc).</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Gombok mutatása az idővonalban</translation>
|
<translation>Gombok mutatása az idővonalban</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1724,7 +1810,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<translation>Kulcsok megosztása hitelesített felhasználókkal és eszközökkel</translation>
|
<translation>Kulcsok megosztása hitelesített felhasználókkal és eszközökkel</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation>GYORSÍTÓTÁRAZVA</translation>
|
<translation>GYORSÍTÓTÁRAZVA</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1734,7 +1820,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<translation>NINCS GYORSÍTÓTÁRAZVA</translation>
|
<translation>NINCS GYORSÍTÓTÁRAZVA</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Nagyítási tényező</translation>
|
<translation>Nagyítási tényező</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1809,7 +1895,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<translation>Eszközujjlenyomat</translation>
|
<translation>Eszközujjlenyomat</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Munkamenetkulcsok</translation>
|
<translation>Munkamenetkulcsok</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1829,17 +1915,17 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<translation>TITKOSÍTÁS</translation>
|
<translation>TITKOSÍTÁS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>ÁLTALÁNOS</translation>
|
<translation>ÁLTALÁNOS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>FELÜLET</translation>
|
<translation>FELÜLET</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation>Érintő képernyős mód</translation>
|
<translation>Érintő képernyős mód</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1881,22 +1967,22 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location line="+3"/>
|
<location line="+3"/>
|
||||||
<source>Self signing key</source>
|
<source>Self signing key</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Önaláírókulcs</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
<source>The key to verify your own devices. If it is cached, verifying one of your devices will mark it verified for all your other devices and for users, that have verified you.</source>
|
<source>The key to verify your own devices. If it is cached, verifying one of your devices will mark it verified for all your other devices and for users, that have verified you.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>A kulcs, amellyel hitelesítheted a saját eszközeidet. Ha gyorsítótárazva van, egy eszköz hitelesítése azt hitelesítettnek fogja megjelölni az összes többi eszközeidnek és azoknak a felhasználóidnak, akik már hitelesítettek téged.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+3"/>
|
<location line="+3"/>
|
||||||
<source>Backup key</source>
|
<source>Backup key</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Biztonsági mentési kulcs</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
<source>The key to decrypt online key backups. If it is cached, you can enable online key backup to store encryption keys securely encrypted on the server.</source>
|
<source>The key to decrypt online key backups. If it is cached, you can enable online key backup to store encryption keys securely encrypted on the server.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>A kulcs, amellyel hozzáférhetsz a kulcsok online biztonsági mentéseihez. Ha gyorsítótárazva van, lehetőséged van biztonsági másolatként, titkosítva a szerveren tárolni a titkosítási kulcsokat.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+54"/>
|
<location line="+54"/>
|
||||||
@ -1909,9 +1995,9 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<translation>Minden fájl (*)</translation>
|
<translation>Minden fájl (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Munkameneti fájl megnyitása</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
@ -1921,34 +2007,34 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<location line="+11"/>
|
<location line="+11"/>
|
||||||
<location line="+18"/>
|
<location line="+18"/>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Hiba</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-66"/>
|
<location line="-66"/>
|
||||||
<location line="+28"/>
|
<location line="+28"/>
|
||||||
<source>File Password</source>
|
<source>File Password</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Fájljelszó</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-27"/>
|
<location line="-27"/>
|
||||||
<source>Enter the passphrase to decrypt the file:</source>
|
<source>Enter the passphrase to decrypt the file:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Írd be a jelmondatot a fájl titkosításának feloldásához:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+8"/>
|
<location line="+8"/>
|
||||||
<location line="+28"/>
|
<location line="+28"/>
|
||||||
<source>The password cannot be empty</source>
|
<source>The password cannot be empty</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>A jelszó nem lehet üres</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-8"/>
|
<location line="-8"/>
|
||||||
<source>Enter passphrase to encrypt your session keys:</source>
|
<source>Enter passphrase to encrypt your session keys:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Írd be a jelmondatot a munkameneti kulcsok titkosításához:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+15"/>
|
<location line="+15"/>
|
||||||
<source>File to save the exported session keys</source>
|
<source>File to save the exported session keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Exportált munkameneti kulcsok mentése fájlba</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1956,17 +2042,17 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../qml/device-verification/Waiting.qml" line="+7"/>
|
<location filename="../qml/device-verification/Waiting.qml" line="+7"/>
|
||||||
<source>Waiting for other party…</source>
|
<source>Waiting for other party…</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Várakozás a másik félre…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+15"/>
|
<location line="+15"/>
|
||||||
<source>Waiting for other side to accept the verification request.</source>
|
<source>Waiting for other side to accept the verification request.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Várakozás a másik oldalra, hogy elfogadja a hitelesítési kérelmet.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
<source>Waiting for other side to continue the verification process.</source>
|
<source>Waiting for other side to continue the verification process.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Várakozás a másik oldalra a hitelesítés folytatásához.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
@ -1984,12 +2070,12 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../../src/WelcomePage.cpp" line="+46"/>
|
<location filename="../../src/WelcomePage.cpp" line="+46"/>
|
||||||
<source>Welcome to nheko! The desktop client for the Matrix protocol.</source>
|
<source>Welcome to nheko! The desktop client for the Matrix protocol.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Üdvözöl a Nheko, egy asztali kliens a Matrix protokollhoz!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
<source>Enjoy your stay!</source>
|
<source>Enjoy your stay!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Érezd jól magad nálunk!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+23"/>
|
<location line="+23"/>
|
||||||
@ -2005,9 +2091,9 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Tegnap</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2015,7 +2101,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../../src/dialogs/CreateRoom.cpp" line="+36"/>
|
<location filename="../../src/dialogs/CreateRoom.cpp" line="+36"/>
|
||||||
<source>Create room</source>
|
<source>Create room</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Szoba létrehozása</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
@ -2035,22 +2121,22 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location line="+3"/>
|
<location line="+3"/>
|
||||||
<source>Alias</source>
|
<source>Alias</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Álnév</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+8"/>
|
<location line="+8"/>
|
||||||
<source>Room Visibility</source>
|
<source>Room Visibility</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Szoba láthatósága</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+8"/>
|
<location line="+8"/>
|
||||||
<source>Room Preset</source>
|
<source>Room Preset</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Szoba jellege</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+9"/>
|
||||||
<source>Direct Chat</source>
|
<source>Direct Chat</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Közvetlen csevegés</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2058,7 +2144,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../../src/dialogs/FallbackAuth.cpp" line="+30"/>
|
<location filename="../../src/dialogs/FallbackAuth.cpp" line="+30"/>
|
||||||
<source>Open Fallback in Browser</source>
|
<source>Open Fallback in Browser</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Fallback megnyitása böngészőben</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
@ -2068,12 +2154,12 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
<source>Confirm</source>
|
<source>Confirm</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Megerősítés</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+12"/>
|
<location line="+12"/>
|
||||||
<source>Open the fallback, follow the steps and confirm after completing them.</source>
|
<source>Open the fallback, follow the steps and confirm after completing them.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Nyisd meg a fallback-ket, kövesd az utasításokat, és erősítsd meg, ha végeztél velük!</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2086,7 +2172,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location line="+8"/>
|
<location line="+8"/>
|
||||||
<source>User ID to invite</source>
|
<source>User ID to invite</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Meghívandó felhasználó azonosítója</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2094,7 +2180,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../../src/dialogs/JoinRoom.cpp" line="+30"/>
|
<location filename="../../src/dialogs/JoinRoom.cpp" line="+30"/>
|
||||||
<source>Join</source>
|
<source>Join</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Csatlakozás</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
@ -2104,7 +2190,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location line="+7"/>
|
<location line="+7"/>
|
||||||
<source>Room ID or alias</source>
|
<source>Room ID or alias</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Szoba azonosítója vagy álneve</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2117,7 +2203,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location line="+8"/>
|
<location line="+8"/>
|
||||||
<source>Are you sure you want to leave?</source>
|
<source>Are you sure you want to leave?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Biztosan távozni akarsz?</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2130,7 +2216,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location line="+8"/>
|
<location line="+8"/>
|
||||||
<source>Logout. Are you sure?</source>
|
<source>Logout. Are you sure?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Biztosan kijelentkezel?</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2138,7 +2224,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../../src/dialogs/PreviewUploadOverlay.cpp" line="+41"/>
|
<location filename="../../src/dialogs/PreviewUploadOverlay.cpp" line="+41"/>
|
||||||
<source>Upload</source>
|
<source>Upload</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Feltöltés</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
@ -2150,7 +2236,9 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
|
|||||||
<source>Media type: %1
|
<source>Media type: %1
|
||||||
Media size: %2
|
Media size: %2
|
||||||
</source>
|
</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Média típusa: %1
|
||||||
|
Média mérete: %2
|
||||||
|
</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2163,12 +2251,12 @@ Media size: %2
|
|||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
<source>Confirm</source>
|
<source>Confirm</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Megerősítés</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+11"/>
|
<location line="+11"/>
|
||||||
<source>Solve the reCAPTCHA and press the confirm button</source>
|
<source>Solve the reCAPTCHA and press the confirm button</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Oldd meg a reCAPTCHA feladványát, és nyomd meg a „Megerősítés” gombot</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2189,12 +2277,12 @@ Media size: %2
|
|||||||
<message>
|
<message>
|
||||||
<location line="-46"/>
|
<location line="-46"/>
|
||||||
<source>Today %1</source>
|
<source>Today %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Ma %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+3"/>
|
<location line="+3"/>
|
||||||
<source>Yesterday %1</source>
|
<source>Yesterday %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Tegnap %1</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2207,101 +2295,102 @@ Media size: %2
|
|||||||
<message>
|
<message>
|
||||||
<location line="+3"/>
|
<location line="+3"/>
|
||||||
<source>Info</source>
|
<source>Info</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Infó</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+11"/>
|
<location line="+11"/>
|
||||||
<source>Internal ID</source>
|
<source>Internal ID</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Belső azonosító</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+10"/>
|
<location line="+10"/>
|
||||||
<source>Room Version</source>
|
<source>Room Version</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Szoba verziója</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Értesítések</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
<source>Muted</source>
|
<source>Muted</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Némítva</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
<source>Mentions only</source>
|
<source>Mentions only</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Csak megemlítéskor</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
<source>All messages</source>
|
<source>All messages</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Mindegyik üzenetnél</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+97"/>
|
<location line="+97"/>
|
||||||
<source>Room access</source>
|
<source>Room access</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Szoba hozzáférhetősége</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
<source>Anyone and guests</source>
|
<source>Anyone and guests</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Bárkinek és vendégeknek</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
<source>Anyone</source>
|
<source>Anyone</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Bárkinek, aki ismeri a szoba linkjét (vendégek nem)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
<source>Invited users</source>
|
<source>Invited users</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Meghívott felhasználók</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+50"/>
|
<location line="+50"/>
|
||||||
<source>Encryption</source>
|
<source>Encryption</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Titkosítás</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+11"/>
|
<location line="+11"/>
|
||||||
<source>Whether or not the client should respond automatically with the session keys
|
<source>Whether or not the client should respond automatically with the session keys
|
||||||
upon request. Use with caution, this is a temporary measure to test the
|
upon request. Use with caution, this is a temporary measure to test the
|
||||||
E2E implementation until device verification is completed.</source>
|
E2E implementation until device verification is completed.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Válaszoljon-e kérés esetén a kliens munkamenetkulcsokkal automatikusan. Óvatosan használandó, mivel ez csak egy átmeneti megoldás a végponttól végpontig (E2E) titkosítás teszteléséhez, amíg be nincs fejezve az eszközhitelesítés.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+20"/>
|
<location line="+20"/>
|
||||||
<source>End-to-End Encryption</source>
|
<source>End-to-End Encryption</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Végponttól végpontig titkosítás</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+1"/>
|
<location line="+1"/>
|
||||||
<source>Encryption is currently experimental and things might break unexpectedly. <br>Please take note that it can't be disabled afterwards.</source>
|
<source>Encryption is currently experimental and things might break unexpectedly. <br>Please take note that it can't be disabled afterwards.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>A titkosítás jelenleg kísérleti stádiumú és váratlan furcsaságok történhetnek. <br# Kérlek, vedd vigyelembe, hogy ha egyszer aktiváltad, nem lehet utána kikapcsolni.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-24"/>
|
<location line="-24"/>
|
||||||
<source>Respond to key requests</source>
|
<source>Respond to key requests</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Válasz kulcskérelmekre</translation>
|
||||||
</message>
|
</message>
|
||||||
<message numerus="yes">
|
<message numerus="yes">
|
||||||
<location line="+83"/>
|
<location line="+83"/>
|
||||||
<source>%n member(s)</source>
|
<source>%n member(s)</source>
|
||||||
<translation type="unfinished">
|
<translation>
|
||||||
<numerusform></numerusform>
|
<numerusform>%n tag</numerusform>
|
||||||
|
<numerusform>%n tag</numerusform>
|
||||||
</translation>
|
</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+142"/>
|
<location line="+142"/>
|
||||||
<source>Failed to enable encryption: %1</source>
|
<source>Failed to enable encryption: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Nem sikerült a titkosítás aktiválása: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+147"/>
|
<location line="+147"/>
|
||||||
<source>Select an avatar</source>
|
<source>Select an avatar</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Profilkép kiválasztása</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+0"/>
|
<location line="+0"/>
|
||||||
@ -2311,18 +2400,18 @@ Media size: %2
|
|||||||
<message>
|
<message>
|
||||||
<location line="+12"/>
|
<location line="+12"/>
|
||||||
<source>The selected file is not an image</source>
|
<source>The selected file is not an image</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>A kiválasztott fájl nem egy kép</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Error while reading file: %1</source>
|
<source>Error while reading file: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Hiba a fájl olvasása közben: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+35"/>
|
<location line="+35"/>
|
||||||
<location line="+20"/>
|
<location line="+20"/>
|
||||||
<source>Failed to upload image: %s</source>
|
<source>Failed to upload image: %s</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Nem sikerült a kép feltöltése: %s</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Sei entrato in questa stanza.</translation>
|
<translation>Sei entrato in questa stanza.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Impossibile invitare l'utente: %1</translation>
|
<translation>Impossibile invitare l'utente: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>Invitato utente: %1</translation>
|
<translation>Invitato utente: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished">-- Evento Criptato (Chiavi per la decriptazione non trovate) --</translation>
|
<translation type="unfinished">-- Evento Criptato (Chiavi per la decriptazione non trovate) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished">Tutti i File (*)</translation>
|
<translation type="unfinished">Tutti i File (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished">Impossibile inviare il file multimediale. Per favore riprova.</translation>
|
<translation type="unfinished">Impossibile inviare il file multimediale. Per favore riprova.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<translation type="unfinished">Scrivi un messaggio…</translation>
|
<translation type="unfinished">Scrivi un messaggio…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished">Emoji</translation>
|
<translation type="unfinished">Emoji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Chiudi</translation>
|
<translation>Chiudi</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>nessuna versione memorizzata</translation>
|
<translation>nessuna versione memorizzata</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Oscuramento del messaggio fallito: %1</translation>
|
<translation>Oscuramento del messaggio fallito: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1303,12 +1308,12 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<translation>%1 ha oscurato la sua bussata.</translation>
|
<translation>%1 ha oscurato la sua bussata.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Sei entrato in questa stanza.</translation>
|
<translation>Sei entrato in questa stanza.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>Rifiutata la bussata di %1.</translation>
|
<translation>Rifiutata la bussata di %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1332,7 +1337,17 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1350,7 +1365,7 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1359,6 +1374,11 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Risposta</translation>
|
<translation>Risposta</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1483,7 +1503,12 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1506,7 +1531,7 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1525,11 +1550,40 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">Scegli un avatar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Tutti i File (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished">Il file selezionato non è un'immagine</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished">Errore durante la lettura del file: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Minimizza nella tray</translation>
|
<translation>Minimizza nella tray</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1549,12 +1603,17 @@ Esempio: https://server.mio:8787</translation>
|
|||||||
<translation>Avatar Circolari</translation>
|
<translation>Avatar Circolari</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1607,6 +1666,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Mostra pulsanti nella timeline</translation>
|
<translation>Mostra pulsanti nella timeline</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1717,7 +1799,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1727,7 +1809,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Fattore di scala</translation>
|
<translation>Fattore di scala</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1802,7 +1884,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Impronta digitale del dispositivo</translation>
|
<translation>Impronta digitale del dispositivo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Chiavi di Sessione</translation>
|
<translation>Chiavi di Sessione</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1822,17 +1904,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>CRITTOGRAFIA</translation>
|
<translation>CRITTOGRAFIA</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>GENERALE</translation>
|
<translation>GENERALE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>INTERFACCIA</translation>
|
<translation>INTERFACCIA</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1902,7 +1984,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished">Tutti i File (*)</translation>
|
<translation type="unfinished">Tutti i File (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Apri File delle Sessioni</translation>
|
<translation>Apri File delle Sessioni</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1998,7 +2080,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Ieri</translation>
|
<translation>Ieri</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>ユーザーを招待できませんでした: %1</translation>
|
<translation>ユーザーを招待できませんでした: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>招待されたユーザー: %1</translation>
|
<translation>招待されたユーザー: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished">-- 暗号化イベント (復号鍵が見つかりません) --</translation>
|
<translation type="unfinished">-- 暗号化イベント (復号鍵が見つかりません) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished">全てのファイル (*)</translation>
|
<translation type="unfinished">全てのファイル (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished">メディアをアップロードできませんでした。やり直して下さい。</translation>
|
<translation type="unfinished">メディアをアップロードできませんでした。やり直して下さい。</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished">メッセージを書く...</translation>
|
<translation type="unfinished">メッセージを書く...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished">絵文字</translation>
|
<translation type="unfinished">絵文字</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished">閉じる</translation>
|
<translation type="unfinished">閉じる</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>バージョンが保存されていません</translation>
|
<translation>バージョンが保存されていません</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>メッセージを編集できませんでした: %1</translation>
|
<translation>メッセージを編集できませんでした: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1298,12 +1303,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>%1がノックを編集しました。</translation>
|
<translation>%1がノックを編集しました。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>%1からのノックを拒否しました。</translation>
|
<translation>%1からのノックを拒否しました。</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1327,7 +1332,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1345,7 +1360,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1354,6 +1369,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished">返信</translation>
|
<translation type="unfinished">返信</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1478,7 +1498,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1501,7 +1526,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1520,11 +1545,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">アバターを選択</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">全てのファイル (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished">選択したファイルは画像ではありません</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished">ファイルの読み込み時にエラーが発生しました: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>トレイへ最小化</translation>
|
<translation>トレイへ最小化</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1544,12 +1598,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>円形アバター</translation>
|
<translation>円形アバター</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1602,6 +1661,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1712,7 +1794,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1722,7 +1804,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>尺度係数</translation>
|
<translation>尺度係数</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1797,7 +1879,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>デバイスの指紋</translation>
|
<translation>デバイスの指紋</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>セッション鍵</translation>
|
<translation>セッション鍵</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1817,17 +1899,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>暗号化</translation>
|
<translation>暗号化</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>全般</translation>
|
<translation>全般</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1897,7 +1979,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished">全てのファイル (*)</translation>
|
<translation type="unfinished">全てのファイル (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>セッションファイルを開く</translation>
|
<translation>セッションファイルを開く</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1993,7 +2075,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>昨日</translation>
|
<translation>昨日</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>നിങ്ങൾ ഈ മുറിയിൽ ചേർന്നു.</translation>
|
<translation>നിങ്ങൾ ഈ മുറിയിൽ ചേർന്നു.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>ഉപയോക്താവിനെ ക്ഷണിക്കുന്നതിൽ പരാജയപ്പെട്ടു: %1</translation>
|
<translation>ഉപയോക്താവിനെ ക്ഷണിക്കുന്നതിൽ പരാജയപ്പെട്ടു: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>ക്ഷണിച്ച ഉപയോക്താവ്:% 1</translation>
|
<translation>ക്ഷണിച്ച ഉപയോക്താവ്:% 1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>ഒരു സന്ദേശം എഴുതുക….</translation>
|
<translation>ഒരു സന്ദേശം എഴുതുക….</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation>ഇമോജി</translation>
|
<translation>ഇമോജി</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>അയക്കുക</translation>
|
<translation>അയക്കുക</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished">അടയ്ക്കുക</translation>
|
<translation type="unfinished">അടയ്ക്കുക</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1299,12 +1304,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished">നിങ്ങൾ ഈ മുറിയിൽ ചേർന്നു.</translation>
|
<translation type="unfinished">നിങ്ങൾ ഈ മുറിയിൽ ചേർന്നു.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1328,7 +1333,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1346,7 +1361,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1355,6 +1370,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1479,7 +1499,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1502,7 +1527,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1521,11 +1546,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1545,12 +1599,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1603,6 +1662,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1713,7 +1795,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1723,7 +1805,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1798,7 +1880,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1818,17 +1900,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1898,7 +1980,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1994,7 +2076,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Je bent lid geworden van deze kamer.</translation>
|
<translation>Je bent lid geworden van deze kamer.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Gebruiker uitnodigen mislukt: %1</translation>
|
<translation>Gebruiker uitnodigen mislukt: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>Gebruiker uitgenodigd: %1</translation>
|
<translation>Gebruiker uitgenodigd: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished">Alle bestanden (*)</translation>
|
<translation type="unfinished">Alle bestanden (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished">Typ een bericht...</translation>
|
<translation type="unfinished">Typ een bericht...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1299,12 +1304,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished">Je bent lid geworden van deze kamer.</translation>
|
<translation type="unfinished">Je bent lid geworden van deze kamer.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1328,7 +1333,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1346,7 +1361,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1355,6 +1370,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1479,7 +1499,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1502,7 +1527,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1521,11 +1546,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Alle bestanden (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Minimaliseren naar systeemvak</translation>
|
<translation>Minimaliseren naar systeemvak</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1545,12 +1599,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1603,6 +1662,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1713,7 +1795,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1723,7 +1805,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1798,7 +1880,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1818,17 +1900,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>ALGEMEEN</translation>
|
<translation>ALGEMEEN</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1898,7 +1980,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished">Alle bestanden (*)</translation>
|
<translation type="unfinished">Alle bestanden (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1994,7 +2076,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Dołączyłeś(-łaś) do tego pokoju.</translation>
|
<translation>Dołączyłeś(-łaś) do tego pokoju.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Nie udało się zaprosić użytkownika: %1</translation>
|
<translation>Nie udało się zaprosić użytkownika: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Zdarzenie szyfrowania (Nie znaleziono kluczy deszyfrujących)</translation>
|
<translation>-- Zdarzenie szyfrowania (Nie znaleziono kluczy deszyfrujących)</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished">Wszystkie pliki (*)</translation>
|
<translation type="unfinished">Wszystkie pliki (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -799,12 +799,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished">Napisz wiadomość…</translation>
|
<translation type="unfinished">Napisz wiadomość…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished">Emoji</translation>
|
<translation type="unfinished">Emoji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1001,15 +1001,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Zamknij</translation>
|
<translation>Zamknij</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1151,7 +1156,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
|
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1302,12 +1307,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished">Dołączyłeś(-łaś) do tego pokoju.</translation>
|
<translation type="unfinished">Dołączyłeś(-łaś) do tego pokoju.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1331,7 +1336,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1349,7 +1364,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1358,6 +1373,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1482,7 +1502,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1505,7 +1530,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1524,11 +1549,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">Wybierz awatar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Wszystkie pliki (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Zminimalizuj do paska zadań</translation>
|
<translation>Zminimalizuj do paska zadań</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1548,12 +1602,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1606,6 +1665,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1716,7 +1798,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1726,7 +1808,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1801,7 +1883,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Odcisk palca urządzenia</translation>
|
<translation>Odcisk palca urządzenia</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1821,17 +1903,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>SZYFROWANIE</translation>
|
<translation>SZYFROWANIE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>OGÓLNE</translation>
|
<translation>OGÓLNE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1901,7 +1983,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished">Wszystkie pliki (*)</translation>
|
<translation type="unfinished">Wszystkie pliki (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1997,7 +2079,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1299,12 +1304,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1328,7 +1333,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1346,7 +1361,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1355,6 +1370,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1479,7 +1499,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1502,7 +1527,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1521,11 +1546,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1545,12 +1599,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1603,6 +1662,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1713,7 +1795,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1723,7 +1805,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1798,7 +1880,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1818,17 +1900,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1898,7 +1980,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1994,7 +2076,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Te-ai alăturat camerei.</translation>
|
<translation>Te-ai alăturat camerei.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Nu s-a putut invita utilizatorul: %1</translation>
|
<translation>Nu s-a putut invita utilizatorul: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>Utilizator invitat: %1</translation>
|
<translation>Utilizator invitat: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished">Toate fișierele (*)</translation>
|
<translation type="unfinished">Toate fișierele (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished">Închide</translation>
|
<translation type="unfinished">Închide</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>nicio versiune stocată</translation>
|
<translation>nicio versiune stocată</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Redactare mesaj eșuată: %1</translation>
|
<translation>Redactare mesaj eșuată: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1304,12 +1309,12 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<translation>%1 și-a redactat ciocănitul.</translation>
|
<translation>%1 și-a redactat ciocănitul.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Te-ai alăturat camerei.</translation>
|
<translation>Te-ai alăturat camerei.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>Ciocănit refuzat de la %1.</translation>
|
<translation>Ciocănit refuzat de la %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1333,7 +1338,17 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1351,7 +1366,7 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1360,6 +1375,11 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Răspuns</translation>
|
<translation>Răspuns</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1484,7 +1504,12 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1507,7 +1532,7 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1526,11 +1551,40 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">Selectează un avatar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Toate fișierele (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished">Fișierul selectat nu este imagine</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished">Eroare întâmpinată la citirea fișierului: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Minimizează în bara de notificări</translation>
|
<translation>Minimizează în bara de notificări</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1550,12 +1604,17 @@ Exemplu: https://serverul.meu:8787</translation>
|
|||||||
<translation>Avatare rotunde</translation>
|
<translation>Avatare rotunde</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1608,6 +1667,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Arată butoanele în cronologie</translation>
|
<translation>Arată butoanele în cronologie</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1718,7 +1800,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1728,7 +1810,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Factor de dimensiune</translation>
|
<translation>Factor de dimensiune</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1803,7 +1885,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Amprentă Dispozitiv</translation>
|
<translation>Amprentă Dispozitiv</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Chei de sesiune</translation>
|
<translation>Chei de sesiune</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1823,17 +1905,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>CRIPTARE</translation>
|
<translation>CRIPTARE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>GENERAL</translation>
|
<translation>GENERAL</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>INTERFAȚĂ</translation>
|
<translation>INTERFAȚĂ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1903,7 +1985,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished">Toate fișierele (*)</translation>
|
<translation type="unfinished">Toate fișierele (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Deschide fișierul de sesiuni</translation>
|
<translation>Deschide fișierul de sesiuni</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1999,7 +2081,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Ieri</translation>
|
<translation>Ieri</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Вы присоединились к этой комнате.</translation>
|
<translation>Вы присоединились к этой комнате.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Не удалось пригласить пользователя: %1</translation>
|
<translation>Не удалось пригласить пользователя: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>Приглашенный пользователь: %1</translation>
|
<translation>Приглашенный пользователь: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Зашифрованное событие (Нет найдено ключей для дешифрования) --</translation>
|
<translation>-- Зашифрованное событие (Нет найдено ключей для дешифрования) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation>Все файлы (*)</translation>
|
<translation>Все файлы (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation>Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation>
|
<translation>Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>Написать сообщение…</translation>
|
<translation>Написать сообщение…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation>Эмоджи</translation>
|
<translation>Эмоджи</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>Отправить</translation>
|
<translation>Отправить</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Закрыть</translation>
|
<translation>Закрыть</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>нет сохраненной версии</translation>
|
<translation>нет сохраненной версии</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Ошибка редактирования сообщения: %1</translation>
|
<translation>Ошибка редактирования сообщения: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1304,12 +1309,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>%1 отредактировал его "стук".</translation>
|
<translation>%1 отредактировал его "стук".</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Вы присоединились к этой комнате.</translation>
|
<translation>Вы присоединились к этой комнате.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>Отверг "стук" от %1</translation>
|
<translation>Отверг "стук" от %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1333,7 +1338,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Отреагировать</translation>
|
<translation>Отреагировать</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1351,7 +1366,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Отреагировать</translation>
|
<translation>Отреагировать</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1360,6 +1375,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Ответить</translation>
|
<translation>Ответить</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1484,7 +1504,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>Статус: </translation>
|
<translation>Статус: </translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation>Установить 'presence'автоматически</translation>
|
<translation>Установить 'presence'автоматически</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1507,7 +1532,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation>Верифицировать</translation>
|
<translation>Верифицировать</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1526,11 +1551,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation>Выгнать пользователя</translation>
|
<translation>Выгнать пользователя</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">Выберите аватар</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Все файлы (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished">Выбранный файл не является картинкой</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished">Ошибка во время прочтения файла: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Сворачивать в системную панель</translation>
|
<translation>Сворачивать в системную панель</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1550,12 +1604,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>Округлый Аватар</translation>
|
<translation>Округлый Аватар</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation>профиль: %1</translation>
|
<translation>профиль: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation>ЗВОНКИ</translation>
|
<translation>ЗВОНКИ</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1608,6 +1667,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Отображать кнопки в таймлайне</translation>
|
<translation>Отображать кнопки в таймлайне</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1723,7 +1805,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Делиться ключами с проверенными участниками и устройствами</translation>
|
<translation>Делиться ключами с проверенными участниками и устройствами</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1733,7 +1815,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Масштаб</translation>
|
<translation>Масштаб</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1808,7 +1890,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Отпечаток устройства</translation>
|
<translation>Отпечаток устройства</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Ключи сеанса</translation>
|
<translation>Ключи сеанса</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1828,17 +1910,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>ШИФРОВАНИЕ</translation>
|
<translation>ШИФРОВАНИЕ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>ГЛАВНОЕ</translation>
|
<translation>ГЛАВНОЕ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>ИНТЕРФЕЙС</translation>
|
<translation>ИНТЕРФЕЙС</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation>Сенсорный режим</translation>
|
<translation>Сенсорный режим</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1908,7 +1990,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>Все файлы (*)</translation>
|
<translation>Все файлы (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Открыть файл сеансов</translation>
|
<translation>Открыть файл сеансов</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -2005,7 +2087,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Вчера</translation>
|
<translation>Вчера</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1299,12 +1304,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1328,7 +1333,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1346,7 +1361,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1355,6 +1370,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1479,7 +1499,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1502,7 +1527,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1521,11 +1546,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1545,12 +1599,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1603,6 +1662,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1713,7 +1795,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1723,7 +1805,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1798,7 +1880,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1818,17 +1900,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1898,7 +1980,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1994,7 +2076,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Du gick med i detta rum.</translation>
|
<translation>Du gick med i detta rum.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>Kunde inte bjuda in användare: %1</translation>
|
<translation>Kunde inte bjuda in användare: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>Bjöd in användare: %1</translation>
|
<translation>Bjöd in användare: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation>-- Krypterat Event (Inga nycklar kunde hittas för dekryptering) --</translation>
|
<translation>-- Krypterat Event (Inga nycklar kunde hittas för dekryptering) --</translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation>Alla Filer (*)</translation>
|
<translation>Alla Filer (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation>Kunde inte ladda upp media. Vänligen försök igen.</translation>
|
<translation>Kunde inte ladda upp media. Vänligen försök igen.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -801,12 +801,12 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<translation>Skriv ett meddelande…</translation>
|
<translation>Skriv ett meddelande…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation>Emoji</translation>
|
<translation>Emoji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation>Skicka</translation>
|
<translation>Skicka</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1003,15 +1003,20 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Stäng</translation>
|
<translation>Stäng</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation>ingen version lagrad</translation>
|
<translation>ingen version lagrad</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1153,7 +1158,7 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation>Kunde inte maskera meddelande: %1</translation>
|
<translation>Kunde inte maskera meddelande: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1303,12 +1308,12 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<translation>%1 maskerade sin knackning.</translation>
|
<translation>%1 maskerade sin knackning.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>Du gick med i detta rum.</translation>
|
<translation>Du gick med i detta rum.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation>Avvisade knackningen från %1.</translation>
|
<translation>Avvisade knackningen från %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1332,7 +1337,17 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reagera</translation>
|
<translation>Reagera</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1350,7 +1365,7 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation>Reagera</translation>
|
<translation>Reagera</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1359,6 +1374,11 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation>Svara</translation>
|
<translation>Svara</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1483,7 +1503,12 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<translation>Status:</translation>
|
<translation>Status:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation>Sätt närvaro automatiskt</translation>
|
<translation>Sätt närvaro automatiskt</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1506,7 +1531,7 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation>Bekräfta</translation>
|
<translation>Bekräfta</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1525,11 +1550,40 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation>Sparka ut användaren</translation>
|
<translation>Sparka ut användaren</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">Välj en avatar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">Alla Filer (*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished">Den valda filen är inte en bild</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished">Kunde inte läsa filen: %1</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>Minimera till systemtråg</translation>
|
<translation>Minimera till systemtråg</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1549,12 +1603,17 @@ Exempel: https://server.my:8787</translation>
|
|||||||
<translation>Cirkulära avatarer</translation>
|
<translation>Cirkulära avatarer</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation>profil: %1</translation>
|
<translation>profil: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation>SAMTAL</translation>
|
<translation>SAMTAL</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1609,6 +1668,29 @@ Påverkar endast krypterade chattar.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation>Visa knappar i tidslinje</translation>
|
<translation>Visa knappar i tidslinje</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1725,7 +1807,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
|
|||||||
<translation>Dela nycklar med verifierade användare och enheter</translation>
|
<translation>Dela nycklar med verifierade användare och enheter</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation>SPARAD</translation>
|
<translation>SPARAD</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1735,7 +1817,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
|
|||||||
<translation>EJ SPARAD</translation>
|
<translation>EJ SPARAD</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation>Storleksfaktor</translation>
|
<translation>Storleksfaktor</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1810,7 +1892,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
|
|||||||
<translation>Enhetsfingeravtryck</translation>
|
<translation>Enhetsfingeravtryck</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>Sessionsnycklar</translation>
|
<translation>Sessionsnycklar</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1830,17 +1912,17 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
|
|||||||
<translation>KRYPTERING</translation>
|
<translation>KRYPTERING</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>ALLMÄNT</translation>
|
<translation>ALLMÄNT</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation>GRÄNSSNITT</translation>
|
<translation>GRÄNSSNITT</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation>Touchskärmsläge</translation>
|
<translation>Touchskärmsläge</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1910,7 +1992,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
|
|||||||
<translation>Alla Filer (*)</translation>
|
<translation>Alla Filer (*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>Öppna sessionsfil</translation>
|
<translation>Öppna sessionsfil</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -2006,7 +2088,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation>Igår</translation>
|
<translation>Igår</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Cache</name>
|
<name>Cache</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1978"/>
|
<location filename="../../src/Cache.cpp" line="+2084"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation>您已加入此房间</translation>
|
<translation>您已加入此房间</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -120,13 +120,13 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ChatPage</name>
|
<name>ChatPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/ChatPage.cpp" line="+211"/>
|
<location filename="../../src/ChatPage.cpp" line="+215"/>
|
||||||
<source>Failed to invite user: %1</source>
|
<source>Failed to invite user: %1</source>
|
||||||
<translation>邀请用户失败: %1</translation>
|
<translation>邀请用户失败: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+4"/>
|
<location line="+4"/>
|
||||||
<location line="+796"/>
|
<location line="+797"/>
|
||||||
<source>Invited user: %1</source>
|
<source>Invited user: %1</source>
|
||||||
<translation>邀请已发送: %1</translation>
|
<translation>邀请已发送: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>EventStore</name>
|
<name>EventStore</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/EventStore.cpp" line="+559"/>
|
<location filename="../../src/timeline/EventStore.cpp" line="+612"/>
|
||||||
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
<source>-- Encrypted Event (No keys found for decryption) --</source>
|
||||||
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
<comment>Placeholder, when the message was not decrypted yet or can't be decrypted.</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -568,7 +568,7 @@
|
|||||||
<translation type="unfinished">所有文件(*)</translation>
|
<translation type="unfinished">所有文件(*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+340"/>
|
<location line="+384"/>
|
||||||
<source>Failed to upload media. Please try again.</source>
|
<source>Failed to upload media. Please try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -797,12 +797,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation>写一条消息…</translation>
|
<translation>写一条消息…</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+170"/>
|
<location line="+186"/>
|
||||||
<source>Emoji</source>
|
<source>Emoji</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+14"/>
|
<location line="+15"/>
|
||||||
<source>Send</source>
|
<source>Send</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -999,15 +999,20 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>ReplyPopup</name>
|
<name>ReplyPopup</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/ReplyPopup.qml" line="+43"/>
|
<location filename="../qml/ReplyPopup.qml" line="+45"/>
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+13"/>
|
||||||
|
<source>Cancel edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>RoomInfo</name>
|
<name>RoomInfo</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Cache.cpp" line="+1868"/>
|
<location filename="../../src/Cache.cpp" line="+1861"/>
|
||||||
<source>no version stored</source>
|
<source>no version stored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1149,7 +1154,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineModel</name>
|
<name>TimelineModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/timeline/TimelineModel.cpp" line="+860"/>
|
<location filename="../../src/timeline/TimelineModel.cpp" line="+895"/>
|
||||||
<source>Message redaction failed: %1</source>
|
<source>Message redaction failed: %1</source>
|
||||||
<translation type="unfinished">删除消息失败:%1</translation>
|
<translation type="unfinished">删除消息失败:%1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1298,12 +1303,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-771"/>
|
<location line="-795"/>
|
||||||
<source>You joined this room.</source>
|
<source>You joined this room.</source>
|
||||||
<translation type="unfinished">您已加入此房间</translation>
|
<translation type="unfinished">您已加入此房间</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+773"/>
|
<location line="+797"/>
|
||||||
<source>Rejected the knock from %1.</source>
|
<source>Rejected the knock from %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1327,7 +1332,17 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineRow</name>
|
<name>TimelineRow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineRow.qml" line="+97"/>
|
<location filename="../qml/TimelineRow.qml" line="+99"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>Edited</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+17"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1345,7 +1360,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>TimelineView</name>
|
<name>TimelineView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/TimelineView.qml" line="+83"/>
|
<location filename="../qml/TimelineView.qml" line="+85"/>
|
||||||
<source>React</source>
|
<source>React</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1354,6 +1369,11 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+7"/>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+5"/>
|
<location line="+5"/>
|
||||||
<source>Read receipts</source>
|
<source>Read receipts</source>
|
||||||
@ -1478,7 +1498,12 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+9"/>
|
<location line="+8"/>
|
||||||
|
<source>User Profile Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
<source>Set presence automatically</source>
|
<source>Set presence automatically</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1501,7 +1526,7 @@ Example: https://server.my:8787</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>UserProfile</name>
|
<name>UserProfile</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/UserProfile.qml" line="+54"/>
|
<location filename="../qml/UserProfile.qml" line="+133"/>
|
||||||
<source>Verify</source>
|
<source>Verify</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1520,11 +1545,40 @@ Example: https://server.my:8787</source>
|
|||||||
<source>Kick the user</source>
|
<source>Kick the user</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/ui/UserProfile.cpp" line="+296"/>
|
||||||
|
<source>Select an avatar</source>
|
||||||
|
<translation type="unfinished">选择一个头像</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+0"/>
|
||||||
|
<source>All Files (*)</source>
|
||||||
|
<translation type="unfinished">所有文件(*)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+12"/>
|
||||||
|
<source>The selected file is not an image</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+5"/>
|
||||||
|
<source>Error while reading file: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UserSettings</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../../src/UserSettingsPage.cpp" line="+345"/>
|
||||||
|
<location filename="../../src/UserSettingsPage.h" line="+183"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>UserSettingsPage</name>
|
<name>UserSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/UserSettingsPage.cpp" line="+794"/>
|
<location line="+496"/>
|
||||||
<source>Minimize to tray</source>
|
<source>Minimize to tray</source>
|
||||||
<translation>最小化至托盘</translation>
|
<translation>最小化至托盘</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1544,12 +1598,17 @@ Example: https://server.my:8787</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-195"/>
|
<location line="-210"/>
|
||||||
<source>profile: %1</source>
|
<source>profile: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+112"/>
|
<location line="+96"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+31"/>
|
||||||
<source>CALLS</source>
|
<source>CALLS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1602,6 +1661,29 @@ Only affects messages in encrypted chats.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+2"/>
|
<location line="+2"/>
|
||||||
|
<source>Privacy Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>When the window loses focus, the timeline will
|
||||||
|
be blurred.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Privacy screen timeout (in seconds [0 - 3600])</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+2"/>
|
||||||
|
<source>Set timeout (in seconds) for how long after window loses
|
||||||
|
focus before the screen will be blurred.
|
||||||
|
Set to 0 to blur immediately after focus loss. Max value of 1 hour (3600 seconds)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location line="+3"/>
|
||||||
<source>Show buttons in timeline</source>
|
<source>Show buttons in timeline</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1712,7 +1794,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+395"/>
|
<location line="+407"/>
|
||||||
<source>CACHED</source>
|
<source>CACHED</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1722,7 +1804,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-449"/>
|
<location line="-461"/>
|
||||||
<source>Scale factor</source>
|
<source>Scale factor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1797,7 +1879,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>设备指纹</translation>
|
<translation>设备指纹</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-155"/>
|
<location line="-164"/>
|
||||||
<source>Session Keys</source>
|
<source>Session Keys</source>
|
||||||
<translation>会话密钥</translation>
|
<translation>会话密钥</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1817,17 +1899,17 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation>加密</translation>
|
<translation>加密</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="-100"/>
|
<location line="-115"/>
|
||||||
<source>GENERAL</source>
|
<source>GENERAL</source>
|
||||||
<translation>通用</translation>
|
<translation>通用</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+57"/>
|
<location line="+64"/>
|
||||||
<source>INTERFACE</source>
|
<source>INTERFACE</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+177"/>
|
<location line="+194"/>
|
||||||
<source>Touchscreen mode</source>
|
<source>Touchscreen mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1897,7 +1979,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<translation type="unfinished">所有文件(*)</translation>
|
<translation type="unfinished">所有文件(*)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location line="+225"/>
|
<location line="+237"/>
|
||||||
<source>Open Sessions File</source>
|
<source>Open Sessions File</source>
|
||||||
<translation>打开会话文件</translation>
|
<translation>打开会话文件</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1993,7 +2075,7 @@ This usually causes the application icon in the task bar to animate in some fash
|
|||||||
<context>
|
<context>
|
||||||
<name>descriptiveTime</name>
|
<name>descriptiveTime</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../src/Utils.cpp" line="+147"/>
|
<location filename="../../src/Utils.cpp" line="+145"/>
|
||||||
<source>Yesterday</source>
|
<source>Yesterday</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
Name=nheko
|
Name=nheko
|
||||||
Version=1.0
|
Version=1.0
|
||||||
Comment=Desktop client for Matrix
|
Comment=Desktop client for Matrix
|
||||||
Exec=nheko
|
Exec=nheko %u
|
||||||
Icon=nheko
|
Icon=nheko
|
||||||
Type=Application
|
Type=Application
|
||||||
Categories=Network;InstantMessaging;Qt;
|
Categories=Network;InstantMessaging;Qt;
|
||||||
|
@ -90,4 +90,9 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CursorShape {
|
||||||
|
anchors.fill: parent
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import QtQuick 2.5
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.1
|
import QtQuick.Controls 2.1
|
||||||
import im.nheko 1.0
|
import im.nheko 1.0
|
||||||
|
|
||||||
@ -24,14 +24,11 @@ Rectangle {
|
|||||||
color: "transparent"
|
color: "transparent"
|
||||||
width: 16
|
width: 16
|
||||||
height: 16
|
height: 16
|
||||||
ToolTip.visible: ma.containsMouse && indicator.visible
|
ToolTip.visible: ma.hovered && indicator.visible
|
||||||
ToolTip.text: getEncryptionTooltip()
|
ToolTip.text: getEncryptionTooltip()
|
||||||
|
|
||||||
MouseArea {
|
HoverHandler {
|
||||||
id: ma
|
id: ma
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
hoverEnabled: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Image {
|
Image {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import "./ui"
|
import "./ui"
|
||||||
import QtQuick 2.3
|
import QtQuick 2.3
|
||||||
import QtQuick.Controls 2.3
|
import QtQuick.Controls 2.3
|
||||||
|
import im.nheko 1.0 // for cursor shape
|
||||||
|
|
||||||
AbstractButton {
|
AbstractButton {
|
||||||
id: button
|
id: button
|
||||||
@ -23,11 +24,10 @@ AbstractButton {
|
|||||||
source: image != "" ? ("image://colorimage/" + image + "?" + ((button.hovered && changeColorOnHover) ? highlightColor : buttonTextColor)) : ""
|
source: image != "" ? ("image://colorimage/" + image + "?" + ((button.hovered && changeColorOnHover) ? highlightColor : buttonTextColor)) : ""
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
CursorShape {
|
||||||
id: mouseArea
|
id: mouseArea
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
onPressed: mouse.accepted = false
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ TextEdit {
|
|||||||
focus: false
|
focus: false
|
||||||
wrapMode: Text.Wrap
|
wrapMode: Text.Wrap
|
||||||
selectByMouse: !Settings.mobileMode
|
selectByMouse: !Settings.mobileMode
|
||||||
|
enabled: selectByMouse
|
||||||
color: colors.text
|
color: colors.text
|
||||||
onLinkActivated: {
|
onLinkActivated: {
|
||||||
if (/^https:\/\/matrix.to\/#\/(@.*)$/.test(link)) {
|
if (/^https:\/\/matrix.to\/#\/(@.*)$/.test(link)) {
|
||||||
@ -25,12 +26,9 @@ TextEdit {
|
|||||||
ToolTip.visible: hoveredLink
|
ToolTip.visible: hoveredLink
|
||||||
ToolTip.text: hoveredLink
|
ToolTip.text: hoveredLink
|
||||||
|
|
||||||
MouseArea {
|
CursorShape {
|
||||||
id: ma
|
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
acceptedButtons: Qt.NoButton
|
cursorShape: hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -139,6 +139,7 @@ Rectangle {
|
|||||||
if (TimelineManager.timeline)
|
if (TimelineManager.timeline)
|
||||||
TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text);
|
TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text);
|
||||||
|
|
||||||
|
forceActiveFocus();
|
||||||
}
|
}
|
||||||
onCursorRectangleChanged: textInput.ensureVisible(cursorRectangle)
|
onCursorRectangleChanged: textInput.ensureVisible(cursorRectangle)
|
||||||
onCursorPositionChanged: {
|
onCursorPositionChanged: {
|
||||||
@ -163,6 +164,10 @@ Rectangle {
|
|||||||
TimelineManager.timeline.input.paste(false);
|
TimelineManager.timeline.input.paste(false);
|
||||||
event.accepted = true;
|
event.accepted = true;
|
||||||
} else if (event.key == Qt.Key_Space) {
|
} else if (event.key == Qt.Key_Space) {
|
||||||
|
// close popup if user enters space after colon
|
||||||
|
if (cursorPosition == completerTriggeredAt + 1)
|
||||||
|
popup.close();
|
||||||
|
|
||||||
if (popup.opened && popup.count <= 0)
|
if (popup.opened && popup.count <= 0)
|
||||||
popup.close();
|
popup.close();
|
||||||
|
|
||||||
@ -256,16 +261,28 @@ Rectangle {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
ignoreUnknownSignals: true
|
ignoreUnknownSignals: true
|
||||||
onInsertText: messageInput.insert(messageInput.cursorPosition, text)
|
onInsertText: {
|
||||||
|
messageInput.insert(messageInput.cursorPosition, text);
|
||||||
|
}
|
||||||
|
onTextChanged: {
|
||||||
|
messageInput.text = newText;
|
||||||
|
messageInput.cursorPosition = newText.length;
|
||||||
|
}
|
||||||
target: TimelineManager.timeline ? TimelineManager.timeline.input : null
|
target: TimelineManager.timeline ? TimelineManager.timeline.input : null
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
ignoreUnknownSignals: true
|
ignoreUnknownSignals: true
|
||||||
onReplyChanged: messageInput.forceActiveFocus()
|
onReplyChanged: messageInput.forceActiveFocus()
|
||||||
|
onEditChanged: messageInput.forceActiveFocus()
|
||||||
target: TimelineManager.timeline
|
target: TimelineManager.timeline
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: TimelineManager
|
||||||
|
onFocusInput: messageInput.forceActiveFocus()
|
||||||
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
// workaround for wrong cursor shape on some platforms
|
// workaround for wrong cursor shape on some platforms
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
@ -293,6 +310,7 @@ Rectangle {
|
|||||||
ToolTip.text: qsTr("Emoji")
|
ToolTip.text: qsTr("Emoji")
|
||||||
onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(emojiButton, function(emoji) {
|
onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(emojiButton, function(emoji) {
|
||||||
messageInput.insert(messageInput.cursorPosition, emoji);
|
messageInput.insert(messageInput.cursorPosition, emoji);
|
||||||
|
TimelineManager.focusMessageInput();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,19 +1,22 @@
|
|||||||
import "./delegates"
|
import "./delegates"
|
||||||
import QtGraphicalEffects 1.0
|
import QtGraphicalEffects 1.0
|
||||||
import QtQuick 2.9
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.3
|
import QtQuick.Controls 2.3
|
||||||
import QtQuick.Layouts 1.2
|
import QtQuick.Layouts 1.2
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
import im.nheko 1.0
|
import im.nheko 1.0
|
||||||
|
|
||||||
|
ScrollView {
|
||||||
|
contentWidth: availableWidth
|
||||||
|
clip: false
|
||||||
|
palette: colors
|
||||||
|
padding: 8
|
||||||
|
|
||||||
ListView {
|
ListView {
|
||||||
id: chat
|
id: chat
|
||||||
|
|
||||||
property int delegateMaxWidth: (Settings.timelineMaxWidth > 100 && (parent.width - Settings.timelineMaxWidth) > scrollbar.width * 2) ? Settings.timelineMaxWidth : (parent.width - scrollbar.width * 2 - 8)
|
property int delegateMaxWidth: ((Settings.timelineMaxWidth > 100 && Settings.timelineMaxWidth < parent.availableWidth) ? Settings.timelineMaxWidth : parent.availableWidth) - parent.padding
|
||||||
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.fillHeight: true
|
|
||||||
cacheBuffer: 400
|
|
||||||
model: TimelineManager.timeline
|
model: TimelineManager.timeline
|
||||||
boundsBehavior: Flickable.StopAtBounds
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
pixelAligned: true
|
pixelAligned: true
|
||||||
@ -50,7 +53,12 @@ ListView {
|
|||||||
|
|
||||||
Shortcut {
|
Shortcut {
|
||||||
sequence: StandardKey.Cancel
|
sequence: StandardKey.Cancel
|
||||||
onActivated: chat.model.reply = undefined
|
onActivated: {
|
||||||
|
if (chat.model.reply)
|
||||||
|
chat.model.reply = undefined;
|
||||||
|
else
|
||||||
|
chat.model.edit = undefined;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Shortcut {
|
Shortcut {
|
||||||
@ -66,6 +74,26 @@ ListView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Shortcut {
|
||||||
|
sequence: "Ctrl+E"
|
||||||
|
onActivated: {
|
||||||
|
chat.model.edit = chat.model.reply;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: TimelineManager
|
||||||
|
onFocusChanged: readTimer.running = TimelineManager.isWindowFocused
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: readTimer
|
||||||
|
|
||||||
|
// force current read index to update
|
||||||
|
onTriggered: chat.model.setCurrentIndex(chat.model.currentIndex)
|
||||||
|
interval: 1000
|
||||||
|
}
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
id: sectionHeader
|
id: sectionHeader
|
||||||
|
|
||||||
@ -102,6 +130,7 @@ ListView {
|
|||||||
|
|
||||||
Avatar {
|
Avatar {
|
||||||
id: messageUserAvatar
|
id: messageUserAvatar
|
||||||
|
|
||||||
width: avatarSize
|
width: avatarSize
|
||||||
height: avatarSize
|
height: avatarSize
|
||||||
url: modelData ? chat.model.avatarUrl(modelData.userId).replace("mxc://", "image://MxcImage/") : ""
|
url: modelData ? chat.model.avatarUrl(modelData.userId).replace("mxc://", "image://MxcImage/") : ""
|
||||||
@ -113,7 +142,7 @@ ListView {
|
|||||||
Connections {
|
Connections {
|
||||||
target: chat.model
|
target: chat.model
|
||||||
onRoomAvatarUrlChanged: {
|
onRoomAvatarUrlChanged: {
|
||||||
messageUserAvatar.url = modelData ? chat.model.avatarUrl(modelData.userId).replace("mxc://", "image://MxcImage/") : ""
|
messageUserAvatar.url = modelData ? chat.model.avatarUrl(modelData.userId).replace("mxc://", "image://MxcImage/") : "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,12 +153,15 @@ ListView {
|
|||||||
color: TimelineManager.userColor(modelData ? modelData.userId : "", colors.window)
|
color: TimelineManager.userColor(modelData ? modelData.userId : "", colors.window)
|
||||||
textFormat: Text.RichText
|
textFormat: Text.RichText
|
||||||
|
|
||||||
MouseArea {
|
TapHandler {
|
||||||
|
//cursorShape: Qt.PointingHandCursor
|
||||||
|
|
||||||
|
onSingleTapped: chat.model.openUserProfile(modelData.userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
CursorShape {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
Layout.alignment: Qt.AlignHCenter
|
|
||||||
onClicked: chat.model.openUserProfile(modelData.userId)
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
propagateComposedEvents: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -149,10 +181,6 @@ ListView {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
|
||||||
id: scrollbar
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate: Item {
|
delegate: Item {
|
||||||
id: wrapper
|
id: wrapper
|
||||||
|
|
||||||
@ -198,3 +226,5 @@ ListView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -10,15 +10,16 @@ Rectangle {
|
|||||||
property var room: TimelineManager.timeline
|
property var room: TimelineManager.timeline
|
||||||
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
visible: room && room.reply
|
visible: room && (room.reply || room.edit)
|
||||||
// Height of child, plus margins, plus border
|
// Height of child, plus margins, plus border
|
||||||
implicitHeight: replyPreview.height + 10
|
implicitHeight: (room && room.reply ? replyPreview.height : closeEditButton.height) + 10
|
||||||
color: colors.window
|
color: colors.window
|
||||||
z: 3
|
z: 3
|
||||||
|
|
||||||
Reply {
|
Reply {
|
||||||
id: replyPreview
|
id: replyPreview
|
||||||
|
|
||||||
|
visible: room && room.reply
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 2 * 22 + 3 * 16
|
anchors.leftMargin: 2 * 22 + 3 * 16
|
||||||
anchors.right: closeReplyButton.left
|
anchors.right: closeReplyButton.left
|
||||||
@ -32,8 +33,9 @@ Rectangle {
|
|||||||
ImageButton {
|
ImageButton {
|
||||||
id: closeReplyButton
|
id: closeReplyButton
|
||||||
|
|
||||||
|
visible: room && room.reply
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: 15
|
anchors.rightMargin: 16
|
||||||
anchors.top: replyPreview.top
|
anchors.top: replyPreview.top
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
width: 16
|
width: 16
|
||||||
@ -44,4 +46,17 @@ Rectangle {
|
|||||||
onClicked: room.reply = undefined
|
onClicked: room.reply = undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: closeEditButton
|
||||||
|
|
||||||
|
visible: room && room.edit
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.rightMargin: 16
|
||||||
|
anchors.topMargin: 10
|
||||||
|
anchors.top: parent.top
|
||||||
|
//height: 16
|
||||||
|
text: qsTr("Cancel edit")
|
||||||
|
onClicked: room.edit = undefined
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import "./delegates"
|
import "./delegates"
|
||||||
import "./emoji"
|
import "./emoji"
|
||||||
import QtQuick 2.6
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.3
|
import QtQuick.Controls 2.3
|
||||||
import QtQuick.Layouts 1.2
|
import QtQuick.Layouts 1.2
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
@ -12,27 +12,24 @@ Item {
|
|||||||
height: row.height
|
height: row.height
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
color: (Settings.messageHoverHighlight && hoverHandler.containsMouse) ? colors.alternateBase : "transparent"
|
color: (Settings.messageHoverHighlight && hoverHandler.hovered) ? colors.alternateBase : "transparent"
|
||||||
anchors.fill: row
|
anchors.fill: row
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
HoverHandler {
|
||||||
id: hoverHandler
|
id: hoverHandler
|
||||||
|
|
||||||
anchors.fill: parent
|
acceptedDevices: PointerDevice.GenericPointer
|
||||||
propagateComposedEvents: true
|
|
||||||
preventStealing: false
|
|
||||||
hoverEnabled: true
|
|
||||||
acceptedButtons: Qt.AllButtons
|
|
||||||
onClicked: {
|
|
||||||
if (mouse.button === Qt.RightButton)
|
|
||||||
messageContextMenu.show(model.id, model.type, model.isEncrypted, row);
|
|
||||||
else
|
|
||||||
mouse.accepted = false;
|
|
||||||
}
|
}
|
||||||
onPressAndHold: {
|
|
||||||
messageContextMenu.show(model.id, model.type, model.isEncrypted, row, mapToItem(timelineRoot, mouse.x, mouse.y));
|
TapHandler {
|
||||||
|
acceptedButtons: Qt.RightButton
|
||||||
|
onSingleTapped: messageContextMenu.show(model.id, model.type, model.isEncrypted, model.isEditable, row, mapToItem(timelineRoot, eventPoint.position.x, eventPoint.position.y))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TapHandler {
|
||||||
|
onLongPressed: messageContextMenu.show(model.id, model.type, model.isEncrypted, model.isEditable, row, mapToItem(timelineRoot, point.position.x, point.position.y))
|
||||||
|
onDoubleTapped: chat.model.reply = model.id
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
@ -85,6 +82,25 @@ Item {
|
|||||||
width: 16
|
width: 16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImageButton {
|
||||||
|
id: editButton
|
||||||
|
|
||||||
|
visible: (Settings.buttonsInTimeline && model.isEditable) || model.isEdited
|
||||||
|
buttonTextColor: chat.model.edit == model.id ? colors.highlight : colors.buttonText
|
||||||
|
Layout.alignment: Qt.AlignRight | Qt.AlignTop
|
||||||
|
Layout.preferredHeight: 16
|
||||||
|
width: 16
|
||||||
|
hoverEnabled: true
|
||||||
|
image: ":/icons/icons/ui/edit.png"
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.text: model.isEditable ? qsTr("Edit") : qsTr("Edited")
|
||||||
|
onClicked: {
|
||||||
|
if (model.isEditable)
|
||||||
|
chat.model.editAction(model.id);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EmojiButton {
|
EmojiButton {
|
||||||
id: reactButton
|
id: reactButton
|
||||||
|
|
||||||
@ -124,7 +140,7 @@ Item {
|
|||||||
image: ":/icons/icons/ui/vertical-ellipsis.png"
|
image: ":/icons/icons/ui/vertical-ellipsis.png"
|
||||||
ToolTip.visible: hovered
|
ToolTip.visible: hovered
|
||||||
ToolTip.text: qsTr("Options")
|
ToolTip.text: qsTr("Options")
|
||||||
onClicked: messageContextMenu.show(model.id, model.type, model.isEncrypted, optionsButton)
|
onClicked: messageContextMenu.show(model.id, model.type, model.isEncrypted, model.isEditable, optionsButton)
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
@ -132,15 +148,11 @@ Item {
|
|||||||
text: model.timestamp.toLocaleTimeString("HH:mm")
|
text: model.timestamp.toLocaleTimeString("HH:mm")
|
||||||
width: Math.max(implicitWidth, text.length * fontMetrics.maximumCharacterWidth)
|
width: Math.max(implicitWidth, text.length * fontMetrics.maximumCharacterWidth)
|
||||||
color: inactiveColors.text
|
color: inactiveColors.text
|
||||||
ToolTip.visible: ma.containsMouse
|
ToolTip.visible: ma.hovered
|
||||||
ToolTip.text: Qt.formatDateTime(model.timestamp, Qt.DefaultLocaleLongDate)
|
ToolTip.text: Qt.formatDateTime(model.timestamp, Qt.DefaultLocaleLongDate)
|
||||||
|
|
||||||
MouseArea {
|
HoverHandler {
|
||||||
id: ma
|
id: ma
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
hoverEnabled: true
|
|
||||||
propagateComposedEvents: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -74,11 +74,13 @@ Page {
|
|||||||
property string eventId
|
property string eventId
|
||||||
property int eventType
|
property int eventType
|
||||||
property bool isEncrypted
|
property bool isEncrypted
|
||||||
|
property bool isEditable
|
||||||
|
|
||||||
function show(eventId_, eventType_, isEncrypted_, showAt_, position) {
|
function show(eventId_, eventType_, isEncrypted_, isEditable_, showAt_, position) {
|
||||||
eventId = eventId_;
|
eventId = eventId_;
|
||||||
eventType = eventType_;
|
eventType = eventType_;
|
||||||
isEncrypted = isEncrypted_;
|
isEncrypted = isEncrypted_;
|
||||||
|
isEditable = isEditable_;
|
||||||
if (position)
|
if (position)
|
||||||
popup(position, showAt_);
|
popup(position, showAt_);
|
||||||
else
|
else
|
||||||
@ -99,6 +101,13 @@ Page {
|
|||||||
onClicked: TimelineManager.timeline.replyAction(messageContextMenu.eventId)
|
onClicked: TimelineManager.timeline.replyAction(messageContextMenu.eventId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MenuItem {
|
||||||
|
visible: messageContextMenu.isEditable
|
||||||
|
height: visible ? implicitHeight : 0
|
||||||
|
text: qsTr("Edit")
|
||||||
|
onClicked: TimelineManager.timeline.editAction(messageContextMenu.eventId)
|
||||||
|
}
|
||||||
|
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: qsTr("Read receipts")
|
text: qsTr("Read receipts")
|
||||||
onTriggered: TimelineManager.timeline.readReceiptsAction(messageContextMenu.eventId)
|
onTriggered: TimelineManager.timeline.readReceiptsAction(messageContextMenu.eventId)
|
||||||
|
@ -49,6 +49,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
Text {
|
Text {
|
||||||
id: errorText
|
id: errorText
|
||||||
|
|
||||||
text: "Error Text"
|
text: "Error Text"
|
||||||
color: "red"
|
color: "red"
|
||||||
visible: opacity > 0
|
visible: opacity > 0
|
||||||
@ -58,24 +59,28 @@ ApplicationWindow {
|
|||||||
|
|
||||||
SequentialAnimation {
|
SequentialAnimation {
|
||||||
id: hideErrorAnimation
|
id: hideErrorAnimation
|
||||||
|
|
||||||
running: false
|
running: false
|
||||||
|
|
||||||
PauseAnimation {
|
PauseAnimation {
|
||||||
duration: 4000
|
duration: 4000
|
||||||
}
|
}
|
||||||
|
|
||||||
NumberAnimation {
|
NumberAnimation {
|
||||||
target: errorText
|
target: errorText
|
||||||
property: 'opacity'
|
property: 'opacity'
|
||||||
to: 0
|
to: 0
|
||||||
duration: 1000
|
duration: 1000
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: profile
|
target: profile
|
||||||
onDisplayError: {
|
onDisplayError: {
|
||||||
errorText.text = errorMessage
|
errorText.text = errorMessage;
|
||||||
errorText.opacity = 1
|
errorText.opacity = 1;
|
||||||
hideErrorAnimation.restart()
|
hideErrorAnimation.restart();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import QtQuick 2.6
|
import QtQuick 2.12
|
||||||
import QtQuick.Layouts 1.2
|
import QtQuick.Layouts 1.2
|
||||||
import im.nheko 1.0
|
import im.nheko 1.0
|
||||||
|
|
||||||
@ -31,7 +31,15 @@ Item {
|
|||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
onClicked: TimelineManager.timeline.saveMedia(model.data.id)
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
}
|
||||||
|
|
||||||
|
TapHandler {
|
||||||
|
onSingleTapped: TimelineManager.timeline.saveMedia(model.data.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
CursorShape {
|
||||||
|
anchors.fill: parent
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import QtQuick 2.6
|
import QtQuick 2.12
|
||||||
import im.nheko 1.0
|
import im.nheko 1.0
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
@ -32,20 +32,20 @@ Item {
|
|||||||
smooth: true
|
smooth: true
|
||||||
mipmap: true
|
mipmap: true
|
||||||
|
|
||||||
MouseArea {
|
TapHandler {
|
||||||
id: mouseArea
|
|
||||||
|
|
||||||
enabled: model.data.type == MtxEvent.ImageMessage && img.status == Image.Ready
|
enabled: model.data.type == MtxEvent.ImageMessage && img.status == Image.Ready
|
||||||
hoverEnabled: true
|
onSingleTapped: TimelineManager.openImageOverlay(model.data.url, model.data.id)
|
||||||
anchors.fill: parent
|
}
|
||||||
onClicked: TimelineManager.openImageOverlay(model.data.url, model.data.id)
|
|
||||||
|
HoverHandler {
|
||||||
|
id: mouseArea
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: overlay
|
id: overlay
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
visible: mouseArea.containsMouse
|
visible: mouseArea.hovered
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: container
|
id: container
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
TextMessage {
|
TextMessage {
|
||||||
font.italic: true
|
font.italic: true
|
||||||
color: colors.buttonText
|
color: colors.buttonText
|
||||||
height: isReply ? Math.min(chat.height / 8, implicitHeight) : undefined
|
height: isReply ? Math.min(timelineRoot.height / 8, implicitHeight) : undefined
|
||||||
clip: isReply
|
clip: isReply
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import QtMultimedia 5.6
|
import QtMultimedia 5.6
|
||||||
import QtQuick 2.6
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.1
|
import QtQuick.Controls 2.1
|
||||||
import QtQuick.Layouts 1.2
|
import QtQuick.Layouts 1.2
|
||||||
import im.nheko 1.0
|
import im.nheko 1.0
|
||||||
@ -140,9 +140,8 @@ Rectangle {
|
|||||||
fillMode: Image.Pad
|
fillMode: Image.Pad
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
TapHandler {
|
||||||
anchors.fill: parent
|
onSingleTapped: {
|
||||||
onClicked: {
|
|
||||||
switch (button.state) {
|
switch (button.state) {
|
||||||
case "":
|
case "":
|
||||||
TimelineManager.timeline.cacheMedia(model.data.id);
|
TimelineManager.timeline.cacheMedia(model.data.id);
|
||||||
@ -159,6 +158,10 @@ Rectangle {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CursorShape {
|
||||||
|
anchors.fill: parent
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import QtQuick 2.6
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.3
|
import QtQuick.Controls 2.3
|
||||||
import QtQuick.Layouts 1.2
|
import QtQuick.Layouts 1.2
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
@ -13,10 +13,12 @@ Item {
|
|||||||
width: parent.width
|
width: parent.width
|
||||||
height: replyContainer.height
|
height: replyContainer.height
|
||||||
|
|
||||||
MouseArea {
|
TapHandler {
|
||||||
|
onSingleTapped: chat.positionViewAtIndex(chat.model.idToIndex(modelData.id), ListView.Contain)
|
||||||
|
}
|
||||||
|
|
||||||
|
CursorShape {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
preventStealing: false
|
|
||||||
onClicked: chat.positionViewAtIndex(chat.model.idToIndex(modelData.id), ListView.Contain)
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,10 +45,8 @@ Item {
|
|||||||
color: replyComponent.userColor
|
color: replyComponent.userColor
|
||||||
textFormat: Text.RichText
|
textFormat: Text.RichText
|
||||||
|
|
||||||
MouseArea {
|
TapHandler {
|
||||||
anchors.fill: parent
|
onSingleTapped: chat.model.openUserProfile(reply.modelData.userId)
|
||||||
onClicked: chat.model.openUserProfile(reply.modelData.userId)
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,10 @@ import im.nheko 1.0
|
|||||||
MatrixText {
|
MatrixText {
|
||||||
property string formatted: model.data.formattedBody
|
property string formatted: model.data.formattedBody
|
||||||
|
|
||||||
text: "<span style='white-space: pre-wrap'><style type=\"text/css\">a { color:" + colors.link + ";}\ncode { background-color: " + colors.alternateBase + ";}</style>" + formatted.replace("<pre>", "<pre style='white-space: pre-wrap; background-color: " + colors.alternateBase + "'>") + "</span>"
|
text: "<style type=\"text/css\">a { color:" + colors.link + ";}\ncode { background-color: " + colors.alternateBase + ";}</style>" + formatted.replace("<pre>", "<pre style='white-space: pre-wrap; background-color: " + colors.alternateBase + "'>")
|
||||||
width: parent ? parent.width : undefined
|
width: parent ? parent.width : undefined
|
||||||
height: isReply ? Math.round(Math.min(timelineRoot.height / 8, implicitHeight)) : undefined
|
height: isReply ? Math.round(Math.min(timelineRoot.height / 8, implicitHeight)) : undefined
|
||||||
clip: isReply
|
clip: isReply
|
||||||
|
selectByMouse: !Settings.mobileMode && !isReply
|
||||||
font.pointSize: (Settings.enlargeEmojiOnlyMessages && model.data.isOnlyEmoji > 0 && model.data.isOnlyEmoji < 4) ? Settings.fontSize * 3 : Settings.fontSize
|
font.pointSize: (Settings.enlargeEmojiOnlyMessages && model.data.isOnlyEmoji > 0 && model.data.isOnlyEmoji < 4) ? Settings.fontSize * 3 : Settings.fontSize
|
||||||
}
|
}
|
||||||
|
@ -14,5 +14,6 @@ ImageButton {
|
|||||||
image: ":/icons/icons/ui/smile.png"
|
image: ":/icons/icons/ui/smile.png"
|
||||||
onClicked: emojiPicker.visible ? emojiPicker.close() : emojiPicker.show(emojiButton, function(emoji) {
|
onClicked: emojiPicker.visible ? emojiPicker.close() : emojiPicker.show(emojiButton, function(emoji) {
|
||||||
TimelineManager.queueReactionMessage(event_id, emoji);
|
TimelineManager.queueReactionMessage(event_id, emoji);
|
||||||
|
TimelineManager.focusMessageInput();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
219
src/Cache.cpp
219
src/Cache.cpp
@ -108,6 +108,11 @@ Cache::isHiddenEvent(lmdb::txn &txn,
|
|||||||
const std::string &room_id)
|
const std::string &room_id)
|
||||||
{
|
{
|
||||||
using namespace mtx::events;
|
using namespace mtx::events;
|
||||||
|
|
||||||
|
// Always hide edits
|
||||||
|
if (mtx::accessors::relations(e).replaces())
|
||||||
|
return true;
|
||||||
|
|
||||||
if (auto encryptedEvent = std::get_if<EncryptedEvent<msg::Encrypted>>(&e)) {
|
if (auto encryptedEvent = std::get_if<EncryptedEvent<msg::Encrypted>>(&e)) {
|
||||||
MegolmSessionIndex index;
|
MegolmSessionIndex index;
|
||||||
index.room_id = room_id;
|
index.room_id = room_id;
|
||||||
@ -1197,25 +1202,24 @@ Cache::calculateRoomReadStatus(const std::string &room_id)
|
|||||||
const auto last_event_id = getLastEventId(txn, room_id);
|
const auto last_event_id = getLastEventId(txn, room_id);
|
||||||
const auto localUser = utils::localUser().toStdString();
|
const auto localUser = utils::localUser().toStdString();
|
||||||
|
|
||||||
|
std::string fullyReadEventId;
|
||||||
|
if (auto ev = getAccountData(txn, mtx::events::EventType::FullyRead, room_id)) {
|
||||||
|
if (auto fr = std::get_if<
|
||||||
|
mtx::events::AccountDataEvent<mtx::events::account_data::FullyRead>>(
|
||||||
|
&ev.value())) {
|
||||||
|
fullyReadEventId = fr->content.event_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
|
||||||
if (last_event_id.empty())
|
if (last_event_id.empty() || fullyReadEventId.empty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (last_event_id == fullyReadEventId)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Retrieve all read receipts for that event.
|
// Retrieve all read receipts for that event.
|
||||||
const auto receipts =
|
return getEventIndex(room_id, last_event_id) > getEventIndex(room_id, fullyReadEventId);
|
||||||
readReceipts(QString::fromStdString(last_event_id), QString::fromStdString(room_id));
|
|
||||||
|
|
||||||
if (receipts.size() == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Check if the local user has a read receipt for it.
|
|
||||||
for (auto it = receipts.cbegin(); it != receipts.cend(); it++) {
|
|
||||||
if (it->second == localUser)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1891,6 +1895,108 @@ Cache::getTimelineIndex(const std::string &room_id, std::string_view event_id)
|
|||||||
return *val.data<uint64_t>();
|
return *val.data<uint64_t>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<uint64_t>
|
||||||
|
Cache::getEventIndex(const std::string &room_id, std::string_view event_id)
|
||||||
|
{
|
||||||
|
if (event_id.empty())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
|
||||||
|
|
||||||
|
lmdb::dbi orderDb{0};
|
||||||
|
try {
|
||||||
|
orderDb = getEventToOrderDb(txn, room_id);
|
||||||
|
} catch (lmdb::runtime_error &e) {
|
||||||
|
nhlog::db()->error("Can't open db for room '{}', probably doesn't exist yet. ({})",
|
||||||
|
room_id,
|
||||||
|
e.what());
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
lmdb::val indexVal{event_id.data(), event_id.size()}, val;
|
||||||
|
|
||||||
|
bool success = lmdb::dbi_get(txn, orderDb, indexVal, val);
|
||||||
|
if (!success) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return *val.data<uint64_t>();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::pair<uint64_t, std::string>>
|
||||||
|
Cache::lastInvisibleEventAfter(const std::string &room_id, std::string_view event_id)
|
||||||
|
{
|
||||||
|
if (event_id.empty())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
|
||||||
|
|
||||||
|
lmdb::dbi orderDb{0};
|
||||||
|
lmdb::dbi eventOrderDb{0};
|
||||||
|
lmdb::dbi timelineDb{0};
|
||||||
|
try {
|
||||||
|
orderDb = getEventToOrderDb(txn, room_id);
|
||||||
|
eventOrderDb = getEventOrderDb(txn, room_id);
|
||||||
|
timelineDb = getMessageToOrderDb(txn, room_id);
|
||||||
|
} catch (lmdb::runtime_error &e) {
|
||||||
|
nhlog::db()->error("Can't open db for room '{}', probably doesn't exist yet. ({})",
|
||||||
|
room_id,
|
||||||
|
e.what());
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
lmdb::val eventIdVal{event_id.data(), event_id.size()}, indexVal;
|
||||||
|
|
||||||
|
bool success = lmdb::dbi_get(txn, orderDb, eventIdVal, indexVal);
|
||||||
|
if (!success) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
uint64_t prevIdx = *indexVal.data<uint64_t>();
|
||||||
|
std::string prevId{eventIdVal.data(), eventIdVal.size()};
|
||||||
|
|
||||||
|
auto cursor = lmdb::cursor::open(txn, eventOrderDb);
|
||||||
|
cursor.get(indexVal, MDB_SET);
|
||||||
|
while (cursor.get(indexVal, eventIdVal, MDB_NEXT)) {
|
||||||
|
std::string evId =
|
||||||
|
json::parse(std::string_view(eventIdVal.data(), eventIdVal.size()))["event_id"]
|
||||||
|
.get<std::string>();
|
||||||
|
lmdb::val temp;
|
||||||
|
if (lmdb::dbi_get(txn, timelineDb, lmdb::val(evId.data(), evId.size()), temp)) {
|
||||||
|
return std::pair{prevIdx, std::string(prevId)};
|
||||||
|
} else {
|
||||||
|
prevIdx = *indexVal.data<uint64_t>();
|
||||||
|
prevId = std::move(evId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::pair{prevIdx, std::string(prevId)};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<uint64_t>
|
||||||
|
Cache::getArrivalIndex(const std::string &room_id, std::string_view event_id)
|
||||||
|
{
|
||||||
|
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
|
||||||
|
|
||||||
|
lmdb::dbi orderDb{0};
|
||||||
|
try {
|
||||||
|
orderDb = getEventToOrderDb(txn, room_id);
|
||||||
|
} catch (lmdb::runtime_error &e) {
|
||||||
|
nhlog::db()->error("Can't open db for room '{}', probably doesn't exist yet. ({})",
|
||||||
|
room_id,
|
||||||
|
e.what());
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
lmdb::val indexVal{event_id.data(), event_id.size()}, val;
|
||||||
|
|
||||||
|
bool success = lmdb::dbi_get(txn, orderDb, indexVal, val);
|
||||||
|
if (!success) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return *val.data<uint64_t>();
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<std::string>
|
std::optional<std::string>
|
||||||
Cache::getTimelineEventId(const std::string &room_id, uint64_t index)
|
Cache::getTimelineEventId(const std::string &room_id, uint64_t index)
|
||||||
{
|
{
|
||||||
@ -2713,23 +2819,19 @@ Cache::saveTimelineMessages(lmdb::txn &txn,
|
|||||||
lmdb::dbi_put(txn, evToOrderDb, event_id, txn_order);
|
lmdb::dbi_put(txn, evToOrderDb, event_id, txn_order);
|
||||||
lmdb::dbi_del(txn, evToOrderDb, lmdb::val(txn_id));
|
lmdb::dbi_del(txn, evToOrderDb, lmdb::val(txn_id));
|
||||||
|
|
||||||
if (event.contains("content") &&
|
auto relations = mtx::accessors::relations(e);
|
||||||
event["content"].contains("m.relates_to")) {
|
if (!relations.relations.empty()) {
|
||||||
auto temp = event["content"]["m.relates_to"];
|
for (const auto &r : relations.relations) {
|
||||||
json relates_to_j = temp.contains("m.in_reply_to") &&
|
if (!r.event_id.empty()) {
|
||||||
temp["m.in_reply_to"].is_object()
|
|
||||||
? temp["m.in_reply_to"]["event_id"]
|
|
||||||
: temp["event_id"];
|
|
||||||
std::string relates_to =
|
|
||||||
relates_to_j.is_string() ? relates_to_j.get<std::string>() : "";
|
|
||||||
|
|
||||||
if (!relates_to.empty()) {
|
|
||||||
lmdb::dbi_del(txn,
|
lmdb::dbi_del(txn,
|
||||||
relationsDb,
|
relationsDb,
|
||||||
lmdb::val(relates_to),
|
lmdb::val(r.event_id),
|
||||||
lmdb::val(txn_id));
|
lmdb::val(txn_id));
|
||||||
lmdb::dbi_put(
|
lmdb::dbi_put(txn,
|
||||||
txn, relationsDb, lmdb::val(relates_to), event_id);
|
relationsDb,
|
||||||
|
lmdb::val(r.event_id),
|
||||||
|
event_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2808,19 +2910,16 @@ Cache::saveTimelineMessages(lmdb::txn &txn,
|
|||||||
lmdb::val(&msgIndex, sizeof(msgIndex)));
|
lmdb::val(&msgIndex, sizeof(msgIndex)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.contains("content") &&
|
auto relations = mtx::accessors::relations(e);
|
||||||
event["content"].contains("m.relates_to")) {
|
if (!relations.relations.empty()) {
|
||||||
auto temp = event["content"]["m.relates_to"];
|
for (const auto &r : relations.relations) {
|
||||||
json relates_to_j = temp.contains("m.in_reply_to") &&
|
if (!r.event_id.empty()) {
|
||||||
temp["m.in_reply_to"].is_object()
|
lmdb::dbi_put(txn,
|
||||||
? temp["m.in_reply_to"]["event_id"]
|
relationsDb,
|
||||||
: temp["event_id"];
|
lmdb::val(r.event_id),
|
||||||
std::string relates_to =
|
event_id);
|
||||||
relates_to_j.is_string() ? relates_to_j.get<std::string>() : "";
|
}
|
||||||
|
}
|
||||||
if (!relates_to.empty())
|
|
||||||
lmdb::dbi_put(
|
|
||||||
txn, relationsDb, lmdb::val(relates_to), event_id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2901,17 +3000,14 @@ Cache::saveOldMessages(const std::string &room_id, const mtx::responses::Message
|
|||||||
txn, msg2orderDb, event_id, lmdb::val(&msgIndex, sizeof(msgIndex)));
|
txn, msg2orderDb, event_id, lmdb::val(&msgIndex, sizeof(msgIndex)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.contains("content") && event["content"].contains("m.relates_to")) {
|
auto relations = mtx::accessors::relations(e);
|
||||||
auto temp = event["content"]["m.relates_to"];
|
if (!relations.relations.empty()) {
|
||||||
json relates_to_j =
|
for (const auto &r : relations.relations) {
|
||||||
temp.contains("m.in_reply_to") && temp["m.in_reply_to"].is_object()
|
if (!r.event_id.empty()) {
|
||||||
? temp["m.in_reply_to"]["event_id"]
|
lmdb::dbi_put(
|
||||||
: temp["event_id"];
|
txn, relationsDb, lmdb::val(r.event_id), event_id);
|
||||||
std::string relates_to =
|
}
|
||||||
relates_to_j.is_string() ? relates_to_j.get<std::string>() : "";
|
}
|
||||||
|
|
||||||
if (!relates_to.empty())
|
|
||||||
lmdb::dbi_put(txn, relationsDb, lmdb::val(relates_to), event_id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3222,8 +3318,11 @@ Cache::getAccountData(lmdb::txn &txn, mtx::events::EventType type, const std::st
|
|||||||
lmdb::val data;
|
lmdb::val data;
|
||||||
if (lmdb::dbi_get(txn, db, lmdb::val(to_string(type)), data)) {
|
if (lmdb::dbi_get(txn, db, lmdb::val(to_string(type)), data)) {
|
||||||
mtx::responses::utils::RoomAccountDataEvents events;
|
mtx::responses::utils::RoomAccountDataEvents events;
|
||||||
mtx::responses::utils::parse_room_account_data_events(
|
json j = json::array({
|
||||||
std::string_view(data.data(), data.size()), events);
|
json::parse(std::string_view(data.data(), data.size())),
|
||||||
|
});
|
||||||
|
mtx::responses::utils::parse_room_account_data_events(j, events);
|
||||||
|
if (events.size() == 1)
|
||||||
return events.front();
|
return events.front();
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
@ -4233,6 +4332,18 @@ readReceipts(const QString &event_id, const QString &room_id)
|
|||||||
return instance_->readReceipts(event_id, room_id);
|
return instance_->readReceipts(event_id, room_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<uint64_t>
|
||||||
|
getEventIndex(const std::string &room_id, std::string_view event_id)
|
||||||
|
{
|
||||||
|
return instance_->getEventIndex(room_id, event_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::pair<uint64_t, std::string>>
|
||||||
|
lastInvisibleEventAfter(const std::string &room_id, std::string_view event_id)
|
||||||
|
{
|
||||||
|
return instance_->lastInvisibleEventAfter(room_id, event_id);
|
||||||
|
}
|
||||||
|
|
||||||
QByteArray
|
QByteArray
|
||||||
image(const QString &url)
|
image(const QString &url)
|
||||||
{
|
{
|
||||||
|
@ -168,6 +168,12 @@ using UserReceipts = std::multimap<uint64_t, std::string, std::greater<uint64_t>
|
|||||||
UserReceipts
|
UserReceipts
|
||||||
readReceipts(const QString &event_id, const QString &room_id);
|
readReceipts(const QString &event_id, const QString &room_id);
|
||||||
|
|
||||||
|
//! get index of the event in the event db, not representing the visual index
|
||||||
|
std::optional<uint64_t>
|
||||||
|
getEventIndex(const std::string &room_id, std::string_view event_id);
|
||||||
|
std::optional<std::pair<uint64_t, std::string>>
|
||||||
|
lastInvisibleEventAfter(const std::string &room_id, std::string_view event_id);
|
||||||
|
|
||||||
QByteArray
|
QByteArray
|
||||||
image(const QString &url);
|
image(const QString &url);
|
||||||
QByteArray
|
QByteArray
|
||||||
|
@ -204,7 +204,14 @@ public:
|
|||||||
std::optional<TimelineRange> getTimelineRange(const std::string &room_id);
|
std::optional<TimelineRange> getTimelineRange(const std::string &room_id);
|
||||||
std::optional<uint64_t> getTimelineIndex(const std::string &room_id,
|
std::optional<uint64_t> getTimelineIndex(const std::string &room_id,
|
||||||
std::string_view event_id);
|
std::string_view event_id);
|
||||||
|
std::optional<uint64_t> getEventIndex(const std::string &room_id,
|
||||||
|
std::string_view event_id);
|
||||||
|
std::optional<std::pair<uint64_t, std::string>> lastInvisibleEventAfter(
|
||||||
|
const std::string &room_id,
|
||||||
|
std::string_view event_id);
|
||||||
std::optional<std::string> getTimelineEventId(const std::string &room_id, uint64_t index);
|
std::optional<std::string> getTimelineEventId(const std::string &room_id, uint64_t index);
|
||||||
|
std::optional<uint64_t> getArrivalIndex(const std::string &room_id,
|
||||||
|
std::string_view event_id);
|
||||||
|
|
||||||
std::string previousBatchToken(const std::string &room_id);
|
std::string previousBatchToken(const std::string &room_id);
|
||||||
uint64_t saveOldMessages(const std::string &room_id, const mtx::responses::Messages &res);
|
uint64_t saveOldMessages(const std::string &room_id, const mtx::responses::Messages &res);
|
||||||
|
437
src/CallDevices.cpp
Normal file
437
src/CallDevices.cpp
Normal file
@ -0,0 +1,437 @@
|
|||||||
|
#include <cstring>
|
||||||
|
#include <optional>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
#include "CallDevices.h"
|
||||||
|
#include "ChatPage.h"
|
||||||
|
#include "Logging.h"
|
||||||
|
#include "UserSettingsPage.h"
|
||||||
|
|
||||||
|
#ifdef GSTREAMER_AVAILABLE
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "gst/gst.h"
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CallDevices::CallDevices()
|
||||||
|
: QObject()
|
||||||
|
{}
|
||||||
|
|
||||||
|
#ifdef GSTREAMER_AVAILABLE
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct AudioSource
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
GstDevice *device;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VideoSource
|
||||||
|
{
|
||||||
|
struct Caps
|
||||||
|
{
|
||||||
|
std::string resolution;
|
||||||
|
std::vector<std::string> frameRates;
|
||||||
|
};
|
||||||
|
std::string name;
|
||||||
|
GstDevice *device;
|
||||||
|
std::vector<Caps> caps;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<AudioSource> audioSources_;
|
||||||
|
std::vector<VideoSource> videoSources_;
|
||||||
|
|
||||||
|
using FrameRate = std::pair<int, int>;
|
||||||
|
std::optional<FrameRate>
|
||||||
|
getFrameRate(const GValue *value)
|
||||||
|
{
|
||||||
|
if (GST_VALUE_HOLDS_FRACTION(value)) {
|
||||||
|
gint num = gst_value_get_fraction_numerator(value);
|
||||||
|
gint den = gst_value_get_fraction_denominator(value);
|
||||||
|
return FrameRate{num, den};
|
||||||
|
}
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
addFrameRate(std::vector<std::string> &rates, const FrameRate &rate)
|
||||||
|
{
|
||||||
|
constexpr double minimumFrameRate = 15.0;
|
||||||
|
if (static_cast<double>(rate.first) / rate.second >= minimumFrameRate)
|
||||||
|
rates.push_back(std::to_string(rate.first) + "/" + std::to_string(rate.second));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setDefaultDevice(bool isVideo)
|
||||||
|
{
|
||||||
|
auto settings = ChatPage::instance()->userSettings();
|
||||||
|
if (isVideo && settings->camera().isEmpty()) {
|
||||||
|
const VideoSource &camera = videoSources_.front();
|
||||||
|
settings->setCamera(QString::fromStdString(camera.name));
|
||||||
|
settings->setCameraResolution(
|
||||||
|
QString::fromStdString(camera.caps.front().resolution));
|
||||||
|
settings->setCameraFrameRate(
|
||||||
|
QString::fromStdString(camera.caps.front().frameRates.front()));
|
||||||
|
} else if (!isVideo && settings->microphone().isEmpty()) {
|
||||||
|
settings->setMicrophone(QString::fromStdString(audioSources_.front().name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
addDevice(GstDevice *device)
|
||||||
|
{
|
||||||
|
if (!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gchar *name = gst_device_get_display_name(device);
|
||||||
|
gchar *type = gst_device_get_device_class(device);
|
||||||
|
bool isVideo = !std::strncmp(type, "Video", 5);
|
||||||
|
g_free(type);
|
||||||
|
nhlog::ui()->debug("WebRTC: {} device added: {}", isVideo ? "video" : "audio", name);
|
||||||
|
if (!isVideo) {
|
||||||
|
audioSources_.push_back({name, device});
|
||||||
|
g_free(name);
|
||||||
|
setDefaultDevice(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GstCaps *gstcaps = gst_device_get_caps(device);
|
||||||
|
if (!gstcaps) {
|
||||||
|
nhlog::ui()->debug("WebRTC: unable to get caps for {}", name);
|
||||||
|
g_free(name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
VideoSource source{name, device, {}};
|
||||||
|
g_free(name);
|
||||||
|
guint nCaps = gst_caps_get_size(gstcaps);
|
||||||
|
for (guint i = 0; i < nCaps; ++i) {
|
||||||
|
GstStructure *structure = gst_caps_get_structure(gstcaps, i);
|
||||||
|
const gchar *name = gst_structure_get_name(structure);
|
||||||
|
if (!std::strcmp(name, "video/x-raw")) {
|
||||||
|
gint widthpx, heightpx;
|
||||||
|
if (gst_structure_get(structure,
|
||||||
|
"width",
|
||||||
|
G_TYPE_INT,
|
||||||
|
&widthpx,
|
||||||
|
"height",
|
||||||
|
G_TYPE_INT,
|
||||||
|
&heightpx,
|
||||||
|
nullptr)) {
|
||||||
|
VideoSource::Caps caps;
|
||||||
|
caps.resolution =
|
||||||
|
std::to_string(widthpx) + "x" + std::to_string(heightpx);
|
||||||
|
const GValue *value =
|
||||||
|
gst_structure_get_value(structure, "framerate");
|
||||||
|
if (auto fr = getFrameRate(value); fr)
|
||||||
|
addFrameRate(caps.frameRates, *fr);
|
||||||
|
else if (GST_VALUE_HOLDS_FRACTION_RANGE(value)) {
|
||||||
|
addFrameRate(
|
||||||
|
caps.frameRates,
|
||||||
|
*getFrameRate(gst_value_get_fraction_range_min(value)));
|
||||||
|
addFrameRate(
|
||||||
|
caps.frameRates,
|
||||||
|
*getFrameRate(gst_value_get_fraction_range_max(value)));
|
||||||
|
} else if (GST_VALUE_HOLDS_LIST(value)) {
|
||||||
|
guint nRates = gst_value_list_get_size(value);
|
||||||
|
for (guint j = 0; j < nRates; ++j) {
|
||||||
|
const GValue *rate =
|
||||||
|
gst_value_list_get_value(value, j);
|
||||||
|
if (auto fr = getFrameRate(rate); fr)
|
||||||
|
addFrameRate(caps.frameRates, *fr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!caps.frameRates.empty())
|
||||||
|
source.caps.push_back(std::move(caps));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gst_caps_unref(gstcaps);
|
||||||
|
videoSources_.push_back(std::move(source));
|
||||||
|
setDefaultDevice(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GST_CHECK_VERSION(1, 18, 0)
|
||||||
|
template<typename T>
|
||||||
|
bool
|
||||||
|
removeDevice(T &sources, GstDevice *device, bool changed)
|
||||||
|
{
|
||||||
|
if (auto it = std::find_if(sources.begin(),
|
||||||
|
sources.end(),
|
||||||
|
[device](const auto &s) { return s.device == device; });
|
||||||
|
it != sources.end()) {
|
||||||
|
nhlog::ui()->debug(std::string("WebRTC: device ") +
|
||||||
|
(changed ? "changed: " : "removed: ") + "{}",
|
||||||
|
it->name);
|
||||||
|
gst_object_unref(device);
|
||||||
|
sources.erase(it);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
removeDevice(GstDevice *device, bool changed)
|
||||||
|
{
|
||||||
|
if (device) {
|
||||||
|
if (removeDevice(audioSources_, device, changed) ||
|
||||||
|
removeDevice(videoSources_, device, changed))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
newBusMessage(GstBus *bus G_GNUC_UNUSED, GstMessage *msg, gpointer user_data G_GNUC_UNUSED)
|
||||||
|
{
|
||||||
|
switch (GST_MESSAGE_TYPE(msg)) {
|
||||||
|
case GST_MESSAGE_DEVICE_ADDED: {
|
||||||
|
GstDevice *device;
|
||||||
|
gst_message_parse_device_added(msg, &device);
|
||||||
|
addDevice(device);
|
||||||
|
emit CallDevices::instance().devicesChanged();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GST_MESSAGE_DEVICE_REMOVED: {
|
||||||
|
GstDevice *device;
|
||||||
|
gst_message_parse_device_removed(msg, &device);
|
||||||
|
removeDevice(device, false);
|
||||||
|
emit CallDevices::instance().devicesChanged();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GST_MESSAGE_DEVICE_CHANGED: {
|
||||||
|
GstDevice *device;
|
||||||
|
GstDevice *oldDevice;
|
||||||
|
gst_message_parse_device_changed(msg, &device, &oldDevice);
|
||||||
|
removeDevice(oldDevice, true);
|
||||||
|
addDevice(device);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
std::vector<std::string>
|
||||||
|
deviceNames(T &sources, const std::string &defaultDevice)
|
||||||
|
{
|
||||||
|
std::vector<std::string> ret;
|
||||||
|
ret.reserve(sources.size());
|
||||||
|
for (const auto &s : sources)
|
||||||
|
ret.push_back(s.name);
|
||||||
|
|
||||||
|
// move default device to top of the list
|
||||||
|
if (auto it = std::find(ret.begin(), ret.end(), defaultDevice); it != ret.end())
|
||||||
|
std::swap(ret.front(), *it);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<VideoSource>
|
||||||
|
getVideoSource(const std::string &cameraName)
|
||||||
|
{
|
||||||
|
if (auto it = std::find_if(videoSources_.cbegin(),
|
||||||
|
videoSources_.cend(),
|
||||||
|
[&cameraName](const auto &s) { return s.name == cameraName; });
|
||||||
|
it != videoSources_.cend()) {
|
||||||
|
return *it;
|
||||||
|
}
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<int, int>
|
||||||
|
tokenise(std::string_view str, char delim)
|
||||||
|
{
|
||||||
|
std::pair<int, int> ret;
|
||||||
|
ret.first = std::atoi(str.data());
|
||||||
|
auto pos = str.find_first_of(delim);
|
||||||
|
ret.second = std::atoi(str.data() + pos + 1);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CallDevices::init()
|
||||||
|
{
|
||||||
|
#if GST_CHECK_VERSION(1, 18, 0)
|
||||||
|
static GstDeviceMonitor *monitor = nullptr;
|
||||||
|
if (!monitor) {
|
||||||
|
monitor = gst_device_monitor_new();
|
||||||
|
GstCaps *caps = gst_caps_new_empty_simple("audio/x-raw");
|
||||||
|
gst_device_monitor_add_filter(monitor, "Audio/Source", caps);
|
||||||
|
gst_device_monitor_add_filter(monitor, "Audio/Duplex", caps);
|
||||||
|
gst_caps_unref(caps);
|
||||||
|
caps = gst_caps_new_empty_simple("video/x-raw");
|
||||||
|
gst_device_monitor_add_filter(monitor, "Video/Source", caps);
|
||||||
|
gst_device_monitor_add_filter(monitor, "Video/Duplex", caps);
|
||||||
|
gst_caps_unref(caps);
|
||||||
|
|
||||||
|
GstBus *bus = gst_device_monitor_get_bus(monitor);
|
||||||
|
gst_bus_add_watch(bus, newBusMessage, nullptr);
|
||||||
|
gst_object_unref(bus);
|
||||||
|
if (!gst_device_monitor_start(monitor)) {
|
||||||
|
nhlog::ui()->error("WebRTC: failed to start device monitor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CallDevices::refresh()
|
||||||
|
{
|
||||||
|
#if !GST_CHECK_VERSION(1, 18, 0)
|
||||||
|
|
||||||
|
static GstDeviceMonitor *monitor = nullptr;
|
||||||
|
if (!monitor) {
|
||||||
|
monitor = gst_device_monitor_new();
|
||||||
|
GstCaps *caps = gst_caps_new_empty_simple("audio/x-raw");
|
||||||
|
gst_device_monitor_add_filter(monitor, "Audio/Source", caps);
|
||||||
|
gst_device_monitor_add_filter(monitor, "Audio/Duplex", caps);
|
||||||
|
gst_caps_unref(caps);
|
||||||
|
caps = gst_caps_new_empty_simple("video/x-raw");
|
||||||
|
gst_device_monitor_add_filter(monitor, "Video/Source", caps);
|
||||||
|
gst_device_monitor_add_filter(monitor, "Video/Duplex", caps);
|
||||||
|
gst_caps_unref(caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto clearDevices = [](auto &sources) {
|
||||||
|
std::for_each(
|
||||||
|
sources.begin(), sources.end(), [](auto &s) { gst_object_unref(s.device); });
|
||||||
|
sources.clear();
|
||||||
|
};
|
||||||
|
clearDevices(audioSources_);
|
||||||
|
clearDevices(videoSources_);
|
||||||
|
|
||||||
|
GList *devices = gst_device_monitor_get_devices(monitor);
|
||||||
|
if (devices) {
|
||||||
|
for (GList *l = devices; l != nullptr; l = l->next)
|
||||||
|
addDevice(GST_DEVICE_CAST(l->data));
|
||||||
|
g_list_free(devices);
|
||||||
|
}
|
||||||
|
emit devicesChanged();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CallDevices::haveMic() const
|
||||||
|
{
|
||||||
|
return !audioSources_.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CallDevices::haveCamera() const
|
||||||
|
{
|
||||||
|
return !videoSources_.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>
|
||||||
|
CallDevices::names(bool isVideo, const std::string &defaultDevice) const
|
||||||
|
{
|
||||||
|
return isVideo ? deviceNames(videoSources_, defaultDevice)
|
||||||
|
: deviceNames(audioSources_, defaultDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>
|
||||||
|
CallDevices::resolutions(const std::string &cameraName) const
|
||||||
|
{
|
||||||
|
std::vector<std::string> ret;
|
||||||
|
if (auto s = getVideoSource(cameraName); s) {
|
||||||
|
ret.reserve(s->caps.size());
|
||||||
|
for (const auto &c : s->caps)
|
||||||
|
ret.push_back(c.resolution);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>
|
||||||
|
CallDevices::frameRates(const std::string &cameraName, const std::string &resolution) const
|
||||||
|
{
|
||||||
|
if (auto s = getVideoSource(cameraName); s) {
|
||||||
|
if (auto it =
|
||||||
|
std::find_if(s->caps.cbegin(),
|
||||||
|
s->caps.cend(),
|
||||||
|
[&](const auto &c) { return c.resolution == resolution; });
|
||||||
|
it != s->caps.cend())
|
||||||
|
return it->frameRates;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
GstDevice *
|
||||||
|
CallDevices::audioDevice() const
|
||||||
|
{
|
||||||
|
std::string name = ChatPage::instance()->userSettings()->microphone().toStdString();
|
||||||
|
if (auto it = std::find_if(audioSources_.cbegin(),
|
||||||
|
audioSources_.cend(),
|
||||||
|
[&name](const auto &s) { return s.name == name; });
|
||||||
|
it != audioSources_.cend()) {
|
||||||
|
nhlog::ui()->debug("WebRTC: microphone: {}", name);
|
||||||
|
return it->device;
|
||||||
|
} else {
|
||||||
|
nhlog::ui()->error("WebRTC: unknown microphone: {}", name);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GstDevice *
|
||||||
|
CallDevices::videoDevice(std::pair<int, int> &resolution, std::pair<int, int> &frameRate) const
|
||||||
|
{
|
||||||
|
auto settings = ChatPage::instance()->userSettings();
|
||||||
|
std::string name = settings->camera().toStdString();
|
||||||
|
if (auto s = getVideoSource(name); s) {
|
||||||
|
nhlog::ui()->debug("WebRTC: camera: {}", name);
|
||||||
|
resolution = tokenise(settings->cameraResolution().toStdString(), 'x');
|
||||||
|
frameRate = tokenise(settings->cameraFrameRate().toStdString(), '/');
|
||||||
|
nhlog::ui()->debug(
|
||||||
|
"WebRTC: camera resolution: {}x{}", resolution.first, resolution.second);
|
||||||
|
nhlog::ui()->debug(
|
||||||
|
"WebRTC: camera frame rate: {}/{}", frameRate.first, frameRate.second);
|
||||||
|
return s->device;
|
||||||
|
} else {
|
||||||
|
nhlog::ui()->error("WebRTC: unknown camera: {}", name);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
void
|
||||||
|
CallDevices::refresh()
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CallDevices::haveMic() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CallDevices::haveCamera() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>
|
||||||
|
CallDevices::names(bool, const std::string &) const
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>
|
||||||
|
CallDevices::resolutions(const std::string &) const
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>
|
||||||
|
CallDevices::frameRates(const std::string &, const std::string &) const
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
45
src/CallDevices.h
Normal file
45
src/CallDevices.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
typedef struct _GstDevice GstDevice;
|
||||||
|
|
||||||
|
class CallDevices : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
static CallDevices &instance()
|
||||||
|
{
|
||||||
|
static CallDevices instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void refresh();
|
||||||
|
bool haveMic() const;
|
||||||
|
bool haveCamera() const;
|
||||||
|
std::vector<std::string> names(bool isVideo, const std::string &defaultDevice) const;
|
||||||
|
std::vector<std::string> resolutions(const std::string &cameraName) const;
|
||||||
|
std::vector<std::string> frameRates(const std::string &cameraName,
|
||||||
|
const std::string &resolution) const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void devicesChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CallDevices();
|
||||||
|
|
||||||
|
friend class WebRTCSession;
|
||||||
|
void init();
|
||||||
|
GstDevice *audioDevice() const;
|
||||||
|
GstDevice *videoDevice(std::pair<int, int> &resolution,
|
||||||
|
std::pair<int, int> &frameRate) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CallDevices(CallDevices const &) = delete;
|
||||||
|
void operator=(CallDevices const &) = delete;
|
||||||
|
};
|
@ -7,6 +7,7 @@
|
|||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
#include "Cache.h"
|
#include "Cache.h"
|
||||||
|
#include "CallDevices.h"
|
||||||
#include "CallManager.h"
|
#include "CallManager.h"
|
||||||
#include "ChatPage.h"
|
#include "ChatPage.h"
|
||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
@ -114,21 +115,10 @@ CallManager::CallManager(QObject *parent)
|
|||||||
emit newCallState();
|
emit newCallState();
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(&session_, &WebRTCSession::devicesChanged, this, [this]() {
|
connect(&CallDevices::instance(),
|
||||||
if (ChatPage::instance()->userSettings()->microphone().isEmpty()) {
|
&CallDevices::devicesChanged,
|
||||||
auto mics = session_.getDeviceNames(false, std::string());
|
this,
|
||||||
if (!mics.empty())
|
&CallManager::devicesChanged);
|
||||||
ChatPage::instance()->userSettings()->setMicrophone(
|
|
||||||
QString::fromStdString(mics.front()));
|
|
||||||
}
|
|
||||||
if (ChatPage::instance()->userSettings()->camera().isEmpty()) {
|
|
||||||
auto cameras = session_.getDeviceNames(true, std::string());
|
|
||||||
if (!cameras.empty())
|
|
||||||
ChatPage::instance()->userSettings()->setCamera(
|
|
||||||
QString::fromStdString(cameras.front()));
|
|
||||||
}
|
|
||||||
emit devicesChanged();
|
|
||||||
});
|
|
||||||
|
|
||||||
connect(&player_,
|
connect(&player_,
|
||||||
&QMediaPlayer::mediaStatusChanged,
|
&QMediaPlayer::mediaStatusChanged,
|
||||||
@ -292,7 +282,7 @@ CallManager::handleEvent(const RoomEvent<CallInvite> &callInviteEvent)
|
|||||||
haveCallInvite_ = true;
|
haveCallInvite_ = true;
|
||||||
isVideo_ = isVideo;
|
isVideo_ = isVideo;
|
||||||
inviteSDP_ = callInviteEvent.content.sdp;
|
inviteSDP_ = callInviteEvent.content.sdp;
|
||||||
session_.refreshDevices();
|
CallDevices::instance().refresh();
|
||||||
emit newInviteState();
|
emit newInviteState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -409,7 +399,7 @@ CallManager::devices(bool isVideo) const
|
|||||||
const QString &defaultDevice = isVideo ? ChatPage::instance()->userSettings()->camera()
|
const QString &defaultDevice = isVideo ? ChatPage::instance()->userSettings()->camera()
|
||||||
: ChatPage::instance()->userSettings()->microphone();
|
: ChatPage::instance()->userSettings()->microphone();
|
||||||
std::vector<std::string> devices =
|
std::vector<std::string> devices =
|
||||||
session_.getDeviceNames(isVideo, defaultDevice.toStdString());
|
CallDevices::instance().names(isVideo, defaultDevice.toStdString());
|
||||||
ret.reserve(devices.size());
|
ret.reserve(devices.size());
|
||||||
std::transform(devices.cbegin(),
|
std::transform(devices.cbegin(),
|
||||||
devices.cend(),
|
devices.cend(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include "CallDevices.h"
|
||||||
#include "WebRTCSession.h"
|
#include "WebRTCSession.h"
|
||||||
#include "mtx/events/collections.hpp"
|
#include "mtx/events/collections.hpp"
|
||||||
#include "mtx/events/voip.hpp"
|
#include "mtx/events/voip.hpp"
|
||||||
@ -53,7 +54,7 @@ public:
|
|||||||
public slots:
|
public slots:
|
||||||
void sendInvite(const QString &roomid, bool isVideo);
|
void sendInvite(const QString &roomid, bool isVideo);
|
||||||
void syncEvent(const mtx::events::collections::TimelineEvents &event);
|
void syncEvent(const mtx::events::collections::TimelineEvents &event);
|
||||||
void refreshDevices() { session_.refreshDevices(); }
|
void refreshDevices() { CallDevices::instance().refresh(); }
|
||||||
void toggleMicMute();
|
void toggleMicMute();
|
||||||
void toggleCameraView() { session_.toggleCameraView(); }
|
void toggleCameraView() { session_.toggleCameraView(); }
|
||||||
void acceptInvite();
|
void acceptInvite();
|
||||||
|
@ -448,15 +448,14 @@ void
|
|||||||
ChatPage::deleteConfigs()
|
ChatPage::deleteConfigs()
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
|
|
||||||
|
if (UserSettings::instance()->profile() != "") {
|
||||||
|
settings.beginGroup("profile");
|
||||||
|
settings.beginGroup(UserSettings::instance()->profile());
|
||||||
|
}
|
||||||
settings.beginGroup("auth");
|
settings.beginGroup("auth");
|
||||||
settings.remove("");
|
settings.remove("");
|
||||||
settings.endGroup();
|
settings.endGroup(); // auth
|
||||||
settings.beginGroup("client");
|
|
||||||
settings.remove("");
|
|
||||||
settings.endGroup();
|
|
||||||
settings.beginGroup("notifications");
|
|
||||||
settings.remove("");
|
|
||||||
settings.endGroup();
|
|
||||||
|
|
||||||
http::client()->shutdown();
|
http::client()->shutdown();
|
||||||
cache::deleteData();
|
cache::deleteData();
|
||||||
@ -669,8 +668,6 @@ ChatPage::sendNotifications(const mtx::responses::Notifications &res)
|
|||||||
|
|
||||||
if (!cache::isNotificationSent(event_id)) {
|
if (!cache::isNotificationSent(event_id)) {
|
||||||
const auto room_id = QString::fromStdString(item.room_id);
|
const auto room_id = QString::fromStdString(item.room_id);
|
||||||
const auto user_id =
|
|
||||||
QString::fromStdString(mtx::accessors::sender(item.event));
|
|
||||||
|
|
||||||
// We should only sent one notification per event.
|
// We should only sent one notification per event.
|
||||||
cache::markSentNotification(event_id);
|
cache::markSentNotification(event_id);
|
||||||
@ -690,15 +687,9 @@ ChatPage::sendNotifications(const mtx::responses::Notifications &res)
|
|||||||
QString::fromStdString(info.avatar_url),
|
QString::fromStdString(info.avatar_url),
|
||||||
96,
|
96,
|
||||||
this,
|
this,
|
||||||
[this, room_id, event_id, item, user_id, info](
|
[this, item](QPixmap image) {
|
||||||
QPixmap image) {
|
|
||||||
notificationsManager.postNotification(
|
notificationsManager.postNotification(
|
||||||
room_id,
|
item, image.toImage());
|
||||||
QString::fromStdString(event_id),
|
|
||||||
QString::fromStdString(info.name),
|
|
||||||
cache::displayName(room_id, user_id),
|
|
||||||
utils::event_body(item.event),
|
|
||||||
image.toImage());
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,8 +105,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
|
|||||||
if (msg.transaction_id.has_value()) {
|
if (msg.transaction_id.has_value()) {
|
||||||
if (msg.transaction_id.value() != this->transaction_id)
|
if (msg.transaction_id.value() != this->transaction_id)
|
||||||
return;
|
return;
|
||||||
} else if (msg.relates_to.has_value()) {
|
} else if (msg.relations.references()) {
|
||||||
if (msg.relates_to.value().event_id != this->relation.event_id)
|
if (msg.relations.references() != this->relation.event_id)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ((msg.key_agreement_protocol == "curve25519-hkdf-sha256") &&
|
if ((msg.key_agreement_protocol == "curve25519-hkdf-sha256") &&
|
||||||
@ -136,8 +136,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
|
|||||||
if (msg.transaction_id.has_value()) {
|
if (msg.transaction_id.has_value()) {
|
||||||
if (msg.transaction_id.value() != this->transaction_id)
|
if (msg.transaction_id.value() != this->transaction_id)
|
||||||
return;
|
return;
|
||||||
} else if (msg.relates_to.has_value()) {
|
} else if (msg.relations.references()) {
|
||||||
if (msg.relates_to.value().event_id != this->relation.event_id)
|
if (msg.relations.references() != this->relation.event_id)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
error_ = User;
|
error_ = User;
|
||||||
@ -152,8 +152,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
|
|||||||
if (msg.transaction_id.has_value()) {
|
if (msg.transaction_id.has_value()) {
|
||||||
if (msg.transaction_id.value() != this->transaction_id)
|
if (msg.transaction_id.value() != this->transaction_id)
|
||||||
return;
|
return;
|
||||||
} else if (msg.relates_to.has_value()) {
|
} else if (msg.relations.references()) {
|
||||||
if (msg.relates_to.value().event_id != this->relation.event_id)
|
if (msg.relations.references() != this->relation.event_id)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,8 +217,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
|
|||||||
if (msg.transaction_id.has_value()) {
|
if (msg.transaction_id.has_value()) {
|
||||||
if (msg.transaction_id.value() != this->transaction_id)
|
if (msg.transaction_id.value() != this->transaction_id)
|
||||||
return;
|
return;
|
||||||
} else if (msg.relates_to.has_value()) {
|
} else if (msg.relations.references()) {
|
||||||
if (msg.relates_to.value().event_id != this->relation.event_id)
|
if (msg.relations.references() != this->relation.event_id)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,8 +385,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
|
|||||||
if (msg.transaction_id.has_value()) {
|
if (msg.transaction_id.has_value()) {
|
||||||
if (msg.transaction_id.value() != this->transaction_id)
|
if (msg.transaction_id.value() != this->transaction_id)
|
||||||
return;
|
return;
|
||||||
} else if ((msg.relates_to.has_value() && sender)) {
|
} else if (msg.relations.references()) {
|
||||||
if (msg.relates_to.value().event_id != this->relation.event_id)
|
if (msg.relations.references() != this->relation.event_id)
|
||||||
return;
|
return;
|
||||||
else {
|
else {
|
||||||
this->deviceId = QString::fromStdString(msg.from_device);
|
this->deviceId = QString::fromStdString(msg.from_device);
|
||||||
@ -402,8 +402,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
|
|||||||
if (msg.transaction_id.has_value()) {
|
if (msg.transaction_id.has_value()) {
|
||||||
if (msg.transaction_id.value() != this->transaction_id)
|
if (msg.transaction_id.value() != this->transaction_id)
|
||||||
return;
|
return;
|
||||||
} else if (msg.relates_to.has_value()) {
|
} else if (msg.relations.references()) {
|
||||||
if (msg.relates_to.value().event_id != this->relation.event_id)
|
if (msg.relations.references() != this->relation.event_id)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nhlog::ui()->info("Flow done on other side");
|
nhlog::ui()->info("Flow done on other side");
|
||||||
@ -526,8 +526,8 @@ DeviceVerificationFlow::handleStartMessage(const mtx::events::msg::KeyVerificati
|
|||||||
if (msg.transaction_id.has_value()) {
|
if (msg.transaction_id.has_value()) {
|
||||||
if (msg.transaction_id.value() != this->transaction_id)
|
if (msg.transaction_id.value() != this->transaction_id)
|
||||||
return;
|
return;
|
||||||
} else if (msg.relates_to.has_value()) {
|
} else if (msg.relations.references()) {
|
||||||
if (msg.relates_to.value().event_id != this->relation.event_id)
|
if (msg.relations.references() != this->relation.event_id)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ((std::find(msg.key_agreement_protocols.begin(),
|
if ((std::find(msg.key_agreement_protocols.begin(),
|
||||||
@ -625,7 +625,9 @@ DeviceVerificationFlow::startVerificationRequest()
|
|||||||
req.transaction_id = this->transaction_id;
|
req.transaction_id = this->transaction_id;
|
||||||
this->canonical_json = nlohmann::json(req);
|
this->canonical_json = nlohmann::json(req);
|
||||||
} else if (this->type == DeviceVerificationFlow::Type::RoomMsg && model_) {
|
} else if (this->type == DeviceVerificationFlow::Type::RoomMsg && model_) {
|
||||||
req.relates_to = this->relation;
|
req.relations.relations.push_back(this->relation);
|
||||||
|
// Set synthesized to surpress the nheko relation extensions
|
||||||
|
req.relations.synthesized = true;
|
||||||
this->canonical_json = nlohmann::json(req);
|
this->canonical_json = nlohmann::json(req);
|
||||||
}
|
}
|
||||||
send(req);
|
send(req);
|
||||||
|
@ -206,7 +206,7 @@ private:
|
|||||||
std::vector<int> sasList;
|
std::vector<int> sasList;
|
||||||
UserKeyCache their_keys;
|
UserKeyCache their_keys;
|
||||||
TimelineModel *model_;
|
TimelineModel *model_;
|
||||||
mtx::common::RelatesTo relation;
|
mtx::common::Relation relation;
|
||||||
|
|
||||||
State state_ = PromptStartVerification;
|
State state_ = PromptStartVerification;
|
||||||
Error error_ = UnknownMethod;
|
Error error_ = UnknownMethod;
|
||||||
@ -230,8 +230,12 @@ private:
|
|||||||
static_cast<int>(err->status_code));
|
static_cast<int>(err->status_code));
|
||||||
});
|
});
|
||||||
} else if (this->type == DeviceVerificationFlow::Type::RoomMsg && model_) {
|
} else if (this->type == DeviceVerificationFlow::Type::RoomMsg && model_) {
|
||||||
if constexpr (!std::is_same_v<T, mtx::events::msg::KeyVerificationRequest>)
|
if constexpr (!std::is_same_v<T,
|
||||||
msg.relates_to = this->relation;
|
mtx::events::msg::KeyVerificationRequest>) {
|
||||||
|
msg.relations.relations.push_back(this->relation);
|
||||||
|
// Set synthesized to surpress the nheko relation extensions
|
||||||
|
msg.relations.synthesized = true;
|
||||||
|
}
|
||||||
(model_)->sendMessageEvent(msg, mtx::events::to_device_content_to_type<T>);
|
(model_)->sendMessageEvent(msg, mtx::events::to_device_content_to_type<T>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,20 @@ struct detector<Default, std::void_t<Op<Args...>>, Op, Args...>
|
|||||||
template<template<class...> class Op, class... Args>
|
template<template<class...> class Op, class... Args>
|
||||||
using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;
|
using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;
|
||||||
|
|
||||||
|
struct IsStateEvent
|
||||||
|
{
|
||||||
|
template<class T>
|
||||||
|
bool operator()(const mtx::events::StateEvent<T> &)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
bool operator()(const mtx::events::Event<T> &)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct EventMsgType
|
struct EventMsgType
|
||||||
{
|
{
|
||||||
template<class E>
|
template<class E>
|
||||||
@ -250,31 +264,31 @@ struct EventFilesize
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct EventInReplyTo
|
struct EventRelations
|
||||||
{
|
{
|
||||||
template<class Content>
|
template<class Content>
|
||||||
using related_ev_id_t = decltype(Content::relates_to.in_reply_to.event_id);
|
using related_ev_id_t = decltype(Content::relations);
|
||||||
template<class T>
|
template<class T>
|
||||||
std::string operator()(const mtx::events::Event<T> &e)
|
mtx::common::Relations operator()(const mtx::events::Event<T> &e)
|
||||||
{
|
{
|
||||||
if constexpr (is_detected<related_ev_id_t, T>::value) {
|
if constexpr (is_detected<related_ev_id_t, T>::value) {
|
||||||
return e.content.relates_to.in_reply_to.event_id;
|
return e.content.relations;
|
||||||
}
|
}
|
||||||
return "";
|
return {};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct EventRelatesTo
|
struct SetEventRelations
|
||||||
{
|
{
|
||||||
|
mtx::common::Relations new_relations;
|
||||||
template<class Content>
|
template<class Content>
|
||||||
using related_ev_id_t = decltype(Content::relates_to.event_id);
|
using related_ev_id_t = decltype(Content::relations);
|
||||||
template<class T>
|
template<class T>
|
||||||
std::string operator()(const mtx::events::Event<T> &e)
|
void operator()(mtx::events::Event<T> &e)
|
||||||
{
|
{
|
||||||
if constexpr (is_detected<related_ev_id_t, T>::value) {
|
if constexpr (is_detected<related_ev_id_t, T>::value) {
|
||||||
return e.content.relates_to.event_id;
|
e.content.relations = std::move(new_relations);
|
||||||
}
|
}
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -434,15 +448,17 @@ mtx::accessors::mimetype(const mtx::events::collections::TimelineEvents &event)
|
|||||||
{
|
{
|
||||||
return std::visit(EventMimeType{}, event);
|
return std::visit(EventMimeType{}, event);
|
||||||
}
|
}
|
||||||
std::string
|
mtx::common::Relations
|
||||||
mtx::accessors::in_reply_to_event(const mtx::events::collections::TimelineEvents &event)
|
mtx::accessors::relations(const mtx::events::collections::TimelineEvents &event)
|
||||||
{
|
{
|
||||||
return std::visit(EventInReplyTo{}, event);
|
return std::visit(EventRelations{}, event);
|
||||||
}
|
}
|
||||||
std::string
|
|
||||||
mtx::accessors::relates_to_event_id(const mtx::events::collections::TimelineEvents &event)
|
void
|
||||||
|
mtx::accessors::set_relations(mtx::events::collections::TimelineEvents &event,
|
||||||
|
mtx::common::Relations relations)
|
||||||
{
|
{
|
||||||
return std::visit(EventRelatesTo{}, event);
|
std::visit(SetEventRelations{std::move(relations)}, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
@ -474,3 +490,9 @@ mtx::accessors::serialize_event(const mtx::events::collections::TimelineEvents &
|
|||||||
{
|
{
|
||||||
return std::visit([](const auto &e) { return nlohmann::json(e); }, event);
|
return std::visit([](const auto &e) { return nlohmann::json(e); }, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
mtx::accessors::is_state_event(const mtx::events::collections::TimelineEvents &event)
|
||||||
|
{
|
||||||
|
return std::visit(IsStateEvent{}, event);
|
||||||
|
}
|
||||||
|
@ -17,6 +17,9 @@ room_id(const mtx::events::collections::TimelineEvents &event);
|
|||||||
std::string
|
std::string
|
||||||
sender(const mtx::events::collections::TimelineEvents &event);
|
sender(const mtx::events::collections::TimelineEvents &event);
|
||||||
|
|
||||||
|
bool
|
||||||
|
is_state_event(const mtx::events::collections::TimelineEvents &event);
|
||||||
|
|
||||||
QDateTime
|
QDateTime
|
||||||
origin_server_ts(const mtx::events::collections::TimelineEvents &event);
|
origin_server_ts(const mtx::events::collections::TimelineEvents &event);
|
||||||
|
|
||||||
@ -53,10 +56,10 @@ std::string
|
|||||||
blurhash(const mtx::events::collections::TimelineEvents &event);
|
blurhash(const mtx::events::collections::TimelineEvents &event);
|
||||||
std::string
|
std::string
|
||||||
mimetype(const mtx::events::collections::TimelineEvents &event);
|
mimetype(const mtx::events::collections::TimelineEvents &event);
|
||||||
std::string
|
mtx::common::Relations
|
||||||
in_reply_to_event(const mtx::events::collections::TimelineEvents &event);
|
relations(const mtx::events::collections::TimelineEvents &event);
|
||||||
std::string
|
void
|
||||||
relates_to_event_id(const mtx::events::collections::TimelineEvents &event);
|
set_relations(mtx::events::collections::TimelineEvents &event, mtx::common::Relations relations);
|
||||||
std::string
|
std::string
|
||||||
transaction_id(const mtx::events::collections::TimelineEvents &event);
|
transaction_id(const mtx::events::collections::TimelineEvents &event);
|
||||||
|
|
||||||
|
17
src/Olm.cpp
17
src/Olm.cpp
@ -575,17 +575,8 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
|
|||||||
if (!sendSessionTo.empty())
|
if (!sendSessionTo.empty())
|
||||||
olm::send_encrypted_to_device_messages(sendSessionTo, megolm_payload);
|
olm::send_encrypted_to_device_messages(sendSessionTo, megolm_payload);
|
||||||
|
|
||||||
mtx::common::ReplyRelatesTo relation;
|
|
||||||
mtx::common::RelatesTo r_relation;
|
|
||||||
|
|
||||||
// relations shouldn't be encrypted...
|
// relations shouldn't be encrypted...
|
||||||
if (body["content"].contains("m.relates_to")) {
|
mtx::common::Relations relations = mtx::common::parse_relations(body["content"]);
|
||||||
if (body["content"]["m.relates_to"].contains("m.in_reply_to")) {
|
|
||||||
relation = body["content"]["m.relates_to"];
|
|
||||||
} else if (body["content"]["m.relates_to"].contains("event_id")) {
|
|
||||||
r_relation = body["content"]["m.relates_to"];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto payload = olm::client()->encrypt_group_message(session.get(), body.dump());
|
auto payload = olm::client()->encrypt_group_message(session.get(), body.dump());
|
||||||
|
|
||||||
@ -596,8 +587,7 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
|
|||||||
data.session_id = mtx::crypto::session_id(session.get());
|
data.session_id = mtx::crypto::session_id(session.get());
|
||||||
data.device_id = device_id;
|
data.device_id = device_id;
|
||||||
data.algorithm = MEGOLM_ALGO;
|
data.algorithm = MEGOLM_ALGO;
|
||||||
data.relates_to = relation;
|
data.relations = relations;
|
||||||
data.r_relates_to = r_relation;
|
|
||||||
|
|
||||||
group_session_data.message_index = olm_outbound_group_session_message_index(session.get());
|
group_session_data.message_index = olm_outbound_group_session_message_index(session.get());
|
||||||
nhlog::crypto()->debug("next message_index {}", group_session_data.message_index);
|
nhlog::crypto()->debug("next message_index {}", group_session_data.message_index);
|
||||||
@ -910,8 +900,7 @@ decryptEvent(const MegolmSessionIndex &index,
|
|||||||
body["unsigned"] = event.unsigned_data;
|
body["unsigned"] = event.unsigned_data;
|
||||||
|
|
||||||
// relations are unencrypted in content...
|
// relations are unencrypted in content...
|
||||||
if (json old_ev = event; old_ev["content"].count("m.relates_to") != 0)
|
mtx::common::add_relations(body["content"], event.content.relations);
|
||||||
body["content"]["m.relates_to"] = old_ev["content"]["m.relates_to"];
|
|
||||||
|
|
||||||
mtx::events::collections::TimelineEvent te;
|
mtx::events::collections::TimelineEvent te;
|
||||||
try {
|
try {
|
||||||
|
@ -39,12 +39,12 @@
|
|||||||
#include <QtQml>
|
#include <QtQml>
|
||||||
|
|
||||||
#include "Cache.h"
|
#include "Cache.h"
|
||||||
|
#include "CallDevices.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "MatrixClient.h"
|
#include "MatrixClient.h"
|
||||||
#include "Olm.h"
|
#include "Olm.h"
|
||||||
#include "UserSettingsPage.h"
|
#include "UserSettingsPage.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "WebRTCSession.h"
|
|
||||||
#include "ui/FlatButton.h"
|
#include "ui/FlatButton.h"
|
||||||
#include "ui/ToggleButton.h"
|
#include "ui/ToggleButton.h"
|
||||||
|
|
||||||
@ -115,8 +115,8 @@ UserSettings::load(std::optional<QString> profile)
|
|||||||
cameraFrameRate_ = settings.value("user/camera_frame_rate", QString()).toString();
|
cameraFrameRate_ = settings.value("user/camera_frame_rate", QString()).toString();
|
||||||
useStunServer_ = settings.value("user/use_stun_server", false).toBool();
|
useStunServer_ = settings.value("user/use_stun_server", false).toBool();
|
||||||
|
|
||||||
if (profile)
|
if (profile) // set to "" if it's the default to maintain compatibility
|
||||||
profile_ = *profile;
|
profile_ = (*profile == "default") ? "" : *profile;
|
||||||
else
|
else
|
||||||
profile_ = settings.value("user/currentProfile", "").toString();
|
profile_ = settings.value("user/currentProfile", "").toString();
|
||||||
|
|
||||||
@ -341,7 +341,13 @@ UserSettings::setEmojiFontFamily(QString family)
|
|||||||
{
|
{
|
||||||
if (family == emojiFont_)
|
if (family == emojiFont_)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (family == tr("Default")) {
|
||||||
|
emojiFont_ = "default";
|
||||||
|
} else {
|
||||||
emojiFont_ = family;
|
emojiFont_ = family;
|
||||||
|
}
|
||||||
|
|
||||||
emit emojiFontChanged(family);
|
emit emojiFontChanged(family);
|
||||||
save();
|
save();
|
||||||
}
|
}
|
||||||
@ -725,11 +731,15 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
|
|||||||
// TODO: Is there a way to limit to just emojis, rather than
|
// TODO: Is there a way to limit to just emojis, rather than
|
||||||
// all emoji fonts?
|
// all emoji fonts?
|
||||||
auto emojiFamilies = fontDb.families(QFontDatabase::Symbol);
|
auto emojiFamilies = fontDb.families(QFontDatabase::Symbol);
|
||||||
|
emojiFontSelectionCombo_->addItem(tr("Default"));
|
||||||
for (const auto &family : emojiFamilies) {
|
for (const auto &family : emojiFamilies) {
|
||||||
emojiFontSelectionCombo_->addItem(family);
|
emojiFontSelectionCombo_->addItem(family);
|
||||||
}
|
}
|
||||||
|
|
||||||
fontSelectionCombo_->setCurrentIndex(fontSelectionCombo_->findText(settings_->font()));
|
QString currentFont = settings_->font();
|
||||||
|
if (currentFont != "default" || currentFont != "") {
|
||||||
|
fontSelectionCombo_->setCurrentIndex(fontSelectionCombo_->findText(currentFont));
|
||||||
|
}
|
||||||
|
|
||||||
emojiFontSelectionCombo_->setCurrentIndex(
|
emojiFontSelectionCombo_->setCurrentIndex(
|
||||||
emojiFontSelectionCombo_->findText(settings_->emojiFont()));
|
emojiFontSelectionCombo_->findText(settings_->emojiFont()));
|
||||||
@ -1060,7 +1070,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
|
|||||||
[this](const QString &camera) {
|
[this](const QString &camera) {
|
||||||
settings_->setCamera(camera);
|
settings_->setCamera(camera);
|
||||||
std::vector<std::string> resolutions =
|
std::vector<std::string> resolutions =
|
||||||
WebRTCSession::instance().getResolutions(camera.toStdString());
|
CallDevices::instance().resolutions(camera.toStdString());
|
||||||
cameraResolutionCombo_->clear();
|
cameraResolutionCombo_->clear();
|
||||||
for (const auto &resolution : resolutions)
|
for (const auto &resolution : resolutions)
|
||||||
cameraResolutionCombo_->addItem(QString::fromStdString(resolution));
|
cameraResolutionCombo_->addItem(QString::fromStdString(resolution));
|
||||||
@ -1070,9 +1080,8 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
|
|||||||
static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
|
static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
|
||||||
[this](const QString &resolution) {
|
[this](const QString &resolution) {
|
||||||
settings_->setCameraResolution(resolution);
|
settings_->setCameraResolution(resolution);
|
||||||
std::vector<std::string> frameRates =
|
std::vector<std::string> frameRates = CallDevices::instance().frameRates(
|
||||||
WebRTCSession::instance().getFrameRates(settings_->camera().toStdString(),
|
settings_->camera().toStdString(), resolution.toStdString());
|
||||||
resolution.toStdString());
|
|
||||||
cameraFrameRateCombo_->clear();
|
cameraFrameRateCombo_->clear();
|
||||||
for (const auto &frameRate : frameRates)
|
for (const auto &frameRate : frameRates)
|
||||||
cameraFrameRateCombo_->addItem(QString::fromStdString(frameRate));
|
cameraFrameRateCombo_->addItem(QString::fromStdString(frameRate));
|
||||||
@ -1231,9 +1240,8 @@ UserSettingsPage::showEvent(QShowEvent *)
|
|||||||
timelineMaxWidthSpin_->setValue(settings_->timelineMaxWidth());
|
timelineMaxWidthSpin_->setValue(settings_->timelineMaxWidth());
|
||||||
privacyScreenTimeout_->setValue(settings_->privacyScreenTimeout());
|
privacyScreenTimeout_->setValue(settings_->privacyScreenTimeout());
|
||||||
|
|
||||||
WebRTCSession::instance().refreshDevices();
|
CallDevices::instance().refresh();
|
||||||
auto mics =
|
auto mics = CallDevices::instance().names(false, settings_->microphone().toStdString());
|
||||||
WebRTCSession::instance().getDeviceNames(false, settings_->microphone().toStdString());
|
|
||||||
microphoneCombo_->clear();
|
microphoneCombo_->clear();
|
||||||
for (const auto &m : mics)
|
for (const auto &m : mics)
|
||||||
microphoneCombo_->addItem(QString::fromStdString(m));
|
microphoneCombo_->addItem(QString::fromStdString(m));
|
||||||
@ -1241,8 +1249,7 @@ UserSettingsPage::showEvent(QShowEvent *)
|
|||||||
auto cameraResolution = settings_->cameraResolution();
|
auto cameraResolution = settings_->cameraResolution();
|
||||||
auto cameraFrameRate = settings_->cameraFrameRate();
|
auto cameraFrameRate = settings_->cameraFrameRate();
|
||||||
|
|
||||||
auto cameras =
|
auto cameras = CallDevices::instance().names(true, settings_->camera().toStdString());
|
||||||
WebRTCSession::instance().getDeviceNames(true, settings_->camera().toStdString());
|
|
||||||
cameraCombo_->clear();
|
cameraCombo_->clear();
|
||||||
for (const auto &c : cameras)
|
for (const auto &c : cameras)
|
||||||
cameraCombo_->addItem(QString::fromStdString(c));
|
cameraCombo_->addItem(QString::fromStdString(c));
|
||||||
|
@ -177,7 +177,14 @@ public:
|
|||||||
int timelineMaxWidth() const { return timelineMaxWidth_; }
|
int timelineMaxWidth() const { return timelineMaxWidth_; }
|
||||||
double fontSize() const { return baseFontSize_; }
|
double fontSize() const { return baseFontSize_; }
|
||||||
QString font() const { return font_; }
|
QString font() const { return font_; }
|
||||||
QString emojiFont() const { return emojiFont_; }
|
QString emojiFont() const
|
||||||
|
{
|
||||||
|
if (emojiFont_ == "Default") {
|
||||||
|
return tr("Default");
|
||||||
|
}
|
||||||
|
|
||||||
|
return emojiFont_;
|
||||||
|
}
|
||||||
Presence presence() const { return presence_; }
|
Presence presence() const { return presence_; }
|
||||||
QString ringtone() const { return ringtone_; }
|
QString ringtone() const { return ringtone_; }
|
||||||
QString microphone() const { return microphone_; }
|
QString microphone() const { return microphone_; }
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "Cache.h"
|
#include "Cache.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "MatrixClient.h"
|
#include "MatrixClient.h"
|
||||||
|
#include "UserSettingsPage.h"
|
||||||
|
|
||||||
using TimelineEvent = mtx::events::collections::TimelineEvents;
|
using TimelineEvent = mtx::events::collections::TimelineEvents;
|
||||||
|
|
||||||
@ -65,14 +66,12 @@ utils::replaceEmoji(const QString &body)
|
|||||||
|
|
||||||
QVector<uint> utf32_string = body.toUcs4();
|
QVector<uint> utf32_string = body.toUcs4();
|
||||||
|
|
||||||
QSettings settings;
|
|
||||||
QString userFontFamily = settings.value("user/emoji_font_family", "emoji").toString();
|
|
||||||
|
|
||||||
bool insideFontBlock = false;
|
bool insideFontBlock = false;
|
||||||
for (auto &code : utf32_string) {
|
for (auto &code : utf32_string) {
|
||||||
if (utils::codepointIsEmoji(code)) {
|
if (utils::codepointIsEmoji(code)) {
|
||||||
if (!insideFontBlock) {
|
if (!insideFontBlock) {
|
||||||
fmtBody += QString("<font face=\"" + userFontFamily + "\">");
|
fmtBody += QString("<font face=\"" +
|
||||||
|
UserSettings::instance()->emojiFont() + "\">");
|
||||||
insideFontBlock = true;
|
insideFontBlock = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -505,13 +504,7 @@ utils::getQuoteBody(const RelatedInfo &related)
|
|||||||
QString
|
QString
|
||||||
utils::linkColor()
|
utils::linkColor()
|
||||||
{
|
{
|
||||||
QSettings settings;
|
const auto theme = UserSettings::instance()->theme();
|
||||||
// Default to system theme if QT_QPA_PLATFORMTHEME var is set.
|
|
||||||
QString defaultTheme =
|
|
||||||
QProcessEnvironment::systemEnvironment().value("QT_QPA_PLATFORMTHEME", "").isEmpty()
|
|
||||||
? "light"
|
|
||||||
: "system";
|
|
||||||
const auto theme = settings.value("user/theme", defaultTheme).toString();
|
|
||||||
|
|
||||||
if (theme == "light") {
|
if (theme == "light") {
|
||||||
return "#0077b5";
|
return "#0077b5";
|
||||||
|
@ -35,6 +35,7 @@ using webrtc::State;
|
|||||||
|
|
||||||
WebRTCSession::WebRTCSession()
|
WebRTCSession::WebRTCSession()
|
||||||
: QObject()
|
: QObject()
|
||||||
|
, devices_(CallDevices::instance())
|
||||||
{
|
{
|
||||||
qRegisterMetaType<webrtc::State>();
|
qRegisterMetaType<webrtc::State>();
|
||||||
qmlRegisterUncreatableMetaObject(
|
qmlRegisterUncreatableMetaObject(
|
||||||
@ -68,9 +69,7 @@ WebRTCSession::init(std::string *errorMessage)
|
|||||||
gchar *version = gst_version_string();
|
gchar *version = gst_version_string();
|
||||||
nhlog::ui()->info("WebRTC: initialised {}", version);
|
nhlog::ui()->info("WebRTC: initialised {}", version);
|
||||||
g_free(version);
|
g_free(version);
|
||||||
#if GST_CHECK_VERSION(1, 18, 0)
|
devices_.init();
|
||||||
startDeviceMonitor();
|
|
||||||
#endif
|
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
(void)errorMessage;
|
(void)errorMessage;
|
||||||
@ -81,195 +80,17 @@ WebRTCSession::init(std::string *errorMessage)
|
|||||||
#ifdef GSTREAMER_AVAILABLE
|
#ifdef GSTREAMER_AVAILABLE
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
struct AudioSource
|
|
||||||
{
|
|
||||||
std::string name;
|
|
||||||
GstDevice *device;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct VideoSource
|
|
||||||
{
|
|
||||||
struct Caps
|
|
||||||
{
|
|
||||||
std::string resolution;
|
|
||||||
std::vector<std::string> frameRates;
|
|
||||||
};
|
|
||||||
std::string name;
|
|
||||||
GstDevice *device;
|
|
||||||
std::vector<Caps> caps;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::string localsdp_;
|
std::string localsdp_;
|
||||||
std::vector<mtx::events::msg::CallCandidates::Candidate> localcandidates_;
|
std::vector<mtx::events::msg::CallCandidates::Candidate> localcandidates_;
|
||||||
bool haveAudioStream_;
|
bool haveAudioStream_;
|
||||||
bool haveVideoStream_;
|
bool haveVideoStream_;
|
||||||
std::vector<AudioSource> audioSources_;
|
|
||||||
std::vector<VideoSource> videoSources_;
|
|
||||||
GstPad *insetSinkPad_ = nullptr;
|
GstPad *insetSinkPad_ = nullptr;
|
||||||
|
|
||||||
using FrameRate = std::pair<int, int>;
|
|
||||||
std::optional<FrameRate>
|
|
||||||
getFrameRate(const GValue *value)
|
|
||||||
{
|
|
||||||
if (GST_VALUE_HOLDS_FRACTION(value)) {
|
|
||||||
gint num = gst_value_get_fraction_numerator(value);
|
|
||||||
gint den = gst_value_get_fraction_denominator(value);
|
|
||||||
return FrameRate{num, den};
|
|
||||||
}
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
addFrameRate(std::vector<std::string> &rates, const FrameRate &rate)
|
|
||||||
{
|
|
||||||
constexpr double minimumFrameRate = 15.0;
|
|
||||||
if (static_cast<double>(rate.first) / rate.second >= minimumFrameRate)
|
|
||||||
rates.push_back(std::to_string(rate.first) + "/" + std::to_string(rate.second));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::pair<int, int>
|
|
||||||
tokenise(std::string_view str, char delim)
|
|
||||||
{
|
|
||||||
std::pair<int, int> ret;
|
|
||||||
ret.first = std::atoi(str.data());
|
|
||||||
auto pos = str.find_first_of(delim);
|
|
||||||
ret.second = std::atoi(str.data() + pos + 1);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
addDevice(GstDevice *device)
|
|
||||||
{
|
|
||||||
if (!device)
|
|
||||||
return;
|
|
||||||
|
|
||||||
gchar *name = gst_device_get_display_name(device);
|
|
||||||
gchar *type = gst_device_get_device_class(device);
|
|
||||||
bool isVideo = !std::strncmp(type, "Video", 5);
|
|
||||||
g_free(type);
|
|
||||||
nhlog::ui()->debug("WebRTC: {} device added: {}", isVideo ? "video" : "audio", name);
|
|
||||||
if (!isVideo) {
|
|
||||||
audioSources_.push_back({name, device});
|
|
||||||
g_free(name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstCaps *gstcaps = gst_device_get_caps(device);
|
|
||||||
if (!gstcaps) {
|
|
||||||
nhlog::ui()->debug("WebRTC: unable to get caps for {}", name);
|
|
||||||
g_free(name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
VideoSource source{name, device, {}};
|
|
||||||
g_free(name);
|
|
||||||
guint nCaps = gst_caps_get_size(gstcaps);
|
|
||||||
for (guint i = 0; i < nCaps; ++i) {
|
|
||||||
GstStructure *structure = gst_caps_get_structure(gstcaps, i);
|
|
||||||
const gchar *name = gst_structure_get_name(structure);
|
|
||||||
if (!std::strcmp(name, "video/x-raw")) {
|
|
||||||
gint widthpx, heightpx;
|
|
||||||
if (gst_structure_get(structure,
|
|
||||||
"width",
|
|
||||||
G_TYPE_INT,
|
|
||||||
&widthpx,
|
|
||||||
"height",
|
|
||||||
G_TYPE_INT,
|
|
||||||
&heightpx,
|
|
||||||
nullptr)) {
|
|
||||||
VideoSource::Caps caps;
|
|
||||||
caps.resolution =
|
|
||||||
std::to_string(widthpx) + "x" + std::to_string(heightpx);
|
|
||||||
const GValue *value =
|
|
||||||
gst_structure_get_value(structure, "framerate");
|
|
||||||
if (auto fr = getFrameRate(value); fr)
|
|
||||||
addFrameRate(caps.frameRates, *fr);
|
|
||||||
else if (GST_VALUE_HOLDS_FRACTION_RANGE(value)) {
|
|
||||||
const GValue *minRate =
|
|
||||||
gst_value_get_fraction_range_min(value);
|
|
||||||
if (auto fr = getFrameRate(minRate); fr)
|
|
||||||
addFrameRate(caps.frameRates, *fr);
|
|
||||||
const GValue *maxRate =
|
|
||||||
gst_value_get_fraction_range_max(value);
|
|
||||||
if (auto fr = getFrameRate(maxRate); fr)
|
|
||||||
addFrameRate(caps.frameRates, *fr);
|
|
||||||
} else if (GST_VALUE_HOLDS_LIST(value)) {
|
|
||||||
guint nRates = gst_value_list_get_size(value);
|
|
||||||
for (guint j = 0; j < nRates; ++j) {
|
|
||||||
const GValue *rate =
|
|
||||||
gst_value_list_get_value(value, j);
|
|
||||||
if (auto fr = getFrameRate(rate); fr)
|
|
||||||
addFrameRate(caps.frameRates, *fr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!caps.frameRates.empty())
|
|
||||||
source.caps.push_back(std::move(caps));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gst_caps_unref(gstcaps);
|
|
||||||
videoSources_.push_back(std::move(source));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if GST_CHECK_VERSION(1, 18, 0)
|
|
||||||
template<typename T>
|
|
||||||
bool
|
|
||||||
removeDevice(T &sources, GstDevice *device, bool changed)
|
|
||||||
{
|
|
||||||
if (auto it = std::find_if(sources.begin(),
|
|
||||||
sources.end(),
|
|
||||||
[device](const auto &s) { return s.device == device; });
|
|
||||||
it != sources.end()) {
|
|
||||||
nhlog::ui()->debug(std::string("WebRTC: device ") +
|
|
||||||
(changed ? "changed: " : "removed: ") + "{}",
|
|
||||||
it->name);
|
|
||||||
gst_object_unref(device);
|
|
||||||
sources.erase(it);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
removeDevice(GstDevice *device, bool changed)
|
|
||||||
{
|
|
||||||
if (device) {
|
|
||||||
if (removeDevice(audioSources_, device, changed) ||
|
|
||||||
removeDevice(videoSources_, device, changed))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
newBusMessage(GstBus *bus G_GNUC_UNUSED, GstMessage *msg, gpointer user_data)
|
newBusMessage(GstBus *bus G_GNUC_UNUSED, GstMessage *msg, gpointer user_data)
|
||||||
{
|
{
|
||||||
WebRTCSession *session = static_cast<WebRTCSession *>(user_data);
|
WebRTCSession *session = static_cast<WebRTCSession *>(user_data);
|
||||||
switch (GST_MESSAGE_TYPE(msg)) {
|
switch (GST_MESSAGE_TYPE(msg)) {
|
||||||
#if GST_CHECK_VERSION(1, 18, 0)
|
|
||||||
case GST_MESSAGE_DEVICE_ADDED: {
|
|
||||||
GstDevice *device;
|
|
||||||
gst_message_parse_device_added(msg, &device);
|
|
||||||
addDevice(device);
|
|
||||||
emit WebRTCSession::instance().devicesChanged();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GST_MESSAGE_DEVICE_REMOVED: {
|
|
||||||
GstDevice *device;
|
|
||||||
gst_message_parse_device_removed(msg, &device);
|
|
||||||
removeDevice(device, false);
|
|
||||||
emit WebRTCSession::instance().devicesChanged();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GST_MESSAGE_DEVICE_CHANGED: {
|
|
||||||
GstDevice *device;
|
|
||||||
GstDevice *oldDevice;
|
|
||||||
gst_message_parse_device_changed(msg, &device, &oldDevice);
|
|
||||||
removeDevice(oldDevice, true);
|
|
||||||
addDevice(device);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
case GST_MESSAGE_EOS:
|
case GST_MESSAGE_EOS:
|
||||||
nhlog::ui()->error("WebRTC: end of stream");
|
nhlog::ui()->error("WebRTC: end of stream");
|
||||||
session->end();
|
session->end();
|
||||||
@ -724,27 +545,6 @@ getMediaAttributes(const GstSDPMessage *sdp,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
std::vector<std::string>
|
|
||||||
deviceNames(T &sources, const std::string &defaultDevice)
|
|
||||||
{
|
|
||||||
std::vector<std::string> ret;
|
|
||||||
ret.reserve(sources.size());
|
|
||||||
std::transform(sources.cbegin(),
|
|
||||||
sources.cend(),
|
|
||||||
std::back_inserter(ret),
|
|
||||||
[](const auto &s) { return s.name; });
|
|
||||||
|
|
||||||
// move default device to top of the list
|
|
||||||
if (auto it = std::find_if(ret.begin(),
|
|
||||||
ret.end(),
|
|
||||||
[&defaultDevice](const auto &s) { return s == defaultDevice; });
|
|
||||||
it != ret.end())
|
|
||||||
std::swap(ret.front(), *it);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@ -995,19 +795,11 @@ WebRTCSession::startPipeline(int opusPayloadType, int vp8PayloadType)
|
|||||||
bool
|
bool
|
||||||
WebRTCSession::createPipeline(int opusPayloadType, int vp8PayloadType)
|
WebRTCSession::createPipeline(int opusPayloadType, int vp8PayloadType)
|
||||||
{
|
{
|
||||||
std::string microphoneSetting =
|
GstDevice *device = devices_.audioDevice();
|
||||||
ChatPage::instance()->userSettings()->microphone().toStdString();
|
if (!device)
|
||||||
auto it =
|
|
||||||
std::find_if(audioSources_.cbegin(),
|
|
||||||
audioSources_.cend(),
|
|
||||||
[µphoneSetting](const auto &s) { return s.name == microphoneSetting; });
|
|
||||||
if (it == audioSources_.cend()) {
|
|
||||||
nhlog::ui()->error("WebRTC: unknown microphone: {}", microphoneSetting);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
nhlog::ui()->debug("WebRTC: microphone: {}", microphoneSetting);
|
|
||||||
|
|
||||||
GstElement *source = gst_device_create_element(it->device, nullptr);
|
GstElement *source = gst_device_create_element(device, nullptr);
|
||||||
GstElement *volume = gst_element_factory_make("volume", "srclevel");
|
GstElement *volume = gst_element_factory_make("volume", "srclevel");
|
||||||
GstElement *convert = gst_element_factory_make("audioconvert", nullptr);
|
GstElement *convert = gst_element_factory_make("audioconvert", nullptr);
|
||||||
GstElement *resample = gst_element_factory_make("audioresample", nullptr);
|
GstElement *resample = gst_element_factory_make("audioresample", nullptr);
|
||||||
@ -1070,30 +862,16 @@ bool
|
|||||||
WebRTCSession::addVideoPipeline(int vp8PayloadType)
|
WebRTCSession::addVideoPipeline(int vp8PayloadType)
|
||||||
{
|
{
|
||||||
// allow incoming video calls despite localUser having no webcam
|
// allow incoming video calls despite localUser having no webcam
|
||||||
if (videoSources_.empty())
|
if (!devices_.haveCamera())
|
||||||
return !isOffering_;
|
return !isOffering_;
|
||||||
|
|
||||||
QSharedPointer<UserSettings> settings = ChatPage::instance()->userSettings();
|
std::pair<int, int> resolution;
|
||||||
std::string cameraSetting = settings->camera().toStdString();
|
std::pair<int, int> frameRate;
|
||||||
auto it = std::find_if(videoSources_.cbegin(),
|
GstDevice *device = devices_.videoDevice(resolution, frameRate);
|
||||||
videoSources_.cend(),
|
if (!device)
|
||||||
[&cameraSetting](const auto &s) { return s.name == cameraSetting; });
|
|
||||||
if (it == videoSources_.cend()) {
|
|
||||||
nhlog::ui()->error("WebRTC: unknown camera: {}", cameraSetting);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
std::string resSetting = settings->cameraResolution().toStdString();
|
GstElement *source = gst_device_create_element(device, nullptr);
|
||||||
const std::string &res = resSetting.empty() ? it->caps.front().resolution : resSetting;
|
|
||||||
std::string frSetting = settings->cameraFrameRate().toStdString();
|
|
||||||
const std::string &fr = frSetting.empty() ? it->caps.front().frameRates.front() : frSetting;
|
|
||||||
auto resolution = tokenise(res, 'x');
|
|
||||||
auto frameRate = tokenise(fr, '/');
|
|
||||||
nhlog::ui()->debug("WebRTC: camera: {}", cameraSetting);
|
|
||||||
nhlog::ui()->debug("WebRTC: camera resolution: {}x{}", resolution.first, resolution.second);
|
|
||||||
nhlog::ui()->debug("WebRTC: camera frame rate: {}/{}", frameRate.first, frameRate.second);
|
|
||||||
|
|
||||||
GstElement *source = gst_device_create_element(it->device, nullptr);
|
|
||||||
GstElement *videoconvert = gst_element_factory_make("videoconvert", nullptr);
|
GstElement *videoconvert = gst_element_factory_make("videoconvert", nullptr);
|
||||||
GstElement *capsfilter = gst_element_factory_make("capsfilter", "camerafilter");
|
GstElement *capsfilter = gst_element_factory_make("capsfilter", "camerafilter");
|
||||||
GstCaps *caps = gst_caps_new_simple("video/x-raw",
|
GstCaps *caps = gst_caps_new_simple("video/x-raw",
|
||||||
@ -1239,111 +1017,6 @@ WebRTCSession::end()
|
|||||||
emit stateChanged(State::DISCONNECTED);
|
emit stateChanged(State::DISCONNECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GST_CHECK_VERSION(1, 18, 0)
|
|
||||||
void
|
|
||||||
WebRTCSession::startDeviceMonitor()
|
|
||||||
{
|
|
||||||
if (!initialised_)
|
|
||||||
return;
|
|
||||||
|
|
||||||
static GstDeviceMonitor *monitor = nullptr;
|
|
||||||
if (!monitor) {
|
|
||||||
monitor = gst_device_monitor_new();
|
|
||||||
GstCaps *caps = gst_caps_new_empty_simple("audio/x-raw");
|
|
||||||
gst_device_monitor_add_filter(monitor, "Audio/Source", caps);
|
|
||||||
gst_caps_unref(caps);
|
|
||||||
caps = gst_caps_new_empty_simple("video/x-raw");
|
|
||||||
gst_device_monitor_add_filter(monitor, "Video/Source", caps);
|
|
||||||
gst_caps_unref(caps);
|
|
||||||
|
|
||||||
GstBus *bus = gst_device_monitor_get_bus(monitor);
|
|
||||||
gst_bus_add_watch(bus, newBusMessage, nullptr);
|
|
||||||
gst_object_unref(bus);
|
|
||||||
if (!gst_device_monitor_start(monitor)) {
|
|
||||||
nhlog::ui()->error("WebRTC: failed to start device monitor");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
|
||||||
WebRTCSession::refreshDevices()
|
|
||||||
{
|
|
||||||
#if GST_CHECK_VERSION(1, 18, 0)
|
|
||||||
return;
|
|
||||||
#else
|
|
||||||
if (!initialised_)
|
|
||||||
return;
|
|
||||||
|
|
||||||
static GstDeviceMonitor *monitor = nullptr;
|
|
||||||
if (!monitor) {
|
|
||||||
monitor = gst_device_monitor_new();
|
|
||||||
GstCaps *caps = gst_caps_new_empty_simple("audio/x-raw");
|
|
||||||
gst_device_monitor_add_filter(monitor, "Audio/Source", caps);
|
|
||||||
gst_caps_unref(caps);
|
|
||||||
caps = gst_caps_new_empty_simple("video/x-raw");
|
|
||||||
gst_device_monitor_add_filter(monitor, "Video/Source", caps);
|
|
||||||
gst_caps_unref(caps);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto clearDevices = [](auto &sources) {
|
|
||||||
std::for_each(
|
|
||||||
sources.begin(), sources.end(), [](auto &s) { gst_object_unref(s.device); });
|
|
||||||
sources.clear();
|
|
||||||
};
|
|
||||||
clearDevices(audioSources_);
|
|
||||||
clearDevices(videoSources_);
|
|
||||||
|
|
||||||
GList *devices = gst_device_monitor_get_devices(monitor);
|
|
||||||
if (devices) {
|
|
||||||
for (GList *l = devices; l != nullptr; l = l->next)
|
|
||||||
addDevice(GST_DEVICE_CAST(l->data));
|
|
||||||
g_list_free(devices);
|
|
||||||
}
|
|
||||||
emit devicesChanged();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string>
|
|
||||||
WebRTCSession::getDeviceNames(bool isVideo, const std::string &defaultDevice) const
|
|
||||||
{
|
|
||||||
return isVideo ? deviceNames(videoSources_, defaultDevice)
|
|
||||||
: deviceNames(audioSources_, defaultDevice);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string>
|
|
||||||
WebRTCSession::getResolutions(const std::string &cameraName) const
|
|
||||||
{
|
|
||||||
std::vector<std::string> ret;
|
|
||||||
if (auto it = std::find_if(videoSources_.cbegin(),
|
|
||||||
videoSources_.cend(),
|
|
||||||
[&cameraName](const auto &s) { return s.name == cameraName; });
|
|
||||||
it != videoSources_.cend()) {
|
|
||||||
ret.reserve(it->caps.size());
|
|
||||||
for (const auto &c : it->caps)
|
|
||||||
ret.push_back(c.resolution);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string>
|
|
||||||
WebRTCSession::getFrameRates(const std::string &cameraName, const std::string &resolution) const
|
|
||||||
{
|
|
||||||
if (auto i = std::find_if(videoSources_.cbegin(),
|
|
||||||
videoSources_.cend(),
|
|
||||||
[&](const auto &s) { return s.name == cameraName; });
|
|
||||||
i != videoSources_.cend()) {
|
|
||||||
if (auto j =
|
|
||||||
std::find_if(i->caps.cbegin(),
|
|
||||||
i->caps.cend(),
|
|
||||||
[&](const auto &s) { return s.resolution == resolution; });
|
|
||||||
j != i->caps.cend())
|
|
||||||
return j->frameRates;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@ -1400,25 +1073,4 @@ void
|
|||||||
WebRTCSession::end()
|
WebRTCSession::end()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void
|
|
||||||
WebRTCSession::refreshDevices()
|
|
||||||
{}
|
|
||||||
|
|
||||||
std::vector<std::string>
|
|
||||||
WebRTCSession::getDeviceNames(bool, const std::string &) const
|
|
||||||
{
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string>
|
|
||||||
WebRTCSession::getResolutions(const std::string &) const
|
|
||||||
{
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string>
|
|
||||||
WebRTCSession::getFrameRates(const std::string &, const std::string &) const
|
|
||||||
{
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "CallDevices.h"
|
||||||
#include "mtx/events/voip.hpp"
|
#include "mtx/events/voip.hpp"
|
||||||
|
|
||||||
typedef struct _GstElement GstElement;
|
typedef struct _GstElement GstElement;
|
||||||
@ -59,13 +60,6 @@ public:
|
|||||||
|
|
||||||
void setTurnServers(const std::vector<std::string> &uris) { turnServers_ = uris; }
|
void setTurnServers(const std::vector<std::string> &uris) { turnServers_ = uris; }
|
||||||
|
|
||||||
void refreshDevices();
|
|
||||||
std::vector<std::string> getDeviceNames(bool isVideo,
|
|
||||||
const std::string &defaultDevice) const;
|
|
||||||
std::vector<std::string> getResolutions(const std::string &cameraName) const;
|
|
||||||
std::vector<std::string> getFrameRates(const std::string &cameraName,
|
|
||||||
const std::string &resolution) const;
|
|
||||||
|
|
||||||
void setVideoItem(QQuickItem *item) { videoItem_ = item; }
|
void setVideoItem(QQuickItem *item) { videoItem_ = item; }
|
||||||
QQuickItem *getVideoItem() const { return videoItem_; }
|
QQuickItem *getVideoItem() const { return videoItem_; }
|
||||||
|
|
||||||
@ -76,7 +70,6 @@ signals:
|
|||||||
const std::vector<mtx::events::msg::CallCandidates::Candidate> &);
|
const std::vector<mtx::events::msg::CallCandidates::Candidate> &);
|
||||||
void newICECandidate(const mtx::events::msg::CallCandidates::Candidate &);
|
void newICECandidate(const mtx::events::msg::CallCandidates::Candidate &);
|
||||||
void stateChanged(webrtc::State);
|
void stateChanged(webrtc::State);
|
||||||
void devicesChanged();
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void setState(webrtc::State state) { state_ = state; }
|
void setState(webrtc::State state) { state_ = state; }
|
||||||
@ -84,6 +77,7 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
WebRTCSession();
|
WebRTCSession();
|
||||||
|
|
||||||
|
CallDevices &devices_;
|
||||||
bool initialised_ = false;
|
bool initialised_ = false;
|
||||||
bool haveVoicePlugins_ = false;
|
bool haveVoicePlugins_ = false;
|
||||||
bool haveVideoPlugins_ = false;
|
bool haveVideoPlugins_ = false;
|
||||||
@ -101,7 +95,6 @@ private:
|
|||||||
bool startPipeline(int opusPayloadType, int vp8PayloadType);
|
bool startPipeline(int opusPayloadType, int vp8PayloadType);
|
||||||
bool createPipeline(int opusPayloadType, int vp8PayloadType);
|
bool createPipeline(int opusPayloadType, int vp8PayloadType);
|
||||||
bool addVideoPipeline(int vp8PayloadType);
|
bool addVideoPipeline(int vp8PayloadType);
|
||||||
void startDeviceMonitor();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
WebRTCSession(WebRTCSession const &) = delete;
|
WebRTCSession(WebRTCSession const &) = delete;
|
||||||
|
@ -128,7 +128,7 @@ main(int argc, char *argv[])
|
|||||||
// parsed before the SingleApplication userdata is set.
|
// parsed before the SingleApplication userdata is set.
|
||||||
QString userdata{""};
|
QString userdata{""};
|
||||||
QString matrixUri;
|
QString matrixUri;
|
||||||
for (int i = 0; i < argc; ++i) {
|
for (int i = 1; i < argc; ++i) {
|
||||||
QString arg{argv[i]};
|
QString arg{argv[i]};
|
||||||
if (arg.startsWith("--profile=")) {
|
if (arg.startsWith("--profile=")) {
|
||||||
arg.remove("--profile=");
|
arg.remove("--profile=");
|
||||||
@ -214,7 +214,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
QFont font;
|
QFont font;
|
||||||
QString userFontFamily = settings.lock()->font();
|
QString userFontFamily = settings.lock()->font();
|
||||||
if (!userFontFamily.isEmpty()) {
|
if (!userFontFamily.isEmpty() && userFontFamily != "default") {
|
||||||
font.setFamily(userFontFamily);
|
font.setFamily(userFontFamily);
|
||||||
}
|
}
|
||||||
font.setPointSizeF(settings.lock()->fontSize());
|
font.setPointSizeF(settings.lock()->fontSize());
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
|
#include <mtx/responses/notifications.hpp>
|
||||||
|
|
||||||
|
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_HAIKU)
|
||||||
#include <QtDBus/QDBusArgument>
|
#include <QtDBus/QDBusArgument>
|
||||||
#include <QtDBus/QDBusInterface>
|
#include <QtDBus/QDBusInterface>
|
||||||
#endif
|
#endif
|
||||||
@ -27,12 +29,7 @@ class NotificationsManager : public QObject
|
|||||||
public:
|
public:
|
||||||
NotificationsManager(QObject *parent = nullptr);
|
NotificationsManager(QObject *parent = nullptr);
|
||||||
|
|
||||||
void postNotification(const QString &roomId,
|
void postNotification(const mtx::responses::Notification ¬ification, const QImage &icon);
|
||||||
const QString &eventId,
|
|
||||||
const QString &roomName,
|
|
||||||
const QString &senderName,
|
|
||||||
const QString &text,
|
|
||||||
const QImage &icon);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void notificationClicked(const QString roomId, const QString eventId);
|
void notificationClicked(const QString roomId, const QString eventId);
|
||||||
@ -41,7 +38,7 @@ signals:
|
|||||||
public slots:
|
public slots:
|
||||||
void removeNotification(const QString &roomId, const QString &eventId);
|
void removeNotification(const QString &roomId, const QString &eventId);
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
|
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_HAIKU)
|
||||||
public:
|
public:
|
||||||
void closeNotifications(QString roomId);
|
void closeNotifications(QString roomId);
|
||||||
|
|
||||||
@ -61,7 +58,7 @@ private slots:
|
|||||||
void notificationReplied(uint id, QString reply);
|
void notificationReplied(uint id, QString reply);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
|
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_HAIKU)
|
||||||
QDBusArgument &
|
QDBusArgument &
|
||||||
operator<<(QDBusArgument &arg, const QImage &image);
|
operator<<(QDBusArgument &arg, const QImage &image);
|
||||||
const QDBusArgument &
|
const QDBusArgument &
|
||||||
|
@ -8,6 +8,12 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
|
|
||||||
|
#include "Cache.h"
|
||||||
|
#include "EventAccessors.h"
|
||||||
|
#include "MatrixClient.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include <mtx/responses/notifications.hpp>
|
||||||
|
|
||||||
NotificationsManager::NotificationsManager(QObject *parent)
|
NotificationsManager::NotificationsManager(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, dbus("org.freedesktop.Notifications",
|
, dbus("org.freedesktop.Notifications",
|
||||||
@ -45,13 +51,15 @@ NotificationsManager::NotificationsManager(QObject *parent)
|
|||||||
* Licensed under the GNU General Public License, version 3
|
* Licensed under the GNU General Public License, version 3
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
NotificationsManager::postNotification(const QString &roomid,
|
NotificationsManager::postNotification(const mtx::responses::Notification ¬ification,
|
||||||
const QString &eventid,
|
|
||||||
const QString &roomname,
|
|
||||||
const QString &sender,
|
|
||||||
const QString &text,
|
|
||||||
const QImage &icon)
|
const QImage &icon)
|
||||||
{
|
{
|
||||||
|
const auto room_id = QString::fromStdString(notification.room_id);
|
||||||
|
const auto event_id = QString::fromStdString(mtx::accessors::event_id(notification.event));
|
||||||
|
const auto sender = cache::displayName(
|
||||||
|
room_id, QString::fromStdString(mtx::accessors::sender(notification.event)));
|
||||||
|
const auto text = utils::event_body(notification.event);
|
||||||
|
|
||||||
QVariantMap hints;
|
QVariantMap hints;
|
||||||
hints["image-data"] = icon;
|
hints["image-data"] = icon;
|
||||||
hints["sound-name"] = "message-new-instant";
|
hints["sound-name"] = "message-new-instant";
|
||||||
@ -59,8 +67,15 @@ NotificationsManager::postNotification(const QString &roomid,
|
|||||||
argumentList << "nheko"; // app_name
|
argumentList << "nheko"; // app_name
|
||||||
argumentList << (uint)0; // replace_id
|
argumentList << (uint)0; // replace_id
|
||||||
argumentList << ""; // app_icon
|
argumentList << ""; // app_icon
|
||||||
argumentList << roomname; // summary
|
argumentList << QString::fromStdString(
|
||||||
argumentList << sender + ": " + text; // body
|
cache::singleRoomInfo(notification.room_id).name); // summary
|
||||||
|
|
||||||
|
// body
|
||||||
|
if (mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Emote)
|
||||||
|
argumentList << "* " + sender + " " + text;
|
||||||
|
else
|
||||||
|
argumentList << sender + ": " + text;
|
||||||
|
|
||||||
// The list of actions has always the action name and then a localized version of that
|
// The list of actions has always the action name and then a localized version of that
|
||||||
// action. Currently we just use an empty string for that.
|
// action. Currently we just use an empty string for that.
|
||||||
// TODO(Nico): Look into what to actually put there.
|
// TODO(Nico): Look into what to actually put there.
|
||||||
@ -76,12 +91,12 @@ NotificationsManager::postNotification(const QString &roomid,
|
|||||||
QDBusPendingCall call = notifyApp.asyncCallWithArgumentList("Notify", argumentList);
|
QDBusPendingCall call = notifyApp.asyncCallWithArgumentList("Notify", argumentList);
|
||||||
auto watcher = new QDBusPendingCallWatcher{call, this};
|
auto watcher = new QDBusPendingCallWatcher{call, this};
|
||||||
connect(
|
connect(
|
||||||
watcher, &QDBusPendingCallWatcher::finished, this, [watcher, this, roomid, eventid]() {
|
watcher, &QDBusPendingCallWatcher::finished, this, [watcher, this, room_id, event_id]() {
|
||||||
if (watcher->reply().type() == QDBusMessage::ErrorMessage)
|
if (watcher->reply().type() == QDBusMessage::ErrorMessage)
|
||||||
qDebug() << "D-Bus Error:" << watcher->reply().errorMessage();
|
qDebug() << "D-Bus Error:" << watcher->reply().errorMessage();
|
||||||
else
|
else
|
||||||
notificationIds[watcher->reply().arguments().first().toUInt()] =
|
notificationIds[watcher->reply().arguments().first().toUInt()] =
|
||||||
roomEventId{roomid, eventid};
|
roomEventId{room_id, event_id};
|
||||||
watcher->deleteLater();
|
watcher->deleteLater();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,12 @@
|
|||||||
#include <Foundation/Foundation.h>
|
#include <Foundation/Foundation.h>
|
||||||
#include <QtMac>
|
#include <QtMac>
|
||||||
|
|
||||||
|
#include "Cache.h"
|
||||||
|
#include "EventAccessors.h"
|
||||||
|
#include "MatrixClient.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include <mtx/responses/notifications.hpp>
|
||||||
|
|
||||||
@interface NSUserNotification (CFIPrivate)
|
@interface NSUserNotification (CFIPrivate)
|
||||||
- (void)set_identityImage:(NSImage *)image;
|
- (void)set_identityImage:(NSImage *)image;
|
||||||
@end
|
@end
|
||||||
@ -13,22 +19,21 @@ NotificationsManager::NotificationsManager(QObject *parent): QObject(parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
NotificationsManager::postNotification(
|
NotificationsManager::postNotification(const mtx::responses::Notification ¬ification,
|
||||||
const QString &roomId,
|
|
||||||
const QString &eventId,
|
|
||||||
const QString &roomName,
|
|
||||||
const QString &senderName,
|
|
||||||
const QString &text,
|
|
||||||
const QImage &icon)
|
const QImage &icon)
|
||||||
{
|
{
|
||||||
Q_UNUSED(roomId);
|
|
||||||
Q_UNUSED(eventId);
|
|
||||||
Q_UNUSED(icon);
|
Q_UNUSED(icon);
|
||||||
|
|
||||||
|
const auto sender = cache::displayName(QString::fromStdString(notification.room_id), QString::fromStdString(mtx::accessors::sender(notification.event)));
|
||||||
|
const auto text = utils::event_body(notification.event);
|
||||||
|
|
||||||
NSUserNotification * notif = [[NSUserNotification alloc] init];
|
NSUserNotification * notif = [[NSUserNotification alloc] init];
|
||||||
|
|
||||||
notif.title = roomName.toNSString();
|
notif.title = QString::fromStdString(cache::singleRoomInfo(notification.room_id).name).toNSString();
|
||||||
notif.subtitle = QString("%1 sent a message").arg(senderName).toNSString();
|
notif.subtitle = QString("%1 sent a message").arg(sender).toNSString();
|
||||||
|
if (mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Emote)
|
||||||
|
notif.informativeText = QString("* ").append(sender).append(" ").append(text).toNSString();
|
||||||
|
else
|
||||||
notif.informativeText = text.toNSString();
|
notif.informativeText = text.toNSString();
|
||||||
notif.soundName = NSUserNotificationDefaultSoundName;
|
notif.soundName = NSUserNotificationDefaultSoundName;
|
||||||
|
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
#include "notifications/Manager.h"
|
#include "notifications/Manager.h"
|
||||||
#include "wintoastlib.h"
|
#include "wintoastlib.h"
|
||||||
|
|
||||||
|
#include "Cache.h"
|
||||||
|
#include "EventAccessors.h"
|
||||||
|
#include "MatrixClient.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include <mtx/responses/notifications.hpp>
|
||||||
|
|
||||||
using namespace WinToastLib;
|
using namespace WinToastLib;
|
||||||
|
|
||||||
class CustomHandler : public IWinToastHandler
|
class CustomHandler : public IWinToastHandler
|
||||||
@ -23,7 +29,7 @@ init()
|
|||||||
WinToast::instance()->setAppName(L"Nheko");
|
WinToast::instance()->setAppName(L"Nheko");
|
||||||
WinToast::instance()->setAppUserModelId(WinToast::configureAUMI(L"nheko", L"nheko"));
|
WinToast::instance()->setAppUserModelId(WinToast::configureAUMI(L"nheko", L"nheko"));
|
||||||
if (!WinToast::instance()->initialize())
|
if (!WinToast::instance()->initialize())
|
||||||
std::wcout << "Your system in not compatible with toast notifications\n";
|
std::wcout << "Your system is not compatible with toast notifications\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,17 +38,18 @@ NotificationsManager::NotificationsManager(QObject *parent)
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
void
|
void
|
||||||
NotificationsManager::postNotification(const QString &room_id,
|
NotificationsManager::postNotification(const mtx::responses::Notification ¬ification,
|
||||||
const QString &event_id,
|
|
||||||
const QString &room_name,
|
|
||||||
const QString &sender,
|
|
||||||
const QString &text,
|
|
||||||
const QImage &icon)
|
const QImage &icon)
|
||||||
{
|
{
|
||||||
Q_UNUSED(room_id)
|
|
||||||
Q_UNUSED(event_id)
|
|
||||||
Q_UNUSED(icon)
|
Q_UNUSED(icon)
|
||||||
|
|
||||||
|
const auto room_name =
|
||||||
|
QString::fromStdString(cache::singleRoomInfo(notification.room_id).name);
|
||||||
|
const auto sender =
|
||||||
|
cache::displayName(QString::fromStdString(notification.room_id),
|
||||||
|
QString::fromStdString(mtx::accessors::sender(notification.event)));
|
||||||
|
const auto text = utils::event_body(notification.event);
|
||||||
|
|
||||||
if (!isInitialized)
|
if (!isInitialized)
|
||||||
init();
|
init();
|
||||||
|
|
||||||
@ -53,7 +60,13 @@ NotificationsManager::postNotification(const QString &room_id,
|
|||||||
else
|
else
|
||||||
templ.setTextField(QString("%1").arg(sender).toStdWString(),
|
templ.setTextField(QString("%1").arg(sender).toStdWString(),
|
||||||
WinToastTemplate::FirstLine);
|
WinToastTemplate::FirstLine);
|
||||||
templ.setTextField(QString("%1").arg(text).toStdWString(), WinToastTemplate::SecondLine);
|
if (mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Emote)
|
||||||
|
templ.setTextField(
|
||||||
|
QString("* ").append(sender).append(" ").append(text).toStdWString(),
|
||||||
|
WinToastTemplate::SecondLine);
|
||||||
|
else
|
||||||
|
templ.setTextField(QString("%1").arg(text).toStdWString(),
|
||||||
|
WinToastTemplate::SecondLine);
|
||||||
// TODO: implement room or user avatar
|
// TODO: implement room or user avatar
|
||||||
// templ.setImagePath(L"C:/example.png");
|
// templ.setImagePath(L"C:/example.png");
|
||||||
|
|
||||||
|
@ -123,10 +123,6 @@ DelegateChooser::DelegateIncubator::statusChanged(QQmlIncubator::Status status)
|
|||||||
}
|
}
|
||||||
|
|
||||||
chooser.child_->setParentItem(&chooser);
|
chooser.child_->setParentItem(&chooser);
|
||||||
connect(chooser.child_, &QQuickItem::heightChanged, &chooser, [this]() {
|
|
||||||
chooser.setHeight(chooser.child_->height());
|
|
||||||
});
|
|
||||||
chooser.setHeight(chooser.child_->height());
|
|
||||||
QQmlEngine::setObjectOwnership(chooser.child_,
|
QQmlEngine::setObjectOwnership(chooser.child_,
|
||||||
QQmlEngine::ObjectOwnership::JavaScriptOwnership);
|
QQmlEngine::ObjectOwnership::JavaScriptOwnership);
|
||||||
emit chooser.childChanged();
|
emit chooser.childChanged();
|
||||||
|
@ -293,16 +293,16 @@ EventStore::handleSync(const mtx::responses::Timeline &events)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &event : events.events) {
|
for (const auto &event : events.events) {
|
||||||
std::string relates_to;
|
std::set<std::string> relates_to;
|
||||||
if (auto redaction =
|
if (auto redaction =
|
||||||
std::get_if<mtx::events::RedactionEvent<mtx::events::msg::Redaction>>(
|
std::get_if<mtx::events::RedactionEvent<mtx::events::msg::Redaction>>(
|
||||||
&event)) {
|
&event)) {
|
||||||
// fixup reactions
|
// fixup reactions
|
||||||
auto redacted = events_by_id_.object({room_id_, redaction->redacts});
|
auto redacted = events_by_id_.object({room_id_, redaction->redacts});
|
||||||
if (redacted) {
|
if (redacted) {
|
||||||
auto id = mtx::accessors::relates_to_event_id(*redacted);
|
auto id = mtx::accessors::relations(*redacted);
|
||||||
if (!id.empty()) {
|
if (id.annotates()) {
|
||||||
auto idx = idToIndex(id);
|
auto idx = idToIndex(id.annotates()->event_id);
|
||||||
if (idx) {
|
if (idx) {
|
||||||
events_by_id_.remove(
|
events_by_id_.remove(
|
||||||
{room_id_, redaction->redacts});
|
{room_id_, redaction->redacts});
|
||||||
@ -312,20 +312,17 @@ EventStore::handleSync(const mtx::responses::Timeline &events)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
relates_to = redaction->redacts;
|
relates_to.insert(redaction->redacts);
|
||||||
} else if (auto reaction =
|
|
||||||
std::get_if<mtx::events::RoomEvent<mtx::events::msg::Reaction>>(
|
|
||||||
&event)) {
|
|
||||||
relates_to = reaction->content.relates_to.event_id;
|
|
||||||
} else {
|
} else {
|
||||||
relates_to = mtx::accessors::in_reply_to_event(event);
|
for (const auto &r : mtx::accessors::relations(event).relations)
|
||||||
|
relates_to.insert(r.event_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!relates_to.empty()) {
|
for (const auto &relates_to_id : relates_to) {
|
||||||
auto idx = cache::client()->getTimelineIndex(room_id_, relates_to);
|
auto idx = cache::client()->getTimelineIndex(room_id_, relates_to_id);
|
||||||
if (idx) {
|
if (idx) {
|
||||||
events_by_id_.remove({room_id_, relates_to});
|
events_by_id_.remove({room_id_, relates_to_id});
|
||||||
decryptedEvents_.remove({room_id_, relates_to});
|
decryptedEvents_.remove({room_id_, relates_to_id});
|
||||||
events_.remove({room_id_, *idx});
|
events_.remove({room_id_, *idx});
|
||||||
emit dataChanged(toExternalIdx(*idx), toExternalIdx(*idx));
|
emit dataChanged(toExternalIdx(*idx), toExternalIdx(*idx));
|
||||||
}
|
}
|
||||||
@ -408,6 +405,52 @@ EventStore::handle_room_verification(mtx::events::collections::TimelineEvents ev
|
|||||||
event);
|
event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<mtx::events::collections::TimelineEvents>
|
||||||
|
EventStore::edits(const std::string &event_id)
|
||||||
|
{
|
||||||
|
auto event_ids = cache::client()->relatedEvents(room_id_, event_id);
|
||||||
|
|
||||||
|
auto original_event = get(event_id, "", false, false);
|
||||||
|
if (!original_event)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto original_sender = mtx::accessors::sender(*original_event);
|
||||||
|
auto original_relations = mtx::accessors::relations(*original_event);
|
||||||
|
|
||||||
|
std::vector<mtx::events::collections::TimelineEvents> edits;
|
||||||
|
for (const auto &id : event_ids) {
|
||||||
|
auto related_event = get(id, event_id, false, false);
|
||||||
|
if (!related_event)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto related_ev = *related_event;
|
||||||
|
|
||||||
|
auto edit_rel = mtx::accessors::relations(related_ev);
|
||||||
|
if (edit_rel.replaces() == event_id &&
|
||||||
|
original_sender == mtx::accessors::sender(related_ev)) {
|
||||||
|
if (edit_rel.synthesized && original_relations.reply_to() &&
|
||||||
|
!edit_rel.reply_to()) {
|
||||||
|
edit_rel.relations.push_back(
|
||||||
|
{mtx::common::RelationType::InReplyTo,
|
||||||
|
original_relations.reply_to().value()});
|
||||||
|
mtx::accessors::set_relations(related_ev, std::move(edit_rel));
|
||||||
|
}
|
||||||
|
edits.push_back(std::move(related_ev));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto c = cache::client();
|
||||||
|
std::sort(edits.begin(),
|
||||||
|
edits.end(),
|
||||||
|
[this, c](const mtx::events::collections::TimelineEvents &a,
|
||||||
|
const mtx::events::collections::TimelineEvents &b) {
|
||||||
|
return c->getArrivalIndex(this->room_id_, mtx::accessors::event_id(a)) <
|
||||||
|
c->getArrivalIndex(this->room_id_, mtx::accessors::event_id(b));
|
||||||
|
});
|
||||||
|
|
||||||
|
return edits;
|
||||||
|
}
|
||||||
|
|
||||||
QVariantList
|
QVariantList
|
||||||
EventStore::reactions(const std::string &event_id)
|
EventStore::reactions(const std::string &event_id)
|
||||||
{
|
{
|
||||||
@ -430,13 +473,14 @@ EventStore::reactions(const std::string &event_id)
|
|||||||
|
|
||||||
if (auto reaction = std::get_if<mtx::events::RoomEvent<mtx::events::msg::Reaction>>(
|
if (auto reaction = std::get_if<mtx::events::RoomEvent<mtx::events::msg::Reaction>>(
|
||||||
related_event);
|
related_event);
|
||||||
reaction && reaction->content.relates_to.key) {
|
reaction && reaction->content.relations.annotates() &&
|
||||||
auto &agg = aggregation[reaction->content.relates_to.key.value()];
|
reaction->content.relations.annotates()->key) {
|
||||||
|
auto key = reaction->content.relations.annotates()->key.value();
|
||||||
|
auto &agg = aggregation[key];
|
||||||
|
|
||||||
if (agg.count == 0) {
|
if (agg.count == 0) {
|
||||||
Reaction temp{};
|
Reaction temp{};
|
||||||
temp.key_ =
|
temp.key_ = QString::fromStdString(key);
|
||||||
QString::fromStdString(reaction->content.relates_to.key.value());
|
|
||||||
reactions.push_back(temp);
|
reactions.push_back(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,7 +533,13 @@ EventStore::get(int idx, bool decrypt)
|
|||||||
if (!event_id)
|
if (!event_id)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto event = cache::client()->getEvent(room_id_, *event_id);
|
std::optional<mtx::events::collections::TimelineEvent> event;
|
||||||
|
auto edits_ = edits(*event_id);
|
||||||
|
if (edits_.empty())
|
||||||
|
event = cache::client()->getEvent(room_id_, *event_id);
|
||||||
|
else
|
||||||
|
event = {edits_.back()};
|
||||||
|
|
||||||
if (!event)
|
if (!event)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
else
|
else
|
||||||
@ -691,8 +741,7 @@ EventStore::decryptEvent(const IdIndex &idx,
|
|||||||
body["unsigned"] = e.unsigned_data;
|
body["unsigned"] = e.unsigned_data;
|
||||||
|
|
||||||
// relations are unencrypted in content...
|
// relations are unencrypted in content...
|
||||||
if (json old_ev = e; old_ev["content"].count("m.relates_to") != 0)
|
mtx::common::add_relations(body["content"], e.content.relations);
|
||||||
body["content"]["m.relates_to"] = old_ev["content"]["m.relates_to"];
|
|
||||||
|
|
||||||
json event_array = json::array();
|
json event_array = json::array();
|
||||||
event_array.push_back(body);
|
event_array.push_back(body);
|
||||||
@ -717,7 +766,7 @@ EventStore::decryptEvent(const IdIndex &idx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
mtx::events::collections::TimelineEvents *
|
mtx::events::collections::TimelineEvents *
|
||||||
EventStore::get(std::string_view id, std::string_view related_to, bool decrypt)
|
EventStore::get(std::string_view id, std::string_view related_to, bool decrypt, bool resolve_edits)
|
||||||
{
|
{
|
||||||
if (this->thread() != QThread::currentThread())
|
if (this->thread() != QThread::currentThread())
|
||||||
nhlog::db()->warn("{} called from a different thread!", __func__);
|
nhlog::db()->warn("{} called from a different thread!", __func__);
|
||||||
@ -725,7 +774,16 @@ EventStore::get(std::string_view id, std::string_view related_to, bool decrypt)
|
|||||||
if (id.empty())
|
if (id.empty())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
IdIndex index{room_id_, std::string(id.data(), id.size())};
|
IdIndex index{room_id_, std::string(id)};
|
||||||
|
if (resolve_edits) {
|
||||||
|
auto edits_ = edits(index.id);
|
||||||
|
if (!edits_.empty()) {
|
||||||
|
index.id = mtx::accessors::event_id(edits_.back());
|
||||||
|
auto event_ptr =
|
||||||
|
new mtx::events::collections::TimelineEvents(std::move(edits_.back()));
|
||||||
|
events_by_id_.insert(index, event_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto event_ptr = events_by_id_.object(index);
|
auto event_ptr = events_by_id_.object(index);
|
||||||
if (!event_ptr) {
|
if (!event_ptr) {
|
||||||
|
@ -66,7 +66,8 @@ public:
|
|||||||
// relatedFetched event
|
// relatedFetched event
|
||||||
mtx::events::collections::TimelineEvents *get(std::string_view id,
|
mtx::events::collections::TimelineEvents *get(std::string_view id,
|
||||||
std::string_view related_to,
|
std::string_view related_to,
|
||||||
bool decrypt = true);
|
bool decrypt = true,
|
||||||
|
bool resolve_edits = true);
|
||||||
// always returns a proper event as long as the idx is valid
|
// always returns a proper event as long as the idx is valid
|
||||||
mtx::events::collections::TimelineEvents *get(int idx, bool decrypt = true);
|
mtx::events::collections::TimelineEvents *get(int idx, bool decrypt = true);
|
||||||
|
|
||||||
@ -110,6 +111,7 @@ public slots:
|
|||||||
void clearTimeline();
|
void clearTimeline();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::vector<mtx::events::collections::TimelineEvents> edits(const std::string &event_id);
|
||||||
mtx::events::collections::TimelineEvents *decryptEvent(
|
mtx::events::collections::TimelineEvents *decryptEvent(
|
||||||
const IdIndex &idx,
|
const IdIndex &idx,
|
||||||
const mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> &e);
|
const mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> &e);
|
||||||
|
@ -268,7 +268,18 @@ InputBar::message(QString msg, MarkdownOverride useMarkdown)
|
|||||||
text.format = "org.matrix.custom.html";
|
text.format = "org.matrix.custom.html";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!room->edit().isEmpty()) {
|
||||||
if (!room->reply().isEmpty()) {
|
if (!room->reply().isEmpty()) {
|
||||||
|
text.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
|
||||||
|
room->resetReply();
|
||||||
|
}
|
||||||
|
|
||||||
|
text.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::Replace, room->edit().toStdString()});
|
||||||
|
room->resetEdit();
|
||||||
|
|
||||||
|
} else if (!room->reply().isEmpty()) {
|
||||||
auto related = room->relatedInfo(room->reply());
|
auto related = room->relatedInfo(room->reply());
|
||||||
|
|
||||||
QString body;
|
QString body;
|
||||||
@ -294,7 +305,8 @@ InputBar::message(QString msg, MarkdownOverride useMarkdown)
|
|||||||
text.formatted_body =
|
text.formatted_body =
|
||||||
utils::getFormattedQuoteBody(related, msg.toHtmlEscaped()).toStdString();
|
utils::getFormattedQuoteBody(related, msg.toHtmlEscaped()).toStdString();
|
||||||
|
|
||||||
text.relates_to.in_reply_to.event_id = related.related_event;
|
text.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::InReplyTo, related.related_event});
|
||||||
room->resetReply();
|
room->resetReply();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,9 +328,15 @@ InputBar::emote(QString msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!room->reply().isEmpty()) {
|
if (!room->reply().isEmpty()) {
|
||||||
emote.relates_to.in_reply_to.event_id = room->reply().toStdString();
|
emote.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
|
||||||
room->resetReply();
|
room->resetReply();
|
||||||
}
|
}
|
||||||
|
if (!room->edit().isEmpty()) {
|
||||||
|
emote.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::Replace, room->edit().toStdString()});
|
||||||
|
room->resetEdit();
|
||||||
|
}
|
||||||
|
|
||||||
room->sendMessageEvent(emote, mtx::events::EventType::RoomMessage);
|
room->sendMessageEvent(emote, mtx::events::EventType::RoomMessage);
|
||||||
}
|
}
|
||||||
@ -346,9 +364,15 @@ InputBar::image(const QString &filename,
|
|||||||
image.url = url.toStdString();
|
image.url = url.toStdString();
|
||||||
|
|
||||||
if (!room->reply().isEmpty()) {
|
if (!room->reply().isEmpty()) {
|
||||||
image.relates_to.in_reply_to.event_id = room->reply().toStdString();
|
image.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
|
||||||
room->resetReply();
|
room->resetReply();
|
||||||
}
|
}
|
||||||
|
if (!room->edit().isEmpty()) {
|
||||||
|
image.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::Replace, room->edit().toStdString()});
|
||||||
|
room->resetEdit();
|
||||||
|
}
|
||||||
|
|
||||||
room->sendMessageEvent(image, mtx::events::EventType::RoomMessage);
|
room->sendMessageEvent(image, mtx::events::EventType::RoomMessage);
|
||||||
}
|
}
|
||||||
@ -371,9 +395,15 @@ InputBar::file(const QString &filename,
|
|||||||
file.url = url.toStdString();
|
file.url = url.toStdString();
|
||||||
|
|
||||||
if (!room->reply().isEmpty()) {
|
if (!room->reply().isEmpty()) {
|
||||||
file.relates_to.in_reply_to.event_id = room->reply().toStdString();
|
file.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
|
||||||
room->resetReply();
|
room->resetReply();
|
||||||
}
|
}
|
||||||
|
if (!room->edit().isEmpty()) {
|
||||||
|
file.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::Replace, room->edit().toStdString()});
|
||||||
|
room->resetEdit();
|
||||||
|
}
|
||||||
|
|
||||||
room->sendMessageEvent(file, mtx::events::EventType::RoomMessage);
|
room->sendMessageEvent(file, mtx::events::EventType::RoomMessage);
|
||||||
}
|
}
|
||||||
@ -397,9 +427,15 @@ InputBar::audio(const QString &filename,
|
|||||||
audio.url = url.toStdString();
|
audio.url = url.toStdString();
|
||||||
|
|
||||||
if (!room->reply().isEmpty()) {
|
if (!room->reply().isEmpty()) {
|
||||||
audio.relates_to.in_reply_to.event_id = room->reply().toStdString();
|
audio.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
|
||||||
room->resetReply();
|
room->resetReply();
|
||||||
}
|
}
|
||||||
|
if (!room->edit().isEmpty()) {
|
||||||
|
audio.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::Replace, room->edit().toStdString()});
|
||||||
|
room->resetEdit();
|
||||||
|
}
|
||||||
|
|
||||||
room->sendMessageEvent(audio, mtx::events::EventType::RoomMessage);
|
room->sendMessageEvent(audio, mtx::events::EventType::RoomMessage);
|
||||||
}
|
}
|
||||||
@ -422,9 +458,15 @@ InputBar::video(const QString &filename,
|
|||||||
video.url = url.toStdString();
|
video.url = url.toStdString();
|
||||||
|
|
||||||
if (!room->reply().isEmpty()) {
|
if (!room->reply().isEmpty()) {
|
||||||
video.relates_to.in_reply_to.event_id = room->reply().toStdString();
|
video.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
|
||||||
room->resetReply();
|
room->resetReply();
|
||||||
}
|
}
|
||||||
|
if (!room->edit().isEmpty()) {
|
||||||
|
video.relations.relations.push_back(
|
||||||
|
{mtx::common::RelationType::Replace, room->edit().toStdString()});
|
||||||
|
room->resetEdit();
|
||||||
|
}
|
||||||
|
|
||||||
room->sendMessageEvent(video, mtx::events::EventType::RoomMessage);
|
room->sendMessageEvent(video, mtx::events::EventType::RoomMessage);
|
||||||
}
|
}
|
||||||
@ -518,6 +560,8 @@ InputBar::showPreview(const QMimeData &source, QString path, const QStringList &
|
|||||||
[this](const QByteArray data, const QString &mime, const QString &fn) {
|
[this](const QByteArray data, const QString &mime, const QString &fn) {
|
||||||
setUploading(true);
|
setUploading(true);
|
||||||
|
|
||||||
|
setText("");
|
||||||
|
|
||||||
auto payload = std::string(data.data(), data.size());
|
auto payload = std::string(data.data(), data.size());
|
||||||
std::optional<mtx::crypto::EncryptedFile> encryptedFile;
|
std::optional<mtx::crypto::EncryptedFile> encryptedFile;
|
||||||
if (cache::isRoomEncrypted(room->roomId().toStdString())) {
|
if (cache::isRoomEncrypted(room->roomId().toStdString())) {
|
||||||
|
@ -41,6 +41,7 @@ public slots:
|
|||||||
QString text() const;
|
QString text() const;
|
||||||
QString previousText();
|
QString previousText();
|
||||||
QString nextText();
|
QString nextText();
|
||||||
|
void setText(QString newText) { emit textChanged(newText); }
|
||||||
|
|
||||||
void send();
|
void send();
|
||||||
void paste(bool fromMouse);
|
void paste(bool fromMouse);
|
||||||
@ -58,6 +59,7 @@ private slots:
|
|||||||
|
|
||||||
signals:
|
signals:
|
||||||
void insertText(QString text);
|
void insertText(QString text);
|
||||||
|
void textChanged(QString newText);
|
||||||
void uploadingChanged(bool value);
|
void uploadingChanged(bool value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -288,6 +288,8 @@ TimelineModel::roleNames() const
|
|||||||
{ProportionalHeight, "proportionalHeight"},
|
{ProportionalHeight, "proportionalHeight"},
|
||||||
{Id, "id"},
|
{Id, "id"},
|
||||||
{State, "state"},
|
{State, "state"},
|
||||||
|
{IsEdited, "isEdited"},
|
||||||
|
{IsEditable, "isEditable"},
|
||||||
{IsEncrypted, "isEncrypted"},
|
{IsEncrypted, "isEncrypted"},
|
||||||
{IsRoomEncrypted, "isRoomEncrypted"},
|
{IsRoomEncrypted, "isRoomEncrypted"},
|
||||||
{ReplyTo, "replyTo"},
|
{ReplyTo, "replyTo"},
|
||||||
@ -360,7 +362,7 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
|
|||||||
const static QRegularExpression replyFallback(
|
const static QRegularExpression replyFallback(
|
||||||
"<mx-reply>.*</mx-reply>", QRegularExpression::DotMatchesEverythingOption);
|
"<mx-reply>.*</mx-reply>", QRegularExpression::DotMatchesEverythingOption);
|
||||||
|
|
||||||
bool isReply = !in_reply_to_event(event).empty();
|
bool isReply = relations(event).reply_to().has_value();
|
||||||
|
|
||||||
auto formattedBody_ = QString::fromStdString(formatted_body(event));
|
auto formattedBody_ = QString::fromStdString(formatted_body(event));
|
||||||
if (formattedBody_.isEmpty()) {
|
if (formattedBody_.isEmpty()) {
|
||||||
@ -409,8 +411,12 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
|
|||||||
|
|
||||||
return QVariant(prop > 0 ? prop : 1.);
|
return QVariant(prop > 0 ? prop : 1.);
|
||||||
}
|
}
|
||||||
case Id:
|
case Id: {
|
||||||
|
if (auto replaces = relations(event).replaces())
|
||||||
|
return QVariant(QString::fromStdString(replaces.value()));
|
||||||
|
else
|
||||||
return QVariant(QString::fromStdString(event_id(event)));
|
return QVariant(QString::fromStdString(event_id(event)));
|
||||||
|
}
|
||||||
case State: {
|
case State: {
|
||||||
auto id = QString::fromStdString(event_id(event));
|
auto id = QString::fromStdString(event_id(event));
|
||||||
auto containsOthers = [](const auto &vec) {
|
auto containsOthers = [](const auto &vec) {
|
||||||
@ -430,6 +436,11 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
|
|||||||
else
|
else
|
||||||
return qml_mtx_events::Received;
|
return qml_mtx_events::Received;
|
||||||
}
|
}
|
||||||
|
case IsEdited:
|
||||||
|
return QVariant(relations(event).replaces().has_value());
|
||||||
|
case IsEditable:
|
||||||
|
return QVariant(!is_state_event(event) && mtx::accessors::sender(event) ==
|
||||||
|
http::client()->user_id().to_string());
|
||||||
case IsEncrypted: {
|
case IsEncrypted: {
|
||||||
auto id = event_id(event);
|
auto id = event_id(event);
|
||||||
auto encrypted_event = events.get(id, id, false);
|
auto encrypted_event = events.get(id, id, false);
|
||||||
@ -442,9 +453,9 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
|
|||||||
return cache::isRoomEncrypted(room_id_.toStdString());
|
return cache::isRoomEncrypted(room_id_.toStdString());
|
||||||
}
|
}
|
||||||
case ReplyTo:
|
case ReplyTo:
|
||||||
return QVariant(QString::fromStdString(in_reply_to_event(event)));
|
return QVariant(QString::fromStdString(relations(event).reply_to().value_or("")));
|
||||||
case Reactions: {
|
case Reactions: {
|
||||||
auto id = event_id(event);
|
auto id = relations(event).replaces().value_or(event_id(event));
|
||||||
return QVariant::fromValue(events.reactions(id));
|
return QVariant::fromValue(events.reactions(id));
|
||||||
}
|
}
|
||||||
case RoomId:
|
case RoomId:
|
||||||
@ -724,15 +735,30 @@ TimelineModel::updateLastMessage()
|
|||||||
void
|
void
|
||||||
TimelineModel::setCurrentIndex(int index)
|
TimelineModel::setCurrentIndex(int index)
|
||||||
{
|
{
|
||||||
|
auto oldIndex = idToIndex(currentId);
|
||||||
|
currentId = indexToId(index);
|
||||||
|
if (index != oldIndex)
|
||||||
|
emit currentIndexChanged(index);
|
||||||
|
|
||||||
if (!ChatPage::instance()->isActiveWindow())
|
if (!ChatPage::instance()->isActiveWindow())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto oldIndex = idToIndex(currentId);
|
if (!currentId.startsWith("m")) {
|
||||||
currentId = indexToId(index);
|
auto oldReadIndex =
|
||||||
emit currentIndexChanged(index);
|
cache::getEventIndex(roomId().toStdString(), currentReadId.toStdString());
|
||||||
|
auto nextEventIndexAndId =
|
||||||
|
cache::lastInvisibleEventAfter(roomId().toStdString(), currentId.toStdString());
|
||||||
|
|
||||||
if ((oldIndex > index || oldIndex == -1) && !currentId.startsWith("m")) {
|
if (nextEventIndexAndId &&
|
||||||
readEvent(currentId.toStdString());
|
(!oldReadIndex || *oldReadIndex < nextEventIndexAndId->first)) {
|
||||||
|
readEvent(nextEventIndexAndId->second);
|
||||||
|
currentReadId = QString::fromStdString(nextEventIndexAndId->second);
|
||||||
|
|
||||||
|
nhlog::net()->info("Marked as read {}, index {}, oldReadIndex {}",
|
||||||
|
nextEventIndexAndId->second,
|
||||||
|
nextEventIndexAndId->first,
|
||||||
|
*oldReadIndex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,6 +847,12 @@ TimelineModel::replyAction(QString id)
|
|||||||
setReply(id);
|
setReply(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TimelineModel::editAction(QString id)
|
||||||
|
{
|
||||||
|
setEdit(id);
|
||||||
|
}
|
||||||
|
|
||||||
RelatedInfo
|
RelatedInfo
|
||||||
TimelineModel::relatedInfo(QString id)
|
TimelineModel::relatedInfo(QString id)
|
||||||
{
|
{
|
||||||
@ -1509,6 +1541,51 @@ TimelineModel::formatMemberEvent(QString id)
|
|||||||
return rendered;
|
return rendered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TimelineModel::setEdit(QString newEdit)
|
||||||
|
{
|
||||||
|
if (edit_.startsWith('m'))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (edit_ != newEdit) {
|
||||||
|
auto ev = events.get(newEdit.toStdString(), "");
|
||||||
|
if (ev && mtx::accessors::sender(*ev) == http::client()->user_id().to_string()) {
|
||||||
|
auto e = *ev;
|
||||||
|
setReply(QString::fromStdString(
|
||||||
|
mtx::accessors::relations(e).reply_to().value_or("")));
|
||||||
|
|
||||||
|
auto msgType = mtx::accessors::msg_type(e);
|
||||||
|
if (msgType == mtx::events::MessageType::Text ||
|
||||||
|
msgType == mtx::events::MessageType::Notice) {
|
||||||
|
input()->setText(relatedInfo(newEdit).quoted_body);
|
||||||
|
} else if (msgType == mtx::events::MessageType::Emote) {
|
||||||
|
input()->setText("/me " + relatedInfo(newEdit).quoted_body);
|
||||||
|
} else {
|
||||||
|
input()->setText("");
|
||||||
|
}
|
||||||
|
|
||||||
|
edit_ = newEdit;
|
||||||
|
} else {
|
||||||
|
resetReply();
|
||||||
|
|
||||||
|
input()->setText("");
|
||||||
|
edit_ = "";
|
||||||
|
}
|
||||||
|
emit editChanged(edit_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TimelineModel::resetEdit()
|
||||||
|
{
|
||||||
|
if (!edit_.isEmpty()) {
|
||||||
|
edit_ = "";
|
||||||
|
emit editChanged(edit_);
|
||||||
|
input()->setText("");
|
||||||
|
resetReply();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
TimelineModel::roomName() const
|
TimelineModel::roomName() const
|
||||||
{
|
{
|
||||||
|
@ -146,6 +146,7 @@ class TimelineModel : public QAbstractListModel
|
|||||||
Q_PROPERTY(std::vector<QString> typingUsers READ typingUsers WRITE updateTypingUsers NOTIFY
|
Q_PROPERTY(std::vector<QString> typingUsers READ typingUsers WRITE updateTypingUsers NOTIFY
|
||||||
typingUsersChanged)
|
typingUsersChanged)
|
||||||
Q_PROPERTY(QString reply READ reply WRITE setReply NOTIFY replyChanged RESET resetReply)
|
Q_PROPERTY(QString reply READ reply WRITE setReply NOTIFY replyChanged RESET resetReply)
|
||||||
|
Q_PROPERTY(QString edit READ edit WRITE setEdit NOTIFY editChanged RESET resetEdit)
|
||||||
Q_PROPERTY(
|
Q_PROPERTY(
|
||||||
bool paginationInProgress READ paginationInProgress NOTIFY paginationInProgressChanged)
|
bool paginationInProgress READ paginationInProgress NOTIFY paginationInProgressChanged)
|
||||||
Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
|
Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
|
||||||
@ -182,6 +183,8 @@ public:
|
|||||||
ProportionalHeight,
|
ProportionalHeight,
|
||||||
Id,
|
Id,
|
||||||
State,
|
State,
|
||||||
|
IsEdited,
|
||||||
|
IsEditable,
|
||||||
IsEncrypted,
|
IsEncrypted,
|
||||||
IsRoomEncrypted,
|
IsRoomEncrypted,
|
||||||
ReplyTo,
|
ReplyTo,
|
||||||
@ -215,6 +218,7 @@ public:
|
|||||||
Q_INVOKABLE void viewDecryptedRawMessage(QString id) const;
|
Q_INVOKABLE void viewDecryptedRawMessage(QString id) const;
|
||||||
Q_INVOKABLE void openUserProfile(QString userid, bool global = false);
|
Q_INVOKABLE void openUserProfile(QString userid, bool global = false);
|
||||||
Q_INVOKABLE void openRoomSettings();
|
Q_INVOKABLE void openRoomSettings();
|
||||||
|
Q_INVOKABLE void editAction(QString id);
|
||||||
Q_INVOKABLE void replyAction(QString id);
|
Q_INVOKABLE void replyAction(QString id);
|
||||||
Q_INVOKABLE void readReceiptsAction(QString id) const;
|
Q_INVOKABLE void readReceiptsAction(QString id) const;
|
||||||
Q_INVOKABLE void redactEvent(QString id);
|
Q_INVOKABLE void redactEvent(QString id);
|
||||||
@ -258,6 +262,9 @@ public slots:
|
|||||||
QString reply() const { return reply_; }
|
QString reply() const { return reply_; }
|
||||||
void setReply(QString newReply)
|
void setReply(QString newReply)
|
||||||
{
|
{
|
||||||
|
if (edit_.startsWith('m'))
|
||||||
|
return;
|
||||||
|
|
||||||
if (reply_ != newReply) {
|
if (reply_ != newReply) {
|
||||||
reply_ = newReply;
|
reply_ = newReply;
|
||||||
emit replyChanged(reply_);
|
emit replyChanged(reply_);
|
||||||
@ -270,6 +277,9 @@ public slots:
|
|||||||
emit replyChanged(reply_);
|
emit replyChanged(reply_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
QString edit() const { return edit_; }
|
||||||
|
void setEdit(QString newEdit);
|
||||||
|
void resetEdit();
|
||||||
void setDecryptDescription(bool decrypt) { decryptDescription = decrypt; }
|
void setDecryptDescription(bool decrypt) { decryptDescription = decrypt; }
|
||||||
void clearTimeline() { events.clearTimeline(); }
|
void clearTimeline() { events.clearTimeline(); }
|
||||||
void receivedSessionKey(const std::string &session_key)
|
void receivedSessionKey(const std::string &session_key)
|
||||||
@ -294,6 +304,7 @@ signals:
|
|||||||
void newEncryptedImage(mtx::crypto::EncryptedFile encryptionInfo);
|
void newEncryptedImage(mtx::crypto::EncryptedFile encryptionInfo);
|
||||||
void typingUsersChanged(std::vector<QString> users);
|
void typingUsersChanged(std::vector<QString> users);
|
||||||
void replyChanged(QString reply);
|
void replyChanged(QString reply);
|
||||||
|
void editChanged(QString reply);
|
||||||
void paginationInProgressChanged(const bool);
|
void paginationInProgressChanged(const bool);
|
||||||
void newCallEvent(const mtx::events::collections::TimelineEvents &event);
|
void newCallEvent(const mtx::events::collections::TimelineEvents &event);
|
||||||
|
|
||||||
@ -324,8 +335,8 @@ private:
|
|||||||
bool decryptDescription = true;
|
bool decryptDescription = true;
|
||||||
bool m_paginationInProgress = false;
|
bool m_paginationInProgress = false;
|
||||||
|
|
||||||
QString currentId;
|
QString currentId, currentReadId;
|
||||||
QString reply_;
|
QString reply_, edit_;
|
||||||
std::vector<QString> typingUsers_;
|
std::vector<QString> typingUsers_;
|
||||||
|
|
||||||
TimelineViewManager *manager_;
|
TimelineViewManager *manager_;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "dialogs/ImageOverlay.h"
|
#include "dialogs/ImageOverlay.h"
|
||||||
#include "emoji/EmojiModel.h"
|
#include "emoji/EmojiModel.h"
|
||||||
#include "emoji/Provider.h"
|
#include "emoji/Provider.h"
|
||||||
|
#include "ui/NhekoCursorShape.h"
|
||||||
#include "ui/NhekoDropArea.h"
|
#include "ui/NhekoDropArea.h"
|
||||||
|
|
||||||
#include <iostream> //only for debugging
|
#include <iostream> //only for debugging
|
||||||
@ -118,6 +119,7 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
|
|||||||
qmlRegisterType<DelegateChoice>("im.nheko", 1, 0, "DelegateChoice");
|
qmlRegisterType<DelegateChoice>("im.nheko", 1, 0, "DelegateChoice");
|
||||||
qmlRegisterType<DelegateChooser>("im.nheko", 1, 0, "DelegateChooser");
|
qmlRegisterType<DelegateChooser>("im.nheko", 1, 0, "DelegateChooser");
|
||||||
qmlRegisterType<NhekoDropArea>("im.nheko", 1, 0, "NhekoDropArea");
|
qmlRegisterType<NhekoDropArea>("im.nheko", 1, 0, "NhekoDropArea");
|
||||||
|
qmlRegisterType<NhekoCursorShape>("im.nheko", 1, 0, "CursorShape");
|
||||||
qmlRegisterUncreatableType<DeviceVerificationFlow>(
|
qmlRegisterUncreatableType<DeviceVerificationFlow>(
|
||||||
"im.nheko", 1, 0, "DeviceVerificationFlow", "Can't create verification flow from QML!");
|
"im.nheko", 1, 0, "DeviceVerificationFlow", "Can't create verification flow from QML!");
|
||||||
qmlRegisterUncreatableType<UserProfile>(
|
qmlRegisterUncreatableType<UserProfile>(
|
||||||
@ -176,10 +178,6 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
|
|||||||
view->setResizeMode(QQuickWidget::SizeRootObjectToView);
|
view->setResizeMode(QQuickWidget::SizeRootObjectToView);
|
||||||
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
|
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
|
|
||||||
view->quickWindow()->setTextRenderType(QQuickWindow::NativeTextRendering);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
connect(view, &QQuickWidget::statusChanged, this, [](QQuickWidget::Status status) {
|
connect(view, &QQuickWidget::statusChanged, this, [](QQuickWidget::Status status) {
|
||||||
nhlog::ui()->debug("Status changed to {}", status);
|
nhlog::ui()->debug("Status changed to {}", status);
|
||||||
});
|
});
|
||||||
@ -508,9 +506,11 @@ TimelineViewManager::queueReactionMessage(const QString &reactedEvent, const QSt
|
|||||||
// If selfReactedEvent is empty, that means we haven't previously reacted
|
// If selfReactedEvent is empty, that means we haven't previously reacted
|
||||||
if (selfReactedEvent.isEmpty()) {
|
if (selfReactedEvent.isEmpty()) {
|
||||||
mtx::events::msg::Reaction reaction;
|
mtx::events::msg::Reaction reaction;
|
||||||
reaction.relates_to.rel_type = mtx::common::RelationType::Annotation;
|
mtx::common::Relation rel;
|
||||||
reaction.relates_to.event_id = reactedEvent.toStdString();
|
rel.rel_type = mtx::common::RelationType::Annotation;
|
||||||
reaction.relates_to.key = reactionKey.toStdString();
|
rel.event_id = reactedEvent.toStdString();
|
||||||
|
rel.key = reactionKey.toStdString();
|
||||||
|
reaction.relations.relations.push_back(rel);
|
||||||
|
|
||||||
timeline_->sendMessageEvent(reaction, mtx::events::EventType::Reaction);
|
timeline_->sendMessageEvent(reaction, mtx::events::EventType::Reaction);
|
||||||
// Otherwise, we have previously reacted and the reaction should be redacted
|
// Otherwise, we have previously reacted and the reaction should be redacted
|
||||||
@ -546,3 +546,9 @@ TimelineViewManager::queueCallMessage(const QString &roomid,
|
|||||||
{
|
{
|
||||||
models.value(roomid)->sendMessageEvent(callHangUp, mtx::events::EventType::CallHangUp);
|
models.value(roomid)->sendMessageEvent(callHangUp, mtx::events::EventType::CallHangUp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TimelineViewManager::focusMessageInput()
|
||||||
|
{
|
||||||
|
emit focusInput();
|
||||||
|
}
|
||||||
|
@ -66,6 +66,7 @@ public:
|
|||||||
|
|
||||||
Q_INVOKABLE void openLink(QString link) const;
|
Q_INVOKABLE void openLink(QString link) const;
|
||||||
|
|
||||||
|
Q_INVOKABLE void focusMessageInput();
|
||||||
Q_INVOKABLE void openInviteUsersDialog();
|
Q_INVOKABLE void openInviteUsersDialog();
|
||||||
Q_INVOKABLE void openMemberListDialog() const;
|
Q_INVOKABLE void openMemberListDialog() const;
|
||||||
Q_INVOKABLE void openLeaveRoomDialog() const;
|
Q_INVOKABLE void openLeaveRoomDialog() const;
|
||||||
@ -86,6 +87,7 @@ signals:
|
|||||||
void showRoomList();
|
void showRoomList();
|
||||||
void narrowViewChanged();
|
void narrowViewChanged();
|
||||||
void focusChanged();
|
void focusChanged();
|
||||||
|
void focusInput();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
|
void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
|
||||||
|
25
src/ui/NhekoCursorShape.cpp
Normal file
25
src/ui/NhekoCursorShape.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "NhekoCursorShape.h"
|
||||||
|
|
||||||
|
#include <QCursor>
|
||||||
|
|
||||||
|
NhekoCursorShape::NhekoCursorShape(QQuickItem *parent)
|
||||||
|
: QQuickItem(parent)
|
||||||
|
, currentShape_(Qt::CursorShape::ArrowCursor)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Qt::CursorShape
|
||||||
|
NhekoCursorShape::cursorShape() const
|
||||||
|
{
|
||||||
|
return cursor().shape();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
NhekoCursorShape::setCursorShape(Qt::CursorShape cursorShape)
|
||||||
|
{
|
||||||
|
if (currentShape_ == cursorShape)
|
||||||
|
return;
|
||||||
|
|
||||||
|
currentShape_ = cursorShape;
|
||||||
|
setCursor(cursorShape);
|
||||||
|
emit cursorShapeChanged();
|
||||||
|
}
|
26
src/ui/NhekoCursorShape.h
Normal file
26
src/ui/NhekoCursorShape.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// see
|
||||||
|
// https://stackoverflow.com/questions/27821054/how-to-change-cursor-shape-in-qml-when-mousearea-is-covered-with-another-mousear/29382092#29382092
|
||||||
|
|
||||||
|
#include <QQuickItem>
|
||||||
|
|
||||||
|
class NhekoCursorShape : public QQuickItem
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(Qt::CursorShape cursorShape READ cursorShape WRITE setCursorShape NOTIFY
|
||||||
|
cursorShapeChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit NhekoCursorShape(QQuickItem *parent = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Qt::CursorShape cursorShape() const;
|
||||||
|
void setCursorShape(Qt::CursorShape cursorShape);
|
||||||
|
|
||||||
|
Qt::CursorShape currentShape_;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void cursorShapeChanged();
|
||||||
|
};
|
@ -316,7 +316,6 @@ UserProfile::changeAvatar()
|
|||||||
|
|
||||||
const auto bin = file.peek(file.size());
|
const auto bin = file.peek(file.size());
|
||||||
const auto payload = std::string(bin.data(), bin.size());
|
const auto payload = std::string(bin.data(), bin.size());
|
||||||
const auto dimensions = QImageReader(&file).size();
|
|
||||||
|
|
||||||
isLoading_ = true;
|
isLoading_ = true;
|
||||||
emit loadingChanged();
|
emit loadingChanged();
|
||||||
@ -328,7 +327,6 @@ UserProfile::changeAvatar()
|
|||||||
mime.name().toStdString(),
|
mime.name().toStdString(),
|
||||||
QFileInfo(fileName).fileName().toStdString(),
|
QFileInfo(fileName).fileName().toStdString(),
|
||||||
[this,
|
[this,
|
||||||
dimensions,
|
|
||||||
payload,
|
payload,
|
||||||
mimetype = mime.name().toStdString(),
|
mimetype = mime.name().toStdString(),
|
||||||
size = payload.size(),
|
size = payload.size(),
|
||||||
@ -367,13 +365,13 @@ UserProfile::changeAvatar()
|
|||||||
void
|
void
|
||||||
UserProfile::updateRoomMemberState(mtx::events::state::Member member)
|
UserProfile::updateRoomMemberState(mtx::events::state::Member member)
|
||||||
{
|
{
|
||||||
http::client()->send_state_event(
|
http::client()->send_state_event(roomid_.toStdString(),
|
||||||
roomid_.toStdString(),
|
|
||||||
http::client()->user_id().to_string(),
|
http::client()->user_id().to_string(),
|
||||||
member,
|
member,
|
||||||
[this](mtx::responses::EventId, mtx::http::RequestErr err) {
|
[](mtx::responses::EventId, mtx::http::RequestErr err) {
|
||||||
if (err)
|
if (err)
|
||||||
nhlog::net()->error("Failed to update room member state : ",
|
nhlog::net()->error(
|
||||||
|
"Failed to update room member state : ",
|
||||||
err->matrix_error.error);
|
err->matrix_error.error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user