From 625fe0fee2431b9ddc9f8d19092b3899e6149995 Mon Sep 17 00:00:00 2001 From: Mikunj Varsani Date: Fri, 7 Feb 2020 09:41:58 +1100 Subject: [PATCH] Session v1.0 changes (#802) * correct typo in readme * include log * decrypt file server response, remove debug, handle crypt before _sendToProxy, improve json parsing failure logging * support file uploads on file proxy, fix _sendToProxy calling * bump form-data to 3.0 * initial refactor of feaure flag detection statements in serverRequest() * fix send-message line-height with multiple lines * fix lint * fix position of delete account modal * Profile picture upload, fixes and copy * Various changes suggested by redesign overview * Scrolling button updated and animations to modals * Display subscriber count for open chats * Prevent illegal username and passwords * Delete channel / group merge * Solidification of minor changes w appview injections * hide description field in group panel for now * fix join publicgroups pulls * increase min height respecting ratio * allow space inside a display name but not at start or end * fix height of leftpane overlay view * add back typing indicator and read receipt setting under privacy * Auto-focus new open chat input box * Password lock screen and delete data screen * touchups * Resolving Bilb revisions * Disable link previews as default per Kee on signup * remove date, we have git * add missing semicolon * _sendToProxy pass headers/handle response refactor, lint * fix my yarn conflict/resolve * include IV in server response * Sealed sender support * Support sealed sender for friend requests * fix lint * Remove unused destinationRegistrationId; lint * Update messages.json * pull RSS through file proxy * fix unit tests: remove not used count in scrolldown view and assert svg present * Disable auto-joining default loki open groups * session-id-editable-textarea * fix the textscramble for sessionID on registration * speed up lint, add lint-full/format-full, make sure use lint-full * add skipToken to establishConnection options, smuggle out secureRpcPubKey * get latest version through snode proxy, remove clearfix from ExpiredAlertBanner * expose semver and LokiAppDotNetServerAPI because we can't get ourKey from storage early enough * update note * fix upgrade link, wrap expiredWarning in span for styling, use br to clear the float, trim trailing whitespace * designalify * designalify * designalify user agent * continue designalification * make expired banner legible * remove ugly TLS hack * disable unauthorization rejection when making https requests limited to lokiRpc * Update main.js Aspect ratio amendment * Constants rework * local commit * event listeners * address missing comma for lint * fix header sessions message section * fix profile image size conversation list with pending friend request * textarea centering * refresh files in group in group panel * Looking into keyboard navigation * Remove P2P * cache eslint on `lint` but not `ready` * Cleanup media view formatting * force locale to be EN until our files are updated and translated * Simplification of keyup * Updated all icon references * SASS fixup * fix disabled state of message input on sent friendrequest * trim pubkey when user can enter one to remove whitespaces * remove lZ in path which fixes errors on svg and does not alter rendering * fix text scramble animation on registration * reload app on ctrl-r or f5 from anywhere * add back file which should have not been deleted * fix lint and clean code * fix lint * add .loki to have a self-signed cert * Remove mixpanel * use local shortcut instead of global shortcut otherwise, ctrl+r is only caught bu the last loaded instance * open the conversation when accepting a friend request also, it does what is needed to show the new friend in the friend list * make sure token comms are done over fileProxy, other notes, logging adjustment * leftpane sections titles are Wasa bold * minor refactor * onboarding messageview * linter * fix padding buttons overlay * do not render session-id-editable border when textarea disabled * textarea sessionID SpaceMono font * various touchups * fix font of description to sfprodisplay * reduce triple dots conversation header icon size * reduce size of conversationHeader title font size * fix font for session-search-input * make conversationlistitem title font wasa * fix green and white border under title in leftpane * fix panel-text-divider font-size and family * disable completely borders for profile images * make profile image which where 48pixels big 36 noew, as no more border * Complete conditional message onboarding * cache file deletions * Link preview warning on setting toggle * Messages.json amendments * Join channel generalisation * Localise global vars * remove eslintcache * rm global launchcount * Remove source field from envelope * Session public chat icon * CLosed groups ui initial listprops * Desktop: enable useSnodeProxy feature flag * file proxy needs to be able to talk to snode - disable TLS check for fileProxy - lokiHttpsAgent => snodeHttpsAgent (since we use for two different things now) * enable useSealedSender too per Maxim * lint * lint * window.extension.expiredPromise version * better error checking * use promise version to see if we're expired * fix typo * lint * put back seemingly now required process.env.NODE_TLS_REJECT_UNAUTHORIZED * fix querystring in file-proxy * lint * fix typo * Remove more references to signal.org * make sure TLS is forced on open groups, improve serverRequest error message * Closed groups UI * function params changes * turn off snode proxy logging * include useful info on error * actually validate URL before starting up a bunch of timers * Closed groups overlay integration * move comments from connecting_to_server_dialog_view * use attempt from window object to reduce code duplication * refactor out validServer() * lint * lint caught typo * Rename BACKGROUND_FRIEND_REQUEST to SESSION_REQUEST. Don't trigger friend request logic if a message is aimed at a group. * Linting * Closed group joining completed w/o backend * Fix friend request messages being sent to users you don't have a session in closed groups. Disable typing messages and read receipts in groups. Send out session request messages if you don't have a session with a member in the group. * Remove unneeded boolean condition. * Closed group update message stylgin * constants renaming * Message deletion fix * gruntify * fix grunt error * expose isRss, don't close uncloseable Rss conversation on deleteMessages * remove copyId and block user on RSS feeds * remove options from RSS feed that don't make any sense and don't work * fix grunt error * squelch RSS duplicate messages * extension.expiredStatus(), adjustable timers, improve guards * allowing sending of messages if we're still waiting to hear back * markRandomNodeUnreachable() refactor, notes/logging * improve logging * improve logging * no need to validate empty token, support lokinet/getession file domains, mark broken snodes as bad, improve logging * try to address travis-osx lint complaints * not designed to have a period at the end of titleIsNow * put period back at the end * Catch a stray loki messenger * fix stray loki messenger * loki messenger isnt a thing * lint * Fix open group joining. * guards incase there are no members yet, fixes dialog not showing up * fixed file server holding up message sender init. fix joining closed groups. * Clean * Don't wait for file server to return tokens when establishing home connection. * Disable join public chat prompt Co-authored-by: Audric Ackermann Co-authored-by: Ryan Tharp Co-authored-by: Vince Co-authored-by: Maxim Shishmarev --- .eslintignore | 1 + .eslintrc.js | 7 +- .github/ISSUE_TEMPLATE/bug_report.md | 8 +- .github/PULL_REQUEST_TEMPLATE.md | 36 + .gitignore | 7 + .gitlab-ci.yml | 6 +- .prettierignore | 1 + .travis.yml | 11 - .vscode/launch.json | 58 + CONTRIBUTING.md | 15 +- Gruntfile.js | 2 +- README.md | 12 +- _locales/ar/messages.json | 104 +- _locales/bg/messages.json | 104 +- _locales/ca/messages.json | 102 +- _locales/cs/messages.json | 106 +- _locales/da/messages.json | 116 +- _locales/de/messages.json | 106 +- _locales/el/messages.json | 124 +- _locales/en/messages.json | 1022 +- _locales/eo/messages.json | 422 +- _locales/es/messages.json | 100 +- _locales/es_419/messages.json | 10 +- _locales/et/messages.json | 116 +- _locales/fa/messages.json | 100 +- _locales/fi/messages.json | 100 +- _locales/fr/messages.json | 114 +- _locales/he/messages.json | 98 +- _locales/hi/messages.json | 104 +- _locales/hr/messages.json | 104 +- _locales/hu/messages.json | 100 +- _locales/id/messages.json | 102 +- _locales/it/messages.json | 100 +- _locales/ja/messages.json | 100 +- _locales/km/messages.json | 128 +- _locales/kn/messages.json | 104 +- _locales/ko/messages.json | 104 +- _locales/lt/messages.json | 100 +- _locales/mk/messages.json | 104 +- _locales/nb/messages.json | 108 +- _locales/nl/messages.json | 174 +- _locales/nn/messages.json | 1536 + _locales/no/messages.json | 100 +- _locales/pl/messages.json | 110 +- _locales/pt_BR/messages.json | 120 +- _locales/pt_PT/messages.json | 326 +- _locales/ro/messages.json | 104 +- _locales/ru/messages.json | 100 +- _locales/sk/messages.json | 104 +- _locales/sl/messages.json | 100 +- _locales/sq/messages.json | 104 +- _locales/sr/messages.json | 104 +- _locales/sv/messages.json | 110 +- _locales/th/messages.json | 100 +- _locales/tr/messages.json | 202 +- _locales/uk/messages.json | 104 +- _locales/vi/messages.json | 104 +- _locales/zh_CN/messages.json | 108 +- _locales/zh_TW/messages.json | 98 +- app/auto_update.js | 89 - app/config.js | 5 +- app/global_errors.js | 20 +- app/logging.js | 24 +- app/menu.js | 13 +- app/profile_images.js | 25 +- app/protocol_filter.js | 12 +- app/sql.js | 923 +- app/tray_icon.js | 17 +- app/window_state.d.ts | 2 + appveyor.yml | 8 +- aptly.sh | 8 +- background.html | 432 +- build/entitlements.mac.plist | 11 + build/entitlements.mas.plist | 1 + build/icon.ico | Bin 361102 -> 0 bytes build/icon.png | Bin 0 -> 49079 bytes build/notarize.js | 28 + .../mp3lameencoder/lib/Mp3LameEncoder.js | 6 +- config/default.json | 31 +- config/development-1.json | 14 +- config/development-2.json | 16 + config/development.json | 14 +- config/local-devprod.json | 4 + config/local-devprod1.json | 5 + config/staging.json | 1 - config/swarm-testing.json | 11 + config/swarm-testing2.json | 11 + config/test-lib.json | 1 - config/test.json | 1 - fonts/SFProDisplay-Regular.otf | Bin 0 -> 298944 bytes fonts/SFProText-Regular.ttf | Bin 0 -> 434120 bytes fonts/SpaceMono-Bold.ttf | Bin 0 -> 89020 bytes fonts/SpaceMono-BoldItalic.ttf | Bin 0 -> 97732 bytes fonts/SpaceMono-Italic.ttf | Bin 0 -> 105932 bytes fonts/SpaceMono-Regular.ttf | Bin 0 -> 93252 bytes fonts/Wasa-Bold.otf | Bin 0 -> 64560 bytes images/crown.svg | 1 + images/icon-paste.svg | 1 + images/icon_1024.png | Bin 209526 -> 133077 bytes images/icon_128.png | Bin 9329 -> 8187 bytes images/icon_16.png | Bin 725 -> 720 bytes images/icon_256.png | Bin 21646 -> 13009 bytes images/icon_32.png | Bin 1689 -> 1794 bytes images/icon_48.png | Bin 2778 -> 2758 bytes images/loki/loki_icon_128.png | Bin 8902 -> 0 bytes images/loki/loki_icon_text.png | Bin 82405 -> 0 bytes images/loki/session_icon.png | Bin 0 -> 22645 bytes images/loki/session_icon_128.png | Bin 0 -> 6682 bytes images/note-28.svg | 1 + images/search.svg | 5 +- images/session/Contacts.svg | 17 + images/session/arrow.svg | 11 + images/session/brand.svg | 31 + images/session/chat-bubbles.svg | 17 + images/session/chatbubble.svg | 17 + images/session/chevron.svg | 17 + images/session/circleplus.svg | 17 + images/session/ellipses.svg | 15 + images/session/emoji.svg | 17 + images/session/eye.svg | 17 + images/session/file.svg | 17 + images/session/full-logo.svg | 64 + images/session/gear.svg | 17 + images/session/globe.svg | 11 + images/session/icon-attachment.svg | 3 + images/session/icon-back.svg | 3 + images/session/icon-check.svg | 19 + images/session/icon-exit.svg | 3 + images/session/icon-favorite.svg | 3 + images/session/icon-group.svg | 3 + images/session/icon-menu.svg | 3 + images/session/icon-message.svg | 3 + images/session/icon-microphone.svg | 3 + images/session/icon-network.svg | 3 + images/session/icon-options.svg | 3 + images/session/icon-search.svg | 3 + images/session/icon-theme.svg | 3 + images/session/icon_256.png | Bin 0 -> 13009 bytes images/session/icon_64.png | Bin 0 -> 3127 bytes images/session/magnifyingglass.svg | 30 + images/session/microphone.svg | 17 + images/session/moon.svg | 17 + images/session/reply.svg | 17 + images/session/send.svg | 33 + images/session/session_chat_icon.png | Bin 0 -> 66950 bytes images/session/star.svg | 17 + images/spinner-24.svg | 9 + images/spinner-56.svg | 9 + images/spinner-track-24.svg | 9 + images/spinner-track-56.svg | 9 + images/x-16.svg | 2 +- images/x.svg | 2 +- index.html | 10 +- js/Mp3LameEncoder.min.js | 6 +- js/background.js | 1232 +- js/blocked_number_controller.js | 4 +- js/conversation_controller.js | 111 +- js/curve/curve25519_compiled.js | 73849 ++++++++++++++++ js/curve/curve25519_wrapper.js | 158 + js/delivery_receipts.js | 28 +- js/expire.js | 103 +- js/expiring_messages.js | 23 +- js/libsignal-protocol-worker.js | 14 +- js/link_previews_helper.js | 142 - js/message_controller.js | 65 + js/models/conversations.js | 1239 +- js/models/messages.js | 1295 +- js/models/profile.js | 58 - js/modules/.eslintrc | 3 +- js/modules/attachment_downloads.js | 388 + js/modules/backup.js | 66 +- js/modules/data.d.ts | 3 + js/modules/data.js | 323 +- js/modules/debuglogs.js | 2 +- js/modules/link_previews.d.ts | 1 + js/modules/link_previews.js | 189 +- js/modules/loki_app_dot_net_api.js | 1828 + js/modules/loki_file_server_api.js | 323 + js/modules/loki_message_api.js | 531 +- js/modules/loki_p2p_api.js | 128 - js/modules/loki_public_chat_api.js | 186 + js/modules/loki_rpc.js | 209 +- js/modules/loki_rss_api.js | 161 + js/modules/loki_snode_api.js | 228 +- js/modules/metadata/CiphertextMessage.js | 2 + js/modules/metadata/SecretSessionCipher.js | 84 +- js/modules/migrate_to_sql.js | 27 - js/modules/signal.js | 136 +- js/modules/types/attachment.js | 12 +- .../attachment/migrate_data_to_file_system.js | 3 +- js/modules/types/message.js | 82 +- js/modules/web_api.js | 85 +- js/notifications.js | 25 +- js/permissions_popup_start.js | 13 +- js/read_receipts.js | 16 +- js/read_syncs.js | 17 +- js/registration.js | 3 + js/rotate_signed_prekey_listener.js | 23 +- js/session_ui_manager.js | 0 js/settings_start.js | 1 + js/signal_protocol_store.js | 213 +- js/util_worker_tasks.js | 6 +- js/views/.inbox_view.js.swp | Bin 24576 -> 0 bytes js/views/app_view.js | 94 +- js/views/attachment_view.js | 230 - js/views/beta_release_disclaimer_view.js | 38 + js/views/blocked_number_view.js | 12 +- js/views/bulk_edit_view.js | 37 + js/views/clear_data_view.js | 72 - js/views/confirm_session_reset_view.js | 50 + js/views/connecting_to_server_dialog_view.js | 61 + js/views/conversation_list_view.js | 9 +- js/views/conversation_loading_view.js | 22 + js/views/conversation_search_view.js | 23 +- js/views/conversation_view.js | 1038 +- js/views/create_group_dialog_view.js | 138 + js/views/device_pairing_dialog_view.js | 36 + js/views/device_pairing_words_dialog_view.js | 35 + js/views/edit_profile_dialog_view.js | 53 + js/views/file_input_view.js | 88 +- js/views/group_update_view.js | 3 +- js/views/hint_view.js | 18 - js/views/inbox_view.js | 453 +- js/views/invite_friends_dialog_view.js | 58 + js/views/key_verification_view.js | 6 +- js/views/main_header_view.js | 62 - js/views/member_list_view.js | 106 + js/views/message_view.js | 36 +- js/views/moderators_add_dialog_view.js | 66 + js/views/moderators_remove_dialog_view.js | 64 + js/views/network_status_view.js | 37 +- js/views/new_group_update_view.js | 99 - js/views/nickname_dialog_view.js | 39 +- js/views/password_dialog_view.js | 226 +- js/views/password_view.js | 64 +- js/views/qr_dialog_view.js | 36 + js/views/react_wrapper_view.js | 13 +- js/views/recipients_input_view.js | 183 - js/views/scroll_down_button_view.js | 35 +- js/views/seed_dialog_view.js | 95 +- js/views/session_confirm_view.js | 57 + js/views/session_dropdown_view.js | 0 js/views/session_modal_view.js | 0 js/views/session_registration_view.js | 128 + js/views/session_settings_view.js | 28 + js/views/session_toast_view.js | 75 + js/views/session_toggle_view.js | 31 + js/views/settings_view.js | 47 +- js/views/standalone_registration_view.js | 236 +- js/views/timestamp_view.js | 129 - js/views/user_details_dialog_view.js | 56 + js/views/whisper_view.js | 5 +- libloki/api.js | 237 +- libloki/crypto.js | 177 +- libloki/modules/local_loki_server.js | 112 - libloki/modules/mnemonic.js | 54 +- libloki/proof-of-work.js | 33 +- libloki/storage.js | 137 +- libloki/test/metrics.js | 51 +- libloki/test/node/local_loki_server_test.js | 85 - libloki/test/node/loki_p2p_api_test.js | 92 - libloki/test/snode_channel_test.js | 4 +- libloki/test/storage_test.js | 3 +- libtextsecure/account_manager.js | 208 +- libtextsecure/contacts_parser.js | 2 +- libtextsecure/errors.js | 67 +- libtextsecure/helpers.js | 21 +- libtextsecure/http-resources.js | 54 +- libtextsecure/key_worker.js | 4 +- libtextsecure/libsignal-protocol.js | 23 +- libtextsecure/message_receiver.js | 1242 +- libtextsecure/outgoing_message.js | 405 +- libtextsecure/sendmessage.js | 572 +- libtextsecure/storage.js | 8 +- libtextsecure/storage/groups.js | 160 - libtextsecure/storage/unprocessed.js | 10 +- libtextsecure/storage/user.js | 8 +- libtextsecure/test/_test.js | 3 +- libtextsecure/test/contacts_parser_test.js | 4 +- libtextsecure/test/fake_web_api.js | 3 +- .../test/in_memory_signal_protocol_store.js | 19 +- main.js | 143 +- mnemonic_languages/chinese_simplified.json | 1 + mnemonic_languages/dutch.json | 1 + mnemonic_languages/esperanto.json | 1 + mnemonic_languages/french.json | 1 + mnemonic_languages/german.json | 1 + mnemonic_languages/italian.json | 1 + mnemonic_languages/lojban.json | 1 + mnemonic_languages/russian.json | 1 + package.json | 134 +- password.html | 63 +- password_preload.js | 32 +- preload.js | 136 +- prepare_beta_build.js | 12 +- protos/SignalService.proto | 41 +- protos/UnidentifiedDelivery.proto | 14 +- settings.html | 18 +- settings_preload.js | 12 +- styleguide.config.js | 8 +- stylesheets/_conversation.scss | 212 +- stylesheets/_emoji.scss | 5 +- stylesheets/_global.scss | 222 +- stylesheets/_index.scss | 72 +- stylesheets/_ios.scss | 40 + stylesheets/_mentions.scss | 213 + stylesheets/_modules.scss | 703 +- stylesheets/_recorder.scss | 1 - stylesheets/_session-slider.scss | 268 + stylesheets/_session.scss | 1763 + stylesheets/_session_group_panel.scss | 146 + stylesheets/_session_left_pane.scss | 633 + stylesheets/_session_signin.scss | 262 + stylesheets/_session_theme.scss | 147 + stylesheets/_theme_dark.scss | 236 +- stylesheets/_variables.scss | 12 +- stylesheets/manifest.scss | 10 +- test/_test.js | 7 +- test/app/fixtures/menu-mac-os-setup.json | 11 +- test/app/fixtures/menu-mac-os.json | 11 +- .../fixtures/menu-windows-linux-setup.json | 9 +- test/app/fixtures/menu-windows-linux.json | 9 +- test/backup_test.js | 2 + test/conversation_controller_test.js | 48 - test/index.html | 496 +- test/keychange_listener_test.js | 3 +- test/metadata/SecretSessionCipher_test.js | 9 +- test/models/conversations_test.js | 52 - test/models/messages_test.js | 4 +- test/models/profile_test.js | 120 - test/modules/link_previews_test.js | 161 +- test/modules/types/attachment_test.js | 9 - test/modules/types/contact_test.js | 3 +- test/modules/types/message_test.js | 16 +- test/storage_test.js | 50 +- test/views/attachment_view_test.js | 59 - test/views/group_update_view_test.js | 24 - test/views/inbox_view_test.js | 5 + test/views/network_status_view_test.js | 3 +- test/views/scroll_down_button_view_test.js | 33 +- test/views/threads_test.js | 21 - test/views/timestamp_view_test.js | 139 - ts/backbone/views/Lightbox.ts | 4 +- ts/components/Avatar.md | 39 + ts/components/Avatar.tsx | 102 +- ts/components/CaptionEditor.tsx | 49 +- ts/components/ConfirmDialog.tsx | 45 + ts/components/ContactListItem.tsx | 8 +- ts/components/ConversationListItem.md | 114 +- ts/components/ConversationListItem.tsx | 235 +- ts/components/ConversationLoadingScreen.tsx | 17 + ts/components/DevicePairingDialog.tsx | 387 + ts/components/EditProfileDialog.tsx | 340 + ts/components/Intl.tsx | 10 +- ts/components/JazzIcon/JazzIcon.tsx | 166 + ts/components/JazzIcon/Paper.tsx | 25 + ts/components/JazzIcon/RNG.tsx | 21 + ts/components/JazzIcon/index.tsx | 2 + ts/components/LeftPane.md | 240 + ts/components/LeftPane.tsx | 203 + ts/components/Lightbox.tsx | 66 +- ts/components/LightboxGallery.tsx | 25 +- ts/components/MainHeader.md | 58 +- ts/components/MainHeader.tsx | 54 - ts/components/MainViewController.tsx | 45 + ts/components/MessageBodyHighlight.md | 41 + ts/components/MessageBodyHighlight.tsx | 111 + ts/components/MessageSearchResult.md | 191 + ts/components/MessageSearchResult.tsx | 166 + ts/components/SearchResults.md | 267 + ts/components/SearchResults.tsx | 98 + ts/components/Spinner.md | 32 + ts/components/Spinner.tsx | 41 + ts/components/StartNewConversation.md | 23 + ts/components/StartNewConversation.tsx | 42 + ts/components/UserDetailsDialog.tsx | 113 + ts/components/UserSearchResults.tsx | 67 + ts/components/conversation/AddMentions.tsx | 182 + ts/components/conversation/AddNewLines.tsx | 15 +- ts/components/conversation/AttachmentList.tsx | 44 +- ts/components/conversation/BulkEdit.tsx | 44 + ts/components/conversation/ContactDetail.tsx | 23 +- ts/components/conversation/ContactName.tsx | 34 +- .../conversation/ConversationHeader.md | 205 +- .../conversation/ConversationHeader.tsx | 440 +- .../conversation/CreateGroupDialog.tsx | 217 + ts/components/conversation/EmbeddedContact.md | 45 + .../conversation/EmbeddedContact.tsx | 89 +- ts/components/conversation/Emojify.tsx | 44 +- ts/components/conversation/ExpireTimer.tsx | 24 +- ts/components/conversation/FriendRequest.md | 2 + ts/components/conversation/FriendRequest.tsx | 54 +- .../conversation/GroupInvitation.tsx | 45 + .../conversation/GroupNotification.tsx | 55 +- ts/components/conversation/Image.md | 261 +- ts/components/conversation/Image.tsx | 53 +- ts/components/conversation/ImageGrid.tsx | 199 +- .../conversation/InviteFriendsDialog.tsx | 153 + ts/components/conversation/Linkify.tsx | 28 +- ts/components/conversation/MemberList.tsx | 148 + ts/components/conversation/Message.md | 340 +- ts/components/conversation/Message.tsx | 474 +- ts/components/conversation/MessageBody.md | 25 +- ts/components/conversation/MessageBody.tsx | 99 +- ts/components/conversation/MessageDetail.tsx | 10 +- .../conversation/ModeratorsAddDialog.tsx | 222 + .../conversation/ModeratorsRemoveDialog.tsx | 141 + ts/components/conversation/Quote.md | 44 + ts/components/conversation/Quote.tsx | 77 +- .../conversation/ResetSessionNotification.tsx | 4 +- .../conversation/SafetyNumberNotification.tsx | 9 +- .../conversation/StagedGenericAttachment.tsx | 10 +- .../conversation/StagedLinkPreview.tsx | 7 +- .../conversation/TimerNotification.tsx | 11 +- ts/components/conversation/Timestamp.tsx | 8 +- .../conversation/TypingAnimation.tsx | 4 +- ts/components/conversation/TypingBubble.tsx | 26 +- .../conversation/UpdateGroupDialog.tsx | 259 + .../conversation/VerificationNotification.tsx | 4 +- ts/components/conversation/_contactUtil.tsx | 94 + .../media-gallery/AttachmentSection.tsx | 14 +- .../media-gallery/DocumentListItem.tsx | 2 +- .../media-gallery/MediaGallery.tsx | 41 +- .../media-gallery/MediaGridItem.tsx | 6 +- .../media-gallery/groupMediaItemsByDate.ts | 8 +- .../media-gallery/types/ItemClickEvent.ts | 2 +- ts/components/conversation/types.ts | 27 - ts/components/session/AccentText.tsx | 11 + ts/components/session/ActionsPanel.tsx | 195 + .../session/LeftPaneChannelSection.tsx | 485 + .../session/LeftPaneContactSection.tsx | 349 + .../session/LeftPaneMessageSection.tsx | 405 + .../session/LeftPaneSectionHeader.tsx | 117 + .../session/LeftPaneSettingSection.tsx | 218 + ts/components/session/RegistrationTabs.tsx | 881 + ts/components/session/SessionButton.tsx | 79 + .../session/SessionChannelSettings.tsx | 270 + .../session/SessionClosableOverlay.tsx | 288 + ts/components/session/SessionConfirm.tsx | 92 + ts/components/session/SessionDropdown.tsx | 81 + ts/components/session/SessionDropdownItem.tsx | 60 + ts/components/session/SessionHTMLRenderer.tsx | 26 + ts/components/session/SessionIdEditable.tsx | 70 + ts/components/session/SessionInput.tsx | 137 + .../session/SessionMemberListItem.tsx | 128 + ts/components/session/SessionModal.tsx | 126 + .../session/SessionPasswordModal.tsx | 203 + .../session/SessionPasswordPrompt.tsx | 198 + ts/components/session/SessionQRModal.tsx | 48 + ts/components/session/SessionRadio.tsx | 58 + ts/components/session/SessionRadioGroup.tsx | 60 + .../session/SessionRegistrationView.tsx | 31 + ts/components/session/SessionScrollButton.tsx | 19 + ts/components/session/SessionSearchInput.tsx | 45 + ts/components/session/SessionSeedModal.tsx | 227 + ts/components/session/SessionSpinner.tsx | 32 + ts/components/session/SessionToast.tsx | 84 + ts/components/session/SessionToggle.tsx | 83 + ts/components/session/UserSearchDropdown.tsx | 95 + ts/components/session/icon/Icons.tsx | 203 + ts/components/session/icon/SessionIcon.tsx | 81 + .../session/icon/SessionIconButton.tsx | 78 + ts/components/session/icon/index.tsx | 3 + .../settings/SessionSettingListItem.tsx | 128 + .../session/settings/SessionSettings.tsx | 621 + .../settings/SessionSettingsHeader.tsx | 93 + ts/global.d.ts | 65 + ts/shims/Signal.ts | 6 + ts/shims/Whisper.ts | 4 + ts/shims/events.ts | 4 + ts/state/actions.ts | 15 + ts/state/createStore.ts | 34 + ts/state/ducks/conversations.ts | 343 + ts/state/ducks/noop.ts | 4 + ts/state/ducks/search.ts | 326 + ts/state/ducks/user.ts | 71 + ts/state/reducer.ts | 25 + ts/state/roots/createLeftPane.tsx | 16 + ts/state/selectors/conversations.ts | 177 + ts/state/selectors/search.ts | 118 + ts/state/selectors/user.ts | 28 + ts/state/smart/LeftPane.tsx | 41 + ts/state/smart/MessageSearchResult.tsx | 23 + ts/styleguide/LeftPaneContext.tsx | 5 +- ts/styleguide/StyleGuideUtil.ts | 7 +- ts/test/state/selectors/conversations_test.ts | 106 + ts/test/types/Attachment_test.ts | 19 +- ts/test/types/Contact_test.ts | 134 +- ts/test/types/Conversation_test.ts | 15 +- ts/test/types/Settings_test.ts | 61 + ts/test/updater/common_test.ts | 77 + ts/test/updater/curve_test.ts | 14 + ts/test/updater/signature_test.ts | 206 + ts/types/Attachment.ts | 263 +- ts/types/{Contact.ts => Contact.tsx} | 36 +- ts/types/Conversation.ts | 32 +- ts/types/PhoneNumber.ts | 67 +- ts/types/Search.ts | 6 + ts/types/Settings.ts | 3 + ts/types/Util.ts | 10 +- ts/updater/common.ts | 323 + ts/updater/curve.ts | 59 + ts/updater/generateKeyPair.ts | 45 + ts/updater/generateSignature.ts | 85 + ts/updater/index.ts | 66 + ts/updater/macos.ts | 324 + ts/updater/signature.ts | 112 + ts/updater/windows.ts | 231 + ts/util/cleanSearchTerm.ts | 24 + ts/util/emoji.ts | 2 +- ts/util/formatRelativeTime.ts | 27 +- ts/util/getInitials.ts | 6 +- ts/util/index.ts | 2 + ts/util/lint/exceptions.json | 3576 +- ts/util/lint/linter.ts | 13 +- ts/util/lint/rules.json | 7 + ts/util/lint/types.ts | 4 +- ts/util/makeLookup.ts | 12 + ts/util/timer.ts | 23 + tsconfig.json | 4 +- tslint.json | 31 +- yarn.lock | 6838 +- 522 files changed, 123042 insertions(+), 14535 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .vscode/launch.json create mode 100644 _locales/nn/messages.json delete mode 100644 app/auto_update.js create mode 100644 app/window_state.d.ts create mode 100644 build/entitlements.mac.plist create mode 100644 build/icon.png create mode 100644 build/notarize.js create mode 100644 config/development-2.json create mode 100644 config/local-devprod.json create mode 100644 config/local-devprod1.json create mode 100644 config/swarm-testing.json create mode 100644 config/swarm-testing2.json create mode 100644 fonts/SFProDisplay-Regular.otf create mode 100644 fonts/SFProText-Regular.ttf create mode 100644 fonts/SpaceMono-Bold.ttf create mode 100644 fonts/SpaceMono-BoldItalic.ttf create mode 100644 fonts/SpaceMono-Italic.ttf create mode 100644 fonts/SpaceMono-Regular.ttf create mode 100755 fonts/Wasa-Bold.otf create mode 100644 images/crown.svg create mode 100644 images/icon-paste.svg delete mode 100644 images/loki/loki_icon_128.png delete mode 100644 images/loki/loki_icon_text.png create mode 100644 images/loki/session_icon.png create mode 100644 images/loki/session_icon_128.png create mode 100644 images/note-28.svg create mode 100644 images/session/Contacts.svg create mode 100644 images/session/arrow.svg create mode 100644 images/session/brand.svg create mode 100644 images/session/chat-bubbles.svg create mode 100644 images/session/chatbubble.svg create mode 100644 images/session/chevron.svg create mode 100644 images/session/circleplus.svg create mode 100644 images/session/ellipses.svg create mode 100644 images/session/emoji.svg create mode 100644 images/session/eye.svg create mode 100644 images/session/file.svg create mode 100644 images/session/full-logo.svg create mode 100644 images/session/gear.svg create mode 100644 images/session/globe.svg create mode 100644 images/session/icon-attachment.svg create mode 100644 images/session/icon-back.svg create mode 100644 images/session/icon-check.svg create mode 100644 images/session/icon-exit.svg create mode 100644 images/session/icon-favorite.svg create mode 100644 images/session/icon-group.svg create mode 100644 images/session/icon-menu.svg create mode 100644 images/session/icon-message.svg create mode 100644 images/session/icon-microphone.svg create mode 100644 images/session/icon-network.svg create mode 100644 images/session/icon-options.svg create mode 100644 images/session/icon-search.svg create mode 100644 images/session/icon-theme.svg create mode 100644 images/session/icon_256.png create mode 100644 images/session/icon_64.png create mode 100644 images/session/magnifyingglass.svg create mode 100644 images/session/microphone.svg create mode 100644 images/session/moon.svg create mode 100644 images/session/reply.svg create mode 100644 images/session/send.svg create mode 100644 images/session/session_chat_icon.png create mode 100644 images/session/star.svg create mode 100644 images/spinner-24.svg create mode 100644 images/spinner-56.svg create mode 100644 images/spinner-track-24.svg create mode 100644 images/spinner-track-56.svg create mode 100644 js/curve/curve25519_compiled.js create mode 100644 js/curve/curve25519_wrapper.js delete mode 100644 js/link_previews_helper.js create mode 100644 js/message_controller.js delete mode 100644 js/models/profile.js create mode 100644 js/modules/attachment_downloads.js create mode 100644 js/modules/data.d.ts create mode 100644 js/modules/link_previews.d.ts create mode 100644 js/modules/loki_app_dot_net_api.js create mode 100644 js/modules/loki_file_server_api.js delete mode 100644 js/modules/loki_p2p_api.js create mode 100644 js/modules/loki_public_chat_api.js create mode 100644 js/modules/loki_rss_api.js create mode 100644 js/session_ui_manager.js delete mode 100644 js/views/.inbox_view.js.swp delete mode 100644 js/views/attachment_view.js create mode 100644 js/views/beta_release_disclaimer_view.js create mode 100644 js/views/bulk_edit_view.js delete mode 100644 js/views/clear_data_view.js create mode 100644 js/views/confirm_session_reset_view.js create mode 100644 js/views/connecting_to_server_dialog_view.js create mode 100644 js/views/conversation_loading_view.js create mode 100644 js/views/create_group_dialog_view.js create mode 100644 js/views/device_pairing_dialog_view.js create mode 100644 js/views/device_pairing_words_dialog_view.js create mode 100644 js/views/edit_profile_dialog_view.js delete mode 100644 js/views/hint_view.js create mode 100644 js/views/invite_friends_dialog_view.js delete mode 100644 js/views/main_header_view.js create mode 100644 js/views/member_list_view.js create mode 100644 js/views/moderators_add_dialog_view.js create mode 100644 js/views/moderators_remove_dialog_view.js delete mode 100644 js/views/new_group_update_view.js create mode 100644 js/views/qr_dialog_view.js delete mode 100644 js/views/recipients_input_view.js create mode 100644 js/views/session_confirm_view.js create mode 100644 js/views/session_dropdown_view.js create mode 100644 js/views/session_modal_view.js create mode 100644 js/views/session_registration_view.js create mode 100644 js/views/session_settings_view.js create mode 100644 js/views/session_toast_view.js create mode 100644 js/views/session_toggle_view.js delete mode 100644 js/views/timestamp_view.js create mode 100644 js/views/user_details_dialog_view.js delete mode 100644 libloki/modules/local_loki_server.js delete mode 100644 libloki/test/node/local_loki_server_test.js delete mode 100644 libloki/test/node/loki_p2p_api_test.js delete mode 100644 libtextsecure/storage/groups.js create mode 100644 mnemonic_languages/chinese_simplified.json create mode 100644 mnemonic_languages/dutch.json create mode 100644 mnemonic_languages/esperanto.json create mode 100644 mnemonic_languages/french.json create mode 100644 mnemonic_languages/german.json create mode 100644 mnemonic_languages/italian.json create mode 100644 mnemonic_languages/lojban.json create mode 100644 mnemonic_languages/russian.json create mode 100644 stylesheets/_mentions.scss create mode 100644 stylesheets/_session-slider.scss create mode 100644 stylesheets/_session.scss create mode 100644 stylesheets/_session_group_panel.scss create mode 100644 stylesheets/_session_left_pane.scss create mode 100644 stylesheets/_session_signin.scss create mode 100644 stylesheets/_session_theme.scss delete mode 100644 test/conversation_controller_test.js delete mode 100644 test/models/profile_test.js delete mode 100644 test/views/attachment_view_test.js delete mode 100644 test/views/group_update_view_test.js delete mode 100644 test/views/threads_test.js delete mode 100644 test/views/timestamp_view_test.js create mode 100644 ts/components/ConfirmDialog.tsx create mode 100644 ts/components/ConversationLoadingScreen.tsx create mode 100644 ts/components/DevicePairingDialog.tsx create mode 100644 ts/components/EditProfileDialog.tsx create mode 100644 ts/components/JazzIcon/JazzIcon.tsx create mode 100644 ts/components/JazzIcon/Paper.tsx create mode 100644 ts/components/JazzIcon/RNG.tsx create mode 100644 ts/components/JazzIcon/index.tsx create mode 100644 ts/components/LeftPane.md create mode 100644 ts/components/LeftPane.tsx delete mode 100644 ts/components/MainHeader.tsx create mode 100644 ts/components/MainViewController.tsx create mode 100644 ts/components/MessageBodyHighlight.md create mode 100644 ts/components/MessageBodyHighlight.tsx create mode 100644 ts/components/MessageSearchResult.md create mode 100644 ts/components/MessageSearchResult.tsx create mode 100644 ts/components/SearchResults.md create mode 100644 ts/components/SearchResults.tsx create mode 100644 ts/components/Spinner.md create mode 100644 ts/components/Spinner.tsx create mode 100644 ts/components/StartNewConversation.md create mode 100644 ts/components/StartNewConversation.tsx create mode 100644 ts/components/UserDetailsDialog.tsx create mode 100644 ts/components/UserSearchResults.tsx create mode 100644 ts/components/conversation/AddMentions.tsx create mode 100644 ts/components/conversation/BulkEdit.tsx create mode 100644 ts/components/conversation/CreateGroupDialog.tsx create mode 100644 ts/components/conversation/GroupInvitation.tsx create mode 100644 ts/components/conversation/InviteFriendsDialog.tsx create mode 100644 ts/components/conversation/MemberList.tsx create mode 100644 ts/components/conversation/ModeratorsAddDialog.tsx create mode 100644 ts/components/conversation/ModeratorsRemoveDialog.tsx create mode 100644 ts/components/conversation/UpdateGroupDialog.tsx create mode 100644 ts/components/conversation/_contactUtil.tsx delete mode 100644 ts/components/conversation/types.ts create mode 100644 ts/components/session/AccentText.tsx create mode 100644 ts/components/session/ActionsPanel.tsx create mode 100644 ts/components/session/LeftPaneChannelSection.tsx create mode 100644 ts/components/session/LeftPaneContactSection.tsx create mode 100644 ts/components/session/LeftPaneMessageSection.tsx create mode 100644 ts/components/session/LeftPaneSectionHeader.tsx create mode 100644 ts/components/session/LeftPaneSettingSection.tsx create mode 100644 ts/components/session/RegistrationTabs.tsx create mode 100644 ts/components/session/SessionButton.tsx create mode 100644 ts/components/session/SessionChannelSettings.tsx create mode 100644 ts/components/session/SessionClosableOverlay.tsx create mode 100644 ts/components/session/SessionConfirm.tsx create mode 100644 ts/components/session/SessionDropdown.tsx create mode 100644 ts/components/session/SessionDropdownItem.tsx create mode 100644 ts/components/session/SessionHTMLRenderer.tsx create mode 100644 ts/components/session/SessionIdEditable.tsx create mode 100644 ts/components/session/SessionInput.tsx create mode 100644 ts/components/session/SessionMemberListItem.tsx create mode 100644 ts/components/session/SessionModal.tsx create mode 100644 ts/components/session/SessionPasswordModal.tsx create mode 100644 ts/components/session/SessionPasswordPrompt.tsx create mode 100644 ts/components/session/SessionQRModal.tsx create mode 100644 ts/components/session/SessionRadio.tsx create mode 100644 ts/components/session/SessionRadioGroup.tsx create mode 100644 ts/components/session/SessionRegistrationView.tsx create mode 100644 ts/components/session/SessionScrollButton.tsx create mode 100644 ts/components/session/SessionSearchInput.tsx create mode 100644 ts/components/session/SessionSeedModal.tsx create mode 100644 ts/components/session/SessionSpinner.tsx create mode 100644 ts/components/session/SessionToast.tsx create mode 100644 ts/components/session/SessionToggle.tsx create mode 100644 ts/components/session/UserSearchDropdown.tsx create mode 100644 ts/components/session/icon/Icons.tsx create mode 100644 ts/components/session/icon/SessionIcon.tsx create mode 100644 ts/components/session/icon/SessionIconButton.tsx create mode 100644 ts/components/session/icon/index.tsx create mode 100644 ts/components/session/settings/SessionSettingListItem.tsx create mode 100644 ts/components/session/settings/SessionSettings.tsx create mode 100644 ts/components/session/settings/SessionSettingsHeader.tsx create mode 100644 ts/global.d.ts create mode 100644 ts/shims/Signal.ts create mode 100644 ts/shims/Whisper.ts create mode 100644 ts/shims/events.ts create mode 100644 ts/state/actions.ts create mode 100644 ts/state/createStore.ts create mode 100644 ts/state/ducks/conversations.ts create mode 100644 ts/state/ducks/noop.ts create mode 100644 ts/state/ducks/search.ts create mode 100644 ts/state/ducks/user.ts create mode 100644 ts/state/reducer.ts create mode 100644 ts/state/roots/createLeftPane.tsx create mode 100644 ts/state/selectors/conversations.ts create mode 100644 ts/state/selectors/search.ts create mode 100644 ts/state/selectors/user.ts create mode 100644 ts/state/smart/LeftPane.tsx create mode 100644 ts/state/smart/MessageSearchResult.tsx create mode 100644 ts/test/state/selectors/conversations_test.ts create mode 100644 ts/test/updater/common_test.ts create mode 100644 ts/test/updater/curve_test.ts create mode 100644 ts/test/updater/signature_test.ts rename ts/types/{Contact.ts => Contact.tsx} (75%) create mode 100644 ts/types/Search.ts create mode 100644 ts/updater/common.ts create mode 100644 ts/updater/curve.ts create mode 100644 ts/updater/generateKeyPair.ts create mode 100644 ts/updater/generateSignature.ts create mode 100644 ts/updater/index.ts create mode 100644 ts/updater/macos.ts create mode 100644 ts/updater/signature.ts create mode 100644 ts/updater/windows.ts create mode 100644 ts/util/cleanSearchTerm.ts create mode 100644 ts/util/makeLookup.ts create mode 100644 ts/util/timer.ts diff --git a/.eslintignore b/.eslintignore index 1974d1c021..8b4ad3e97d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,6 +5,7 @@ dist/** mnemonic_languages/** # Generated files +js/curve/* js/components.js js/libtextsecure.js js/libloki.js diff --git a/.eslintrc.js b/.eslintrc.js index 34ab52aaaf..4ce192bbb7 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -21,6 +21,10 @@ module.exports = { }, ], + // Enforce curlies always + curly: ['error', 'all'], + 'brace-style': ['error', '1tbs'], + // prevents us from accidentally checking in exclusive tests (`.only`): 'mocha/no-exclusive-tests': 'error', @@ -45,7 +49,7 @@ module.exports = { quotes: [ 'error', 'single', - { avoidEscape: true, allowTemplateLiterals: false }, + { avoidEscape: true, allowTemplateLiterals: true }, ], // Prettier overrides: @@ -61,6 +65,7 @@ module.exports = { // We still want to limit comments as before: comments: 90, ignoreUrls: true, + ignoreRegExpLiterals: true, }, ], }, diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6a1fe20aef..2168326492 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: '' assignees: '' - --- **Describe the bug** @@ -17,6 +16,7 @@ Steps to reproduce the behavior: If applicable, add screenshots or log files to help explain your problem. **Other information (please complete the following information):** - - Device: [e.g. PC, Mac] - - OS: [e.g. Ubuntu 16.04, Windows 10] - - Loki messenger Version or Git commit hash: + +* Device: [e.g. PC, Mac] +* OS: [e.g. Ubuntu 16.04, Windows 10] +* Session Version or Git commit hash: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..650a4416a1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,36 @@ + + + + +### First time contributor checklist: + +* [ ] I have read the [README](https://github.com/loki-project/loki-messenger/blob/master/README.md) and [Contributor Guidelines](https://github.com/loki-project/loki-messenger/blob/master/CONTRIBUTING.md) + +### Contributor checklist: + +* [ ] My commits are in nice logical chunks with [good commit messages](http://chris.beams.io/posts/git-commit/) +* [ ] My changes are [rebased](https://medium.freecodecamp.org/git-rebase-and-the-golden-rule-explained-70715eccc372) on the latest [`clearnet`](https://github.com/loki-project/loki-messenger/tree/development) branch +* [ ] A `yarn ready` run passes successfully ([more about tests here](https://github.com/loki-project/loki-messenger/blob/master/CONTRIBUTING.md#tests)) +* [ ] My changes are ready to be shipped to users + +### Description + + diff --git a/.gitignore b/.gitignore index aeb8140203..59d4c87215 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules .sass-cache +.eslintcache coverage/* build/curve25519_compiled.js build/icons/* @@ -30,3 +31,9 @@ test/test.js # React / TypeScript ts/**/*.js ts/protobuf/*.d.ts + +# Swapfiles +**/*.swp + +# Ctags +tags diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 69656b2375..76d3a0c03a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,7 @@ linux: - yarn install --frozen-lockfile - export SIGNAL_ENV=production - yarn generate - - $(yarn bin)/build --config.extraMetadata.environment=$SIGNAL_ENV --config.mac.bundleVersion='$CI_COMMIT_REF_SLUG' --publish=never --config.directories.output=release + - $(yarn bin)/electron-builder --config.extraMetadata.environment=$SIGNAL_ENV --config.mac.bundleVersion='$CI_COMMIT_REF_SLUG' --publish=never --config.directories.output=release cache: paths: - node_modules/ @@ -27,7 +27,7 @@ osx: - yarn install --frozen-lockfile - export SIGNAL_ENV=production - yarn generate - - $(yarn bin)/build --config.extraMetadata.environment=$SIGNAL_ENV --config.mac.bundleVersion='$CI_COMMIT_REF_SLUG' --publish=never --config.directories.output=release + - $(yarn bin)/electron-builder --config.extraMetadata.environment=$SIGNAL_ENV --config.mac.bundleVersion='$CI_COMMIT_REF_SLUG' --publish=never --config.directories.output=release cache: paths: - node_modules/ @@ -51,7 +51,7 @@ windows: - call yarn generate - call node build\grunt.js - call yarn prepare-beta-build - - call node_modules\.bin\build --config.extraMetadata.environment=%SIGNAL_ENV% --publish=never --config.directories.output=release + - call node_modules\.bin\electron-builder --config.extraMetadata.environment=%SIGNAL_ENV% --publish=never --config.directories.output=release - call node build\grunt.js test-release:win cache: paths: diff --git a/.prettierignore b/.prettierignore index eb59d7d0b1..ff08c3b1f1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -26,6 +26,7 @@ libloki/test/components.js # Third-party files node_modules/** components/** +js/curve/** js/Mp3LameEncoder.min.js js/WebAudioRecorderMp3.js js/libsignal-protocol-worker.js diff --git a/.travis.yml b/.travis.yml index 9de89d951a..5f2a7a5a6d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,14 +31,3 @@ matrix: - export LC_ALL=en_US - name: 'OSX' os: osx - - name: 'Windows' - os: windows - cache: false - env: - - YARN_GPG=no - before_install: - - cd ../.. - - mv $TRAVIS_REPO_SLUG _old - - git config --global core.autocrlf false - - git clone --depth=50 _old $TRAVIS_REPO_SLUG - - cd $TRAVIS_REPO_SLUG diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..9a92b58d54 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,58 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Mocha Tests", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "args": [ + "--recursive", + "--exit", + "test/app", + "test/modules", + "ts/test", + "libloki/test/node" + ], + "internalConsoleOptions": "openOnSessionStart" + }, + { + "type": "node", + "request": "launch", + "name": "Launch node Program", + "program": "${file}" + }, + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "program": "${file}" + }, + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}" + }, + { + "name": "Debug Main Process", + "type": "node", + "request": "launch", + "env": { + "NODE_APP_INSTANCE": "1" + }, + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron", + "windows": { + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd" + }, + "args": ["."], + "sourceMaps": true, + "outputCapture": "std" + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e4ba71e00e..9795e48b95 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,7 +63,7 @@ yarn install --frozen-lockfile # Install and build dependencies (this will take yarn grunt # Generate final JS and CSS assets yarn icon-gen # Generate full set of icons for Electron yarn test # A good idea to make sure tests run first -yarn start # Start Loki Messenger! +yarn start # Start Session! ``` You'll need to restart the application regularly to see your changes, as there @@ -84,16 +84,16 @@ yarn grunt dev # runs until you stop it, re-generating built assets on file chan ## Additional storage profiles -Since there is no registration for Loki Messenger, you can create as many accounts as you +Since there is no registration for Session, you can create as many accounts as you can public keys. To test the P2P functionality on the same machine, however, requries that each client binds their message server to a different port. You can use the following command to start a client bound to a different port. + ``` yarn start-multi ``` - For more than 2 clients, you can setup additional storage profiles and switch between them using the `NODE_APP_INSTANCE` environment variable and specifying a new localServerPort in the config. @@ -149,12 +149,15 @@ So you wanna make a pull request? Please observe the following guidelines. the translations in [Transifex](https://www.transifex.com/projects/p/signal-desktop). --> + +* First, make sure that your `yarn ready` run passes - it's very similar to what our + Continuous Integration servers do to test the app. * Never use plain strings right in the source code - pull them from `messages.json`! You **only** need to modify the default locale [`_locales/en/messages.json`](_locales/en/messages.json). - + * [Rebase](https://nathanleclaire.com/blog/2014/09/14/dont-be-scared-of-git-rebase/) your changes on the latest `development` branch, resolving any conflicts. This ensures that your changes will merge cleanly when you open your PR. diff --git a/Gruntfile.js b/Gruntfile.js index 1121a22b52..1665bbef8b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -182,7 +182,7 @@ module.exports = grunt => { tasks: ['sass'], }, transpile: { - files: ['./ts/**/*.ts', './ts/**/*.tsx'], + files: ['./ts/**/*.ts', './ts/**/*.tsx', './ts/**/**/*.tsx'], tasks: ['exec:transpile'], }, }, diff --git a/README.md b/README.md index 60be0da49b..766d7db528 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# Loki Messenger +# Session [![Build Status](https://travis-ci.org/loki-project/loki-messenger.svg?branch=development)](https://travis-ci.org/loki-project/loki-messenger) -Loki Messenger allows for truly decentralized and end to end and private encrypted chats, Loki Messenger is built to handle both online and fully Asynchronous offline messages , Loki messenger implements the Signal protocol for message encryption, Our Client interface is a fork of [Signal Messenger](https://signal.org/). All communication that passes through Loki messenger is routed through [Lokinet](https://github.com/loki-project/loki-network). +Session allows for truly decentralized, end to end, and private encrypted chats. Session is built to handle both online and fully Asynchronous offline messages. Session implements the Signal protocol for message encryption. Our Client interface is a fork of [Signal Messenger](https://signal.org/). All communication that passes through Session is routed through [Lokinet](https://github.com/loki-project/loki-network). ## Summary -Loki messenger integrates directly with Loki Service Nodes, which are a set of distributed, decentralized and Sybil resistant nodes. Service Nodes act as both federated servers which store messages offline, and a set of nodes which allow for onion routing functionality obfuscating users IP Addresses. For a full understanding of how Loki messenger works, read the [Loki whitepaper](https://loki.network/whitepaper) +Session integrates directly with Loki [Service Nodes](https://lokidocs.com/ServiceNodes/SNOverview/), which are a set of distributed, decentralized and Sybil resistant nodes. Service Nodes act as both federated servers which store messages offline, and a set of nodes which allow for onion routing functionality obfuscating users IP Addresses. For a full understanding of how Session works, read the [Loki whitepaper](https://loki.network/whitepaper). **Online Messages** @@ -14,11 +14,11 @@ If Alice and Bob are both online they can simply resolve each others public keys **Offline messages** -Offline messaging uses Swarms, given any users public key the user can resolve a public key to a specific grouping of Service Nodes (AKA Swarm) each user in Loki Messenger belongs to a Swarm. When routing a message offline the user selects a Service node in the destination users Swarm, when the user comes online they query any node in their Swarm, if the Swarm is holding any messages for the user they disseminate those messages to the user. +Offline messaging uses Swarms, given any users public key the user can resolve a public key to a specific grouping of Service Nodes (AKA Swarm) each user in Session belongs to a Swarm. When routing a message offline the user selects a Service node in the destination users Swarm, when the user comes online they query any node in their Swarm, if the Swarm is holding any messages for the user they disseminate those messages to the user. ![Swarm Messaging](https://i.imgur.com/o13Knds.png) -Spam protections for Loki Messenger are based on a Proof of Work which is attached to any message that exceeds a default size or Time To Live, this process is discussed further in the [Loki whitepaper](https://loki.network/whitepaper). +Spam protections for Session are based on a Proof of Work which is attached to any message that exceeds a default size or Time To Live, this process is discussed further in the [Loki whitepaper](https://loki.network/whitepaper). ## Want to Contribute? Found a Bug or Have a feature request? @@ -26,7 +26,7 @@ Please search for any [existing issues](https://github.com/loki-project/loki-mes ## Build instruction -build instructions can be found in [CONTRIBUTING.md](CONTRIBUTING.md) +Build instructions can be found in [CONTRIBUTING.md](CONTRIBUTING.md). ## License diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index 3ab1a6f062..4d8a837b56 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "بحث", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "المحادثات", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "جهات الإتصال", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "الرسائل", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "مرحبا الى سيجنال Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "التنزيل جارٍ...", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "حسنا", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "إلى", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "عام", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "انتهت صلاحية هذا الإصدار من سيغنال للحاسوب. الرجاء الارتقاء الى أحدث إصدار لمواصلة الرسائل.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "مستخدم أندرويد سيستقبل فقط أول 2000 حرف من هذه الرسالة", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "تحديث", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Hide menu bar", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/bg/messages.json b/_locales/bg/messages.json index b653b30a78..9ad74f832b 100644 --- a/_locales/bg/messages.json +++ b/_locales/bg/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Файл", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Архивирани разговори", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Изберете папка", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Изход", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Сигнал Десктоп", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Въведете име или номер", + "search": { + "message": "Търсене", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Чатове", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Контакти", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Съобщения", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Добре дошли в Сигнал", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Downloading", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Изображение", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Добре", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "До", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "General", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Тази версия на Сигнал за компютър вече е остаряла. Моля, обновете до последната версия за да можете да изпращате съобщения.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Клиентите на Android получават само първите 2000 знака от това съобщение.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Обновяване", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Скрий лентата с менютата", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Започнете разговор...", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index d4b9e6dabc..5a526a26cc 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copia l'error i surt", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Grup desconegut", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Error de la base de dades", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Suprimeix totes les dades i reinicia", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Fitxer", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Converses arxivades", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Aquestes converses estan arxivades i només apareixeran a la bústia d'entrada si es reben missatges nous.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arxiva la conversa", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Mou la conversa a la safata d'entrada", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Trieu una carpeta", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Quan inclogueu un adjunt que no sigui una imatge, el límit és un adjunt per missatge.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "No podeu barrejar adjunts d'imatge i de no imatge en un mateix missatge.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Surt", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Introduïu un nom o número", + "search": { + "message": "Cerca", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No hi ha cap resultat per a \"$searchTerm$\".", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Converses", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contactes", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Missatges", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Benvingut al Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Apartat de correus", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "S'està baixant", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Baixa l'adjunt", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -702,7 +760,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "replyingTo": { - "message": "Es respon a $name$", + "message": "Resposta per a $name$", "description": "Shown in iOS theme when you or someone quotes to a message which is not from you", "placeholders": { "name": { @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "D'acord", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "A", + "message": "a", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "General", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Envia previsualitzacions d'enllaços", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previsualitzacions estan disponibles per enllaços de Imgur, Reddit i Youtube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Activa la comprovació ortogràfica del text introduït en el quadre d'edició de missatges", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Aquesta versió del Signal Desktop ha expirat. Actualitzeu a l'última versió per a poder seguir enviant i rebent missatges.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Els clients d'Android només rebran els primers 2000 caràcters d'aquest missatge.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Actualitza", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Fosc", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Notifica-m'ho", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Amaga la barra de menú", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Comenceu la conversa...", + "message": "Comença una conversa nova...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Condicions de servei i política de privadesa", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index f7ddeca67e..8682310215 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Zkopírovat chybu a ukončit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Chyba databáze", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Smazat všechna data a restartovat", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Soubor", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Opustit Loki Messenger", + "message": "Opustit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archivované konverzace", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Tyto konverzace jsou archivované a zobrazí se mezi doručenými zprávami, pokud budou přijaty nové zprávy.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Vybrat složku", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Opustit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Zadejte jméno nebo číslo", + "search": { + "message": "Hledat", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Konverzace", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakty", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Zprávy", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Vítejte v Signalu", "description": "" }, @@ -673,6 +727,10 @@ "message": "P. O. BOX", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Downloading", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Stáhnout přílohu", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Fotografie", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Komu", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -908,7 +974,7 @@ "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" }, "plusButton": { - "message": "'+' Button", + "message": "Tlačítko '+'", "description": "The button used in Signal Android to add a new linked device" }, "linkNewDevice": { @@ -959,16 +1025,8 @@ "message": "Obecné", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Odeslat náhledy odkazu", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Náhledy jsou podporovány pro odkazy na Imgur, Instagram, Reddit, a YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { - "message": "Enable spell check of text entered in message composition box", + "message": "Kontrolovat pravopis při psaní zpráv", "description": "Description of the media permission description" }, "clearDataHeader": { @@ -1063,10 +1121,6 @@ "message": "Tato verze aplikace Signal Desktop je zastaralá. Abyste mohli dále komunikovat, aktualizujte ji prosím na nejnovější verzi.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Uživatelé Androidu dostanou pouze prvních 2000 znaků této zprávy.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Aktualizovat", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Tmavý", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Poznámka sobě", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Schovat lištu menu", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Zahájit konverzaci...", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Smluvní podmínky a zásady ochrany osobních údajů", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 9aaeaeaa51..f8bbe312e7 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopier fejl og afslut", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Ukendt gruppe", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Databasefejl", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Slet alle data og genstart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Filer", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Arkiveret samtaler", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Disse samtaler arkiveres og vises kun i indbakken, hvis der modtages nye meddelelser.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arkiver samtalen", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Flyt samtalen til indbakken", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Vælg mappe", "description": "Button to allow the user to find a folder on disk" @@ -484,11 +516,11 @@ "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "Indlæser eksempelvisning...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "Udkast miniaturebillede til eksempelvisning for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "Miniaturebillede til eksempelvisning for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "Udkast af vedhæftet billedfil: $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -521,7 +553,7 @@ "message": "Når der indgår en vedhæftet fil uden billed, er grænsen en vedhæftet fil pr. besked.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Du kan ikke blande ikke-billed og billedvedhæftninger i en besked.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Afslut", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Indtast navn eller nummer", + "search": { + "message": "Søg", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Ingen resultater for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Samtaler", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakter", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Beskeder", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Velkommen til Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Postboks", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Henter", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Hent vedhæftet fil", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Billede", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Ok", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Til", + "message": "til", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Generelt", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Aktiver stavekontrol af beskeder", "description": "Description of the media permission description" @@ -1000,15 +1058,15 @@ "description": "Message shown to user when app is disconnected and data deleted" }, "notifications": { - "message": "Notifikationer", + "message": "Meddelelser", "description": "Header for notification settings" }, "notificationSettingsDialog": { - "message": "Når beskeder ankommer, vis notifikationer med:", + "message": "Når beskeder ankommer, vis meddelelser med:", "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Slå notifikationer fra", + "message": "Slå meddelelser fra", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1063,10 +1121,6 @@ "message": "Denne version af Signal er forældet. Venligst opgrader til den seneste version.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android-enheder vil kun modtage de første 2000 tegn af denne besked.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Opgrader", "description": "Label text for button to upgrade the app to the latest version" @@ -1334,7 +1388,7 @@ } }, "audioNotificationDescription": { - "message": "Afspil lydnotifikation", + "message": "Afspil lydmeddelelse", "description": "Description for audio notification setting" }, "safetyNumberChanged": { @@ -1373,12 +1427,16 @@ "message": "Mørk", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note til dig selv", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Skjul menulinje", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start samtale...", + "message": "Start ny samtale...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Vilkår og privatlivspolitik", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/de/messages.json b/_locales/de/messages.json index bf65576747..6df957c3aa 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Fehler kopieren und beenden", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unbekannte Gruppe", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Datenbankfehler", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Alle Daten löschen und neu starten", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Datei", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archivierte Unterhaltungen", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Diese Unterhaltungen sind archiviert und werden nur dann im Eingang erscheinen, falls neue Nachrichten empfangen werden.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Unterhaltung archivieren", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Unterhaltung in Eingang verschieben", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Ordner wählen", "description": "Button to allow the user to find a folder on disk" @@ -376,7 +408,7 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Alles klar!", + "message": "Verstanden", "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { @@ -521,7 +553,7 @@ "message": "Mehrere Anhänge je Nachricht sind ausschließlich bei Bildern erlaubt.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Du kannst Bilder nicht gemeinsam mit anderen Anhängen in einer Nachricht kombinieren.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Beenden", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Name oder Rufnummer eingeben", + "search": { + "message": "Suchen", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Keine Ergebnisse für »$searchTerm$«", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Unterhaltungen", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakte", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Nachrichten", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Willkommen bei Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Postfach", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Wird heruntergeladen", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Anhang herunterladen", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,8 +793,16 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { - "message": "O. K.", + "message": "Okay", "description": "" }, "cancel": { @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "An", + "message": "an", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Allgemein", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Link-Vorschauen senden", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Vorschauen werden unterstützt für Links von Imgur, Instagram, Reddit und YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Rechtschreibprüfung für im Nachrichteneingabefeld eingegebenen Text aktivieren", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Diese Version von Signal Desktop ist veraltet. Bitte führe eine Aktualisierung auf die aktuellste Version durch, um weiterhin Nachrichten austauschen zu können.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Signal für Android kann nur die ersten 2.000 Zeichen dieser Nachricht empfangen.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Aktualisieren", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dunkel", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Notiz an mich", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Menüleiste ausblenden", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Unterhaltung beginnen …", + "message": "Neue Unterhaltung beginnen …", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1410,7 +1468,7 @@ "description": "" }, "autoUpdateNewVersionInstructions": { - "message": "Zum Durchführen der Aktualisierungen klicke auf »Signal neu starten«.", + "message": "Zum Aktualisieren klicke auf »Signal neu starten«.", "description": "" }, "autoUpdateRestartButtonLabel": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Bedingungen & Datenschutzerklärung", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/el/messages.json b/_locales/el/messages.json index fb48054a81..6acf9812d1 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Αντιγραφή λάθους και έξοδος", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Λάθος της βάσης δεδομένων", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Διαγραφή όλων των δεδομένων και επανεκκίνηση", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Φάκελος", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,12 +161,28 @@ } } }, + "archivedConversations": { + "message": "Αρχειοθετημένες Συνομιλίες", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Αυτές οι συνομιλίες είναι αρχειοθετημένες και θα εμφανιστούν στα εισερχόμενα μόνο αν ληφθούν νέα μηνύματα.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Επιλογή φακέλου", "description": "Button to allow the user to find a folder on disk" }, "chooseFile": { - "message": "Choose file", + "message": "Επιλογή αρχείου", "description": "Button to allow the user to find a file on disk" }, "loadDataHeader": { @@ -484,11 +516,11 @@ "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "Φόρτωση προεσκόπισης...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "Πρόχειρη μικρή προεσκόπιση συνδέσμου για $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "Μικρή προεσκόπιση συνδέσμου για $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "Πρόχειρη συνημμένη εικόνα: $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -518,15 +550,15 @@ } }, "oneNonImageAtATimeToast": { - "message": "When including a non-image attachment, the limit is one attachment per message.", + "message": "Για συνημμένα αρχεία που δεν είναι εικόνες, το όριο είναι ένα αρχείο ανά μήνυμα.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "You cannot mix non-image and image attachments in one message.", + "cannotMixImageAndNonImageAttachments": { + "message": "Δεν είναι δυνατό να συνάψετε εικόνες μαζί με αρχεία άλλου τύπου στο ίδιο μήνυμα.", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { - "message": "You cannot add any more attachments to this message.", + "message": "Δεν είναι δυνατή η προσθήκη άλλων συνημμένων αρχείων σε αυτό το μήνυμα.", "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { @@ -611,15 +643,37 @@ "message": "Έξοδος", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Εισάγετε όνομα ή αριθμό", + "search": { + "message": "Αναζήτηση", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Συνομιλίες", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Επαφές", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Μηνύματα", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Καλώς ορίσατε στο Signal", "description": "" }, @@ -628,7 +682,7 @@ "description": "" }, "typingAlt": { - "message": "Typing animation for this conversation", + "message": "Κινούμενη εικόνα που δείχνει πληκτρολόγηση για αυτή τη συζήτηση", "description": "Used as the 'title' attibute for the typing animation" }, "contactAvatarAlt": { @@ -673,6 +727,10 @@ "message": "Τ.Θ.", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Downloading", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Λήψη Συνημμένου", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -694,7 +752,7 @@ "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" }, "voiceNoteMustBeOnlyAttachment": { - "message": "A voice note must be the only attachment included in a message.", + "message": "Ένα μήνυμα φωνής πρέπει να είναι το μοναδικό συνημμένο αρχείο σε ένα μήνυμα.", "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { @@ -735,6 +793,14 @@ "message": "Φωτογραφία ", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Προς", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -862,7 +928,7 @@ "description": "Used in the alt tag for the image shown in a full-screen lightbox view" }, "imageCaptionIconAlt": { - "message": "Icon showing that this image has a caption", + "message": "Εικονίδιο που ενδεικνύει ότι αυτή η εικόνα έχει υπότιτλο", "description": "Used for the icon layered on top of an image in message bubbles" }, "addACaption": { @@ -956,17 +1022,9 @@ "description": "Description of the media permission description" }, "general": { - "message": "General", + "message": "Γενικά", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Ενεργοποίηση ορθογραφικού ελέγχου του κειμένου που εισάγεται στο παράθυρο σύνθεσης μηνύματος", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Αυτή η έκδοση του Signal Desktop έχει λήξει. Κάντε αναβάθμιση στην πιο πρόσφατη έκδοση για να συνεχίσετε την ανταλλαγή μηνυμάτων.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Οι παραλήπτες σε Android θα λάβουν μόνο τους πρώτους 2000 χαρακτήρες αυτού του μηνύματος.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Αναβάθμιση", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Σκοτεινό", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Να μην ξεχάσω ", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Απόκρυψη γραμμής μενού", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Έναρξη συνομιλίας...", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Όροι & Πολιτική Απορρήτου", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 1c8fa7e0d5..896892a4e7 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -2,7 +2,26 @@ "privacyPolicy": { "message": "Terms & Privacy Policy", "description": - "Shown in the about box for the link to https://signal.org/legal" + "Shown in the about box for the link to https://getsession.org/privacy-policy/" + }, + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": + "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": + "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": + "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" }, "mainMenuFile": { "message": "&File", @@ -47,7 +66,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -147,6 +166,11 @@ "description": "Only available on development modes, menu option to open up the standalone device setup sequence" }, + "connectingLoad": { + "message": "Connecting To Server", + "description": + "Message shown on the as a loading screen while we are connecting to something" + }, "loading": { "message": "Loading...", "description": @@ -168,6 +192,27 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": + "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": + "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": + "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": + "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": + "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" @@ -220,7 +265,7 @@ "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Loki Messenger", + "message": "Start using Session", "description": "Button shown at end of successful import process, nothing left but a restart" }, @@ -250,6 +295,9 @@ } } }, + "capsLockOn": { + "message": "Caps lock is on." + }, "me": { "message": "Me", "description": "The label for yourself when shown in a group member list" @@ -264,6 +312,11 @@ "description": "Displayed when a user can't send a message because they have left the group" }, + "youGotKickedFromGroup": { + "message": "You were removed from the group", + "description": + "Displayed when a user can't send a message because they have left the group" + }, "scrollDown": { "message": "Scroll to bottom of conversation", "description": @@ -345,6 +398,9 @@ "description": "When there are multiple previously-verified group members with safety number changes, a banner will be shown. The list of contacts with safety number changes is shown, and this text introduces that list." }, + "changedSinceVerifiedTitle": { + "message": "Safety Number Changed" + }, "changedSinceVerifiedMultiple": { "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", @@ -547,7 +603,7 @@ "description": "Name for a voice message attachment" }, "dangerousFileType": { - "message": "Attachment type not allowed for security reasons", + "message": "For security reasons, this file type cannot be sent", "description": "Shown in toast when user attempts to send .exe file, for example" }, @@ -590,25 +646,30 @@ }, "oneNonImageAtATimeToast": { "message": - "When including a non-image attachment, the limit is one attachment per message.", + "Sorry, there is a limit of one non-image attachment per message", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "You cannot mix non-image and image attachments in one message.", + "cannotMixImageAndNonImageAttachments": { + "message": + "Sorry, you cannot mix images with other file types in one message", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { - "message": "You cannot add any more attachments to this message.", + "message": + "Maximum number of attachments reached. Please send remaining attachments in a separate message.", "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Sorry, the selected file exceeds message size restrictions." + "message": "Sorry, the selected attachment is too large" }, "unableToLoadAttachment": { - "message": "Unable to load selected attachment." + "message": "Unable to load attachment." + }, + "connect": { + "message": "Connect" }, "disconnected": { "message": "Disconnected", @@ -663,12 +724,12 @@ "Item under the Help menu, takes you to GitHub new issue form (title case)" }, "signalDesktopPreferences": { - "message": "Loki Messenger Preferences", + "message": "Session Preferences", "description": "Title of the window that pops up with Signal Desktop preferences in it" }, "aboutSignalDesktop": { - "message": "About Loki Messenger", + "message": "About Session", "description": "Item under the Help menu, which opens a small about window" }, "speech": { @@ -688,16 +749,45 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { - "message": "Loki Messenger", - "description": "Tooltip for the tray icon" + "lokiMessenger": { + "message": "Session" }, - "searchForPeopleOrGroups": { - "message": "Enter name or public key", + "search": { + "message": "Search", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { - "message": "Welcome to Loki Messenger" + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversations", + "description": "Shown to separate the types of search results" + }, + "friendsHeader": { + "message": "Friends", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contacts", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Session", + "description": "Shown to separate the types of search results" + }, + "settingsHeader": { + "message": "Settings", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { + "message": "Welcome to Session" }, "selectAContact": { "message": "Select a contact or group to start chatting." @@ -756,6 +846,11 @@ "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Downloading", + "description": + "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": @@ -805,7 +900,7 @@ }, "audioPermissionNeeded": { "message": - "To send audio messages, allow Loki Messenger to access your microphone.", + "To send audio messages, allow Session to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, @@ -834,12 +929,97 @@ "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "cannotUpdateDetail": { + "message": + "Signal Desktop failed to update, but there is a new version available. Please go to https://getsession.org/ and install the new version manually, then either contact support or file a bug about this problem.", + "description": + "Shown if a general error happened while trying to install update package" + }, + "readOnlyVolume": { + "message": + "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": + "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK" }, + "enter": { + "message": "Enter" + }, + "yes": { + "message": "Yes" + }, "cancel": { "message": "Cancel" }, + "copy": { + "message": "Copy" + }, + "skip": { + "message": "Skip" + }, + "close": { + "message": "Close" + }, + "continue": { + "message": "Continue" + }, + "noThankyou": { + "message": "No, thank you" + }, + "noMessagesTitle": { + "message": "You don't have any messages, yet." + }, + "noMessagesSubtitle": { + "message": "Would you like to join Session's public chat?" + }, + "pairNewDevice": { + "message": "Pair New Device" + }, + "devicePairingAccepted": { + "message": "Device Pairing Accepted" + }, + "devicePairingReceived": { + "message": "Device Pairing Received" + }, + "waitingForDeviceToRegister": { + "message": "Waiting for device to register..." + }, + "pairNewDevicePrompt": { + "message": "Scan the QR Code on your secondary device" + }, + "pairedDevices": { + "message": "Paired Devices" + }, + "noPairedDevices": { + "message": "No paired devices" + }, + "allowPairing": { + "message": "Allow Pairing" + }, + "allowPairingWithDevice": { + "message": "Allow pairing with this device?" + }, + "provideDeviceAlias": { + "message": "Please provide an alias for this paired device" + }, + "showPairingWordsTitle": { + "message": "Pairing Secret Words" + }, + "confirmUnpairingTitle": { + "message": "Please confirm you want to unpair the following device:" + }, + "unpairDevice": { + "message": "Unpair Device" + }, + "deviceUnpaired": { + "message": "Device Unpaired" + }, "clear": { "message": "Clear" }, @@ -862,10 +1042,31 @@ "delete": { "message": "Delete" }, + "forwardMessage": { + "message": "Forward", + "description": "Text of Forward Message button" + }, + "deletePublicWarning": { + "message": + "Are you sure? Clicking 'delete' will permanently remove this message for everyone in this channel." + }, + "deleteMultiplePublicWarning": { + "message": + "Are you sure? Clicking 'delete' will permanently remove these messages for everyone in this channel." + }, "deleteWarning": { "message": "Are you sure? Clicking 'delete' will permanently remove this message from this device only." }, + "deleteMultipleWarning": { + "message": + "Are you sure? Clicking 'delete' will permanently remove these messages from this device only." + }, + "messageDeletionForbidden": { + "message": "You don’t have permission to delete others’ messages", + "description": + "Toast message explaining that the user doens't have the rights to delete other people's messages." + }, "deleteThisMessage": { "message": "Delete this message" }, @@ -874,7 +1075,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "To", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -886,19 +1087,33 @@ "description": "Label for the time a message was received" }, "sendMessage": { - "message": "Send a message", + "message": " Type your message", "description": "Placeholder text in the message entry field" }, + "secondaryDeviceDefaultFR": { + "message": "Please accept to enable messages to be synced across devices", + "description": + "Placeholder text in the message entry field when it is disabled because a secondary device conversation is visible" + }, + "sendMessageDisabledSecondary": { + "message": + "This pubkey belongs to a secondary device. You should never see this message", + "description": + "Placeholder text in the message entry field when it is disabled because a secondary device conversation is visible" + }, "sendMessageDisabled": { "message": "Waiting for friend request approval", "description": "Placeholder text in the message entry field when it is disabled while we are waiting for a friend request approval" }, "sendMessageFriendRequest": { - "message": "Hi there! This is !", + "message": "Send your first message", "description": "Placeholder text in the message entry field when it is the first message sent to that contact" }, + "sendMessageLeftGroup": { + "message": "You left this group" + }, "groupMembers": { "message": "Group members" }, @@ -906,12 +1121,12 @@ "message": "Show members" }, "resetSession": { - "message": "Reset session", + "message": "Reset Session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "View safety number" + "message": "View Safety Number" }, "viewAllMedia": { "message": "View all media", @@ -947,17 +1162,50 @@ "description": "Shown on the drop-down menu for an individual message, deletes single message" }, + "messages": { + "message": "Messages", + "description": "Message search result" + }, "deleteMessages": { - "message": "Delete messages", + "message": "Delete Messages", "description": "Menu item for deleting messages, title case." }, + "deletePublicConversationConfirmation": { + "message": + "Permanently delete the messages locally from this public channel?", + "description": + "Confirmation dialog text that asks the user if they really wish to delete the public channel messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + }, "deleteConversationConfirmation": { - "message": "Permanently delete this conversation?", + "message": "Permanently delete the messages in this conversation?", "description": "Confirmation dialog text that asks the user if they really wish to delete the conversation. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." }, + "deletePublicChannel": { + "message": "Leave Channel", + "description": + "Confirmation dialog title that asks the user if they really wish to delete a public channel. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + }, + "deletePublicChannelConfirmation": { + "message": "Leave this Open Group?", + "description": + "Confirmation dialog text that tells the user what will happen if they leave the public channel." + }, + "deleteAccount": { + "message": "Delete Account", + "description": "Text for button in settings view to delete account" + }, + "deleteAccountWarning": { + "message": "Are you sure you want to delete your account?", + "description": "Warning for account deletion in settings view" + }, + "deleteAccountWarningSub": { + "message": + "Delete all history, including all messages, sessions, and contacts. Once deleted, these cannot be restored.", + "description": "Warning for account deletion in settings view" + }, "deleteContact": { - "message": "Delete contact", + "message": "Delete Contact", "description": "Confirmation dialog title that asks the user if they really wish to delete the contact. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." }, @@ -981,6 +1229,19 @@ "description": "This is a past tense, informational message. In other words, your secure session has been reset." }, + "betaDisclaimerTitle": { + "message": "Thanks for using Session!", + "description": "Title for beta disclaimer modal" + }, + "betaDisclaimerSubtitle": { + "message": "This software is still in its beta phase.", + "description": "Subtitle for beta disclaimer modal" + }, + "betaDisclaimerDescription": { + "message": + "While your messages are secured with end-to-end encryption, third parties like your ISP can see who you're talking to while in the beta version. It is also possible that third parties could correlate your public key to your IP address and real identity if they learn your public key.", + "description": "Description for beta disclaimer modal" + }, "quoteThumbnailAlt": { "message": "Thumbnail of image from quoted message", "description": @@ -1030,7 +1291,7 @@ } }, "installWelcome": { - "message": "Welcome to Loki Messenger", + "message": "Welcome to Session", "description": "Welcome title on the install page" }, "installTagline": { @@ -1039,12 +1300,12 @@ "Tagline displayed under 'installWelcome' string on the install page" }, "linkYourPhone": { - "message": "Link your phone to Loki Messenger", + "message": "Link your phone to Session", "description": "Shown on the front page when the application first starst, above the QR code" }, "signalSettings": { - "message": "Loki Messenger Settings", + "message": "Session Settings", "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" }, @@ -1103,36 +1364,45 @@ "message": "Permissions", "description": "Header for permissions section of settings" }, - "mediaPermissionsDescription": { - "message": "Allow access to camera and microphone", - "description": "Description of the media permission description" - }, "general": { "message": "General", "description": "Header for general options on the settings screen" }, - "linkPreviews": { + "linkPreviewsTitle": { "message": "Link Previews", "description": "Option to control creation and send of link previews in setting screen" }, - "linkPreviewsDescription": { + "linkPreviewDescription": { "message": - "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": - "Additional detail provided for Link Previews option in settings screen" + "Link previews supported for Imgur, Instagram, Pinterest, Reddit, and YouTube.", + "description": "Description shown for the Link Preview option " + }, + "linkPreviewsConfirmTitle": { + "message": "Warning" }, - "linkPreviewsSettingDescription": { + "linkPreviewsConfirmMessage": { "message": - "Enable local link previews (Restart for changes to take effect).", - "description": "Description shown for the Link Preview option " + "You will not have full metadata protection when sending or receiving link previews." + }, + + "mediaPermissionsTitle": { + "message": "Microphone and Camera" + }, + "mediaPermissionsDescription": { + "message": "Allow access to camera and microphone", + "description": "Description of the media permission description" + }, + "spellCheckTitle": { + "message": "Spell Check", + "description": "Description of the media permission description" }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, "clearDataHeader": { - "message": "Clear Data", + "message": "Clear All Local Data", "description": "Header in the settings dialog for the section dealing with data deletion" }, @@ -1142,7 +1412,7 @@ "description": "Text describing what the clear data button will do." }, "clearDataButton": { - "message": "Clear data", + "message": "Clear Data", "description": "Button in the settings dialog starting process to delete all data" }, @@ -1170,9 +1440,23 @@ "description": "Header for notification settings" }, "readReceiptSettingDescription": { - "message": "Enable the sending and receiving of read receipts", + "message": + "See and share when messages have been read (enables read receipts in all sessions).", "description": "Description of the read receipts setting" }, + "readReceiptSettingTitle": { + "message": "Read Receipts", + "description": "Title of the read receipts setting" + }, + "typingIndicatorsSettingDescription": { + "message": + "See and share when messages are being typed (applies to all sessions).", + "description": "Description of the typing indicators setting" + }, + "typingIndicatorsSettingTitle": { + "message": "Typing Indicators", + "description": "Title of the typing indicators setting" + }, "messageTTL": { "message": "Message TTL", "description": "Title of the Message TTL setting" @@ -1188,7 +1472,7 @@ "description": "Warning for the time to live setting" }, "notificationSettingsDialog": { - "message": "When messages arrive, display notifications that reveal:", + "message": "When messages arrive, display notifications that reveal...", "description": "Explain the purpose of the notification settings" }, "disableNotifications": { @@ -1196,17 +1480,17 @@ "description": "Label for disabling notifications" }, "nameAndMessage": { - "message": "Both sender name and message", + "message": "Name and content", "description": "Label for setting notifications to display name and message text" }, "noNameOrMessage": { - "message": "Neither name nor message", + "message": "No name or content", "description": "Label for setting notifications to display no name and no message text" }, "nameOnly": { - "message": "Only sender name", + "message": "Name Only", "description": "Label for setting notifications to display sender name only" }, "newMessage": { @@ -1251,15 +1535,15 @@ }, "expiredWarning": { "message": - "This version of Loki Messenger has expired. Please upgrade to the latest version to continue messaging.", + "This version of Session has expired. Please upgrade to the latest version to continue messaging.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { + "clockOutOfSync": { "message": - "Android clients will only receive the first 2000 characters of this message.", + "Your clock is out of sync. Please update your clock and try again.", "description": - "Warning that long messages could not get received completely by Android clients." + "Notifcation that user's clock is out of sync with Loki's servers." }, "upgrade": { "message": "Upgrade", @@ -1370,12 +1654,17 @@ "description": "Timestamp format string for displaying month and day (but not the year) of a date within the current year, ex: use 'MMM D' for 'Aug 8', or 'D MMM' for '8 Aug'." }, + "messageBodyTooLong": { + "message": "Message body is too long.", + "description": "Shown if the user tries to send more than 64kb of text" + }, "unblockToSend": { "message": "Unblock this contact to send a message.", "description": "Brief message shown when trying to message a blocked number" }, "unblockGroupToSend": { - "message": "Unblock this group to send a message.", + "message": + "This group is blocked. Unlock it if you would like to send a message.", "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { @@ -1480,7 +1769,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "changeNickname": { - "message": "Change nickname", + "message": "Change Nickname", "description": "Conversation menu option to change user nickname" }, "clearNickname": { @@ -1621,12 +1910,26 @@ "message": "Dark", "description": "Label text for dark theme" }, - "hideMenuBar": { - "message": "Hide menu bar", + "themeToggleTitle": { + "message": "Light Mode" + }, + "themeToggleDescription": { + "message": "Choose the theme best suited to you" + }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, + "hideMenuBarTitle": { + "message": "Hide Menu Bar", + "description": "Label text for menu bar visibility setting" + }, + "hideMenuBarDescription": { + "message": "Toggle system menu bar visibility", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start New Conversation", "description": "Label underneath number a user enters that is not an existing contact" }, @@ -1691,7 +1994,9 @@ "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "comment": + "Do not add a period here, used as a fragment and will break unit test", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { @@ -1723,6 +2028,28 @@ } } }, + "kickedFromTheGroup": { + "message": "$name$ was removed from the group", + "description": + "Shown in the conversation history when a single person is removed from the group", + "placeholders": { + "name": { + "content": "$1", + "example": "Alice" + } + } + }, + "multipleKickedFromTheGroup": { + "message": "$names$ were removed from the group", + "description": + "Shown in the conversation history when more than one person is removed from the group", + "placeholders": { + "names": { + "content": "$1", + "example": "Alice, Bob" + } + } + }, "friendRequestPending": { "message": "Friend request", "description": @@ -1734,7 +2061,7 @@ "Shown in the conversation history when the user accepts a friend request" }, "friendRequestDeclined": { - "message": "Friend request declined", + "message": "Session request declined", "description": "Shown in the conversation history when the user declines a friend request" }, @@ -1776,10 +2103,10 @@ } }, "blockUser": { - "message": "Block user" + "message": "Block User" }, "unblockUser": { - "message": "Unblock user" + "message": "Unblock User" }, "settingsUnblockHeader": { "message": "Blocked Users", @@ -1794,14 +2121,61 @@ "message": "Note: Your display name will be visible to your contacts", "description": "Shown to the user as a warning about setting display name" }, - "copyPublicKey": { - "message": "Copy public key", + "message": "Copy Public Key", "description": "Button action that the user can click to copy their public keys" }, + "banUser": { + "message": "Ban User", + "description": "Ban user from public chat by public key." + }, + "banUserConfirm": { + "message": "Are you sure you want to ban user?", + "description": "Message shown when confirming user ban." + }, + "userBanned": { + "message": "User banned successfully", + "description": "Toast on succesful user ban." + }, + "userBanFailed": { + "message": "Ban failed!", + "description": "Toast on unsuccesful user ban." + }, + "copyChatId": { + "message": "Copy Chat ID" + }, + "updateGroup": { + "message": "Update Group", + "description": + "Button action that the user can click to rename the group or add a new member" + }, + "leaveGroup": { + "message": "Leave Group", + "description": "Button action that the user can click to leave the group" + }, + "leaveOpenGroup": { + "message": "Leave Open Group", + "description": "Button action that the user can click to leave the group" + }, + "leaveClosedGroup": { + "message": "Leave Closed Group", + "description": "Button action that the user can click to leave the group" + }, + "leaveGroupDialogTitle": { + "message": "Are you sure you want to leave this group?", + "description": + "Title shown to the user to confirm they want to leave the group" + }, + "noContactsForGroup": { + "message": "You don't have any contacts to start a group with." + }, "copiedPublicKey": { - "message": "Copied public key", + "message": "Session ID copied", + "description": "A toast message telling the user that the key was copied" + }, + "copiedChatId": { + "message": "Copied chat ID", "description": "A toast message telling the user that the key was copied" }, "copyMessage": { @@ -1809,36 +2183,143 @@ "description": "Button action that the user can click to copy their public keys" }, + "selectMessage": { + "message": "Select message", + "description": "Button action that the user can click to select the message" + }, "copiedMessage": { - "message": "Copied message text", + "message": "Message text copied", "description": "A toast message telling the user that the message text was copied" }, - "editDisplayName": { - "message": "Edit display name", + "editProfile": { + "message": "Edit Profile", + "description": "Button action that the user can click to edit their profile" + }, + "createGroupDialogTitle": { + "message": "Creating a Private Group Chat", + "description": "Title for the dialog box used to create a new private group" + }, + "updateGroupDialogTitle": { + "message": "Updating a Private Group Chat", "description": - "Button action that the user can click to edit their display name" + "Title for the dialog box used to update an existing private group" + }, + "updatePublicGroupDialogTitle": { + "message": "Updating a Public Chat Channel", + "description": + "Title for the dialog box used to update an existing public chat channel" }, "showSeed": { - "message": "Show seed", + "message": "Show Seed", "description": "Button action that the user can click to view their unique seed" }, - + "yourSessionID": { + "message": "Your Session ID" + }, + "setStatus": { + "message": "Set a status..." + }, + "setAccountPasswordTitle": { + "message": "Set Account Password", + "description": "Prompt for user to set account password in settings view" + }, + "setAccountPasswordDescription": { + "message": + "Require password to unlock Session’s screen. You can still receive message notifications while Screen Lock is enabled. Session’s notification settings allow you to customize information that is displayed", + "description": "Description for set account password setting view" + }, + "changeAccountPasswordTitle": { + "message": "Change Account Password", + "description": "Prompt for user to change account password in settings view" + }, + "changeAccountPasswordDescription": { + "message": "Change your password", + "description": "Description for change account password setting view" + }, + "removeAccountPasswordTitle": { + "message": "Remove Account Password", + "description": "Prompt for user to remove account password in settings view" + }, + "removeAccountPasswordDescription": { + "message": "Remove the password associated with your account", + "description": "Description for remove account password setting view" + }, + "enterPassword": { + "message": "Please enter your password" + }, + "confirmPassword": { + "message": "Confirm password" + }, + "showSeedPasswordRequest": { + "message": "Please enter your password", + "description": "Request for user to enter password to show seed." + }, + "seedSavePromptMain": { + "message": "Please save the seed below in a safe location.", + "description": + "Prompt on seed modal requesting user to save their seed. Line one" + }, + "seedSavePromptAlt": { + "message": + "They can be used to restore your account if you lose access or migrate to a new device.", + "description": + "Prompt on seed modal requesting user to save their seed. Line two" + }, + "QRCodeTitle": { + "message": "View My QR Code", + "description": "Title given to QR Code modal" + }, + "QRCodeDescription": { + "message": + "This is your unique public QR Code.
Other users may scan this in order to begin a conversation with you.", + "description": "Description given to QRCode modal" + }, + "showQRCode": { + "message": "Show QR Code", + "description": "Button action that the user can click to view their QR code" + }, + "showAddServer": { + "message": "Add Public Server", + "description": + "Button action that the user can click to connect to a new public server" + }, + "serverUrl": { + "message": "Server URL", + "description": "Placeholder for server URL input" + }, + "noServerURL": { + "message": "Please enter a server URL", + "description": "Error message when no server url entered" + }, + "addServerDialogTitle": { + "message": "Connect To New Public Server", + "description": + "Title for the dialog box used to connect to a new public server" + }, + "createPrivateGroup": { + "message": "Create Private Group", + "description": + "Button action that the user can click to show a dialog for creating a new private group chat" + }, "seedViewTitle": { "message": "Please save the seed below in a safe location. They can be used to restore your account if you lose access or migrate to a new device.", "description": "The title shown when the user views their seeds" }, - "copiedMnemonic": { - "message": "Copied seed to clipboard", + "message": "Recovery phrase copied successfully", "description": "A toast message telling the user that the mnemonic seed was copied" }, - + "copiedSessionID": { + "message": "Copied Session ID to clipboard", + "description": + "A toast message telling the user that their Session ID was copied" + }, "passwordViewTitle": { - "message": "Type in your password", + "message": "Type In Your Password", "description": "The title shown when user needs to type in a password to unlock the messenger" }, @@ -1850,7 +2331,10 @@ "description": "A button action that the user can click to reset the database" }, - + "password": { + "message": "Password", + "description": "Placeholder for password input" + }, "setPassword": { "message": "Set Password", "description": "Button action that the user can click to set a password" @@ -1863,6 +2347,9 @@ "message": "Remove Password", "description": "Button action that the user can click to remove a password" }, + "maxPasswordAttempts": { + "message": "Invalid Password. Would you like to reset the database?" + }, "typeInOldPassword": { "message": "Please type in your old password" }, @@ -1872,9 +2359,48 @@ "invalidPassword": { "message": "Invalid password" }, + "noGivenPassword": { + "message": "Please enter your password" + }, "passwordsDoNotMatch": { "message": "Passwords do not match" }, + "setPasswordInvalid": { + "message": "Passwords do not match" + }, + "changePasswordInvalid": { + "message": "The old password you entered is incorrect" + }, + "removePasswordInvalid": { + "message": "Incorrect password" + }, + "setPasswordTitle": { + "message": "Set Password" + }, + "changePasswordTitle": { + "message": "Changed Password" + }, + "removePasswordTitle": { + "message": "Removed Password" + }, + "setPasswordToastDescription": { + "message": "Your password has been set. Please keep it safe." + }, + "changePasswordToastDescription": { + "message": "Your password has been changed. Please keep it safe." + }, + "removePasswordToastDescription": { + "message": "You have removed your password." + }, + "publicChatExists": { + "message": "You are already connected to this public channel" + }, + "connectToServerFail": { + "message": "Failed to connect to server. Check URL" + }, + "connectToServerSuccess": { + "message": "Successfully connected to new public chat server" + }, "setPasswordFail": { "message": "Failed to set password" }, @@ -1916,5 +2442,347 @@ }, "remove": { "message": "Remove" + }, + "invalidHexId": { + "message": "Invalid Hex ID", + "description": + "Error string shown when user type an invalid pubkey hex string" + }, + "invalidPubkeyFormat": { + "message": "Invalid Pubkey Format", + "description": "Error string shown when user types an invalid pubkey format" + }, + "conversationsTab": { + "message": "Conversations", + "description": "conversation tab title" + }, + "friendsTab": { + "message": "Friends", + "description": "friend tab title" + }, + "pendingAcceptance": { + "message": "Pending Acceptance", + "description": "Indicates that a friend request is pending" + }, + "notFriends": { + "message": "not friends", + "description": "Indicates that a conversation is not friends with us" + }, + "emptyGroupNameError": { + "message": "Group Name cannot be empty", + "description": "Error message displayed on empty group name" + }, + "emptyProfileNameError": { + "message": "Profile name cannot be empty", + "description": "Error message displayed on empty profile name" + }, + "maxGroupMembersError": { + "message": "Max number of members for small group chats is: " + }, + "nonAdminDeleteMember": { + "message": "Only group admin can remove members!" + }, + "editProfileDialogTitle": { + "message": "Editing Profile" + }, + + "editProfileModalTitle": { + "message": "Profile", + "description": "Title for the Edit Profile modal" + }, + + "profileName": { + "message": "Profile Name" + }, + "groupNamePlaceholder": { + "message": "Group Name" + }, + "inviteFriends": { + "message": "Invite Friends" + }, + "manageModerators": { + "message": "Manage Moderators" + }, + "addModerators": { + "message": "Add Moderators" + }, + "removeModerators": { + "message": "Remove Moderators" + }, + "add": { + "message": "Add" + }, + "groupInvitation": { + "message": "Group Invitation" + }, + "addingFriends": { + "message": "Adding friends to" + }, + "noFriendsToAdd": { + "message": "No friends to add" + }, + "noModeratorsToRemove": { + "message": "no moderators to remove" + }, + "couldNotDecryptMessage": { + "message": "Couldn't decrypt a message" + }, + "confirmSessionRestore": { + "message": + "Would you like to start a new session with $pubkey$? Only do so if you know this pubkey.", + "placeholders": { + "pubkey": { + "content": "$1", + "example": "" + } + } + }, + "createAccount": { + "message": "Create Account" + }, + "signIn": { + "message": "Sign In" + }, + "yourUniqueSessionID": { + "message": "Say hello to your Session ID" + }, + "allUsersAreRandomly...": { + "message": + "Your Session ID is the unique address people can use to contact you on Session. Your Session ID is totally private, anonymous, and has no connection to your real identity." + }, + "getStarted": { + "message": "Get started" + }, + "generateSessionID": { + "message": "Create Session ID" + }, + "mnemonicSeed": { + "message": "Mnemonic Seed" + }, + "enterSeed": { + "message": "Enter Recovery Phrase" + }, + "displayName": { + "message": "Display Name" + }, + "enterDisplayName": { + "message": "Enter a display name" + }, + "optionalPassword": { + "message": "Verify Password" + }, + "enterOptionalPassword": { + "message": "Enter password (optional)" + }, + "verifyPassword": { + "message": "Verify Password" + }, + "devicePairingHeader": { + "message": + "Open Session on your other device and navigate to the Linked Devices section in your user account screen. Select Link a Device to prepare your other device for pairing, then enter your Session ID below to link this device to your Session ID." + }, + "enterSessionIDHere": { + "message": "Enter other device’s Session ID here" + }, + "continueYourSession": { + "message": "Link Device" + }, + "restoreSessionID": { + "message": "Restore Session ID" + }, + "restoreUsingSeed": { + "message": "Restore From Recovery Phrase" + }, + "linkDeviceToExistingAccount": { + "message": "Link Device to Existing Session ID" + }, + "or": { + "message": "or" + }, + "ByUsingThisService...": { + "message": + "By using this service, you agree to our Terms and Conditions and Privacy Statement" + }, + "beginYourSession": { + "message": "Begin
your
Session." + }, + "welcomeToSession": { + "message": "Welcome to Session" + }, + "welcomeToYourSession": { + "message": "Welcome to your Session" + }, + "completeSignUp": { + "message": "Complete Sign Up" + }, + "compose": { + "message": "Compose" + }, + "newSession": { + "message": "New Session" + }, + "searchForAKeyPhrase": { + "message": "Search for a key phrase or contact" + }, + "enterRecipient": { + "message": "Enter Recipient" + }, + "enterSessionID": { + "message": "Enter Session ID" + }, + "pasteSessionIDRecipient": { + "message": "Enter a Session ID" + }, + "usersCanShareTheir...": { + "message": + "Users can share their Session ID from their account settings, or by sharing their QR code." + }, + "searchByIDOrDisplayName": { + "message": "Search by ID # or Display Name" + }, + "message": { + "message": "Message" + }, + "lists": { + "message": "Lists" + }, + "edit": { + "message": "Edit" + }, + "addContact": { + "message": "Add Contact" + }, + "createGroup": { + "message": "Create Group" + }, + "yourPublicKey": { + "message": "Your Session ID" + }, + "accept": { + "message": "Accept" + }, + "decline": { + "message": "Decline" + }, + "appearanceSettingsTitle": { + "message": "Appearance" + }, + "appearanceSettingsDescription": { + "message": "Appearance and interface options" + }, + "accountSettingsTitle": { + "message": "Account" + }, + "accountSettingsDescription": { + "message": "Manage your account" + }, + "permissionSettingsTitle": { + "message": "Permissions" + }, + "permissionSettingsDescription": { + "message": "Set Session's permissions" + }, + "privacySettingsTitle": { + "message": "Privacy" + }, + "privacySettingsDescription": { + "message": "Manage your privacy settings" + }, + "notificationSettingsTitle": { + "message": "Notifications" + }, + "notificationSettingsDescription": { + "message": "Configure notification options" + }, + "devicesSettingsTitle": { + "message": "Devices" + }, + "devicesSettingsDescription": { + "message": "Manage your linked devices" + }, + "mnemonicEmpty": { + "message": "Seed is mandatory" + }, + "displayNameEmpty": { + "message": "Display Name Is Mandatory" + }, + "youHaveFriendRequestFrom": { + "message": "You have friend requests from..." + }, + "members": { + "message": "$count$ members", + "placeholders": { + "count": { + "content": "$1", + "example": "26" + } + } + }, + "channels": { + "message": "Channels" + }, + "groups": { + "message": "Groups" + }, + "addChannel": { + "message": "Join Open Group" + }, + "joinOpenGroup": { + "message": "Join Open Group" + }, + "newClosedGroup": { + "message": "New Closed Group" + }, + "createClosedGroup": { + "message": "Create Closed Group" + }, + "createClosedGroupDescription": { + "message": + "Closed groups are end-to-end encrypted group chats for up to 10 members. They provide the same privacy protections as one-on-one sessions." + }, + "createClosedGroupNamePrompt": { + "message": "Group Name" + }, + "createClosedGroupPlaceholder": { + "message": "Enter a group name" + }, + "closedGroupCreatedToastTitle": { + "message": "Group created successfully" + }, + "enterChannelURL": { + "message": "Enter Open Group URL" + }, + "channelUrlPlaceholder": { + "message": "chat.getsession.org" + }, + "addChannelDescription": { + "message": "Enter an open group URL." + }, + "joinChannel": { + "message": "Join Open Group" + }, + "joinPublicChat": { + "message": "Join Public Chat" + }, + "next": { + "message": "Next" + }, + "description": { + "message": "Description" + }, + "filterReceivedRequests": { + "message": "Filter received requests" + }, + "secretWords": { + "message": "Secret words:" + }, + "pairingDevice": { + "message": "Pairing Device" + }, + "gotPairingRequest": { + "message": "Pairing request received" + }, + "devicePairedSuccessfully": { + "message": "Device linked successfully" } } diff --git a/_locales/eo/messages.json b/_locales/eo/messages.json index 1fba6cb58d..5c8d79e3f2 100644 --- a/_locales/eo/messages.json +++ b/_locales/eo/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopii la eraron kaj eliri", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Nekonata grupo", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Datumbaza eraro", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Forigi ĉiujn datumojn kaj restarti", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Dosiero", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -60,7 +76,7 @@ "description": "Edit menu command to insert text from clipboard at cursor location" }, "editMenuPasteAndMatchStyle": { - "message": "Alglui kaj akordigi je stilo", + "message": "Alglui nur tekston", "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { @@ -108,35 +124,35 @@ "description": "View menu command to make everything smaller" }, "viewMenuToggleFullScreen": { - "message": "Ŝalti/malŝalti plenekranan reĝimon", + "message": "Baskuligi plenekranan reĝimon", "description": "View menu command to enter or leave Full Screen mode" }, "viewMenuToggleDevTools": { - "message": "Ŝalti/malŝalti programistajn ilojn", + "message": "Baskuligi programistajn ilojn", "description": "View menu command to show or hide the developer tools" }, "menuSetupWithImport": { - "message": "Set Up with Import", + "message": "Agordi kun importo", "description": "When the application is not yet set up, menu option to start up the import sequence" }, "menuSetupAsNewDevice": { - "message": "Set Up as New Device", + "message": "Agordi kiel novan aparaton", "description": "When the application is not yet set up, menu option to start up the set up as fresh device" }, "menuSetupAsStandalone": { - "message": "Set Up as Standalone Device", + "message": "Agordi kiel memstaran aparaton", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" }, "loading": { - "message": "Ŝarĝante…", + "message": "Ŝargante…", "description": "Message shown on the loading screen before we've loaded any messages" }, "optimizingApplication": { - "message": "Optimizing application...", + "message": "Optimumigo de la aplikaĵo...", "description": "Message shown on the loading screen while we are doing application optimizations" }, "migratingToSQLCipher": { - "message": "Optimizing messages... $status$ complete.", + "message": "Optimumigo de la mesaĝoj... $status$ plenumitaj.", "description": "Message shown on the loading screen while we are doing application optimizations", "placeholders": { "status": { @@ -145,44 +161,60 @@ } } }, + "archivedConversations": { + "message": "Enarĥivigitaj interparoloj", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Tiuj interparoloj estas enarĥivigitaj kaj aperos en la ricevujo, nur se novaj mesaĝoj riceviĝas.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Enarĥivigi interparolon", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Movi interparolon al la ricevujo", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { - "message": "Elekti dosierejon", + "message": "Elekti dosierujon", "description": "Button to allow the user to find a folder on disk" }, "chooseFile": { - "message": "Choose file", + "message": "Elekti dosieron", "description": "Button to allow the user to find a file on disk" }, "loadDataHeader": { - "message": "Ŝarĝu viajn datumojn", + "message": "Ŝargu viajn datumojn", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "You've just gone through the export process, and your contacts and messages are waiting patiently on your computer. Select the folder that contains your saved Signal data.", + "message": "Vi ĵus plenumis la eksportan procezon, kaj viaj kontaktoj kaj mesaĝoj atendas pacience ĉe via komputilo. Elektu la dosierujon, kiu enhavas viajn konservitajn Signal-datumojn.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { - "message": "Elektu dosierejon je eksportitaj datumoj", + "message": "Elektu dosierujon kun eksportitaj datumoj", "description": "Title of the popup window used to select data previously exported" }, "importErrorHeader": { - "message": "Ho ve! Io eraris!", + "message": "Ho ve! Okazis eraro!", "description": "Header of the error screen after a failed import" }, "importingHeader": { - "message": "Ŝarĝante kontaktojn kaj mesaĝojn", + "message": "Ŝargante kontaktojn kaj mesaĝojn", "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Make sure you have chosen the correct directory that contains your saved Signal data. Its name should begin with 'Signal Export.' You can also save a new copy of your data from the Chrome App.", + "message": "Certigu, ke vi elektis la ĝustan dosierujon, kiu enhavas viajn konservitajn Signal-datumojn. Ties nomo komencu per „Signal Export“. Vi ankaŭ povas konservi novan kopion el viaj datumoj per la aplikaĵo Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { - "message": "If these steps don't work for you, please submit a debug log (View -> Debug Log) so that we can help you get migrated!", + "message": "Se tiuj paŝoj ne funkcias, bv. sendi sencimigan protokolon (Vidi → Sencimiga protokolo), por ke ni helpu vin kun la transirado!", "description": "Message shown if the import went wrong; second paragraph" }, "importAgain": { - "message": "Elektu dosierejon kaj klopodu denove", + "message": "Elektu dosierujon kaj reprovu", "description": "Button shown if the user runs into an error during import, allowing them to start over" }, "importCompleteHeader": { @@ -202,11 +234,11 @@ "description": "Message shown as the export location if we didn't capture the target directory" }, "upgradingDatabase": { - "message": "Upgrading database. This may take some time...", + "message": "Ĝisdatigo de la datumbazo. Tio povas daŭri...", "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" }, "loadingMessages": { - "message": "Ŝarĝante mesaĝojn. Jam $count$…", + "message": "Ŝargante mesaĝojn. $count$ ĝis nun…", "description": "Message shown on the loading screen when we're catching up on the backlog of messages", "placeholders": { "count": { @@ -228,11 +260,11 @@ "description": "Displayed when a user can't send a message because they have left the group" }, "scrollDown": { - "message": "Scroll to bottom of conversation", + "message": "Rulumi al interparola malsupro", "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" }, "messageBelow": { - "message": "Novaj mesaĝo suben", + "message": "Nova mesaĝo suben", "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" }, "messagesBelow": { @@ -244,7 +276,7 @@ "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ nelegata mesaĝoj", + "message": "$count$ nelegataj mesaĝoj", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -254,7 +286,7 @@ } }, "youMarkedAsVerified": { - "message": "Vi markis la sekurnumero de $name$ kontrolita.", + "message": "Vi markis vian sekurigan numeron kun $name$ konfirmita.", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -264,7 +296,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Vi markis la sekurnumero de $name$ nekontrolita.", + "message": "Vi markis vian sekurigan numeron kun $name$ kiel nekonfirmita.", "description": "Shown in the conversation history when the user marks a contact as not verified, whether on the Safety Number screen or by dismissing a banner or dialog.", "placeholders": { "name": { @@ -274,7 +306,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Vi markis la sekurnumero de $name$ kontrolita de alia aparato.", + "message": "Vi markis, el alia aparato, vian sekurigan numeron kun $name$ kiel konfirmita.", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -284,7 +316,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Vi markis la sekurnumero de $name$ nekontrolita de alia aparato.", + "message": "Vi markis, el alia aparato, vian sekurigan numeron kun $name$ kiel nekonfirmita.", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -294,15 +326,15 @@ } }, "membersNeedingVerification": { - "message": "Your safety numbers with these group members have changed since you last verified. Click a group member to see your new safety number with them.", + "message": "Viaj sekurigaj numeroj kun tiuj grupanoj ŝanĝigis de post via lasta kontrolo. Alklaku grupanon por vidi la novan sekurigan numeron kun li aŭ ŝi.", "description": "When there are multiple previously-verified group members with safety number changes, a banner will be shown. The list of contacts with safety number changes is shown, and this text introduces that list." }, "changedSinceVerifiedMultiple": { - "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Viaj sekurigaj numeroj kun pluraj grupanoj ŝanĝiĝis de post via lasta kontrolo. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke ili simple reinstalis Signal-on.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "La sekurnumero de $name$ ŝanĝigis post kiam vi laste kontrolis ĝin. Tio eble signifas, ke oni klopodas forkapti viajn komunikaĵojn aŭ $name$ nur denove instalis Signal-on.", + "message": "La sekuriga numero de $name$ ŝanĝiĝis post kiam vi laste kontrolis ĝin. Tio eble signifas, ke oni klopodas forkapti viajn komunikaĵojn, aŭ ke $name$ nur denove instalis Signal-on.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -312,7 +344,7 @@ } }, "changedRightAfterVerify": { - "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "La sekuriga numero, kiun vi kontrolas, ŝanĝiĝis. Bv. kontroli vian sekurigan numeron kun $name$. Atentu, ke tiu ŝanĝo eble signifas, ke iu klopodas forkapti viajn komunikojn, aŭ ke $name$ simple re-instalis Signal-on.", "description": "Shown on the safety number screen when the user has selected to verify/unverify a contact's safety number, and we immediately discover a safety number change", "placeholders": { "name": { @@ -322,11 +354,11 @@ } }, "changedRecentlyMultiple": { - "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Viaj sekurigaj numeroj kun pluraj grupanoj ŝanĝiĝis antaŭnelonge. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke ili simple reinstalis Signal-on.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Via sekuriga numero kun $name$ ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke $name$ simple reinstalis Signal-on.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -336,7 +368,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal. You may wish to verify your saftey number with this contact.", + "message": "Via sekuriga numero kun $name$ ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke $name$ simple reinstalis Signal-on. Vi certe volos kontroli la sekurigan numeron kun tiu ĉi kontakto.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -346,11 +378,11 @@ } }, "sendAnyway": { - "message": "Ĉu ankoraŭ sendu", + "message": "Tamen sendi", "description": "Used on a warning dialog to make it clear that it might be risky to send the message." }, "noLongerVerified": { - "message": "Your safety number with $name$ has changed and is no longer verified. Click to show.", + "message": "Via sekuriga numero kun $name$ ŝanĝiĝis kaj ne plu estas konfirmita. Alklaku por montri ĝin.", "description": "Shown in converation banner when user's safety number has changed, but they were previously verified.", "placeholders": { "name": { @@ -360,15 +392,15 @@ } }, "multipleNoLongerVerified": { - "message": "Your safety numbers with multiple members of this group have changed and are no longer verified. Click to show.", + "message": "Viaj sekurigaj numeroj kun pluraj anoj el tiu grupo ŝanĝiĝis kaj ne plu estas konfirmita. Alklaku por montri ilin.", "description": "Shown in conversation banner when more than one group member's safety number has changed, but they were previously verified." }, "debugLogExplanation": { - "message": "This log will be posted publicly online for contributors to view. You may examine and edit it before submitting.", + "message": "Tiu protokolo estos afiŝita publike en la reto, por ke kontribuantoj vidu ĝin; vi povas revizii ĝin antaŭ ol sendi ĝin.", "description": "" }, "debugLogError": { - "message": "Something went wrong with the upload! Please consider manually adding your log to the bug you file.", + "message": "Eraro dum la alŝuto! Bv. konsideri mane aldoni la protokolo, al problemo, kiun vi raportas.", "description": "" }, "reportIssue": { @@ -380,7 +412,7 @@ "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { - "message": "Proponi", + "message": "Sendi", "description": "" }, "acceptNewKey": { @@ -388,15 +420,15 @@ "description": "Label for a button to accept a new safety number" }, "verify": { - "message": "Marki kontrolita", + "message": "Marki konfirmita", "description": "" }, "unverify": { - "message": "Marki nekontrolita", + "message": "Marki nekonfirmita", "description": "" }, "isVerified": { - "message": "Vi jam kontrolis la sekurnumeron de $name$.", + "message": "Vi jam konfirmis la sekurigan numeron kun $name$.", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -406,7 +438,7 @@ } }, "isNotVerified": { - "message": "Vi ne jam kontrolis la sekurnumeron de $name$.", + "message": "Vi ankoraŭ ne konfirmis la sekurigan numeron kun $name$.", "description": "Summary state shown at top of the safety number screen if user has not verified contact.", "placeholders": { "name": { @@ -416,27 +448,27 @@ } }, "verified": { - "message": "Kontrolita", + "message": "Konfirmita", "description": "" }, "newIdentity": { - "message": "Nova sekurnumero", + "message": "Nova sekuriga numero", "description": "Header for a key change dialog" }, "identityChanged": { - "message": "Your safety number with this contact has changed. This could either mean that someone is trying to intercept your communication, or this contact simply reinstalled Signal. You may wish to verify the new safety number below.", + "message": "Via sekuriga numero kun tiu ĉi kontakto ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke tiu kontakto simple reinstalis Signal-on. Vi certe volos kontroli la novan sekurigan numeron ĉi-suban.", "description": "" }, "incomingError": { - "message": "Okazis eraron ricevante mesaĝon", + "message": "Okazis eraro dum ricevo de mesaĝo", "description": "" }, "media": { - "message": "Enmetitaĵoj", + "message": "Aŭdvidaĵo", "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "You don’t have any media in this conversation", + "message": "Vi havas neniun aŭdvidaĵon en tiu interparolo", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -444,7 +476,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "You don’t have any documents in this conversation", + "message": "Vi havas neniun dokumenton en tiu interparolo", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -456,15 +488,15 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Ĉi-semajnon", + "message": "Ĉisemajne", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Ĉi-monaton", + "message": "Ĉimonate", "description": "Section header in the media gallery" }, "unsupportedAttachment": { - "message": "Unsupported attachment type. Click to save.", + "message": "Nesubtenata tipo de kunsendaĵo. Alklaku por konservi ĝin.", "description": "Displayed for incoming unsupported attachment" }, "clickToSave": { @@ -472,23 +504,23 @@ "description": "Hover text for attachment filenames" }, "unnamedFile": { - "message": "Nenomita dosiero", + "message": "Sennoma dosiero", "description": "Hover text for attachment filenames" }, "voiceMessage": { - "message": "Voĉmesaĝo", + "message": "Voĉa mesaĝo", "description": "Name for a voice message attachment" }, "dangerousFileType": { - "message": "Attachment type not allowed for security reasons", + "message": "Kunsendaĵa tipo ne permesata por sekurecaj kialoj", "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "Ŝargante antaŭrigardon...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "Preparante miniaturan antaŭrigardon de ligilo pri $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "Miniatura antaŭrigardo de ligilo pri $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "Preparante bildan kunsendaĵon: $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -518,23 +550,23 @@ } }, "oneNonImageAtATimeToast": { - "message": "When including a non-image attachment, the limit is one attachment per message.", + "message": "Kiam oni enmetas nebildan kunsendaĵon, limo estas po unu kunsendaĵo mesaĝe.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "You cannot mix non-image and image attachments in one message.", + "cannotMixImageAndNonImageAttachments": { + "message": "Vi ne povas kunmeti nebildajn kaj bildajn kunsendaĵojn en unu mesaĝo.", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { - "message": "You cannot add any more attachments to this message.", + "message": "Ne plu eblas aldoni kunsendaĵojn al tiu mesaĝo.", "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Bedaŭrinde, la elektita dosiero tro grandas.", + "message": "Bedaŭrinde, la elektita dosiero transpasas limigon pri grandeco de mesaĝo.", "description": "" }, "unableToLoadAttachment": { - "message": "Unable to load selected attachment.", + "message": "Ne eblas ŝargi la elektitan kunsendaĵon.", "description": "" }, "disconnected": { @@ -542,7 +574,7 @@ "description": "Displayed when the desktop client cannot connect to the server." }, "connecting": { - "message": "Konektigante", + "message": "Konektante", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -550,11 +582,11 @@ "description": "Displayed when the desktop client has no network connection." }, "checkNetworkConnection": { - "message": "Check your network connection.", + "message": "Kontrolu vian retkonekton.", "description": "Obvious instructions for when a user's computer loses its network connection" }, "attemptingReconnection": { - "message": "Attempting reconnect in $reconnect_duration_in_seconds$ seconds", + "message": "Provo rekonekti post $reconnect_duration_in_seconds$ sekundoj", "description": "", "placeholders": { "reconnect_duration_in_seconds": { @@ -611,16 +643,38 @@ "message": "Fini", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Entajpu nomon aŭ numeron", + "search": { + "message": "Serĉi", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { - "message": "Bonvenu al Signal", + "noSearchResults": { + "message": "Neniu rezulto pri „$searchTerm$“", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Interparoloj", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontaktaro", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Mesaĝoj", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { + "message": "Bonvenon al Signal", "description": "" }, "selectAContact": { @@ -628,11 +682,11 @@ "description": "" }, "typingAlt": { - "message": "Typing animation for this conversation", + "message": "Tajp-indikiloj por tiu interparolo", "description": "Used as the 'title' attibute for the typing animation" }, "contactAvatarAlt": { - "message": "Avatar for contact $name$", + "message": "Avataro el kontakto $name$", "description": "Used in the alt tag for the image avatar of a contact", "placeholders": { "name": { @@ -670,15 +724,19 @@ "description": "Generic label shown if contact address has custom type but no label" }, "poBox": { - "message": "poŝtoficeja skatalo", + "message": "abonkesto", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Elŝutado", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { - "message": "Download Attachment", + "message": "Elŝuti kunsendaĵon", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" }, "replyToMessage": { - "message": "Respondi al la mesaĝon", + "message": "Respondi al la mesaĝo", "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { @@ -690,11 +748,11 @@ "description": "Shown in toast if user clicks on quote that references message no longer in database" }, "messageFoundButNotLoaded": { - "message": "Original message found, but not loaded. Scroll up to load it.", + "message": "Origina mesaĝo trovebla sed ne ŝargita. Rulumu supren por ŝargi ĝin.", "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" }, "voiceNoteMustBeOnlyAttachment": { - "message": "A voice note must be the only attachment included in a message.", + "message": "Voĉa noto estu la sola kunsendaĵo en mesaĝo.", "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { @@ -702,7 +760,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "replyingTo": { - "message": "Respondante al $name$", + "message": "Respondo al $name$", "description": "Shown in iOS theme when you or someone quotes to a message which is not from you", "placeholders": { "name": { @@ -712,11 +770,11 @@ } }, "audioPermissionNeeded": { - "message": "Por sendi sonmesaĝojn, permesu Signal Desktop-on uzi la mikrofonon.", + "message": "Por sendi aŭdajn mesaĝojn, donu al Signal Desktop permeson uzi vian mikrofonon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { - "message": "Permisi", + "message": "Permesi", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, "showSettings": { @@ -728,13 +786,21 @@ "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" }, "video": { - "message": "Filmeto", + "message": "Videaĵo", "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video" }, "photo": { "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Bone", "description": "" @@ -744,7 +810,7 @@ "description": "" }, "failedToSend": { - "message": "Malsukcesis sendi al iom da ricevontoj. Kontrolu la retkonekton.", + "message": "Malsukcesis sendi al iuj ricevontoj. Kontrolu la retkonekton.", "description": "" }, "error": { @@ -760,7 +826,7 @@ "description": "" }, "deleteWarning": { - "message": "Ĉu vi certas? Se vi alklakus 'forigi', la mesaĝo neŝanĝeble forigos nur de ĉi tiu aparato.", + "message": "Ĉu vi pricertas? Per alklako de „Forigi“, tiu mesaĝo porĉiame foriĝos nur de ĉi tiu aparato.", "description": "" }, "deleteThisMessage": { @@ -768,11 +834,11 @@ "description": "" }, "from": { - "message": "De", + "message": "El", "description": "Label for the sender of a message" }, "to": { - "message": "Al", + "message": "al", "description": "Label for the receiver of a message" }, "sent": { @@ -784,7 +850,7 @@ "description": "Label for the time a message was received" }, "sendMessage": { - "message": "Sendu mesaĝon", + "message": "Sendi mesaĝon", "description": "Placeholder text in the message entry field" }, "groupMembers": { @@ -796,19 +862,19 @@ "description": "" }, "resetSession": { - "message": "Forviŝi sesion", + "message": "Forviŝi seancon", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Montri sekurnumeron", + "message": "Montri sekurigan numeron", "description": "" }, "viewAllMedia": { - "message": "Montri ĉiujn enmetaĵojn", + "message": "Montru ĉiujn aŭdvidaĵojn", "description": "This is a menu item for viewing all media (images + video) in a conversation, using the imperative case, as in a command." }, "verifyHelp": { - "message": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", + "message": "Se vi volas kontroli la sekurecon de via tutvoja ĉifrado kun $name$, komparu la ĉi-superajn nombrojn kun la nombroj el lia aŭ ŝia aparato.", "description": "", "placeholders": { "name": { @@ -818,15 +884,15 @@ } }, "theirIdentityUnknown": { - "message": "Vi ne jam interŝanĝis mesaĝojn de tiu ĉi kontakto. La sekurnumero de tiu disponeblos post la unua mesaĝo.", + "message": "Vi ankoraŭ ne interŝanĝis mesaĝojn kun tiu ĉi kontakto. La sekuriga numero nur disponeblos post la unua mesaĝo.", "description": "" }, "moreInfo": { - "message": "Pli da inforomoj…", + "message": "Pli da informoj…", "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" }, "retrySend": { - "message": "Klopodi denove sendi", + "message": "Klopodi resendi", "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send" }, "deleteMessage": { @@ -838,35 +904,35 @@ "description": "Menu item for deleting messages, title case." }, "deleteConversationConfirmation": { - "message": "Senŝanĝeble forigi tiun ĉi konversacion?", + "message": "Ĉu porĉiame forigi tiun ĉi tutan interparolon?", "description": "Confirmation dialog text that asks the user if they really wish to delete the conversation. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." }, "sessionEnded": { - "message": "Oni forviŝis la sekura sesio", + "message": "Sekura seanco restariĝis", "description": "This is a past tense, informational message. In other words, your secure session has been reset." }, "quoteThumbnailAlt": { - "message": "Thumbnail of image from quoted message", + "message": "Bildominiaturo el citita mesaĝo", "description": "Used in alt tag of thumbnail images inside of an embedded message quote" }, "imageAttachmentAlt": { - "message": "Enmetigita bildo", + "message": "Bildo kunsendita kun la mesaĝo", "description": "Used in alt tag of image attachment" }, "videoAttachmentAlt": { - "message": "Enmetigita ekrankopio de filmeto", + "message": "Ekrankopio de videaĵo kunsendita kun la mesaĝo", "description": "Used in alt tag of video attachment preview" }, "lightboxImageAlt": { - "message": "Sendita bildo", + "message": "Bildo sendita en interparolo", "description": "Used in the alt tag for the image shown in a full-screen lightbox view" }, "imageCaptionIconAlt": { - "message": "Icon showing that this image has a caption", + "message": "Piktogramo montranta, ke tiu bildo havas priskribon", "description": "Used for the icon layered on top of an image in message bubbles" }, "addACaption": { - "message": "Aldoni klarigon...", + "message": "Aldoni priskribon...", "description": "" }, "save": { @@ -874,11 +940,11 @@ "description": "" }, "fileIconAlt": { - "message": "File icon", + "message": "Dosierpiktogramo", "description": "Used in the media gallery documents tab to visually represent a file" }, "emojiAlt": { - "message": "Emoji image of '$title$'", + "message": "Emoĝibildo de „$title$“", "description": "Used in the alt tag of all emoji images", "placeholders": { "title": { @@ -888,11 +954,11 @@ } }, "installWelcome": { - "message": "Bonvenu al Signal Desktop", + "message": "Bonvenon al Signal Desktop", "description": "Welcome title on the install page" }, "installTagline": { - "message": "Privateco eblas. Signal faras tion facila.", + "message": "Privateco eblas. Signal tion faciligas.", "description": "Tagline displayed under 'installWelcome' string on the install page" }, "linkYourPhone": { @@ -908,7 +974,7 @@ "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" }, "plusButton": { - "message": "'+' butono", + "message": "Butono „+“", "description": "The button used in Signal Android to add a new linked device" }, "linkNewDevice": { @@ -928,7 +994,7 @@ "description": "The text on the button to finish the linking process, after choosing the device name" }, "initialSync": { - "message": "Akordigante kontaktojn kaj grupojn", + "message": "Sinkronigo de kontaktoj kaj grupoj", "description": "Shown during initial link while contacts and groups are being pulled from mobile device" }, "installConnectionFailed": { @@ -936,7 +1002,7 @@ "description": "Displayed when we can't connect to the server." }, "installTooManyDevices": { - "message": "Sorry, you have too many devices linked already. Try removing some.", + "message": "Bedaŭrinde, vi havas tro da ligitaj aparatoj. Provu malligi kelkajn.", "description": "" }, "settings": { @@ -944,31 +1010,23 @@ "description": "Menu item and header for global settings" }, "theme": { - "message": "Theme", + "message": "Etoso", "description": "Header for theme settings" }, "permissions": { - "message": "Permisoj", + "message": "Permesoj", "description": "Header for permissions section of settings" }, "mediaPermissionsDescription": { - "message": "Allow access to camera and microphone", + "message": "Permesi aliron al la fotilo kaj la mikrofono", "description": "Description of the media permission description" }, "general": { - "message": "General", + "message": "Ĝenerala", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { - "message": "Ŝalti literumkontrolo de teksto entajpita en mesaĝa verkejo", + "message": "Ŝalti literumilon de teksto entajpita en mesaĝa verkejo", "description": "Description of the media permission description" }, "clearDataHeader": { @@ -976,7 +1034,7 @@ "description": "Header in the settings dialog for the section dealing with data deletion" }, "clearDataExplanation": { - "message": "Tiun ĉi forviŝus ĉiujn datumojn en la programo, forigante ĉiujn mesaĝojn kaj konservitajn kontinformojn", + "message": "Tio forviŝos ĉiujn datumojn en la programo, forigante ĉiujn mesaĝojn kaj konservitajn kontinformojn.", "description": "Text describing what the clear data button will do." }, "clearDataButton": { @@ -988,7 +1046,7 @@ "description": "Header of the full-screen delete data confirmation screen" }, "deleteAllDataBody": { - "message": "You are about to delete all of this application's saved account information, including all contacts and all messages. You can always link with your mobile device again, but that will not restore deleted messages.", + "message": "Vi estas forigonta ĉiujn kontajn informojn el tiu ĉi aplikaĵo, inkluzive de ĉiuj kontaktoj kaj ĉiuj mesaĝoj. Vi povos re-ligi vian porteblan aparaton, sed tio ne restaŭros forigitajn mesaĝojn.", "description": "Text describing what exactly will happen if the user clicks the button to delete all data" }, "deleteAllDataButton": { @@ -1004,7 +1062,7 @@ "description": "Header for notification settings" }, "notificationSettingsDialog": { - "message": "Kiam mesaĝoj alvenas, montru sciigojn, kiuj malkaŝas:", + "message": "Kiam mesaĝoj alvenas, montri sciigojn, kiuj malkaŝas:", "description": "Explain the purpose of the notification settings" }, "disableNotifications": { @@ -1012,7 +1070,7 @@ "description": "Label for disabling notifications" }, "nameAndMessage": { - "message": "Ambaŭ la nomon de la sendanto kaj la mesaĝon", + "message": "Ambaŭ sendanto-nomon kaj mesaĝon", "description": "Label for setting notifications to display name and message text" }, "noNameOrMessage": { @@ -1020,7 +1078,7 @@ "description": "Label for setting notifications to display no name and no message text" }, "nameOnly": { - "message": "Nur la nomon de la sendanto", + "message": "Nur la sendanto-nomon", "description": "Label for setting notifications to display sender name only" }, "newMessage": { @@ -1056,17 +1114,13 @@ "description": "Hides the details of a key change" }, "learnMore": { - "message": "Learn more about verifying safety numbers", + "message": "Lernu pli pri kontrolo de sekurigaj numeroj", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { "message": "Tiu ĉi versio de Signal Desktop jam nevalidas. Bonvolu ĝisdatigi al la nuna versio por daŭrigi sendi mesaĝojn.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android clients will only receive the first 2000 characters of this message.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Ĝisdatigi", "description": "Label text for button to upgrade the app to the latest version" @@ -1084,7 +1138,7 @@ "description": "Label for contact and group sync settings" }, "syncExplanation": { - "message": "Import all Signal groups and contacts from your mobile device.", + "message": "Importi ĉiujn Signal-grupojn kaj kontaktojn el via portebla aparato.", "description": "Explanatory text for sync settings" }, "lastSynced": { @@ -1100,7 +1154,7 @@ "description": "Label for a disabled sync button while sync is in progress." }, "syncFailed": { - "message": "Import failed. Make sure your computer and your phone are connected to the internet.", + "message": "Importado malsukcesis. Certigu, ke viaj komputilo kaj telefono estas konektitaj al la interreto.", "description": "Informational text displayed if a sync operation times out." }, "timestamp_s": { @@ -1108,15 +1162,15 @@ "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { - "message": "1 minuton", + "message": "1 minuton", "description": "Brief timestamp for messages sent about one minute ago. Displayed in the conversation list and message bubble." }, "timestamp_h": { - "message": "1 horon", + "message": "1 horon", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, "hoursAgoShort": { - "message": "$hours$ hr", + "message": "$hours$ h", "description": "Even further contracted form of 'X hours ago' which works both for singular and plural, used in the left pane", "placeholders": { "hours": { @@ -1126,7 +1180,7 @@ } }, "hoursAgo": { - "message": "antaŭ $hours$ hr", + "message": "antaŭ $hours$ h", "description": "Contracted form of 'X hours ago' which works both for singular and plural", "placeholders": { "hours": { @@ -1136,7 +1190,7 @@ } }, "minutesAgoShort": { - "message": "$minutes$ min", + "message": "$minutes$ min", "description": "Even further contracted form of 'X minutes ago' which works both for singular and plural, used in the left pane", "placeholders": { "minutes": { @@ -1146,7 +1200,7 @@ } }, "minutesAgo": { - "message": "antaŭ $minutes$ min", + "message": "antaŭ $minutes$ min", "description": "Contracted form of 'X minutes ago' which works both for singular and plural", "placeholders": { "minutes": { @@ -1160,19 +1214,19 @@ "description": "Shown if a message is very recent, less than 60 seconds old" }, "timestampFormat_M": { - "message": "MMM T", + "message": "D MMM", "description": "Timestamp format string for displaying month and day (but not the year) of a date within the current year, ex: use 'MMM D' for 'Aug 8', or 'D MMM' for '8 Aug'." }, "unblockToSend": { - "message": "Unblock this contact to send a message.", + "message": "Malbloki tiun kontakton por sendi mesaĝon.", "description": "Brief message shown when trying to message a blocked number" }, "unblockGroupToSend": { - "message": "Unblock this group to send a message.", + "message": "Malbloki tiun grupon por sendi mesaĝon.", "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "You set the disappearing message timer to $time$", + "message": "Vi agordis la malaperon de la memviŝontaj mesaĝoj al $time$", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1182,7 +1236,7 @@ } }, "timerSetOnSync": { - "message": "Updated disappearing message timer to $time$", + "message": "Ĝisdatiĝis la malapero de la memviŝontaj mesaĝoj al $time$", "description": "Message displayed when timer is set on initial link of desktop device.", "placeholders": { "time": { @@ -1192,7 +1246,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ set the disappearing message timer to $time$", + "message": "$name$ agordis la malaperon de la memviŝontaj mesaĝoj al $time$", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1210,47 +1264,47 @@ "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { - "message": "5 sekundojn", + "message": "5 sekundojn", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_10_seconds": { - "message": "10 sekundojn", + "message": "10 sekundojn", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_30_seconds": { - "message": "30 sekundojn", + "message": "30 sekundojn", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_1_minute": { - "message": "1 minuton", + "message": "1 minuton", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_5_minutes": { - "message": "5 minutojn", + "message": "5 minutojn", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_30_minutes": { - "message": "30 minutojn", + "message": "30 minutojn", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_1_hour": { - "message": "1 horon", + "message": "1 horon", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_6_hours": { - "message": "6 horojn", + "message": "6 horojn", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_12_hours": { - "message": "12 horojn", + "message": "12 horojn", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_1_day": { - "message": "1 tagon", + "message": "1 tagon", "description": "Label for a selectable option in the message expiration timer menu" }, "timerOption_1_week": { - "message": "1 semajnon", + "message": "1 semajnon", "description": "Label for a selectable option in the message expiration timer menu" }, "disappearingMessages": { @@ -1306,7 +1360,7 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Memviŝontaj mesaĝoj malŝaltita", + "message": "Memviŝontaj mesaĝoj malŝaltitaj", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { @@ -1324,7 +1378,7 @@ "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Timer set to $time$", + "message": "Malapero de la memviŝontaj mesaĝoj post $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1334,15 +1388,15 @@ } }, "audioNotificationDescription": { - "message": "Play audio notification", + "message": "Ludi sonan sciigon", "description": "Description for audio notification setting" }, "safetyNumberChanged": { - "message": "Sekurnumero ŝanĝiĝis", + "message": "Sekuriga numero ŝanĝiĝis", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Sekurnumero de $name$ ŝanĝiĝis", + "message": "Sekuriga numero kun $name$ ŝanĝiĝis", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1352,11 +1406,11 @@ } }, "verifyNewNumber": { - "message": "Montri sekurnumeron", + "message": "Kontroli sekurigan numeron", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { - "message": "La sekurnumero de $name$:", + "message": "Via sekuriga numero kun $name$:", "description": "Heading for safety number view", "placeholders": { "name": { @@ -1373,12 +1427,16 @@ "message": "Malhela", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Noto al mi mem", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { - "message": "Hide menu bar", + "message": "Kaŝi la menubreton", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Komenci konversacion…", + "message": "Krei novan interparolon...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1390,7 +1448,7 @@ "description": "When a person inputs a number that is invalid" }, "unlinkedWarning": { - "message": "Denove ligu Signal Desktop-on al la portebla aparato por daŭrigi sendadi mesaĝojn", + "message": "Re-ligi aplikaĵon Signal Desktop al via portebla aparato por daŭrigi mesaĝadon.", "description": "" }, "unlinked": { @@ -1398,7 +1456,7 @@ "description": "" }, "relink": { - "message": "Refoje ligi", + "message": "Re-ligi", "description": "" }, "autoUpdateNewVersionTitle": { @@ -1410,11 +1468,11 @@ "description": "" }, "autoUpdateNewVersionInstructions": { - "message": "Premu 'Reŝarĝi Signal-on' por ĝisdatumigi.", + "message": "Premu „Restartigi Signal-on“ por ĝisdatigi.", "description": "" }, "autoUpdateRestartButtonLabel": { - "message": "Reŝalti Signal-on", + "message": "Restartigi Signal-on", "description": "" }, "autoUpdateLaterButtonLabel": { @@ -1422,7 +1480,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ lasis la grupon", + "message": "$name$ forlasis la grupon", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1432,7 +1490,7 @@ } }, "multipleLeftTheGroup": { - "message": "$name$ lasis la grupon", + "message": "$name$ forlasis la grupon", "description": "Shown in the conversation history when multiple people leave the group", "placeholders": { "name": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Titolo nun estas '$name$'", + "message": "Titolo nun estas „$name$“", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1456,7 +1514,7 @@ } }, "joinedTheGroup": { - "message": "$name$ aliĝis la grupon", + "message": "$name$ grupaniĝis", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1466,7 +1524,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ aliĝis la grupon", + "message": "$names$ grupaniĝis", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/es/messages.json b/_locales/es/messages.json index 54e5ba1099..bf33c4d97c 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copiar fallo y cerrar Signal", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Grupo sin nombre", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Fallo en la base de datos", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Borrar todos los datos y reiniciar", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Archivo", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Chats archivados", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Estos chats están archivados y sólo aparecerán en el buzón de entrada si recibes nuevos mensajes.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archivar chat", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Devolver chat al buzón de entrada", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Seleccionar carpeta", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Al incluír un adjunto que no es una imagen, el límite es un adjunto por mensaje.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "No se pueden combinar adjuntos de otro tipo junto a imágenes.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Cerrar", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Introducir nombre o número", + "search": { + "message": "Buscar", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Sin resultados para «$searchTerm$»", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Chats", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contactos", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Mensajes", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Bienvenida a Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "apdo. de correos", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Descargando", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Descargar adjunto", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Aceptar", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "A", + "message": "para", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "General", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Enviar previsualización", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Al activar, las previsualizaciones de enlaces de Imgur, Instagram, Reddit y YouTube se envian automáticamente.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Comprobar la ortografía al escribir el mensaje", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Esta versión de Signal Desktop ha caducado. Por favor, actualiza a la última versión para seguir enviando mensajes.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Contactos con un teléfono Android solo recibirán los primeros 2000 caracteres de este mensaje.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Actualizar", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Oscuro", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Notas personales", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Ocultar barra de menú", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Iniciar chat ...", + "message": "Comienza con un chat ...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Términos y política de privacidad", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/es_419/messages.json b/_locales/es_419/messages.json index 7c71670946..fddcf20eac 100644 --- a/_locales/es_419/messages.json +++ b/_locales/es_419/messages.json @@ -36,7 +36,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -565,7 +565,7 @@ "message": "Enter name or number", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "welcomeToSession": { "message": "Bienvenido a Signal", "description": "" }, @@ -1368,7 +1368,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1396,9 +1396,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/et/messages.json b/_locales/et/messages.json index cb9888493a..ac83ec863a 100644 --- a/_locales/et/messages.json +++ b/_locales/et/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Fail", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Arhiveeritud vestlused", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Need vestlused on arhiveeritud ja ilmuvad sisendkausta, kui saabub uusi sõnumeid.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Vali kaust", "description": "Button to allow the user to find a folder on disk" @@ -484,11 +516,11 @@ "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "Eelvaate laadimine...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "Lingi eelvaate pisipildi mustand: $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "Lingi eelvaate pisipilt: $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "Piltmanuse mustand: $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -518,15 +550,15 @@ } }, "oneNonImageAtATimeToast": { - "message": "When including a non-image attachment, the limit is one attachment per message.", + "message": "Mittepildilisi manuseid sõnumile lisades kehtiv ühe manuse piirang.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "You cannot mix non-image and image attachments in one message.", + "cannotMixImageAndNonImageAttachments": { + "message": "Piltmanuseid ja teisi manuseid ei saa koos ühte sõnumisse panna.", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { - "message": "You cannot add any more attachments to this message.", + "message": "Sellele sõnumile pole võimalik rohkem manuseid lisada.", "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { @@ -611,15 +643,37 @@ "message": "Välju", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Sisesta nimi või number", + "search": { + "message": "Otsi", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Vestlused", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontaktid", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Sõnumid", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Tere tulemast Signalisse", "description": "" }, @@ -673,6 +727,10 @@ "message": "postkast", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Laadin alla", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Laadi manus alla", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -694,7 +752,7 @@ "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" }, "voiceNoteMustBeOnlyAttachment": { - "message": "A voice note must be the only attachment included in a message.", + "message": "Häälmärkmed peavad olema sõnumi ainuke manus.", "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Sobib", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Saaja", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Üldine", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Luba sõnumite kasti teksti õigekirja kontroll", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "See Signal Desktopi versioon on aegunud. Palun uuenda uusimale versioonile sõnumite saatmiseks jätkamiseks.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Androidi kasutajad saavad ainult selle sõnumi esimesed 2000 märki.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Uuenda", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Tume", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Märkus endale", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Peida menüüriba", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Alusta vestlust...", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Tingimused ja privaatsuspoliitika", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/fa/messages.json b/_locales/fa/messages.json index 75c56ce99f..00d691d046 100644 --- a/_locales/fa/messages.json +++ b/_locales/fa/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&فایل", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "مکالمه های آرشیو شده", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "این مکالمه ها بایگانی شده اند و اگر پیام های جدید دریافت شوند فقط در صندوق به نمایش در می آیند.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "انتخاب پوشه", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "خروج", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "نام یا شماره وارد کنید", + "search": { + "message": "جستجو", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "مکالمه ها", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "مخاطبین", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "پیام ها", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "به Signal خوش‌آمدید", "description": "" }, @@ -673,6 +727,10 @@ "message": "صندوق پست", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "در حال دانلود", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "دانلود ضمیمه", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "تصویر", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "باشه", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "به", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "عمومی", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "فعال سازی کنترل املاء متن وارد شده در باکس پیام نویسی", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "این نسخه‌ی Signal قدیمی است. برای ارسال پیام لطفا آن را به آخرین نسخه ارتقاء دهید.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "سیستم‌های اندرویدی فقط 2000 کاراکتر اول این پیام را دریافت خواهند کرد.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "ارتقاء", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "تاریک", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "پنهان کردن نوار منو", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "شروع مکالمه...", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "شرایط و سیاست های حفظ حریم خصوصی", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index f1ab2e6e79..32bc5f796e 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopioi virheilmoitus ja lopeta", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Tuntematon ryhmä", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Tietokantavirhe", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Tuhoa kaikki tiedot ja käynnistä uudelleen", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Tiedosto", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Arkistoidut keskustelut", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Nämä keskustelut ovat arkistoituja. Ne siirtyvät takaisin postilaatikkoon, jos niihin tulee uusia viestejä", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arkistoi keskustelu", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Siirrä keskustelu takaisin postilaatikkoon", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Valitse kansio", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Muille kuin kuvatiedostoille raja on yksi liitetiedosto per viesti.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Kuvatiedostoa ja muun tyyppistä liitetiedostoa ei voi lisätä samaan viestiin.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Lopeta", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Syötä nimi tai numero", + "search": { + "message": "Hae", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Ei tuloksia haulle: \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Keskustelut", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Yhteystiedot", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Viestit", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Tervetuloa Signaliin", "description": "" }, @@ -673,6 +727,10 @@ "message": "Postilokero", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Ladataan", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Lataa liite", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Kuva", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Vastaanottajat", + "message": "vastaanottaja", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Yleistä", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Lähetä esikatselukuva linkeistä", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Esikatselu tukee sivustoja Imgur, Instagram, Reddit ja YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Ota käyttöön viestilaatikkoon kirjoitetun tekstin oikeinkirjoituksen tarkistus", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Käyttämäsi versio Signal Desktopista on vanhentunut. Viestien lähettäminen ja vastaanottaminen eivät enää toimi, ennen kuin olet päiväittänyt uusimpaan versioon.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Signalin Android-käyttäjät näkevät vain ensimmäiset 2000 merkkiä tästä viestistä.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Päivitä", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Tumma", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Viestit itselleni", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Piilota valikkopalkki", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Aloita keskustelu", + "message": "Aloita uusi keskustelu...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Käyttöehdot ja tietosuoja", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 2902e5b14c..7c5f03ea99 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copier l’erreur et quitter", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Groupe inconnu", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Erreur de base de données", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Supprimer toutes les données et relancer", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Fichier", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Conversations archivées", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Ces conversations sont archivées et n’apparaîtront dans la boîte de réception que si de nouveaux messages sont reçus.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archiver la conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Déplacer la conversation vers la boite de réception", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Sélectionner un dossier", "description": "Button to allow the user to find a folder on disk" @@ -484,11 +516,11 @@ "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "Chargement de l’aperçu…", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "Brouillon d’imagette d’aperçu de lien pour $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "Imagette d’aperçu de lien pour $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "Brouillon d’image jointe : $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -518,11 +550,11 @@ } }, "oneNonImageAtATimeToast": { - "message": "When including a non-image attachment, the limit is one attachment per message.", + "message": "Pour un fichier joint qui n’est pas une image, la limite est un fichier joint par message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "You cannot mix non-image and image attachments in one message.", + "cannotMixImageAndNonImageAttachments": { + "message": "Vous ne pouvez pas joindre à la fois image et non image dans le même message.", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { @@ -611,15 +643,37 @@ "message": "Quitter", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop pour ordinateur", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Saisir le nom ou le numéro", + "search": { + "message": "Chercher", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Aucun résultat pour « $searchTerm$ »", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversations", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contacts", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Messages", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Bienvenue sur Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Boîte postale", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Téléchargement", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Télécharger la pièce jointe", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -694,7 +752,7 @@ "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" }, "voiceNoteMustBeOnlyAttachment": { - "message": "A voice note must be the only attachment included in a message.", + "message": "Une note vocale doit être le seul fichier joint à un message.", "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Valider", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "À", + "message": "à", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Général", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Envoyer des aperçus de liens.", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Les aperçus sont pris en charge pour les liens Imgur, Instagram, Reddit et YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Activer la vérification de l’orthographe du texte saisi dans la fenêtre de rédaction des messages", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Cette version de Signal Desktop pour ordinateur est expirée. Veuillez la mettre à niveau vers la version la plus récente afin de continuer à échanger.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Les clients pour Android ne recevront que les 2 000 premiers caractères de ce message.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Mettre à niveau", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Sombre", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note à mon intention", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Cacher la barre de menu", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Lancer la conversation…", + "message": "Lancer une nouvelle conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Conditions générales d’utilisation et politique de confidentialité", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/he/messages.json b/_locales/he/messages.json index 0dcb9ba3fb..0d510335da 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "העתק שגיאה וצא", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "קבוצה לא ידועה", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "שגיאת מסד נתונים", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "מחק את כל הנתונים והפעל מחדש", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&קובץ", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "שיחות מאורכבות", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "שיחות אלו מאורכבות ויופיעו בתיבה הנכנסת רק אם מתקבלות הודעות חדשות.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "ארכב שיחה", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "העבר שיחה אל תיבה נכנסת", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "בחר תיקייה", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "בעת הכללת צרופת אי־תמונה, המגבלה היא צרופה אחת להודעה.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "אינך יכול לערבב צרופות של אי־תמונה ותמונה בהודעה אחת.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "צא", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop עבודה", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "הכנס שם או מספר", + "search": { + "message": "חיפוש", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "אין תוצאות עבור \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "שיחות", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "אנשי קשר", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "הודעות", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "ברוכים הבאים לסיגנל", "description": "" }, @@ -673,6 +727,10 @@ "message": "תא דואר", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "מוריד", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "הורד צרופה", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "תצלום", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "אישור", "description": "" @@ -959,14 +1025,6 @@ "message": "כללי", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "שלח קדם־תצוגות של קישורים", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "קדם־תצוגות נתמכות עבור קישורים של Imgur, Instagram, Reddit ו־YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "אפשר בדיקת איות של מלל המוכנס בתיבת חיבור הודעה", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "גרסה זו של Signal Desktop עבודה פגה. אנא שדרג אל הגרסה האחרונה כדי להמשיך בשליחת הודעות.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "לקוחות Android יקבלו רק את 2000 התווים הראשונים של הודעה זו.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "שדרג", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "כהה", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "הערה לעצמי", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "הסתר שורת תפריט", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "התחל שיחה...", + "message": "התחל שיחה חדשה...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "תנאים ומדיניות פרטיות", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/hi/messages.json b/_locales/hi/messages.json index f02e13b36e..4cdb26f48d 100644 --- a/_locales/hi/messages.json +++ b/_locales/hi/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "फोल्डर को चुनो", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "सर्च", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "संवाद", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "संपर्क", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "संदेश", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "सिग्‍नल में आपका स्वागत है ", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Downloading", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "ठीक", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "किस को", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "General", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Signal डेस्कटॉप का यह संस्करण समाप्त हो गया है। संदेश जारी रखने के लिए कृपया नवीनतम संस्करण में नवीनीकृत करें।", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "एंड्रॉयड क्लाइंट केवल इस संदेश के पहले 2000 वर्ण प्राप्त करेंगे", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "अपग्रेड", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "मेनू बार छुपाएं", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json index 8f895d6e94..4205980dfc 100644 --- a/_locales/hr/messages.json +++ b/_locales/hr/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Arhivirani razgovori", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Odaberi direktorij", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "Traži", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversations", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakti", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Poruke", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Dobrodošli u Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Preuzimanje", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Za", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Općenito", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Ova inačica Signal Desktopa je istekla. Molimo vas da za nastavak dopisivanja nadogradite na najnoviju verziju.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android uređaji primit će samo prvih 2000 znakova ove poruke.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Nadogradi", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Hide menu bar", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Uvjeti i pravila o privatnosti", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index b2c5d0cb50..3eeebb67f1 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Hiba másolása és kilépés", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Ismeretlen csoport", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Adatbázishiba", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Összes adat törlése és újraindítás", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Fájl", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archív beszélgetések", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Ezek a beszélgetések archiválva vannak, ezért csak akkor jelennek meg újra a bejövő üzenet közt, ha újabb üzenet érkezik.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Beszélgetés archiválása", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Beszélgetés áthelyezése a beérkezett üzenetek közé", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Mappa kiválasztása", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Nem-kép csatolmány esetén üzenetenként egy melléklet csatolható.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Nem keverheted a nem-kép és kép típusú csatolmányokat üzeneten belül.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Kilépés", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Név vagy telefonszám", + "search": { + "message": "Keresés", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Nincs találat a \"$searchTerm$\" keresőkifejezése", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Beszélgetések", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontaktok", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Üzenetek", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Üdvözöl a Signal!", "description": "" }, @@ -673,6 +727,10 @@ "message": "Postafiók", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Letöltés", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Csatolmány letöltése", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Kép", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Címzett", + "message": "címzett", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Általános", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Hivatkozások előnézeti képének küldése", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Az előnézeti képek az Imgur, Instagram, Reddit és YouTube szolgáltatásokhoz érhetőek el.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Az üzenetíró dobozba gépelt szöveg helyesírás-ellenőrzésének engedélyezése", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "A Signal Desktop ezen verziója elavult. Kérlek frissíts a legújabb verzióra, hogy folytatni tudd a beszélgetést!", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Az Androidos kliensek csak az üzenet első 2000 karakterét fogják megkapni.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Frissítés", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Sötét", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Privát feljegyzés", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Menü elrejtése", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Beszélgetés megkezdése...", + "message": "Új beszélgetés megkezdése…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Adatvédelmi és Általános Szerződési Feltételek", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/id/messages.json b/_locales/id/messages.json index 893e2f6660..9c4dc3b65c 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Berkas", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Percakapan Terarsipkan", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Pilih map", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Ketika menyertakan lampiran bukan gambar, batasnya adalah satu lampiran per pesan.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Anda tidak bisa mencampur lampiran gambar dan bukan gambar dalam satu pesan.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Berhenti", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Masukkan nama atau nomor ", + "search": { + "message": "Pencarian", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Percakapan", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontak", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Pesan", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Selamat datang di Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Mengunduh", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Unduh Lampiran", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Kepada", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -866,7 +932,7 @@ "description": "Used for the icon layered on top of an image in message bubbles" }, "addACaption": { - "message": "Add a caption...", + "message": "Tambah keterangan...", "description": "" }, "save": { @@ -959,14 +1025,6 @@ "message": "Umum", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Aktifkan pengecek ejaan dalam kotak pesan", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Versi Signal Desktop ini telah kedaluwarsa. Mohom memutakhirkan ke versi terbaru untuk melanjutkan pengiriman pesan.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Klien Android hanya akan menerima 2000 karakter pertama dari pesan ini.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Pemutakhiran", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Gelap", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Catatan Pribadi", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Sembunyikan kolom menu", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Mulai percakapan...", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Syarat & Kebijakan Privasi", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/it/messages.json b/_locales/it/messages.json index a369f78049..e40da8f415 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copia l'errore ed esci", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Gruppo sconosciuto", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Errore del database", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Elimina tutti i dati e riavvia", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Conversazioni archiviate", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Queste conversazioni sono archiviate e compariranno nella lista di chat solo se verranno ricevuti nuovi messaggi.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archivia conversazione", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Ripristina conversazione", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Scegli la cartella", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Quando includi un allegato che non è un'immagine, il limite è un solo allegato per messaggio.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Non puoi allegare insieme immagini ad altri file in un messaggio.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Esci", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Inserisci il nome o il numero", + "search": { + "message": "Cerca", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Nessun risultato per \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversazioni", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contatti", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Messaggi", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Benvenuto in Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Casella postale", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Caricamento in corso", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Scarica allegato", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "A", + "message": "a", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Generale", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Invia anteprime link", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Le anteprime sono supportate per i link di Imgur, Instagram, Reddit e YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Abilita il controllo ortografico del testo inserito nella casella di composizione", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Questa versione di Signal Desktop è scaduta. Per continuare a chattare aggiornala all'ultima versione.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "I client Android riceveranno solo i primi 2000 caratteri di questo messaggio.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Aggiorna", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Scuro", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note personali", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Nascondi la barra del menu", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Inizia la conversazione...", + "message": "Inizia una nuova conversazione...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Termini e privacy policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 172b482e7c..25acf6561c 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "ファイル (&F)", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "保存済みの会話", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "この会話は保存されます。新しいメッセージが届いた場合だけ受信箱に表示されます。", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "フォルダを選択", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "終了", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "名前か番号を入力", + "search": { + "message": "検索", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "会話", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "連絡先", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "メッセージ", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Signalにようこそ", "description": "" }, @@ -673,6 +727,10 @@ "message": "私書箱", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "ダウンロード中", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "添付ファイルをダウンロード", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "写真", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "宛先", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "一般", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "リンクプレビューを送る", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "次のサービスのプレビューに対応しています: Imgur, Instagram, Reddit, YouTube", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "メッセージボックスに入力されたテキストのスペルチェックを有効にする", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "アプリのバージョンが古すぎます。最新版にアップデートしてください。", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android端末ではこのメッセージの最初の2000字しか受信されません", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "アップデート", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "ダーク", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "自分のためのメモ", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "メニューバーを最小化", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "会話を開始する...", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "使用条件とプライバシーポリシー", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/km/messages.json b/_locales/km/messages.json index bf9c32f4f3..9f41528e1b 100644 --- a/_locales/km/messages.json +++ b/_locales/km/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "ចម្លងបញ្ហា និងចាកចេញ", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "ក្រុមមិនស្គាល់", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "បញ្ហាទិន្នន័យ", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "លុបទិន្នន័យទាំងអស់ និងបើកឡើងវិញ", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&ឯកសារ", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,12 +161,28 @@ } } }, + "archivedConversations": { + "message": "បណ្ណសារសន្ទនា", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "ការសន្ទនាទាំងនេះ នឹងត្រូវធ្វើបណ្ណសារ និងបង្ហាញក្នុងប្រអប់សំបុត្រតែប៉ុណ្ណោះ ប្រសិនបើទទួលបានសារថ្មី។", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "បណ្ណសារការសន្ទនា", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "ផ្លាស់ប្តូរការសន្ទនាទៅប្រអប់សារ", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "ជ្រើសរើសទីតាំងផ្ទុក", "description": "Button to allow the user to find a folder on disk" }, "chooseFile": { - "message": "Choose file", + "message": "ជ្រើសរើសឯកសារ", "description": "Button to allow the user to find a file on disk" }, "loadDataHeader": { @@ -480,15 +512,15 @@ "description": "Name for a voice message attachment" }, "dangerousFileType": { - "message": "Attachment type not allowed for security reasons", + "message": "ប្រភេទឯកសារភ្ជាប់មិនអនុញ្ញាតសម្រាប់ហេតុផលសុវត្ថិភាព", "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "កំពុងផ្ទុកការមើល...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "ការមើលតំណជារូបភាពតូចៗព្រាងសម្រាប់ $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "ការមើលតំណជារូបភាពតូចៗសម្រាប់$domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "រូបភាពឯកសារភ្ជាប់ព្រាង៖ $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -518,15 +550,15 @@ } }, "oneNonImageAtATimeToast": { - "message": "When including a non-image attachment, the limit is one attachment per message.", + "message": "ពេលបញ្ចូលឯកសារភ្ជាប់មិន-រូបភាពមួយ ការកំណត់គឺឯកសារភ្ជាប់មួយ សម្រាប់សារមួយ។", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "You cannot mix non-image and image attachments in one message.", + "cannotMixImageAndNonImageAttachments": { + "message": "អ្នកមិនអាចលាយឡំឯកសារភ្ជាប់ មិន-រូបភាព និងរូបភាព ក្នុងសារតែមួយទេ។", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { - "message": "You cannot add any more attachments to this message.", + "message": "អ្នកមិនអាចបន្ថែមឯកសារភ្ជាប់ទៅកាន់សារនេះទេ។", "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { @@ -611,15 +643,37 @@ "message": "ចាកចេញ", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "បញ្ចូល ឈ្មោះ ឬ លេខ", + "search": { + "message": "ស្វែងរក", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "គ្មានលទ្ធផលសម្រាប់ \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "ការសន្ទនា", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "បញ្ជីទំនាក់ទំនង", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "សារ", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "ស្វាគមន៍មកកាន់ Signal", "description": "" }, @@ -628,7 +682,7 @@ "description": "" }, "typingAlt": { - "message": "Typing animation for this conversation", + "message": "ការវាយចលនាសម្រាប់ការសន្ទនានេះ", "description": "Used as the 'title' attibute for the typing animation" }, "contactAvatarAlt": { @@ -673,6 +727,10 @@ "message": "ប្រអប់សំបុត្រ", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "កំពុងទាញយក", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "ទាញយកឯកសារភ្ជាប់", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -694,7 +752,7 @@ "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" }, "voiceNoteMustBeOnlyAttachment": { - "message": "A voice note must be the only attachment included in a message.", + "message": "ការចំណាំជាសំឡេងត្រូវតែជាឯកសារភ្ជាប់ នៅក្នុងសារមួយ។", "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { @@ -735,6 +793,14 @@ "message": "រូបភាព", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "យល់ព្រម", "description": "" @@ -862,11 +928,11 @@ "description": "Used in the alt tag for the image shown in a full-screen lightbox view" }, "imageCaptionIconAlt": { - "message": "Icon showing that this image has a caption", + "message": "រូបតំណាងបង្ហាញថារូបភាពនេះមានចំណងជើង", "description": "Used for the icon layered on top of an image in message bubbles" }, "addACaption": { - "message": "Add a caption...", + "message": "ដាក់ចំណងជើង...", "description": "" }, "save": { @@ -956,17 +1022,9 @@ "description": "Description of the media permission description" }, "general": { - "message": "General", + "message": "ទូទៅ", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "បើកការត្រួតពិនិត្យអក្ខរាវិរុទ្ធនៃពាក្យដែលបានបញ្ចូលក្នុងប្រអប់ផ្ញើសារ", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "ជំនាន់ Signal Desktop នេះ បានហួសសុពលភាព។ សូមដំឡើងទីកាន់ជំនាន់ចុងក្រោយ ដើម្បីបន្តការផ្ញើសារ។", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "អ្នកប្រើប្រាស់ Android នឹងទទួលបានអក្សរ 2000 តួ ដំបូងនៃសារនេះតែប៉ុណ្ណោះ។", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "ដំឡើង", "description": "Label text for button to upgrade the app to the latest version" @@ -1168,7 +1222,7 @@ "description": "Brief message shown when trying to message a blocked number" }, "unblockGroupToSend": { - "message": "Unblock this group to send a message.", + "message": "មិនការទប់ស្កាត់ក្រុមនេះ ដើម្បីផ្ញើសារ។", "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { @@ -1373,12 +1427,16 @@ "message": "ងងឹត", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "កំណត់ចំណាំ", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "លាក់របារម៉ឺនុយ", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "ចាប់ផ្តើមការសន្ទនា...", + "message": "ចាប់ផ្តើមការសន្ទនាថ្មី...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "លក្ខខណ្ឌ និងគោលនយោបាយឯកជនភាព", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/kn/messages.json b/_locales/kn/messages.json index 4b15387cbe..3b3af59cfa 100644 --- a/_locales/kn/messages.json +++ b/_locales/kn/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "ಹುಡುಕಿ", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversations", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "ಸಂಪರ್ಕಗಳು", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Messages", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "ಸಿಗ್ನಲ್‌ಗೆ ಸ್ವಾಗತ", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Downloading", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "ಸರಿ", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "ಗೆ", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "General", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Signal ಡೆಸ್ಕ್ಟಾಪ್ ಈ ಆವೃತ್ತಿಯ ಅವಧಿ ಮುಗಿದಿದೆ. ಸಂದೇಶ ಮುಂದುವರೆಸಲು ಹೊಸ ಆವೃತ್ತಿಗೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android clients will only receive the first 2000 characters of this message.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "ಅಪ್ಗ್ರೇಡ್", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Hide menu bar", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index 1199f9f395..968abaec22 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "검색", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "대화", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "연락처", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Messages", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Welcome to Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "다운로드 중", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "To", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "일반 설정", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "This version of Signal Desktop has expired. Please upgrade to the latest version to continue messaging.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android clients will only receive the first 2000 characters of this message.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Upgrade", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Hide menu bar", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/lt/messages.json b/_locales/lt/messages.json index d7b34ee290..b57915c90f 100644 --- a/_locales/lt/messages.json +++ b/_locales/lt/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopijuoti klaidą ir išeiti", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Nežinoma grupė", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Duomenų bazės klaida", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Ištrinti visus duomenis ir paleisti iš naujo", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Failas", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archyvuoti pokalbiai", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Šie pokalbiai yra archyvuoti ir atsiras skyrelyje Gauta tik tuomet, jei bus gautos naujos žinutės.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archyvuoti pokalbį", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Perkelti pokalbį į skyrelį Gauta", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Pasirinkti aplanką", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Įtraukiant ne paveikslų priedus, vienoje žinutėje galimas tik vienas priedas.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Negalite vienoje žinutėje maišyti paveikslų ir ne paveikslų priedus.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Išeiti", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Įveskite vardą ar numerį", + "search": { + "message": "Ieškoti", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "\"$searchTerm$\" negrąžino jokių rezultatų", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Pokalbiai", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontaktai", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Žinutės", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Sveiki atvykę į Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Pašto dėžutė", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Atsisiunčiama", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Atsisiųsti priedą", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Nuotrauka", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Gerai", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Kam", + "message": "skirta", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Bendra", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Siųsti nuorodų peržiūras", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Peržiūros yra palaikomos Imgur, Instagram, Reddit, ir YouTube nuorodoms.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Įjungti rašybos tikrinimą tekstui, kuris įvedamas į žinutės rašymo langelį", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Pasibaigė šios Signal Desktop skirtos versijos galiojimas. Norint tęsti susirašinėjimą, prašome atsinaujinti iki naujausios versijos.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android klientai gaus tik pirmuosius 2000 šios žinutės simbolių.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Naujinti", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Tamsi", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Pastabos sau", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Slėpti meniu juostą", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Pradėti pokalbį…", + "message": "Pradėti naują pokalbį…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Sąlygos ir Privatumo politika", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/mk/messages.json b/_locales/mk/messages.json index 13d300a8d2..3987e9b00f 100644 --- a/_locales/mk/messages.json +++ b/_locales/mk/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "Барај", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Разговори", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Контакти", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Messages", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Добредојдовте во Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Превземање", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Во ред", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "To", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Општо", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "This version of Signal Desktop has expired. Please upgrade to the latest version to continue messaging.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android clients will only receive the first 2000 characters of this message.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Upgrade", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Hide menu bar", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index 2a33448508..41343bccc0 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopier feil og avslutt", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Ukjent gruppe", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database feil", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Slett alle data og restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Fil", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Arkiverte Samtaler", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Disse samtalene er arkiverte og vil dukke opp igjen i innboksen om de får nye meldinger.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arkiver samtalen", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Flytt samtalen til innboksen", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Velg mappe", "description": "Button to allow the user to find a folder on disk" @@ -484,11 +516,11 @@ "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "Laster forhåndsvisning...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "Utkast miniatyrbilde til linkforhåndsvisning for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "Miniatyrbilde til linkforhåndsvisning for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "Utkast av vedlagt bildefil: $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -521,7 +553,7 @@ "message": "Når du inkluderer et vedlegg som ikke er et bilde, er begrensningen ett vedlegg per melding.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Du kan ikke blande vedlegg som er bilder med vedlegg som ikke er bilder i samme melding.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Avslutt", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Legg inn navn eller nummer", + "search": { + "message": "Søk", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Ingen resultater for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Samtaler", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakter", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Meldinger", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Velkommen til Signal!", "description": "" }, @@ -673,6 +727,10 @@ "message": "Postboks", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Laster ned", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Last ned Vedlegg", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Bilde", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Til", + "message": "til", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Generelt", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Slå på stavekontroll av tekst du skriver i meldingsvinduet", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Denne versjonen av Signal Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android-klienter mottar bare de første 2000 tegnene i denne meldingen.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Oppgrader", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Mørkt", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Notat til meg selv", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Skjul menylinje", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start samtale...", + "message": "Start en ny samtale...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Vilkår og personvernerklæring", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index 5b86c8d8bf..70739c8755 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Foutmelding kopiëren en afsluiten", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Onbekende groep", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Databasefout", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Alle gegevens wissen en herstarten", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Bestand", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -64,7 +80,7 @@ "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { - "message": "Verwijderen", + "message": "Wissen", "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Gearchiveerde gesprekken", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Deze gesprekken worden gearchiveerd en zullen alleen in Postvak IN verschijnen als je nieuwe berichten ontvangt.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Gesprek archiveren", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Gesprek verplaatsen naar Postvak IN", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Map kiezen", "description": "Button to allow the user to find a folder on disk" @@ -174,7 +206,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Zorg dat je de juiste map met je opgeslagen Signal-gegevens kiest. De naam begint normaal gezien met ‘Signal Export’. Je kan ook een nieuwe kopie van je gegevens uit de Chrome-app opslaan.", + "message": "Zorg dat je de juiste map met je opgeslagen Signal-gegevens kiest. De naam begint normaal gezien met ‘Signal Export’. Je kunt ook een nieuwe kopie van je gegevens uit de Chrome-app opslaan.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +218,7 @@ "description": "Button shown if the user runs into an error during import, allowing them to start over" }, "importCompleteHeader": { - "message": "Klaar!", + "message": "Geslaagd!", "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { @@ -254,7 +286,7 @@ } }, "youMarkedAsVerified": { - "message": "Je hebt aangegeven dat je veiligheidsnummer met $name$is geverifieerd ", + "message": "Je hebt het veiligheidsnummer met $name$ als geverifieerd gemarkeerd", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -264,7 +296,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Je hebt het veiligheidsnummer met $name$ als niet geverifiëerd aangegeven", + "message": "Je hebt het veiligheidsnummer met $name$ als niet geverifieerd gemarkeerd", "description": "Shown in the conversation history when the user marks a contact as not verified, whether on the Safety Number screen or by dismissing a banner or dialog.", "placeholders": { "name": { @@ -274,7 +306,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Je hebt het veiligheidsnummer met $name$ geverifiëerd vanaf een ander apparaat", + "message": "Je hebt het veiligheidsnummer met $name$ vanaf een ander apparaat als geverifieerd gemarkeerd", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -284,7 +316,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Je hebt het veiligheidsnummer met $name$ als niet geverifiëerd aangegeven vanaf een ander apparaat", + "message": "Je hebt het veiligheidsnummer met $name$ vanaf een ander apparaat als niet geverifieerd gemarkeerd", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -294,15 +326,15 @@ } }, "membersNeedingVerification": { - "message": "Je veiligheidsnummers met deze groepsleden zijn veranderd sinds de laatste verificatie. Klik op een groepslid om je nieuwe veiligheidsnummer met hen te bekijken.", + "message": "Je veiligheidsnummers met deze groepsleden zijn veranderd sinds de laatste verificatie. Klik op een groepslid om je nieuwe veiligheidsnummer met hem te bekijken.", "description": "When there are multiple previously-verified group members with safety number changes, a banner will be shown. The list of contacts with safety number changes is shown, and this text introduces that list." }, "changedSinceVerifiedMultiple": { - "message": "Je veiligheidsnummers met meerdere groepsleden zijn veranderd sinds de laatste verificatie. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat ze Signal opnieuw hebben geïnstalleerd.", + "message": "Je veiligheidsnummers met meerdere groepsleden zijn veranderd sinds de laatste verificatie. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat sommige groepsleden Signal opnieuw hebben geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Je veiligheidsnummer met $name$ is veranderd sinds de laatste verificatie. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ opnieuw heeft geïnstalleerd.", + "message": "Je veiligheidsnummer met $name$ is veranderd sinds de laatste verificatie. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -322,7 +354,7 @@ } }, "changedRecentlyMultiple": { - "message": "Je veiligheidsnummers met meerdere groepsleden zijn onlangs veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat ze Signal opnieuw hebben geïnstalleerd.", + "message": "Je veiligheidsnummers met meerdere groepsleden zijn recentelijk veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat sommige groepsleden Signal opnieuw hebben geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { @@ -336,7 +368,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Je veiligheidsnummer met $name$ is veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd. Je verifieert best je nieuwe veiligheidsnummer met dit contact.", + "message": "Je veiligheidsnummer met $name$ is veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd. Het wordt aanbevolen je nieuwe veiligheidsnummer met dit contactpersoon te verifiëren.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -350,7 +382,7 @@ "description": "Used on a warning dialog to make it clear that it might be risky to send the message." }, "noLongerVerified": { - "message": "Je veiligheidsnummer met $name$ is veranderd en niet meer geverifieerd. Klik om het te tonen.", + "message": "Je veiligheidsnummer met $name$ is veranderd en het is daarom niet langer geverifieerd. Klik om het te tonen.", "description": "Shown in converation banner when user's safety number has changed, but they were previously verified.", "placeholders": { "name": { @@ -360,7 +392,7 @@ } }, "multipleNoLongerVerified": { - "message": "Je veiligheidsnummers met meerdere leden van deze groep zijn veranderd en bijgevolg niet meer geverifieerd. Klik om deze te tonen.", + "message": "Je veiligheidsnummers met meerdere leden van deze groep zijn veranderd en ze zijn daarom niet langer geverifieerd. Klik om de veiligheidsnummers te tonen.", "description": "Shown in conversation banner when more than one group member's safety number has changed, but they were previously verified." }, "debugLogExplanation": { @@ -424,7 +456,7 @@ "description": "Header for a key change dialog" }, "identityChanged": { - "message": "Je veiligheidsnummer met dit contact is veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat je contact Signal opnieuw heeft geïnstalleerd. Je verifieert best het nieuwe veiligheidsnummer hieronder.", + "message": "Je veiligheidsnummer met deze contactpersoon is veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat je contactpersoon Signal opnieuw heeft geïnstalleerd. Het wordt aanbevolen om het nieuwe veiligheidsnummer hieronder met deze persoon te verifiëren.", "description": "" }, "incomingError": { @@ -521,7 +553,7 @@ "message": "Wanneer je een bijlage insluit die geen afbeelding is, is de limiet één bijlage per bericht.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Je kunt geen combinatie van afbeeldingen en niet-afbeeldingen insluiten als bijlagen van één bericht.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,20 +643,42 @@ "message": "Afsluiten", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Voer naam of nummer in", + "search": { + "message": "Zoeken", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Geen resultaten voor ‘$searchTerm$’", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Gesprekken", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contacten", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Berichten", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Welkom bij Signal", "description": "" }, "selectAContact": { - "message": "Kies een contact of groep om te starten met chatten.", + "message": "Selecteer een contactpersoon of groep om een gesprek te openen.", "description": "" }, "typingAlt": { @@ -673,6 +727,10 @@ "message": "postbus", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Wordt gedownload", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Bijlage downloaden", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -702,7 +760,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "replyingTo": { - "message": "Antwoord op $name$", + "message": "In reactie op $name$", "description": "Shown in iOS theme when you or someone quotes to a message which is not from you", "placeholders": { "name": { @@ -735,8 +793,16 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { - "message": "Oké", + "message": "Begrepen", "description": "" }, "cancel": { @@ -756,15 +822,15 @@ "description": "" }, "delete": { - "message": "Verwijderen", + "message": "Wissen", "description": "" }, "deleteWarning": { - "message": "Weet je het zeker? Door op ‘Verwijderen’ te klikken, wordt dit bericht voorgoed van enkel dit apparaat verwijderd.", + "message": "Weet je het zeker? Door op ‘Wissen’ te klikken, wordt dit bericht voorgoed van enkel dit apparaat gewist.", "description": "" }, "deleteThisMessage": { - "message": "Dit bericht verwijderen", + "message": "Dit bericht wissen", "description": "" }, "from": { @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Naar", + "message": "aan", "description": "Label for the receiver of a message" }, "sent": { @@ -818,7 +884,7 @@ } }, "theirIdentityUnknown": { - "message": "Je hebt nog geen berichten uitgewisseld met dit contact. Je veiligheidsnummer met hen zal beschikbaar zijn na het eerste bericht.", + "message": "Je hebt nog geen berichten uitgewisseld met deze contactpersoon. Je veiligheidsnummer met hem zal beschikbaar zijn na het eerste bericht.", "description": "" }, "moreInfo": { @@ -826,19 +892,19 @@ "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" }, "retrySend": { - "message": "Opnieuw proberen verzenden", + "message": "Opnieuw proberen te verzenden", "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send" }, "deleteMessage": { - "message": "Bericht verwijderen", + "message": "Bericht wissen", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { - "message": "Berichten verwijderen", + "message": "Berichten wissen", "description": "Menu item for deleting messages, title case." }, "deleteConversationConfirmation": { - "message": "Dit gesprek voorgoed verwijderen?", + "message": "Dit gesprek voorgoed wissen?", "description": "Confirmation dialog text that asks the user if they really wish to delete the conversation. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." }, "sessionEnded": { @@ -878,7 +944,7 @@ "description": "Used in the media gallery documents tab to visually represent a file" }, "emojiAlt": { - "message": "Emoji-afbeelding van ‘$title$’", + "message": "Emoji-afbeelding ‘$title$’", "description": "Used in the alt tag of all emoji images", "placeholders": { "title": { @@ -959,16 +1025,8 @@ "message": "Algemeen", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Voorbeeldweergaven verzenden", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Voorbeelden worden ondersteund voor koppelingen naar Imgur, Instagram, Reddit en YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { - "message": "Gebruik een spellingscontrole voor de tekst in het berichtinvoerveld", + "message": "Gebruik spellingscontrole voor de tekst in het berichtinvoerveld", "description": "Description of the media permission description" }, "clearDataHeader": { @@ -984,15 +1042,15 @@ "description": "Button in the settings dialog starting process to delete all data" }, "deleteAllDataHeader": { - "message": "Alle gegevens verwijderen?", + "message": "Alle gegevens wissen?", "description": "Header of the full-screen delete data confirmation screen" }, "deleteAllDataBody": { - "message": "Je staat op het punt alle opgeslagen accountgegevens van deze toepassing te verwijderen, inclusief alle contacten en alle berichten. Je kan altijd opnieuw koppelen met je mobiele apparaat, maar je verwijderde berichten kunnen niet hersteld worden.", + "message": "Je staat op het punt alle opgeslagen accountgegevens van deze toepassing te wissen, inclusief alle contacten en alle berichten. Je kunt altijd opnieuw koppelen met je mobiele apparaat, maar je gewiste berichten kunnen niet hersteld worden.", "description": "Text describing what exactly will happen if the user clicks the button to delete all data" }, "deleteAllDataButton": { - "message": "Alle gegevens verwijderen", + "message": "Alle gegevens wissen", "description": "Text of the button that deletes all data" }, "deleteAllDataProgress": { @@ -1063,10 +1121,6 @@ "message": "Deze versie van Signal Desktop is verouderd. Opwaardeer naar de laatste versie om verder te chatten.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Contacten die Signal op een Android-telefoon gebruiken zullen enkel de eerste 2000 tekens van dit bericht kunnen lezen.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Opwaarderen", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Donker", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Notitie aan mezelf", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Menubalk verbergen", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Begin een gesprek…", + "message": "Begin een nieuw gesprek…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1390,7 +1448,7 @@ "description": "When a person inputs a number that is invalid" }, "unlinkedWarning": { - "message": "Herkoppel Signal Desktop met je mobiel apparaat om verder te kunnen chatten.", + "message": "Koppel Signal Desktop opnieuw aan je mobiele apparaat om verder te kunnen chatten.", "description": "" }, "unlinked": { @@ -1398,7 +1456,7 @@ "description": "" }, "relink": { - "message": "Herkoppelen", + "message": "Opnieuw koppelen", "description": "" }, "autoUpdateNewVersionTitle": { @@ -1422,7 +1480,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$heeft de groep verlaten", + "message": "$name$ heeft de groep verlaten", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1442,11 +1500,11 @@ } }, "updatedTheGroup": { - "message": "De groep is bijgewerkt", + "message": "De groep is aangepast", "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "De titel is nu \"$name$\"", + "message": "De titel is nu “$name$”", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1456,7 +1514,7 @@ } }, "joinedTheGroup": { - "message": "$name$is lid geworden van de groep", + "message": "$name$ is lid geworden van de groep", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Gebruiksvoorwaarden & privacybeleid", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/nn/messages.json b/_locales/nn/messages.json new file mode 100644 index 0000000000..b169d1f371 --- /dev/null +++ b/_locales/nn/messages.json @@ -0,0 +1,1536 @@ +{ + "copyErrorAndQuit": { + "message": "Kopier feil og avslutt", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Databasefeil", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Slett all data og start på nytt", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, + "mainMenuFile": { + "message": "&Fil", + "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." + }, + "mainMenuEdit": { + "message": "&Rediger", + "description": "The label that is used for the Edit menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." + }, + "mainMenuView": { + "message": "Vi&s", + "description": "The label that is used for the View menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." + }, + "mainMenuWindow": { + "message": "&Vindauge", + "description": "The label that is used for the Window menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." + }, + "mainMenuHelp": { + "message": "&Hjelp", + "description": "The label that is used for the Help menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." + }, + "mainMenuSettings": { + "message": "Innstillingar …", + "description": "The label that is used for the Preferences menu in the program main menu. This should be consistent with the standard naming for ‘Preferences’ on the operating system." + }, + "appMenuHide": { + "message": "Skjul", + "description": "Application menu command to hide the window" + }, + "appMenuHideOthers": { + "message": "Gøym andre", + "description": "Application menu command to hide all other windows" + }, + "appMenuUnhide": { + "message": "Vis alle", + "description": "Application menu command to show all application windows" + }, + "appMenuQuit": { + "message": "Avslutt Signal", + "description": "Application menu command to close the application" + }, + "editMenuUndo": { + "message": "Angra", + "description": "Edit menu command to remove recently-typed text" + }, + "editMenuRedo": { + "message": "Gjenopprett", + "description": "Edit menu command to restore previously undone typed text" + }, + "editMenuCut": { + "message": "Klipp ut", + "description": "Edit menu command to remove selected text and add it to clipboard" + }, + "editMenuCopy": { + "message": "Kopier", + "description": "Edit menu command to add selected text to clipboard" + }, + "editMenuPaste": { + "message": "Lim inn", + "description": "Edit menu command to insert text from clipboard at cursor location" + }, + "editMenuPasteAndMatchStyle": { + "message": "Lim inn utan formatering", + "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" + }, + "editMenuDelete": { + "message": "Slett", + "description": "Edit menu command to remove the selected text" + }, + "editMenuSelectAll": { + "message": "Vel alt", + "description": "Edit menu comand to select all of the text in selected text box" + }, + "editMenuStartSpeaking": { + "message": "Begynn å snakka", + "description": "Edit menu item under 'speech' to start dictation" + }, + "editMenuStopSpeaking": { + "message": "Slutt å snakka", + "description": "Edit menu item under 'speech' to stop dictation" + }, + "windowMenuClose": { + "message": "Lukk vindauget", + "description": "Window menu command to close the current window" + }, + "windowMenuMinimize": { + "message": "Minimer", + "description": "Window menu command to minimize the current window" + }, + "windowMenuZoom": { + "message": "Zoom", + "description": "Window menu command to make the current window the size of the whole screen" + }, + "windowMenuBringAllToFront": { + "message": "Hent fram alle vindauge", + "description": "Window menu command to bring all windows of current applicatinon to front" + }, + "viewMenuResetZoom": { + "message": "Faktisk storleik", + "description": "View menu command to go back to the default zoom" + }, + "viewMenuZoomIn": { + "message": "Zoom inn", + "description": "View menu command to make everything bigger" + }, + "viewMenuZoomOut": { + "message": "Zoom ut", + "description": "View menu command to make everything smaller" + }, + "viewMenuToggleFullScreen": { + "message": "Skru av/på fullskjerm", + "description": "View menu command to enter or leave Full Screen mode" + }, + "viewMenuToggleDevTools": { + "message": "Skru av/på utviklarverktøy", + "description": "View menu command to show or hide the developer tools" + }, + "menuSetupWithImport": { + "message": "Set opp med import", + "description": "When the application is not yet set up, menu option to start up the import sequence" + }, + "menuSetupAsNewDevice": { + "message": "Set opp som ny eining", + "description": "When the application is not yet set up, menu option to start up the set up as fresh device" + }, + "menuSetupAsStandalone": { + "message": "Set opp som frittståande eining", + "description": "Only available on development modes, menu option to open up the standalone device setup sequence" + }, + "loading": { + "message": "Lastar …", + "description": "Message shown on the loading screen before we've loaded any messages" + }, + "optimizingApplication": { + "message": "Optimaliserer applikasjon …", + "description": "Message shown on the loading screen while we are doing application optimizations" + }, + "migratingToSQLCipher": { + "message": "Optimaliserer meldingar … $status$fullført.", + "description": "Message shown on the loading screen while we are doing application optimizations", + "placeholders": { + "status": { + "content": "$1", + "example": "45/200" + } + } + }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, + "chooseDirectory": { + "message": "Vel mappe", + "description": "Button to allow the user to find a folder on disk" + }, + "chooseFile": { + "message": "Vel fil", + "description": "Button to allow the user to find a file on disk" + }, + "loadDataHeader": { + "message": "Last inn dine data", + "description": "Header shown on the first screen in the data import process" + }, + "loadDataDescription": { + "message": "Du har akkurat gått gjennom eksportprosessen; kontaktane og meldingane dine ventar tålmodig på datamaskina di. Vel mappa som inneheld den lagra Signal-eksporten.", + "description": "Introduction to the process of importing messages and contacts from disk" + }, + "importChooserTitle": { + "message": "Vel mappa med eksporterte data", + "description": "Title of the popup window used to select data previously exported" + }, + "importErrorHeader": { + "message": "Noko gjekk gale!", + "description": "Header of the error screen after a failed import" + }, + "importingHeader": { + "message": "Lastar kontaktar og meldingar", + "description": "Header of screen shown as data is import" + }, + "importErrorFirst": { + "message": "Stadfest at du har valt mappa som inneheld den lagra Signal-eksporten din. Namnet skal byrja med «Signal Export». Du kan òg lagra ein ny kopi av eksporten frå den gamle Chrome-appen.", + "description": "Message shown if the import went wrong; first paragraph" + }, + "importErrorSecond": { + "message": "Viss desse stega ikkje fungerte for deg, send oss ein feilsøkingslogg (Vis -> Feilsøkingslogg) slik at vi kan hjelpa deg med migreringa.", + "description": "Message shown if the import went wrong; second paragraph" + }, + "importAgain": { + "message": "Vel mappe og prøv igjen", + "description": "Button shown if the user runs into an error during import, allowing them to start over" + }, + "importCompleteHeader": { + "message": "Fullført!", + "description": "Header shown on the screen at the end of a successful import process" + }, + "importCompleteStartButton": { + "message": "Start å bruka Signal Desktop", + "description": "Button shown at end of successful import process, nothing left but a restart" + }, + "importCompleteLinkButton": { + "message": "Kopla denne eininga til telefonen din", + "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" + }, + "selectedLocation": { + "message": "din valde posisjon", + "description": "Message shown as the export location if we didn't capture the target directory" + }, + "upgradingDatabase": { + "message": "Oppgraderer database. Dette kan ta litt tid …", + "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" + }, + "loadingMessages": { + "message": "Lastar meldingar. $count$så langt …", + "description": "Message shown on the loading screen when we're catching up on the backlog of messages", + "placeholders": { + "count": { + "content": "$1", + "example": "5" + } + } + }, + "me": { + "message": "Meg", + "description": "The label for yourself when shown in a group member list" + }, + "view": { + "message": "Sjå", + "description": "Used as a label on a button allowing user to see more information" + }, + "youLeftTheGroup": { + "message": "Du forlét gruppa", + "description": "Displayed when a user can't send a message because they have left the group" + }, + "scrollDown": { + "message": "Rull til botnen av samtalen", + "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" + }, + "messageBelow": { + "message": "Ny melding nedanfor", + "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" + }, + "messagesBelow": { + "message": "Nye meldingar nedanfor", + "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" + }, + "unreadMessage": { + "message": "1 ulesen melding", + "description": "Text for unread message separator, just one message" + }, + "unreadMessages": { + "message": "$count$ ulesne meldingar", + "description": "Text for unread message separator, with count", + "placeholders": { + "count": { + "content": "$1", + "example": "5" + } + } + }, + "youMarkedAsVerified": { + "message": "Du markerte tryggingsnummeret med $name$ som godkjent", + "description": "Shown in the conversation history when the user marks a contact as verified.", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "youMarkedAsNotVerified": { + "message": "Du markerte tryggingsnummeret med $name$ som ikkje godkjent", + "description": "Shown in the conversation history when the user marks a contact as not verified, whether on the Safety Number screen or by dismissing a banner or dialog.", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "youMarkedAsVerifiedOtherDevice": { + "message": "Du markerte tryggingsnummeret med $name$ som godkjent på ei anna eining", + "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "youMarkedAsNotVerifiedOtherDevice": { + "message": "Du markerte tryggingsnummeret med $name$ som ikkje godkjent på ei anna eining", + "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "membersNeedingVerification": { + "message": "Tryggingsnummera dine med desse gruppemedlemmene er endra sidan førre gong du godkjente. Klikk på ein gruppemedlem for å sjå dei nye tryggingsnummera deira.", + "description": "When there are multiple previously-verified group members with safety number changes, a banner will be shown. The list of contacts with safety number changes is shown, and this text introduces that list." + }, + "changedSinceVerifiedMultiple": { + "message": "Tryggingsnummeret ditt med fleire gruppemedlemmer er endra sidan førre gong du godkjente. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at dei berre har installert Signal på nytt.", + "description": "Shown on confirmation dialog when user attempts to send a message" + }, + "changedSinceVerified": { + "message": "Tryggingsnummeret ditt saman med $name$ har endra seg sidan sist dykk godkjende. Dette kan bety at nokon prøver å overvaka kommunikasjonen eller at $name$ heilt enkelt har installert Signal på nytt.", + "description": "Shown on confirmation dialog when user attempts to send a message", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "changedRightAfterVerify": { + "message": "Tryggingsnummeret du prøver å godkjenna har endra seg. Du må godkjenna det nye tryggingsnummeret til $name$. Hugs at dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at $name$ berre har reinstallert Signal.", + "description": "Shown on the safety number screen when the user has selected to verify/unverify a contact's safety number, and we immediately discover a safety number change", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "changedRecentlyMultiple": { + "message": "Tryggingsnummera dine for fleire gruppemedlemmer er endra i det siste. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at dei berre har reinstallert Signal.", + "description": "Shown on confirmation dialog when user attempts to send a message" + }, + "changedRecently": { + "message": "Tryggingsnummeret ditt med $name$ er endra i det siste. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at $name$ berre har reinstallert Signal.", + "description": "Shown on confirmation dialog when user attempts to send a message", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "identityKeyErrorOnSend": { + "message": "Tryggingsnummeret ditt med $name$ er endra. Dette kan enten bety at nokon avlyttar kommunikasjonen deira, eller at $name$ berre har reinstallert Signal. Du vil kanskje stadfesta tryggingsnummeret ditt med denne kontakten.", + "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "sendAnyway": { + "message": "Send likevel", + "description": "Used on a warning dialog to make it clear that it might be risky to send the message." + }, + "noLongerVerified": { + "message": "Tryggingsnummeret ditt med $name$ er endra og er ikkje lenger godkjent. Klikk for å visa nummeret.", + "description": "Shown in converation banner when user's safety number has changed, but they were previously verified.", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "multipleNoLongerVerified": { + "message": "Tryggingsnummera dine med fleire medlemmer i gruppa er endra, og er ikkje lenger godkjende. Klikk for å visa.", + "description": "Shown in conversation banner when more than one group member's safety number has changed, but they were previously verified." + }, + "debugLogExplanation": { + "message": "Denne logg-meldinga vil bli publisert på nettet for deltakarar i prosjektet. Du kan sjå på og redigera ho før du sender ho inn.", + "description": "" + }, + "debugLogError": { + "message": "Noko gjekk gale med opplastinga! Fint om du vurderer å legga loggen til feilrapporten manuelt.", + "description": "" + }, + "reportIssue": { + "message": "Rapporter eit problem", + "description": "Link to open the issue tracker" + }, + "gotIt": { + "message": "Perfekt!", + "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." + }, + "submit": { + "message": "Send", + "description": "" + }, + "acceptNewKey": { + "message": "Godta", + "description": "Label for a button to accept a new safety number" + }, + "verify": { + "message": "Marker som godkjent", + "description": "" + }, + "unverify": { + "message": "Marker som ikkje godkjent", + "description": "" + }, + "isVerified": { + "message": "Du har godkjent tryggingsnummeret ditt med $name$.", + "description": "Summary state shown at top of the safety number screen if user has verified contact.", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "isNotVerified": { + "message": "Du har ikkje godkjent tryggingsnummeret ditt med $name$.", + "description": "Summary state shown at top of the safety number screen if user has not verified contact.", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "verified": { + "message": "Godkjent", + "description": "" + }, + "newIdentity": { + "message": "Nytt tryggingsnummer", + "description": "Header for a key change dialog" + }, + "identityChanged": { + "message": "Tryggingsnummeret ditt med denne kontakten er endra. Dette kan enten bety at nokon prøver å fanga opp kommunikasjonen din, eller denne kontakten kan ha installert Signal på nytt. Du vil kanskje godkjenna det nye tryggingsnummeret nedanfor.", + "description": "" + }, + "incomingError": { + "message": "Feil ved handtering av innkommande melding", + "description": "" + }, + "media": { + "message": "Media", + "description": "Header of the default pane in the media gallery, showing images and videos" + }, + "mediaEmptyState": { + "message": "Du har ikkje noko media i denne samtalen", + "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" + }, + "documents": { + "message": "Dokument", + "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" + }, + "documentsEmptyState": { + "message": "Du har ingen dokument i denne samtalen", + "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" + }, + "today": { + "message": "I dag", + "description": "Section header in the media gallery" + }, + "yesterday": { + "message": "I går", + "description": "Section header in the media gallery" + }, + "thisWeek": { + "message": "Denne veka", + "description": "Section header in the media gallery" + }, + "thisMonth": { + "message": "Denne månaden", + "description": "Section header in the media gallery" + }, + "unsupportedAttachment": { + "message": "Vedleggstypen er ikkje støtta. Klikk for å lagra det.", + "description": "Displayed for incoming unsupported attachment" + }, + "clickToSave": { + "message": "Klikk for å lagra", + "description": "Hover text for attachment filenames" + }, + "unnamedFile": { + "message": "Namnlaus fil", + "description": "Hover text for attachment filenames" + }, + "voiceMessage": { + "message": "Talemelding", + "description": "Name for a voice message attachment" + }, + "dangerousFileType": { + "message": "Vedleggstypen er ikkje tillaten av tryggleiksårsaker", + "description": "Shown in toast when user attempts to send .exe file, for example" + }, + "loadingPreview": { + "message": "Lastar førehandsvisning …", + "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" + }, + "stagedPreviewThumbnail": { + "message": "Førehandsvisning (kladd) av lenkje til $domain$", + "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "placeholders": { + "path": { + "content": "$1", + "example": "instagram.com" + } + } + }, + "previewThumbnail": { + "message": "Førehandsvisning av lenkje til $domain$", + "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "placeholders": { + "path": { + "content": "$1", + "example": "instagram.com" + } + } + }, + "stagedImageAttachment": { + "message": "Bildevedlegg (kladd): $path$", + "description": "Alt text for staged attachments", + "placeholders": { + "path": { + "content": "$1", + "example": "dog.jpg" + } + } + }, + "oneNonImageAtATimeToast": { + "message": "Når du inkluderer eit vedlegg som ikkje er eit bilde, er grensa eitt vedlegg per melding.", + "description": "An error popup when the user has attempted to add an attachment" + }, + "cannotMixImageAndNonImageAttachments": { + "message": "Du kan ikkje blanda vedlegg som er bilde med vedlegg som ikkje er bilde i same melding.", + "description": "An error popup when the user has attempted to add an attachment" + }, + "maximumAttachments": { + "message": "Du kan ikkje legga til fleire vedlegg i denne meldinga.", + "description": "An error popup when the user has attempted to add an attachment" + }, + "fileSizeWarning": { + "message": "Beklagar, den valde fila går over grensa for meldingsstorleik.", + "description": "" + }, + "unableToLoadAttachment": { + "message": "Kunne ikkje lasta vald vedlegg.", + "description": "" + }, + "disconnected": { + "message": "Kopla frå", + "description": "Displayed when the desktop client cannot connect to the server." + }, + "connecting": { + "message": "Koplar til", + "description": "Displayed when the desktop client is currently connecting to the server." + }, + "offline": { + "message": "Fråkopla", + "description": "Displayed when the desktop client has no network connection." + }, + "checkNetworkConnection": { + "message": "Sjekk nettverkstilkoplinga di.", + "description": "Obvious instructions for when a user's computer loses its network connection" + }, + "attemptingReconnection": { + "message": "Prøver å kopla til på nytt om $reconnect_duration_in_seconds$ sekund", + "description": "", + "placeholders": { + "reconnect_duration_in_seconds": { + "content": "$1", + "example": "10" + } + } + }, + "submitDebugLog": { + "message": "Feilsøkingslogg", + "description": "Menu item and header text for debug log modal (sentence case)" + }, + "debugLog": { + "message": "Feilsøkingslogg", + "description": "View menu item to open the debug log (title case)" + }, + "goToReleaseNotes": { + "message": "Sjå endringsloggen", + "description": "" + }, + "goToForums": { + "message": "Gå til foruma", + "description": "Item under the Help menu, takes you to the forums" + }, + "goToSupportPage": { + "message": "Gå til brukarstøttesida", + "description": "Item under the Help menu, takes you to the support page" + }, + "menuReportIssue": { + "message": "Rapporter eit problem", + "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" + }, + "signalDesktopPreferences": { + "message": "Innstillingar for Signal Desktop", + "description": "Title of the window that pops up with Signal Desktop preferences in it" + }, + "aboutSignalDesktop": { + "message": "Om Signal Desktop", + "description": "Item under the Help menu, which opens a small about window" + }, + "speech": { + "message": "Tale", + "description": "Item under the Edit menu, with 'start/stop speaking' items below it" + }, + "show": { + "message": "Vis", + "description": "Command under Window menu, to show the window" + }, + "hide": { + "message": "Skjul", + "description": "Command in the tray icon menu, to hide the window" + }, + "quit": { + "message": "Avslutt", + "description": "Command in the tray icon menu, to quit the application" + }, + "signalDesktop": { + "message": "Signal Desktop", + "description": "Tooltip for the tray icon" + }, + "search": { + "message": "Søk", + "description": "Placeholder text in the search input" + }, + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Samtalar", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakt", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Meldingar", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { + "message": "Velkommen til Signal!", + "description": "" + }, + "selectAContact": { + "message": "Vel ein kontakt eller ei gruppe for å prata", + "description": "" + }, + "typingAlt": { + "message": "Markør som viser at nokon held på å skriva i samtalen", + "description": "Used as the 'title' attibute for the typing animation" + }, + "contactAvatarAlt": { + "message": "Bilde for kontakt $name$", + "description": "Used in the alt tag for the image avatar of a contact", + "placeholders": { + "name": { + "content": "$1", + "example": "John" + } + } + }, + "sendMessageToContact": { + "message": "Send melding", + "description": "Shown when you are sent a contact and that contact has a signal account" + }, + "home": { + "message": "heim", + "description": "Shown on contact detail screen as a label for an address/phone/email" + }, + "work": { + "message": "jobb", + "description": "Shown on contact detail screen as a label for an address/phone/email" + }, + "mobile": { + "message": "mobil", + "description": "Shown on contact detail screen as a label for aa phone or email" + }, + "email": { + "message": "e-post", + "description": "Generic label shown if contact email has custom type but no label" + }, + "phone": { + "message": "telefon", + "description": "Generic label shown if contact phone has custom type but no label" + }, + "address": { + "message": "adresse", + "description": "Generic label shown if contact address has custom type but no label" + }, + "poBox": { + "message": "postboks", + "description": "When rendering an address, used to provide context to a post office box" + }, + "downloading": { + "message": "Lastar ned", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, + "downloadAttachment": { + "message": "Last ned vedlegg", + "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" + }, + "replyToMessage": { + "message": "Svar på meldinga", + "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" + }, + "originalMessageNotFound": { + "message": "Fann ikkje den opphavlege meldinga", + "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" + }, + "originalMessageNotAvailable": { + "message": "Den opphavlege meldinga er ikkje tilgjengeleg lenger", + "description": "Shown in toast if user clicks on quote that references message no longer in database" + }, + "messageFoundButNotLoaded": { + "message": "Fann den opphavlege meldinga, men klarte ikkje å lasta ho. Rull opp for å lasta inn.", + "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" + }, + "voiceNoteMustBeOnlyAttachment": { + "message": "Ei talemelding må vera einaste vedlegg i ei melding.", + "description": "Shown in toast if tries to record a voice note with any staged attachments" + }, + "you": { + "message": "Du", + "description": "In Android theme, shown in quote if you or someone else replies to you" + }, + "replyingTo": { + "message": "Svarer $name$", + "description": "Shown in iOS theme when you or someone quotes to a message which is not from you", + "placeholders": { + "name": { + "content": "$1", + "example": "John" + } + } + }, + "audioPermissionNeeded": { + "message": "Gi Signal Desktop tilgang til mikrofonen din for å senda lydmeldingar.", + "description": "Shown if the user attempts to send an audio message without audio permssions turned on" + }, + "allowAccess": { + "message": "Gi tilgang", + "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" + }, + "showSettings": { + "message": "Vis innstillngar", + "description": "A button shown in dialog requesting the user to turn on audio permissions" + }, + "audio": { + "message": "Lyd", + "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" + }, + "video": { + "message": "Video", + "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video" + }, + "photo": { + "message": "Bilde", + "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" + }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, + "ok": { + "message": "OK", + "description": "" + }, + "cancel": { + "message": "Avbryt", + "description": "" + }, + "failedToSend": { + "message": "Kunne ikkje senda til visse mottakarar. Sjekk nettverkstilkoplinga.", + "description": "" + }, + "error": { + "message": "Feil", + "description": "" + }, + "messageDetail": { + "message": "Meldingsdetaljar", + "description": "" + }, + "delete": { + "message": "Slett", + "description": "" + }, + "deleteWarning": { + "message": "Er du sikker? Om du trykker «slett», vil meldinga fjernast frå berre denne eininga.", + "description": "" + }, + "deleteThisMessage": { + "message": "Slett denne meldinga", + "description": "" + }, + "from": { + "message": "Frå", + "description": "Label for the sender of a message" + }, + "to": { + "message": "to", + "description": "Label for the receiver of a message" + }, + "sent": { + "message": "Sendt", + "description": "Label for the time a message was sent" + }, + "received": { + "message": "Motteken", + "description": "Label for the time a message was received" + }, + "sendMessage": { + "message": "Send ei melding", + "description": "Placeholder text in the message entry field" + }, + "groupMembers": { + "message": "Gruppemedlemmer", + "description": "" + }, + "showMembers": { + "message": "Vis medlemmer", + "description": "" + }, + "resetSession": { + "message": "Nullstill økta", + "description": "This is a menu item for resetting the session, using the imperative case, as in a command." + }, + "showSafetyNumber": { + "message": "Vis tryggingsnummer", + "description": "" + }, + "viewAllMedia": { + "message": "Sjå all media", + "description": "This is a menu item for viewing all media (images + video) in a conversation, using the imperative case, as in a command." + }, + "verifyHelp": { + "message": "Viss du vil stadfesta sikkerheita på ende-til-ende-krypteringa med $name$, kan du samanlikna tala over med tala på eininga di.", + "description": "", + "placeholders": { + "name": { + "content": "$1", + "example": "John" + } + } + }, + "theirIdentityUnknown": { + "message": "Du har ikkje utveksla nokon meldingar med denne kontakten enno. Tryggingsnummeret ditt med dei vil vera tilgjengeleg etter den første meldinga.", + "description": "" + }, + "moreInfo": { + "message": "Meir info …", + "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" + }, + "retrySend": { + "message": "Send på nytt", + "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send" + }, + "deleteMessage": { + "message": "Slett meldinga", + "description": "Shown on the drop-down menu for an individual message, deletes single message" + }, + "deleteMessages": { + "message": "Slett meldingar", + "description": "Menu item for deleting messages, title case." + }, + "deleteConversationConfirmation": { + "message": "Vil du sletta denne samtalen?", + "description": "Confirmation dialog text that asks the user if they really wish to delete the conversation. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + }, + "sessionEnded": { + "message": "Sikker økt nullstillt", + "description": "This is a past tense, informational message. In other words, your secure session has been reset." + }, + "quoteThumbnailAlt": { + "message": "Miniatyrbilde i sitert melding", + "description": "Used in alt tag of thumbnail images inside of an embedded message quote" + }, + "imageAttachmentAlt": { + "message": "Bilde lagt ved i melding", + "description": "Used in alt tag of image attachment" + }, + "videoAttachmentAlt": { + "message": "Skjermbilde av video vedlagt i melding", + "description": "Used in alt tag of video attachment preview" + }, + "lightboxImageAlt": { + "message": "Bilde sendt i samtale", + "description": "Used in the alt tag for the image shown in a full-screen lightbox view" + }, + "imageCaptionIconAlt": { + "message": "Ikon som viser at bildet har bildetekst", + "description": "Used for the icon layered on top of an image in message bubbles" + }, + "addACaption": { + "message": "Legg til bildetekst …", + "description": "" + }, + "save": { + "message": "Lagra", + "description": "" + }, + "fileIconAlt": { + "message": "Filikon", + "description": "Used in the media gallery documents tab to visually represent a file" + }, + "emojiAlt": { + "message": "Emoji-bilde av «$title$»", + "description": "Used in the alt tag of all emoji images", + "placeholders": { + "title": { + "content": "$1", + "example": "grinning" + } + } + }, + "installWelcome": { + "message": "Velkommen til Signal Desktop", + "description": "Welcome title on the install page" + }, + "installTagline": { + "message": "Personvern er mogleg. Signal gjer det enkelt.", + "description": "Tagline displayed under 'installWelcome' string on the install page" + }, + "linkYourPhone": { + "message": "Kopla til telefonen din til Signal Desktop", + "description": "Shown on the front page when the application first starst, above the QR code" + }, + "signalSettings": { + "message": "Instillingar for Signal", + "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" + }, + "linkedDevices": { + "message": "Tilkopla einingar", + "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" + }, + "plusButton": { + "message": "«+»-knapp", + "description": "The button used in Signal Android to add a new linked device" + }, + "linkNewDevice": { + "message": "Kopla til ei ny eining", + "description": "The menu option shown in Signal iOS to add a new linked device" + }, + "deviceName": { + "message": "Einingsnamn", + "description": "The label in settings panel shown for the user-provided name for this desktop instance" + }, + "chooseDeviceName": { + "message": "Vel namnet til denne eininga", + "description": "The header shown on the 'choose device name' screen in the device linking process" + }, + "finishLinkingPhone": { + "message": "Fullfør tilkoplinga av telefon", + "description": "The text on the button to finish the linking process, after choosing the device name" + }, + "initialSync": { + "message": "Synkroniserer kontaktar og grupper", + "description": "Shown during initial link while contacts and groups are being pulled from mobile device" + }, + "installConnectionFailed": { + "message": "Kunne ikkje kopla til tenaren.", + "description": "Displayed when we can't connect to the server." + }, + "installTooManyDevices": { + "message": "Beklagar. Du har for mange einingar tilkopla. Prøv å fjerna nokre.", + "description": "" + }, + "settings": { + "message": "Innstillingar", + "description": "Menu item and header for global settings" + }, + "theme": { + "message": "Tema", + "description": "Header for theme settings" + }, + "permissions": { + "message": "Tillatingar", + "description": "Header for permissions section of settings" + }, + "mediaPermissionsDescription": { + "message": "Tillat tilgang til kamera og mikrofon", + "description": "Description of the media permission description" + }, + "general": { + "message": "Generelt", + "description": "Header for general options on the settings screen" + }, + "spellCheckDescription": { + "message": "Slå på stavekontroll av tekst du skriv i meldingsvindauget", + "description": "Description of the media permission description" + }, + "clearDataHeader": { + "message": "Slett data", + "description": "Header in the settings dialog for the section dealing with data deletion" + }, + "clearDataExplanation": { + "message": "Dette vil sletta all data i appen, inkludert alle meldingar og lagra kontoinformasjon.", + "description": "Text describing what the clear data button will do." + }, + "clearDataButton": { + "message": "Slett data", + "description": "Button in the settings dialog starting process to delete all data" + }, + "deleteAllDataHeader": { + "message": "Slett all data?", + "description": "Header of the full-screen delete data confirmation screen" + }, + "deleteAllDataBody": { + "message": "Du er i ferd med å sletta alt av den lagra brukarinformasjonen til denne applikasjonen, inkludert alle kontaktar og meldingar. Du kan alltids kopla til telefonen din igjen, men dette vil ikkje retta opp igjen sletta meldingar.", + "description": "Text describing what exactly will happen if the user clicks the button to delete all data" + }, + "deleteAllDataButton": { + "message": "Slett all data", + "description": "Text of the button that deletes all data" + }, + "deleteAllDataProgress": { + "message": "Koplar frå og slettar all data", + "description": "Message shown to user when app is disconnected and data deleted" + }, + "notifications": { + "message": "Varslingar", + "description": "Header for notification settings" + }, + "notificationSettingsDialog": { + "message": "Når meldingar kjem, vis varslingar som avslører:", + "description": "Explain the purpose of the notification settings" + }, + "disableNotifications": { + "message": "Deaktiver varslingar", + "description": "Label for disabling notifications" + }, + "nameAndMessage": { + "message": "Både namn og melding", + "description": "Label for setting notifications to display name and message text" + }, + "noNameOrMessage": { + "message": "Verken namn eller melding", + "description": "Label for setting notifications to display no name and no message text" + }, + "nameOnly": { + "message": "Berre namn", + "description": "Label for setting notifications to display sender name only" + }, + "newMessage": { + "message": "Ny melding", + "description": "Displayed in notifications for only 1 message" + }, + "newMessages": { + "message": "Nye meldingar", + "description": "Displayed in notifications for multiple messages" + }, + "notificationMostRecentFrom": { + "message": "Nyaste frå:", + "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" + }, + "notificationFrom": { + "message": "Frå:", + "description": "Displayed in notifications when setting is 'name only' and one message is waiting" + }, + "notificationMostRecent": { + "message": "Siste:", + "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" + }, + "sendFailed": { + "message": "Sending feila", + "description": "Shown on outgoing message if it fails to send" + }, + "showMore": { + "message": "Detaljar", + "description": "Displays the details of a key change" + }, + "showLess": { + "message": "Skjul detaljar", + "description": "Hides the details of a key change" + }, + "learnMore": { + "message": "Lær meir om å godkjenna tryggingsnummer", + "description": "Text that links to a support article on verifying safety numbers" + }, + "expiredWarning": { + "message": "Denne utgåva av Signal Desktop er forelda. Oppgrader til siste utgåve for å fortsetja.", + "description": "Warning notification that this version of the app has expired" + }, + "upgrade": { + "message": "Oppgrader", + "description": "Label text for button to upgrade the app to the latest version" + }, + "mediaMessage": { + "message": "Mediemelding", + "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." + }, + "unregisteredUser": { + "message": "Nummeret er ikkje registrert", + "description": "Error message displayed when sending to an unregistered user." + }, + "sync": { + "message": "Kontakt", + "description": "Label for contact and group sync settings" + }, + "syncExplanation": { + "message": "Importer alle Signal-grupper og kontaktar frå den mobile eininga di.", + "description": "Explanatory text for sync settings" + }, + "lastSynced": { + "message": "Siste import var", + "description": "Label for date and time of last sync operation" + }, + "syncNow": { + "message": "Importer no", + "description": "Label for a button that syncs contacts and groups from your phone" + }, + "syncing": { + "message": "Importerer …", + "description": "Label for a disabled sync button while sync is in progress." + }, + "syncFailed": { + "message": "Klarte ikkje importera. Sørg for at datamaskina og telefonen din er kopla til internett.", + "description": "Informational text displayed if a sync operation times out." + }, + "timestamp_s": { + "message": "no", + "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." + }, + "timestamp_m": { + "message": "1 minutt", + "description": "Brief timestamp for messages sent about one minute ago. Displayed in the conversation list and message bubble." + }, + "timestamp_h": { + "message": "1 time", + "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." + }, + "hoursAgoShort": { + "message": "$hours$ t", + "description": "Even further contracted form of 'X hours ago' which works both for singular and plural, used in the left pane", + "placeholders": { + "hours": { + "content": "$1", + "example": "2" + } + } + }, + "hoursAgo": { + "message": "$hours$ t sidan", + "description": "Contracted form of 'X hours ago' which works both for singular and plural", + "placeholders": { + "hours": { + "content": "$1", + "example": "2" + } + } + }, + "minutesAgoShort": { + "message": "$minutes$ min", + "description": "Even further contracted form of 'X minutes ago' which works both for singular and plural, used in the left pane", + "placeholders": { + "minutes": { + "content": "$1", + "example": "10" + } + } + }, + "minutesAgo": { + "message": "$minutes$ min sidan", + "description": "Contracted form of 'X minutes ago' which works both for singular and plural", + "placeholders": { + "minutes": { + "content": "$1", + "example": "10" + } + } + }, + "justNow": { + "message": "no", + "description": "Shown if a message is very recent, less than 60 seconds old" + }, + "timestampFormat_M": { + "message": "D. MMM", + "description": "Timestamp format string for displaying month and day (but not the year) of a date within the current year, ex: use 'MMM D' for 'Aug 8', or 'D MMM' for '8 Aug'." + }, + "unblockToSend": { + "message": "Opphev blokkeringa på denne kontakten for å senda ei melding.", + "description": "Brief message shown when trying to message a blocked number" + }, + "unblockGroupToSend": { + "message": "Opphev blokkeringa av denne gruppa for å senda.", + "description": "Brief message shown when trying to message a blocked group" + }, + "youChangedTheTimer": { + "message": "Du sette utløpstida for meldingane i samtalen til $time$", + "description": "Message displayed when you change the message expiration timer in a conversation.", + "placeholders": { + "time": { + "content": "$1", + "example": "10m" + } + } + }, + "timerSetOnSync": { + "message": "Oppdaterte utløpstida til $time$", + "description": "Message displayed when timer is set on initial link of desktop device.", + "placeholders": { + "time": { + "content": "$1", + "example": "10m" + } + } + }, + "theyChangedTheTimer": { + "message": "$name$oppdaterte utløpstida til $time$", + "description": "Message displayed when someone else changes the message expiration timer in a conversation.", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + }, + "time": { + "content": "$2", + "example": "10m" + } + } + }, + "timerOption_0_seconds": { + "message": "av", + "description": "Label for option to turn off message expiration in the timer menu" + }, + "timerOption_5_seconds": { + "message": "5 sekund", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_10_seconds": { + "message": "10 sekund", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_30_seconds": { + "message": "30 sekund", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_1_minute": { + "message": "1 minutt", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_5_minutes": { + "message": "5 minutt", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_30_minutes": { + "message": "30 minutt", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_1_hour": { + "message": "1 time", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_6_hours": { + "message": "6 timar", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_12_hours": { + "message": "12 timar", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_1_day": { + "message": "1 dag", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "timerOption_1_week": { + "message": "1 veke", + "description": "Label for a selectable option in the message expiration timer menu" + }, + "disappearingMessages": { + "message": "Forsvinnande meldingar", + "description": "Conversation menu option to enable disappearing messages" + }, + "timerOption_0_seconds_abbreviated": { + "message": "av", + "description": "Short format indicating current timer setting in the conversation list snippet" + }, + "timerOption_5_seconds_abbreviated": { + "message": "5s", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_10_seconds_abbreviated": { + "message": "10s", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_30_seconds_abbreviated": { + "message": "30s", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_1_minute_abbreviated": { + "message": "1m", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_5_minutes_abbreviated": { + "message": "5m", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_30_minutes_abbreviated": { + "message": "30m", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_1_hour_abbreviated": { + "message": "1t", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_6_hours_abbreviated": { + "message": "6t", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_12_hours_abbreviated": { + "message": "12t", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_1_day_abbreviated": { + "message": "1d", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "timerOption_1_week_abbreviated": { + "message": "1v", + "description": "Very short format indicating current timer setting in the conversation header" + }, + "disappearingMessagesDisabled": { + "message": "Forsvinnande meldingar er slått av", + "description": "Displayed in the left pane when the timer is turned off" + }, + "disabledDisappearingMessages": { + "message": "$name$slo av forsvinnande meldingar", + "description": "Displayed in the conversation list when the timer is turned off", + "placeholders": { + "name": { + "content": "$1", + "example": "John" + } + } + }, + "youDisabledDisappearingMessages": { + "message": "Du slo av forsvinnande meldingar", + "description": "Displayed in the conversation list when the timer is turned off" + }, + "timerSetTo": { + "message": "Tidtakar sett til $time$", + "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", + "placeholders": { + "time": { + "content": "$1", + "example": "1w" + } + } + }, + "audioNotificationDescription": { + "message": "Spel av lydvarsling", + "description": "Description for audio notification setting" + }, + "safetyNumberChanged": { + "message": "Tryggingsnummeret er endra", + "description": "A notification shown in the conversation when a contact reinstalls" + }, + "safetyNumberChangedGroup": { + "message": "Tryggingsnummeret til $name$ er endra", + "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", + "placeholders": { + "name": { + "content": "$1", + "example": "John" + } + } + }, + "verifyNewNumber": { + "message": "Godkjenn tryggingsnummer", + "description": "Label on button included with safety number change notification in the conversation" + }, + "yourSafetyNumberWith": { + "message": "Tryggingsnummera dine med $name$:", + "description": "Heading for safety number view", + "placeholders": { + "name": { + "content": "$1", + "example": "John" + } + } + }, + "themeLight": { + "message": "Lyst", + "description": "Label text for light theme (normal)" + }, + "themeDark": { + "message": "Mørkt", + "description": "Label text for dark theme" + }, + "noteToSelf": { + "message": "Notat til meg sjølv", + "description": "Name for the conversation with your own phone number" + }, + "hideMenuBar": { + "message": "Skjul menylinje", + "description": "Label text for menu bar visibility setting" + }, + "startConversation": { + "message": "Start new conversation…", + "description": "Label underneath number a user enters that is not an existing contact" + }, + "newPhoneNumber": { + "message": "Skriv inn eit telefonnummer for å legga til ein kontakt.", + "description": "Placeholder for adding a new number to a contact" + }, + "invalidNumberError": { + "message": "Ugyldig nummer", + "description": "When a person inputs a number that is invalid" + }, + "unlinkedWarning": { + "message": "Kopla saman Signal Desktop med mobileininga di på nytt for å fortsetja.", + "description": "" + }, + "unlinked": { + "message": "Fråkopla eining", + "description": "" + }, + "relink": { + "message": "Kopla til på nytt", + "description": "" + }, + "autoUpdateNewVersionTitle": { + "message": "Signal-oppdatering tilgjengeleg", + "description": "" + }, + "autoUpdateNewVersionMessage": { + "message": "Ei ny utgåve av Signal er tilgjengeleg", + "description": "" + }, + "autoUpdateNewVersionInstructions": { + "message": "Trykk «Start Signal på nytt» for å fullføra oppgraderinga.", + "description": "" + }, + "autoUpdateRestartButtonLabel": { + "message": "Start Signal på nytt", + "description": "" + }, + "autoUpdateLaterButtonLabel": { + "message": "Seinare", + "description": "" + }, + "leftTheGroup": { + "message": "$name$ forlét gruppa", + "description": "Shown in the conversation history when a single person leaves the group", + "placeholders": { + "name": { + "content": "$1", + "example": "Bob" + } + } + }, + "multipleLeftTheGroup": { + "message": "$name$ forlét gruppa", + "description": "Shown in the conversation history when multiple people leave the group", + "placeholders": { + "name": { + "content": "$1", + "example": "Alice, Bob" + } + } + }, + "updatedTheGroup": { + "message": "Gruppa er oppdatert", + "description": "Shown in the conversation history when someone updates the group" + }, + "titleIsNow": { + "message": "Tittelen er no «$name$»", + "description": "Shown in the conversation history when someone changes the title of the group", + "placeholders": { + "name": { + "content": "$1", + "example": "Book Club" + } + } + }, + "joinedTheGroup": { + "message": "$name$ vart med i gruppa", + "description": "Shown in the conversation history when a single person joins the group", + "placeholders": { + "name": { + "content": "$1", + "example": "Alice" + } + } + }, + "multipleJoinedTheGroup": { + "message": "$names$ vart med i gruppa", + "description": "Shown in the conversation history when more than one person joins the group", + "placeholders": { + "names": { + "content": "$1", + "example": "Alice, Bob" + } + } + } +} diff --git a/_locales/no/messages.json b/_locales/no/messages.json index 2a33448508..617d1bb17e 100644 --- a/_locales/no/messages.json +++ b/_locales/no/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Fil", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Velg mappe", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Når du inkluderer et vedlegg som ikke er et bilde, er begrensningen ett vedlegg per melding.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Du kan ikke blande vedlegg som er bilder med vedlegg som ikke er bilder i samme melding.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Avslutt", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Legg inn navn eller nummer", + "search": { + "message": "Søk", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversations", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakt", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Messages", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Velkommen til Signal!", "description": "" }, @@ -673,6 +727,10 @@ "message": "Postboks", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Laster ned", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Last ned Vedlegg", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Bilde", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Til", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Generelt", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Slå på stavekontroll av tekst du skriver i meldingsvinduet", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Denne versjonen av Signal Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android-klienter mottar bare de første 2000 tegnene i denne meldingen.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Oppgrader", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Mørkt", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Skjul menylinje", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start samtale...", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Vilkår og personvernerklæring", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index fa6f85f8de..d3b3d45c69 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Skopiuj błąd i zakończ", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Nieznana grupa", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Błąd bazy danych", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Usuń wszystkie dane i uruchom ponownie", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Plik", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Zarchiwizowane rozmowy", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Te rozmowy są zarchiwizowane i pojawią się w Odebranych tylko po otrzymaniu nowych wiadomości.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archiwum konwersacji", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Przenieś konwersacje do skrzynki odbiorczej", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Wybierz folder", "description": "Button to allow the user to find a folder on disk" @@ -254,7 +286,7 @@ } }, "youMarkedAsVerified": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa $name$ jako zweryfikowany", + "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako zweryfikowany", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -264,7 +296,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa $name$ jako niezweryfikowany", + "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako niezweryfikowany", "description": "Shown in the conversation history when the user marks a contact as not verified, whether on the Safety Number screen or by dismissing a banner or dialog.", "placeholders": { "name": { @@ -488,7 +520,7 @@ "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "Projekt miniaturki podglądu linku do $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "Podgląd miniaturki linku dla $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "Projekt załącznika obrazu: $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -521,7 +553,7 @@ "message": "W przypadku dołączenia załącznika innego niż obraz, limit wynosi jeden załącznik na wiadomość.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Nie można łączyć obrazów z innymi załącznikami w jednej wiadomości.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Wyjdź", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Wprowadź nazwę lub numer", + "search": { + "message": "Szukaj", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Brak wyników dla \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Rozmowy", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakty", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Wiadomości", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Witamy w Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Skrzynka pocztowa", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Pobieranie", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Pobierz załącznik", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Zdjęcie", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Do", + "message": "do", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Ogólne", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Podgląd linków", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Podglądy linków są obsługiwane dla Imgur, Instagram, Reddit i YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Włącz sprawdzanie pisowni podczas pisania wiadomości", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Ta wersja Signal Desktop jest przestarzała. Aby nadal wysyłać wiadomości, wykonaj aktualizację.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "W aplikacji na Androida widoczne będzie tylko pierwsze 2000 znaków z tej wiadomości.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Aktualizuj", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Ciemny", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Moje notatki", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Ukryj pasek menu", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Rozpocznij rozmowę...", + "message": "Rozpocznij nową rozmowę...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Warunki korzystania & Polityka prywatności", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index a6fd095129..f7deb63b2c 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copiar erro e sair", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Grupo desconhecido", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Erro na base de dados", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Apagar todos os dados e reiniciar", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Arquivo", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,12 +161,28 @@ } } }, + "archivedConversations": { + "message": "Conversas arquivadas", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Estas conversas estão arquivadas. Elas aparecerão na caixa de entrada somente se novas mensagens forem recebidas.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arquivar conversa", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Mover conversa para Caixa de Entrada", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Escolher pasta", "description": "Button to allow the user to find a folder on disk" }, "chooseFile": { - "message": "Choose file", + "message": "Escolher arquivo", "description": "Button to allow the user to find a file on disk" }, "loadDataHeader": { @@ -484,11 +516,11 @@ "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "Carregando pré-visualização...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "Pré-visualização em miniatura do link $domain$ (rascunho)", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "Pré-visualização em miniatura do link $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "Rascunho de imagem anexa: $path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -518,15 +550,15 @@ } }, "oneNonImageAtATimeToast": { - "message": "When including a non-image attachment, the limit is one attachment per message.", + "message": "O limite para inclusão de anexos que não sejam imagens é de um por mensagem.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "You cannot mix non-image and image attachments in one message.", + "cannotMixImageAndNonImageAttachments": { + "message": "Você não pode combinar imagens e anexos que não sejam imagens na mesma mensagem.", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { - "message": "You cannot add any more attachments to this message.", + "message": "Você não pode adicionar mais nenhum anexo a esta mensagem.", "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { @@ -611,15 +643,37 @@ "message": "Sair", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Inserir nome ou número", + "search": { + "message": "Buscar", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Sem resultados para \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversas", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contatos", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Mensagens", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Boas-vindas ao Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Caixa postal", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "A transferir", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Baixar anexo", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -694,7 +752,7 @@ "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" }, "voiceNoteMustBeOnlyAttachment": { - "message": "A voice note must be the only attachment included in a message.", + "message": "Um áudio deve ser o único anexo incluso em uma mensagem.", "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Para", + "message": "para", "description": "Label for the receiver of a message" }, "sent": { @@ -866,7 +932,7 @@ "description": "Used for the icon layered on top of an image in message bubbles" }, "addACaption": { - "message": "Add a caption...", + "message": "Adicionar legenda...", "description": "" }, "save": { @@ -959,14 +1025,6 @@ "message": "Geral", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Ativar a verificação ortográfica do texto digitado na caixa de edição de mensagens", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Esta versão do Signal Desktop expirou. Por favor, atualize-o para a versão mais recente para continuar enviando mensagens.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Clientes do Android receberão apenas os primeiros 2000 caracteres desta mensagem.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Atualizar", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Escuro", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Recado para mim", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Ocultar a barra de opções", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Iniciar conversa...", + "message": "Iniciar uma conversa…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Termos & Política de Privacidade", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/pt_PT/messages.json b/_locales/pt_PT/messages.json index 83d604385d..1cf05c89d9 100644 --- a/_locales/pt_PT/messages.json +++ b/_locales/pt_PT/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copiar erro e sair", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Grupo desconhecido", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Erro na base de dados", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Eliminar todos os dados e reiniciar", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Ficheiro", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -24,15 +40,15 @@ "description": "The label that is used for the Preferences menu in the program main menu. This should be consistent with the standard naming for ‘Preferences’ on the operating system." }, "appMenuHide": { - "message": "Esconder", + "message": "Ocultar", "description": "Application menu command to hide the window" }, "appMenuHideOthers": { - "message": "Esconder Outros", + "message": "Ocultar outros", "description": "Application menu command to hide all other windows" }, "appMenuUnhide": { - "message": "Mostrar Tudo", + "message": "Exibir tudo", "description": "Application menu command to show all application windows" }, "appMenuQuit": { @@ -64,11 +80,11 @@ "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { - "message": "Apagar", + "message": "Eliminar", "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Seleccionar Tudo", + "message": "Selecionar tudo", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -80,7 +96,7 @@ "description": "Edit menu item under 'speech' to stop dictation" }, "windowMenuClose": { - "message": "Fechar Janela", + "message": "Fechar janela", "description": "Window menu command to close the current window" }, "windowMenuMinimize": { @@ -92,39 +108,39 @@ "description": "Window menu command to make the current window the size of the whole screen" }, "windowMenuBringAllToFront": { - "message": "Trazer Todos para a Frente", + "message": "Trazer todos para a frente", "description": "Window menu command to bring all windows of current applicatinon to front" }, "viewMenuResetZoom": { - "message": "Tamanho Real", + "message": "Tamanho real", "description": "View menu command to go back to the default zoom" }, "viewMenuZoomIn": { - "message": "Zoom in", + "message": "Aumentar", "description": "View menu command to make everything bigger" }, "viewMenuZoomOut": { - "message": "Zoom Out", + "message": "Diminuir", "description": "View menu command to make everything smaller" }, "viewMenuToggleFullScreen": { - "message": "Activar Ecrã Completo", + "message": "Ativar ecrã completo", "description": "View menu command to enter or leave Full Screen mode" }, "viewMenuToggleDevTools": { - "message": "Activar Ferramentas de Desenvolvimento", + "message": "Ativar ferramentas do programador", "description": "View menu command to show or hide the developer tools" }, "menuSetupWithImport": { - "message": "Configurar com Importação", + "message": "Configurar com a importação", "description": "When the application is not yet set up, menu option to start up the import sequence" }, "menuSetupAsNewDevice": { - "message": "Configurar como Novo Dispositivo", + "message": "Configurar como novo dispositivo", "description": "When the application is not yet set up, menu option to start up the set up as fresh device" }, "menuSetupAsStandalone": { - "message": "Configurar como Dispositivo Autónomo", + "message": "Configurar como dispositivo autónomo", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" }, "loading": { @@ -132,11 +148,11 @@ "description": "Message shown on the loading screen before we've loaded any messages" }, "optimizingApplication": { - "message": "A optimizar aplicação...", + "message": "A otimizar aplicação...", "description": "Message shown on the loading screen while we are doing application optimizations" }, "migratingToSQLCipher": { - "message": "A optimizar mensagens... $status$ completo.", + "message": "A otimizar mensagens... $status$ completo.", "description": "Message shown on the loading screen while we are doing application optimizations", "placeholders": { "status": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Conversas arquivadas", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Estas conversas estão arquivadas e apenas irão aparecer na caixa de entrada caso receba novas mensagens.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arquivar conversa", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Mover conversas para a caixa de entrada", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Escolher pasta", "description": "Button to allow the user to find a folder on disk" @@ -158,27 +190,27 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Acabou de passar pelo processo de exportação, e os seus contactos e mensagens estão a aguardar pacientemente no seu computados. Seleccione a pasta que contém os seus dados Signal guardados.", + "message": "Acabou de passar pelo processo de exportação, e os seus contactos e mensagens estão a aguardar pacientemente no seu computados. Selecione a pasta que contém os seus dados Signal guardados.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { - "message": "Escolha a pasta com dados exportados", + "message": "Escolha a pasta com os dados exportados", "description": "Title of the popup window used to select data previously exported" }, "importErrorHeader": { - "message": "Algo correu mal!", + "message": "Ocorreu algo de errado!", "description": "Header of the error screen after a failed import" }, "importingHeader": { - "message": "Carregar contactos e mensagens", + "message": "A carregar contactos e mensagens", "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Assegure-se que escolheu a pasta correcta onde se encontram os seus dados Signal. O nome da pasta deverá começar por 'Signal Export'. Também poderá copiar os seus dados desde a aplicação Chrome. ", + "message": "Assegure-se que escolheu a diretoria correta onde se encontram os seus dados do Signal. O nome da diretoria deverá começar por 'Signal Export'. Também poderá copiar os seus dados a partir da aplicação Chrome. ", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { - "message": "Se estes passos não funcionarem, por favor envie um relatório de erros (Ver -> Relatório de Erros) para que possamos ajudar-lhe com a migração!", + "message": "Se estes passos não funcionarem, envie por favor um relatório de erros (Ver -> Relatório de erros) para que possamos ajudar-lhe com a migração!", "description": "Message shown if the import went wrong; second paragraph" }, "importAgain": { @@ -190,7 +222,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Começar a usar Signal Desktop", + "message": "Começar a utilizar o Signal Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -198,11 +230,11 @@ "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, "selectedLocation": { - "message": "a sua localização seleccionada", + "message": "a sua localização selecionada", "description": "Message shown as the export location if we didn't capture the target directory" }, "upgradingDatabase": { - "message": "A actualizar a base de dados, poderá demorar algum tempo...", + "message": "A atualizar a base de dados. Isto poderá demorar algum tempo...", "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" }, "loadingMessages": { @@ -224,11 +256,11 @@ "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Saiu do grupo", + "message": "Você saiu do grupo", "description": "Displayed when a user can't send a message because they have left the group" }, "scrollDown": { - "message": "Ir para o fundo da conversa", + "message": "Ir para o fim da conversa", "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" }, "messageBelow": { @@ -240,11 +272,11 @@ "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" }, "unreadMessage": { - "message": "1 Mensagem Não Lida", + "message": "1 mensagem por ler", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ Mensagens Não Lidas", + "message": "$count$ mensagens por ler", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -298,11 +330,11 @@ "description": "When there are multiple previously-verified group members with safety number changes, a banner will be shown. The list of contacts with safety number changes is shown, and this text introduces that list." }, "changedSinceVerifiedMultiple": { - "message": "Os números de segurança com vários membros do grupo mudaram desde a última vez que os verificou. Isto poderá querer dizer que alguém está a tentar interceptar as suas comunicações ou simplesmente que esses membros reinstalaram o Signal.", + "message": "Os números de segurança com vários membros do grupo mudaram desde a última vez que os verificou. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que esses membros reinstalaram o Signal.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "O número de segurança com $name$ mudou desde a última verificação. Isto poderá querer dizer que alguém está a tentar interceptar as suas comunicações ou que $name$ simplesmente reinstalou o Signal.", + "message": "O seu número de segurança com $name$ mudou desde a última verificação. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Signal.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -312,7 +344,7 @@ } }, "changedRightAfterVerify": { - "message": "O número de segurança que está a tentar verificar mudou. Por favor, reveja o seu novo número de segurança com $name$. Lembre-se, esta alteração poderá significar que alguém está a tentar interceptar as suas comunicações ou que $name$ simplesmente reinstalou o Signal.", + "message": "O número de segurança que está a tentar verificar mudou. Por favor, reveja o seu novo número de segurança com $name$. Lembre-se, esta alteração poderá significar que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Signal.", "description": "Shown on the safety number screen when the user has selected to verify/unverify a contact's safety number, and we immediately discover a safety number change", "placeholders": { "name": { @@ -322,11 +354,11 @@ } }, "changedRecentlyMultiple": { - "message": "Os números de segurança com vários membros do grupo mudaram recentemente. Isto pode significar que alguém está a tentar interceptar as suas comunicações ou simplesmente os membros do grupo reinstalaram o Signal.", + "message": "Os números de segurança com vários membros do grupo mudaram recentemente. Isto pode significar que alguém está a tentar intercetar as suas comunicações ou simplesmente que os membros do grupo reinstalaram o Signal.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "O número de segurança com $name$ mudou recentemente. Isto poderá querer dizer que alguém está a tentar interceptar as suas comunicações ou que $name$ simplesmente reinstalou o Signal.", + "message": "O número de segurança com $name$ mudou recentemente. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Signal.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -336,7 +368,7 @@ } }, "identityKeyErrorOnSend": { - "message": "O número de segurança com $name$ mudou. Isto poderá querer dizer que alguém está a tentar interceptar as suas comunicações ou que $name$ simplesmente reinstalou o Signal. Poderá querer verificar os seus números de segurança com o seu contacto.", + "message": "O número de segurança com $name$ mudou. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Signal. Poderá querer verificar os seus números de segurança com o seu contacto.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -346,7 +378,7 @@ } }, "sendAnyway": { - "message": "Enviar ainda assim", + "message": "Enviar mesmo assim", "description": "Used on a warning dialog to make it clear that it might be risky to send the message." }, "noLongerVerified": { @@ -364,11 +396,11 @@ "description": "Shown in conversation banner when more than one group member's safety number has changed, but they were previously verified." }, "debugLogExplanation": { - "message": "Este relatório será publicado online para os contribuidores o analisarem. É possível examiná-lo e editá-lo antes de o submeter.", + "message": "Este relatório será publicado on-line para que os contribuidores o analisem. É possível examiná-lo e editá-lo antes de o submeter.", "description": "" }, "debugLogError": { - "message": "Algo correu mal ao carregar! Por favor considere adicionar um relatório de erros para o Erro que vai enviar.", + "message": "Algo correu mal ao carregar! Por favor considere que adicionar um relatório de erros para o Erro que vai enviar.", "description": "" }, "reportIssue": { @@ -380,7 +412,7 @@ "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { - "message": "Enviar", + "message": "Submeter", "description": "" }, "acceptNewKey": { @@ -424,7 +456,7 @@ "description": "Header for a key change dialog" }, "identityChanged": { - "message": "O número de segurança com este contacto foi alterado. Isto pode significar que alguém está a tentar interceptar a sua comunicação, o que o seu contacto simplesmente reinstalou o Signal. Poderá querer verificar o seu novo número de segurança abaixo.", + "message": "O número de segurança com este contacto foi alterado. Isto pode significar que alguém está a tentar intercetar a sua comunicação, ou que o seu contacto simplesmente reinstalou o Signal. Poderá querer verificar o seu novo número de segurança abaixo.", "description": "" }, "incomingError": { @@ -436,7 +468,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Não tem média nesta conversa", + "message": "Não tem nenhum multimédia nesta conversa", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -456,11 +488,11 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Esta Semana", + "message": "Esta semana", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Este Mês", + "message": "Este mês", "description": "Section header in the media gallery" }, "unsupportedAttachment": { @@ -472,7 +504,7 @@ "description": "Hover text for attachment filenames" }, "unnamedFile": { - "message": "Ficheiro Sem Nome", + "message": "Ficheiro sem nome", "description": "Hover text for attachment filenames" }, "voiceMessage": { @@ -480,7 +512,7 @@ "description": "Name for a voice message attachment" }, "dangerousFileType": { - "message": "Tipo de ficheiro deste anexo não é permitido por razões de segurança", + "message": "O tipo de ficheiro deste anexo não é permitido por razões de segurança", "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { @@ -488,7 +520,7 @@ "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Pré-visualização da hiperligação do esboço da miniatura $domain$", + "message": "Pré-visualização da hiperligação da miniatura do esboço $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -518,10 +550,10 @@ } }, "oneNonImageAtATimeToast": { - "message": "Se o anexo não é uma imagem, apenas pode enviar um anexo por mensagem.", + "message": "Se o anexo não for uma imagem, apenas pode enviar um anexo por mensagem.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Não pode misturar imagens com outro tipo de anexos numa só mensagem.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -530,11 +562,11 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Lamentamos, o ficheiro seleccionado excede o tamanho máximo permitido.", + "message": "Lamentamos, mas o ficheiro selecionado excede o tamanho máximo permitido.", "description": "" }, "unableToLoadAttachment": { - "message": "Não foi possível carregar o anexo seleccionado.", + "message": "Não foi possível carregar o anexo selecionado.", "description": "" }, "disconnected": { @@ -546,7 +578,7 @@ "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { - "message": "Desligado", + "message": "Offline", "description": "Displayed when the desktop client has no network connection." }, "checkNetworkConnection": { @@ -554,7 +586,7 @@ "description": "Obvious instructions for when a user's computer loses its network connection" }, "attemptingReconnection": { - "message": "Tentativa de ligação em $reconnect_duration_in_seconds$ segundos", + "message": "Nova tentativa de ligação dentro de $reconnect_duration_in_seconds$ segundos", "description": "", "placeholders": { "reconnect_duration_in_seconds": { @@ -564,35 +596,35 @@ } }, "submitDebugLog": { - "message": "Enviar relatório de erros", + "message": "Enviar relatório de depuração", "description": "Menu item and header text for debug log modal (sentence case)" }, "debugLog": { - "message": "Relatório de Erros", + "message": "Relatório de depuração", "description": "View menu item to open the debug log (title case)" }, "goToReleaseNotes": { - "message": "Ir para Notas de Lançamento", + "message": "Ir para as notas de lançamento", "description": "" }, "goToForums": { - "message": "Ir para Fóruns", + "message": "Ir para os fóruns", "description": "Item under the Help menu, takes you to the forums" }, "goToSupportPage": { - "message": "Ir para Página de Suporte", + "message": "Ir para a página de suporte", "description": "Item under the Help menu, takes you to the support page" }, "menuReportIssue": { - "message": "Reportar um Problema", + "message": "Reportar um problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, "signalDesktopPreferences": { - "message": "Definições Signal Desktop", + "message": "Definições do Signal Desktop", "description": "Title of the window that pops up with Signal Desktop preferences in it" }, "aboutSignalDesktop": { - "message": "Acerca de Signal Desktop", + "message": "Acerca do Signal Desktop", "description": "Item under the Help menu, which opens a small about window" }, "speech": { @@ -604,31 +636,53 @@ "description": "Command under Window menu, to show the window" }, "hide": { - "message": "Esconder", + "message": "Ocultar", "description": "Command in the tray icon menu, to hide the window" }, "quit": { "message": "Sair", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Insira nome ou número", + "search": { + "message": "Procurar", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { - "message": "Bem-vindo ao Signal", + "noSearchResults": { + "message": "Sem resultados para \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversas", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contactos", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Mensagens", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { + "message": "Bem-vindo(a) ao Signal", "description": "" }, "selectAContact": { - "message": "Seleccione um contacto ou grupo para trocar mensagens.", + "message": "Selecione um contacto ou grupo para começar a trocar mensagens.", "description": "" }, "typingAlt": { - "message": "Animação de escrever para esta conversa.", + "message": "Apresentar escrita com animação para esta conversa.", "description": "Used as the 'title' attibute for the typing animation" }, "contactAvatarAlt": { @@ -642,7 +696,7 @@ } }, "sendMessageToContact": { - "message": "Enviar Mensagem", + "message": "Enviar mensagem", "description": "Shown when you are sent a contact and that contact has a signal account" }, "home": { @@ -670,19 +724,23 @@ "description": "Generic label shown if contact address has custom type but no label" }, "poBox": { - "message": "Código Postal", + "message": "Código postal", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "A descarregar", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { - "message": "Descarregar Anexo", + "message": "Descarregar anexo", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" }, "replyToMessage": { - "message": "Responder à Mensagem", + "message": "Responder à mensagem", "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { - "message": "A mensagem original não foi encontrada", + "message": "Não foi encontrada a mensagem original", "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" }, "originalMessageNotAvailable": { @@ -690,11 +748,11 @@ "description": "Shown in toast if user clicks on quote that references message no longer in database" }, "messageFoundButNotLoaded": { - "message": "Mensagem Original foi encontrada mas não carregada. Mova o texto para cima para a carregar.", + "message": "A mensagem original foi encontrada mas não carregada. Mova o texto para cima para a carregar.", "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" }, "voiceNoteMustBeOnlyAttachment": { - "message": "Uma nota de voz é o único anexo que pode ser incluído numa mensagem.", + "message": "Uma nota de voz deverá ser o único anexo incluído numa mensagem.", "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { @@ -716,11 +774,11 @@ "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { - "message": "Permitir Acesso", + "message": "Permitir o acesso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, "showSettings": { - "message": "Mostrar Definições", + "message": "Mostrar definições", "description": "A button shown in dialog requesting the user to turn on audio permissions" }, "audio": { @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -756,15 +822,15 @@ "description": "" }, "delete": { - "message": "Apagar", + "message": "Eliminar", "description": "" }, "deleteWarning": { - "message": "Tem a certeza? Clicar em 'apagar' irá remover permanentemente esta mensagem deste dispositivo.", + "message": "Tem a certeza? Clicar em 'Eliminar' irá remover permanentemente esta mensagem deste dispositivo.", "description": "" }, "deleteThisMessage": { - "message": "Apagar esta mensagem", + "message": "Eliminar esta mensagem", "description": "" }, "from": { @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Para", + "message": "para", "description": "Label for the receiver of a message" }, "sent": { @@ -808,7 +874,7 @@ "description": "This is a menu item for viewing all media (images + video) in a conversation, using the imperative case, as in a command." }, "verifyHelp": { - "message": "Se deseja verificar a segurança da sua cifragem ponto-a-ponto com $name$, compare os números acima com os números no dispositivo.", + "message": "Se deseja verificar a segurança da sua cifragem ponto-a-ponto com $name$, compare os números acima com os números existentes no dispositivo dessa pessoa.", "description": "", "placeholders": { "name": { @@ -826,19 +892,19 @@ "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" }, "retrySend": { - "message": "Tentar Enviar Novamente ", + "message": "Tentar enviar novamente ", "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send" }, "deleteMessage": { - "message": "Apagar Mensagem", + "message": "Eliminar mensagem", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { - "message": "Apagar mensagens", + "message": "Eliminar mensagens", "description": "Menu item for deleting messages, title case." }, "deleteConversationConfirmation": { - "message": "Deseja apagar esta conversa definitivamente?", + "message": "Deseja eliminar definitivamente esta conversa?", "description": "Confirmation dialog text that asks the user if they really wish to delete the conversation. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." }, "sessionEnded": { @@ -846,7 +912,7 @@ "description": "This is a past tense, informational message. In other words, your secure session has been reset." }, "quoteThumbnailAlt": { - "message": "Thumbnail da imagem da mensagem", + "message": "Miniatura da imagem da mensagem", "description": "Used in alt tag of thumbnail images inside of an embedded message quote" }, "imageAttachmentAlt": { @@ -854,7 +920,7 @@ "description": "Used in alt tag of image attachment" }, "videoAttachmentAlt": { - "message": "Screenshot do video anexado à mensagem", + "message": "Captura do ecrã do video anexado à mensagem", "description": "Used in alt tag of video attachment preview" }, "lightboxImageAlt": { @@ -874,7 +940,7 @@ "description": "" }, "fileIconAlt": { - "message": "Ícone do Ficheiro", + "message": "Ícone do ficheiro", "description": "Used in the media gallery documents tab to visually represent a file" }, "emojiAlt": { @@ -888,7 +954,7 @@ } }, "installWelcome": { - "message": "O Signal Desktop dá-lhe as Boas-vindas!", + "message": "O Signal Desktop dá-lhe as boas-vindas!", "description": "Welcome title on the install page" }, "installTagline": { @@ -904,7 +970,7 @@ "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" }, "linkedDevices": { - "message": "Dispositivos Associados", + "message": "Dispositivos associados", "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" }, "plusButton": { @@ -952,31 +1018,23 @@ "description": "Header for permissions section of settings" }, "mediaPermissionsDescription": { - "message": "Permitir acesso à câmara e ao microfone", + "message": "Permitir o acesso à câmara e ao microfone", "description": "Description of the media permission description" }, "general": { "message": "Geral", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Enviar pré-visualização de hiperligações", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "As pré-visualizações são suportadas em hiperligações do Imgur, Instagram, Reddit, e YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { - "message": "Active a verificação ortográfica para o texto introduzido", + "message": "Ative a verificação ortográfica para o texto introduzido", "description": "Description of the media permission description" }, "clearDataHeader": { - "message": "Limpar Dados", + "message": "Limpar dados", "description": "Header in the settings dialog for the section dealing with data deletion" }, "clearDataExplanation": { - "message": "Isto limpará todos os dados da aplicação, removendo todas as mensagens e dados da sua conta.", + "message": "Isto limpará todos os dados da aplicação, removendo todas as mensagens e os dados guardados da sua conta.", "description": "Text describing what the clear data button will do." }, "clearDataButton": { @@ -984,19 +1042,19 @@ "description": "Button in the settings dialog starting process to delete all data" }, "deleteAllDataHeader": { - "message": "Apagar todos os dados?", + "message": "Eliminar todos os dados?", "description": "Header of the full-screen delete data confirmation screen" }, "deleteAllDataBody": { - "message": "Está prestes a apagar todos os dados de conta da sua aplicação, incluindo todos os contactos e todas as mensagens. Pode sempre ligar ao seu telemóvel outra vez, mas não irá recuperar as mensagens apagadas.", + "message": "Está prestes a eliminar todos os dados de conta guardados da sua aplicação, incluindo todos os contactos e todas as mensagens. Pode sempre associar novamente ao seu telemóvel, mas não irá recuperar as mensagens eliminadas.", "description": "Text describing what exactly will happen if the user clicks the button to delete all data" }, "deleteAllDataButton": { - "message": "Apagar todos os dados", + "message": "Eliminar todos os dados", "description": "Text of the button that deletes all data" }, "deleteAllDataProgress": { - "message": "A desligar e a apagar todos os dados", + "message": "A desligar e a eliminar todos os dados", "description": "Message shown to user when app is disconnected and data deleted" }, "notifications": { @@ -1008,7 +1066,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Desactivar notificações", + "message": "Desativar notificações", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1016,11 +1074,11 @@ "description": "Label for setting notifications to display name and message text" }, "noNameOrMessage": { - "message": "Nem o remetente nem mensagem", + "message": "Nem o remetente nem a mensagem", "description": "Label for setting notifications to display no name and no message text" }, "nameOnly": { - "message": "Apenas remetente", + "message": "Apenas o remetente", "description": "Label for setting notifications to display sender name only" }, "newMessage": { @@ -1052,7 +1110,7 @@ "description": "Displays the details of a key change" }, "showLess": { - "message": "Esconder detalhes", + "message": "Ocultar detalhes", "description": "Hides the details of a key change" }, "learnMore": { @@ -1063,12 +1121,8 @@ "message": "Esta versão do Signal Desktop expirou. Para poder continuar a enviar mensagens, actualize para a última versão .", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Os dispositivos Android receberão apenas os primeiros 2000 caracteres desta mensagem.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { - "message": "Actualizar", + "message": "Atualizar", "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { @@ -1088,7 +1142,7 @@ "description": "Explanatory text for sync settings" }, "lastSynced": { - "message": "Última importação em ", + "message": "Última importação a ", "description": "Label for date and time of last sync operation" }, "syncNow": { @@ -1100,7 +1154,7 @@ "description": "Label for a disabled sync button while sync is in progress." }, "syncFailed": { - "message": "Falha na importação. Por favor verifique que o seu computador e o seu dispositivos estão ligados à Internet.", + "message": "Falha na importação. Por favor, confirme que o seu computador e o seu telemóvel se encontram ligados à Internet.", "description": "Informational text displayed if a sync operation times out." }, "timestamp_s": { @@ -1164,7 +1218,7 @@ "description": "Timestamp format string for displaying month and day (but not the year) of a date within the current year, ex: use 'MMM D' for 'Aug 8', or 'D MMM' for '8 Aug'." }, "unblockToSend": { - "message": "Desbloqueie este contacto para enviar mensagens.", + "message": "Desbloqueie este contacto para enviar uma mensagem.", "description": "Brief message shown when trying to message a blocked number" }, "unblockGroupToSend": { @@ -1182,7 +1236,7 @@ } }, "timerSetOnSync": { - "message": "Temporizador de destruição de mensagens actualizado para $time$", + "message": "Temporizador de destruição de mensagens atualizado para $time$", "description": "Message displayed when timer is set on initial link of desktop device.", "placeholders": { "time": { @@ -1306,11 +1360,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Destruição de mensagens desactivada", + "message": "Destruição de mensagens desativada", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ desactivou a destruição de mensagens", + "message": "$name$ desativou a destruição de mensagens", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1320,7 +1374,7 @@ } }, "youDisabledDisappearingMessages": { - "message": "Desactivou a destruição de mensagens", + "message": "Desativou a destruição de mensagens", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { @@ -1338,7 +1392,7 @@ "description": "Description for audio notification setting" }, "safetyNumberChanged": { - "message": "Número de segurança mudou", + "message": "O número de segurança foi alterado", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { @@ -1352,7 +1406,7 @@ } }, "verifyNewNumber": { - "message": "Verificar número de segurança", + "message": "Verificar o número de segurança", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1373,12 +1427,16 @@ "message": "Escuro", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Nota para mim", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Ocultar menu", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Iniciar conversa...", + "message": "Iniciar uma nova conversa…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1402,7 +1460,7 @@ "description": "" }, "autoUpdateNewVersionTitle": { - "message": "Há uma actualização para o Signal", + "message": "Existe uma actualização disponível para o Signal", "description": "" }, "autoUpdateNewVersionMessage": { @@ -1410,7 +1468,7 @@ "description": "" }, "autoUpdateNewVersionInstructions": { - "message": "Pressione Reiniciar o Signal para aplicar as atualizações.", + "message": "Pressione 'Reiniciar o Signal' para aplicar as atualizações.", "description": "" }, "autoUpdateRestartButtonLabel": { @@ -1422,7 +1480,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ deixou o grupo", + "message": "$name$ abandonou o grupo", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1432,7 +1490,7 @@ } }, "multipleLeftTheGroup": { - "message": "$name$ deixou o grupo", + "message": "$name$ abandonou o grupo", "description": "Shown in the conversation history when multiple people leave the group", "placeholders": { "name": { @@ -1442,7 +1500,7 @@ } }, "updatedTheGroup": { - "message": "Grupo actualizado", + "message": "Grupo atualizado", "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Termos e Política de Privacidade", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/ro/messages.json b/_locales/ro/messages.json index 0288be37d3..dfc8ed7f12 100644 --- a/_locales/ro/messages.json +++ b/_locales/ro/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copiază eroare și închide aplicația", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Grup necunoscut", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Eroare de bază de date", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Șterg toate datele și repornește", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Fișier", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Conversații arhivate", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Conversațiile sunt arhivate și vor apărea doar în Inbox dacă sunt primite mesaje noi.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arhivați conversația", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Mutați conversația în Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Alege directorul", "description": "Button to allow the user to find a folder on disk" @@ -480,7 +512,7 @@ "description": "Name for a voice message attachment" }, "dangerousFileType": { - "message": "Attachment type not allowed for security reasons", + "message": "Tipul de atașament nu este permis din motive de securitate", "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { @@ -521,12 +553,12 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { - "message": "You cannot add any more attachments to this message.", + "message": "Nu mai poți adăuga alte atașamente la acest mesaj.", "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { @@ -611,15 +643,37 @@ "message": "Închide", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Introdu nume sau număr", + "search": { + "message": "Căutați", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Nici un rezultat pentru \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversații", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Contacte", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Mesaje", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Bun venit la Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "Căsuță poștală", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Se descarcă", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Descarcă atașamentul", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Poză", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Către", + "message": "către", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "General", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Trimite previzualizarea link-urilor", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previzualizarea este suportată pentru link-uri Imgur, Instagram, Reddit și YouTube", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Această versiune de Signal Desktop a expirat. Te rog actualizează aplicația la ultima versiune pentru a putea trimite mesaje în continuare.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Clienții Android vor primi doar primele 2000 de caractere din acest mesaj.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Actualizează", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Închisă", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Notă personală", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Ascunde bara de meniu", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Pornește conversația...", + "message": "Pornește o conversație nouă...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Termeni și politica de confidențialitate", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index e553f237ab..6e20d85959 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Скопировать ошибку и выйти", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Неизвестная группа", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Ошибка базы данных", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Удалить все данные и перезапустить", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Файл", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Архивированные разговоры", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Эти разговоры архивированы и будут появляться во Входящих только когда получены новые сообщения.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Архивировать разговор", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Переместить разговор во Входящие", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Выберите папку", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "При включении в сообщение вложений, не относящихся к изображениям, ограничение составляет по одному вложению на сообщение.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Нельзя смешивать вложения, не относящиеся к изображениям, с изображениями в одном сообщении.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Выйти", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Введите имя или номер", + "search": { + "message": "Поиск", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Нет результатов для \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Разговоры", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Контакты", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Сообщения", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Добро пожаловать в Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "почтовый ящик", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Скачивание", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Загрузить вложение", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Фото", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Кому", + "message": "->", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Общие", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Отправлять предпросмотр ссылки", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Предварительный просмотр поддерживается для ссылок Imgur, Instagram, Reddit и YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Включить проверку орфографии текста, введенного в поле создания сообщения", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Эта версия Signal Desktop устарела. Выполните обновление до последней версии, чтобы продолжить обмен сообщениями.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Пользователи Android получат только первые 2000 символов этого сообщения.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Обновить", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Темная", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Заметка для себя", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Скрыть строку меню", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Начать разговор…", + "message": "Начать новый разговор…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Условия и политика конфиденциальности", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/sk/messages.json b/_locales/sk/messages.json index 5083b33426..4e79bb4067 100644 --- a/_locales/sk/messages.json +++ b/_locales/sk/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopírovať a ukončiť", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Neznáma skupina", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Chyba databázy", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Vymazať všetky dáta a reštartovať", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Súbor", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archivované konverzácie", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archivovať konverzáciu", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Presunúť konverzáciu do doručených", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Zvoľte priečinok", "description": "Button to allow the user to find a folder on disk" @@ -484,7 +516,7 @@ "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "Načítavam náhľad...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { @@ -521,8 +553,8 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "You cannot mix non-image and image attachments in one message.", + "cannotMixImageAndNonImageAttachments": { + "message": "V jednej správe nemôže byť súčasne príloha s obrázkom a príloha bez obrázku.", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { @@ -611,15 +643,37 @@ "message": "Ukončiť", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Zadajte meno alebo číslo", + "search": { + "message": "Hľadať", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Žiadne výsledky pre \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Konverzácie", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakty", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Správy", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Vitajte v aplikácii Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "P.O.Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Sťahujem", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Stiahnuť prílohu", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Fotka", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Pre", + "message": "pre", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Všeobecné", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Povoliť kontrolu pravopisu textu zadaného do textového poľa", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Táto verzia aplikácie Signal Desktop je zastaralá. Pre pokračovanie ju prosím aktualizujte na najnovšiu verziu.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Klienti na systému Android obdržia len prvých 2000 znakov tejto správy.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Aktualizovať", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Tmavý", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Poznámka pre seba", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Skryť ponuku", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Začať rozhovor...", + "message": "Začať nový rozhovor…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Podmienky a Ochrana osobných údajov", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/sl/messages.json b/_locales/sl/messages.json index 5296dcf83a..81250e0b58 100644 --- a/_locales/sl/messages.json +++ b/_locales/sl/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopiraj napako in zapusti aplikacijo", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Neznana skupina", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Napaka v bazi podatkov", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Izbris vseh podatkov in ponovni zagon", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Datoteka", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Arhivirani pogovori", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Ti pogovori so bili premaknjeni v arhiv in se bodo znova pojavili v nabiralniku, če prejmete novo sporočilo.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Premakni pogovor v arhiv", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Več pogovorov v nabiralnik", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Izberite mapo", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "Neslikovne datoteke so omejene na eno priponko na sporočilo.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "V istem sporočilu ne morete kombinirati neslikovnih in slikovnih priponk.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Končaj", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Vnesite ime ali številko", + "search": { + "message": "Iskanje", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Ni rezultata za \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Pogovori", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Stiki", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Sporočila", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Dobrodošli v aplikaciji Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "p. p.", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Prenašam", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Prenesi priponko", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Slika", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Naslovnik", + "message": "v", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Splošno", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Pošiljanje povezav s predogledom", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Predogled je na voljo za povezave na Imgur, Instagram, Reddit in YouTube", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Vklop črkovalnika v okencu za vnašanje sporočila", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Pričujoča različica programa Signal Desktop je potekla. Za ponovno delovanje morate program posodobiti na zadnjo različico.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Odjemalec za Android bo prejel le prvih 2000 znakov tega sporočila.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Posodobi", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Temna", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Osebna zabeležka", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Skrij menijsko vrstico", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Začetek pogovora ...", + "message": "Začni nov pogovor ...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Pogoji uporabe in Pravilnik o zasebnosti", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/sq/messages.json b/_locales/sq/messages.json index f9ddf73de5..06ee6e4f3c 100644 --- a/_locales/sq/messages.json +++ b/_locales/sq/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopjo gabimin dhe dil", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Grup i panjohur", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Gabim Baze të Dhënash", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Fshiji krejt të dhënat dhe rifillo", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Kartelë", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Biseda të Arkivuara", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Këto biseda janë të arkivuara dhe do të shfaqen te Të marrë vetëm nëse merren mesazhe të rinj.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arkivojeni Bisedën", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Kaloje Bisedën te Të marrë", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Zgjidhni dosje", "description": "Button to allow the user to find a folder on disk" @@ -178,7 +210,7 @@ "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { - "message": "Nëse këto hapa nuk bëjnë punë për ju, ju lutemi, parashtroni një regjistrim diagnostikimi (Shihni -> Regjistër Diagnostikimesh) që t’ju ndihmojmë të migroni!", + "message": "Nëse këto hapa s’ju bëjnë punë, ju lutemi, parashtroni një regjistrim diagnostikimi (Shihni -> Regjistër Diagnostikimesh) që t’ju ndihmojmë të migroni!", "description": "Message shown if the import went wrong; second paragraph" }, "importAgain": { @@ -521,7 +553,7 @@ "message": "Kur përfshihet një bashkëngjitje që s’është figurë, kufiri është një bashkëngjitje për mesazh.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "S’mund të përzieni brenda të njëjtit mesazh bashkëngjitje figurë dhe jo figurë.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Dil", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Jepni emër ose numër", + "search": { + "message": "Kërko", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "S’ka përfundime për \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Biseda.", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakte", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Mesazhe", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Mirë se vini te Signal-i", "description": "" }, @@ -673,6 +727,10 @@ "message": "Kuti Postare", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Po shkarkohet", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Shkarko Bashkëngjitjen", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Për", + "message": "për", "description": "Label for the receiver of a message" }, "sent": { @@ -956,17 +1022,9 @@ "description": "Description of the media permission description" }, "general": { - "message": "Përgjithshëm", + "message": "Të përgjithshme", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Dërgo Paraparje Lidhjesh", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Paraparjet mbulohen për lidhje Imgur, Instagram, Reddit, dhe YouTube.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Aktivizo kontroll drejtshkrimi të tekstit të dhënë te kutia e hartimit të mesazheve", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Ky version i Signal-it për Desktop ka skaduar. Ju lutemi, që të vazhdoni të shkëmbeni mesazhe, përmirësojeni me versionin më të ri.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Klientët me Android do të marrin vetëm 2000 shenjat e para të këtij mesazhi.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Përmirësojeni", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "E errët", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Shënim për Veten", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Fshihe shtyllën e menusë", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Nisni bisedë…", + "message": "Filloni bisedë të re…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Kushte & Rregulla Privatësie", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index 6bd676ee9e..e58b1496e7 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Одаберите фолдер", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "Тражи", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Преписке", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Контакти", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Поруке", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Добродошли у Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Преузимам", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "У реду", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "За", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Опште", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Ваша верзија Signal-а за десктоп је застарела. Да би сте наставили дописивање, молимо вас да ажурирате програм.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Андроид клијент ће примити само првих 2000 карактера ове поруке", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Ажурирај", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Hide menu bar", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 1a5b0f6fad..4af4a82952 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Kopiera felmeddelande och avsluta", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Okänd grupp", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Databasfel", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Radera all data och starta om", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Arkiv", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Arkiverade konversationer", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Konversationerna här är arkiverade och kommer bara visas i inkorgen ifall nya meddelanden tas emot.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Arkivera konversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Flytta konversationen till Inkorg", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Välj mapp", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "När man inkluderar bilagor som inte är bilder, är begränsningen en bilaga per meddelande.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "Du kan inte blanda bilagor som både är, och inte är, bilder i ett meddelande.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Avsluta", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Skriv in namn eller nummer", + "search": { + "message": "Sök", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "Inga resultat för \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Konversationer", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kontakter", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Meddelanden", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Välkommen till Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO-låda", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Laddar ner", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Hämta bifogad fil", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Foto", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "OK", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Till", + "message": "till", "description": "Label for the receiver of a message" }, "sent": { @@ -959,16 +1025,8 @@ "message": "Generell", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Skicka länkförhandsvisningar", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Förhandsvisningar stöds för Imgur-, Instagram-, Reddit- och YouTube-länkar.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { - "message": "Slå på stavningskontroll för text skrivet i meddelandefältet", + "message": "Slå på stavningskontroll för text som anges i meddelandefältet", "description": "Description of the media permission description" }, "clearDataHeader": { @@ -1063,10 +1121,6 @@ "message": "Den här versionen av Signal Desktop har utgått. Vänligen uppgradera till den senaste versionen för att fortsätta chatta.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Androidklienter kommer bara ta emot de första 2000 tecknen av detta meddelande.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Uppgradera", "description": "Label text for button to upgrade the app to the latest version" @@ -1146,7 +1200,7 @@ } }, "minutesAgo": { - "message": "$minutes$ minuter sen", + "message": "$minutes$ minuter sedan", "description": "Contracted form of 'X minutes ago' which works both for singular and plural", "placeholders": { "minutes": { @@ -1366,23 +1420,27 @@ } }, "themeLight": { - "message": "Ljus", + "message": "Ljust", "description": "Label text for light theme (normal)" }, "themeDark": { - "message": "Mörk", + "message": "Mörkt", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Notera till mig själv", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Göm menyraden", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Påbörja konversation...", + "message": "Starta en ny konversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { - "message": "Skriv in ett telefonnummer för att lägga till en kontakt.", + "message": "Ange ett telefonnummer för att lägga till en kontakt.", "description": "Placeholder for adding a new number to a contact" }, "invalidNumberError": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Licens- och sekretessvillkor", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/th/messages.json b/_locales/th/messages.json index ff965f5e30..d487a04266 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "ไ&ฟล์", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "เลือกโฟลเดอร์", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "ออก", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "ป้อนชื่อหรือหมายเลข", + "search": { + "message": "ค้นหา", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "การสนทนา", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "ผู้ติดต่อ", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "ข้อความ", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "ยินดีต้อนรับสู่ Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "ตู้ไปรษณีย์", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Downloading", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "รูปภาพ", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "ตกลง", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "ถึง", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "General", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Signal Desktop เวอร์ชันนี้หมดอายุแล้ว โปรดอัพเกรดไปเป็นเวอร์ชันล่าสุดเพื่อดำเนินการส่งข้อความต่อ", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "สำหรับไคลเอ็นต์ Android จะได้รับข้อความ 2000 ตัวอักษรแรกเท่านั้น", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "อัพเกรด", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "ซ่อนแถบเมนู", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "เริ่มต้นการสนทนา", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "เงื่อนไขและนโยบายความเป็นส่วนตัว", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index c045a749af..a217b4a75a 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Hatayı kopyala ve çık", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Bilinmeyen grup", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Veritabanı hatası", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Tüm verileri sil ve yeniden başlat", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Dosya", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -136,7 +152,7 @@ "description": "Message shown on the loading screen while we are doing application optimizations" }, "migratingToSQLCipher": { - "message": "Mesajlar optimize ediliyor... $status$ tamamlandı.", + "message": "İletiler optimize ediliyor... $status$ tamamlandı.", "description": "Message shown on the loading screen while we are doing application optimizations", "placeholders": { "status": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Arşivlenmiş Sohbetler", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Bu sohbetler arşivlendi ve sadece yeni iletiler alınırsa gelen kutusunda görünecekler.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Sohbeti Arşivle", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Sohbeti Gelen Kutusuna Taşı", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Klasör seçin", "description": "Button to allow the user to find a folder on disk" @@ -158,7 +190,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Dışa aktarma işlemini tamamladınız ve kişileriniz ile mesajlarınız sabırla bilgisayarınızda bekliyor. Kaydettiğiniz Signal verilerinizi içeren klasörü seçin.", + "message": "Dışa aktarma işlemini tamamladınız ve kişileriniz ile iletileriniz sabırla bilgisayarınızda bekliyor. Kaydettiğiniz Signal verilerinizi içeren klasörü seçin.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +202,7 @@ "description": "Header of the error screen after a failed import" }, "importingHeader": { - "message": "Kişiler ve mesajlar yükleniyor", + "message": "Kişiler ve iletiler yükleniyor", "description": "Header of screen shown as data is import" }, "importErrorFirst": { @@ -206,7 +238,7 @@ "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" }, "loadingMessages": { - "message": "Mesajlar yükleniyor. Şimdiye kadar $count$...", + "message": "İletiler yükleniyor. Şimdiye kadar $count$...", "description": "Message shown on the loading screen when we're catching up on the backlog of messages", "placeholders": { "count": { @@ -232,19 +264,19 @@ "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" }, "messageBelow": { - "message": "Aşağıda yeni mesaj var", + "message": "Aşağıda yeni ileti var", "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" }, "messagesBelow": { - "message": "Aşağıda yeni mesajlar var", + "message": "Aşağıda yeni iletiler var", "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" }, "unreadMessage": { - "message": "1 Okunmamış Mesaj", + "message": "1 Okunmamış İleti", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ Okunmamış Mesaj", + "message": "$count$ Okunmamış İleti", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -428,7 +460,7 @@ "description": "" }, "incomingError": { - "message": "Gelen mesaj işlenirken hata oluştu", + "message": "Gelen ileti işlenirken hata oluştu", "description": "" }, "media": { @@ -476,7 +508,7 @@ "description": "Hover text for attachment filenames" }, "voiceMessage": { - "message": "Sesli Mesaj", + "message": "Sesli İleti", "description": "Name for a voice message attachment" }, "dangerousFileType": { @@ -518,19 +550,19 @@ } }, "oneNonImageAtATimeToast": { - "message": "Görüntü olmayan eklentiler içerildiğinde, mesaj başı eklenti sınırı birdir.", + "message": "Görüntü olmayan eklentiler içerildiğinde, ileti başı eklenti sınırı birdir.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { - "message": "Görüntü ve görüntü olmayan eklentileri tek mesajda birleştiremezsiniz.", + "cannotMixImageAndNonImageAttachments": { + "message": "Görüntü ve görüntü olmayan eklentileri tek iletide birleştiremezsiniz.", "description": "An error popup when the user has attempted to add an attachment" }, "maximumAttachments": { - "message": "Bu mesaja daha fazla eklenti ekleyemezsiniz.", + "message": "Bu iletiye daha fazla eklenti ekleyemezsiniz.", "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Üzgünüz, seçilen dosya mesaj boyutu kısıtlamalarını aşıyor.", + "message": "Üzgünüz, seçilen dosya ileti boyutu kısıtlamalarını aşıyor.", "description": "" }, "unableToLoadAttachment": { @@ -611,15 +643,37 @@ "message": "Çıkış Yap", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "İsim ya da numara girin", + "search": { + "message": "Ara", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "\"$searchTerm$\" için arama sonucu yok", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Sohbetler", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Kişiler", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "İletiler", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Signal'e Hoşgeldin", "description": "" }, @@ -642,7 +696,7 @@ } }, "sendMessageToContact": { - "message": "Mesaj Gönder", + "message": "İleti Gönder", "description": "Shown when you are sent a contact and that contact has a signal account" }, "home": { @@ -673,28 +727,32 @@ "message": "Posta Kutusu", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "İndiriliyor", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Eklentiyi İndir", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" }, "replyToMessage": { - "message": "Mesajı Yanıtla", + "message": "İletiyi Yanıtla", "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { - "message": "Mesajın aslı bulunamadı", + "message": "İletinin aslı bulunamadı", "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" }, "originalMessageNotAvailable": { - "message": "Mesajın aslı artık mevcut değil", + "message": "İletinin aslı artık mevcut değil", "description": "Shown in toast if user clicks on quote that references message no longer in database" }, "messageFoundButNotLoaded": { - "message": "Mesajın aslı bulundu, ama yüklenmedi. Yüklemek için yukarıya kaydırın.", + "message": "İletinin aslı bulundu, ama yüklenmedi. Yüklemek için yukarıya kaydırın.", "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database" }, "voiceNoteMustBeOnlyAttachment": { - "message": "Sesli not bir mesajda içerilen tek eklenti olmalıdır.", + "message": "Sesli not bir iletide içerilen tek eklenti olmalıdır.", "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { @@ -712,7 +770,7 @@ } }, "audioPermissionNeeded": { - "message": "Sesli mesajlar göndermek için, Signal Desktop'ın mikrofonunuza erişimine izin verin.", + "message": "Sesli iletiler göndermek için, Signal Desktop'ın mikrofonunuza erişimine izin verin.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -735,6 +793,14 @@ "message": "Fotoğraf", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "TAMAM", "description": "" @@ -752,7 +818,7 @@ "description": "" }, "messageDetail": { - "message": "Mesaj Detayı", + "message": "İleti Detayı", "description": "" }, "delete": { @@ -760,11 +826,11 @@ "description": "" }, "deleteWarning": { - "message": "Emin misiniz? 'Sil'e tıklamak bu mesajı sadece bu cihazdan kalıcı olarak silecektir.", + "message": "Emin misiniz? 'Sil'e tıklamak bu iletiyi sadece bu cihazdan kalıcı olarak silecektir.", "description": "" }, "deleteThisMessage": { - "message": "Bu mesajı sil", + "message": "Bu iletiyi sil", "description": "" }, "from": { @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Alıcı", + "message": "alıcı", "description": "Label for the receiver of a message" }, "sent": { @@ -784,7 +850,7 @@ "description": "Label for the time a message was received" }, "sendMessage": { - "message": "Mesaj gönder", + "message": "İleti gönder", "description": "Placeholder text in the message entry field" }, "groupMembers": { @@ -818,7 +884,7 @@ } }, "theirIdentityUnknown": { - "message": "Bu kişiyle herhangi bir mesajlaşmada bulunmadınız. Güvenlik numaralarınız ilk mesajdan sonra oluşturulacaktır.", + "message": "Bu kişiyle herhangi bir iletişimde bulunmadınız. Güvenlik numaralarınız ilk iletiden sonra oluşturulacaktır.", "description": "" }, "moreInfo": { @@ -830,11 +896,11 @@ "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send" }, "deleteMessage": { - "message": "Mesajı Sil", + "message": "İletiyi Sil", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { - "message": "Mesajları sil", + "message": "İletileri sil", "description": "Menu item for deleting messages, title case." }, "deleteConversationConfirmation": { @@ -846,15 +912,15 @@ "description": "This is a past tense, informational message. In other words, your secure session has been reset." }, "quoteThumbnailAlt": { - "message": "Alıntılanmış mesajdaki görüntünün önizlemesi", + "message": "Alıntılanmış iletideki görüntünün önizlemesi", "description": "Used in alt tag of thumbnail images inside of an embedded message quote" }, "imageAttachmentAlt": { - "message": "Mesaja görüntü eklenmiş", + "message": "İletiye görüntü eklenmiş", "description": "Used in alt tag of image attachment" }, "videoAttachmentAlt": { - "message": "Mesaja eklenen videonun ekran görüntüsü", + "message": "İletiye eklenen videonun ekran görüntüsü", "description": "Used in alt tag of video attachment preview" }, "lightboxImageAlt": { @@ -959,16 +1025,8 @@ "message": "Genel", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Bağlantı Ön İzlemelerini Gönder", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Ön izlemeler Imgur, Instagram, Reddit, ve YouTube bağlantıları için desteklenmektedir.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { - "message": "Mesaj kutusuna girilen sözcüklerin denetlenmesini etkinleştir", + "message": "İleti kutusuna girilen sözcüklerin denetlenmesini etkinleştir", "description": "Description of the media permission description" }, "clearDataHeader": { @@ -976,7 +1034,7 @@ "description": "Header in the settings dialog for the section dealing with data deletion" }, "clearDataExplanation": { - "message": "Bu, tüm mesajları ve kayıtlı hesap bilgilerini kaldırarak uygulamadaki tüm verileri temizler.", + "message": "Bu, tüm iletileri ve kayıtlı hesap bilgilerini kaldırarak uygulamadaki tüm verileri temizler.", "description": "Text describing what the clear data button will do." }, "clearDataButton": { @@ -988,7 +1046,7 @@ "description": "Header of the full-screen delete data confirmation screen" }, "deleteAllDataBody": { - "message": "Tüm kişilerin ve tüm mesajların dahil olduğu bu uygulamanın tüm kayıtlı hesap bilgilerini silmek üzeresiniz. İstediğiniz zaman mobil cihazınızla tekrar bağlayabilirsiniz, ancak silinen mesajlar geri yüklenmeyecektir.", + "message": "Tüm kişilerin ve tüm iletilerin dahil olduğu bu uygulamanın tüm kayıtlı hesap bilgilerini silmek üzeresiniz. İstediğiniz zaman mobil cihazınızla tekrar bağlayabilirsiniz, ancak silinen iletiler geri yüklenmeyecektir.", "description": "Text describing what exactly will happen if the user clicks the button to delete all data" }, "deleteAllDataButton": { @@ -1004,7 +1062,7 @@ "description": "Header for notification settings" }, "notificationSettingsDialog": { - "message": "Mesaj geldiğinde şunların olduğu bildirim göster:", + "message": "İleti geldiğinde şunların olduğu bildirim göster:", "description": "Explain the purpose of the notification settings" }, "disableNotifications": { @@ -1012,11 +1070,11 @@ "description": "Label for disabling notifications" }, "nameAndMessage": { - "message": "Gönderenin adını ve mesajını", + "message": "Gönderenin adını ve iletisini", "description": "Label for setting notifications to display name and message text" }, "noNameOrMessage": { - "message": "Ne gönderenin adını ne de mesajını", + "message": "Ne gönderenin adını ne de iletisini", "description": "Label for setting notifications to display no name and no message text" }, "nameOnly": { @@ -1024,11 +1082,11 @@ "description": "Label for setting notifications to display sender name only" }, "newMessage": { - "message": "Yeni Mesaj", + "message": "Yeni İleti", "description": "Displayed in notifications for only 1 message" }, "newMessages": { - "message": "Yeni Mesajlar", + "message": "Yeni İletiler", "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { @@ -1060,19 +1118,15 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal Desktop'ın bu sürümünün süresi doldu. Mesajlaşmaya devam etmek için lütfen en son sürüme geçin.", + "message": "Signal Desktop'ın bu sürümünün süresi doldu. İletişime devam etmek için lütfen en son sürüme geçin.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android istemcileri bu mesajın yalnızca ilk 2000 karakterini alacaktır.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Yükselt", "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "Medya mesajı", + "message": "Medya iletisi", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, "unregisteredUser": { @@ -1164,15 +1218,15 @@ "description": "Timestamp format string for displaying month and day (but not the year) of a date within the current year, ex: use 'MMM D' for 'Aug 8', or 'D MMM' for '8 Aug'." }, "unblockToSend": { - "message": "Mesaj göndermek için bu kişinin engellenmesini kaldırın.", + "message": "İleti göndermek için bu kişinin engellenmesini kaldırın.", "description": "Brief message shown when trying to message a blocked number" }, "unblockGroupToSend": { - "message": "Mesaj göndermek için bu grubun engellenmesini kaldırın.", + "message": "İleti göndermek için bu grubun engellenmesini kaldırın.", "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Kaybolan mesaj zamanlayıcsını $time$ olarak ayarladınız", + "message": "Kaybolan ileti zamanlayıcsını $time$ olarak ayarladınız", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1182,7 +1236,7 @@ } }, "timerSetOnSync": { - "message": "Kaybolan mesaj zamanlayıcısı $time$ olarak güncellendi", + "message": "Kaybolan ileti zamanlayıcısı $time$ olarak güncellendi", "description": "Message displayed when timer is set on initial link of desktop device.", "placeholders": { "time": { @@ -1192,7 +1246,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ kaybolan mesaj zamanlayıcısını $time$ olarak ayarladı", + "message": "$name$ kaybolan ileti zamanlayıcısını $time$ olarak ayarladı", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1254,7 +1308,7 @@ "description": "Label for a selectable option in the message expiration timer menu" }, "disappearingMessages": { - "message": "Kaybolan mesajlar", + "message": "Kaybolan iletiler", "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { @@ -1306,11 +1360,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Kaybolan mesajlar devre dışı", + "message": "Kaybolan iletiler devre dışı", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ kaybolan mesajları devre dışı bıraktı", + "message": "$name$ kaybolan iletileri devre dışı bıraktı", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1320,7 +1374,7 @@ } }, "youDisabledDisappearingMessages": { - "message": "Kaybolan mesajları devre dışı bıraktınız", + "message": "Kaybolan iletileri devre dışı bıraktınız", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { @@ -1373,12 +1427,16 @@ "message": "Koyu", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Kendime Not", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Menü çubuğunu gizle", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Sohbet başlat…", + "message": "Yeni sohbet başlat…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1390,7 +1448,7 @@ "description": "When a person inputs a number that is invalid" }, "unlinkedWarning": { - "message": "Mesajlaşmaya devam etmek için Signal Desktop'ı mobil cihazınıza yeniden bağlayın.", + "message": "İletişime devam etmek için Signal Desktop'ı mobil cihazınıza yeniden bağlayın.", "description": "" }, "unlinked": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Şartlar ve Gizlilik İlkesi", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index 4d911759c0..5bc5dae147 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&Файл", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Архівовані розмови", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "Ці розмови — архівовані. Вони з’являтимуться у вхідних лише тоді, коли приходитимуть нові повідомлення.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Вийти", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "Пошук", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Розмови", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Контакти", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Повідомлення", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Ласкаво просимо до Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Завантаження", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Добре", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Кому", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Загальні", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Ця версія застаріла. Оновіться до останньої версії щоб продовжити спілкування.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "На Андроїді буде видно лише перші 2 000 знаків цього повідомлення.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Оновити", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Сховати стрічку меню", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Умови використання та політика конфіденційності", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index bec7d70d83..496213f33b 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "Copy error and quit", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "Unknown group", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "Database Error", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "Delete all data and restart", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "&File", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -36,7 +52,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Loki Messenger", + "message": "Quit Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "Archived Conversations", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "Archive Conversation", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "Move Conversation to Inbox", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "When including a non-image attachment, the limit is one attachment per message.", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "You cannot mix non-image and image attachments in one message.", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "Quit", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", + "search": { + "message": "Tìm kiếm", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "No results for \"$searchTerm$\"", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "Conversations", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "Liên hệ", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "Messages", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "Chào mừng đến với Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "PO Box", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "Đang tải xuống", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "Download Attachment", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "Photo", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "Đồng ý", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "Tới", + "message": "to", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "Tổng quát", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Phiên bản này của Signal Desktop đã hết hạn. Vui lòng nâng cấp lên phiên bản mới nhất để tiếp tục nhắn tin.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Thiết bị Android sẽ chỉ nhận được 2000 ký tự đầu tiên của tin nhắn này.", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "Nâng cấp", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "Dark", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "Note to Self", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "Hide menu bar", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "Start conversation…", + "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1446,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Title is now '$name$'", + "message": "Group name has been set to '$name$'", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json index 1a545f834c..efa5343e74 100644 --- a/_locales/zh_CN/messages.json +++ b/_locales/zh_CN/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "复制出错信息并退出", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "未知群", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "数据库错误", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "删除所有数据并重启", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "文件(&F)", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "已归档对话", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "这些对话已被归档,仅当有新消息到达时,它们才会重新出现在收件箱中。", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "存档会话", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "移动会话到收件箱", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "选择文件夹", "description": "Button to allow the user to find a folder on disk" @@ -484,11 +516,11 @@ "description": "Shown in toast when user attempts to send .exe file, for example" }, "loadingPreview": { - "message": "Loading Preview...", + "message": "加载预览中...", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" }, "stagedPreviewThumbnail": { - "message": "Draft thumbnail link preview for $domain$", + "message": "待发送的$domain$链接预览", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -498,7 +530,7 @@ } }, "previewThumbnail": { - "message": "Thumbnail link preview for $domain$", + "message": "$domain$的链接预览缩略图", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { @@ -508,7 +540,7 @@ } }, "stagedImageAttachment": { - "message": "Draft image attachment: $path$", + "message": "待发送的图片附件:$path$", "description": "Alt text for staged attachments", "placeholders": { "path": { @@ -521,7 +553,7 @@ "message": "每条消息只能添加一个非图片的附件。", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "在一条消息中,可以同时添加一张图片和一个非图片附件。", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "退出", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "桌面版Signal", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "请输入名字或号码", + "search": { + "message": "搜索", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "没有找到 “$searchTerm$” 相关结果", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "对话", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "联系人", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "信息", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "欢迎来到Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "邮政信箱", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "下载中", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "下载附件", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "照片", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "无法更新", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "好", "description": "" @@ -772,7 +838,7 @@ "description": "Label for the sender of a message" }, "to": { - "message": "至", + "message": "向", "description": "Label for the receiver of a message" }, "sent": { @@ -959,14 +1025,6 @@ "message": "通用", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "启用输入框拼写检查", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "此桌面版Signal已过期,请升级到最新版本以继续发送消息。", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android客户端仅能接收此消息的前2000个字符", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "升级", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "暗色", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "备忘录", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "隐藏菜单栏", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "开始对话...", + "message": "开始新会话...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "协议与隐私政策", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json index f7dd6ff355..1576c87622 100644 --- a/_locales/zh_TW/messages.json +++ b/_locales/zh_TW/messages.json @@ -1,4 +1,20 @@ { + "copyErrorAndQuit": { + "message": "複製錯誤並離開。", + "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" + }, + "unknownGroup": { + "message": "未知的群組", + "description": "Shown as the name of a group if we don't have any information about it" + }, + "databaseError": { + "message": "資料庫錯誤", + "description": "Shown in a popup if the database cannot start up properly" + }, + "deleteAndRestart": { + "message": "刪除所有資料並重新開始。", + "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" + }, "mainMenuFile": { "message": "檔案(&F)", "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination." @@ -145,6 +161,22 @@ } } }, + "archivedConversations": { + "message": "封存對話", + "description": "Shown in place of the search box when showing archived conversation list" + }, + "archiveHelperText": { + "message": "這些對話已經封存,並只有在收到新訊息時才會顯示在收件箱中。", + "description": "Shown at the top of the archived converations list in the left pane" + }, + "archiveConversation": { + "message": "歸檔對話", + "description": "Shown in menu for conversation, and moves conversation out of main conversation list" + }, + "moveConversationToInbox": { + "message": "將對話移動到收件夾", + "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" + }, "chooseDirectory": { "message": "選擇資料夾", "description": "Button to allow the user to find a folder on disk" @@ -521,7 +553,7 @@ "message": "當包含的附檔不是圖片,每個訊息限制只能有一個附檔。", "description": "An error popup when the user has attempted to add an attachment" }, - "cannotMixImageAdnNonImageAttachments": { + "cannotMixImageAndNonImageAttachments": { "message": "你無法在一個訊息中,同時附上非圖片及圖片檔案。", "description": "An error popup when the user has attempted to add an attachment" }, @@ -611,15 +643,37 @@ "message": "離開", "description": "Command in the tray icon menu, to quit the application" }, - "trayTooltip": { + "signalDesktop": { "message": "Signal Desktop", "description": "Tooltip for the tray icon" }, - "searchForPeopleOrGroups": { - "message": "輸入名稱或號碼", + "search": { + "message": "搜尋", "description": "Placeholder text in the search input" }, - "welcomeToSignal": { + "noSearchResults": { + "message": "無 \"$searchTerm$\" 的搜尋結果", + "description": "Shown in the search left pane when no results were found", + "placeholders": { + "searchTerm": { + "content": "$1", + "example": "dog" + } + } + }, + "conversationsHeader": { + "message": "對話", + "description": "Shown to separate the types of search results" + }, + "contactsHeader": { + "message": "聯絡人", + "description": "Shown to separate the types of search results" + }, + "messagesHeader": { + "message": "訊息", + "description": "Shown to separate the types of search results" + }, + "welcomeToSession": { "message": "歡迎來到 Signal", "description": "" }, @@ -673,6 +727,10 @@ "message": "郵箱號碼", "description": "When rendering an address, used to provide context to a post office box" }, + "downloading": { + "message": "下載中...", + "description": "Shown in the message bubble while a long message attachment is being downloaded" + }, "downloadAttachment": { "message": "下載附件", "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" @@ -735,6 +793,14 @@ "message": "照片", "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" }, + "cannotUpdate": { + "message": "Cannot Update", + "description": "Shown as the title of our update error dialogs on windows" + }, + "readOnlyVolume": { + "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", + "description": "Shown on MacOS if running on a read-only volume and we cannot update" + }, "ok": { "message": "好", "description": "" @@ -959,14 +1025,6 @@ "message": "一般", "description": "Header for general options on the settings screen" }, - "sendLinkPreviews": { - "message": "傳送連結預覽", - "description": "Option to control creation and send of link previews in setting screen" - }, - "linkPreviewsDescription": { - "message": "預覽功能支援 Imgur、Instagram、 Reddit 及 YouTube 的連結。", - "description": "Additional detail provided for Link Previews option in settings screen" - }, "spellCheckDescription": { "message": "在訊息撰寫時啟用文字輸入的拼字檢查", "description": "Description of the media permission description" @@ -1063,10 +1121,6 @@ "message": "Signal Desktop版的版本已經過期。請更新到最新版來傳送訊息。", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Android 使用者將只會收到訊息中的前 2000 個字", - "description": "Warning that long messages could not get received completely by Android clients." - }, "upgrade": { "message": "升級", "description": "Label text for button to upgrade the app to the latest version" @@ -1373,12 +1427,16 @@ "message": "暗色系", "description": "Label text for dark theme" }, + "noteToSelf": { + "message": "給自己的筆記", + "description": "Name for the conversation with your own phone number" + }, "hideMenuBar": { "message": "隱藏選單列", "description": "Label text for menu bar visibility setting" }, "startConversation": { - "message": "開始對話…", + "message": "開始新的對話...", "description": "Label underneath number a user enters that is not an existing contact" }, "newPhoneNumber": { @@ -1474,9 +1532,5 @@ "example": "Alice, Bob" } } - }, - "privacyPolicy": { - "message": "服務條款與隱私政策", - "description": "Shown in the about box for the link to https://signal.org/legal" } } diff --git a/app/auto_update.js b/app/auto_update.js deleted file mode 100644 index 6725cf3cdd..0000000000 --- a/app/auto_update.js +++ /dev/null @@ -1,89 +0,0 @@ -const { autoUpdater } = require('electron-updater'); -const { dialog } = require('electron'); - -const config = require('./config'); -const windowState = require('./window_state'); - -const hour = 60 * 60; -const autoUpdaterInterval = hour * 1000; - -const RESTART_BUTTON = 0; -const LATER_BUTTON = 1; - -function autoUpdateDisabled() { - return ( - process.platform === 'linux' || - process.mas || - config.get('disableAutoUpdate') - ); -} - -async function checkForUpdates() { - try { - await autoUpdater.checkForUpdates(); - } catch (error) { - console.log('checkForUpdates error:', error.stack); - } -} - -let showingDialog = false; -function showUpdateDialog(mainWindow, messages) { - if (showingDialog || !mainWindow) { - return; - } - showingDialog = true; - - const options = { - type: 'info', - buttons: [ - messages.autoUpdateRestartButtonLabel.message, - messages.autoUpdateLaterButtonLabel.message, - ], - title: messages.autoUpdateNewVersionTitle.message, - message: messages.autoUpdateNewVersionMessage.message, - detail: messages.autoUpdateNewVersionInstructions.message, - defaultId: LATER_BUTTON, - cancelId: RESTART_BUTTON, - }; - - dialog.showMessageBox(mainWindow, options, response => { - if (response === RESTART_BUTTON) { - // We delay these update calls because they don't seem to work in this - // callback - but only if the message box has a parent window. - // Fixes this bug: https://github.com/signalapp/Signal-Desktop/issues/1864 - setTimeout(() => { - windowState.markShouldQuit(); - autoUpdater.quitAndInstall(); - }, 200); - } - - showingDialog = false; - }); -} - -function onError(error) { - console.log('Got an error while updating:', error.stack); -} - -function initialize(getMainWindow, messages) { - if (!messages) { - throw new Error('auto-update initialize needs localized messages'); - } - - if (autoUpdateDisabled()) { - return; - } - - autoUpdater.addListener('update-downloaded', () => { - showUpdateDialog(getMainWindow(), messages); - }); - autoUpdater.addListener('error', onError); - - checkForUpdates(); - - setInterval(checkForUpdates, autoUpdaterInterval); -} - -module.exports = { - initialize, -}; diff --git a/app/config.js b/app/config.js index b5ef815003..3a865109d1 100644 --- a/app/config.js +++ b/app/config.js @@ -20,9 +20,12 @@ if (environment === 'production') { process.env.NODE_CONFIG = ''; process.env.NODE_CONFIG_STRICT_MODE = true; process.env.HOSTNAME = ''; - process.env.NODE_APP_INSTANCE = ''; process.env.ALLOW_CONFIG_MUTATIONS = ''; process.env.SUPPRESS_NO_CONFIG_WARNING = ''; + process.env.NODE_TLS_REJECT_UNAUTHORIZED = ''; + if (!process.env.LOKI_DEV) { + process.env.NODE_APP_INSTANCE = ''; + } } // We load config after we've made our modifications to NODE_ENV diff --git a/app/global_errors.js b/app/global_errors.js index 2966ab7939..85ddee387a 100644 --- a/app/global_errors.js +++ b/app/global_errors.js @@ -3,10 +3,11 @@ const electron = require('electron'); const Errors = require('../js/modules/types/errors'); const { app, dialog, clipboard } = electron; +const { redactAll } = require('../js/modules/privacy'); -// We're using hard-coded strings in this file because it needs to be ready -// to report errors before we do anything in the app. Also, we expect users to directly -// paste this text into search engines to find the bugs on GitHub. +// We use hard-coded strings until we're able to update these strings from the locale. +let quitText = 'Quit'; +let copyErrorAndQuitText = 'Copy error and quit'; function handleError(prefix, error) { console.error(`${prefix}:`, Errors.toLogFormat(error)); @@ -14,24 +15,29 @@ function handleError(prefix, error) { if (app.isReady()) { // title field is not shown on macOS, so we don't use it const buttonIndex = dialog.showMessageBox({ - buttons: ['OK', 'Copy error'], + buttons: [quitText, copyErrorAndQuitText], defaultId: 0, - detail: error.stack, + detail: redactAll(error.stack), message: prefix, noLink: true, type: 'error', }); if (buttonIndex === 1) { - clipboard.writeText(`${prefix}\n${error.stack}`); + clipboard.writeText(`${prefix}\n\n${redactAll(error.stack)}`); } } else { dialog.showErrorBox(prefix, error.stack); } - app.quit(); + app.exit(1); } +exports.updateLocale = messages => { + quitText = messages.quit.message; + copyErrorAndQuitText = messages.copyErrorAndQuit.message; +}; + exports.addHandler = () => { process.on('uncaughtException', error => { handleError('Unhandled Error', error); diff --git a/app/logging.js b/app/logging.js index a9492be27c..7897b28791 100644 --- a/app/logging.js +++ b/app/logging.js @@ -12,6 +12,8 @@ const readFirstLine = require('firstline'); const readLastLines = require('read-last-lines').read; const rimraf = require('rimraf'); +const { redactAll } = require('../js/modules/privacy'); + const { app, ipcMain: ipc } = electron; const LEVELS = ['fatal', 'error', 'warn', 'info', 'debug', 'trace']; let logger; @@ -102,21 +104,31 @@ async function deleteAllLogs(logPath) { }); } -function cleanupLogs(logPath) { +async function cleanupLogs(logPath) { const now = new Date(); const earliestDate = new Date( Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() - 3) ); - return eliminateOutOfDateFiles(logPath, earliestDate).then(remaining => { + try { + const remaining = await eliminateOutOfDateFiles(logPath, earliestDate); const files = _.filter(remaining, file => !file.start && file.end); if (!files.length) { - return null; + return; } - return eliminateOldEntries(files, earliestDate); - }); + await eliminateOldEntries(files, earliestDate); + } catch (error) { + console.error( + 'Error cleaning logs; deleting and starting over from scratch.', + error.stack + ); + + // delete and re-create the log directory + await deleteAllLogs(logPath); + mkdirp.sync(logPath); + } } function isLineAfterDate(line, date) { @@ -247,7 +259,7 @@ function logAtLevel(level, ...args) { return item; }); - logger[level](str.join(' ')); + logger[level](redactAll(str.join(' '))); } else { console._log(...args); } diff --git a/app/menu.js b/app/menu.js index f690c5105b..840bc92145 100644 --- a/app/menu.js +++ b/app/menu.js @@ -16,17 +16,12 @@ exports.createTemplate = (options, messages) => { setupWithImport, showAbout, showDebugLog, - showSettings, } = options; const template = [ { label: messages.mainMenuFile.message, submenu: [ - { - label: messages.mainMenuSettings.message, - click: showSettings, - }, { type: 'separator', }, @@ -84,6 +79,7 @@ exports.createTemplate = (options, messages) => { label: messages.viewMenuResetZoom.message, }, { + accelerator: platform === 'darwin' ? 'Command+=' : 'Control+Plus', role: 'zoomin', label: messages.viewMenuZoomIn.message, }, @@ -192,7 +188,6 @@ function updateForMac(template, messages, options) { setupAsStandalone, setupWithImport, showAbout, - showSettings, showWindow, } = options; @@ -232,6 +227,7 @@ function updateForMac(template, messages, options) { // Add the OSX-specific Signal Desktop menu at the far left template.unshift({ + label: messages.lokiMessenger.message, submenu: [ { label: messages.aboutSignalDesktop.message, @@ -240,11 +236,6 @@ function updateForMac(template, messages, options) { { type: 'separator', }, - { - label: messages.mainMenuSettings.message, - accelerator: 'CommandOrControl+,', - click: showSettings, - }, { type: 'separator', }, diff --git a/app/profile_images.js b/app/profile_images.js index 339f80fed6..f8c8a26f03 100644 --- a/app/profile_images.js +++ b/app/profile_images.js @@ -1,8 +1,6 @@ const fs = require('fs'); const mkdirp = require('mkdirp'); const path = require('path'); -const Identicon = require('identicon.js'); -const sha224 = require('js-sha512').sha512_224; const { app } = require('electron').remote; @@ -13,12 +11,6 @@ mkdirp.sync(PATH); const hasImage = pubKey => fs.existsSync(getImagePath(pubKey)); const getImagePath = pubKey => `${PATH}/${pubKey}.png`; -const getOrCreateImagePath = pubKey => { - // If the image doesn't exist then create it - if (!hasImage(pubKey)) return generateImage(pubKey); - - return getImagePath(pubKey); -}; const removeImage = pubKey => { if (hasImage(pubKey)) { @@ -39,25 +31,14 @@ const removeImagesNotInArray = pubKeyArray => { .forEach(i => removeImage(i)); }; -const generateImage = pubKey => { +const writePNGImage = (base64String, pubKey) => { const imagePath = getImagePath(pubKey); - - /* - We hash the pubKey and then pass that into Identicon. - This is to avoid getting the same image - if 2 public keys start with the same 15 characters. - */ - const png = new Identicon(sha224(pubKey), { - margin: 0.2, - background: [0, 0, 0, 0], - }).toString(); - fs.writeFileSync(imagePath, png, 'base64'); + fs.writeFileSync(imagePath, base64String, 'base64'); return imagePath; }; module.exports = { - generateImage, - getOrCreateImagePath, + writePNGImage, getImagePath, hasImage, removeImage, diff --git a/app/protocol_filter.js b/app/protocol_filter.js index d510831cb9..a065e61c8a 100644 --- a/app/protocol_filter.js +++ b/app/protocol_filter.js @@ -25,7 +25,11 @@ function _createFileHandler({ userDataPath, installPath, isWindows }) { return (request, callback) => { // normalize() is primarily useful here for switching / to \ on windows const target = path.normalize(_urlToPath(request.url, { isWindows })); + // here we attempt to follow symlinks to the ultimate final path, reflective of what + // we do in main.js on userDataPath and installPath const realPath = fs.existsSync(target) ? fs.realpathSync(target) : target; + // finally we do case-insensitive checks on windows + const properCasing = isWindows ? realPath.toLowerCase() : realPath; if (!path.isAbsolute(realPath)) { console.log( @@ -35,8 +39,12 @@ function _createFileHandler({ userDataPath, installPath, isWindows }) { } if ( - !realPath.startsWith(userDataPath) && - !realPath.startsWith(installPath) + !properCasing.startsWith( + isWindows ? userDataPath.toLowerCase() : userDataPath + ) && + !properCasing.startsWith( + isWindows ? installPath.toLowerCase() : installPath + ) ) { console.log( `Warning: denying request to path '${realPath}' (userDataPath: '${userDataPath}', installPath: '${installPath}')` diff --git a/app/sql.js b/app/sql.js index 44d5ebf6d2..e9cb2390c4 100644 --- a/app/sql.js +++ b/app/sql.js @@ -2,9 +2,22 @@ const path = require('path'); const mkdirp = require('mkdirp'); const rimraf = require('rimraf'); const sql = require('@journeyapps/sqlcipher'); +const { app, dialog, clipboard } = require('electron'); +const { redactAll } = require('../js/modules/privacy'); +const { remove: removeUserConfig } = require('./user_config'); +const config = require('./config'); + const pify = require('pify'); const uuidv4 = require('uuid/v4'); -const { map, isString, fromPairs, forEach, last, isEmpty } = require('lodash'); +const { + map, + isString, + fromPairs, + forEach, + last, + isEmpty, + isObject, +} = require('lodash'); // To get long stack traces // https://github.com/mapbox/node-sqlite3/wiki/API#sqlite3verbose @@ -21,19 +34,12 @@ module.exports = { savePasswordHash, removePasswordHash, - createOrUpdateGroup, - getGroupById, - getAllGroupIds, - getAllGroups, - bulkAddGroups, - removeGroupById, - removeAllGroups, - createOrUpdateIdentityKey, getIdentityKeyById, bulkAddIdentityKeys, removeIdentityKeyById, removeAllIdentityKeys, + getAllIdentityKeys, createOrUpdatePreKey, getPreKeyById, @@ -41,6 +47,7 @@ module.exports = { bulkAddPreKeys, removePreKeyById, removeAllPreKeys, + getAllPreKeys, createOrUpdateSignedPreKey, getSignedPreKeyById, @@ -66,6 +73,14 @@ module.exports = { removeContactSignedPreKeyByIdentityKey, removeAllContactSignedPreKeys, + createOrUpdatePairingAuthorisation, + removePairingAuthorisationForSecondaryPubKey, + getAuthorisationForSecondaryPubKey, + getGrantAuthorisationsForPrimaryPubKey, + getSecondaryDevicesFor, + getPrimaryDeviceFor, + getPairedDevicesFor, + createOrUpdateItem, getItemById, getAllItems, @@ -80,6 +95,7 @@ module.exports = { removeSessionById, removeSessionsByNumber, removeAllSessions, + getAllSessions, getSwarmNodesByPubkey, @@ -87,13 +103,22 @@ module.exports = { saveConversation, saveConversations, getConversationById, + savePublicServerToken, + getPublicServerTokenByServerUrl, updateConversation, removeConversation, getAllConversations, getPubKeysWithFriendStatus, + getConversationsWithFriendStatus, + getAllRssFeedConversations, + getAllPublicConversations, + getPublicConversationsByServer, + getPubkeysInPublicConversation, getAllConversationIds, getAllPrivateConversations, getAllGroupsInvolvingId, + removeAllConversations, + removeAllPrivateConversations, searchConversations, searchMessages, @@ -110,6 +135,7 @@ module.exports = { removeMessage, getUnreadByConversation, getMessageBySender, + getMessageByServerId, getMessageById, getAllMessages, getAllMessageIds, @@ -125,11 +151,20 @@ module.exports = { getUnprocessedCount, getAllUnprocessed, saveUnprocessed, + updateUnprocessedAttempts, + updateUnprocessedWithData, getUnprocessedById, saveUnprocesseds, removeUnprocessed, removeAllUnprocessed, + getNextAttachmentDownloadJobs, + saveAttachmentDownloadJob, + setAttachmentDownloadJobPending, + resetAttachmentDownloadPending, + removeAttachmentDownloadJob, + removeAllAttachmentDownloadJobs, + removeAll, removeAllConfiguration, @@ -619,6 +654,108 @@ async function updateToSchemaVersion8(currentVersion, instance) { console.log('updateToSchemaVersion8: success!'); } +async function updateToSchemaVersion9(currentVersion, instance) { + if (currentVersion >= 9) { + return; + } + console.log('updateToSchemaVersion9: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await instance.run(`CREATE TABLE attachment_downloads( + id STRING primary key, + timestamp INTEGER, + pending INTEGER, + json TEXT + );`); + + await instance.run(`CREATE INDEX attachment_downloads_timestamp + ON attachment_downloads ( + timestamp + ) WHERE pending = 0;`); + await instance.run(`CREATE INDEX attachment_downloads_pending + ON attachment_downloads ( + pending + ) WHERE pending != 0;`); + + await instance.run('PRAGMA schema_version = 9;'); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToSchemaVersion9: success!'); +} + +async function updateToSchemaVersion10(currentVersion, instance) { + if (currentVersion >= 10) { + return; + } + console.log('updateToSchemaVersion10: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await instance.run('DROP INDEX unprocessed_id;'); + await instance.run('DROP INDEX unprocessed_timestamp;'); + await instance.run('ALTER TABLE unprocessed RENAME TO unprocessed_old;'); + + await instance.run(`CREATE TABLE unprocessed( + id STRING, + timestamp INTEGER, + version INTEGER, + attempts INTEGER, + envelope TEXT, + decrypted TEXT, + source TEXT, + sourceDevice TEXT, + serverTimestamp INTEGER + );`); + + await instance.run(`CREATE INDEX unprocessed_id ON unprocessed ( + id + );`); + await instance.run(`CREATE INDEX unprocessed_timestamp ON unprocessed ( + timestamp + );`); + + await instance.run(`INSERT INTO unprocessed ( + id, + timestamp, + version, + attempts, + envelope, + decrypted, + source, + sourceDevice, + serverTimestamp + ) SELECT + id, + timestamp, + json_extract(json, '$.version'), + json_extract(json, '$.attempts'), + json_extract(json, '$.envelope'), + json_extract(json, '$.decrypted'), + json_extract(json, '$.source'), + json_extract(json, '$.sourceDevice'), + json_extract(json, '$.serverTimestamp') + FROM unprocessed_old; + `); + + await instance.run('DROP TABLE unprocessed_old;'); + + await instance.run('PRAGMA schema_version = 10;'); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToSchemaVersion10: success!'); +} + +async function updateToSchemaVersion11(currentVersion, instance) { + if (currentVersion >= 11) { + return; + } + console.log('updateToSchemaVersion11: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await instance.run('DROP TABLE groups;'); + + await instance.run('PRAGMA schema_version = 11;'); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToSchemaVersion11: success!'); +} + const SCHEMA_VERSIONS = [ updateToSchemaVersion1, updateToSchemaVersion2, @@ -628,6 +765,9 @@ const SCHEMA_VERSIONS = [ updateToSchemaVersion6, updateToSchemaVersion7, updateToSchemaVersion8, + updateToSchemaVersion9, + updateToSchemaVersion10, + updateToSchemaVersion11, ]; async function updateSchema(instance) { @@ -649,6 +789,232 @@ async function updateSchema(instance) { // eslint-disable-next-line no-await-in-loop await runSchemaUpdate(schemaVersion, instance); } + await updateLokiSchema(instance); +} + +const LOKI_SCHEMA_VERSIONS = [ + updateToLokiSchemaVersion1, + updateToLokiSchemaVersion2, +]; + +async function updateToLokiSchemaVersion1(currentVersion, instance) { + if (currentVersion >= 1) { + return; + } + console.log('updateToLokiSchemaVersion1: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await instance.run( + `ALTER TABLE messages + ADD COLUMN serverId INTEGER;` + ); + + await instance.run( + `CREATE TABLE servers( + serverUrl STRING PRIMARY KEY ASC, + token TEXT + );` + ); + + const initConversation = async data => { + // eslint-disable-next-line camelcase + const { id, active_at, type, name, friendRequestStatus } = data; + await instance.run( + `INSERT INTO conversations ( + id, + json, + active_at, + type, + members, + name, + friendRequestStatus + ) values ( + $id, + $json, + $active_at, + $type, + $members, + $name, + $friendRequestStatus + );`, + { + $id: id, + $json: objectToJSON(data), + $active_at: active_at, + $type: type, + $members: null, + $name: name, + $friendRequestStatus: friendRequestStatus, + } + ); + }; + + const lokiPublicServerData = { + // make sure we don't have a trailing slash just in case + serverUrl: config.get('defaultPublicChatServer').replace(/\/*$/, ''), + token: null, + }; + console.log('lokiPublicServerData', lokiPublicServerData); + + const baseData = { + active_at: Date.now(), + friendRequestStatus: 4, // Friends + sealedSender: 0, + sessionResetStatus: 0, + swarmNodes: [], + type: 'group', + unlockTimestamp: null, + unreadCount: 0, + verified: 0, + version: 2, + }; + + const publicChatData = { + ...baseData, + id: `publicChat:1@${lokiPublicServerData.serverUrl.replace( + /^https?:\/\//i, + '' + )}`, + server: lokiPublicServerData.serverUrl, + name: 'Loki Public Chat', + channelId: '1', + }; + + const { serverUrl, token } = lokiPublicServerData; + + await instance.run( + `INSERT INTO servers ( + serverUrl, + token + ) values ( + $serverUrl, + $token + );`, + { + $serverUrl: serverUrl, + $token: token, + } + ); + + const newsRssFeedData = { + ...baseData, + id: 'rss://loki.network/feed/', + rssFeed: 'https://loki.network/feed/', + closable: true, + name: 'Loki.network News', + profileAvatar: 'images/session/session_chat_icon.png', + }; + + const updatesRssFeedData = { + ...baseData, + id: 'rss://loki.network/category/messenger-updates/feed/', + rssFeed: 'https://loki.network/category/messenger-updates/feed/', + closable: false, + name: 'Messenger updates', + profileAvatar: 'images/session/session_chat_icon.png', + }; + + const autoJoinLokiChats = false; + + if (autoJoinLokiChats) { + await initConversation(publicChatData); + } + + await initConversation(newsRssFeedData); + await initConversation(updatesRssFeedData); + + await instance.run( + `INSERT INTO loki_schema ( + version + ) values ( + 1 + );` + ); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToLokiSchemaVersion1: success!'); +} + +async function updateToLokiSchemaVersion2(currentVersion, instance) { + if (currentVersion >= 2) { + return; + } + console.log('updateToLokiSchemaVersion2: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await instance.run( + `CREATE TABLE pairingAuthorisations( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + primaryDevicePubKey VARCHAR(255), + secondaryDevicePubKey VARCHAR(255), + isGranted BOOLEAN, + json TEXT, + UNIQUE(primaryDevicePubKey, secondaryDevicePubKey) + );` + ); + + await instance.run( + `INSERT INTO loki_schema ( + version + ) values ( + 2 + );` + ); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToLokiSchemaVersion2: success!'); +} + +async function updateLokiSchema(instance) { + const result = await instance.get( + "SELECT name FROM sqlite_master WHERE type = 'table' AND name='loki_schema';" + ); + if (!result) { + await createLokiSchemaTable(instance); + } + const lokiSchemaVersion = await getLokiSchemaVersion(instance); + console.log( + 'updateLokiSchema:', + `Current loki schema version: ${lokiSchemaVersion};`, + `Most recent schema version: ${LOKI_SCHEMA_VERSIONS.length};` + ); + for ( + let index = 0, max = LOKI_SCHEMA_VERSIONS.length; + index < max; + index += 1 + ) { + const runSchemaUpdate = LOKI_SCHEMA_VERSIONS[index]; + + // Yes, we really want to do this asynchronously, in order + // eslint-disable-next-line no-await-in-loop + await runSchemaUpdate(lokiSchemaVersion, instance); + } +} + +async function getLokiSchemaVersion(instance) { + const result = await instance.get( + 'SELECT MAX(version) as version FROM loki_schema;' + ); + if (!result || !result.version) { + return 0; + } + return result.version; +} + +async function createLokiSchemaTable(instance) { + await instance.run('BEGIN TRANSACTION;'); + await instance.run( + `CREATE TABLE loki_schema( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + version INTEGER + );` + ); + await instance.run( + `INSERT INTO loki_schema ( + version + ) values ( + 0 + );` + ); + await instance.run('COMMIT TRANSACTION;'); } let db; @@ -664,7 +1030,7 @@ function _initializePaths(configDir) { filePath = path.join(dbDir, 'db.sqlite'); } -async function initialize({ configDir, key }) { +async function initialize({ configDir, key, messages, passwordAttempt }) { if (db) { throw new Error('Cannot initialize more than once!'); } @@ -673,32 +1039,72 @@ async function initialize({ configDir, key }) { throw new Error('initialize: configDir is required!'); } if (!isString(key)) { - throw new Error('initialize: key` is required!'); + throw new Error('initialize: key is required!'); + } + if (!isObject(messages)) { + throw new Error('initialize: message is required!'); } _initializePaths(configDir); - const sqlInstance = await openDatabase(filePath); - const promisified = promisify(sqlInstance); + try { + const sqlInstance = await openDatabase(filePath); + const promisified = promisify(sqlInstance); + + // promisified.on('trace', async statement => { + // if (!db || statement.startsWith('--')) { + // console._log(statement); + // return; + // } + // const data = await db.get(`EXPLAIN QUERY PLAN ${statement}`); + // console._log(`EXPLAIN QUERY PLAN ${statement}\n`, data && data.detail); + // }); + + try { + await setupSQLCipher(promisified, { key }); + await updateSchema(promisified); + } catch (e) { + await promisified.close(); + throw e; + } + + db = promisified; - // promisified.on('trace', async statement => { - // if (!db || statement.startsWith('--')) { - // console._log(statement); - // return; - // } - // const data = await db.get(`EXPLAIN QUERY PLAN ${statement}`); - // console._log(`EXPLAIN QUERY PLAN ${statement}\n`, data && data.detail); - // }); + // test database + await getMessageCount(); + } catch (error) { + if (passwordAttempt) { + throw error; + } + console.log('Database startup error:', error.stack); + const buttonIndex = dialog.showMessageBox({ + buttons: [ + messages.copyErrorAndQuit.message, + messages.deleteAndRestart.message, + ], + defaultId: 0, + detail: redactAll(error.stack), + message: messages.databaseError.message, + noLink: true, + type: 'error', + }); - try { - await setupSQLCipher(promisified, { key }); - await updateSchema(promisified); - } catch (e) { - await promisified.close(); - throw e; + if (buttonIndex === 0) { + clipboard.writeText( + `Database startup error:\n\n${redactAll(error.stack)}` + ); + } else { + await close(); + await removeDB(); + removeUserConfig(); + app.relaunch(); + } + + app.exit(1); + return false; } - db = promisified; + return true; } async function close() { @@ -752,33 +1158,6 @@ async function removePasswordHash() { return removeItemById(PASS_HASH_ID); } -// Groups - -const GROUPS_TABLE = 'groups'; -async function createOrUpdateGroup(data) { - return createOrUpdate(GROUPS_TABLE, data); -} -async function getGroupById(id) { - return getById(GROUPS_TABLE, id); -} -async function getAllGroupIds() { - const rows = await db.all('SELECT id FROM groups ORDER BY id ASC;'); - return map(rows, row => row.id); -} -async function getAllGroups() { - const rows = await db.all('SELECT id FROM groups ORDER BY id ASC;'); - return map(rows, row => jsonToObject(row.json)); -} -async function bulkAddGroups(array) { - return bulkAdd(GROUPS_TABLE, array); -} -async function removeGroupById(id) { - return removeById(GROUPS_TABLE, id); -} -async function removeAllGroups() { - return removeAllFromTable(GROUPS_TABLE); -} - const IDENTITY_KEYS_TABLE = 'identityKeys'; async function createOrUpdateIdentityKey(data) { return createOrUpdate(IDENTITY_KEYS_TABLE, data); @@ -795,6 +1174,9 @@ async function removeIdentityKeyById(id) { async function removeAllIdentityKeys() { return removeAllFromTable(IDENTITY_KEYS_TABLE); } +async function getAllIdentityKeys() { + return getAllFromTable(IDENTITY_KEYS_TABLE); +} const PRE_KEYS_TABLE = 'preKeys'; async function createOrUpdatePreKey(data) { @@ -846,6 +1228,9 @@ async function removePreKeyById(id) { async function removeAllPreKeys() { return removeAllFromTable(PRE_KEYS_TABLE); } +async function getAllPreKeys() { + return getAllFromTable(PRE_KEYS_TABLE); +} const CONTACT_PRE_KEYS_TABLE = 'contactPreKeys'; async function createOrUpdateContactPreKey(data) { @@ -935,7 +1320,7 @@ async function getContactSignedPreKeyById(id) { } async function getContactSignedPreKeyByIdentityKey(key) { const row = await db.get( - `SELECT * FROM ${CONTACT_SIGNED_PRE_KEYS_TABLE} WHERE identityKeyString = $identityKeyString;`, + `SELECT * FROM ${CONTACT_SIGNED_PRE_KEYS_TABLE} WHERE identityKeyString = $identityKeyString ORDER BY keyId DESC;`, { $identityKeyString: key, } @@ -995,6 +1380,114 @@ async function removeAllSignedPreKeys() { return removeAllFromTable(SIGNED_PRE_KEYS_TABLE); } +const PAIRING_AUTHORISATIONS_TABLE = 'pairingAuthorisations'; +async function getAuthorisationForSecondaryPubKey(pubKey, options) { + const granted = options && options.granted; + let filter = ''; + if (granted) { + filter = 'AND isGranted = 1'; + } + const row = await db.get( + `SELECT json FROM ${PAIRING_AUTHORISATIONS_TABLE} WHERE secondaryDevicePubKey = $secondaryDevicePubKey ${filter};`, + { + $secondaryDevicePubKey: pubKey, + } + ); + + if (!row) { + return null; + } + + return jsonToObject(row.json); +} + +async function getGrantAuthorisationsForPrimaryPubKey(primaryDevicePubKey) { + const rows = await db.all( + `SELECT json FROM ${PAIRING_AUTHORISATIONS_TABLE} WHERE primaryDevicePubKey = $primaryDevicePubKey AND isGranted = 1 ORDER BY secondaryDevicePubKey ASC;`, + { + $primaryDevicePubKey: primaryDevicePubKey, + } + ); + return map(rows, row => jsonToObject(row.json)); +} + +async function createOrUpdatePairingAuthorisation(data) { + const { primaryDevicePubKey, secondaryDevicePubKey, grantSignature } = data; + + await db.run( + `INSERT OR REPLACE INTO ${PAIRING_AUTHORISATIONS_TABLE} ( + primaryDevicePubKey, + secondaryDevicePubKey, + isGranted, + json + ) values ( + $primaryDevicePubKey, + $secondaryDevicePubKey, + $isGranted, + $json + )`, + { + $primaryDevicePubKey: primaryDevicePubKey, + $secondaryDevicePubKey: secondaryDevicePubKey, + $isGranted: Boolean(grantSignature), + $json: objectToJSON(data), + } + ); +} + +async function removePairingAuthorisationForSecondaryPubKey(pubKey) { + await db.run( + `DELETE FROM ${PAIRING_AUTHORISATIONS_TABLE} WHERE secondaryDevicePubKey = $secondaryDevicePubKey;`, + { + $secondaryDevicePubKey: pubKey, + } + ); +} + +async function getSecondaryDevicesFor(primaryDevicePubKey) { + const authorisations = await getGrantAuthorisationsForPrimaryPubKey( + primaryDevicePubKey + ); + return map(authorisations, row => row.secondaryDevicePubKey); +} + +async function getPrimaryDeviceFor(secondaryDevicePubKey) { + const row = await db.get( + `SELECT primaryDevicePubKey FROM ${PAIRING_AUTHORISATIONS_TABLE} WHERE secondaryDevicePubKey = $secondaryDevicePubKey AND isGranted = 1;`, + { + $secondaryDevicePubKey: secondaryDevicePubKey, + } + ); + + if (!row) { + return null; + } + + return row.primaryDevicePubKey; +} + +// Return all the paired pubkeys for a specific pubkey (excluded), +// irrespective of their Primary or Secondary status. +async function getPairedDevicesFor(pubKey) { + let results = []; + + // get primary pubkey (only works if the pubkey is a secondary pubkey) + const primaryPubKey = await getPrimaryDeviceFor(pubKey); + if (primaryPubKey) { + results.push(primaryPubKey); + } + // get secondary pubkeys (only works if the pubkey is a primary pubkey) + const secondaryPubKeys = await getSecondaryDevicesFor( + primaryPubKey || pubKey + ); + results = results.concat(secondaryPubKeys); + + // ensure the input pubkey is not in the results + results = results.filter(x => x !== pubKey); + + return results; +} + const ITEMS_TABLE = 'items'; async function createOrUpdateItem(data) { return createOrUpdate(ITEMS_TABLE, data); @@ -1070,6 +1563,9 @@ async function removeSessionsByNumber(number) { async function removeAllSessions() { return removeAllFromTable(SESSIONS_TABLE); } +async function getAllSessions() { + return getAllFromTable(SESSIONS_TABLE); +} async function createOrUpdate(table, data) { const { id } = data; @@ -1139,6 +1635,11 @@ async function removeAllFromTable(table) { await db.run(`DELETE FROM ${table};`); } +async function getAllFromTable(table) { + const rows = await db.all(`SELECT json FROM ${table};`); + return rows.map(row => jsonToObject(row.json)); +} + // Conversations async function getSwarmNodesByPubkey(pubkey) { @@ -1153,11 +1654,14 @@ async function getSwarmNodesByPubkey(pubkey) { return jsonToObject(row.json).swarmNodes; } +const CONVERSATIONS_TABLE = 'conversations'; async function getConversationCount() { - const row = await db.get('SELECT count(*) from conversations;'); + const row = await db.get(`SELECT count(*) from ${CONVERSATIONS_TABLE};`); if (!row) { - throw new Error('getMessageCount: Unable to get count of conversations'); + throw new Error( + `getConversationCount: Unable to get count of ${CONVERSATIONS_TABLE}` + ); } return row['count(*)']; @@ -1176,7 +1680,7 @@ async function saveConversation(data) { } = data; await db.run( - `INSERT INTO conversations ( + `INSERT INTO ${CONVERSATIONS_TABLE} ( id, json, @@ -1240,7 +1744,7 @@ async function updateConversation(data) { } = data; await db.run( - `UPDATE conversations SET + `UPDATE ${CONVERSATIONS_TABLE} SET json = $json, active_at = $active_at, @@ -1266,7 +1770,9 @@ async function updateConversation(data) { async function removeConversation(id) { if (!Array.isArray(id)) { - await db.run('DELETE FROM conversations WHERE id = $id;', { $id: id }); + await db.run(`DELETE FROM ${CONVERSATIONS_TABLE} WHERE id = $id;`, { + $id: id, + }); return; } @@ -1276,17 +1782,52 @@ async function removeConversation(id) { // Our node interface doesn't seem to allow you to replace one single ? with an array await db.run( - `DELETE FROM conversations WHERE id IN ( ${id + `DELETE FROM ${CONVERSATIONS_TABLE} WHERE id IN ( ${id .map(() => '?') .join(', ')} );`, id ); } +async function savePublicServerToken(data) { + const { serverUrl, token } = data; + await db.run( + `INSERT OR REPLACE INTO servers ( + serverUrl, + token + ) values ( + $serverUrl, + $token + )`, + { + $serverUrl: serverUrl, + $token: token, + } + ); +} + +async function getPublicServerTokenByServerUrl(serverUrl) { + const row = await db.get( + 'SELECT * FROM servers WHERE serverUrl = $serverUrl;', + { + $serverUrl: serverUrl, + } + ); + + if (!row) { + return null; + } + + return row.token; +} + async function getConversationById(id) { - const row = await db.get('SELECT * FROM conversations WHERE id = $id;', { - $id: id, - }); + const row = await db.get( + `SELECT * FROM ${CONVERSATIONS_TABLE} WHERE id = $id;`, + { + $id: id, + } + ); if (!row) { return null; @@ -1296,14 +1837,17 @@ async function getConversationById(id) { } async function getAllConversations() { - const rows = await db.all('SELECT json FROM conversations ORDER BY id ASC;'); + const rows = await db.all( + `SELECT json FROM ${CONVERSATIONS_TABLE} ORDER BY id ASC;` + ); return map(rows, row => jsonToObject(row.json)); } async function getPubKeysWithFriendStatus(status) { const rows = await db.all( - `SELECT id FROM conversations WHERE + `SELECT id FROM ${CONVERSATIONS_TABLE} WHERE friendRequestStatus = $status + AND type = 'private' ORDER BY id ASC;`, { $status: status, @@ -1312,14 +1856,29 @@ async function getPubKeysWithFriendStatus(status) { return map(rows, row => row.id); } +async function getConversationsWithFriendStatus(status) { + const rows = await db.all( + `SELECT * FROM ${CONVERSATIONS_TABLE} WHERE + friendRequestStatus = $status + AND type = 'private' + ORDER BY id ASC;`, + { + $status: status, + } + ); + return map(rows, row => jsonToObject(row.json)); +} + async function getAllConversationIds() { - const rows = await db.all('SELECT id FROM conversations ORDER BY id ASC;'); + const rows = await db.all( + `SELECT id FROM ${CONVERSATIONS_TABLE} ORDER BY id ASC;` + ); return map(rows, row => row.id); } async function getAllPrivateConversations() { const rows = await db.all( - `SELECT json FROM conversations WHERE + `SELECT json FROM ${CONVERSATIONS_TABLE} WHERE type = 'private' ORDER BY id ASC;` ); @@ -1327,9 +1886,57 @@ async function getAllPrivateConversations() { return map(rows, row => jsonToObject(row.json)); } -async function getAllGroupsInvolvingId(id) { +async function getAllRssFeedConversations() { + const rows = await db.all( + `SELECT json FROM conversations WHERE + type = 'group' AND + id LIKE 'rss://%' + ORDER BY id ASC;` + ); + + return map(rows, row => jsonToObject(row.json)); +} + +async function getAllPublicConversations() { const rows = await db.all( `SELECT json FROM conversations WHERE + type = 'group' AND + id LIKE 'publicChat:%' + ORDER BY id ASC;` + ); + + return map(rows, row => jsonToObject(row.json)); +} + +async function getPublicConversationsByServer(server) { + const rows = await db.all( + `SELECT * FROM conversations WHERE + server = $server + ORDER BY id ASC;`, + { + $server: server, + } + ); + + return map(rows, row => jsonToObject(row.json)); +} + +async function getPubkeysInPublicConversation(id) { + const rows = await db.all( + `SELECT DISTINCT source FROM messages WHERE + conversationId = $conversationId + ORDER BY id ASC;`, + { + $conversationId: id, + } + ); + + return map(rows, row => row.source); +} + +async function getAllGroupsInvolvingId(id) { + const rows = await db.all( + `SELECT json FROM ${CONVERSATIONS_TABLE} WHERE type = 'group' AND members LIKE $id ORDER BY id ASC;`, @@ -1341,19 +1948,21 @@ async function getAllGroupsInvolvingId(id) { return map(rows, row => jsonToObject(row.json)); } -async function searchConversations(query) { +async function searchConversations(query, { limit } = {}) { const rows = await db.all( - `SELECT json FROM conversations WHERE + `SELECT json FROM ${CONVERSATIONS_TABLE} WHERE ( id LIKE $id OR name LIKE $name OR profileName LIKE $profileName ) - ORDER BY id ASC;`, + ORDER BY id ASC + LIMIT $limit`, { $id: `%${query}%`, $name: `%${query}%`, $profileName: `%${query}%`, + $limit: limit || 50, } ); @@ -1432,6 +2041,7 @@ async function saveMessage(data, { forceSave } = {}) { hasFileAttachments, hasVisualMediaAttachments, id, + serverId, // eslint-disable-next-line camelcase received_at, schemaVersion, @@ -1450,6 +2060,7 @@ async function saveMessage(data, { forceSave } = {}) { $id: id, $json: objectToJSON(data), + $serverId: serverId, $body: body, $conversationId: conversationId, $expirationStartTimestamp: expirationStartTimestamp, @@ -1472,6 +2083,7 @@ async function saveMessage(data, { forceSave } = {}) { await db.run( `UPDATE messages SET json = $json, + serverId = $serverId, body = $body, conversationId = $conversationId, expirationStartTimestamp = $expirationStartTimestamp, @@ -1506,6 +2118,7 @@ async function saveMessage(data, { forceSave } = {}) { id, json, + serverId, body, conversationId, expirationStartTimestamp, @@ -1526,6 +2139,7 @@ async function saveMessage(data, { forceSave } = {}) { $id, $json, + $serverId, $body, $conversationId, $expirationStartTimestamp, @@ -1648,6 +2262,24 @@ async function removeMessage(id) { ); } +async function getMessageByServerId(serverId, conversationId) { + const row = await db.get( + `SELECT * FROM messages WHERE + serverId = $serverId AND + conversationId = $conversationId;`, + { + $serverId: serverId, + $conversationId: conversationId, + } + ); + + if (!row) { + return null; + } + + return jsonToObject(row.json); +} + async function getMessageById(id) { const row = await db.get('SELECT * FROM messages WHERE id = $id;', { $id: id, @@ -1712,6 +2344,7 @@ async function getUnreadByConversation(conversationId) { return map(rows, row => jsonToObject(row.json)); } +// Note: Sorting here is necessary for getting the last message (with limit 1) async function getMessagesByConversation( conversationId, { limit = 100, receivedAt = Number.MAX_VALUE, type = '%' } = {} @@ -1722,7 +2355,7 @@ async function getMessagesByConversation( conversationId = $conversationId AND received_at < $received_at AND type LIKE $type - ORDER BY received_at DESC + ORDER BY sent_at DESC LIMIT $limit; `, { @@ -1812,23 +2445,32 @@ async function getNextExpiringMessage() { } async function saveUnprocessed(data, { forceSave } = {}) { - const { id, timestamp } = data; + const { id, timestamp, version, attempts, envelope } = data; + if (!id) { + throw new Error('saveUnprocessed: id was falsey'); + } if (forceSave) { await db.run( `INSERT INTO unprocessed ( id, timestamp, - json + version, + attempts, + envelope ) values ( $id, $timestamp, - $json + $version, + $attempts, + $envelope );`, { $id: id, $timestamp: timestamp, - $json: objectToJSON(data), + $version: version, + $attempts: attempts, + $envelope: envelope, } ); @@ -1837,13 +2479,17 @@ async function saveUnprocessed(data, { forceSave } = {}) { await db.run( `UPDATE unprocessed SET - json = $json, - timestamp = $timestamp + timestamp = $timestamp, + version = $version, + attempts = $attempts, + envelope = $envelope WHERE id = $id;`, { $id: id, $timestamp: timestamp, - $json: objectToJSON(data), + $version: version, + $attempts: attempts, + $envelope: envelope, } ); @@ -1866,16 +2512,38 @@ async function saveUnprocesseds(arrayOfUnprocessed, { forceSave } = {}) { await promise; } -async function getUnprocessedById(id) { - const row = await db.get('SELECT json FROM unprocessed WHERE id = $id;', { +async function updateUnprocessedAttempts(id, attempts) { + await db.run('UPDATE unprocessed SET attempts = $attempts WHERE id = $id;', { $id: id, + $attempts: attempts, }); +} +async function updateUnprocessedWithData(id, data = {}) { + const { source, sourceDevice, serverTimestamp, decrypted } = data; - if (!row) { - return null; - } + await db.run( + `UPDATE unprocessed SET + source = $source, + sourceDevice = $sourceDevice, + serverTimestamp = $serverTimestamp, + decrypted = $decrypted + WHERE id = $id;`, + { + $id: id, + $source: source, + $sourceDevice: sourceDevice, + $serverTimestamp: serverTimestamp, + $decrypted: decrypted, + } + ); +} - return jsonToObject(row.json); +async function getUnprocessedById(id) { + const row = await db.get('SELECT * FROM unprocessed WHERE id = $id;', { + $id: id, + }); + + return row; } async function getUnprocessedCount() { @@ -1890,10 +2558,10 @@ async function getUnprocessedCount() { async function getAllUnprocessed() { const rows = await db.all( - 'SELECT json FROM unprocessed ORDER BY timestamp ASC;' + 'SELECT * FROM unprocessed ORDER BY timestamp ASC;' ); - return map(rows, row => jsonToObject(row.json)); + return rows; } async function removeUnprocessed(id) { @@ -1917,6 +2585,72 @@ async function removeAllUnprocessed() { await db.run('DELETE FROM unprocessed;'); } +const ATTACHMENT_DOWNLOADS_TABLE = 'attachment_downloads'; +async function getNextAttachmentDownloadJobs(limit, options = {}) { + const timestamp = options.timestamp || Date.now(); + + const rows = await db.all( + `SELECT json FROM attachment_downloads + WHERE pending = 0 AND timestamp < $timestamp + ORDER BY timestamp DESC + LIMIT $limit;`, + { + $limit: limit, + $timestamp: timestamp, + } + ); + + return map(rows, row => jsonToObject(row.json)); +} +async function saveAttachmentDownloadJob(job) { + const { id, pending, timestamp } = job; + if (!id) { + throw new Error( + 'saveAttachmentDownloadJob: Provided job did not have a truthy id' + ); + } + + await db.run( + `INSERT OR REPLACE INTO attachment_downloads ( + id, + pending, + timestamp, + json + ) values ( + $id, + $pending, + $timestamp, + $json + )`, + { + $id: id, + $pending: pending, + $timestamp: timestamp, + $json: objectToJSON(job), + } + ); +} +async function setAttachmentDownloadJobPending(id, pending) { + await db.run( + 'UPDATE attachment_downloads SET pending = $pending WHERE id = $id;', + { + $id: id, + $pending: pending, + } + ); +} +async function resetAttachmentDownloadPending() { + await db.run( + 'UPDATE attachment_downloads SET pending = 0 WHERE pending != 0;' + ); +} +async function removeAttachmentDownloadJob(id) { + return removeById(ATTACHMENT_DOWNLOADS_TABLE, id); +} +async function removeAllAttachmentDownloadJobs() { + return removeAllFromTable(ATTACHMENT_DOWNLOADS_TABLE); +} + // All data in database async function removeAll() { let promise; @@ -1925,7 +2659,6 @@ async function removeAll() { promise = Promise.all([ db.run('BEGIN TRANSACTION;'), db.run('DELETE FROM conversations;'), - db.run('DELETE FROM groups;'), db.run('DELETE FROM identityKeys;'), db.run('DELETE FROM items;'), db.run('DELETE FROM messages;'), @@ -1935,6 +2668,8 @@ async function removeAll() { db.run('DELETE FROM unprocessed;'), db.run('DELETE FROM contactPreKeys;'), db.run('DELETE FROM contactSignedPreKeys;'), + db.run('DELETE FROM attachment_downloads;'), + db.run('DELETE FROM messages_fts;'), db.run('COMMIT TRANSACTION;'), ]); }); @@ -1964,6 +2699,14 @@ async function removeAllConfiguration() { await promise; } +async function removeAllConversations() { + await removeAllFromTable(CONVERSATIONS_TABLE); +} + +async function removeAllPrivateConversations() { + await db.run(`DELETE FROM ${CONVERSATIONS_TABLE} WHERE type = 'private'`); +} + async function getMessagesNeedingUpgrade(limit, { maxVersion }) { const rows = await db.all( `SELECT json FROM messages diff --git a/app/tray_icon.js b/app/tray_icon.js index 407c2584ec..e05781723a 100644 --- a/app/tray_icon.js +++ b/app/tray_icon.js @@ -1,5 +1,6 @@ const path = require('path'); +const fs = require('fs'); const { app, Menu, Tray } = require('electron'); let trayContextMenu = null; @@ -78,19 +79,25 @@ function createTrayIcon(getMainWindow, messages) { }; tray.updateIcon = unreadCount => { + let image; + if (unreadCount > 0) { const filename = `${String(unreadCount >= 10 ? 10 : unreadCount)}.png`; - tray.setImage( - path.join(__dirname, '..', 'images', 'alert', iconSize, filename) - ); + image = path.join(__dirname, '..', 'images', 'alert', iconSize, filename); } else { - tray.setImage(iconNoNewMessages); + image = iconNoNewMessages; + } + + if (!fs.existsSync(image)) { + console.log('tray.updateIcon: Image for tray update does not exist!'); + return; } + tray.setImage(image); }; tray.on('click', tray.showWindow); - tray.setToolTip(messages.trayTooltip.message); + tray.setToolTip(messages.lokiMessenger.message); tray.updateContextMenu(); return tray; diff --git a/app/window_state.d.ts b/app/window_state.d.ts new file mode 100644 index 0000000000..90714af01a --- /dev/null +++ b/app/window_state.d.ts @@ -0,0 +1,2 @@ +export function markShouldQuit(): void; +export function shouldQuit(): void; diff --git a/appveyor.yml b/appveyor.yml index 9496140f9a..6b3167e518 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,19 +12,13 @@ install: - yarn install --frozen-lockfile build_script: + - node build\grunt.js - yarn generate - yarn lint-windows - yarn test-node - - node build\grunt.js - - type package.json | findstr /v certificateSubjectName > temp.json - - move temp.json package.json - - yarn prepare-beta-build - - node_modules\.bin\build --config.extraMetadata.environment=%SIGNAL_ENV% --publish=never --config.directories.output=release test_script: - node build\grunt.js test - - set NODE_ENV=production - - node build\grunt.js test-release:win environment: SIGNAL_ENV: production diff --git a/aptly.sh b/aptly.sh index ed03ea5d58..a761b806fb 100755 --- a/aptly.sh +++ b/aptly.sh @@ -26,8 +26,8 @@ echo "Releasing $NAME build version $VERSION" REPO=signal-desktop -CURRENT=artful -PREVIOUS=xenial +CURRENT=xenial +# PREVIOUS=xenial ENDPOINT=signal-desktop-apt # Matches endpoint name in .aptly.conf SNAPSHOT=signal-desktop_v$VERSION GPG_KEYID=57F6FB06 @@ -46,7 +46,7 @@ aptly snapshot create $SNAPSHOT from repo $REPO # these update already-published repos, run every time after that # https://www.aptly.info/doc/aptly/publish/switch/ aptly publish switch -gpg-key=$GPG_KEYID $CURRENT $SNAPSHOT -aptly publish switch -gpg-key=$GPG_KEYID $PREVIOUS $SNAPSHOT +# aptly publish switch -gpg-key=$GPG_KEYID $PREVIOUS $SNAPSHOT aptly publish switch -gpg-key=$GPG_KEYID -config=.aptly.conf $CURRENT s3:$ENDPOINT: $SNAPSHOT -aptly publish switch -gpg-key=$GPG_KEYID -config=.aptly.conf $PREVIOUS s3:$ENDPOINT: $SNAPSHOT +# aptly publish switch -gpg-key=$GPG_KEYID -config=.aptly.conf $PREVIOUS s3:$ENDPOINT: $SNAPSHOT diff --git a/background.html b/background.html index 2914b81c9e..35f38a92bf 100644 --- a/background.html +++ b/background.html @@ -19,7 +19,7 @@ script-src 'self'; style-src 'self' 'unsafe-inline';" > - Loki Messenger + Session @@ -29,96 +29,59 @@ + + - + + + + - - + + + - + + - - - - - - - - - - + + + + + - - - - - - + - @@ -751,7 +529,6 @@

Register a new account

- @@ -759,44 +536,55 @@

Register a new account

- + + + + + + + - - - - - - + + - - + + + - + - + + + + + + + + + @@ -805,13 +593,7 @@

Register a new account

- -
- - - -
-
+
diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist new file mode 100644 index 0000000000..c64d264b28 --- /dev/null +++ b/build/entitlements.mac.plist @@ -0,0 +1,11 @@ + + + + + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-library-validation + + + diff --git a/build/entitlements.mas.plist b/build/entitlements.mas.plist index 5bfb52be41..cc799ebf9a 100644 --- a/build/entitlements.mas.plist +++ b/build/entitlements.mas.plist @@ -2,6 +2,7 @@ + com.apple.security.app-sandbox com.apple.security.network.client diff --git a/build/icon.ico b/build/icon.ico index a04920e4a53a02ebecfe2c161ebd750b251b1af5..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 361102 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 diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..85a6799de20239c7ce37398af601e5205071f15d GIT binary patch literal 49079 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%0D`f=_&b)ec4RaJ{ilSs$Z)ey( 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