diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index f1a895c31..d3d22d0f9 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -28,11 +28,12 @@ jobs: - name: Pull git submodules run: git submodule update --init - - name: Install file server dependency - run: | - cd session-file-server - yarn install; - cd - + # file server dependencies are not needed for now + # - name: Install file server dependency + # run: | + # cd session-file-server + # yarn install; + # cd - - name: Install node uses: actions/setup-node@v1 @@ -47,11 +48,16 @@ jobs: npm config set python python2.7 npm config set msvs_version 2015 - - name: Install yarn - run: npm install yarn --no-save + - uses: actions/cache@v2 + id: yarn-cache + with: + path: '**/node_modules' + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - - name: Install Dependencies - run: yarn install --frozen-lockfile + - name: Install Dependencies #skipped if step before set variable to true + if: | + steps.yarn-cache.outputs.cache-hit != 'true' + run: yarn install --frozen-lockfile --prefer-offline - name: Generate and concat files run: yarn generate @@ -59,7 +65,7 @@ jobs: - name: Lint Files if: runner.os != 'Windows' run: | - yarn format-full + yarn format-full-check yarn eslint yarn tslint diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 437d4e87a..5ea086af5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,7 +40,7 @@ Then you need `git`, if you don't have that yet: https://git-scm.com/ https://www.microsoft.com/en-us/download/details.aspx?id=40773 * Install Windows SDK version 8.1: https://developer.microsoft.com/en-us/windows/downloads/sdk-archive 1. Install _Windows Build Tools_: Open the [Command Prompt (`cmd.exe`) as Administrator]() - and run: `npm install --global --production --add-python-to-path windows-build-tools` + and run: `npm install --vs2015 --global --production --add-python-to-path windows-build-tools` ### Linux diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index 389c7d850..050c86004 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Help", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "جاري تحديث قاعدة البيانات, قد تستغرق العملية بعض الوقت", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "جاري تحميل الرسائل. $count$ حتى الأن...", - "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": "أنا", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "لقد غادرت المجموعة ", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "مرر لأسفل المحادثة ", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "رسالة جديدة بالأسفل", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "رسالة جديدة بالأسفل ", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 رسالة غير مقروءة ", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "إرسال", "description": "" }, - "acceptNewKey": { - "message": "موافقة", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "تم التحقق من رقم الآمان", "description": "" @@ -455,10 +385,6 @@ "message": "رقم آمن جديد", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "رقم الآمان الخاص بك لهذا المستخدم قد تغيرت. وهذا قد يعني بأنه إما أن هناك من يحاول اعتراض اتصالك, أو أن هذا المستخدم ببساطة أعاد تثبيت البرنامج, قد ترغب في التحقق من رقم الآمان الجديد أدناه.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "نمط المرفق غير مدعوم. اضغط للحفظ", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "أنقر للحفظ", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "ملف بدون اسم", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "رسالة صوتية", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "غير متصّل", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "جاري الاتصال", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "بحث", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "مرحبا الى سيجنال Signal", - "description": "" - }, - "selectAContact": { - "message": "اختر جهة اتصال او مجموعة لبدء محادثه.", + "message": "مرحبا الى سيجنال Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "إلغاء", "description": "" }, - "failedToSend": { - "message": "فشل سيغنال في الارسال لبعض المستخدمين. تأكد من الاتصال بالشبكة.", - "description": "" - }, "error": { "message": "خطأ", "description": "" }, - "messageDetail": { - "message": "تفاصيل الرسالة", - "description": "" - }, "delete": { "message": "أحذف ", "description": "" @@ -857,10 +705,6 @@ "message": "أفراد المجموعة", "description": "" }, - "showMembers": { - "message": "أظهر الأفراد", - "description": "" - }, "resetSession": { "message": "تصفير الجلسة", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "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.", "description": "", @@ -887,14 +727,6 @@ "message": "لم تقم بتبادل أي رسائل مع هذا المستخدم بعد. رقم الآمان الخاص بك معهم سوف يظهر بعد أول رسالة", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "حذف الرسالة", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "حفظ", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "سيجنال للحاسوب. مرحبا بك ", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "الحفاظ على الخصوصية أمر ممكن. سيجنال Signal يجعل ذلك سهلا.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "محاولة الاتصال بالمخدّم فشلت", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "معذرة، لديك أجهزة كثيرة مرتبطة مسبقا. حاول إزالة بعضها.", - "description": "" - }, - "settings": { - "message": "إعدادات", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "السمة", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "الإشعارات", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "تفاصيل", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "اخفاء التفاصيل", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "تعلم المزيد عن التحقق من أرقام الأمان", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "رسائل الاعلام", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "الرقم غير مسجل", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "جهات الإتصال", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "تحميل كل المجموعات و جهات إتصال التطبيق من جهازك المحمول", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "آخر تحميل في", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "حمل الآن", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "يتم التحميل", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "خطأ في التحميل، تأكد أن الكمبيوتر و هاتفك متصلان بالإنترنت", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "الآن", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ساعة", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "الآن", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "الشهر اليوم", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "تفعيل الإشعارات", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "أدخل رقم الهاتف لإضافة جهة الاتصال ", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "رقم خاطئ ", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "الرجاء إعادة ربط سيجنال لسطح المكتب مع هاتفك لمتابعة المراسلة", - "description": "" - }, - "unlinked": { - "message": "غير متصل", - "description": "" - }, - "relink": { - "message": "إعادة ربط", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/bg/messages.json b/_locales/bg/messages.json index 26bf2808a..5236ce189 100644 --- a/_locales/bg/messages.json +++ b/_locales/bg/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Помощ", "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": "Настройки...", - "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": "Скрий", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Инсталация с импортиране", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Инсталиране като ново устройство", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Инсталиране като отделно устройство", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Зареждане на данните ви", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Току-що сте преминали процеса на експортиране и вашите контакти и съобщения чакат търпеливо на вашия компютър. Изберете папката, която съдържа запаметените ви данни на Signal.", + "message": "Току-що сте преминали процеса на експортиране и вашите контакти и съобщения чакат търпеливо на вашия компютър. Изберете папката, която съдържа запаметените ви данни на Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Започнете да използвате Signal Desktop", + "message": "Започнете да използвате Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Свържете това устройство с телефона си", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "избраното от вас място", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Подновяване на базата данни. Това може да отнеме извесно време...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Зареждане на съобщенията. $count$ до тук...", - "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": "Аз", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Напуснахте групата", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Превъртете до края на разговора", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ново съобщение по-долу", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Нови съобщения по-долу", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Непрочетено Съобщение", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Изпрати", "description": "" }, - "acceptNewKey": { - "message": "Приемане", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Маркирайте, както е потвърдено", "description": "" @@ -455,10 +385,6 @@ "message": "Нов номер за безопасност", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Номера ви за безопасност с този контакт е променен. Това може да значи че някой се опитва да прихване комуникацията ви, или контакта ви просто е преинсталирал приложението. Потвърдете номерата по-долу.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Неподдържан прикачен тип. Натиснете за да го запишете.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Кликнете, за да запазите", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Неназован файл", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Гласово съобщение", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Изключен", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Свързване", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Отворете бележките за изданието", "description": "" }, - "goToForums": { - "message": "Към форумите", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Отворете страницата за поддръжка", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Докладвай Проблем", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Относно Сигнал Десктоп", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Говор", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Покажи", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Скрий", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Изход", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Сигнал Десктоп", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Търсене", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Добре дошли в Сигнал", "description": "" }, - "selectAContact": { - "message": "Изберете контакт или група за да започнете разговор.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Отговор до $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Аудио", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Отказ", "description": "" }, - "failedToSend": { - "message": "Неупешно изпращане до някои от получателите. Проверете вашата връзка към мрежата.", - "description": "" - }, "error": { "message": "Грешка", "description": "" }, - "messageDetail": { - "message": "Детайли за съобщението", - "description": "" - }, "delete": { "message": "Изтриване", "description": "" @@ -857,10 +705,6 @@ "message": "Членове на групата", "description": "" }, - "showMembers": { - "message": "Покажи членовете", - "description": "" - }, "resetSession": { "message": "Нулирай сесията", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "Ако искате да потвърдите сигурността на криптирането от край до край с $name$, сравнете номерата по-нагоре с номерата, намиращи се на тяхното устройство.", "description": "", @@ -887,14 +727,6 @@ "message": "Все още не сте се обменяли съобщения с този контакт. Вашият номер за безопасност с него ще бъде на разположение след първото съобщение.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Запази", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Добре дошли в Сигнал за настолен компютър", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Поверителността е възможна. Сигнал го прави лесно.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Свържете телефона си със Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Настройки", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Свързани Устройства", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Бутон", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Свържи Ново Устройство", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Име на Устройството", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Изберете име за устройството", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Завършете свързването на телефона", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Синхронизиране на контакти и групи", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Неуспешна връзка със сървъра.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Съжаляваме, вече имате прекалено много регистрирани устройства. Пробвайте да премахнете някое.", - "description": "" - }, - "settings": { - "message": "Настройки", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Тема", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Изчистване на данните", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Това ще изчисти всички данни в приложението, премахвайки всички съобщения и запазената информация за профила.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Изчистване на данните", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Изтриване на всички данни?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "На път сте да изтриете цялата информация за запазения профил на приложението, включително всички контакти и всички съобщения. Винаги можете да се свързвате отново с мобилното си устройство, но това няма да възстанови изтритите съобщения.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Изтрийте всички данни", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Прекъсване и изтриване на всички данни", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Известия", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Подробности", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Скрии подробностите", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Научете по-вече за потвърждението на номерата за безопасност.", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Мултимедиино съобщение", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Номерът не е регистриран.", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Контакти", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Импортиране на всички Сигнал групи и контакти от Вашето мобилно устройство.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Последно са импортирани на ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Импортирай сега", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Импортиране...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Импортирането беше неуспешно. Убедете се че компютърът и телефонът Ви са свързани към интернет.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "сега", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 час", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "сега", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Възпроизвеждане на аудио известия", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Въведете телефонен номер за да добавите контакт.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Невалиден номер", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Свържете повторно Сигнал Десктоп към вашето мобилно устройство за да изпращате съобщения.", - "description": "" - }, - "unlinked": { - "message": "Разкачи", - "description": "" - }, - "relink": { - "message": "Свържете отново", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Достъпна е актуализация на Сигнал.", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index 3778704f9..0cf8e2670 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Ajuda", "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": "Preferències...", - "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": "Amaga", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Surt del Signal", + "message": "Surt del Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Configura amb una importació", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configura com a aparell nou", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Configura com a aparell únic", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Trieu un fitxer", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carregueu les dades", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Acabeu de passar pel procés d'exportació i els vostres contactes i missatges esperen pacientment a l'ordinador. Seleccioneu la carpeta que conté les dades de Signal desades.", + "message": "Acabeu de passar pel procés d'exportació i els vostres contactes i missatges esperen pacientment a l'ordinador. Seleccioneu la carpeta que conté les dades de Session desades.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Assegureu-vos que heu triat el directori correcte que conté les dades de Signal desades. El seu nom hauria de començar amb \"Signal Export\". També podeu desar una còpia nova de les dades des de l'aplicació Chrome.", + "message": "Assegureu-vos que heu triat el directori correcte que conté les dades de Session desades. El seu nom hauria de començar amb \"Session Export\". També podeu desar una còpia nova de les dades des de l'aplicació Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Comenceu a usar el Signal Desktop", + "message": "Comenceu a usar el Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Enllaçeu aquest aparell amb el vostre telèfon", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "la ubicació seleccionada", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "S'està actualitzant la base de dades. Això pot trigar una mica...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "S'estan carregant els missatges. Manquen $count$...", - "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": "Jo", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Heu abandonat el grup", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Vés al final de la conversa", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Missatge nou a continuació", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Missatges nous a continuació", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 missatge per llegir", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Els números de seguretat amb múltiples membres de grup han canviat des que els vau verificar l'últim cop. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que simplement ha reinstal·lat el Signal.", + "message": "Els números de seguretat amb múltiples membres de grup han canviat des que els vau verificar l'últim cop. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que simplement ha reinstal·lat el Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "El número de seguretat amb $name$ ha canviat des que el vau verificar l'últim cop. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Signal.", + "message": "El número de seguretat amb $name$ ha canviat des que el vau verificar l'últim cop. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "El número de seguretat que intenteu verificar ha canviat. Si us plau, reviseu el número de seguretat nou amb $name$. Recordeu que aquest canvi podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Signal.", + "message": "El número de seguretat que intenteu verificar ha canviat. Si us plau, reviseu el número de seguretat nou amb $name$. Recordeu que aquest canvi podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Els números de seguretat amb múltiples membres de grup han canviat recentment. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que simplement ha reinstal·lat el Signal.", + "message": "Els números de seguretat amb múltiples membres de grup han canviat recentment. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que simplement ha reinstal·lat el Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "El número de seguretat amb $name$ ha canviat recentment. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Signal.", + "message": "El número de seguretat amb $name$ ha canviat recentment. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "El número de seguretat amb $name$ ha canviat. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Signal. Potser hauríeu de verificar el número de seguretat amb aquest contacte.", + "message": "El número de seguretat amb $name$ ha canviat. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Session. Potser hauríeu de verificar el número de seguretat amb aquest contacte.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Tramet", "description": "" }, - "acceptNewKey": { - "message": "Ho accepto", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marca com a verificat", "description": "" @@ -455,10 +385,6 @@ "message": "Número de seguretat nou", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "El número de seguretat amb aquest contacte ha canviat. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que aquest contacte simplement ha reinstal·lat el Signal. Potser hauríeu de verificar el número de seguretat nou.", - "description": "" - }, "incomingError": { "message": "S'ha produït un error en gestionar el missatge rebut", "description": "" @@ -495,18 +421,6 @@ "message": "Aquest mes", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipus d'adjunt no admès. Feu clic per a desar.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Feu clic per a desar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Fitxer sense nom", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Missatge de veu", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Per raons de seguretat, el tipus d'adjunt no es permès ", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Carregant la previsualització...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Previsualització de l'esborrany de la vista en miniatura de l'enllaç $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Previsualització de la vista en miniatura de l'enllaç $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "No s'ha pogut carregar l'adjunt seleccionat", "description": "" }, - "disconnected": { - "message": "Desconnectat", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "S'està connectant", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Vés a les notes de versió", "description": "" }, - "goToForums": { - "message": "Vés als fòrums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Vés a la pàgina de suport", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Informeu d'un error", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferències del Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Quan al Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Discurs", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Mostra", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Amaga", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Surt", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Cerca", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Benvingut al Signal", - "description": "" - }, - "selectAContact": { - "message": "Seleccioneu un contacte o grup per a començar el xat.", + "message": "Benvingut al Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Envia un missatge", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "casa", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Vós", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "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": { - "content": "$1", - "example": "John" - } - } - }, "audioPermissionNeeded": { - "message": "Per enviar missatges d'àudio, permeteu que el Signal Desktop tingui accés al micròfon.", + "message": "Per enviar missatges d'àudio, permeteu que el Session Desktop tingui accés al micròfon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Permet l'accés", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostra la configuració", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Àudio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Cancel·la", "description": "" }, - "failedToSend": { - "message": "Ha fallat l'acció d'enviar a alguns remitents. Comproveu la connexió de xarxa.", - "description": "" - }, "error": { "message": "Error", "description": "" }, - "messageDetail": { - "message": "Detall del missatge", - "description": "" - }, "delete": { "message": "Suprimeix", "description": "" @@ -857,10 +705,6 @@ "message": "Membres del grup", "description": "" }, - "showMembers": { - "message": "Mostra els membres", - "description": "" - }, "resetSession": { "message": "Reinicialitza la sessió", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Mostra el número de seguretat", "description": "" }, - "viewAllMedia": { - "message": "Mostra tots els elements multimèdia", - "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": "Si voleu verificar la seguretat de l'encriptació d'extrem a extrem amb $name$, compareu els números anteriors amb els números del seu dispositiu.", "description": "", @@ -887,14 +727,6 @@ "message": "Encara no heu intercanviat cap missatge amb aquest contacte. El vostre número de seguretat amb ells estarà disponible després del primer missatge.", "description": "" }, - "moreInfo": { - "message": "Més informació...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Reintenta l'enviament", - "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": "Suprimeix el missatge", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Desa", "description": "" }, - "fileIconAlt": { - "message": "Icona del fitxer", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Imatge emoji de «$title$»", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Us donem la benvinguda al Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "La privadesa és possible. El Signla la fa fàcil.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Enllaceu el mòbil amb el Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Configuració del Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Aparells enllaçats", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Botó «+»", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Enllaça un aparell nou", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nom de l'aparell", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Trieu el nom d'aquest aparell", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Acaba l'enllaçament del telèfon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronització de contactes i grups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "No s'ha pogut connectar al servidor.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Teniu massa aparells enllaçats. Proveu d'eliminar-ne algun.", - "description": "" - }, - "settings": { - "message": "Configuració", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permisos", @@ -1029,34 +801,6 @@ "message": "Activa la comprovació ortogràfica del text introduït en el quadre d'edició de missatges", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Buida les dades", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Això buidarà les dades en l'aplicació, suprimint-ne tots els missatges i informació del compte desat.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Buida les dades", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Voleu suprimir totes les dades?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Esteu apunt de suprimir tota la informació del compte desada en aquesta aplicació, incloent-hi tots els contactes i missatges. Sempre podeu enllaçar-ho amb el vostre aparell mòbil una altra vegada, però això no recuperarà els missatges suprimits.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Suprimeix totes les dades", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Desconnexió i supressió de dades", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificacions", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "L'enviament ha fallat", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalls", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Amaga els detalls", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Apreneu-ne més sobre la verificació dels números de seguretat", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Aquesta versió del Signal Desktop ha expirat. Actualitzeu a l'última versió per a poder seguir enviant i rebent missatges.", + "message": "Aquesta versió del Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Missatge multimèdia", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "El número no està enregistrat.", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contactes", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importa tots els grups i contactes del Signal des del vostre aparell mòbil.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última importació feta", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importa-ho ara", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "S'està important...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "La importació ha fallat. Assegureu-vos que l'ordinador i el telèfon estan connectats a internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ara", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "fa $hours$ h", - "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": "fa $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ara", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Reprodueix la notificació de so", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "El número de seguretat ha canviat", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Clar", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Comença una conversa nova...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introduïu un número de mòbil per a afegir un contacte.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "El número no és vàlid", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Torneu a enllaçar el Signal Desktop amb el vostre aparell mòbil per a continuar enviant missatges.", - "description": "" - }, - "unlinked": { - "message": "No enllaçat", - "description": "" - }, - "relink": { - "message": "Torna a enllaçar", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Disponible una actualització del Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index 8a4fc39f2..1f60359ed 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Nápověda", "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": "Předvolby...", - "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": "Skrýt", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Nastavit importem", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Nastavit jako nové zařízení", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Nastavit jako samostatné zařízení", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Vybrat soubor", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Nahrajte vaše data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Začít používat Signal Desktop", + "message": "Začít používat Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Připojit zařízení k telefonu", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "Vámi vybraná lokalita", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Aktualizace databáze. To může nějakou chvíli trvat...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Načítání zpráv. $count$ z více...", - "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": "Já", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Opustil jste skupinu", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Přesunout se na konec konverzace", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nové zprávy níže", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nové zprávy níže", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Nepřečtená zpráva", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Bezpečnostní číslo s $name$ se změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Signal.", + "message": "Bezpečnostní číslo s $name$ se změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Bezpečnostní číslo, které se pokoušíte ověřit se změnilo. Prosím zkontrolujte s $name$ své nové bezpečnostní číslo . Pamatujte, tato změna může znamenat, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Signal.", + "message": "Bezpečnostní číslo, které se pokoušíte ověřit se změnilo. Prosím zkontrolujte s $name$ své nové bezpečnostní číslo . Pamatujte, tato změna může znamenat, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Session.", "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": { @@ -354,11 +288,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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Bezpečnostní číslo s $name$ se změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Signal.", + "message": "Bezpečnostní číslo s $name$ se změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Bezpečnostní číslo s $name$ se vám změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Signal. Možná si budete chtít bezpečnostní číslo níže ověřit.", + "message": "Bezpečnostní číslo s $name$ se vám změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Session. Možná si budete chtít bezpečnostní číslo níže ověřit.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Odeslat", "description": "" }, - "acceptNewKey": { - "message": "Přijmout", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Označit jako ověřené", "description": "" @@ -455,10 +385,6 @@ "message": "Nový bezpečnostní kód", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Bezpečnostní číslo k tomuto kontaktu se vám změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si kontakt prostě znovu nainstaloval Signal. Možná si budete chtít bezpečnostní číslo níže ověřit.", - "description": "" - }, "incomingError": { "message": "Chyba při zpracování příchozí zprávy", "description": "" @@ -495,18 +421,6 @@ "message": "Tento měsíc", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepodporovaný typ přílohy. Klikněte pro uložení.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikněte pro uložení", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Nepojmenovaný soubor", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Hlasová zpráva", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Tento typ přílohy není povolen z bezpečnostních důvodů", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Načítám náhled...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Nelze načít vybranou přílohu.", "description": "" }, - "disconnected": { - "message": "Odpojen", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Připojování", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Přejít na poznámky k vydání", "description": "" }, - "goToForums": { - "message": "Přejít na fórum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Přejít na stránky podpory", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Nahlásit problém", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Předvolby aplikace Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "O Aplikaci Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Řeč", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Zobrazit", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skrýt", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Opustit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Hledat", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Vítejte v Signalu", "description": "" }, - "selectAContact": { - "message": "Vyberte si kontakt nebo skupinu a začněte si povídat.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Odeslat zprávu", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "domov", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Vy", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Odpověď: $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": "Pro posílání audio zpráv potřebuje Signal Desktop přístup k mikrofonu.", + "message": "Pro posílání audio zpráv potřebuje Session Desktop přístup k mikrofonu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Povolit přístup", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Zobrazit nastavení", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Zvuk", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Zrušit", "description": "" }, - "failedToSend": { - "message": "Selhalo odeslání některým příjemcům. Zkontrolujte si síťové připojení.", - "description": "" - }, "error": { "message": "Chyba", "description": "" }, - "messageDetail": { - "message": "Podrobnosti zprávy", - "description": "" - }, "delete": { "message": "Vymazat", "description": "" @@ -857,10 +705,6 @@ "message": "Členové skupiny", "description": "" }, - "showMembers": { - "message": "Zobrazit členy", - "description": "" - }, "resetSession": { "message": "Resetovat sezení", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Zobrazit bezpečnostní kód", "description": "" }, - "viewAllMedia": { - "message": "Zobrazit všechna média", - "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": "Pokud chcete zkontrolovat bezpečnost šifrované komunikace s $name$, porovnejte čísla nahoře s čísly na zařízení vašeho kontaktu.", "description": "", @@ -887,14 +727,6 @@ "message": "S tímto kontaktem jste si ještě nevyměnili žádné zprávy. Bezpečnostní číslo k němu bude dostupné po první zprávě.", "description": "" }, - "moreInfo": { - "message": "Více informací...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Odeslat znovu", - "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": "Smazat zprávu", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Uložit", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Vítejte v aplikaci Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Soukromí je možné. Signal jej usnadňuje.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Propojit telefon s Signal v počítači", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Nastavení Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Propojená zařízení", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Tlačítko '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Propojit nové zařízení", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Název zařízení", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Zvolte název tohoto zařízení", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Dokončuji propojení s telefonem", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synchronizuji kontakty a skupiny", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Připojení k serveru selhalo.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Promiňte, ale máte už příliš mnoho propojených zařízení. Zkuste některá odstranit.", - "description": "" - }, - "settings": { - "message": "Nastavení", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Motiv", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Oprávnění", @@ -1029,34 +801,6 @@ "message": "Kontrolovat pravopis při psaní zpráv", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Vymazat data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Vymazat data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Vymazat všechna data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Vymazat všechna data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Odpojuji a mažu všechny data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Oznámení", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Odeslání selhalo", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Podrobnosti", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skrýt podrobnosti", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Dozvědět se více o ověřování bezpečnostních čísel", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Tato verze aplikace Signal Desktop je zastaralá. Abyste mohli dále komunikovat, aktualizujte ji prosím na nejnovější verzi.", + "message": "Tato verze aplikace Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Multimediální zpráva", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Číslo není registrováno", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakty", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importovat všechny skupiny a kontakty Signalu z mobilního zařízení.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Poslední import", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importovat nyní", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importuje se…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import selhal. Zkontrolujte, zda jsou počítač i telefon připojeny k internetu.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "teď", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hodina", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hod.", - "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": "Před $hours$ hod.", - "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": "Před $minutes$ min.", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "teď", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Přehrát zvukové upozornění", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Bezpečnostní kód se změnil", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Světlý", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Zadejte telefonní číslo přidat kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neplatné číslo", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Znovu propojte Signel Desktop s mobilním telefonem pro pokračování.", - "description": "" - }, - "unlinked": { - "message": "Odpárováno", - "description": "" - }, - "relink": { - "message": "Přepárovat", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Dostupná aktualizace Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 57d96b4ea..1f291d88e 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Hjælp", "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": "Indstillinger", - "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" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Luk Signal", + "message": "Luk Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Opsætning med import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Opsætning som ny enhed", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Opsætning som selvstændig enhed", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Vælg fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Indlæs dine data", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har lige gået gennem eksportprocessen, og dine kontakter og meddelelser venter tålmodigt på din computer. Vælg den mappe, der indeholder dine gemte Signal-data.", + "message": "Du har lige gået gennem eksportprocessen, og dine kontakter og meddelelser venter tålmodigt på din computer. Vælg den mappe, der indeholder dine gemte Session-data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Sørg for at du har valgt den rigtige mappe, der indeholder dine gemte Signal-data. Dets navn skal begynde med 'Signal Export'. Du kan også gemme en ny kopi af dine data fra Chrome Appen.", + "message": "Sørg for at du har valgt den rigtige mappe, der indeholder dine gemte Session-data. Dets navn skal begynde med 'Session Export'. Du kan også gemme en ny kopi af dine data fra Chrome Appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Tag Signal Desktop i brug", + "message": "Tag Session Desktop i brug", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Forbind denne enhed til din telefon", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "din valgte lokation", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Opgraderer database. Det kan godt tage lidt tid...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Indlæser beskeder. $count$ indtil nu...", - "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": "Mig", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Du forlod gruppen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll til bunden af samtalen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ny besked nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nye beskeder nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ulæst besked", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Dine sikkerhedsnumre med flere gruppemedlemmer har ændret sig siden du sidst verificerede. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller bare at de har geninstalleret Signal.", + "message": "Dine sikkerhedsnumre med flere gruppemedlemmer har ændret sig siden du sidst verificerede. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller bare at de har geninstalleret Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Dit sikkerhedsnummer med $name$ har ændret sig siden du sidst verificerede. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Signal.", + "message": "Dit sikkerhedsnummer med $name$ har ændret sig siden du sidst verificerede. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Det sikkerhedsnummer du prøver at verificere har ændret sig. Venligst verificer det nye sikkerhedsnummer med $name$. Husk, dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Signal.", + "message": "Det sikkerhedsnummer du prøver at verificere har ændret sig. Venligst verificer det nye sikkerhedsnummer med $name$. Husk, dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Dine sikkerhedsnumre med flere gruppemedlemmer har ændret sig for nylig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller bare at de har geninstalleret Signal.", + "message": "Dine sikkerhedsnumre med flere gruppemedlemmer har ændret sig for nylig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller bare at de har geninstalleret Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Dit sikkerhedsnummer med $name$ har ændret sig for nylig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Signal.", + "message": "Dit sikkerhedsnummer med $name$ har ændret sig for nylig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Dit sikkerhedsnummer med $name$ har ændret sig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Signal. Du bør overveje at verificere dit sikkerhedsnummer med denne kontakt.", + "message": "Dit sikkerhedsnummer med $name$ har ændret sig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Session. Du bør overveje at verificere dit sikkerhedsnummer med denne kontakt.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Send", "description": "" }, - "acceptNewKey": { - "message": "Acceptér", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marker som verificeret", "description": "" @@ -455,10 +385,6 @@ "message": "Nyt sikkerhedsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Dit sikkerhedsnummer med denne kontakt har ændret sig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at denne kontakt bare har geninstalleret Signal. Du bør overveje at verificere det nye sikkerhedsnummer nedenfor.", - "description": "" - }, "incomingError": { "message": "Fejl i forbindelse med indgående besked", "description": "" @@ -495,18 +421,6 @@ "message": "Denne måned", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Ikke-understøttet vedhæftningstype. Klik for at gemme.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klik for at gemme", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unavngiven fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Talebesked", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Vedhæftningstype er ikke tilladt af sikkerhedsmæssige årsager", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Indlæser eksempelvisning...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Udkast miniaturebillede til eksempelvisning for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniaturebillede til eksempelvisning for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Kan ikke indlæse den valgte vedhæftning.", "description": "" }, - "disconnected": { - "message": "Afbrudt", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Forbinder", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Gå til udgivelsesnoter", "description": "" }, - "goToForums": { - "message": "Gå til fora", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå til supportsiden", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Indmeld en fejl", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop indstillinger", - "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" @@ -635,18 +529,6 @@ "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": "Afslut", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Søg", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Velkommen til Signal", - "description": "" - }, - "selectAContact": { - "message": "Vælg en kontakt eller gruppe for at komme igang med at chatte.", + "message": "Velkommen til Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send besked", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hjem", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Dig", "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": "For at sende talebeskeder skal du lade Signal Desktop få adgang til din mikrofon.", + "message": "For at sende talebeskeder skal du lade Session Desktop få adgang til din mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Tillad adgang", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Vis indstillinger", - "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" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Afbryd", "description": "" }, - "failedToSend": { - "message": "Kunne ikke sende til nogle modtagere. Kontrollér din internetforbindelse.", - "description": "" - }, "error": { "message": "Fejl", "description": "" }, - "messageDetail": { - "message": "Beskeddetalje", - "description": "" - }, "delete": { "message": "Slet", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppemedlemmer", "description": "" }, - "showMembers": { - "message": "Vis medlemmer", - "description": "" - }, "resetSession": { "message": "Nulstil session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Vis sikkerhedsnummer", "description": "" }, - "viewAllMedia": { - "message": "Se all mediefiler", - "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": "Hvis du ønsker at verificere sikkerheden af din end-to-end kryptering med $name$ kan du sammenligne numrene ovenfor med numrene på deres enhed.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har ikke udvekslet nogen beskeder med denne kontakt endnu. Dit sikkerhedsnummer med dem vil være tilgængeligt efter den første meddelelse.", "description": "" }, - "moreInfo": { - "message": "Mere info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Prøv igen", - "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": "Slet besked", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Gem", "description": "" }, - "fileIconAlt": { - "message": "Filikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji billede af '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Velkommen til Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatliv er muligt. Signal gør det nemt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Forbind din telefon til Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal indstillinger", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Forbundne enheder", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+'-knap", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Forbind ny enhed", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Enhedsnavn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Vælg denne enheds navn", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Afslut tilkobling af telefon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserer kontakter og grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunne ikke kontakte serveren.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Beklager, du har for mange enheder forbundet. Prøv at fjerne nogle.", - "description": "" - }, - "settings": { - "message": "Indstillinger", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Tilladelser", @@ -1029,34 +801,6 @@ "message": "Aktiver stavekontrol af beskeder", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Ryd data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dette vil rydde alle data i programmet, fjerne alle beskeder og gemte kontooplysninger.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Ryd data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Slet alle data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du er ved at slette alle gemte kontoinformationer, herunder alle kontakter og alle beskeder. Du kan altid tilkoble din mobilenhed på ny, men det vil ikke genoprette slettede beskeder.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Slet alle data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Afbryder og sletter alle data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Meddelelser", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Afsendelse fejlede", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaljer", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skjul detaljer", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lær mere om at verificere sikkerhedsnumre", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Denne version af Signal er forældet. Venligst opgrader til den seneste version.", + "message": "Denne version af Session er forældet. Venligst opgrader til den seneste version.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Mediebesked", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nummer er ikke registreret", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakter", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importer alle Signalgrupper og kontakter fra din mobilenhed.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Sidste import:", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importér nu", - "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": "Importen mislykkedes. Sørg for, at din computer og din telefon er forbundet til internettet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nu", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "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. siden", - "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. siden", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nu", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Afspil lydmeddelelse", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Sikkerhedsnummer har ændret sig", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Lys", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 ny samtale...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Indtast et telefonnummer for at tilføje en kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ugyldigt nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Tilkobl Signal Desktop din mobilenhed på ny for at fortsætte", - "description": "" - }, - "unlinked": { - "message": "Frakoblet", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Sessionopdatering tilgængelig", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 41c69f59c..1a43346b3 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -3,18 +3,10 @@ "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." @@ -24,7 +16,7 @@ "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": "&Ansicht", + "message": "&Anzeigen", "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": { @@ -35,10 +27,6 @@ "message": "&Hilfe", "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": "Einstellungen …", - "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": "Ausblenden", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Signal beenden", + "message": "Session beenden", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -88,14 +76,14 @@ "description": "Title for the Edit Profile modal" }, "editMenuSelectAll": { - "message": "Alles auswählen", + "message": "Alle Auswählen", "description": "Edit menu comand to select all of the text in selected text box" }, "newSession": { - "message": "Neue Session" + "message": "Neue Session" }, "addContact": { - "message": "Kontakt hinzufügen" + "message": "Kontakt hinzufügen" }, "editMenuStartSpeaking": { "message": "Sprachausgabe starten", @@ -145,10 +133,6 @@ "message": "Einrichten mit Importieren", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Einrichten als neues Gerät", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Einrichten als eigenständiges Gerät", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -158,7 +142,7 @@ "description": "Message shown on the loading screen before we've loaded any messages" }, "or": { - "message": "oder" + "message": "oder" }, "optimizingApplication": { "message": "Anwendung wird optimiert …", @@ -174,36 +158,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Datei auswählen", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Lade deine Daten", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du hast gerade den Exportierungsprozess durchlaufen, und deine Kontakte und Nachrichten warten geduldig auf deinem Computer. Wähle nun den Ordner aus, der deine gespeicherten Signal-Daten enthält.", + "message": "Du hast gerade den Exportierungsprozess durchlaufen, und deine Kontakte und Nachrichten warten geduldig auf deinem Computer. Wähle nun den Ordner aus, der deine gespeicherten Session-Daten enthält.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -219,7 +183,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Achte darauf, dass du das korrekte Verzeichnis gewählt hast, das deine gespeicherten Signal-Daten enthält. Dessen Name sollte mit »Signal Export« beginnen. Auch kannst du eine neue Kopie deiner Daten aus der Chrome-App heraus speichern.", + "message": "Achte darauf, dass du das korrekte Verzeichnis gewählt hast, das deine gespeicherten Session-Daten enthält. Dessen Name sollte mit »Session Export« beginnen. Auch kannst du eine neue Kopie deiner Daten aus der Chrome-App heraus speichern.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -235,31 +199,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Signal Desktop verwenden", + "message": "Session Desktop verwenden", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Dieses Gerät mit deinem Telefon koppeln", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "dein ausgewählter Ort", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Datenbank wird aktualisiert. Dies kann einige Zeit in Anspruch nehmen …", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Nachrichten werden geladen. Bisher $count$ …", - "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": "Ich", "description": "The label for yourself when shown in a group member list" @@ -272,24 +218,12 @@ "message": "Du hast die Gruppe verlassen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Zum Ende der Unterhaltung scrollen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Neue Nachricht weiter unten", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Neue Nachrichten weiter unten", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { - "message": "1 ungelesene Nachricht", + "message": "$count$ Ungelesene Nachricht", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ ungelesene Nachrichten", + "message": "$count$ Ungelesene Nachrichten", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -343,11 +277,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": "Deine Sicherheitsnummern mit mehreren Gruppenmitgliedern haben sich seit eurer letzten Verifikation geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber die entsprechenden Mitglieder haben Signal einfach erneut installiert.", + "message": "Deine Sicherheitsnummern mit mehreren Gruppenmitgliedern haben sich seit eurer letzten Verifikation geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber die entsprechenden Mitglieder haben Session einfach erneut installiert.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Deine Sicherheitsnummer mit $name$ hat sich seit eurer letzten Verifikation geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Signal einfach erneut installiert.", + "message": "Deine Sicherheitsnummer mit $name$ hat sich geändert und ist nicht mehr verifiziert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören. Oder $name$ hat Session einfach erneut installiert.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -357,7 +291,7 @@ } }, "changedRightAfterVerify": { - "message": "Die zu verifizierende Sicherheitsnummer hat sich geändert. Bitte überprüfe deine neue Sicherheitsnummer mit $name$. Diese Veränderung könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Signal einfach erneut installiert.", + "message": "Die zu verifizierende Sicherheitsnummer hat sich geändert. Bitte überprüfe deine neue Sicherheitsnummer mit $name$. Diese Veränderung könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Session einfach erneut installiert.", "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": { @@ -367,11 +301,11 @@ } }, "changedRecentlyMultiple": { - "message": "Deine Sicherheitsnummern mit mehreren Gruppenmitgliedern haben sich kürzlich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber die entsprechenden Mitglieder haben Signal einfach erneut installiert.", + "message": "Deine Sicherheitsnummern mit mehreren Gruppenmitgliedern haben sich kürzlich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber die entsprechenden Mitglieder haben Session einfach erneut installiert.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Deine Sicherheitsnummer mit $name$hat sich kürzlich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Signal einfach erneut installiert.", + "message": "Deine gemeinsame Sicherheitsnummer mit $name$ hat sich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören. Oder $name$ hat Session einfach erneut installiert.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -381,7 +315,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Deine Sicherheitsnummer mit $name$ hat sich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Signal einfach erneut installiert. Vielleicht möchtest du die neue Sicherheitsnummer mit diesem Kontakt verifizieren.", + "message": "Deine Sicherheitsnummer mit $name$ hat sich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Session einfach erneut installiert. Vielleicht möchtest du die neue Sicherheitsnummer mit diesem Kontakt verifizieren.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -428,10 +362,6 @@ "message": "Übermitteln", "description": "" }, - "acceptNewKey": { - "message": "Akzeptieren", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Als verifiziert markieren", "description": "" @@ -441,7 +371,7 @@ "description": "" }, "isVerified": { - "message": "Du hast deine Sicherheitsnummer mit $name$ verifiziert.", + "message": "Du hast deine Sicherheitsnummer mit $name$ als verifiziert markiert", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -468,10 +398,6 @@ "message": "Neue Sicherheitsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Deine Sicherheitsnummer mit diesem Kontakt hat sich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber dieser Kontakt hat Signal einfach erneut installiert. Vielleicht möchtest du die neue Sicherheitsnummer weiter unten verifizieren.", - "description": "" - }, "incomingError": { "message": "Fehler bei eingehender Nachricht", "description": "" @@ -481,7 +407,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "In dieser Unterhaltung gibt es keine Medieninhalte", + "message": "Keine Medieninhalte", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -489,7 +415,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "In dieser Unterhaltung gibt es keine Dokumente", + "message": "Keine Dokumente", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -508,18 +434,6 @@ "message": "Diesen Monat", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nicht unterstützter Anhangstyp. Zum Speichern anklicken.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Zum Speichern anklicken", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unbenannte Datei", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Sprachnachricht", "description": "Name for a voice message attachment" @@ -528,13 +442,9 @@ "message": "Anhangstyp aus Sicherheitsgründen nicht erlaubt", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Vorschau wird geladen …", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Miniaturbild des Link-Vorschauentwurfs für $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -544,7 +454,7 @@ }, "previewThumbnail": { "message": "Miniaturbild der Link-Vorschau für $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,82 +472,55 @@ } } }, - "copiedPublicKey": { - "message": "In Zwischenablage kopiert", - "description": "A toast message telling the user that the key was copied" - }, - "copiedChatId": { - "message": "In Zwischenablage kopiert", - "description": "A toast message telling the user that the key was copied" - }, "sessionResetOngoing": { - "message": "Verschlüsselung neu gestartet", - "description": "your secure session is currently being reset, waiting for the reset acknowledgment." + "message": "Verschlüsselung neu gestartet", + "description": "your secure session is currently being reset, waiting for the reset acknowledgment." }, "blockUser": { - "message": "Blockieren" + "message": "Blockieren" }, "unblockUser": { - "message": "Freigeben" + "message": "Freigeben" }, "members": { "message": "$count$ mitglied", "placeholders": { "count": { - "content": "$1", - "example": "26" - } + "content": "$1", + "example": "26" + } } }, "noContactsForGroup": { - "message": "Sie haben noch keine Kontakte." + "message": "Sie haben noch keine Kontakte." }, "getStarted": { - "message": "Loslegen" + "message": "Loslegen" }, "createAccount": { - "message": "Konto Erstellen" + "message": "Konto Erstellen" }, "signIn": { - "message": "Einloggen" + "message": "Einloggen" }, "beginYourSession": { "message": "Beginnen
Sie
Ihre
Session." - }, + }, "continue": { - "message": "Fortsetzen" + "message": "Weiter" }, "welcomeToYourSession": { "message": "Willkommen bei Session" - }, + }, "generateSessionID": { "message": "Session ID erstellen" - }, - "yourUniqueSessionID": { + }, + "yourUniqueSessionID": { "message": "Das ist Ihre Session ID." - }, - "allUsersAreRandomly...": { + }, + "allUsersAreRandomly...": { "message": "Ihre Session ID ist die eindeutige Adresse, unter der Personen Sie über Session kontaktieren können. Ihre Session ID ist nicht mit Ihrer realen Identität verbunden, völlig anonym und von Natur aus privat." - }, - "leaveOpenGroupConfirmation": { - "message": "Möchtest du wirklich diese Gruppe verlassen??", - "description": "Confirmation dialog text that tells the user what will happen if they leave the public channel." - }, - "leaveClosedGroupConfirmation": { - "message": "Möchtest du wirklich diese Gruppe verlassen?", - "description": "Confirmation dialog text that tells the user what will happen if they leave the closed group." }, - "copyPublicKey": { - "message": "Kopieren", - "description": "Button action that the user can click to copy their public keys" - }, - "copyChatId": { - "message": "Kopieren" - }, - "deleteContact": { - "message": "Kontakt löschen", - "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." - }, "oneNonImageAtATimeToast": { "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" @@ -645,7 +528,7 @@ "editGroupName": { "message": "Gruppe bearbeiten", "description": "Button action that the user can click to edit a group name (closed)" - }, + }, "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" @@ -655,17 +538,13 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Entschuldigung, die ausgewählte Datei überschreitet die maximal erlaubte Nachrichtengröße.", + "message": "Anhang zu groß für die gesendete Nachrichtenart.", "description": "" }, "unableToLoadAttachment": { - "message": "Ausgewählter Anhang kann nicht geladen werden.", + "message": "Leider ist ein Fehler beim Hinzufügen des Anhangs aufgetreten.", "description": "" }, - "disconnected": { - "message": "Keine Serververbindung", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Verbindung wird hergestellt …", "description": "Displayed when the desktop client is currently connecting to the server." @@ -700,10 +579,6 @@ "message": "Versionshinweise", "description": "" }, - "goToForums": { - "message": "Forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Support", "description": "Item under the Help menu, takes you to the support page" @@ -712,14 +587,6 @@ "message": "Problem melden", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Einstellungen für Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Über Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Sprachausgabe", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -728,24 +595,12 @@ "message": "Anzeigen", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ausblenden", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Beenden", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Suchen", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Keine Ergebnisse für »$searchTerm$«", + "message": "Keine Ergebnisse für »%s« gefunden", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -767,11 +622,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Willkommen bei Signal", - "description": "" - }, - "selectAContact": { - "message": "Wähle einen Kontakt oder eine Gruppe aus, um eine Unterhaltung zu beginnen.", + "message": "Willkommen bei Session", "description": "" }, "typingAlt": { @@ -788,10 +639,6 @@ } } }, - "sendMessageToContact": { - "message": "Nachricht senden", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Privat", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -832,23 +679,17 @@ "message": "Auf Nachricht antworten", "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, - "enterOpenGroupURL": { - "message": "Gruppen-URL öffnen" - }, "newClosedGroup": { - "message": "Neue geschlossene Gruppe" + "message": "Neue geschlossene Gruppe" }, "createClosedGroupNamePrompt": { - "message": "Gruppenname" + "message": "Gruppenname" }, "createClosedGroupPlaceholder": { - "message": "Geben Sie einen Gruppennamen ein." - }, - "addChannelDescription": { - "message": "Geben Sie eine offene Gruppen-URL ein." + "message": "Geben Sie einen Gruppennamen ein." }, "next": { - "message": "Weiter" + "message": "Weiter" }, "originalMessageNotFound": { "message": "Originalnachricht nicht gefunden", @@ -870,28 +711,14 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Antwort auf $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": "Zum Senden von Audionachrichten musst du Signal Desktop den Zugriff auf dein Mikrofon erlauben.", + "message": "Erlaube Session zum Versenden von Sprachnachrichten Zugriff auf dein Mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Zugriff erlauben", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Einstellungen anzeigen", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -908,10 +735,6 @@ "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": "" @@ -920,18 +743,10 @@ "message": "Abbrechen", "description": "" }, - "failedToSend": { - "message": "Versand an einige Empfänger gescheitert. Überprüfe deine Netzverbindung.", - "description": "" - }, "error": { "message": "Fehler", "description": "" }, - "messageDetail": { - "message": "Nachrichtendetails", - "description": "" - }, "delete": { "message": "Löschen", "description": "" @@ -941,15 +756,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Diese Nachricht löschen", + "message": "Nachrichten löschen", "description": "" }, "from": { - "message": "Von", + "message": "Von:", "description": "Label for the sender of a message" }, "to": { - "message": "an", + "message": "An:", "description": "Label for the receiver of a message" }, "sent": { @@ -968,22 +783,14 @@ "message": "Gruppenmitglieder", "description": "" }, - "showMembers": { - "message": "Mitglieder anzeigen", - "description": "" - }, "resetSession": { - "message": "Verschlüsselung neu starten", + "message": "Verschlüsselung Neu Starten", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Sicherheitsnummer anzeigen", + "message": "Sicherheitsnummer Anzeigen", "description": "" }, - "viewAllMedia": { - "message": "Alle Medieninhalte anzeigen", - "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": "Falls du die Sicherheit deiner Ende-zu-Ende-Verschlüsselung mit $name$ verifizieren möchtest, vergleiche bitte die oben dargestellte Nummer mit jener auf dem Gerät deines Kontakts.", "description": "", @@ -998,16 +805,8 @@ "message": "Du hast bisher noch keine Nachrichten mit diesem Kontakt ausgetauscht. Eure gemeinsame Sicherheitsnummer wird nach der ersten Nachricht verfügbar sein.", "description": "" }, - "moreInfo": { - "message": "Mehr Details …", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Senden erneut versuchen", - "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": "Nachricht löschen", + "message": "Nachrichten Löschen", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -1018,14 +817,6 @@ "message": "Soll diese Unterhaltung unwiderruflich gelöscht werden?", "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." }, - "deleteAccount": { - "message": "Alle Daten löschen", - "description": "Text for button in settings view to delete account" - }, - "deleteAccountWarningSub": { - "message": "Dadurch werden Ihre Nachrichten, Sessions und Kontakte dauerhaft gelöscht.", - "description": "Warning for account deletion in settings view" - }, "sessionEnded": { "message": "Verschlüsselung zurückgesetzt", "description": "This is a past tense, informational message. In other words, your secure session has been reset." @@ -1058,10 +849,6 @@ "message": "Speichern", "description": "" }, - "fileIconAlt": { - "message": "Dateisymbol", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emojibild von »$title$«", "description": "Used in the alt tag of all emoji images", @@ -1072,65 +859,9 @@ } } }, - "installWelcome": { - "message": "Willkommen bei Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatsphäre ist möglich. Signal macht sie einfach.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Kopple dein Telefon mit Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal-Einstellungen", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Gekoppelte Geräte", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "»+«-Schaltfläche", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "Neues Gerät koppeln", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Gerätename", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Wähle einen Namen für dieses Gerät aus", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Koppeln mit Telefon abschließen", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Kontakte und Gruppen werden synchronisiert …", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Verbinden mit Server gescheitert.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Es sind bereits zu viele Geräte gekoppelt. Versuche einige zu entfernen.", - "description": "" - }, - "settings": { - "message": "Einstellungen", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Design", - "description": "Header for theme settings" + "message": "Neues Gerät Koppeln", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Berechtigungen", @@ -1148,34 +879,6 @@ "message": "Rechtschreibprüfung für im Nachrichteneingabefeld eingegebenen Text aktivieren", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Daten löschen", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dies wird alle Benutzerdaten der Anwendung löschen, d. h. alle Nachrichten und gespeicherten Benutzerkontoinformationen.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Daten löschen", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Alle Daten löschen?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du bist dabei, alle gespeicherten Benutzerkontoinformationen dieser Anwendung zu löschen, einschließlich aller Kontakte und Nachrichten. Du kannst Signal Desktop jederzeit wieder mit deinem Mobilgerät koppeln, dies wird aber gelöschte Nachrichten nicht wiederherstellen.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Alle Daten löschen", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Verbindung wird getrennt und alle Daten gelöscht", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Benachrichtigungen", "description": "Header for notification settings" @@ -1185,7 +888,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Benachrichtigungen deaktivieren", + "message": "Stummschalten", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1209,7 +912,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Letzte Nachricht von:", + "message": "Neueste von: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1221,35 +924,27 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Versand gescheitert", + "message": "Versand Gescheitert", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Details ausblenden", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Erfahre mehr über das Verifizieren von Sicherheitsnummern", "description": "Text that links to a support article on verifying safety numbers" }, "appearanceSettingsTitle": { - "message": "Darstellung" + "message": "Darstellung" }, "privacySettingsTitle": { - "message": "Datenschutz" + "message": "Datenschutz" }, "notificationsSettingsTitle": { - "message": "Benachrichtigungen" + "message": "Benachrichtigungen" }, "devicesSettingsTitle": { - "message": "Geräte" + "message": "Gekoppelte Geräte" }, "linkPreviewsTitle": { - "message": "Link-Vorschauen senden", + "message": "Link-Vorschauen Senden", "description": "Option to control creation and send of link previews in setting screen" }, "linkPreviewDescription": { @@ -1257,38 +952,30 @@ "description": "Description shown for the Link Preview option " }, "expiredWarning": { - "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.", + "message": "Diese Version von Session 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" }, "readReceiptSettingDescription": { - "message": "Lesebestätigungen aktivieren", - "description": "Description of the read receipts setting" + "message": "Lesebestätigungen aktivieren", + "description": "Description of the read receipts setting" }, "readReceiptSettingTitle": { - "message": "Lesebestätigungen", - "description": "Title of the read receipts setting" + "message": "Lesebestätigungen", + "description": "Title of the read receipts setting" }, "typingIndicatorsSettingDescription": { "message": "sehen und teilen, wann Nachrichten eingetippt werden", "description": "Description of the typing indicators setting" }, "typingIndicatorsSettingTitle": { - "message": "Tipp-Indikatoren", - "description": "Title of the typing indicators setting" + "message": "Tipp-Indikatoren", + "description": "Title of the typing indicators setting" }, "inviteContacts": { - "message": "Freunde einladen" + "message": "Freunde Einladen" }, "settingsHeader": { - "message": "Einstellungen" - }, - "leaveOpenGroup": { - "message": "Gruppe öffnen verlassen", - "description": "Button action that the user can click to leave the group" - }, - "leaveClosedGroup": { - "message": "Geschlossene Gruppe verlassen", - "description": "Button action that the user can click to leave the group" + "message": "Einstellungen" }, "upgrade": { "message": "Aktualisieren", @@ -1298,36 +985,8 @@ "message": "Nachricht mit Medieninhalten", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Rufnummer ist nicht registriert", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakte", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Alle Signal-Gruppen und -Kontakte von deinem Mobilgerät importieren.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Letzter Import am", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Jetzt importieren", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Import wird durchgeführt …", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importieren gescheitert. Stelle sicher, dass dein Computer und dein Mobilgerät mit dem Internet verbunden sind.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "Gerade eben", + "message": "Jetzt", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1338,50 +997,6 @@ "message": "1 Stunde", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "vor $hours$ h", - "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": "vor $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "jetzt", - "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'." @@ -1395,7 +1010,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Du hast die Zeitbegrenzung für verschwindende Nachrichten auf $time$ festgelegt", + "message": "Du hast die Zeit für verschwindende Nachrichten auf $time$ festgelegt.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1415,7 +1030,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ hat die Zeitbegrenzung für verschwindende Nachrichten auf $time$ festgelegt", + "message": "$name$ hat die Zeit für verschwindende Nachrichten auf $time$ festgelegt.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1429,7 +1044,7 @@ } }, "timerOption_0_seconds": { - "message": "aus", + "message": "Aus", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1533,7 +1148,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ hat verschwindende Nachrichten deaktiviert", + "message": "$name$ hat verschwindende Nachrichten deaktiviert.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1543,11 +1158,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Du hast verschwindende Nachrichten deaktiviert", + "message": "Du hast verschwindende Nachrichten deaktiviert.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Zeitbegrenzung auf $time$ festgelegt", + "message": "Zeit für verschwindende Nachrichten auf $time$ festgelegt", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1556,16 +1171,12 @@ } } }, - "audioNotificationDescription": { - "message": "Benachrichtigungston wiedergeben", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { - "message": "Sicherheitsnummer hat sich geändert", + "message": "Geänderte Sicherheitsnummer", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Sicherheitsnummer mit $name$ hat sich geändert", + "message": "Deine Sicherheitsnummer mit $name$ hat sich geändert", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1575,7 +1186,7 @@ } }, "verifyNewNumber": { - "message": "Sicherheitsnummer verifizieren", + "message": "Sicherheitsnummer Verifizieren", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1588,46 +1199,18 @@ } } }, - "themeLight": { - "message": "Hell", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Neue Unterhaltung beginnen …", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Gib zum Hinzufügen eines Kontakts eine Rufnummer ein.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ungültige Rufnummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Kopple Signal Desktop erneut mit deinem Mobilgerät, um weiterhin Nachrichten austauschen zu können.", - "description": "" - }, - "unlinked": { - "message": "Entkoppelt", - "description": "" - }, - "relink": { - "message": "Erneut koppeln", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Aktualisierung für Session verfügbar", "description": "" @@ -1673,7 +1256,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Gruppenname ist jetzt »$name$«", + "message": "Gruppenname lautet jetzt »$name$«.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1683,25 +1266,19 @@ } }, "joinOpenGroup": { - "message": "Offener Gruppe beitreten" + "message": "Offener Gruppe beitreten" }, "yourSessionID": { - "message": "Ihre Session ID" - }, - "createClosedGroup": { - "message": "Neue geschlossene Gruppe" - }, - "searchForAKeyPhrase": { - "message": "Nach Unterhaltungen, Kontakten und Nachrichten suchen" + "message": "Ihre Session ID" }, "enterSessionID": { - "message": "Session ID eingeben" + "message": "Session ID eingeben" }, "usersCanShareTheir...": { - "message": "Benutzer können ihre Session ID freigeben, indem sie in ihren Einstellungen auf \"Session ID freigeben\" tippen oder ihren QR-Code freigeben." + "message": "Benutzer können ihre Session ID freigeben, indem sie in ihren Einstellungen auf \"Session ID freigeben\" tippen oder ihren QR-Code freigeben." }, "joinedTheGroup": { - "message": "$name$ ist der Gruppe beigetreten", + "message": "$name$ ist der Gruppe beigetreten.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1711,7 +1288,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ sind der Gruppe beigetreten", + "message": "$name$ sind der Gruppe beigetreten.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1719,5 +1296,170 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Bedingungen & Datenschutzerklärung" + }, + "unknown": { + "message": "Unbekannt" + }, + "changedSinceVerifiedTitle": { + "message": "Geänderte Sicherheitsnummer" + }, + "youMayWishToVerifyContact": { + "message": "Vielleicht möchtest du deine Sicherheitsnummer mit diesem Kontakt verifizieren." + }, + "about": { + "message": "Über" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Gerätelimit erreicht" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Es sind bereits zu viele Geräte gekoppelt. Versuche, mindestens eines zu entfernen." + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Verknüpfungsanfrage empfangen" + }, + "waitingForDeviceToRegister": { + "message": "Warten auf Gerät" + }, + "pairNewDevicePrompt": { + "message": "Scanne zum Koppeln den auf dem Gerät angezeigten QR-Code ein" + }, + "noPairedDevices": { + "message": "Keine Geräte gekoppelt" + }, + "deviceUnpaired": { + "message": "Ihr Gerät wurde erfolgreich getrennt." + }, + "sendMessageLeftGroup": { + "message": "Du hast die Gruppe verlassen" + }, + "moreInformation": { + "message": "Mehr Informationen" + }, + "resend": { + "message": "Erneut Senden" + }, + "clearAllData": { + "message": "Alle Daten löschen" + }, + "deleteAccountWarning": { + "message": "Dadurch werden Ihre Nachrichten, Sessions und Kontakte dauerhaft gelöscht." + }, + "deleteContactConfirmation": { + "message": "Möchten Sie diese Unterhaltung wirklich löschen?" + }, + "copy": { + "message": "Kopieren" + }, + "themeToggleTitle": { + "message": "Hell" + }, + "successUnlinked": { + "message": "Ihr Gerät wurde erfolgreich getrennt." + }, + "autoUpdateDownloadButtonLabel": { + "message": "Herunterladen" + }, + "blockedSettingsTitle": { + "message": "Blockierte Kontakte" + }, + "leaveGroup": { + "message": "Gruppe Verlassen" + }, + "leaveGroupConfirmation": { + "message": "Sind Sie sich sicher, dass Sie diese Gruppe verlassen möchten?" + }, + "editGroup": { + "message": "Gruppe bearbeiten" + }, + "updateGroupDialogTitle": { + "message": "$name$ wird aktualisiert …" + }, + "showRecoveryPhrase": { + "message": "Wiederherstellungssatz" + }, + "recoveryPhraseSavePromptMain": { + "message": "Ihr Wiederherstellungssatz ist der Hauptschlüssel für Ihre Session ID. Mit diesem Satz können Sie Ihre Session ID wiederherstellen, wenn Sie den Zugriff auf Ihr Gerät verlieren. Bewahren Sie Ihren Wiederherstellungssatz an einem sicheren Ort auf und geben Sie ihn an niemandem weiter." + }, + "copiedToClipboard": { + "message": "In die Zwischenablage kopiert." + }, + "unlock": { + "message": "Entsperren" + }, + "connectToServerFail": { + "message": "Konnte der Gruppe nicht beitreten." + }, + "connectingToServer": { + "message": "Verbindung wird hergestellt …" + }, + "remove": { + "message": "Entfernen" + }, + "invalidSessionId": { + "message": "Ungültige Session ID" + }, + "emptyGroupNameError": { + "message": "Bitte geben Sie einen Gruppennamen ein." + }, + "groupNamePlaceholder": { + "message": "Gruppenname" + }, + "recoveryPhrase": { + "message": "Wiederherstellungssatz" + }, + "enterRecoveryPhrase": { + "message": "Ihr Wiederherstellungssatz" + }, + "enterDisplayName": { + "message": "Geben Sie einen Anzeigenamen ein" + }, + "enterSessionIDHere": { + "message": "Geben Sie Ihre Session ID ein." + }, + "continueYourSession": { + "message": "Ihre Session fortsetzen" + }, + "linkDevice": { + "message": "Gerät verbinden" + }, + "restoreUsingRecoveryPhrase": { + "message": "Ihr Konto wiederherstellen" + }, + "searchFor...": { + "message": "Nach Unterhaltungen, Kontakten und Nachrichten suchen" + }, + "enterSessionIDOfRecipient": { + "message": "Geben Sie eine Session ID ein." + }, + "recoveryPhraseEmpty": { + "message": "Ihr Wiederherstellungssatz" + }, + "displayNameEmpty": { + "message": "Bitte wählen Sie einen Anzeigenamen" + }, + "openGroupURL": { + "message": "Gruppen-URL öffnen" + }, + "enterAnOpenGroupURL": { + "message": "Geben Sie eine offene Gruppen-URL ein." + }, + "pairingDevice": { + "message": "Gerät Koppeln" + }, + "invalidGroupNameTooShort": { + "message": "Bitte geben Sie einen Gruppennamen ein." + }, + "invalidGroupNameTooLong": { + "message": "Bitte geben Sie einen kürzeren Gruppennamen ein." + }, + "pickClosedGroupMember": { + "message": "Bitte wählen Sie mindestens zwei Gruppenmitglieder aus." + }, + "closedGroupMaxSize": { + "message": "Eine geschlossene Gruppe kann maximal zwanzig Mitglieder haben." } -} +} \ No newline at end of file diff --git a/_locales/el/messages.json b/_locales/el/messages.json index 5a504dadd..26b3f003b 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Βοήθεια", "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": "Προτιμήσεις...", - "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": "Απόκρυψη", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Αποσύνδεση από το Signal", + "message": "Αποσύνδεση από το Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Εγκατάσταση με Εισαγωγή", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Διαμόρφωση ως Νέα Συσκευή", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Διαμόρφωση ως Αυτόνομη Συσκευή", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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": "Επιλογή αρχείου", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Φόρτωση δεδομένων", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Μόλις περάσατε τη διαδικασία εξαγωγής και οι επαφές και τα μηνύματά σας περιμένουν υπομονετικά τον υπολογιστή σας. Επιλέξτε τον φάκελο που περιέχει τα αποθηκευμένα δεδομένα του Signal σας.", + "message": "Μόλις περάσατε τη διαδικασία εξαγωγής και οι επαφές και τα μηνύματά σας περιμένουν υπομονετικά τον υπολογιστή σας. Επιλέξτε τον φάκελο που περιέχει τα αποθηκευμένα δεδομένα του Session σας.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Βεβαιωθείτε ότι έχετε επιλέξει τον σωστό φάκελο που περιέχει τα αποθηκευμένα δεδομένα του Signal. Το όνομά του θα πρέπει να ξεκινά με το 'Signal Export.' Μπορείτε επίσης να αποθηκεύσετε ένα νέο αντίγραφο των δεδομένων σας από την εφαρμογή Chrome.", + "message": "Βεβαιωθείτε ότι έχετε επιλέξει τον σωστό φάκελο που περιέχει τα αποθηκευμένα δεδομένα του Session. Το όνομά του θα πρέπει να ξεκινά με το 'Session Export.' Μπορείτε επίσης να αποθηκεύσετε ένα νέο αντίγραφο των δεδομένων σας από την εφαρμογή Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Ξεκινήστε τη χρήση του Signal Desktop", + "message": "Ξεκινήστε τη χρήση του Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Σύνδεση αυτής της συσκευής με το τηλέφωνό σας", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "επιλεγμένη τοποθεσία σας", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Αναβάθμιση βάσης δεδομένων. Αυτό μπορεί να πάρει κάποια ώρα...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Φόρτωση μηνυμάτων. $count$ μέχρι στιγμής...", - "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": "Εγώ", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Αποχωρήσατε από την ομάδα", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Μετάβαση στο τέλος της συνομιλίας", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Νέο μήνυμα παρακάτω", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Νέα μηνύματα παρακάτω", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 μη αναγνωσμένο μήνυμα", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Οι αριθμοί ασφαλείας σας με πολλαπλά μέλη αυτής της ομάδας άλλαξαν από την τελευταία φορά που επιβεβαιώθηκαν. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς επανεγκατέστησαν το Signal.", + "message": "Οι αριθμοί ασφαλείας σας με πολλαπλά μέλη αυτής της ομάδας άλλαξαν από την τελευταία φορά που επιβεβαιώθηκαν. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς επανεγκατέστησαν το Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ άλλαξε από την τελευταία φορά που επιβεβαιώθηκε. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Signal.", + "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ άλλαξε από την τελευταία φορά που επιβεβαιώθηκε. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Ο αριθμός ασφαλείας που προσπαθείτε να επιβεβαιώσετε έχει αλλάξει. Παρακαλώ επιβεβαιώστε τον νέο αριθμό ασφαλείας με τον/την $name$. Θυμηθείτε, αυτή η αλλαγή μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Signal.", + "message": "Ο αριθμός ασφαλείας που προσπαθείτε να επιβεβαιώσετε έχει αλλάξει. Παρακαλώ επιβεβαιώστε τον νέο αριθμό ασφαλείας με τον/την $name$. Θυμηθείτε, αυτή η αλλαγή μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Οι αριθμοί ασφαλείας σας με πολλαπλά μέλη της ομάδας άλλαξαν πρόσφατα. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς επανεγκατέστησαν το Signal.", + "message": "Οι αριθμοί ασφαλείας σας με πολλαπλά μέλη της ομάδας άλλαξαν πρόσφατα. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς επανεγκατέστησαν το Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ άλλαξε πρόσφατα. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Signal.", + "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ άλλαξε πρόσφατα. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ έχει αλλάξει. Αυτό θα μπορούσε είτε να σημαίνει ότι κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας είτε ότι απλώς ο/η $name$ επανεγκατέστησε το Signal. Ίσως επιθυμείτε να επαληθεύσετε τον αριθμό ασφαλείας σας με αυτή την επαφή.", + "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ έχει αλλάξει. Αυτό θα μπορούσε είτε να σημαίνει ότι κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας είτε ότι απλώς ο/η $name$ επανεγκατέστησε το Session. Ίσως επιθυμείτε να επαληθεύσετε τον αριθμό ασφαλείας σας με αυτή την επαφή.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Υποβολή", "description": "" }, - "acceptNewKey": { - "message": "Αποδοχή", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Σημείωση ως επιβεβαιωμένο", "description": "" @@ -455,10 +385,6 @@ "message": "Νέος αριθμός ασφαλείας", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ο αριθμός ασφαλείας σας με αυτήν την επαφή έχει αλλάξει. Αυτό θα μπορούσε είτε να σημαίνει ότι κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας, είτε αυτή η επαφή απλώς επανεγκαταστήσει το Signal. Ίσως επιθυμείτε να επαληθεύσετε τον νέο αριθμό ασφαλείας παρακάτω.", - "description": "" - }, "incomingError": { "message": "Σφάλμα κατά την διαχείριση εισερχόμενου μηνύματος.", "description": "" @@ -495,18 +421,6 @@ "message": "Αυτό τον μήνα", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Μη υποστηριζόμενος τύπος συνημμένου. Κάντε κλικ για αποθήκευση.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Κάντε κλικ για αποθήκευση.", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Ανώνυμο αρχείο", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Φωνητικό Μήνυμα", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Ο τύπος του συνημμένου δεν επιτρέπεται για λόγους ασφαλείας", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Φόρτωση προεσκόπισης...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Πρόχειρη μικρή προεσκόπιση συνδέσμου για $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Μικρή προεσκόπιση συνδέσμου για $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Δεν είναι δυνατή η φόρτωση του επιλεγμένου συνημμένου.", "description": "" }, - "disconnected": { - "message": "Αποσυνδεδεμένος/η", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Συνδέεται", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Μετάβαση στις Σημειώσεις Έκδοσης", "description": "" }, - "goToForums": { - "message": "Μετάβαση στα Forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Μετάβαση στη Σελίδα Υποστήριξης", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Αναφορά Σφάλματος", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Προτιμήσεις Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Σχετικά με το Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Ομιλία", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Εμφάνιση", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Σμίκρυνση", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Έξοδος", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Αναζήτηση", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Καλώς ορίσατε στο Signal", - "description": "" - }, - "selectAContact": { - "message": "Επιλέξτε μια επαφή ή μια ομάδα για να ξεκινήσετε την συζήτηση.", + "message": "Καλώς ορίσατε στο Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Αποστολή Μηνύματος", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "σπίτι", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Εσείς", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Απάντηση σε $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": "Για να στείλετε μηνύματα ήχου, επιτρέψτε στο Signal Desktop να έχει πρόσβαση στο μικρόφωνό σας.", + "message": "Για να στείλετε μηνύματα ήχου, επιτρέψτε στο Session Desktop να έχει πρόσβαση στο μικρόφωνό σας.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Επιτρέψτε την Πρόσβαση", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Εμφάνιση Ρυθμίσεων", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Ήχος", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Άκυρο", "description": "" }, - "failedToSend": { - "message": "Αποτυχία αποστολής σε μερικούς παραλήπτες. Ελέγξτε τη σύνδεση δικτύου.", - "description": "" - }, "error": { "message": "Σφάλμα", "description": "" }, - "messageDetail": { - "message": "Λεπτομέρειες Μηνύματος", - "description": "" - }, "delete": { "message": "Διαγραφή", "description": "" @@ -857,10 +705,6 @@ "message": "Μέλη ομάδας", "description": "" }, - "showMembers": { - "message": "Εμφάνιση μελών", - "description": "" - }, "resetSession": { "message": "Επανεκκίνηση συνεδρίας", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Εμφάνιση αριθμού ασφαλείας", "description": "" }, - "viewAllMedia": { - "message": "Προβολή όλων των μέσων", - "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": "Αν επιθυμείτε να επιβεβαιώσετε την ασφάλεια της κρυπτογράφησης από άκρο σε άκρο με τον/την $name$, συγκρίνετε τους παραπάνω αριθμούς με τους αριθμούς στη συσκευή τους.", "description": "", @@ -887,14 +727,6 @@ "message": "Δεν έχετε ανταλλάξει ακόμα μηνύματα με αυτήν την επαφή. Ο αριθμός ασφαλείας σας μαζί τους θα είναι διαθέσιμος μετά το πρώτο μήνυμα.", "description": "" }, - "moreInfo": { - "message": "Περισσότερες Πληροφορίες...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Επανάληψη Αποστολής", - "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": "Διαγραφή Μηνύματος", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Αποθήκευση", "description": "" }, - "fileIconAlt": { - "message": "Εικονίδιο αρχείου", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Εικόνα emoji '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Καλώς ορίσατε στο Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Η ιδιωτικότητα είναι εφικτή. Το Signal την κάνει εύκολη.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Σύνδεση τού τηλεφώνου σας με το Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Ρυθμίσεις τού Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Συσχετισμένες Συσκευές ", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Πλήκτρο '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Σύνδεση νέας συσκεύης", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Όνομα συσκεύης", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Επιλέξτε το όνομα αυτής της συσκευής ", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Τέλος σύνδεσης του τηλεφώνου", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Συγχρονισμός ομάδων και επαφών", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Αποτυχία σύνδεσης με τον διακομιστή.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Δυστυχώς, έχετε ήδη πολλές συσκευές συνδεδεμένες. Προσπαθήστε να αφαιρέσετε μερικές.", - "description": "" - }, - "settings": { - "message": "Ρυθμίσεις", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Θέμα", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Άδειες", @@ -1029,34 +801,6 @@ "message": "Ενεργοποίηση ορθογραφικού ελέγχου του κειμένου που εισάγεται στο παράθυρο σύνθεσης μηνύματος", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Εκκαθάριση Δεδομένων", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Αυτό θα διαγράψει όλα τα δεδομένα της εφαρμογή, αφαιρώντας όλα τα μηνύματα και τις αποθηκευμένες πληροφορίες λογαριασμού", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Εκκαθάριση δεδομένων", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Διαγραφή όλων των δεδομένων;", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Πρόκειται να διαγράψετε όλες τις αποθηκευμένες πληροφορίες λογαριασμού αυτής της εφαρμογής, συμπεριλαμβανομένων όλων των επαφών και όλων των μηνυμάτων. Μπορείτε πάντα να ξανά συνδέσετε την εφαρμογή με το κινητό σας, αλλά αυτό δεν θα επαναφέρει τα διαγραμμένα μηνύματα.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Διαγραφή όλων των δεδομένων", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Αποσύνδεση και διαγραφή όλων των δεδομένων", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Ειδοποιήσεις", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Αποτυχία αποστολής", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Λεπτομέρειες", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Απόκρυψη λεπτομερειών", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Μάθετε περισσότερα σχετικά με την επιβεβαίωση των αριθμών ασφαλείας", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Αυτή η έκδοση του Signal Desktop έχει λήξει. Κάντε αναβάθμιση στην πιο πρόσφατη έκδοση για να συνεχίσετε την ανταλλαγή μηνυμάτων.", + "message": "Αυτή η έκδοση του Session Desktop έχει λήξει. Κάντε αναβάθμιση στην πιο πρόσφατη έκδοση για να συνεχίσετε την ανταλλαγή μηνυμάτων.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Μήνυμα μέσου", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Ο αριθμός δεν είναι καταχωρημένος", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Επαφές", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Εισαγωγή όλων των ομάδων και επαφών Signal από το κινητό σας.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Τελευταία εισαγωγή στις", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Εισαγωγή τώρα", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Εισαγωγή...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Η εισαγωγή απέτυχε. Βεβαιωθείτε ότι ο υπολογιστής και το τηλέφωνό σας είναι συνδεδεμένα στο διαδίκτυο.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "τώρα", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ώρα", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ώρα/ες ", - "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$ώρα/ες πριν", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$λεπτό/ά", - "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$ λεπτό/ά πριν", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "τώρα", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Αναπαραγωγή ήχου ειδοποίησης", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Ο Αριθμός Ασφαλείας άλλαξε", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Φωτεινό", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Εισαγάγετε έναν αριθμό τηλεφώνου για να προσθέσετε μια επαφή.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Μη έγκυρος αριθμός", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Επανασυνδέστε το Signal Desktop με το κινητό σας για να συνεχίσετε την ανταλλαγή μηνυμάτων.", - "description": "" - }, - "unlinked": { - "message": "Αποσυνδεδεμένο", - "description": "" - }, - "relink": { - "message": "Επανασύνδεση", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Διαθέσιμη ενημέρωση του Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/en/messages.json b/_locales/en/messages.json index ec11580a8..0367c8743 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1,27 +1,27 @@ { "privacyPolicy": { "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://getsession.org/privacy-policy/" + "description": "Shown in the about box for the link to https://getsession.org/privacy-policy/", + "androidKey": "RegistrationActivity_terms_and_privacy" }, "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" + "unknown": { + "message": "Unknown", + "description": "Shown as the name of a group if we don't have any information about it", + "androidKey": "NotificationChannel_missing_display_name" }, "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." + "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.", + "androidKey": "attachment_type_selector__file_description", + "addStart": "&" }, "mainMenuEdit": { "message": "&Edit", @@ -29,7 +29,10 @@ }, "mainMenuView": { "message": "&View", - "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." + "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.", + "androidKey": "message_recipients_list_item__view", + "addStart": "&", + "sentenceCase": true }, "mainMenuWindow": { "message": "&Window", @@ -37,7 +40,9 @@ }, "mainMenuHelp": { "message": "&Help", - "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." + "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.", + "androidKey": "text_secure_normal__help", + "addStart": "&" }, "appMenuHide": { "message": "Hide", @@ -57,7 +62,9 @@ }, "editMenuUndo": { "message": "Undo", - "description": "Edit menu command to remove recently-typed text" + "description": "Edit menu command to remove recently-typed text", + "androidKey": "ConversationListFragment_undo", + "sentenceCase": true }, "editMenuRedo": { "message": "Redo", @@ -69,7 +76,8 @@ }, "editMenuCopy": { "message": "Copy", - "description": "Edit menu command to add selected text to clipboard" + "description": "Edit menu command to add selected text to clipboard", + "androidKey": "copy" }, "editMenuPaste": { "message": "Paste", @@ -81,11 +89,14 @@ }, "editMenuDelete": { "message": "Delete", - "description": "Edit menu command to remove the selected text" + "description": "Edit menu command to remove the selected text", + "androidKey": "delete" }, "editMenuSelectAll": { - "message": "Select All", - "description": "Edit menu comand to select all of the text in selected text box" + "message": "Select all", + "description": "Edit menu comand to select all of the text in selected text box", + "androidKey": "conversation_list_batch__menu_select_all", + "sentenceCase": true }, "editMenuStartSpeaking": { "message": "Start speaking", @@ -135,10 +146,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -149,7 +156,8 @@ }, "loading": { "message": "Loading...", - "description": "Message shown on the loading screen before we've loaded any messages" + "description": "Message shown on the loading screen before we've loaded any messages", + "androidKey": "ConversationListFragment_loading" }, "optimizingApplication": { "message": "Optimizing application...", @@ -169,6 +177,10 @@ "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, + "done": { + "message": "Done", + "description": "Button when a specific action is to be done." + }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -219,19 +231,35 @@ }, "view": { "message": "View", - "description": "Used as a label on a button allowing user to see more information" + "description": "Used as a label on a button allowing user to see more information", + "androidKey": "message_recipients_list_item__view", + "sentenceCase": true }, "youLeftTheGroup": { - "message": "You left the group", - "description": "Displayed when a user can't send a message because they have left the group" + "message": "You have left the group.", + "description": "Displayed when a user can't send a message because they have left the group", + "androidKey": "MessageRecord_left_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" + "message": "You were removed from the group.", + "description": "Displayed when a user can't send a message because they have left the group", + "androidKey": "GroupUtil_you_were_removed_from_group" }, "unreadMessage": { - "message": "1 Unread Message", - "description": "Text for unread message separator, just one message" + "message": "$count$ Unread Message", + "description": "Text for unread message separator, just one message", + "placeholders": { + "count": { + "content": "$1", + "example": "5" + } + }, + "androidKey": "ConversationAdapter_n_unread_messages", + "androidKeyCount": "one", + "androidReplace": { + "%d": "$count$" + }, + "ignoreCase": true }, "unreadMessages": { "message": "$count$ Unread Messages", @@ -241,50 +269,72 @@ "content": "$1", "example": "5" } - } + }, + "androidKey": "ConversationAdapter_n_unread_messages", + "androidKeyCount": "other", + "androidReplace": { + "%d": "$count$" + }, + "ignoreCase": true }, "verificationKeysLoadFail": { "message": "Failed to load verification keys", "description": "Displayed on `Show Safety Number` option in conversation screen" }, "youMarkedAsVerified": { - "message": "You marked your Safety Number with $name$ as verified", + "message": "You marked your safety number with $name$ verified", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_verified", + "androidReplace": { + "%s": "$name$" } }, "youMarkedAsNotVerified": { - "message": "You marked your Safety Number with $name$ as not verified", + "message": "You marked your safety number with $name$ unverified", "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" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_unverified", + "androidReplace": { + "%s": "$name$" } }, "youMarkedAsVerifiedOtherDevice": { - "message": "You marked your Safety Number with $name$ as verified from another device", + "message": "You marked your safety number with $name$ verified from another device", "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" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_verified_from_another_device", + "androidReplace": { + "%s": "$name$" } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "You marked your Safety Number with $name$ as not verified from another device", + "message": "You marked your safety number with $name$ unverified from another device", "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" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_unverified_from_another_device", + "androidReplace": { + "%s": "$name$" } }, "membersNeedingVerification": { @@ -292,20 +342,26 @@ "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" + "message": "Safety Number Changed", + "androidKey": "ThreadRecord_safety_number_changed", + "ignoreCase": true }, "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", + "message": "Your safety number with $name$ has changed and is no longer verified. This could either mean that someone is trying to intercept your communication, or that $name$ simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "IdentityUtil_unverified_dialog_one", + "androidReplace": { + "%1$s": "$name$" } }, "changedRightAfterVerify": { @@ -323,17 +379,22 @@ "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 Session.", + "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication, or that $name$ simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "ConfirmIdentityDialog_your_safety_number_with_s_has_changed", + "androidReplace": { + "%1$s": "$name$", + "%2$s": "$name$" } }, "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 Session. You may wish to verify your saftey number with this contact.", + "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 Session.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -342,6 +403,17 @@ } } }, + "youMayWishToVerifyContact": { + "message": "You may wish to verify your safety number with this contact.", + "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" + } + }, + "androidKey": "WebRtcCallScreen_you_may_wish_to_verify_this_contact" + }, "sendAnyway": { "message": "Send Anyway", "description": "Used on a warning dialog to make it clear that it might be risky to send the message." @@ -371,11 +443,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Got it!", - "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." + "message": "Got it", + "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog.", + "androidKey": "ExperienceUpgradeActivity_got_it" }, "submit": { - "message": "Submit" + "message": "Submit", + "androidKey": "log_submit_activity__button_submit" }, "verify": { "message": "Mark As Verified" @@ -384,13 +458,17 @@ "message": "Mark As Not Verified" }, "isVerified": { - "message": "You have verified your safety number with $name$.", + "message": "You marked your safety number with $name$ verified", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_verified", + "androidReplace": { + "%s": "$name$" } }, "isNotVerified": { @@ -404,46 +482,60 @@ } }, "verified": { - "message": "Verified" + "message": "Verified", + "androidKey": "verify_display_fragment__verified" }, "newIdentity": { "message": "New safety number", - "description": "Header for a key change dialog" + "description": "Header for a key change dialog", + "androidKey": "MessageDetailsRecipient_new_safety_number" }, "incomingError": { "message": "Error handling incoming message" }, "media": { "message": "Media", - "description": "Header of the default pane in the media gallery, showing images and videos" + "description": "Header of the default pane in the media gallery, showing images and videos", + "androidKey": "MediaOverviewActivity_Media" }, "mediaEmptyState": { - "message": "You don’t have any media in this conversation", - "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" + "message": "No media", + "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)", + "androidKey": "media_overview_activity__no_media" }, "documents": { "message": "Documents", - "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" + "description": "Header of the secondary pane in the media gallery, showing every non-media attachment", + "androidKey": "MediaOverviewActivity_Documents" }, "documentsEmptyState": { - "message": "You don’t have any documents in this conversation", - "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" + "message": "No documents", + "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)", + "androidKey": "media_overview_documents_fragment__no_documents_found" }, "today": { "message": "Today", - "description": "Section header in the media gallery" + "description": "Section header in the media gallery", + "androidKey": "BucketedThreadMedia_Today" }, "yesterday": { "message": "Yesterday", - "description": "Section header in the media gallery" + "description": "Section header in the media gallery", + "androidKey": "BucketedThreadMedia_Yesterday" }, "thisWeek": { - "message": "This Week", - "description": "Section header in the media gallery" + "message": "This week", + "description": "Section header in the media gallery", + "androidKey": "BucketedThreadMedia_This_week", + "ignoreCase": true, + "sentenceCase": true }, "thisMonth": { "message": "This Month", - "description": "Section header in the media gallery" + "description": "Section header in the media gallery", + "androidKey": "BucketedThreadMedia_This_month", + "ignoreCase": true, + "sentenceCase": true }, "voiceMessage": { "message": "Voice Message", @@ -453,10 +545,6 @@ "message": "For security reasons, this file type cannot be sent", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Session Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Session Desktop is fetching metadata for a url in composition area", @@ -500,18 +588,17 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Sorry, the selected attachment is too large" + "message": "Attachment exceeds size limits for the type of message you're sending.", + "androidKey": "ConversationActivity_attachment_exceeds_size_limits" }, "unableToLoadAttachment": { - "message": "Unable to load attachment." - }, - "disconnected": { - "message": "Disconnected", - "description": "Displayed when the desktop client cannot connect to the server." + "message": "Sorry, there was an error setting your attachment.", + "androidKey": "ConversationActivity_sorry_there_was_an_error_setting_your_attachment" }, "connecting": { - "message": "Connecting", - "description": "Displayed when the desktop client is currently connecting to the server." + "message": "Connecting...", + "description": "Displayed when the desktop client is currently connecting to the server.", + "androidKey": "CallNotificationBuilder_connecting" }, "offline": { "message": "Offline", @@ -550,13 +637,10 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Session Preferences", - "description": "Title of the window that pops up with Session Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Session", - "description": "Item under the Help menu, which opens a small about window" + "about": { + "message": "About", + "description": "Item under the Help menu, which opens a small about window", + "androidKey": "recipient_preferences__about" }, "speech": { "message": "Speech", @@ -564,49 +648,54 @@ }, "show": { "message": "Show", - "description": "Command under Window menu, to show the window" + "description": "Command under Window menu, to show the window", + "androidKey": "preferences_notifications__show" }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "lokiMessenger": { - "message": "Session" + "sessionMessenger": { + "message": "Session", + "androidKey": "activity_landing_title" }, "search": { "message": "Search", - "description": "Placeholder text in the search input" + "description": "Placeholder text in the search input", + "androidKey": "SearchToolbar_search" }, "noSearchResults": { - "message": "No results for \"$searchTerm$\"", + "message": "No results found for \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { "content": "$1", "example": "dog" } + }, + "androidKey": "SearchFragment_no_results", + "androidReplace": { + "'%s'": "\"$searchTerm$\"" } }, "conversationsHeader": { "message": "Conversations", - "description": "Shown to separate the types of search results" + "description": "Shown to separate the types of search results", + "androidKey": "SearchFragment_header_conversations" }, "contactsHeader": { "message": "Contacts", - "description": "Shown to separate the types of search results" + "description": "Shown to separate the types of search results", + "androidKey": "SearchFragment_header_contacts" }, "messagesHeader": { - "message": "Conversations", - "description": "Shown to separate the types of search results" + "message": "Messages", + "description": "Shown to separate the types of search results", + "androidKey": "SearchFragment_header_messages" }, "settingsHeader": { - "message": "Settings" + "message": "Settings", + "androidKey": "activity_settings_title" }, "welcomeToSession": { - "message": "Welcome to Session" - }, - "selectAContact": { - "message": "Select a contact or group to start chatting." + "message": "Welcome to Session.", + "androidKey": "ExperienceUpgradeActivity_welcome_to_signal_dgaf" }, "typingAlt": { "message": "Typing animation for this conversation", @@ -622,21 +711,20 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a session" - }, "home": { - "message": "home", - "description": "Shown on contact detail screen as a label for an address/phone/email" + "message": "Home", + "description": "Shown on contact detail screen as a label for an address/phone/email", + "androidKey": "ContactShareEditActivity_type_home" }, "work": { - "message": "work", - "description": "Shown on contact detail screen as a label for an address/phone/email" + "message": "Work", + "description": "Shown on contact detail screen as a label for an address/phone/email", + "androidKey": "ContactShareEditActivity_type_work" }, "mobile": { - "message": "mobile", - "description": "Shown on contact detail screen as a label for aa phone or email" + "message": "Mobile", + "description": "Shown on contact detail screen as a label for a phone or email", + "androidKey": "ContactShareEditActivity_type_mobile" }, "email": { "message": "email", @@ -663,16 +751,19 @@ "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" }, "replyToMessage": { - "message": "Reply to Message", - "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" + "message": "Reply to message", + "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation", + "androidKey": "conversation_context__menu_reply_to_message" }, "originalMessageNotFound": { "message": "Original message not found", - "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" + "description": "Shown in quote if reference message was not found as message was initially downloaded and processed", + "androidKey": "ConversationFragment_quoted_message_not_found" }, "originalMessageNotAvailable": { "message": "Original message no longer available", - "description": "Shown in toast if user clicks on quote that references message no longer in database" + "description": "Shown in toast if user clicks on quote that references message no longer in database", + "androidKey": "ConversationFragment_quoted_message_no_longer_available" }, "messageFoundButNotLoaded": { "message": "Original message found, but not loaded. Scroll up to load it.", @@ -688,15 +779,17 @@ }, "you": { "message": "You", - "description": "In Android theme, shown in quote if you or someone else replies to you" + "description": "In Android theme, shown in quote if you or someone else replies to you", + "androidKey": "MediaPreviewActivity_you" }, "audioPermissionNeededTitle": { "message": "Microphone access required", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "audioPermissionNeeded": { - "message": "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" + "message": "Session needs microphone access to send audio messages.", + "description": "Shown if the user attempts to send an audio message without audio permssions turned on", + "androidKey": "ConversationActivity_to_send_audio_messages_allow_signal_access_to_your_microphone" }, "allowAccess": { "message": "Allow Access", @@ -704,15 +797,18 @@ }, "audio": { "message": "Audio", - "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" + "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment", + "androidKey": "QuoteView_audio" }, "video": { "message": "Video", - "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video" + "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video", + "androidKey": "QuoteView_video" }, "photo": { "message": "Photo", - "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" + "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image", + "androidKey": "QuoteView_photo" }, "cannotUpdate": { "message": "Cannot Update", @@ -723,43 +819,46 @@ "description": "Shown if a general error happened while trying to install update package" }, "ok": { - "message": "OK" - }, - "enter": { - "message": "Enter" - }, - "yes": { - "message": "Yes" + "message": "OK", + "androidKey": "activity_settings_seed_dialog_ok_button_title" }, "cancel": { - "message": "Cancel" + "message": "Cancel", + "androidKey": "view_qr_code_cancel_button_title" }, "close": { "message": "Close" }, "continue": { - "message": "Continue" + "message": "Continue", + "androidKey": "RegistrationActivity_continue" }, "devicePairingRequestReceivedLimitTitle": { - "message": "Device linking limit reached." + "message": "Device Limit Reached", + "androidKey": "activity_linked_devices_multi_device_limit_reached_dialog_title" }, "devicePairingRequestReceivedLimitDescription": { - "message": "To change your linked devices, please unlink a device first." + "message": "Sorry, you have too many devices linked already, try removing some", + "androidKey": "DeviceProvisioningActivity_sorry_you_have_too_many_devices_linked_already" }, "devicePairingRequestReceivedNoListenerTitle": { - "message": "Device linking request received." + "message": "Linking Request Received", + "androidKey": "dialog_link_device_master_mode_title_2" }, "devicePairingRequestReceivedNoListenerDescription": { "message": "Device linking request received but you are not on the device linking screen. \nGo to Settings > Device > Link New Device." }, "waitingForDeviceToRegister": { - "message": "Waiting for device to register..." + "message": "Waiting for Device", + "androidKey": "dialog_link_device_master_mode_title_1" }, "pairNewDevicePrompt": { - "message": "Scan the QR Code on your other device" + "message": "Scan the QR code displayed on the device to link", + "androidKey": "device_add_fragment__scan_the_qr_code_displayed_on_the_device_to_link" }, "noPairedDevices": { - "message": "No linked devices" + "message": "You don't have any linked devices yet", + "androidKey": "device_list_fragment__no_devices_linked" }, "deviceIsSecondaryNoPairing": { "message": "This device is a secondary device and so cannot be linked." @@ -768,7 +867,8 @@ "message": "A pairing request is already ongoing. Restart the app if it takes too long." }, "allowPairing": { - "message": "Allow Linking" + "message": "Authorize", + "androidKey": "view_device_linking_authorize_button_title" }, "allowPairingWithDevice": { "message": "Allow linking with this device?" @@ -783,7 +883,10 @@ "message": "Please confirm you want to unlink the following device:" }, "unpairDevice": { - "message": "Unlink Device" + "message": "Unlink Device", + "androidKey": "fragment_device_list_unlink_device_title", + "ignoreCase": true, + "sentenceCase": true }, "unpairDeviceWarning": { "message": "Are you sure you want to unlink this device?", @@ -794,31 +897,21 @@ "description": "Warning description for device unlinking in settings view" }, "deviceUnpaired": { - "message": "Device Unlinked" - }, - "clear": { - "message": "Clear" - }, - "copySeed": { - "message": "Copy Seed" - }, - "confirm": { - "message": "Confirm" + "message": "Your device was unlinked successfully", + "androidKey": "activity_linked_devices_unlinking_successful_message" }, "error": { "message": "Error" }, "delete": { - "message": "Delete" - }, - "unsend": { - "message": "Unsend" + "message": "Delete", + "androidKey": "delete" }, "deletePublicWarning": { - "message": "Are you sure? Clicking 'unsend' will permanently remove this message for everyone in this channel." + "message": "Are you sure? This will permanently remove this message for everyone in this open group." }, "deleteMultiplePublicWarning": { - "message": "Are you sure? Clicking 'unsend' will permanently remove these messages for everyone in this channel." + "message": "Are you sure? This will permanently remove these messages for everyone in this open group." }, "deleteWarning": { "message": "Are you sure? Clicking 'delete' will permanently remove this message from this device only." @@ -831,46 +924,55 @@ "description": "Toast message explaining that the user doens't have the rights to delete other people's messages." }, "deleteThisMessage": { - "message": "Delete this message" + "message": "Delete message", + "androidKey": "conversation_context__menu_delete_message", + "description": "action visible in MessageDetail screen" }, "from": { - "message": "From", - "description": "Label for the sender of a message" + "message": "From:", + "description": "Label for the sender of a message", + "androidKey": "message_details_header__from" }, "to": { - "message": "to", - "description": "Label for the receiver of a message" + "message": "To:", + "description": "Label for the receiver of a message", + "androidKey": "message_details_header__to" }, "sent": { "message": "Sent", - "description": "Label for the time a message was sent" + "description": "Label for the time a message was sent", + "androidKey": "message_details_header__sent" }, "received": { "message": "Received", - "description": "Label for the time a message was received" + "description": "Label for the time a message was received", + "androidKey": "message_details_header__received" }, "sendMessage": { - "message": " Type your message", + "message": "Message", "description": "Placeholder text in the message entry field" }, "sendMessageLeftGroup": { - "message": "You left this group" + "message": "You have left the group.", + "androidKey": "MessageRecord_left_group" }, "sendMessageBlockedUser": { - "message": "You have blocked the user" + "message": "You have blocked this contact" }, "groupMembers": { - "message": "Group members" - }, - "showMembers": { - "message": "Show members" + "message": "Group members", + "androidKey": "ConversationActivity_group_members" }, "resetSession": { - "message": "Reset Session", - "description": "This is a menu item for resetting the session, using the imperative case, as in a command." + "message": "Reset Secure Session", + "description": "This is a menu item for resetting the session, using the imperative case, as in a command.", + "androidKey": "conversation_secure_verified__menu_reset_secure_session", + "ignoreCase": true }, "showSafetyNumber": { - "message": "View Safety Number" + "message": "View Safety Number", + "androidKey": "recipient_preferences__view_safety_number", + "ignoreCase": true }, "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.", @@ -884,66 +986,61 @@ "theirIdentityUnknown": { "message": "You haven't exchanged any messages with this contact yet. Your safety number with them will be available after the first message." }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" + "moreInformation": { + "message": "More information", + "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen", + "androidKey": "RegistrationActivity_more_information" }, - "retrySend": { - "message": "Retry Send", - "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send" + "resend": { + "message": "Resend", + "description": "Shown on the drop-down menu for an individual message, but only if it is an outgoing message that failed to send", + "androidKey": "message_recipients_list_item__resend", + "sentenceCase": true }, "deleteMessage": { "message": "Delete Message", - "description": "Shown on the drop-down menu for an individual message, deletes single message" - }, - "unsendMessage": { - "message": "Unsend Message", - "description": "Shown on the drop-down menu for an individual message being removed from the server" - }, - "unsendMessages": { - "message": "Unsend Messages", - "description": "Tiitle for prompt and header button for messages being removed from the server" - }, - "messages": { - "message": "Messages", - "description": "Message search result" + "description": "Shown on the drop-down menu for an individual message, deletes single message", + "androidKey": "conversation_context__menu_delete_message", + "ignoreCase": true }, "deleteMessages": { "message": "Delete Messages", "description": "Menu item for deleting messages, title case." }, - + "deleteMessageForEveryone": { + "message": "Delete Message For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteMessagesForEveryone": { + "message": "Delete Messages For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteForEveryone": { + "message": "Delete For Everyone", + "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." + "message": "Permanently delete the messages locally from this open group?", + "description": "Confirmation dialog text that asks the user if they really wish to delete the open group messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." }, "deleteConversationConfirmation": { "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." }, - "leaveOpenGroupConfirmation": { - "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" + "clearAllData": { + "message": "Clear All Data", + "description": "Text for button in settings view to delete account", + "androidKey": "dialog_clear_all_data_title" }, "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", - "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." + "message": "This will permanently delete your messages, sessions, and contacts.", + "description": "Warning for account deletion in settings view", + "androidKey": "dialog_clear_all_data_explanation" }, "deleteContactConfirmation": { - "message": "Permanently delete this contact and destroy all sessions?", - "description": "Confirmation dialog text that tells the user what will happen if they delete the contact." + "message": "Are you sure you want to delete this conversation?", + "description": "Confirmation dialog text that tells the user what will happen if they delete the contact.", + "androidKey": "activity_home_delete_conversation_dialog_message" }, "sessionResetFailed": { "message": "Secure session reset failed", @@ -957,18 +1054,6 @@ "message": "Secure session reset succeeded", "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": "Used in alt tag of thumbnail images inside of an embedded message quote" @@ -991,11 +1076,23 @@ }, "addACaption": { "message": "Add a caption...", - "descripton": "Used as the placeholder text in the caption editor text field" + "description": "Used as the placeholder text in the caption editor text field", + "androidKey": "MediaSendActivity_add_a_caption" + }, + "copy": { + "message": "Copy", + "description": "Copy to clipboard button text", + "androidKey": "copy" + }, + "copySessionID": { + "message": "Copy Session ID", + "description": "Copy to clipboard session ID", + "androidKey": "activity_conversation_menu_copy_session_id" }, "save": { "message": "Save", - "descripton": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments" + "description": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments", + "androidKey": "media_preview__save_title" }, "emojiAlt": { "message": "Emoji image of '$title$'", @@ -1007,44 +1104,11 @@ } } }, - "linkYourPhone": { - "message": "Link your phone to Session", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Session Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Failed to connect to server.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sorry, you have too many devices linked already. Try removing some." + "description": "The menu option shown in Session iOS to add a new linked device", + "androidKey": "device_list_fragment__link_new_device", + "ignoreCase": true }, "permissions": { "message": "Permissions", @@ -1056,19 +1120,18 @@ }, "linkPreviewsTitle": { "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" + "description": "Option to control creation and send of link previews in setting screen", + "androidKey": "preferences__send_link_previews", + "ignoreCase": true }, "linkPreviewDescription": { - "message": "Link previews supported for Imgur, Instagram, Pinterest, Reddit, and YouTube.", - "description": "Description shown for the Link Preview option " - }, - "linkPreviewsConfirmTitle": { - "message": "Warning" + "message": "Previews are supported for Imgur, Instagram, Pinterest, Reddit, and YouTube links", + "description": "Description shown for the Link Preview option ", + "androidKey": "preferences__previews_are_supported_for" }, "linkPreviewsConfirmMessage": { "message": "You will not have full metadata protection when sending or receiving link previews." }, - "mediaPermissionsTitle": { "message": "Microphone and Camera" }, @@ -1086,23 +1149,12 @@ }, "spellCheckDirty": { "message": "You must restart Session to apply your new settings", - "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Signal." - }, - "clearDataHeader": { - "message": "Clear All Local Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" + "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Session." }, "notifications": { "message": "Notifications", - "description": "Header for notification settings" + "description": "Header for notification settings", + "androidKey": "preferences__notifications" }, "readReceiptSettingDescription": { "message": "See and share when messages have been read (enables read receipts in all sessions).", @@ -1110,7 +1162,9 @@ }, "readReceiptSettingTitle": { "message": "Read Receipts", - "description": "Title of the read receipts setting" + "description": "Title of the read receipts setting", + "androidKey": "preferences__read_receipts", + "ignoreCase": true }, "typingIndicatorsSettingDescription": { "message": "See and share when messages are being typed (applies to all sessions).", @@ -1118,15 +1172,9 @@ }, "typingIndicatorsSettingTitle": { "message": "Typing Indicators", - "description": "Title of the typing indicators setting" - }, - "messageTTL": { - "message": "Message TTL", - "description": "Title of the Message TTL setting" - }, - "messageTTLSettingDescription": { - "message": "Time to live (how long the recipient will have to collect their messages)", - "description": "Description of the time to live setting" + "description": "Title of the typing indicators setting", + "androidKey": "preferences__typing_indicators", + "ignoreCase": true }, "zoomFactorSettingTitle": { "message": "Zoom Factor", @@ -1137,8 +1185,9 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Disable notifications", - "description": "Label for disabling notifications" + "message": "Mute notifications", + "description": "Label for disabling notifications", + "androidKey": "conversation_unmuted__mute_notifications" }, "nameAndMessage": { "message": "Name and content", @@ -1154,27 +1203,34 @@ }, "newMessage": { "message": "New Message", - "description": "Displayed in notifications for only 1 message" + "description": "Displayed in notifications for only 1 message", + "androidKey": "activity_conversation_default_hint" }, "newMessages": { "message": "New Messages", "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Most recent from:", - "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" + "message": "Most recent from: $name$", + "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting", + "androidKey": "MessageNotifier_most_recent_from_s", + "androidReplace": { + "%1$s": "$name$" + } }, "notificationFrom": { "message": "From:", - "description": "Displayed in notifications when setting is 'name only' and one message is waiting" + "description": "Displayed in notifications when setting is 'name only' and one message is waiting", + "androidKey": "message_details_header__from" }, "notificationMostRecent": { "message": "Most recent:", "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Send failed", - "description": "Shown on outgoing message if it fails to send" + "message": "Send Failed", + "description": "Shown on outgoing message if it fails to send", + "androidKey": "conversation_item_sent__send_failed_indicator_description" }, "learnMore": { "message": "Learn more about verifying safety numbers", @@ -1194,15 +1250,13 @@ }, "mediaMessage": { "message": "Media message", - "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." - }, - "sync": { - "message": "Contacts", - "description": "Label for contact and group sync settings" + "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview.", + "androidKey": "ThreadRecord_media_message" }, "timestamp_s": { - "message": "now", - "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." + "message": "Now", + "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble.", + "androidKey": "DateUtils_just_now" }, "timestamp_m": { "message": "1 minute", @@ -1236,6 +1290,10 @@ "content": "$1", "example": "10m" } + }, + "androidKey": "MessageRecord_you_set_disappearing_message_time_to_s", + "androidReplace": { + "%1$s": "$time$" } }, "timerSetOnSync": { @@ -1260,11 +1318,17 @@ "content": "$2", "example": "10m" } + }, + "androidKey": "MessageRecord_s_set_disappearing_message_time_to_s", + "androidReplace": { + "%1$s": "$name$", + "%2$s": "$time$" } }, "timerOption_0_seconds": { "message": "Off", - "description": "Label for option to turn off message expiration in the timer menu" + "description": "Label for option to turn off message expiration in the timer menu", + "androidKey": "expiration_off" }, "timerOption_5_seconds": { "message": "5 seconds", @@ -1312,7 +1376,8 @@ }, "disappearingMessages": { "message": "Disappearing messages", - "description": "Conversation menu option to enable disappearing messages" + "description": "Conversation menu option to enable disappearing messages", + "androidKey": "conversation_expiring_off__disappearing_messages" }, "changeNickname": { "message": "Change Nickname", @@ -1324,7 +1389,8 @@ }, "timerOption_0_seconds_abbreviated": { "message": "off", - "description": "Short format indicating current timer setting in the conversation list snippet" + "description": "Short format indicating current timer setting in the conversation list snippet", + "androidKey": "ApplicationPreferencesActivity_off" }, "timerOption_5_seconds_abbreviated": { "message": "5s", @@ -1372,30 +1438,40 @@ }, "disappearingMessagesDisabled": { "message": "Disappearing messages disabled", - "description": "Displayed in the left pane when the timer is turned off" + "description": "Displayed in the left pane when the timer is turned off", + "androidKey": "ThreadRecord_disappearing_messages_disabled" }, "disabledDisappearingMessages": { - "message": "$name$ disabled disappearing messages", + "message": "$name$ disabled disappearing messages.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { "content": "$1", "example": "John" } + }, + "androidKey": "MessageRecord_s_disabled_disappearing_messages", + "androidReplace": { + "%1$s": "$name$" } }, "youDisabledDisappearingMessages": { - "message": "You disabled disappearing messages", - "description": "Displayed in the conversation list when the timer is turned off" + "message": "You disabled disappearing messages.", + "description": "Displayed in the conversation list when the timer is turned off", + "androidKey": "MessageRecord_you_disabled_disappearing_messages" }, "timerSetTo": { - "message": "Timer set to $time$", + "message": "Disappearing message time set to $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" } + }, + "androidKey": "ThreadRecord_disappearing_message_time_updated_to_s", + "androidReplace": { + "%s": "$time$" } }, "safetyNumber": { @@ -1403,22 +1479,29 @@ "description": "Title to the safety number view" }, "safetyNumberChanged": { - "message": "Safety Number has changed", - "description": "A notification shown in the conversation when a contact reinstalls" + "message": "Safety number changed", + "description": "A notification shown in the conversation when a contact reinstalls", + "androidKey": "ThreadRecord_safety_number_changed" }, "safetyNumberChangedGroup": { - "message": "Safety Number with $name$ has changed", + "message": "Your safety number with $name$ has changed.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { "content": "$1", "example": "John" } + }, + "androidKey": "ThreadRecord_your_safety_number_with_s_has_changed", + "androidReplace": { + "%s": "$name$" } }, "verifyNewNumber": { "message": "Verify Safety Number", - "description": "Label on button included with safety number change notification in the conversation" + "description": "Label on button included with safety number change notification in the conversation", + "androidKey": "AndroidManifest__verify_safety_number", + "ignoreCase": true }, "yourSafetyNumberWith": { "message": "Your safety number with $name$:", @@ -1431,14 +1514,16 @@ } }, "themeToggleTitle": { - "message": "Light Mode" + "message": "Light", + "androidKey": "preferences__light_theme" }, "themeToggleDescription": { "message": "Choose the theme best suited to you" }, "noteToSelf": { "message": "Note to Self", - "description": "Name for the conversation with your own phone number" + "description": "Name for the conversation with your own phone number", + "androidKey": "note_to_self" }, "hideMenuBarTitle": { "message": "Hide Menu Bar", @@ -1454,19 +1539,12 @@ }, "invalidNumberError": { "message": "Invalid public key", - "description": "When a person inputs a public key that is invalid" - }, - "unlinkedWarning": { - "message": "Relink Session Desktop to your mobile device to continue messaging." - }, - "unlinked": { - "message": "Unlinked" + "description": "When a person inputs a public key that is invalid", + "androidKey": "fragment_new_conversation_invalid_public_key_message" }, "successUnlinked": { - "message": "Your device was unlinked successfully" - }, - "relink": { - "message": "Relink" + "message": "Your device was unlinked successfully", + "androidKey": "activity_landing_device_unlinked_dialog_title" }, "autoUpdateSettingTitle": { "message": "Auto Update" @@ -1487,10 +1565,12 @@ "message": "Restart Session" }, "autoUpdateLaterButtonLabel": { - "message": "Later" + "message": "Later", + "androidKey": "RatingManager_later" }, "autoUpdateDownloadButtonLabel": { - "message": "Download" + "message": "Download", + "androidKey": "audio_view__download_accessibility_description" }, "autoUpdateDownloadedMessage": { "message": "The new update has been downloaded." @@ -1499,13 +1579,17 @@ "message": "Would you like to download the update?" }, "leftTheGroup": { - "message": "$name$ left the group", + "message": "$name$ has left the group.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "ConversationItem_group_action_left", + "androidReplace": { + "%1$s": "$name$" } }, "multipleLeftTheGroup": { @@ -1520,68 +1604,99 @@ }, "updatedTheGroup": { "message": "Group updated", - "description": "Shown in the conversation history when someone updates the group" + "description": "Shown in the conversation history when someone updates the group", + "androidKey": "ThreadRecord_group_updated" }, "titleIsNow": { "comment": "Do not add a period here, used as a fragment and will break unit test", - "message": "Group name has been set to '$name$'", + "message": "Group name is now '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { "content": "$1", "example": "Book Club" } + }, + "androidKey": "GroupUtil_group_name_is_now", + "androidReplace": { + "%1$s": "$name$" } }, "joinedTheGroup": { - "message": "$name$ joined the group", + "message": "$name$ joined the group.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { "content": "$1", "example": "Alice" } + }, + "androidKey": "GroupUtil_joined_the_group", + "androidKeyCount": "one", + "androidReplace": { + "%1$s": "$name$" } }, "multipleJoinedTheGroup": { - "message": "$names$ joined the group", + "message": "$name$ joined the group.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { - "names": { + "name": { "content": "$1", "example": "Alice, Bob" } + }, + "androidKey": "GroupUtil_joined_the_group", + "androidKeyCount": "other", + "androidReplace": { + "%1$s": "$name$" } }, "kickedFromTheGroup": { - "message": "$name$ was removed from the group", + "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" } + }, + "androidKey": "GroupUtil_removed_from_the_group", + "androidKeyCount": "one", + "androidReplace": { + "%1$s": "$name$" } }, "multipleKickedFromTheGroup": { - "message": "$names$ were removed from the group", + "message": "$name$ 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" } + }, + "androidKey": "GroupUtil_removed_from_the_group", + "androidKeyCount": "other", + "androidReplace": { + "%1$s": "$name$" } }, "blockUser": { - "message": "Block User" + "message": "Block", + "androidKey": "RecipientPreferenceActivity_block" }, "unblockUser": { - "message": "Unblock User" + "message": "Unblock", + "androidKey": "RecipientPreferenceActivity_unblock" }, - "copyPublicKey": { - "message": "Copy Public Key", - "description": "Button action that the user can click to copy their public keys" + "unblocked": { + "message": "Unblocked" + }, + "blockedSettingsTitle": { + "message": "Blocked contacts", + "description": "Shown in the settings page as the heading for the blocked user settings", + "androidKey": "preferences_app_protection__blocked_contacts" }, "banUser": { "message": "Ban User", @@ -1599,31 +1714,20 @@ "message": "Ban failed!", "description": "Toast on unsuccesful user ban." }, - "copyChatId": { - "message": "Copy Chat ID" + "leaveGroup": { + "message": "Leave Group", + "description": "Button action that the user can click to leave the group", + "androidKey": "conversation__menu_leave_group", + "ignoreCase": true }, - "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" - }, - "leaveClosedGroupConfirmation": { - "message": "Leave this Closed Group?", - "description": "Confirmation dialog text that tells the user what will happen if they leave the closed group." + "leaveGroupConfirmation": { + "message": "Are you sure you want to leave this group?", + "description": "Confirmation dialog text that tells the user what will happen if they leave the group.", + "androidKey": "activity_home_leave_group_dialog_message" }, "noContactsForGroup": { - "message": "You don't have any contacts to start a group with." - }, - "copiedPublicKey": { - "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" + "message": "You don't have any contacts yet", + "androidKey": "activity_create_closed_group_empty_state_message" }, "copyMessage": { "message": "Copy message text", @@ -1633,35 +1737,31 @@ "message": "Select message", "description": "Button action that the user can click to select the message" }, - "copiedMessage": { - "message": "Message text copied", - "description": "A toast message telling the user that the message text was copied" - }, - "editGroupNameOrPicture": { - "message": "Edit group name or picture", - "description": "Button action that the user can click to edit a group name (open)" + "editGroup": { + "message": "Edit group", + "description": "Button action that the user can click to edit a group name (open)", + "androidKey": "conversation__menu_edit_group" }, "editGroupName": { "message": "Edit group name", "description": "Button action that the user can click to edit a group name (closed)" }, "updateGroupDialogTitle": { - "message": "Updating a Closed Group", - "description": "Title for the dialog box used to update an existing private group" + "message": "Updating $name$...", + "description": "Title for the dialog box used to update an existing private group", + "androidKey": "GroupCreateActivity_updating_group", + "androidReplace": { + "%1$s": "$name$" + } }, - "updatePublicGroupDialogTitle": { - "message": "Updating a open group Channel", - "description": "Title for the dialog box used to update an existing open group channel" - }, - "showSeed": { - "message": "Show Seed", - "description": "Button action that the user can click to view their unique seed" + "showRecoveryPhrase": { + "message": "Recovery Phrase", + "description": "Button action that the user can click to view their unique recovery phrase", + "androidKey": "activity_settings_recovery_phrase_button_title" }, "yourSessionID": { - "message": "Your Session ID" - }, - "setStatus": { - "message": "Set a status..." + "message": "Your Session ID", + "androidKey": "your_session_id" }, "setAccountPasswordTitle": { "message": "Set Account Password", @@ -1697,44 +1797,31 @@ "message": "The clipboard content exceeds the maximum password length of $max_pwd_len$ characters.", "description": "Shown when user pastes a password which is longer than MAX_PASSWORD_LEN" }, - "showSeedPasswordRequest": { + "showRecoveryPhrasePasswordRequest": { "message": "Please enter your password", - "description": "Request for user to enter password to show seed." + "description": "Request for user to enter password to show recovery phrase." }, - "seedSavePromptMain": { - "message": "Please save the seed below in a safe location.", - "description": "Prompt on seed modal requesting user to save their seed. Line one" + "recoveryPhraseSavePromptMain": { + "message": "Your recovery phrase is the master key to your Session ID — you can use it to restore your Session ID if you lose access to your device. Store your recovery phrase in a safe place, and don't give it to anyone.", + "description": "Prompt on recovery phrase modal requesting user to save their recovery phrase. Line one", + "androidKey": "activity_seed_explanation" }, - "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" + "invalidOpenGroupUrl": { + "message": "Invalid URL", + "description": "Error message when no server url entered", + "androidKey": "fragment_add_public_chat_invalid_url_message" }, - "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" - }, - "noServerURL": { - "message": "Please enter a server URL", - "description": "Error message when no server url entered" - }, - "copiedMnemonic": { - "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" + "copiedToClipboard": { + "message": "Copied to clipboard", + "androidKey": "copied_to_clipboard" }, "passwordViewTitle": { "message": "Type In Your Password", "description": "The title shown when user needs to type in a password to unlock the messenger" }, "unlock": { - "message": "Unlock" + "message": "Unlock", + "androidKey": "prompt_passphrase_activity__unlock" }, "password": { "message": "Password", @@ -1801,10 +1888,12 @@ "message": "You are already connected to this open group" }, "connectToServerFail": { - "message": "Failed to connect to server. Check URL" + "message": "Couldn't join group", + "androidKey": "activity_join_public_chat_error" }, "connectingToServer": { - "message": "Connecting to server..." + "message": "Connecting...", + "androidKey": "CallNotificationBuilder_connecting" }, "connectToServerSuccess": { "message": "Successfully connected to open group" @@ -1824,18 +1913,14 @@ "message": "Password must only contain letters, numbers and symbols", "description": "Error string shown to the user when password contains an invalid character" }, - "change": { - "message": "Change" - }, - "set": { - "message": "Set" - }, "remove": { - "message": "Remove" + "message": "Remove", + "androidKey": "ClearProfileActivity_remove" }, - "invalidHexId": { + "invalidSessionId": { "message": "Invalid Session ID", - "description": "Error string shown when user types an invalid pubkey hex string" + "description": "Error string shown when user types an invalid pubkey hex string", + "androidKey": "invalid_session_id" }, "invalidPubkeyFormat": { "message": "Invalid Pubkey Format", @@ -1853,22 +1938,22 @@ "message": "Not enough nodes currently active for LNS lookup" }, "emptyGroupNameError": { - "message": "Group Name cannot be empty", - "description": "Error message displayed on empty group name" + "message": "Please enter a group name", + "description": "Error message displayed on empty group name", + "androidKey": "activity_create_closed_group_group_name_missing_error" }, - "nonAdminDeleteMember": { - "message": "Only group admin can remove members!" - }, - "editProfileModalTitle": { "message": "Profile", "description": "Title for the Edit Profile modal" }, "groupNamePlaceholder": { - "message": "Group Name" + "message": "Group Name", + "androidKey": "GroupCreateActivity_group_name_hint", + "ignoreCase": true }, "inviteContacts": { - "message": "Invite Contacts" + "message": "Invite Contacts", + "androidKey": "text_secure_normal__invite_friends" }, "addModerators": { "message": "Add Moderators" @@ -1877,7 +1962,8 @@ "message": "Remove Moderators" }, "add": { - "message": "Add" + "message": "Add", + "androidKey": "fragment_add_public_chat_add_button_title_1" }, "groupInvitation": { "message": "Group Invitation" @@ -1894,18 +1980,6 @@ "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" }, @@ -1913,42 +1987,43 @@ "message": "Sign In" }, "yourUniqueSessionID": { - "message": "Say hello to your Session ID" + "message": "Say hello to your Session ID", + "androidKey": "activity_register_title" }, "allUsersAreRandomly...": { - "message": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design." + "message": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", + "androidKey": "activity_register_explanation" }, "getStarted": { "message": "Get started" }, "generateSessionID": { - "message": "Create Session ID" + "message": "Create Session ID", + "androidKey": "activity_landing_register_button_title" }, - "mnemonicSeed": { - "message": "Mnemonic Seed" + "recoveryPhrase": { + "message": "Recovery Phrase", + "androidKey": "activity_settings_recovery_phrase_button_title" }, - "enterSeed": { - "message": "Enter Recovery Phrase" + "enterRecoveryPhrase": { + "message": "Enter your recovery phrase", + "androidKey": "activity_restore_seed_edit_text_hint" }, "displayName": { - "message": "Display Name" + "message": "Display Name", + "androidKey": "activity_display_name_name_edit_text_label" }, "anonymous": { "message": "Anonymous", "description": "The name of currently unidentified users" }, "enterDisplayName": { - "message": "Enter a display name" - }, - "optionalPassword": { - "message": "Verify Password" + "message": "Enter a display name", + "androidKey": "activity_display_name_edit_text_hint" }, "enterOptionalPassword": { "message": "Enter password (optional)" }, - "verifyPassword": { - "message": "Verify Password" - }, "devicePairingHeaderReassure": { "message": "Linking may take up to one minute to register on your primary device. Please be patient." }, @@ -1965,16 +2040,20 @@ "message": "Enter your Session ID below to link this device to your Session ID." }, "enterSessionIDHere": { - "message": "Enter your Session ID" + "message": "Enter your Session ID", + "androidKey": "fragment_enter_session_id_edit_text_hint" }, "continueYourSession": { - "message": "Continue Your Session" + "message": "Continue Your Session", + "androidKey": "activity_landing_restore_button_title" }, "linkDevice": { - "message": "Link Device" + "message": "Link Device", + "androidKey": "activity_link_device_title" }, - "restoreUsingSeed": { - "message": "Restore From Recovery Phrase" + "restoreUsingRecoveryPhrase": { + "message": "Restore your account", + "androidKey": "activity_restore_title" }, "linkDeviceToExistingAccount": { "message": "Link Device to Existing Session ID" @@ -1992,49 +2071,57 @@ "message": "Welcome to your Session" }, "newSession": { - "message": "New Session" + "message": "New Session", + "androidKey": "activity_create_private_chat_title" }, - "searchForAKeyPhrase": { - "message": "Search for a key phrase or contact" + "searchFor...": { + "message": "Search for conversations, contacts, and messages", + "androidKey": "SearchToolbar_search_for_conversations_contacts_and_messages" }, "enterSessionID": { - "message": "Enter Session ID" + "message": "Enter Session ID", + "androidKey": "activity_link_device_enter_session_id_tab_title" + }, + "enterSessionIDOfRecipient": { + "message": "Enter Session ID of recipient", + "androidKey": "fragment_enter_public_key_edit_text_hint" }, "usersCanShareTheir...": { - "message": "Users can share their Session ID from their account settings, or by sharing their QR code." + "message": "Users can share their Session ID by going into their account settings and tapping \"Share Session ID\", or by sharing their QR code.", + "androidKey": "fragment_enter_public_key_explanation" }, "message": { "message": "Message" }, - "edit": { - "message": "Edit" - }, "addContact": { "message": "Add Contact" }, - "createGroup": { - "message": "Create Group" - }, "appearanceSettingsTitle": { - "message": "Appearance" + "message": "Appearance", + "androidKey": "preferences__appearance" }, "permissionSettingsTitle": { "message": "Permissions" }, "privacySettingsTitle": { - "message": "Privacy" + "message": "Privacy", + "androidKey": "recipient_preferences__privacy" }, "notificationsSettingsTitle": { - "message": "Notifications" + "message": "Notifications", + "androidKey": "preferences__notifications" }, "devicesSettingsTitle": { - "message": "Devices" + "message": "Linked devices", + "androidKey": "preferences__linked_devices" }, - "mnemonicEmpty": { - "message": "Seed is mandatory" + "recoveryPhraseEmpty": { + "message": "Enter your recovery phrase", + "androidKey": "activity_restore_seed_edit_text_hint" }, "displayNameEmpty": { - "message": "Display Name Is Mandatory" + "message": "Please pick a display name", + "androidKey": "activity_display_name_display_name_missing_error" }, "members": { "message": "$count$ members", @@ -2046,83 +2133,68 @@ } }, "joinOpenGroup": { - "message": "Join Open Group" + "message": "Join Open Group", + "androidKey": "activity_join_public_chat_title" }, "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." + "message": "New Closed Group", + "androidKey": "activity_create_closed_group_title" }, "createClosedGroupNamePrompt": { - "message": "Group Name" + "message": "Group Name", + "androidKey": "GroupCreateActivity_group_name_hint", + "ignoreCase": true }, "createClosedGroupPlaceholder": { - "message": "Enter a group name" + "message": "Enter a group name", + "androidKey": "activity_create_closed_group_edit_text_hint" }, - "closedGroupCreatedToastTitle": { - "message": "Group created successfully" + "openGroupURL": { + "message": "Open Group URL", + "androidKey": "activity_join_public_chat_enter_group_url_tab_title" }, - "enterOpenGroupURL": { - "message": "Enter Open Group URL" - }, - "channelUrlPlaceholder": { - "message": "chat.getsession.org" - }, - "addChannelDescription": { - "message": "Enter an open group URL." - }, - "joinChannel": { - "message": "Join Open Group" + "enterAnOpenGroupURL": { + "message": "Enter an open group URL", + "androidKey": "fragment_enter_chat_url_edit_text_hint" }, "next": { - "message": "Next" + "message": "Next", + "androidKey": "RegistrationActivity_next" }, "description": { "message": "Description" }, "secretWords": { - "message": "Secret words" + "message": "Please check that the words below match the ones shown on your other device", + "androidKey": "view_device_linking_explanation_2" }, "pairingDevice": { - "message": "Linking Device" + "message": "Linking Device", + "androidKey": "DeviceProvisioningActivity_content_progress_title", + "ignoreCase": true }, "devicePairedSuccessfully": { - "message": "Device linked successfully" + "message": "Your device has been linked successfully", + "androidKey": "view_device_linking_explanation_3" }, - "invalidGroupName": { - "message": "Group Name length must be between 1 to $maxSize$", - "description": "Error message displayed on invalid group name", - "placeholders": { - "maxSize": { - "content": "$1", - "example": "125" - } - } + "invalidGroupNameTooShort": { + "message": "Please enter a group name", + "androidKey": "activity_create_closed_group_group_name_missing_error" }, - "invalidGroupSize": { - "message": "Closed Group size must be between 1 to $maxSize$", - "description": "Error message displayed on invalid closed group size", - "placeholders": { - "maxSize": { - "content": "$1", - "example": "10" - } - } + "invalidGroupNameTooLong": { + "message": "Please enter a shorter group name", + "androidKey": "activity_create_closed_group_group_name_too_long_error" }, - "maxGroupMembersError": { - "message": "Max number of members for small group chats is $maxSize$", - "placeholders": { - "maxSize": { - "content": "$1", - "example": "10" - } - } + "pickClosedGroupMember": { + "message": "Please pick at least 1 group member", + "androidKey": "activity_create_closed_group_not_enough_group_members_error" }, - "useSenderKeys": { - "message": "Use Sender Keys" + "closedGroupMaxSize": { + "message": "A closed group cannot have more than 20 members", + "androidKey": "activity_create_closed_group_too_many_group_members_error" + }, + "noBlockedContacts": { + "message": "No blocked contacts", + "androidKey": "blocked_contacts_fragment__no_blocked_contacts" } } diff --git a/_locales/eo/messages.json b/_locales/eo/messages.json index d49537ea2..01f5ea24a 100644 --- a/_locales/eo/messages.json +++ b/_locales/eo/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Helpo", "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": "Agordoj…", - "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": "Kaŝi", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Fini Signal-on", + "message": "Fini Session-on", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Agordi kun importo", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "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": "Agordi kiel memstaran aparaton", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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 dosierujon", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Elekti dosieron", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Ŝargu viajn datumojn", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "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.", + "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 Session-datumojn.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "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.", + "message": "Certigu, ke vi elektis la ĝustan dosierujon, kiu enhavas viajn konservitajn Session-datumojn. Ties nomo komencu per „Session 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": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Ekuzi Signal Desktop", + "message": "Ekuzi Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Ligi tiun ĉi aparaton al via poŝtelefono", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "via elektita eksportloko", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "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": "Ŝ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": { - "content": "$1", - "example": "5" - } - } - }, "me": { "message": "Mi", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Vi forlasis la grupon", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "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": "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": { - "message": "Novaj mesaĝoj suben", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 nelegata mesaĝo", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "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.", + "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 Session-on.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "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.", + "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 Session-on.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "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.", + "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 Session-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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "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.", + "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 Session-on.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "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.", + "message": "Via sekuriga numero kun $name$ ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke $name$ simple reinstalis Session-on.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "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.", + "message": "Via sekuriga numero kun $name$ ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke $name$ simple reinstalis Session-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": { @@ -415,10 +349,6 @@ "message": "Sendi", "description": "" }, - "acceptNewKey": { - "message": "Akcepti", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marki konfirmita", "description": "" @@ -455,10 +385,6 @@ "message": "Nova sekuriga numero", "description": "Header for a key change dialog" }, - "identityChanged": { - "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 eraro dum ricevo de mesaĝo", "description": "" @@ -495,18 +421,6 @@ "message": "Ĉimonate", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nesubtenata tipo de kunsendaĵo. Alklaku por konservi ĝin.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Alklaku por konservi", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Sennoma dosiero", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Voĉa mesaĝo", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Kunsendaĵa tipo ne permesata por sekurecaj kialoj", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Ŝargante antaŭrigardon...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Preparante miniaturan antaŭrigardon de ligilo pri $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatura antaŭrigardo de ligilo pri $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Ne eblas ŝargi la elektitan kunsendaĵon.", "description": "" }, - "disconnected": { - "message": "Nekonektite", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Konektante", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Iri al eldonaj notoj", "description": "" }, - "goToForums": { - "message": "Iri al forumoj", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Iri al helppaĝo", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Raporti problemon", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Agordoj de Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Pri Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Parolo", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Malkaŝi", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Kaŝi", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Fini", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Serĉi", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bonvenon al Signal", - "description": "" - }, - "selectAContact": { - "message": "Elektu kontakton aŭ grupon por ekparoli.", + "message": "Bonvenon al Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Sendi mesaĝon", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hejma", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Vi", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Respondo al $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": "Por sendi aŭdajn mesaĝojn, donu al Signal Desktop permeson uzi vian mikrofonon.", + "message": "Por sendi aŭdajn mesaĝojn, donu al Session Desktop permeson uzi vian mikrofonon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Permesi", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Montri agordojn", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Sono", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Nuligi", "description": "" }, - "failedToSend": { - "message": "Malsukcesis sendi al iuj ricevontoj. Kontrolu la retkonekton.", - "description": "" - }, "error": { "message": "Eraro", "description": "" }, - "messageDetail": { - "message": "Detaloj de la mesaĝo", - "description": "" - }, "delete": { "message": "Forigi", "description": "" @@ -857,10 +705,6 @@ "message": "Grupanoj", "description": "" }, - "showMembers": { - "message": "Montri grupanojn", - "description": "" - }, "resetSession": { "message": "Forviŝi seancon", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Montri sekurigan numeron", "description": "" }, - "viewAllMedia": { - "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": "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": "", @@ -887,14 +727,6 @@ "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 informoj…", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "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": { "message": "Forigi mesaĝon", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Konservi", "description": "" }, - "fileIconAlt": { - "message": "Dosierpiktogramo", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoĝibildo de „$title$“", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Bonvenon al Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privateco eblas. Signal tion faciligas.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Ligi vian poŝtelefonon al Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Agordoj de Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Ligitaj aparatoj", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Butono „+“", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Ligi novan aparaton", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nomo de la aparato", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Elektu la nomon de tiu ĉi aparato", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Fini ligi poŝtelefonon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sinkronigo de kontaktoj kaj grupoj", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Malsukcesis konekti al servilo.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Bedaŭrinde, vi havas tro da ligitaj aparatoj. Provu malligi kelkajn.", - "description": "" - }, - "settings": { - "message": "Agordoj", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Etoso", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permesoj", @@ -1029,34 +801,6 @@ "message": "Ŝalti literumilon de teksto entajpita en mesaĝa verkejo", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Forviŝi datumojn", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "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": { - "message": "Forviŝi datumojn", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Ĉu forigi ĉiujn datumojn?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "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": { - "message": "Forigi ĉiujn datumojn", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Malkonektante kaj forigante ĉiujn datumojn", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Sciigojn", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Sendo malsukcesis", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaloj", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Kaŝi detalojn", - "description": "Hides the details of a key change" - }, "learnMore": { "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.", + "message": "Tiu ĉi versio de Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Mesaĝo kun enmetitaĵo", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Oni ne registris tiun numeron", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontaktoj", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importi ĉiujn Signal-grupojn kaj kontaktojn el via portebla aparato.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Antaŭa importo je", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importi nun", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importante…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "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": { "message": "ĵus", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 horon", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "antaŭ $hours$ h", - "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": "antaŭ $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nun", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Ludi sonan sciigon", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Sekuriga numero ŝanĝiĝis", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Hela", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Kaŝi la menubreton", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Krei novan interparolon...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Entajpu telefonnumeron por aldoni kontakton.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Nevalida numero", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Re-ligi aplikaĵon Signal Desktop al via portebla aparato por daŭrigi mesaĝadon.", - "description": "" - }, - "unlinked": { - "message": "Malligita", - "description": "" - }, - "relink": { - "message": "Re-ligi", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Ĝisdatiĝo de Session disponeblas", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/es/messages.json b/_locales/es/messages.json index a9f2773e9..65a7f9e15 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1,20 +1,12 @@ { "copyErrorAndQuit": { - "message": "Copiar fallo y cerrar Signal", + "message": "Copiar fallo y cerrar Session", "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." @@ -32,13 +24,9 @@ "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": "A&yuda", + "message": "&Ayuda", "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": "Ajustes ...", - "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": "Ocultar", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Cerrar Signal", + "message": "Cerrar Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -84,7 +72,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Seleccionar todo", + "message": "Seleccionar Todo", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -135,16 +123,12 @@ "message": "Configurar con datos a importar", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configurar como nuevo 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 independiente", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" }, "loading": { - "message": "Cargando …", + "message": "Cargando ...", "description": "Message shown on the loading screen before we've loaded any messages" }, "optimizingApplication": { @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Seleccionar adjunto", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carga tus datos", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Si ya has exportado tus datos desde la antigua aplicación de Signal, tus contactos y mensajes están a salvo en tu ordenador. Selecciona la carpeta donde has guardado los datos de Signal.", + "message": "Si ya has exportado tus datos desde la antigua aplicación de Session, tus contactos y mensajes están a salvo en tu ordenador. Selecciona la carpeta donde has guardado los datos de Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Asegúrate de haber seleccionado la carpeta correcta que contiene tus datos de Signal. El nombre suele comenzar por 'Signal Export'. También puedes guardar una copia nueva de tus datos desde la aplicación de Chrome.", + "message": "Asegúrate de haber seleccionado la carpeta correcta que contiene tus datos de Session. El nombre suele comenzar por 'Session Export'. También puedes guardar una copia nueva de tus datos desde la aplicación de Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,61 +186,31 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Comienza a usar Signal Desktop", + "message": "Comienza a usar Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Enlaza este dispositivo con tu teléfono", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "Carpeta seleccionada", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Actualizando base de datos. Puede llevar su tiempo …", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Cargando mensajes. $count$ hasta ahora …", - "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": "Yo", "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Ver más", + "message": "Ver", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Has abandonado el grupo", + "message": "Has abandonado el grupo.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Desliza hasta el final del chat", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Mensaje nuevo abajo ", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Mensajes nuevos abajo", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { - "message": "1 mensaje sin leer", + "message": "$count$ Mensaje No Leído", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ mensajes sin leer", + "message": "$count$ Mensajes No Leídos", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "Has marcado las cifras de seguridad con $name$ como verificadas", + "message": "Has marcado tus cifras de seguridad con $name$ como verificadas.", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Has retirado la marca de verificación de tus cifras de seguridad con $name$", + "message": "Has retirado la marca de verificación de tus cifras de seguridad con $name$.", "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": { @@ -306,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Has marcado las cifras de seguridad con $name$ como verificadas en otro dispositivo", + "message": "Has marcado tus cifras de seguridad con $name$ como verificadas desde otro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Has retirado la marca de verificación de tus cifras de seguridad con $name$ en otro dispositivo", + "message": "Has retirado la marca de verificación de tus cifras de seguridad con $name$ desde otro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -330,11 +264,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": "Las cifras de seguridad con varios miembros de este grupo han cambiado desde la última vez que las verificaste, lo que significaría que alguien ha tratado de interceptar la comunicación o que simplemente han reinstalado Signal.", + "message": "Las cifras de seguridad con varios miembros de este grupo han cambiado desde la última vez que las verificaste, lo que significaría que alguien ha tratado de interceptar la comunicación o que simplemente han reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Las cifras de seguridad con $name$ han cambiado desde la última vez que las verificaste, lo que significaría que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Signal.", + "message": "Tu cifras de seguridad con $name$ han cambiado y ya no están verificadas. Esto podría significar que alguien está tratando de interceptar la comunicación, o simplemente que $name$ ha reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Las cifras de seguridad que estás intentando verificar han cambiado. Revisa las nuevas cifras de seguridad con $name$. Recuerda que este cambio podría significar que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Signal.", + "message": "Las cifras de seguridad que estás intentando verificar han cambiado. Revisa las nuevas cifras de seguridad con $name$. Recuerda que este cambio podría significar que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Las cifras de seguridad con varios miembros del grupo han cambiado recientemente, lo que significaría que alguien ha tratado de interceptar la comunicación o que simplemente han reinstalado Signal.", + "message": "Las cifras de seguridad con varios miembros del grupo han cambiado recientemente, lo que significaría que alguien ha tratado de interceptar la comunicación o que simplemente han reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Las cifras de seguridad con $name$ han cambiado recientemente, lo que significaría que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Signal.", + "message": "Tus cifras de seguridad con $name$ han cambiado. Esto podría significar que o bien alguien está tratando de interceptar su comunicación, o que $name$ simplemente ha reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Las cifras de seguridad con $name$ han cambiado, lo que significaría que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Signal. Tal vez desees verificar las cifras de seguridad con este contacto.", + "message": "Las cifras de seguridad con $name$ han cambiado, lo que significaría que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Session. Tal vez desees verificar las cifras de seguridad con este contacto.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "¡Entendido!", + "message": "Entendido", "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", "description": "" }, - "acceptNewKey": { - "message": "Aceptar", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marcar como verificado", "description": "" @@ -428,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Has verificado las cifras de seguridad con $name$.", + "message": "Has marcado tus cifras de seguridad con $name$ como verificadas.", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -455,20 +385,16 @@ "message": "Nuevas cifras de seguridad", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Las cifras de seguridad con este contacto han cambiado, lo que significaría que, o bien alguien has tratado de interceptar la comunicación, o que este contacto simplemente ha reinstalado Signal. Tal vez desees verificar las nuevas cifras de seguridad.", - "description": "" - }, "incomingError": { "message": "Fallo al procesar el mensaje recibido", "description": "" }, "media": { - "message": "Adjuntos", + "message": "Multimedia", "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "No hay ningún adjunto en este chat", + "message": "Sin archivos multimedia", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +402,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "No hay documentos en este chat", + "message": "No hay documentos", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,25 +414,13 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Esta semana", + "message": "Esta Semana", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Este mes", + "message": "Este Mes", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipo de archivo adjunto no admitido. Haz clic para guardar.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Haz clic para guardar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Archivo sin nombre", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Nota de voz", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Tipo de adjunto no permitido por razones se seguridad", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Cargando previsualización ...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Preparando miniatura de visualización de enlace para $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatura de previsualización para $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Lo sentimos, el archivo seleccionado excede las restricciones de tamaño.", + "message": "El adjunto excede los límites de tamaño para el mensaje.", "description": "" }, "unableToLoadAttachment": { - "message": "Fallo al cargar el adjunto seleccionado.", + "message": "Lo sentimos, ha habido un fallo al adjuntar el archivo.", "description": "" }, - "disconnected": { - "message": "Desconectado", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "Conectando", + "message": "Conectando ...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "Ir a las notas de versión", "description": "" }, - "goToForums": { - "message": "Ir al forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Ir a la página de soporte técnico", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Informar de un problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Ajustes de Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Acerca de Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Dictar", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,24 +529,12 @@ "message": "Mostrar", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ocultar", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Cerrar", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Buscar", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Sin resultados para «$searchTerm$»", + "message": "No se encontraron resultados para «%s»", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bienvenida a Signal", - "description": "" - }, - "selectAContact": { - "message": "Selecciona un contacto o grupo para empezar a chatear.", + "message": "Bienvenido a Session.", "description": "" }, "typingAlt": { @@ -695,20 +573,16 @@ } } }, - "sendMessageToContact": { - "message": "Enviar mensaje", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { - "message": "domicilio", + "message": "Domicilio", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "trabajo", + "message": "Trabajo", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "móvil", + "message": "Móvil", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -740,7 +614,7 @@ "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { - "message": "Fallo al buscar el mensaje original", + "message": "No se encuentra el mensaje original", "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" }, "originalMessageNotAvailable": { @@ -756,31 +630,17 @@ "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { - "message": "Para ti", + "message": "Tú", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Respuesta a $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": "Para enviar notas de voz, permite a Signal Desktop acceder al micrófono.", + "message": "Para enviar notas de voz y hacer llamadas, permite a Session acceder al micrófono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Permitir acceso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostrar ajustes", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Cancelar", "description": "" }, - "failedToSend": { - "message": "Fallo al enviar a algunos destinatarios. Comprueba la conexión.", - "description": "" - }, "error": { "message": "Fallo", "description": "" }, - "messageDetail": { - "message": "Detalles de mensaje", - "description": "" - }, "delete": { "message": "Eliminar", "description": "" @@ -830,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Eliminar este mensaje", + "message": "Eliminar mensaje", "description": "" }, "from": { - "message": "De", + "message": "Desde:", "description": "Label for the sender of a message" }, "to": { - "message": "para", + "message": "Para:", "description": "Label for the receiver of a message" }, "sent": { @@ -857,22 +705,14 @@ "message": "Miembros del grupo", "description": "" }, - "showMembers": { - "message": "Mostrar miembros", - "description": "" - }, "resetSession": { - "message": "Reiniciar sesión", + "message": "Reiniciar Session Segura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Ver cifras de seguridad", + "message": "Ver Cifras De Seguridad", "description": "" }, - "viewAllMedia": { - "message": "Ver todos los adjuntos", - "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": "Si deseas verificar la seguridad del cifrado con $name$, compara las cifras de arriba con las cifras presentes en el dispositivo de tu contacto.", "description": "", @@ -887,16 +727,8 @@ "message": "No has intercambiado ningún mensaje con este contacto. Las cifras de seguridad estarán disponibles después de enviar el primer mensaje.", "description": "" }, - "moreInfo": { - "message": "Más detalles ...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Volver a enviar", - "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": "Eliminar este mensaje", + "message": "Eliminar Mensaje", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -939,10 +771,6 @@ "message": "Guardar", "description": "" }, - "fileIconAlt": { - "message": "Icono de archivo", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji representando '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Bienvenida a Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "La privacidad es posible. Signal lo hace fácil.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Enlaza tu teléfono con Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Ajustes de Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispositivos enlazados", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Botón '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "Enlazar nuevo dispositivo", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nombre de dispositivo", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Selecciona un nombre para este dispositivo", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Completar proceso", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronizando contactos y grupos", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Fallo al conectar con el servidor.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Lo sentimos, ya tienes demasiados dispositivos vinculados. Prueba a eliminar algunos.", - "description": "" - }, - "settings": { - "message": "Ajustes", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "message": "Enlazar Nuevo Dispositivo", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permisos", @@ -1029,34 +801,6 @@ "message": "Comprobar la ortografía al escribir el mensaje", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Limpiar datos", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Esto eliminará todos los datos de la aplicación, los mensajes y la información de la cuenta.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Eliminar datos", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "¿Eliminar todos los datos?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Vas a eliminar toda la información de la cuenta de Signal en esta aplicación, incluyendo todos los contactos y mensajes. Siempre puedes volver a enlazar tu dispositivo móvil de nuevo, pero los mensajes eliminados no se restaurarán.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Eliminar todos los datos", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Desconectando y borrando datos", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificaciones", "description": "Header for notification settings" @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Desactivar notificaciones", + "message": "Silenciar notificaciones", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,11 +834,11 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Más reciente de:", + "message": "Más recientes desde: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { - "message": "De:", + "message": "Desde:", "description": "Displayed in notifications when setting is 'name only' and one message is waiting" }, "notificationMostRecent": { @@ -1102,23 +846,15 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Fallo al enviar", + "message": "Fallo Al Enviar", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalles", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ocultar detalles", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Más información sobre verificación de cifras de seguridad", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Esta versión de Signal Desktop ha caducado. Por favor, actualiza a la última versión para seguir enviando mensajes.", + "message": "Esta versión de Session 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" }, "upgrade": { @@ -1129,36 +865,8 @@ "message": "Mensaje multimedia", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Número no registrado", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contactos", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importa todos los grupos y contactos de Signal desde tu teléfono móvil.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última actualización: ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importar ahora", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importando …", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Fallo al importar. Asegúrate de que ordenador y teléfono están conectados a internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "ahora", + "message": "Ahora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "Hace $hours$ hora(s)", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ m", - "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": "Hace $minutes$ minuto(s)", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ahora", - "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'." @@ -1226,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Has fijado la desaparición de mensajes en $time$", + "message": "Has fijado la desaparición de mensajes en $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ ha fijado la desaparición de mensajes en $time$", + "message": "$name$ha fijado la desaparición de mensajes en $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +924,7 @@ } }, "timerOption_0_seconds": { - "message": "inactivo", + "message": "Inactivo", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1360,11 +1024,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Desaparición de mensajes desactivada", + "message": "Desaparición de mensajes desactivada.", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ ha desactivado la desaparición de mensajes", + "message": "$name$ ha desactivado la desaparición de mensajes.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Has desactivado la desaparición de mensajes", + "message": "Has desactivado la desaparición de mensajes.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Caducidad de mensajes fijada en $time$", + "message": "El tiempo de desaparición de mensajes se ha fijado en $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1387,16 +1051,12 @@ } } }, - "audioNotificationDescription": { - "message": "Reproducir notificaciones sonoras", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Las cifras de seguridad han cambiado", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Las cifras de seguridad con $name$ han cambiado", + "message": "Tus cifras de seguridad con $name$ han cambiado.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "Verificar cifras de seguridad", + "message": "Verificar Cifras De Seguridad", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Claro", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Comienza con un chat ...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introduce un número de teléfono para añadir un contacto.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Número incorrecto", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Vuelve a enlazar Signal Desktop con tu teléfono móvil para continuar intercambiando mensajes.", - "description": "" - }, - "unlinked": { - "message": "Desenlazado", - "description": "" - }, - "relink": { - "message": "Enlazar de nuevo", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Actualización de Session Desktop disponible", "description": "" @@ -1480,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ ha abandonado el grupo", + "message": "$name$ ha abandonado el grupo.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "El grupo ha pasado a llamarse «$name$»", + "message": "Ahora el nombre del grupo es «$name$».", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ se ha unido al grupo", + "message": "$name$ se ha unido al grupo.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ se ha unido al grupo", + "message": "$name$ se han unido al grupo.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,248 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Términos y política de privacidad" + }, + "unknown": { + "message": "Desconocido" + }, + "changedSinceVerifiedTitle": { + "message": "Las Cifras De Seguridad Han Cambiado" + }, + "youMayWishToVerifyContact": { + "message": "Puede que desees verificar tus cifras de seguridad con este contacto." + }, + "about": { + "message": "Info" + }, + "settingsHeader": { + "message": "Ajustes" + }, + "continue": { + "message": "Continuar" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Límite de dispositivos alcanzado" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Lo sentimos, ya tienes demasiados dispositivos enlazados. Elimina alguno" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Solicitud de vinculación recibida" + }, + "waitingForDeviceToRegister": { + "message": "Esperando el dispositivo" + }, + "pairNewDevicePrompt": { + "message": "Escanea el código QR mostrado en el dispositivo a enlazar" + }, + "noPairedDevices": { + "message": "No hay dispositivos enlazados" + }, + "deviceUnpaired": { + "message": "Tu dispositivo se ha desvinculado correctamente" + }, + "sendMessageLeftGroup": { + "message": "Has abandonado el grupo." + }, + "moreInformation": { + "message": "Más detalles" + }, + "resend": { + "message": "Reenviar" + }, + "clearAllData": { + "message": "Borrar todos los datos" + }, + "deleteAccountWarning": { + "message": "Esto eliminará permanentemente tu ID de Session, incluyendo todos los mensajes, sesiones y contactos." + }, + "deleteContactConfirmation": { + "message": "¿Seguro que quieres eliminar esta conversación?" + }, + "copy": { + "message": "Copiar" + }, + "linkPreviewsTitle": { + "message": "Enviar Previsualizaciones" + }, + "linkPreviewDescription": { + "message": "Las previsualizaciones están disponibles para enlaces hacia Imgur, Instagram, Pinterest, Reddit y YouTube." + }, + "readReceiptSettingTitle": { + "message": "Notificaciones De Lectura" + }, + "typingIndicatorsSettingTitle": { + "message": "Indicadores De Tecleo" + }, + "themeToggleTitle": { + "message": "Claro" + }, + "successUnlinked": { + "message": "Tu dispositivo se ha desvinculado correctamente" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Descargar" + }, + "blockUser": { + "message": "Bloquear" + }, + "unblockUser": { + "message": "Desbloquear" + }, + "blockedSettingsTitle": { + "message": "Contactos bloqueados" + }, + "leaveGroup": { + "message": "Abandonar Grupo" + }, + "leaveGroupConfirmation": { + "message": "¿Seguro que quieres salir de este grupo?" + }, + "noContactsForGroup": { + "message": "Aún no tienes contactos" + }, + "editGroup": { + "message": "Editar grupo" + }, + "updateGroupDialogTitle": { + "message": "Actualizando $name$ ..." + }, + "showRecoveryPhrase": { + "message": "Frase de recuperación" + }, + "yourSessionID": { + "message": "Tu ID de Session" + }, + "recoveryPhraseSavePromptMain": { + "message": "Tu frase de recuperación es la llave maestra de tu ID de Session, puedes usarla para recuperar tu ID de Session en caso de pérdida de acceso a tu dispositivo. Guarda tu frase de recuperación en un lugar seguro y no se la digas a nadie." + }, + "copiedToClipboard": { + "message": "Copiado en el portapapeles" + }, + "unlock": { + "message": "Desbloquear" + }, + "connectToServerFail": { + "message": "No te pudiste unir al grupo" + }, + "connectingToServer": { + "message": "Conectando ..." + }, + "remove": { + "message": "Eliminar" + }, + "invalidSessionId": { + "message": "ID de Session no válida" + }, + "emptyGroupNameError": { + "message": "Por favor, ingresa un nombre de grupo" + }, + "groupNamePlaceholder": { + "message": "Nombre Del Grupo" + }, + "inviteContacts": { + "message": "Invitar Amigos" + }, + "yourUniqueSessionID": { + "message": "Saluda a tu ID de Session" + }, + "allUsersAreRandomly...": { + "message": "Tu ID de Session es la dirección única que las personas pueden usar para contactarte en Session. Por diseño, tu ID de Session es totalmente anónima y privada, sin vínculo con tu identidad real." + }, + "generateSessionID": { + "message": "Crear ID de Session" + }, + "recoveryPhrase": { + "message": "Frase de recuperación" + }, + "enterRecoveryPhrase": { + "message": "Ingresa tu frase de recuperación" + }, + "enterDisplayName": { + "message": "Ingresa un nombre para mostrar" + }, + "enterSessionIDHere": { + "message": "Ingresa tu ID de Session" + }, + "continueYourSession": { + "message": "Continúa tu Session" + }, + "linkDevice": { + "message": "Vincular dispositivo" + }, + "restoreUsingRecoveryPhrase": { + "message": "Restaura tu cuenta" + }, + "newSession": { + "message": "Nueva Session" + }, + "searchFor...": { + "message": "Buscar en chats, contactos y mensajes" + }, + "enterSessionID": { + "message": "Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Ingresa la ID de Session del destinatario" + }, + "usersCanShareTheir...": { + "message": "Los usuarios pueden compartir su ID de Session yendo a los ajustes de su cuenta y pulsando en Compartir ID de Session o compartiendo su código QR" + }, + "appearanceSettingsTitle": { + "message": "Apariencia" + }, + "privacySettingsTitle": { + "message": "Privacidad" + }, + "notificationsSettingsTitle": { + "message": "Notificaciones" + }, + "devicesSettingsTitle": { + "message": "Dispositivos enlazados" + }, + "recoveryPhraseEmpty": { + "message": "Ingresa tu frase de recuperación" + }, + "displayNameEmpty": { + "message": "Por favor, elige un nombre para mostrar" + }, + "joinOpenGroup": { + "message": "Únete al grupo abierto" + }, + "newClosedGroup": { + "message": "Nuevo grupo cerrado" + }, + "createClosedGroupNamePrompt": { + "message": "Nombre Del Grupo" + }, + "createClosedGroupPlaceholder": { + "message": "Ingresa un nombre de grupo" + }, + "openGroupURL": { + "message": "URL de grupo abierto" + }, + "enterAnOpenGroupURL": { + "message": "Ingresa una URL de grupo abierto" + }, + "next": { + "message": "Siguiente" + }, + "pairingDevice": { + "message": "Enlazar Dispositivo" + }, + "invalidGroupNameTooShort": { + "message": "Por favor, ingresa un nombre de grupo" + }, + "invalidGroupNameTooLong": { + "message": "Por favor, ingresa un nombre de grupo más corto" + }, + "pickClosedGroupMember": { + "message": "Por favor, elige al menos 2 miembros del grupo" + }, + "closedGroupMaxSize": { + "message": "Un grupo cerrado no puede tener más de 20 miembros" } -} +} \ No newline at end of file diff --git a/_locales/es_419/messages.json b/_locales/es_419/messages.json index f7ffb3e81..617750ddf 100644 --- a/_locales/es_419/messages.json +++ b/_locales/es_419/messages.json @@ -19,10 +19,6 @@ "message": "&Help", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -119,10 +115,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -154,7 +146,7 @@ "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +162,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,31 +178,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "tu ubicación seleccionada", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Actualizando base de datos. Esto pudiera tardar un poco...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Cargando mensajes. Hasta ahora $count$...", - "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": "Yo", "description": "The label for yourself when shown in a group member list" @@ -223,18 +197,6 @@ "message": "Abandonaste el grupo", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Desplazar al final de la conversación", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nuevo mensaje abajo", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nuevos mensajes abajo", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Mensaje sin Leer", "description": "Text for unread message separator, just one message" @@ -294,11 +256,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": "Tus números de seguridad con múltiples miembros del grupo han cambiado desde que verificaste por última vez. Esto podría significar que alguien esta tratando de interceptar tus comunicaciones o simplemente que ellos han reinstalado Signal.", + "message": "Tus números de seguridad con múltiples miembros del grupo han cambiado desde que verificaste por última vez. Esto podría significar que alguien esta tratando de interceptar tus comunicaciones o simplemente que ellos han reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Tu número de seguridad con $name$ ha cambiado desde la última vez que verificaste. Esto puede deberse a que alguien está intentando interceptar tu comunicación o simplemente a que $name$ a reinstalado Signal.", + "message": "Tu número de seguridad con $name$ ha cambiado desde la última vez que verificaste. Esto puede deberse a que alguien está intentando interceptar tu comunicación o simplemente a que $name$ a reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -308,7 +270,7 @@ } }, "changedRightAfterVerify": { - "message": "El número de seguridad que estas tratando de verificar ha cambiado. Por favor revisa tu nuevo número de seguridad con $name$. Recuerda, este cambio pudiera significar que alguien esta intentando interceptar tu comunicación o simplemente que $name$ ha reinstalado Signal.", + "message": "El número de seguridad que estas tratando de verificar ha cambiado. Por favor revisa tu nuevo número de seguridad con $name$. Recuerda, este cambio pudiera significar que alguien esta intentando interceptar tu comunicación o simplemente que $name$ ha reinstalado Session.", "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": { @@ -318,11 +280,11 @@ } }, "changedRecentlyMultiple": { - "message": "Tus números de seguridad con multiples miembros de este grupo han cambiando recientemente. Esto pudiera significar que alguien esta intentando interceptar tu comunicación o simplemente que ellos han reinstalado Signal.", + "message": "Tus números de seguridad con multiples miembros de este grupo han cambiando recientemente. Esto pudiera significar que alguien esta intentando interceptar tu comunicación o simplemente que ellos han reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Tu número de seguridad con $name$ ha cambiado recientemente. Esto puede deberse a que alguien está intentando interceptar tu comunicación o simplemente a que $name$ ha reinstalado Signal.", + "message": "Tu número de seguridad con $name$ ha cambiado recientemente. Esto puede deberse a que alguien está intentando interceptar tu comunicación o simplemente a que $name$ ha reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -332,7 +294,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Tu número de seguridad con $name$ ha cambiado. Esto podría deberse a una de dos razones, alguien está intentando interceptar tu comunicación o simplemente que $name$ ha reinstalado Signal. Quizá desees verificar tu número de seguridad con este contacto.", + "message": "Tu número de seguridad con $name$ ha cambiado. Esto podría deberse a una de dos razones, alguien está intentando interceptar tu comunicación o simplemente que $name$ ha reinstalado Session. Quizá desees verificar tu número de seguridad con este contacto.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -379,10 +341,6 @@ "message": "Enviar", "description": "" }, - "acceptNewKey": { - "message": "Aceptar", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marcar como verificado", "description": "" @@ -419,10 +377,6 @@ "message": "Nuevo número de seguridad", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Tu número de seguridad con este contacto cambió. Esto puede significar que alguien está tratando de interceptar tus mensajes y/o llamadas o tu contacto simplemente reinstaló Signal. Deberías verificar tu número de seguridad a continuación.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -459,34 +413,14 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipo de archivo adjunto no soportado. Haz click para guardar.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Presiona para guardar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Archivo Sin Nombre", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mensaje de Voz", "description": "Name for a voice message attachment" }, - "unsupportedFileType": { - "message": "Tipo de archivo no soportado", - "description": "Displayed for outgoing unsupported attachment" - }, "fileSizeWarning": { "message": "Disculpe, el archivo seleccionado excede las restricciones de tamaño del mensaje.", "description": "" }, - "disconnected": { - "message": "Desconectado", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Conectando", "description": "Displayed when the desktop client is currently connecting to the server." @@ -521,10 +455,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -533,14 +463,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Acerca de Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Voz", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -549,28 +471,8 @@ "message": "Mostrar", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "trayTooltip": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, - "searchForPeopleOrGroups": { - "message": "Enter name or number", - "description": "Placeholder text in the search input" - }, "welcomeToSession": { - "message": "Bienvenido a Signal", - "description": "" - }, - "selectAContact": { - "message": "Escoge un contacto o grupo para comenzar una conversación", + "message": "Bienvenido a Session", "description": "" }, "contactAvatarAlt": { @@ -583,10 +485,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -639,28 +537,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -681,18 +565,10 @@ "message": "Cancelar", "description": "" }, - "failedToSend": { - "message": "Fallo en el envío a algunos destinatarios. Revisa tu conexión a la red.", - "description": "" - }, "error": { "message": "Error", "description": "" }, - "messageDetail": { - "message": "Detalles del mensaje", - "description": "" - }, "delete": { "message": "Borrar", "description": "" @@ -729,10 +605,6 @@ "message": "Miembros del grupo", "description": "" }, - "showMembers": { - "message": "Mostrar miembros", - "description": "" - }, "resetSession": { "message": "Reiniciar sesión", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -741,10 +613,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "Si deseas verificar la seguridad de la criptografía de extremo-a-extremo con $name$, compara los números de arriba con los números en su dispositivo.", "description": "", @@ -759,14 +627,6 @@ "message": "Tú no has intercambiado ningún mensaje con este contacto todavía. Tu número de seguridad estará disponible después del primer mensaje.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -787,14 +647,6 @@ "message": "Thumbnail of image from quoted message", "description": "Used in alt tag of thumbnail images inside of an embedded message quote" }, - "imageFailedToLoad": { - "message": "Image failed to load", - "description": "When an image attachment is missing, this message is shown" - }, - "videoScreenshotFailedToLoad": { - "message": "Video screenshot failed to load", - "description": "When a attachment video screenshot is missing, this message is shown" - }, "imageAttachmentAlt": { "message": "Image attached to message", "description": "Used in alt tag of image attachment" @@ -807,10 +659,6 @@ "message": "Image sent in conversation", "description": "Used in the alt tag for the image shown in a full-screen lightbox view" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -821,65 +669,9 @@ } } }, - "installWelcome": { - "message": "Bienvenido a Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "La privacidad es posible. Signal lo hace fácil.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Fallo al conectarse al servidor", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Disculpe, tienes muchos dispositivos conectados. Intenta remover algunos.", - "description": "" - }, - "settings": { - "message": "Configuraciones", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Estilo", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -889,42 +681,10 @@ "message": "Allow access to camera and microphone", "description": "Description of the media permission description" }, - "spellCheck": { - "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", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificaciones", "description": "Header for notification settings" @@ -973,26 +733,14 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalles", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Esconder detalles", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Aprende más acerca de la verificación de números de seguridad", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Esta versión de Signal Desktop está obsoleta. Por favor, actualiza a la versión más reciente para continuar mensajeando.", + "message": "Esta versión de Session Desktop está obsoleta. Por favor, actualiza a la versión más reciente para continuar mensajeando.", "description": "Warning notification that this version of the app has expired" }, - "androidMessageLengthWarning": { - "message": "Clientes de 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" @@ -1001,34 +749,6 @@ "message": "Mensaje multimedia", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Número no está registrado", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contactos", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importar todos los contactos y grupos de Signal desde tu dispositivo móvil", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última importación a las", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importar ya", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importando...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "La importación ha fallado. Asegúrate de que tu computadora y tu dispositivo móvil están conectados al internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ahora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1041,50 +761,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ahora", - "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'." @@ -1255,10 +931,6 @@ } } }, - "audioNotificationDescription": { - "message": "Reproducir notificación de audio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1287,42 +959,14 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, - "hideMenuBar": { - "message": "Esconder barra de menú", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introduce un número telefónico para agregar contacto", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Número inválido", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Re-enlaza Signal Desktop a tu dispositivo móvil para continuar mensajeando.", - "description": "" - }, - "unlinked": { - "message": "No enlazado", - "description": "" - }, - "relink": { - "message": "Re-enlazar", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Actualización de Session disponible", "description": "" @@ -1397,4 +1041,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/et/messages.json b/_locales/et/messages.json index 486023901..67e1cb454 100644 --- a/_locales/et/messages.json +++ b/_locales/et/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "A&bi", "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": "Eelistused...", - "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": "Peida", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Seadista importimise abil", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Seadista uue seadmena", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Seadista iseseisva seadmena", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "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" }, - "chooseFile": { - "message": "Vali fail", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Sinu andmete laadimine", "description": "Header shown on the first screen in the data import process" @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Ole kindel, et oled valinud õige kataloogi, mis sisaldab sinu salvestatud Signali andmeid. Selle nimi peaks algama fraasiga \"Signal Export\". Sul on võimalik salvestada andmetest ka uus koopia rakendusest Chrome App.", + "message": "Ole kindel, et oled valinud õige kataloogi, mis sisaldab sinu salvestatud Signali andmeid. Selle nimi peaks algama fraasiga \"Session Export\". Sul on võimalik salvestada andmetest ka uus koopia rakendusest Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Alusta Signal Desktopi kasutamist", + "message": "Alusta Session Desktopi kasutamist", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Ühenda see seade enda telefoniga", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "sinu valitud asukoht", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Andmebaasi uuendamine. See võib võtta pisut aega...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Sõnumite laadimine, siiamaani $count$...", - "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": "Mina", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Sa lahkusid grupist", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Keri vestluse lõppu", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Allpool on uus sõnum", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Allpool on uued sõnumid", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 lugemata sõnum", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Postita", "description": "" }, - "acceptNewKey": { - "message": "Nõustun", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Märgi kinnitatuks", "description": "" @@ -455,10 +385,6 @@ "message": "Uus turvanumber", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Sinu turvanumber selle kontaktiga on muutunud. See võib tähendada, et keegi püüab teie suhtlust pealt kuulata või et see kontakt on lihtsalt Signali uuesti paigaldanud. Kontrolli uut turvakoodi allpool.", - "description": "" - }, "incomingError": { "message": "Sissetuleva sõnumi käsitlemisel tekkis tõrge.", "description": "" @@ -495,18 +421,6 @@ "message": "See kuu", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Mittetoetatud manuse tüüp. Klõpsa salvestamiseks.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Salvestamiseks klõpsa", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Nimeta fail", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Häälsõnum", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Manuse tüüp pole turvakaalutlustel lubatud.", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Eelvaate laadimine...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Lingi eelvaate pisipildi mustand: $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Lingi eelvaate pisipilt: $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Valitud manuse laadimine ei õnnestunud.", "description": "" }, - "disconnected": { - "message": "Ühendus katkestatud", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Ühendamine", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Mine väljalaskemärkmete juurde", "description": "" }, - "goToForums": { - "message": "Mine foorumitesse", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Mine kasutajatoelehele", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Teavita probleemist", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktopi eelistused", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Teave Signal Desktopi kohta", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Kõne", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Näita", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Peida", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Välju", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Otsi", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Tere tulemast Signalisse", "description": "" }, - "selectAContact": { - "message": "Vali kontakt või grupp ja alusta vestlust.", - "description": "" - }, "typingAlt": { "message": "Selle vestluse sisestuse animatsioon", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Saada sõnum", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "kodu", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Sina", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Vastus kasutajale $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": "Audiosõnumite saatmiseks luba Signal Desktopil mikrofoni kasutada.", + "message": "Audiosõnumite saatmiseks luba Session Desktopil mikrofoni kasutada.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Luba ligipääs", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Näita sätteid", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Loobu", "description": "" }, - "failedToSend": { - "message": "Mõnedele saajatele saatmine ei õnnestunud. Kontrolli enda võrguühendust.", - "description": "" - }, "error": { "message": "Tõrge", "description": "" }, - "messageDetail": { - "message": "Sõnumi üksikasjad", - "description": "" - }, "delete": { "message": "Kustuta", "description": "" @@ -857,10 +705,6 @@ "message": "Grupi liikmed", "description": "" }, - "showMembers": { - "message": "Näita liikmeid", - "description": "" - }, "resetSession": { "message": "Lähtesta seanss", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Näita turvanumbrit", "description": "" }, - "viewAllMedia": { - "message": "Näita kogu meediat", - "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": "Kui soovid kontrollida kasutajaga $name$ suhtluse krüpteerimist, siis võrdle ülalpool olevaid numbreid numbritega tema seadme ekraanil.", "description": "", @@ -887,14 +727,6 @@ "message": "Sa ei ole selle kontaktiga veel ühtegi sõnumit vahetanud. Sinu turvanumber temaga tekib pärast esimest sõnumit.", "description": "" }, - "moreInfo": { - "message": "Rohkem teavet...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Proovi uuesti saata", - "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": "Kustuta sõnum", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Salvesta", "description": "" }, - "fileIconAlt": { - "message": "Faili ikoon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "$title$ emoji-pilt", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Tere tulemast Signal Desktopi kasutama", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privaatsus on võimalik. Signal teeb selle lihtsaks.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Ühenda telefon Signal Desktopiga", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signali sätted", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Ühendatud seadmed", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+'-nupp", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Ühenda uus seade", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Seadme nimi", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Vali selle seadme nimi", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Lõpeta telefoni ühendamine", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Kontaktide ja gruppide sünkimine", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Ühenduse loomine serverisse ei õnnestunud.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Kahjuks on sul juba liiga palju ühendatud seadmeid. Proovi mõni eemaldada.", - "description": "" - }, - "settings": { - "message": "Sätted", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Teema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Õigused", @@ -1029,34 +801,6 @@ "message": "Luba sõnumite kasti teksti õigekirja kontroll", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Eemalda andmed", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Eemaldatakse kõik rakenduse andmed, kustutatakse kõik sõnumid ja salvestatud teave konto kohta.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Eemalda andmed", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Kas kustutada kõik andmed?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Oled kustutamas rakenduses salvestatud infot, kaasa arvatud kõik kontaktid ja sõnumid. Sul on alati võimalus ühendada nutiseade uuesti, aga see ei taasta kustutatud sõnumeid.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Kustuta kõik andmed", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Ühenduse lõpetamine ja kõigi andmete kustutamine", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Teavitused", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Saatmine ei õnnestunud", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Üksikasjad", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Peida üksikasjad", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Täpsem info turvanumbrite kontrollimise kohta", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "See Signal Desktopi versioon on aegunud. Palun uuenda uusimale versioonile sõnumite saatmiseks jätkamiseks.", + "message": "See Session Desktopi versioon on aegunud. Palun uuenda uusimale versioonile sõnumite saatmiseks jätkamiseks.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Meediasõnum", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Number ei ole registreeritud", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontaktid", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Impordi kõik Signali grupid ja kontaktid enda nutiseadmest.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Viimane importimine:", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Impordi nüüd", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importimine...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importimine ei õnnestunud. Kontrolli üle, et arvuti ja telefon oleksid mõlemad ühendatud internetti.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nüüd", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 tund", "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$ tundi tagasi", - "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 tagasi", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nüüd", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Mängi audioteavitust", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Turvanumber on muutunud", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Hele", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Kontakti lisamiseks sisesta telefoninumber.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Vigane number", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Sõnumite saatmise jätkamiseks ühenda Signal Desktop nutiseadmega.", - "description": "" - }, - "unlinked": { - "message": "Ühendus eemaldatud", - "description": "" - }, - "relink": { - "message": "Ühenda uuesti", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session uuendus on saadaval", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/fa/messages.json b/_locales/fa/messages.json index 67ba7791c..d97f7dd91 100644 --- a/_locales/fa/messages.json +++ b/_locales/fa/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&کمک", "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": "ترجیحات", - "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": "مخفی سازی", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "خروج از Signal", + "message": "خروج از Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "نصب با استفاده از ایمپورت", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "برپایی به عنوان یک دستگاه جدید", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "برپایی به عنوان یک دستگاه مستقل", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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": "انتخاب فایل", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "بارگذاری داده هایتان", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "شما پروسه اکسپورت را انجام دادید، مخاطبین ، پیام های شما روی کامپیوتر شما آماده هستند. پوشه ای که شامل داده های ذخیره شده Signal شما می باشد را انتخاب کنید.", + "message": "شما پروسه اکسپورت را انجام دادید، مخاطبین ، پیام های شما روی کامپیوتر شما آماده هستند. پوشه ای که شامل داده های ذخیره شده Session شما می باشد را انتخاب کنید.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "مطمئن شوید که دایرکتوری صحیح را که شامل داده های ذخیره شده Signal شما می باشد را انتخاب کرده اید. نام آن باید با 'Signal Export' آغاز شده باشد. شما همچنین میتوانید یک کپی جدید از داده های خود را از برنامه کروم ذخیره کنید.", + "message": "مطمئن شوید که دایرکتوری صحیح را که شامل داده های ذخیره شده Session شما می باشد را انتخاب کرده اید. نام آن باید با 'Session Export' آغاز شده باشد. شما همچنین میتوانید یک کپی جدید از داده های خود را از برنامه کروم ذخیره کنید.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "شروع به استفاده از Signal Desktop", + "message": "شروع به استفاده از Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "لینک کردن این دستگاه به موبایل", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "مکان انتخابی شما", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "در حال به‌روزرسانی پابگاه داده. ممکن است کمی طول بکشد...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "در حال بارگذاری پیام‌ها. تاکنون $count$ ...", - "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": "من", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "شما گروه را ترک کرده اید", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "رفتن به پایین گفتگو", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "پیام جدید پایین", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "پیام‌های جدید پایین", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 پیام خوانده نشده", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "کد امنیتی چند نفر از اعضای گروه از زمان آخریت تائید، تغییر کرده‌است. ممکن است معنایش این باشد که کسی دارد برای شنود ارتباطات شما تلاش می‌کند. امکان دیگر است که این اعضای گروه صرفاً Signal را دوباره نصب کرده‌اند.", + "message": "کد امنیتی چند نفر از اعضای گروه از زمان آخریت تائید، تغییر کرده‌است. ممکن است معنایش این باشد که کسی دارد برای شنود ارتباطات شما تلاش می‌کند. امکان دیگر است که این اعضای گروه صرفاً Session را دوباره نصب کرده‌اند.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "شماره امن شما با $name$ بعد از آخرین تایید شما تغییر یافته است. این بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست و یا اینکه $name$به تازگی Signal را مجددا نصب کرده است.", + "message": "شماره امن شما با $name$ بعد از آخرین تایید شما تغییر یافته است. این بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست و یا اینکه $name$به تازگی Session را مجددا نصب کرده است.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "شماره امنی که شما در تلاش برای تایید آن هستید تغییر کرده است. لطفا شماره امن جدید خود را با$name$بازبینی کنید. به یاد داشته باشید، این تغییر بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست و یا $name$مجددا Signal را نصب کرده است.", + "message": "شماره امنی که شما در تلاش برای تایید آن هستید تغییر کرده است. لطفا شماره امن جدید خود را با$name$بازبینی کنید. به یاد داشته باشید، این تغییر بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست و یا $name$مجددا Session را نصب کرده است.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "کد امنیتی چند نفر از اعضای گروه اخیرآً تغییر کرده‌است. ممکن است معنایش این باشد که کسی دارد برای شنود ارتباطات شما تلاش می‌کند. امکان دیگر است که این اعضای گروه صرفاً Signal را دوباره نصب کرده‌اند.", + "message": "کد امنیتی چند نفر از اعضای گروه اخیرآً تغییر کرده‌است. ممکن است معنایش این باشد که کسی دارد برای شنود ارتباطات شما تلاش می‌کند. امکان دیگر است که این اعضای گروه صرفاً Session را دوباره نصب کرده‌اند.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "شماره امن شما با $name$به تازگی تغییر یافته است.این امر بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست یا اینکه $name$بار دیگر Signal را نصب کرده است.", + "message": "شماره امن شما با $name$به تازگی تغییر یافته است.این امر بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست یا اینکه $name$بار دیگر Session را نصب کرده است.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "شماره امن شما با $name$ تغییر کرده است. این به این معناست که شخصی در تلاش برای رهگیری ارتباط شماست یا اینکه $name$مجددا Signal را نصب کرده است. بهتر است شماره امن خود با این مخاطب را تایید کنید.", + "message": "شماره امن شما با $name$ تغییر کرده است. این به این معناست که شخصی در تلاش برای رهگیری ارتباط شماست یا اینکه $name$مجددا Session را نصب کرده است. بهتر است شماره امن خود با این مخاطب را تایید کنید.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "ارسال", "description": "" }, - "acceptNewKey": { - "message": "تایید", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "علامت گذاری به عنوان تایید شده", "description": "" @@ -455,10 +385,6 @@ "message": "شماره‌ی امنیتی جدید", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "شماره‌ی امنیتی این مخاطب تغییر کرده‌ است. این می‌تواند به این معنی باشد که کسی در حال نفوذ به ارتباط شما است و یا اینکه مخاطب شما Signal را از نو نصب کرده و حالا شماره‌ی امنیتی جدیدی دارد.", - "description": "" - }, "incomingError": { "message": "خطا در کنترل پیام دریافتی", "description": "" @@ -495,18 +421,6 @@ "message": "این ماه", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "این نوع ضمیمه پشتیبانی نمی‌شود. برای ذخیره کلیک کنید.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "ذخیره", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "فایل بی‌نام", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "پیام صوتی", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "نوع پیوست به دلایل امنیتی مجاز نیست.", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "ناتوانی در بارگذاری پیوست انتخابی.", "description": "" }, - "disconnected": { - "message": "ارتباط قطع شد", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "در حال اتصال", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "رفتن به یادداشت های ریلیز", "description": "" }, - "goToForums": { - "message": "رفتن به انجمن ها", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "رفتن به صفحه پشتیبانی", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "گزارش مشکل", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "ترجیحات Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "درباره Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "صحبت", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "نمایش", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "مخفی سازی", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "خروج", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "جستجو", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "به Signal خوش‌آمدید", - "description": "" - }, - "selectAContact": { - "message": "برای شروع چت یک مخاطب یا گروه را انتخاب کنید.", + "message": "به Session خوش‌آمدید", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "فرستادن پیام", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "خانه", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "شما", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "پاسخ به $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": "برای فرستادن پیام های صوتی، به Signal Desktop اجازه دسترسی به میکروفون خود را بدهید.", + "message": "برای فرستادن پیام های صوتی، به Session Desktop اجازه دسترسی به میکروفون خود را بدهید.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "اجازه دسترسی بدهید", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "نمایش تنظیمات", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "صوت", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "انصراف", "description": "" }, - "failedToSend": { - "message": "ارسال به برخی مخاطبین ناموفق بود. اتصال شبکه‌ی خود را بررسی کنید.", - "description": "" - }, "error": { "message": "خطا", "description": "" }, - "messageDetail": { - "message": "جزئیات پیام", - "description": "" - }, "delete": { "message": "پاک کن", "description": "" @@ -857,10 +705,6 @@ "message": "اعضای گروه", "description": "" }, - "showMembers": { - "message": "نمایش اعضا", - "description": "" - }, "resetSession": { "message": "ایجاد جلسه‌ی امن جدید", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "دیدن شماره امنیتی", "description": "" }, - "viewAllMedia": { - "message": "دیدن تمام مدیا", - "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": "اگر تمایل به تائید امنیت رمزنگاری نقطه-به-نقطه با $name$ هستید، شماره‌ بالا را با شماره نمایش‌یافته در دستگاه مخاطب مقایسه کنید.", "description": "", @@ -887,14 +727,6 @@ "message": "شما هنوز هیچ پیامی با این مخاطب تبادل نکرده‌اید. شماره‌ی امنیتی پس از ارسال و یا دریافت اولین پیام در دسترس خواهد بود.", "description": "" }, - "moreInfo": { - "message": "اطلاعات بیشتر...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "ارسال دوباره", - "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": "حذف پیام", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "ذخیره", "description": "" }, - "fileIconAlt": { - "message": "آیکون فایل", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "تصویر ایموجی '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "به Signal Desktop خوش‌آمدید", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "حفظ حریم خصوصی ممکن است. Signal این کار را راحت‌تر میکند.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "موبایل خود را به Signal Desktop لینک کنید", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "تنظیمات Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "دستگاه های متصل شده", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "دکمه '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "لینک کردن دستگاه جدید", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "نام دستگاه", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "نام این دستگاه را انتخاب کنید", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "پایان لینک کردن گوشی", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "هماهنگ سازی مخاطبین و گروه ها", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "برقراری ارتباط با سرور ناموفق بود.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "متاسفانه دستگاه‌های زیادی را به حسابتان متصل کرده‌اید. تعدادی را حذف کنید.", - "description": "" - }, - "settings": { - "message": "تنظیمات", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "تم", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "دسترسی ها", @@ -1029,34 +801,6 @@ "message": "فعال سازی کنترل املاء متن وارد شده در باکس پیام نویسی", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "پاک سازی داده", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "این باعث می شود تمام داده های در برنامه پاک شوند، تمام پیام ها و اطلاعات ذخیره شده حساب کاربری از بین خواهند رفت.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "پاک کردن داده", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "پاک کردن تمام داده ها؟", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "شما در حال پاک کردن تمام اطلاعات ذخیره شده این حساب کاربری میباشید، این اطلاعات شامل تمام مخاطبین و پیام ها می باشد. شما همیشه میتوانید با موبایل خود آن را لینک کنید، اما این پیام های پاک شده را برنمی گرداند.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "پاک کردن تمام داده ها", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "قطع اتصال و پاک کردن تمام داده ها", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "آگاه‌سازی‌ها", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "ارسال ناموفق بود", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "جزئیات", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "جزئیات را پنهان کن", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "درباره‌ی شماره‌ی امنیتی بیشتر بدانید", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "این نسخه‌ی Signal قدیمی است. برای ارسال پیام لطفا آن را به آخرین نسخه ارتقاء دهید.", + "message": "این نسخه‌ی Session قدیمی است. برای ارسال پیام لطفا آن را به آخرین نسخه ارتقاء دهید.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "پیام رسانه‌ای", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "این شماره ثبت نشده است!", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "مخاطب‌ها", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "واردسازی لیست تمام گروه‌ها و مخاطب‌های Signal از گوشی موبایل شما.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "آخرین واردسازی ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "انجام واردسازی", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "در حال واردسازی...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "واردسازی با خطا مواجه شد! لطفا مطمئن شوید که کامپیوتر و موبایل شما به اینترنت متصل هستند.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "همین حالا", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ساعت", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ساعت", - "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$ ساعت پیش", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ دقیقه", - "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$دقیقه پیش", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "اکنون", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "شماره امنیتی تغییر یافته است", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "روشن", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "شماره نامعتبر", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "برای ادامه‌ی استفاده از ‌Signal Desktop، دوباره این برنامه را به Signal موبایل خود متصل نمایید.", - "description": "" - }, - "unlinked": { - "message": "Unlinked", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "به‌روزرسانی Session در دسترس است", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index 9e68fae51..7e894b2c7 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Ohje", "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": "Asetukset...", - "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": "Piilota", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Lopeta Signal", + "message": "Lopeta Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Asenna tuoduilla tiedoilla", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Asenna uutena laitteena", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Asenna itsenäisenä laitteena", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Valitse tiedosto", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Tuo tietosi", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Olet juuri suorittanut vientiprosessin, ja yhteystietosi ja viesisi odottavat nyt kärsivällisesti tietokoneellasi. Valitse kansio, joka sisältää tallennetut Signal tietosi.", + "message": "Olet juuri suorittanut vientiprosessin, ja yhteystietosi ja viesisi odottavat nyt kärsivällisesti tietokoneellasi. Valitse kansio, joka sisältää tallennetut Session tietosi.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Varmista, että ole valinnut oikean hakemiston, joka sisältää Signalin tiedot. Hakemiston nimen tulisi alkaa sanoilla \"Signal Export\". Voit myös tallentaa uuden kopion tiedoistasi Signalin Chrome-sovelluksen kautta.", + "message": "Varmista, että ole valinnut oikean hakemiston, joka sisältää Signalin tiedot. Hakemiston nimen tulisi alkaa sanoilla \"Session Export\". Voit myös tallentaa uuden kopion tiedoistasi Signalin Chrome-sovelluksen kautta.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Aloita Signal Desktopin käyttö", + "message": "Aloita Session Desktopin käyttö", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Yhdistä tämä laite puhelimeesi", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "valitsemasi kansio", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Päivitetään tietokantaa. Tämä saattaa kestää hetken...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Ladataan viestejä. $count$ ladattu...", - "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": "Minä", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Olet poistunut ryhmästä.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Vieritä keskustelun loppuun", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Uusi viesti alla", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Uusia viestejä alla", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 lukematon viesti", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Lähetä", "description": "" }, - "acceptNewKey": { - "message": "Hyväksy", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Merkitse varmennetuksi", "description": "" @@ -455,10 +385,6 @@ "message": "Uusi turvanumero", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Turvanumerosi tämän yhteystiedon kanssa on vaihtunut. Tämä voi tarkoittaa joko sitä, että joku yrittää kaapata viestiliikennettänne, tai sitä, että yhteystietosi on yksinkertaisesti uudelleenasentanut Signalin. Saatat haluta varmentaa alla näkyvän turvanumeron.", - "description": "" - }, "incomingError": { "message": "Virhe saapuvan viestin käsittelyssä", "description": "" @@ -495,18 +421,6 @@ "message": "Tämä kuukausi", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Liitetiedoston tyyppiä ei tueta. Tallenna napsauttamalla.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Tallenna napsauttamalla", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Nimeämätön tiedosto", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Ääniviesti", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Turvallisuussyistä tätä tiedostotyyppiä ei voida liittää.", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Ladataan esikatselua...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Linkin $domain$esikatselukuvan luonnos", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Linkin $domain$ esikatselukuva", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Valittua liitettä ei voitu ladata.", "description": "" }, - "disconnected": { - "message": "Ei yhteyttä", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Yhdistetään", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Siirry julkaisutietoihin", "description": "" }, - "goToForums": { - "message": "Siirry keskustelupalstalle", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Siirry tukisivulle", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Ilmoita ongelmasta", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop asetukset", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Tietoja Signal Desktopista", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Puhe", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Näytä", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Piilota", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Lopeta", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Hae", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Tervetuloa Signaliin", "description": "" }, - "selectAContact": { - "message": "Aloita keskustelu valitsemalla jokin yhteystieto tai ryhmä", - "description": "" - }, "typingAlt": { "message": "Kirjoitusanimaatio tälle keskustelulle", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Lähetä viesti", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "koti", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Sinä", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Vastaus: $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": "Lähettääksesi ääniviestejä myönnä Signal Desktopille mikrofonin käyttöoikeus.", + "message": "Lähettääksesi ääniviestejä myönnä Session Desktopille mikrofonin käyttöoikeus.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Myönnä käyttöoikeus", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Näytä asetukset", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Äänitiedosto", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Peruuta", "description": "" }, - "failedToSend": { - "message": "Lähettäminen joillekin vastaanottajille epäonnistui. Tarkista verkkoyhteytesi.", - "description": "" - }, "error": { "message": "Virhe", "description": "" }, - "messageDetail": { - "message": "Viestin tiedot", - "description": "" - }, "delete": { "message": "Poista", "description": "" @@ -857,10 +705,6 @@ "message": "Ryhmän jäsenet", "description": "" }, - "showMembers": { - "message": "Näytä jäsenet", - "description": "" - }, "resetSession": { "message": "Alusta istunto", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Näytä turvanumero", "description": "" }, - "viewAllMedia": { - "message": "Näytä kaikki 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": "Jos haluat varmentaa sinun ja yhteystiedon $name$ välisen salauksen tietoturvan, vertaa ylläolevia numeroita hänen laitteessaan näkyviin numeroihin.", "description": "", @@ -887,14 +727,6 @@ "message": "Et ole lähettänyt tai vastaanottanut vielä viestejä tämän yhteystiedon kanssa. Turvanumero on saatavilla vasta ensimmäisen viestin jälkeen.", "description": "" }, - "moreInfo": { - "message": "Lisätietoja...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Lähetä uudelleen", - "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": "Poista viesti", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Tallenna", "description": "" }, - "fileIconAlt": { - "message": "Tiedoston ikoni", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji kuva: '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Tervetuloa Signal Desktopiin", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Yksityisyys on mahdollista. Signal tekee siitä helppoa.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Yhdistä puhelimesi ja Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Asetukset", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Yhdistetyt laitteet", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Nappi", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Yhdistä uusi laite", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Laitteen nimi", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Valitse nimi tälle laitteelle", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Viimeistele yhdistys puhelimeen", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkronoidaan yhteystietoja ja ryhmiä", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Palvelimeen ei saada yhteyttä.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Valitettavasti sinulla on jo liian monta laitetta yhdistettynä. Kokeile poistaa joitakin.", - "description": "" - }, - "settings": { - "message": "Asetukset", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Teema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Käyttöoikeudet", @@ -1029,34 +801,6 @@ "message": "Ota käyttöön viestilaatikkoon kirjoitetun tekstin oikeinkirjoituksen tarkistus", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Tyhjennä tiedot.", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Tämä tyhjentää kaikki tiedot tästä sovelluksesta ja poistaa kaikki viestit ja käyttäjätilisi tiedot.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Tyhjennä tiedot.", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Poistetaanko kaikki tiedot?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Olet tuhoamassa tämän ohjelman kaikki käyttäjätiedot, mukaanlukien kaikki yhteystiedot ja viestit. Voit aina yhdistää mobiililaitteesi uudelleen, mutta se ei palauta jo tuhottuja viestejä.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Poista kaikki tiedot", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Katkaistaan yhteyttä ja tuhotaan kaikki tiedot", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Ilmoitukset", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Lähetys epäonnistui", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Lisätietoja", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Piilota lisätiedot", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lue lisää turvanumeroiden varmentamisesta.", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "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.", + "message": "Käyttämäsi versio Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Mediaviesti", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numero ei ole rekisteröity.", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Yhteystiedot", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Tuo kaikkien Signal-yhteystietojen ja -ryhmien tiedot mobiililaitteestasi.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Viimeksi tuotu", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Tuo nyt", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Tuodaan...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Tuonti epäonnistui. Varmista, että tietokoneesi ja puhelimesi ovat kytketty Internettiin.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nyt", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 tunti", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "$hours$ h sitten", - "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 sitten", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nyt", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Käytä ilmoitusääniä", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Turvanumero on vaihtunut", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Vaalea", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 uusi keskustelu...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Syötä puhelinnumero lisätäksesi uuden yhteystiedon", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Virheellinen numero", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Jotta voit jatkaa viestittelyä, yhdistä Signal Desktop uudelleen mobiililaitteeseesi.", - "description": "" - }, - "unlinked": { - "message": "Ei yhdistetty", - "description": "" - }, - "relink": { - "message": "Yhdistä uudelleen", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session päivitys saatavilla", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index f5226da6d..6afa73eb3 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -3,18 +3,10 @@ "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." @@ -24,7 +16,7 @@ "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": "&Affichage", + "message": "&Voir", "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": { @@ -32,13 +24,9 @@ "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": "A&ide", + "message": "&Aide", "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": "Préférences…", - "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": "Cacher", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quitter Signal", + "message": "Quitter Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Configurer avec importation", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configurer comme nouvel appareil", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Configurer comme appareil autonome", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choisir un fichier", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Chargez vos données", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Vous venez de passer par le processus d’exportation, et vos contacts et messages attendent patiemment sur votre ordinateur. Sélectionnez le dossier contenant vos données relatives à Signal enregistrées.", + "message": "Vous venez de passer par le processus d’exportation, et vos contacts et messages attendent patiemment sur votre ordinateur. Sélectionnez le dossier contenant vos données relatives à Session enregistrées.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Assurez-vous d’avoir sélectionné le bon répertoire contenant vos données relatives à Signal enregistrées. Son nom devrait commencer par « Signal Export ». Vous pouvez également enregistrer une nouvelle copie de vos données à partir de l’application Chrome.", + "message": "Assurez-vous d’avoir sélectionné le bon répertoire contenant vos données relatives à Session enregistrées. Son nom devrait commencer par « Signal Export ». Vous pouvez également enregistrer une nouvelle copie de vos données à partir de l’application Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,57 +186,27 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Commencez à utiliser Signal Desktop pour ordinateur", + "message": "Commencez à utiliser Session Desktop pour ordinateur", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Relier cet appareil à votre téléphone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "votre emplacement sélectionné", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Mise à niveau de la base de données. Cela peut prendre un certain temps…", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Chargement des messages. $count$ jusqu’à présent…", - "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": "Moi", "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Afficher", + "message": "Voir", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { "message": "Vous avez quitté le groupe", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Faire défiler vers le bas de la conversation", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nouveau message ci-dessous", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nouveaux messages ci-dessous", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { - "message": "1 message non lu", + "message": "$count$ message non lu", "description": "Text for unread message separator, just one message" }, "unreadMessages": { @@ -306,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Vous avez marqué votre numéro de sécurité avec $name$ comme vérifié à partir d’un autre appareil.", + "message": "Vous avez marqué votre numéro de sécurité avec $name$ comme vérifié à partir d’un autre appareil", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -330,11 +264,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": "Vos numéros de sécurité avec plusieurs membres du groupe ont changé depuis votre dernière vérification. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit qu’ils ont simplement réinstallé Signal.", + "message": "Vos numéros de sécurité avec plusieurs membres du groupe ont changé depuis votre dernière vérification. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit qu’ils ont simplement réinstallé Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Votre numéro de sécurité avec $name$ a changé depuis votre dernière conversation. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Signal.", + "message": "Votre numéro de sécurité avec $name$ a changé et n’est plus vérifié. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Le numéro de sécurité que vous essayez de vérifier a changé. Veuillez réviser votre nouveau numéro de sécurité avec $name$. Rappelez-vous que ce changement pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Signal.", + "message": "Le numéro de sécurité que vous essayez de vérifier a changé. Veuillez réviser votre nouveau numéro de sécurité avec $name$. Rappelez-vous que ce changement pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Vos numéros de sécurité avec plusieurs membres du groupe ont changé récemment. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit qu’ils ont simplement réinstallé Signal.", + "message": "Vos numéros de sécurité avec plusieurs membres du groupe ont changé récemment. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit qu’ils ont simplement réinstallé Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Votre numéro de sécurité avec $name$ a changé récemment. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Signal.", + "message": "Votre numéro de sécurité avec $name$ a changé. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Votre numéro de sécurité avec $name$ a changé. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Signal. Vous devriez peut-être vérifier votre numéro de sécurité avec ce contact.", + "message": "Votre numéro de sécurité avec $name$ a changé. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Session. Vous devriez peut-être vérifier votre numéro de sécurité avec ce contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "D’accord !", + "message": "D’accord", "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": "Envoyer", "description": "" }, - "acceptNewKey": { - "message": "Accepter", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marquer comme vérifié", "description": "" @@ -428,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Vous avez vérifié votre numéro de sécurité avec $name$.", + "message": "Vous avez marqué votre numéro de sécurité avec $name$ comme vérifié", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -455,10 +385,6 @@ "message": "Nouveau numéro de sécurité", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Votre numéro de sécurité avec ce contact a changé. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que ce contact a simplement réinstallé Signal. Vous devriez peut-être vérifier le nouveau numéro de sécurité ce-dessous.", - "description": "" - }, "incomingError": { "message": "Erreur de traitement du message entrant", "description": "" @@ -468,7 +394,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Vous n’avez aucun fichier média dans cette conversation", + "message": "Aucun média", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +402,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Vous n’avez aucun document dans cette conversation", + "message": "Aucun document", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -495,18 +421,6 @@ "message": "Ce mois", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Le type de pièce jointe n’est pas pris en charge. Cliquez pour l’enregistrer.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Cliquer pour enregistrer", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Fichier sans nom", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Message vocal", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Le type de fichier joint n’est pas autorisé pour des raisons de sécurité", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Chargement de l’aperçu…", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "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", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Imagette d’aperçu de lien pour $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Désolé, le fichier sélectionné dépasse la limite de taille des messages.", + "message": "La pièce jointe dépasse la limite de taille autorisée.", "description": "" }, "unableToLoadAttachment": { - "message": "Impossible de charger le fichier joint sélectionné.", + "message": "Une erreur est survenue lors du chargement de la pièce jointe.", "description": "" }, - "disconnected": { - "message": "L’application est déconnectée", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "Connexion", + "message": "Connexion…", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "Accéder aux notes de mise à jour", "description": "" }, - "goToForums": { - "message": "Accéder aux forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Accéder à la page d’assistance", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Signaler un problème", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Préférences de Signal Desktop pour ordinateur", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "À propos de Signal Desktop pour ordinateur", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Parole", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,24 +529,12 @@ "message": "Afficher", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Cacher", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quitter", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop pour ordinateur", - "description": "Tooltip for the tray icon" - }, "search": { - "message": "Chercher", + "message": "Recherche", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Aucun résultat pour « $searchTerm$ »", + "message": "Aucun résultat n’a été trouvé pour « %s »", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bienvenue sur Signal", - "description": "" - }, - "selectAContact": { - "message": "Sélectionnez un contact ou un groupe pour lancer une conversation.", + "message": "Bienvenue sur Session.", "description": "" }, "typingAlt": { @@ -695,20 +573,16 @@ } } }, - "sendMessageToContact": { - "message": "Envoyer un message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { - "message": "domicile", + "message": "Domicile", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "travail", + "message": "Travail", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "mobile", + "message": "Mobile", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -759,30 +633,16 @@ "message": "Vous", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Réponse à $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": "Afin d’envoyer des messages audio, autorisez Signal Desktop pour ordinateur à accéder à votre micro.", + "message": "Pour envoyer des messages audio, autorisez Session à accéder à votre microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Autoriser l’accès", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Afficher les paramètres", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { - "message": "Audio", + "message": "Contenu audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" }, "video": { @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Annuler", "description": "" }, - "failedToSend": { - "message": "Échec d’envoi à certains destinataires. Veuillez vérifiez votre connexion réseau.", - "description": "" - }, "error": { "message": "Erreur", "description": "" }, - "messageDetail": { - "message": "Détails du message", - "description": "" - }, "delete": { "message": "Supprimer", "description": "" @@ -830,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Supprimer ce message", + "message": "Supprimer le message", "description": "" }, "from": { - "message": "De", + "message": "De :", "description": "Label for the sender of a message" }, "to": { - "message": "à", + "message": "À :", "description": "Label for the receiver of a message" }, "sent": { @@ -857,22 +705,14 @@ "message": "Membres du groupe", "description": "" }, - "showMembers": { - "message": "Afficher les membres", - "description": "" - }, "resetSession": { - "message": "Réinitialiser la session", + "message": "Réinitialiser la session sécurisée", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { "message": "Afficher le numéro de sécurité", "description": "" }, - "viewAllMedia": { - "message": "Afficher tous les médias", - "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": "Si vous souhaitez vérifier la sécurité de votre chiffrement de bout en bout avec $name$, comparez les numéros ci-dessus avec les numéros sur son appareil.", "description": "", @@ -887,16 +727,8 @@ "message": "Vous n’avez pas encore échangé de messages avec ce contact. Votre numéro de sécurité sera accessible après le premier message.", "description": "" }, - "moreInfo": { - "message": "Plus d’infos…", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Renvoyer", - "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": "Supprimer ce message", + "message": "Supprimer le message", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -920,7 +752,7 @@ "description": "Used in alt tag of image attachment" }, "videoAttachmentAlt": { - "message": "Capture d.écran de la vidéo jointe au message", + "message": "Capture d'écran de la vidéo jointe au message", "description": "Used in alt tag of video attachment preview" }, "lightboxImageAlt": { @@ -939,10 +771,6 @@ "message": "Enregistrer", "description": "" }, - "fileIconAlt": { - "message": "Icône de fichier", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Image émoji de « $title$ »", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Bienvenue sur Signal Desktop pour ordinateur", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "La confidentialité est possible. Signal la facilite.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Reliez votre téléphone à Signal Desktop pour ordinateur", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Paramètres de Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Appareils reliés", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Bouton « + »", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Relier un nouvel appareil", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nom de l’appareil ", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choisissez le nom de cet appareil", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Terminer la liaison de l’appareil", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synchronisation des contacts et groupes", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Échec de connexion au serveur.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Désolé, trop d’appareils sont déjà reliés. Essayez d’en supprimer.", - "description": "" - }, - "settings": { - "message": "Paramètres", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Thème", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Autorisations", @@ -1029,34 +801,6 @@ "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" }, - "clearDataHeader": { - "message": "Suppression des données", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Toutes les données dans l’application seront supprimées, y compris tous les messages et les renseignements de compte enregistrés.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Supprimer les données", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Supprimer toutes les données ?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Vous êtes sur le point de supprimer tous les renseignements de compte enregistrés de cette application, y compris tous les contacts et messages. Vous pourrez toujours relier votre appareil mobile de nouveau, mais cela ne restaurera pas les messages supprimés.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Supprimer toutes les données", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Déconnexion et suppression de toutes les données", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notifications", "description": "Header for notification settings" @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Désactiver les notifications", + "message": "Notifications en sourdine", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +834,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Les plus récents de :", + "message": "Le plus récent de : $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1105,20 +849,12 @@ "message": "Échec d’envoi", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Détails", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Cacher les détails", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "En savoir plus sur la vérification des numéros de sécurité", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "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.", + "message": "Cette version de Session 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" }, "upgrade": { @@ -1126,39 +862,11 @@ "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "Message média", + "message": "Message multimédia", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Le numéro n’est pas inscrit", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacts", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importer tous les groupes et contacts Signal de votre appareil mobile", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Dernière importation le", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importer maintenant", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importation…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Échec d’importation. Assurez-vous que votre ordinateur et votre téléphone sont connectés à Internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "maintenant", + "message": "À l’instant", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1 heure", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "Il y a $hours$ h", - "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": "Il y a $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "maintenant", - "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'." @@ -1226,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Vous avez défini l’expiration des messages éphémères à $time$", + "message": "Vous avez défini l’expiration des messages éphémères à $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ a défini l’expiration des messages éphémères à $time$", + "message": "$name$ a défini l’expiration des messages éphémères à $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1312,7 +976,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "Désactivés", + "message": "Désactivé", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1364,7 +1028,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$a désactivé les messages éphémères", + "message": "$name$ a désactivé les messages éphémères.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Vous avez désactivé les messages éphémères", + "message": "Vous avez désactivé les messages éphémères.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "L’expiration des messages a été définie à $time$", + "message": "L’expiration des messages éphémères a été définie à $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1387,16 +1051,12 @@ } } }, - "audioNotificationDescription": { - "message": "Jouer une notification sonore", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Le numéro de sécurité a changé", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Le numéro de sécurité avec $name$ a changé", + "message": "Votre numéro de sécurité avec $name$ a changé", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Clair", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 une nouvelle conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Saisir un numéro de téléphone pour ajouter un contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Le numéro est invalide", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Reliez Signal Desktop pour ordinateur à votre appareil mobile de nouveau pour continuer à communiquer.", - "description": "" - }, - "unlinked": { - "message": "Non relié", - "description": "" - }, - "relink": { - "message": "Relier de nouveau", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Une mise à jour de Session est proposée", "description": "" @@ -1480,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ a quitté le groupe", + "message": "$name$ a quitté le groupe.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Le titre est maintenant « $name$ »", + "message": "Le nom du groupe est maintenant « $name$ ».", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ s’est joint au groupe", + "message": "$name$ s’est joint au groupe.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ se sont joints au groupe", + "message": "$name$ se sont joints au groupe.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,660 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Conditions générales et politique de confidentialité" + }, + "unknown": { + "message": "Inconnu" + }, + "changedSinceVerifiedTitle": { + "message": "Le numéro de sécurité a changé" + }, + "youMayWishToVerifyContact": { + "message": "Vous devriez peut-être vérifier votre numéro de sécurité avec ce contact." + }, + "about": { + "message": "À propos de Session" + }, + "settingsHeader": { + "message": "Paramètres" + }, + "continue": { + "message": "Continuer" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Limite d'appareils atteinte" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Désolé, trop d’appareils sont déjà reliés. Essayez d’en supprimer" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Demande de liaison reçue" + }, + "waitingForDeviceToRegister": { + "message": "En attente d'une demande de liaison" + }, + "pairNewDevicePrompt": { + "message": "Balayez le code QR affiché sur l’appareil pour le relier" + }, + "noPairedDevices": { + "message": "Aucun appareil n’est relié" + }, + "deviceUnpaired": { + "message": "Votre appareil a été déconnecté avec succès" + }, + "sendMessageLeftGroup": { + "message": "Vous avez quitté le groupe" + }, + "moreInformation": { + "message": "Plus d’informations" + }, + "resend": { + "message": "Renvoyer" + }, + "clearAllData": { + "message": "Effacer toutes les données" + }, + "deleteAccountWarning": { + "message": "Cela supprimera définitivement vos messages, vos sessions et vos contacts." + }, + "deleteContactConfirmation": { + "message": "Voulez-vous vraiment supprimer cette conversation ?" + }, + "copy": { + "message": "Copier" + }, + "linkPreviewsTitle": { + "message": "Envoyer des aperçus de liens" + }, + "linkPreviewDescription": { + "message": "Les aperçus sont pris en charge pour les liens Imgur, Instagram, Pinterest, Reddit et YouTube" + }, + "readReceiptSettingTitle": { + "message": "Accusés de lecture" + }, + "typingIndicatorsSettingTitle": { + "message": "Indicateurs de saisie" + }, + "themeToggleTitle": { + "message": "Clair" + }, + "successUnlinked": { + "message": "Votre appareil a été déconnecté avec succès" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Télécharger" + }, + "blockUser": { + "message": "Bloquer" + }, + "unblockUser": { + "message": "Débloquer" + }, + "blockedSettingsTitle": { + "message": "Contacts bloqués" + }, + "leaveGroup": { + "message": "Quitter le groupe" + }, + "leaveGroupConfirmation": { + "message": "Voulez-vous vraiment quitter ce groupe ?" + }, + "noContactsForGroup": { + "message": "Vous n'avez pas encore de contacts" + }, + "editGroup": { + "message": "Modifier le groupe" + }, + "updateGroupDialogTitle": { + "message": "Mise à jour de $name$…" + }, + "showRecoveryPhrase": { + "message": "Phrase de récupération" + }, + "yourSessionID": { + "message": "Votre Session ID" + }, + "recoveryPhraseSavePromptMain": { + "message": "Votre phrase de récupération est la clé principale de votre Session ID - vous pouvez l'utiliser pour restaurer votre Session ID si vous perdez l'accès à votre appareil. Conservez la dans un endroit sûr et ne la donnez à personne." + }, + "copiedToClipboard": { + "message": "Copié dans le presse-papier" + }, + "unlock": { + "message": "Déverrouiller" + }, + "connectToServerFail": { + "message": "Impossible de rejoindre le groupe" + }, + "connectingToServer": { + "message": "Connexion…" + }, + "remove": { + "message": "Supprimer" + }, + "invalidSessionId": { + "message": "Session ID non valide" + }, + "emptyGroupNameError": { + "message": "Veuillez saisir un nom de groupe" + }, + "groupNamePlaceholder": { + "message": "Nom du groupe" + }, + "inviteContacts": { + "message": "Inviter des amis" + }, + "yourUniqueSessionID": { + "message": "Dites bonjour à votre Session ID" + }, + "allUsersAreRandomly...": { + "message": "Votre Session ID est l'identifiant unique que les gens utilisent pour vous contacter dans Session. Sans lien avec votre identité réelle, votre Session ID est complètement anonyme et privé." + }, + "generateSessionID": { + "message": "Créer un Session ID" + }, + "recoveryPhrase": { + "message": "Phrase de récupération" + }, + "enterRecoveryPhrase": { + "message": "Saisissez votre phrase de récupération" + }, + "enterDisplayName": { + "message": "Saisissez un nom d'utilisateur" + }, + "enterSessionIDHere": { + "message": "Saisissez votre Session ID" + }, + "continueYourSession": { + "message": "Continuez votre Session" + }, + "linkDevice": { + "message": "Relier un appareil" + }, + "restoreUsingRecoveryPhrase": { + "message": "Restaurez votre compte" + }, + "newSession": { + "message": "Nouvelle Session" + }, + "searchFor...": { + "message": "Chercher des conversations, des contacts ou des messages" + }, + "enterSessionID": { + "message": "Saisir un Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Saisissez le Session ID du destinataire" + }, + "usersCanShareTheir...": { + "message": "Les utilisateurs peuvent partager leur Session ID depuis les paramètres du compte ou en utilisant le code QR." + }, + "appearanceSettingsTitle": { + "message": "Apparence" + }, + "privacySettingsTitle": { + "message": "Confidentialité" + }, + "notificationsSettingsTitle": { + "message": "Notifications" + }, + "devicesSettingsTitle": { + "message": "Appareils reliés" + }, + "recoveryPhraseEmpty": { + "message": "Saisissez votre phrase de récupération" + }, + "displayNameEmpty": { + "message": "Veuillez choisir un nom d'utilisateur" + }, + "joinOpenGroup": { + "message": "Joindre un groupe public" + }, + "newClosedGroup": { + "message": "Nouveau groupe privé" + }, + "createClosedGroupNamePrompt": { + "message": "Nom du groupe" + }, + "createClosedGroupPlaceholder": { + "message": "Saisissez un nom de groupe" + }, + "openGroupURL": { + "message": "URL du groupe public" + }, + "enterAnOpenGroupURL": { + "message": "Saisissez une URL de groupe public" + }, + "next": { + "message": "Suivant" + }, + "pairingDevice": { + "message": "Liaison de l’appareil" + }, + "invalidGroupNameTooShort": { + "message": "Veuillez saisir un nom de groupe" + }, + "invalidGroupNameTooLong": { + "message": "Veuillez saisir un nom de groupe plus court" + }, + "pickClosedGroupMember": { + "message": "Veuillez sélectionner au moins 2 membres" + }, + "closedGroupMaxSize": { + "message": "Un groupe privé ne peut pas avoir plus de 20 membres" + }, + "contextMenuNoSuggestions": { + "message": "Pas de suggestions", + "description": "Shown in the context menu for a misspelled word to indicate that there are no suggestions to replace the misspelled word" + }, + "done": { + "message": "Terminer", + "description": "Button when a specific action is to be done." + }, + "cannotUpdateDetail": { + "message": "La mise a jour de Session a échouée. Une nouvelle version est disponible. Rendez-vous sur https://getsession.org/ pour installer la nouvelle version manuellement. Vous pouvez également contacter le support ou créer un ticket au sujet de ce problème.", + "description": "Shown if a general error happened while trying to install update package" + }, + "close": { + "message": "Fermer" + }, + "devicePairingRequestReceivedNoListenerDescription": { + "message": "Une demande de liaison a été reçue, mais vous n’êtes pas sur l’écran de liaison d'un appareil. \nRendez-vous dans Paramètres > Appareil > Relier un nouvel appareil." + }, + "deviceIsSecondaryNoPairing": { + "message": "Cet appareil est un appareil secondaire et ne peux donc pas être relié." + }, + "pairingOngoing": { + "message": "Une demande de liaison est déjà en cours. Redémarrez l'application si cela prends trop longtemps." + }, + "allowPairingWithDevice": { + "message": "Autoriser la liaison avec cet appareil ?" + }, + "provideDeviceAlias": { + "message": "Choisissez un alias pour cet appareil" + }, + "showPairingWordsTitle": { + "message": "Mots secrets pour la liaison" + }, + "confirmUnpairingTitle": { + "message": "Merci de confirmer que vous souhaitez déconnecter l'appareil suivant:" + }, + "unpairDeviceWarning": { + "message": "Êtes-vous sur de vouloir déconnecter cet appareil ?", + "description": "Warning for device unlinking in settings view" + }, + "unpairDeviceWarningSub": { + "message": "Déconnecter cet appareil supprimera tout l'historique, ce qui inclut tous les messages, sessions, et contacts de cet appareil.", + "description": "Warning description for device unlinking in settings view" + }, + "deletePublicWarning": { + "message": "Êtes-vous sûr? Cela supprimera ce message pour tous les membres de ce groupe public." + }, + "deleteMultiplePublicWarning": { + "message": "Êtes-vous sûr? Cela supprimera ces messages pour tous les membres de ce groupe public." + }, + "deleteMultipleWarning": { + "message": "Êtes-vous sûr? En cliquant sur 'Supprimer' cela supprimera ces messages sur cet appareil uniquement." + }, + "messageDeletionForbidden": { + "message": "Vous n'êtes pas autorisé à supprimer les messages des autres utilisateurs.", + "description": "Toast message explaining that the user doens't have the rights to delete other people's messages." + }, + "sendMessageBlockedUser": { + "message": "Vous avez bloqué ce contact" + }, + "deleteMessageForEveryone": { + "message": "Supprimer ce message pour tout le monde", + "description": "Menu item for deleting messages, title case." + }, + "deleteMessagesForEveryone": { + "message": "Supprimer ces messages pour tout le monde", + "description": "Menu item for deleting messages, title case." + }, + "deleteForEveryone": { + "message": "Supprimer ce message", + "description": "Menu item for deleting messages, title case." + }, + "deletePublicConversationConfirmation": { + "message": "Êtes-vous sur de vouloir supprimer les messages de ce groupe public de façon permanente ?", + "description": "Confirmation dialog text that asks the user if they really wish to delete the open group messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + }, + "sessionResetFailed": { + "message": "La réinitialisation de la session sécurisée a échoué", + "description": "your secure session could not been transmitted to the other participant." + }, + "sessionResetOngoing": { + "message": "Réinitialisation de la session sécurisée en cours", + "description": "your secure session is currently being reset, waiting for the reset acknowledgment." + }, + "linkPreviewsConfirmMessage": { + "message": "Vous n'aurez pas une protection complète des métadonnées en envoyant ou recevant des aperçu de liens." + }, + "mediaPermissionsTitle": { + "message": "Microphone et caméra" + }, + "spellCheckTitle": { + "message": "Vérification orthographique", + "description": "Description of the media permission description" + }, + "spellCheckDirty": { + "message": "Vous devez redémarrer Session pour appliquer ces changements.", + "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Session." + }, + "readReceiptSettingDescription": { + "message": "Voir et partager quand les messages ont étés lus (s'applique à toutes les sessions).", + "description": "Description of the read receipts setting" + }, + "typingIndicatorsSettingDescription": { + "message": "Voir et partager quand les messages sont rédigés (s'applique à toutes les sessions).", + "description": "Description of the typing indicators setting" + }, + "zoomFactorSettingTitle": { + "message": "Facteur de zoom", + "description": "Title of the Zoom Factor setting" + }, + "clockOutOfSync": { + "message": "Votre horloge est désynchronisée. Merci de mettre à jour votre horloge et de réessayer.", + "description": "Notifcation that user's clock is out of sync with Loki's servers." + }, + "messageBodyTooLong": { + "message": "Corps de message trop long.", + "description": "Shown if the user tries to send more than 64kb of text" + }, + "changeNickname": { + "message": "Changer le surnom", + "description": "Conversation menu option to change user nickname" + }, + "clearNickname": { + "message": "Supprimer le surnom", + "description": "Conversation menu option to clear user nickname" + }, + "themeToggleDescription": { + "message": "Choisissez le thème qui vous convient le mieux" + }, + "hideMenuBarTitle": { + "message": "Cacher la barre de menu", + "description": "Label text for menu bar visibility setting" + }, + "hideMenuBarDescription": { + "message": "Activer/Désactiver la barre de menu système", + "description": "Label text for menu bar visibility setting" + }, + "autoUpdateSettingTitle": { + "message": "Mise à jour automatique" + }, + "autoUpdateSettingDescription": { + "message": "Rechercher automatiquement les mises à jour au lancement" + }, + "autoUpdateDownloadedMessage": { + "message": "La mise à jour a été telechargée." + }, + "autoUpdateDownloadInstructions": { + "message": "Voulez-vous télécharger la mise à jour ?" + }, + "unblocked": { + "message": "Débloqué" + }, + "banUser": { + "message": "Bannir l'utilisateur", + "description": "Ban user from open group by public key." + }, + "banUserConfirm": { + "message": "Êtes-vous sûr de vouloir bannir cet utilisateur ?", + "description": "Message shown when confirming user ban." + }, + "userBanned": { + "message": "Utilisateur banni", + "description": "Toast on succesful user ban." + }, + "userBanFailed": { + "message": "Le bannissement a échoué", + "description": "Toast on unsuccesful user ban." + }, + "copyMessage": { + "message": "Copier le texte du message", + "description": "Button action that the user can click to copy their public keys" + }, + "selectMessage": { + "message": "Sélectionner le message", + "description": "Button action that the user can click to select the message" + }, + "editGroupName": { + "message": "Éditer le nom du groupe", + "description": "Button action that the user can click to edit a group name (closed)" + }, + "setAccountPasswordTitle": { + "message": "Définir un mot de passe", + "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": "Changement de mot de passe", + "description": "Prompt for user to change account password in settings view" + }, + "changeAccountPasswordDescription": { + "message": "Changer le mot de passe", + "description": "Description for change account password setting view" + }, + "removeAccountPasswordTitle": { + "message": "Supprimer le mot de passe", + "description": "Prompt for user to remove account password in settings view" + }, + "removeAccountPasswordDescription": { + "message": "Supprimer le mot de passe de ce compte", + "description": "Description for remove account password setting view" + }, + "enterPassword": { + "message": "Veuillez saisir votre mot de passe" + }, + "confirmPassword": { + "message": "Confirmez le mot de passe" + }, + "pasteLongPasswordToastTitle": { + "message": "Le contenu du presse-papier dépasse la longueur maximum pour un mot de passe ($max_pwd_len$ caractères).", + "description": "Shown when user pastes a password which is longer than MAX_PASSWORD_LEN" + }, + "showRecoveryPhrasePasswordRequest": { + "message": "Veuillez saisir votre mot de passe", + "description": "Request for user to enter password to show recovery phrase." + }, + "passwordViewTitle": { + "message": "Saisissez votre mot de passe", + "description": "The title shown when user needs to type in a password to unlock the messenger" + }, + "password": { + "message": "Mot de passe", + "description": "Placeholder for password input" + }, + "setPassword": { + "message": "Définir un mot de passe", + "description": "Button action that the user can click to set a password" + }, + "changePassword": { + "message": "Changer le mot de passe", + "description": "Button action that the user can click to change a password" + }, + "removePassword": { + "message": "Supprimer le mot de passe", + "description": "Button action that the user can click to remove a password" + }, + "maxPasswordAttempts": { + "message": "Mot de passe invalide. Voulez-vous effacer la base de données?" + }, + "typeInOldPassword": { + "message": "Merci de saisir votre ancien mot de passe" + }, + "invalidOldPassword": { + "message": "Ancien mot de passe invalide" + }, + "invalidPassword": { + "message": "Mot de passe invalide" + }, + "noGivenPassword": { + "message": "Merci de saisir votre mot de passe" + }, + "passwordsDoNotMatch": { + "message": "Les mots de passe ne correspondent pas." + }, + "setPasswordInvalid": { + "message": "Les mots de passe ne correspondent pas." + }, + "changePasswordInvalid": { + "message": "L'ancien mot de passe est incorrect" + }, + "removePasswordInvalid": { + "message": "Mot de passe incorrect" + }, + "setPasswordTitle": { + "message": "Définir un mot de passe" + }, + "changePasswordTitle": { + "message": "Changer le mot de passe" + }, + "removePasswordTitle": { + "message": "Supprimer le mot de passe" + }, + "setPasswordToastDescription": { + "message": "Votre mot de passe a été défini. Veuillez le conserver en sécurité." + }, + "changePasswordToastDescription": { + "message": "Votre mot de passe a été changé. Veuillez le conserver en sécurité." + }, + "removePasswordToastDescription": { + "message": "Vous avez supprimé votre mot de passe." + }, + "publicChatExists": { + "message": "Vous êtes déjà connecté à ce groupe public" + }, + "connectToServerSuccess": { + "message": "Connexion au groupe public réussie" + }, + "setPasswordFail": { + "message": "Échec de la définition du mot de passe" + }, + "passwordLengthError": { + "message": "Le mot de passe doit avoir une longueur comprise entre 6 et 50 caractères", + "description": "Error string shown to the user when password doesn't meet length criteria" + }, + "passwordTypeError": { + "message": "Le mot de passe doit être une chaîne de caractères", + "description": "Error string shown to the user when password is not a string" + }, + "passwordCharacterError": { + "message": "Le mot de passe ne peux contenir que des lettres, des chiffres et des symboles", + "description": "Error string shown to the user when password contains an invalid character" + }, + "invalidPubkeyFormat": { + "message": "Format de clé publique non valide", + "description": "Error string shown when user types an invalid pubkey format" + }, + "lnsMappingNotFound": { + "message": "Aucun mappage LNS n'est associé à ce nom", + "description": "Shown in toast if user enters an unknown LNS name" + }, + "lnsLookupTimeout": { + "message": "La recherche LNS a expiré", + "description": "Shown in toast if user enters an unknown LNS name" + }, + "lnsTooFewNodes": { + "message": "Il n'y a pas assez de nœuds actifs actuellement pour la recherche LNS" + }, + "editProfileModalTitle": { + "message": "Profil", + "description": "Title for the Edit Profile modal" + }, + "addModerators": { + "message": "Ajouter un modérateur" + }, + "removeModerators": { + "message": "Supprimer un modérateur" + }, + "groupInvitation": { + "message": "Invitation à rejoindre un groupe" + }, + "addingContacts": { + "message": "Ajouter des contacts à" + }, + "noContactsToAdd": { + "message": "Aucun contact à ajouter" + }, + "noMembersInThisGroup": { + "message": "Aucun autre membre dans ce groupe" + }, + "noModeratorsToRemove": { + "message": "Aucun modérateur à supprimer" + }, + "createAccount": { + "message": "Créer un compte" + }, + "signIn": { + "message": "Connexion" + }, + "getStarted": { + "message": "Commencer" + }, + "anonymous": { + "message": "Anonyme", + "description": "The name of currently unidentified users" + }, + "enterOptionalPassword": { + "message": "Entrer un mot de passe (optionel)" + }, + + "devicePairingHeaderReassure": { + "message": "Linking may take up to one minute to register on your primary device. Please be patient." + }, + "devicePairingHeader_Step1": { + "message": "Lancer Session sur votre autre appareil." + }, + "devicePairingHeader_Step2": { + "message": "Rendez-vous dans Appareils dans les paramètres de votre compte." + }, + "devicePairingHeader_Step3": { + "message": "Sélectionnez Relier un nouvel appareil pour préparer la liaison de votre autre appareil." + }, + "devicePairingHeader_Step4": { + "message": "Saisissez votre Session ID ci-dessous pour relier votre appareil." + }, + "linkDeviceToExistingAccount": { + "message": "Relier un appareil à un compte existant" + }, + "or": { + "message": "ou" + }, + "ByUsingThisService...": { + "message": "En utilisant ce service, vous acceptez nos Conditions d'utilisation et notre Politique de confidentialité" + }, + "beginYourSession": { + "message": "Commencez
votre
Session." + }, + "welcomeToYourSession": { + "message": "Bienvenue sur Session" + }, + "message": { + "message": "Message" + }, + "addContact": { + "message": "Ajouter un contact" + }, + "permissionSettingsTitle": { + "message": "Autorisations" + }, + "members": { + "message": "$count$ membres", + "placeholders": { + "count": { + "content": "$1", + "example": "26" + } + } + }, + "description": { + "message": "Description" } } diff --git a/_locales/he/messages.json b/_locales/he/messages.json index 41275a3a1..13c7b4d3f 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&עזרה", "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": "העדפות...", - "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": "הסתר", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "צא מ־Signal", + "message": "צא מ־Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "הגדר עם יבוא", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "הגדר מכשיר חדש", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "הגדר בתור מכשיר עצמאי", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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": "בחר קובץ", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "טען את הנתונים שלך", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "הרגע עברת את תהליך היצוא, ואנשי הקשר וההודעות שלך ממתינים בסבלנות על המחשב שלך. בחר את התיקייה המכילה את נתוני Signal השמורים שלך.", + "message": "הרגע עברת את תהליך היצוא, ואנשי הקשר וההודעות שלך ממתינים בסבלנות על המחשב שלך. בחר את התיקייה המכילה את נתוני Session השמורים שלך.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "וודא שבחרת את התיקייה הנכונה המכילה את נתוני Signal השמורים שלך. שמה אמור להתחיל ב'יבוא Signal'. אתה יכול גם לשמור עותק חדש של הנתונים שלך מתוך יישום Chrome.", + "message": "וודא שבחרת את התיקייה הנכונה המכילה את נתוני Session השמורים שלך. שמה אמור להתחיל ב'יבוא Session'. אתה יכול גם לשמור עותק חדש של הנתונים שלך מתוך יישום Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "התחל להשתמש ב־Signal Desktop עבודה", + "message": "התחל להשתמש ב־Session Desktop עבודה", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "קשר מכשיר זה אל הטלפון שלך", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "המיקום הנבחר שלך", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "משדרג מסד נתונים. זה עשוי לקחת זמן מה...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "טוען הודעות. $count$ עד כה...", - "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": "אני", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "עזבת את הקבוצה", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "גלול לתחתית השיחה", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "הודעה חדשה מתחת", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "הודעות חדשות מתחת", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "הודעה שלא נקראה 1", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "מספרי הבטיחות שלך עם חברי קבוצה אלו השתנו מאז שוידאת בפעם האחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או שהוא פשוט התקין מחדש את Signal.", + "message": "מספרי הבטיחות שלך עם חברי קבוצה אלו השתנו מאז שוידאת בפעם האחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או שהוא פשוט התקין מחדש את Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "מספר הבטיחות שלך עם $name$ השתנה מאז הפעם שוידאת בפעם האחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$ פשוט התקין מחדש את Signal.", + "message": "מספר הבטיחות שלך עם $name$ השתנה מאז הפעם שוידאת בפעם האחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$ פשוט התקין מחדש את Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "מספר הבטיחות שאתה מנסה לוודא השתנה. אנא סקור את מספר הבטיחות החדש שלך עם $name$. זכור, שינוי זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$ פשוט התקין מחדש את Signal.", + "message": "מספר הבטיחות שאתה מנסה לוודא השתנה. אנא סקור את מספר הבטיחות החדש שלך עם $name$. זכור, שינוי זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$ פשוט התקין מחדש את Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "מספרי הבטיחות שלך עם חברי קבוצה רבים השתנו לאחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או שהוא פשוט התקין מחדש את Signal.", + "message": "מספרי הבטיחות שלך עם חברי קבוצה רבים השתנו לאחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או שהוא פשוט התקין מחדש את Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "מספר הבטיחות שלך עם $name$ השתנה לאחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$פשוט התקין מחדש את Signal.", + "message": "מספר הבטיחות שלך עם $name$ השתנה לאחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$פשוט התקין מחדש את Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "מספר הבטיחות שלך עם $name$ השתנה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$פשוט התקין מחדש את Signal. ייתכן שתרצה לוודא את מספר הבטיחות שלך עם איש קשה זה.", + "message": "מספר הבטיחות שלך עם $name$ השתנה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$פשוט התקין מחדש את Session. ייתכן שתרצה לוודא את מספר הבטיחות שלך עם איש קשה זה.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "שלח", "description": "" }, - "acceptNewKey": { - "message": "קבל", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "סמן כמודא", "description": "" @@ -455,10 +385,6 @@ "message": "מספר בטיחות חדש", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "מספר הבטיחות שלך עם איש קשר זה השתנה. זה יכול לעיד שמישהו מנסה ליירט את התקשורת שלך, או שאיש קשר זה פשוט התקין מחדש את Signal. ייתכן שתרצה לוודא את מספר הבטיחות החדש למטה.", - "description": "" - }, "incomingError": { "message": "שגיאה בטיפול בהודעה נכנסת", "description": "" @@ -495,18 +421,6 @@ "message": "החודש", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "קובץ לא נתמך. לחץ כדי לשמור.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "לחץ כדי לשמור", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "קובץ ללא שם", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "הודעה קולית", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "סוג הצרופה אינו מותר מסיבות אבטחה", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "טוען קדם־תצוגה...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "טיוטה של קדם־תצוגה של קישור עבור $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "קדם־תצוגה של קישור עבור $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "לא היה ניתן לטעון את הצרופה הנבחרת.", "description": "" }, - "disconnected": { - "message": "מנותק", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "מתחבר", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "לך אל הערות שחרור", "description": "" }, - "goToForums": { - "message": "לך אל פורומים", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "לך אל דף התמיכה", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "דווח על סוגייה", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "העדפות Signal Desktop עבודה", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "אודות Signal Desktop עבודה", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "דיבור", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "הראה", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "הסתר", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "צא", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop עבודה", - "description": "Tooltip for the tray icon" - }, "search": { "message": "חיפוש", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "ברוכים הבאים לסיגנל", "description": "" }, - "selectAContact": { - "message": "בחר איש קשר או קבוצה כדי להתחיל שיחה.", - "description": "" - }, "typingAlt": { "message": "הנפשת הקלדה עבור שיחה זו", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "שלח הודעה", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "בית", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "אתה", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "משיב אל $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": "כדי לשלוח הודעות קוליות, התר אל Signal Desktop עבודה לקבל גישה אל המיקרופון שלך.", + "message": "כדי לשלוח הודעות קוליות, התר אל Session Desktop עבודה לקבל גישה אל המיקרופון שלך.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "התר גישה", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "הראה הגדרות", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "שמע", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "ביטול", "description": "" }, - "failedToSend": { - "message": "נכשל בשליחה אל מספר נמענים. בדוק את חיבור הרשת שלך.", - "description": "" - }, "error": { "message": "שגיאה", "description": "" }, - "messageDetail": { - "message": "פרטי הודעה", - "description": "" - }, "delete": { "message": "מחק", "description": "" @@ -857,10 +705,6 @@ "message": "חברי קבוצה", "description": "" }, - "showMembers": { - "message": "הראה חברי קבוצה", - "description": "" - }, "resetSession": { "message": "אפס שיח", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "הצג מספר בטיחות", "description": "" }, - "viewAllMedia": { - "message": "הצג את כל המדיה", - "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": "אם אתה רוצה לוודא את הביטחון של הצפנת הקצה־אל־קצה שלך עם $name$, השווה את המספרים למעלה עם המספרים במכשיר שלו.", "description": "", @@ -887,14 +727,6 @@ "message": "לא החלפת עדין הודעות כלשהן עם איש קשר זה. מספר הבטיחות שלך איתו יהיה זמין לאחר ההודעה הראשונה.", "description": "" }, - "moreInfo": { - "message": "עוד מידע...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "נסה מחדש שליחה", - "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": "מחק הודעה", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "שמור", "description": "" }, - "fileIconAlt": { - "message": "צלמית קובץ", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "תמונת אימוג'י של '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "ברוך הבא אל Signal Desktop עבודה", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "פרטיות היא אפשרית. Signal הופך את זה לקל.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "שולחן עבודה Signal קשר את הטלפון שלך אל", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "הגדרות Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "מכשירים מקושרים", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "כפתור '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "קשר מכשיר חדש", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "שם מכשיר", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "בחר שם של מכשיר זה", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "סיים קישור טלפון", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "מסנכרן אנשי קשר וקבוצות", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "נכשל בחיבור לשרת.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "סליחה, יש לך כבר יותר מדי מכשירים מקושרים. נסה להסיר קצת.", - "description": "" - }, - "settings": { - "message": "הגדרות", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "ערכת נושא", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "הרשאות", @@ -1029,34 +801,6 @@ "message": "אפשר בדיקת איות של מלל המוכנס בתיבת חיבור הודעה", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "נקה נתונים", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "זה ינקה את כל הנתונים ביישום, יסיר את כל ההודעות ומידע שמור של חשבון.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "נקה נתונים", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "למחוק את כל הנתונים?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "אתה עומד למחוק את כל המידע השמור של חשבון של יישום זה, כולל כל אנשי הקשר וההודעות. אתה תמיד יכול לקשר עם המכשיר הנייד שלך שוב, אבל לא תוכל לשחזר הודעות מחוקות.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "מחק את כל הנתונים", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "מתנתק ומוחק את כל הנתונים", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "התראות", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "שליחה נכשלה", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "פרטים", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "הסתר פרטים", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "למד עוד על וידוא מספרי בטיחות", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "גרסה זו של Signal Desktop עבודה פגה. אנא שדרג אל הגרסה האחרונה כדי להמשיך בשליחת הודעות.", + "message": "גרסה זו של Session Desktop עבודה פגה. אנא שדרג אל הגרסה האחרונה כדי להמשיך בשליחת הודעות.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "הודעת מדיה", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "המספר אינו רשום", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "אנשי קשר", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "ייבא את כל הקבוצות ואנשי הקשר של Signal מהמכשיר הנייד שלך.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "יבוא אחרון בתאריך", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "ייבא כעת", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "מייבא...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "יבוא נכשל. וודא שהמחשב והטלפון שלך מחוברים לאינטרנט.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "כעת", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "שעה 1", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ שע'", - "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$ שע'", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ דק'", - "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$ דק'", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "כעת", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "נגן התראת שמע", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "מספר בטיחות השתנה", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "בהיר", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "התחל שיחה חדשה...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "הכנס מספר טלפון כדי להוסיף איש קשר.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "מספר בלתי תקף", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "קשר מחדש את Signal Desktop עבודה אל המכשיר הנייד שלך כדי להמשיך בשליחת הודעות.", - "description": "" - }, - "unlinked": { - "message": "לא מקושר", - "description": "" - }, - "relink": { - "message": "קשר מחדש", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "עדכון Session זמין", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/hi/messages.json b/_locales/hi/messages.json index 47b15b894..29e3c80f9 100644 --- a/_locales/hi/messages.json +++ b/_locales/hi/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Help", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "आपके चयनित स्थान", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "डेटाबेस का उन्नयन इसमें कुछ समय लग सकता है...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "संदेशों को लोड करना$count$अब तक...", - "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": "मुझे", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "आपने समूह छोड़ दिया", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "वार्तालाप के नीचे स्क्रॉल करें", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "नीचे नया संदेश", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "नीचे नया संदेश", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 अपठित संदेश", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "आपके द्वारा अंतिम सत्यापित होने के बाद से कई समूह सदस्यों के साथ आपकी सुरक्षा संख्या बदल गई हैं। इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है या उन्होंने Signal को बस पुनः स्थापित किया है", + "message": "आपके द्वारा अंतिम सत्यापित होने के बाद से कई समूह सदस्यों के साथ आपकी सुरक्षा संख्या बदल गई हैं। इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है या उन्होंने Session को बस पुनः स्थापित किया है", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "आपकी सुरक्षा संख्या के साथ$name$आपके अंतिम सत्यापन के बाद से बदल गया है। इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या$name$बस Signal को पुनः स्थापित किया है", + "message": "आपकी सुरक्षा संख्या के साथ$name$आपके अंतिम सत्यापन के बाद से बदल गया है। इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या$name$बस Session को पुनः स्थापित किया है", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "आपके द्वारा सत्यापित करने की कोशिश कर रहे सुरक्षा नंबर बदल गया है कृपया अपने नए सुरक्षा नंबर के साथ की समीक्षा करें$name$|याद रखें, इस परिवर्तन का मतलब यह हो सकता है कि कोई आपकी संचार को रोकना चाहता है या$name$बस Signal को पुनः स्थापित किया है", + "message": "आपके द्वारा सत्यापित करने की कोशिश कर रहे सुरक्षा नंबर बदल गया है कृपया अपने नए सुरक्षा नंबर के साथ की समीक्षा करें$name$|याद रखें, इस परिवर्तन का मतलब यह हो सकता है कि कोई आपकी संचार को रोकना चाहता है या$name$बस Session को पुनः स्थापित किया है", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "कई समूह सदस्यों के साथ आपकी सुरक्षा संख्या हाल ही में बदल गई हैं इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है या उन्होंने Signal को बस पुनः स्थापित किया है", + "message": "कई समूह सदस्यों के साथ आपकी सुरक्षा संख्या हाल ही में बदल गई हैं इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है या उन्होंने Session को बस पुनः स्थापित किया है", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "आपकी सुरक्षा संख्या के साथ$name$हाल ही में बदल गया है|इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या$name$बस Signal को पुनः स्थापित किया है", + "message": "आपकी सुरक्षा संख्या के साथ$name$हाल ही में बदल गया है|इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या$name$बस Session को पुनः स्थापित किया है", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "आपकी सुरक्षा संख्या के साथ$name$बदल गया है।इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या $name$बस Signal को पुनः स्थापित किया है आप इस संपर्क के साथ अपना सुरक्षा नंबर सत्यापित करना चाह सकते हैं।", + "message": "आपकी सुरक्षा संख्या के साथ$name$बदल गया है।इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या $name$बस Session को पुनः स्थापित किया है आप इस संपर्क के साथ अपना सुरक्षा नंबर सत्यापित करना चाह सकते हैं।", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "जमा करें", "description": "" }, - "acceptNewKey": { - "message": "स्वीकार करें", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "साटिपिट होने का मुहर लगा दे", "description": "" @@ -455,10 +385,6 @@ "message": "नया सुरक्षा नंबर", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "इस संपर्क के साथ आपकी सुरक्षा संख्या बदल गई है इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है, या इस संपर्क को केवल Signal को पुनः स्थापित किया गया है आप नीचे नई सुरक्षा संख्या को सत्यापित करना चाह सकते हैं।", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "असमर्थित अनुलग्नक प्रकार सहेजने के लिए क्लिक करें", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "सहेजने के लिए क्लिक करें", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "अनाम फ़ाइल", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "ध्वनि संदेश", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "वियोजित", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "जोड़ने", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Signal डेस्कटॉप के बारे में", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "भाषण", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "दिखाना", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "सर्च", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "सिग्‍नल में आपका स्वागत है ", "description": "" }, - "selectAContact": { - "message": "लिखचित की शुरुवाद करने के लिए कॉंटॅक्ट या ग्रूप चुने ", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "रद्द करें", "description": "" }, - "failedToSend": { - "message": "कुछ प्रप्टकर्ताओ को भेजना संभव नई हो पाया. कृपया अपने इंटरनेट कनेक्षन की जाँच कीजिए ", - "description": "" - }, "error": { "message": " गलती", "description": "" }, - "messageDetail": { - "message": "सन्देश विवरण", - "description": "" - }, "delete": { "message": "हटाना", "description": "" @@ -857,10 +705,6 @@ "message": "समूह के सदस्य", "description": "" }, - "showMembers": { - "message": "सदस्यों को दिखाएं", - "description": "" - }, "resetSession": { "message": "सत्र दोबारा शुरू करे ", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "यदि आप अपने एंड-टू-एंड एन्क्रिप्शन की सुरक्षा की पुष्टि करना चाहते हैं तो$name$ऊपर दिए गए नंबरों की संख्या उनके डिवाइस पर तुलना करें।", "description": "", @@ -887,14 +727,6 @@ "message": "आपने अभी तक इस संपर्क के साथ किसी भी संदेश का आदान-प्रदान नहीं किया है। उनके साथ आपका सुरक्षा नंबर पहले संदेश के बाद उपलब्ध होगा।", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "संरक्षित करें", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Signal डेस्कटॉप में आपका स्वागत है", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "गोपनीयता संभव है. Signal उसे आसान बनता है", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "सर्वर से कनेक्ट करने में विफल", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "क्षमा करें, आपके पास बहुत से डिवाइस पहले ही लिंक किए गए हैं कुछ को निकालने का प्रयास करें", - "description": "" - }, - "settings": { - "message": "सेटिंग्स", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "विषय", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "सूचनाएं", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "विवरण", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "विवरण छुपाए", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "सेफ्टी नंबर की सत्यता के बारे मई अधिक जानकारी प्राप्त करे ", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal डेस्कटॉप का यह संस्करण समाप्त हो गया है। संदेश जारी रखने के लिए कृपया नवीनतम संस्करण में नवीनीकृत करें।", + "message": "Session डेस्कटॉप का यह संस्करण समाप्त हो गया है। संदेश जारी रखने के लिए कृपया नवीनतम संस्करण में नवीनीकृत करें।", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "मीडिया संदेश", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "संख्या पंजीकृत नहीं है", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "संपर्क", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "अपने मोबाइल डिवाइस से सभी Signal समूहों और संपर्कों को आयात करें", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "पिछले आयात पर", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "अब आयात करें", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "आयात करने", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "आयात असफल रहा। सुनिश्चित करें कि आपका कंप्यूटर और आपका फ़ोन इंटरनेट से कनेक्ट है", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "अभी व", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 घंटा", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "अभी व", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "एमएमएम डीडी ", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "ऑडियो सूचना चलाएं", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "कोई संपर्क जोड़ने के लिए एक फ़ोन नंबर दर्ज करें", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "अमान्य संख्या", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "संदेश जारी रखने के लिए Signal डेस्कटॉप को अपने मोबाइल डिवाइस पर लिंक करें।", - "description": "" - }, - "unlinked": { - "message": "लिंक रद्द", - "description": "" - }, - "relink": { - "message": "फिर से लिंक", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json index 85e631556..0f14bf506 100644 --- a/_locales/hr/messages.json +++ b/_locales/hr/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Help", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Nadogradnja baze. Ovo može potrajati neko vrijeme...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Učitavanje poruka: $count$", - "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": "Ja", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Napustili ste grupu", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Spusti se na dno konverzacije", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nova poruka ispod", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nove poruke ispod", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 nepročitana poruka", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Sigurnosni su se brojevi s više članova ove grupe promijenili od zadnje potvrde. Moguće je da netko pokušava presresti vašu komunikaciju ili su neki članovi grupe reinstalirali Signal.", + "message": "Sigurnosni su se brojevi s više članova ove grupe promijenili od zadnje potvrde. Moguće je da netko pokušava presresti vašu komunikaciju ili su neki članovi grupe reinstalirali Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Sigurnosni se broj s kontaktom $name$ promijenio od zadnje potvrde. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Signal.", + "message": "Sigurnosni se broj s kontaktom $name$ promijenio od zadnje potvrde. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Sigurnosni broj koji potvrđujete se promijenio. Molimo vas da provjerite novi sigurnosni broj s kontaktom $name$. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Signal.", + "message": "Sigurnosni broj koji potvrđujete se promijenio. Molimo vas da provjerite novi sigurnosni broj s kontaktom $name$. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Sigurnosni su se brojevi s više članova ove grupe nedavno promijenili. Moguće je da netko pokušava presresti vašu komunikaciju ili su neki članovi grupe reinstalirali Signal.", + "message": "Sigurnosni su se brojevi s više članova ove grupe nedavno promijenili. Moguće je da netko pokušava presresti vašu komunikaciju ili su neki članovi grupe reinstalirali Session.", "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Sigurnosni broj s kontaktom $name$ se promijenio. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao signal. Možda biste htjeli potvrditi novi sigurnosni broj s ovim kontaktom.", + "message": "Sigurnosni broj s kontaktom $name$ se promijenio. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Session. Možda biste htjeli potvrditi novi sigurnosni broj s ovim kontaktom.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Predaj", "description": "" }, - "acceptNewKey": { - "message": "Prihvati", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Označi provjerenim", "description": "" @@ -455,10 +385,6 @@ "message": "Novi sigurnosni broj", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Vaš sigurnosni broj s ovim kontaktom se promijenio. Ovo može značiti da netko pokušava presresti vašu komunikaciju ili da je kontakt jednostavno reinstalirao Signal. Možda biste htjeli potvrditi novi sigurnosni broj naveden ispod.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepodržana vrsta privitka. Kliknite za spremanje.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikni za spremanje", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Neimenovana datoteka", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Glasovna poruka", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Nepovezano", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Povezivanje", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Traži", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Dobrodošli u Signal", - "description": "" - }, - "selectAContact": { - "message": "Odaberite kontakt ili grupu za početak dopisivanja.", + "message": "Dobrodošli u Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Otkaži", "description": "" }, - "failedToSend": { - "message": "Nije uspjelo slanje nekim primateljima. Provjerite svoju mrežnu vezu.", - "description": "" - }, "error": { "message": "Greška", "description": "" }, - "messageDetail": { - "message": "Detalji poruke", - "description": "" - }, "delete": { "message": "Obriši", "description": "" @@ -857,10 +705,6 @@ "message": "Članovi grupe", "description": "" }, - "showMembers": { - "message": "Prikaži članove", - "description": "" - }, "resetSession": { "message": "Ponovno pokreni sesiju", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "Želite li potvrditi sigurnost enkripcije komunikacije s $name$, usporedite ove brojeve s brojevima na njihovom uređaju.", "description": "", @@ -887,14 +727,6 @@ "message": "Još niste razmijienili poruke sa ovim kontaktom. Sigurnosni broj bit će dostupan nakon prve poruke.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Spremi", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Dobrodošli u Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatnost je moguća. Signal je čini lakom.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Nije uspjelo spajanje na poslužitelj.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Žao nam je, imate već previše povezanih uređaja. Pokušajte ukloniti neke.", - "description": "" - }, - "settings": { - "message": "Postavke", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Obavijesti", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalji", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Sakrij detalje", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Saznaj više o provjeri sigurnosnih brojeva", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Ova inačica Signal Desktopa je istekla. Molimo vas da za nastavak dopisivanja nadogradite na najnoviju verziju.", + "message": "Ova inačica Session Desktopa je istekla. Molimo vas da za nastavak dopisivanja nadogradite na najnoviju verziju.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Medijska poruka", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Broj nije registriran", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakti", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Uvezi sve Signal grupe i kontakte sa mobilnog uređaja.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Posljednji uvoz", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Uvezi sad", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Uvozim...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Uvoz nije uspio. Provjerite jesu li Vaše računalo i mobitel spojeni na internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "sada", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 sat", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "sada", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Zvučne obavijesti", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Unesi telefonski broj za dodavanje kontakta", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neispravni broj", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Ponovno povežite Signal Desktop sa svojim mobilnim uređajem za nastavak dopisivanja.", - "description": "" - }, - "unlinked": { - "message": "Nepovezano", - "description": "" - }, - "relink": { - "message": "Ponovno povezivanje", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Dostupna nadogradnja za Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index 816c2e8d9..1dbbeac27 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Súgó", "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": "Beállítások...", - "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": "Elrejtés", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Beállítás importálással", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Beállítás új eszközként", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Beállítás önálló eszközként", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Fájl kiválasztása", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Adataid betöltése", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Sikeresen befejezted az exportálást, és most kontaktjaid, valamint üzeneteid türelmesen várnak számítógépeden. Válaszd ki a lementett Signal adataidat tartalmazó könyvtárat!", + "message": "Sikeresen befejezted az exportálást, és most kontaktjaid, valamint üzeneteid türelmesen várnak számítógépeden. Válaszd ki a lementett Session adataidat tartalmazó könyvtárat!", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Bizonyosodj meg róla, hogy a megfelelő, Signal adataidat tartalmazó könyvtárat választottad ki! A nevének 'Signal Export'-tal kell kezdődnie. Emellett készíthetsz egy új másolatot a Chrome alkalmazás adataiból is.", + "message": "Bizonyosodj meg róla, hogy a megfelelő, Session adataidat tartalmazó könyvtárat választottad ki! A nevének 'Session Export'-tal kell kezdődnie. Emellett készíthetsz egy új másolatot a Chrome alkalmazás adataiból is.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "A Signal Desktop használatának megkezdése", + "message": "A Session Desktop használatának megkezdése", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Jelenlegi eszköz párosítása telefonoddal", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "kiválasztott könyvtár", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Adatbázis frissítése. Ez eltarthat egy darabig...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Üzenetek betöltése. Eddig $count$ db...", - "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": "Én", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Kiléptél a csoportból", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Görgetés a beszélgetés aljára", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Újabb üzenet érkezett", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Újabb üzenetek érkeztek", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 olvasatlan üzenet", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Biztonsági számod a csoport több tagjával is megváltozott az utolsó hitelesítés óta. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy valaki egyszerűen csak újratelepítette a Signal-t.", + "message": "Biztonsági számod a csoport több tagjával is megváltozott az utolsó hitelesítés óta. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy valaki egyszerűen csak újratelepítette a Session-t.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Biztonsági számod $name$ nevű partnereddel megváltozott az utolsó hitelesítés óta. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy $name$ egyszerűen csak újratelepítette a Signal-t.", + "message": "Biztonsági számod $name$ nevű partnereddel megváltozott az utolsó hitelesítés óta. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy $name$ egyszerűen csak újratelepítette a Session-t.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "A hitelesítés alatt álló biztonsági szám megváltozott. Kérlek ellenőrizd új biztonsági számodat $name$ nevű partnereddel. Ne felejtsd, ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, de azt is jelentheti, hogy $name$ egyszerűen csak újratelepítette a Signal-t.", + "message": "A hitelesítés alatt álló biztonsági szám megváltozott. Kérlek ellenőrizd új biztonsági számodat $name$ nevű partnereddel. Ne felejtsd, ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, de azt is jelentheti, hogy $name$ egyszerűen csak újratelepítette a Session-t.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Biztonsági számod a csoport több tagjával is megváltozott az utóbbi időben. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy valaki egyszerűen csak újratelepítette a Signal-t.", + "message": "Biztonsági számod a csoport több tagjával is megváltozott az utóbbi időben. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy valaki egyszerűen csak újratelepítette a Session-t.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Biztonsági számod $name$ nevű partnereddel nemrég megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy $name$ egyszerűen csak újratelepítette a Signal-t.", + "message": "Biztonsági számod $name$ nevű partnereddel nemrég megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy $name$ egyszerűen csak újratelepítette a Session-t.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Biztonsági számod $name$ nevű partnereddel megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, de azt is jelentheti, hogy $name$ egyszerűen csak újratelepítette a Signal-t. Javasolt újraellenőrizni a partnereddel közös biztonsági számotokat.", + "message": "Biztonsági számod $name$ nevű partnereddel megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, de azt is jelentheti, hogy $name$ egyszerűen csak újratelepítette a Session-t. Javasolt újraellenőrizni a partnereddel közös biztonsági számotokat.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Küldés", "description": "" }, - "acceptNewKey": { - "message": "Elfogadás", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Megjelölés ellenőrzöttként", "description": "" @@ -455,10 +385,6 @@ "message": "Új biztonsági szám", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "A partnerhez kapcsolódó biztonsági számod megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetést. De az is előfordulhat, hogy partnered egyszerűen újratelepítette a Signal-t. Lentebb lehetőséged van az új biztonsági szám hitelesítésére.", - "description": "" - }, "incomingError": { "message": "Nem sikerült kezelni a bejövő üzenetet.", "description": "" @@ -495,18 +421,6 @@ "message": "Ebben a hónapban", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Ez a csatolmánytípus nem támogatott. Kattints ide a lementéséhez!", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Kattints a mentéshez!", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Névtelen fájl", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Hangüzenet", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "A csatolmánytípus biztonsági okokból nincs engedélyezve", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Előnézet betöltése...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "A $domain$ hivatkozás előnézeti képének vázlata", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "A $domain$ hivatkozás előnézeti képe", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Nem sikerült betölteni a kiválasztott csatolmányt.", "description": "" }, - "disconnected": { - "message": "Lecsatlakozva", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Kapcsolódás", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Release notes megnyitása", "description": "" }, - "goToForums": { - "message": "Fórum megnyitása", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Támogatás megnyitása", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Hiba bejelentése", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "A Signal Desktop beállításai", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "A Signal Desktop-ról", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Beszéd", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Megjelenítés", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Elrejtés", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Kilépés", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Keresés", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Üdvözöl a Signal!", - "description": "" - }, - "selectAContact": { - "message": "Válassz ki egy kontaktot vagy csoportot a beszélgetés elkezdéséhez!", + "message": "Üdvözöl a Session!", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Üzenet küldése", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "otthoni", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Te", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Válasz neki: $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": "Hangüzenetek küldéséhez engedélyezd, hogy a Signal Desktop hozzáférjen mikrofonodhoz", + "message": "Hangüzenetek küldéséhez engedélyezd, hogy a Session Desktop hozzáférjen mikrofonodhoz", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Hozzáférés engedélyezése", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Beállítások megjelenítése", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Hang", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Mégsem", "description": "" }, - "failedToSend": { - "message": "Nem sikerült elküldeni az üzenetet néhány címzettnek. Ellenőrizd a hálózati kapcsolatot!", - "description": "" - }, "error": { "message": "Hiba", "description": "" }, - "messageDetail": { - "message": "Üzenet részletei", - "description": "" - }, "delete": { "message": "Törlés", "description": "" @@ -857,10 +705,6 @@ "message": "Csoport tagjai", "description": "" }, - "showMembers": { - "message": "Csoporttagok megjelenítése", - "description": "" - }, "resetSession": { "message": "Biztonságos munkamenet újraindítása", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Biztonsági szám megjelenítése", "description": "" }, - "viewAllMedia": { - "message": "Összes média megtekintése", - "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": "Ha szeretnéd ellenőrizni a végpontok közti titkosítás sértetlenségét $name$ nevű partnereddel, hasonlítsd össze a fenti számokat a partnered eszközén megjelenő számokkal!", "description": "", @@ -887,14 +727,6 @@ "message": "Még nem váltottál üzenetet ezzel a partnerrel. Biztonsági számod az első üzenet elküldését követően lesz elérhető.", "description": "" }, - "moreInfo": { - "message": "További információ...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Újraküldés", - "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": "Üzenet törlése", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Mentés", "description": "" }, - "fileIconAlt": { - "message": "Fájl ikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "'$title$'-t ábrázoló emoji", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Üdvözöl a Signal Desktop!", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "A magánélet védelme nem lehetetlen. A Signal ezt egyszerűvé teszi.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Telefonod összepárosítása Signal Desktop-pal", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal beállítások", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Párosított eszközök", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' gomb", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Új eszköz párosítása", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Eszköz neve", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Jelenlegi eszköz nevének megadása", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Telefon párosításának befejezése", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Kontaktok és csoportok szinkronizálása", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Nem sikerült csatlakozni a kiszolgálóhoz.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sajnáljuk, de már túl sok párosított eszközöd van. Próbálj kitörölni néhányat!", - "description": "" - }, - "settings": { - "message": "Beállítások", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Téma", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Jogosultságok", @@ -1029,34 +801,6 @@ "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" }, - "clearDataHeader": { - "message": "Adatok törlése", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Ez kitörli az alkalmazás összes adatát, beleértve üzeneteidet, illetve mentett hozzáférési adataidat is.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Adatok törlése", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Törlöd az összes adatot?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Az alkalmazás felhasználói adatainak törlésére készülsz (beleértve a kontaktokat és az összes üzenetet). A jövőben bármikor lehetőséged nyílik rá, hogy újrapárosítsd mobileszközeidet, de ez nem fogja helyreállítani a törölt üzeneteket.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Összes adat törlése", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Lecsatlakozás és összes adat törlése", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Értesítések", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Küldés sikertelen", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Részletek", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Részletek elrejtése", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Tudj meg többet a bizonsági számok ellenőrzéséről!", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "A Signal Desktop ezen verziója elavult. Kérlek frissíts a legújabb verzióra, hogy folytatni tudd a beszélgetést!", + "message": "A Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Médiaüzenet", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "A telefonszám nincs regisztrálva", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontaktok", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Az összes Signal csoport és kontakt importálása mobileszközödről.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Utolsó importálás:", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importálás", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importálás folyamatban...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Az importálás nem sikerült. Győződj meg róla, hogy a számítógéped és telefonod csatlakozik-e az internetre!", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "mostanában", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 órája", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ órája", - "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$ órája", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ perce", - "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$ perce", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "mostanában", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Hangjelzés", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Biztonsági szám megváltozott", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Világos", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Új beszélgetés megkezdése…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Telefonszám", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Érvénytelen telefonszám", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Párosítsd újra a Signal Desktopot mobilkészülékeiddel az beszélgetés folytatásához!", - "description": "" - }, - "unlinked": { - "message": "Nincs párosítva", - "description": "" - }, - "relink": { - "message": "Újrapárosítás", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session frissítés elérhető", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/id/messages.json b/_locales/id/messages.json index 674e19aeb..cc6f448be 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Bantuan", "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": "Preferensi...", - "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": "Sembunyikan", "description": "Application menu command to hide the window" @@ -52,11 +40,11 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Keluar dari Signal", + "message": "Keluar dari Session", "description": "Application menu command to close the application" }, "editMenuUndo": { - "message": "Kembali", + "message": "Ulang", "description": "Edit menu command to remove recently-typed text" }, "editMenuRedo": { @@ -84,7 +72,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Pilih Semua", + "message": "Pilih semua", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -135,10 +123,6 @@ "message": "Siapkan dengan Impor", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Siapkan sebagai Perangkat Baru", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Siapkan untuk Perangkat Berdiri Sendiri", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Pilih berkas", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Memuat data Anda", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Anda telah melewati proses ekspor. Kontak dan pesan Anda sedang menanti dengan sabar di komputer. Pilih map berisikan data Signal Anda.", + "message": "Anda telah melewati proses ekspor. Kontak dan pesan Anda sedang menanti dengan sabar di komputer. Pilih map berisikan data Session Anda.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Pastikan Anda memilih direktori tepat, yang berisi data Signal yang telah tersimpan. Nama direktori itu seharusnya 'Expor Signal'. Anda bisa juga membuat data salinan baru dari Chrome App.", + "message": "Pastikan Anda memilih direktori tepat, yang berisi data Session yang telah tersimpan. Nama direktori itu seharusnya 'Expor Session'. Anda bisa juga membuat data salinan baru dari Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Mulai menggunakan Signal Desktop", + "message": "Mulai menggunakan Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Sambungkan perangkat ini dengan telpon Anda", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "lokasi pilihan Anda", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Pemutakhiran basisdata. Ini mungkin memakan waktu lama ...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Memuat pesan $count$ sejauh ini...", - "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": "Saya", "description": "The label for yourself when shown in a group member list" @@ -256,27 +202,15 @@ "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Anda telah meninggalkan group", + "message": "Anda telah keluar dari grup.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Gulir ke bagian bawah pembicaraan", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Pesan baru di bawah", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Pesan baru di bawah", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Pesan Belum Dibaca", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ Pesan Belum Dibaca", + "message": "$count$ pesan belum dibaca", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "Anda menandai nomor keamanan $name$ terverifikasi", + "message": "Anda menandai nomor keamanan anda dengan $name$ terverifikasi", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Anda menandai nomor keamanan Anda $name$ tidak terverifikasi", + "message": "Anda menandai nomor keamanan anda dengan $name$ tidak terverifikasi", "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": { @@ -306,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Anda memberi tanda nomor keamanan Anda dengan $name$ terverifikasi dari perangkat lainnya.", + "message": "Anda menandai nomor keamanan anda dengan $name$ terverifikasi dari perangkat lain", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Anda memberi tanda nomor keamanan dengan $name$ sebagai nomor tidak terverifikasi dari perangkat lain.", + "message": "Anda menandai nomor keamanan anda dengan $name$ tidak terverifikasi dari perangkat lain", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -330,11 +264,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": "Nomor keamanan Anda dengan beberapa anggota grup telah berubah sejak terakhir Anda diverifikasi. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa mereka hanya memasang ulang Signal.", + "message": "Nomor keamanan Anda dengan beberapa anggota grup telah berubah sejak terakhir Anda diverifikasi. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa mereka hanya memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Nomor keamanan Anda dengan $name$ telah berubah sejak Anda terakhir diverifikasi. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Signal.", + "message": "Nomor keamanan anda dengan $name$ telah berubah dan tidak lagi terverifikasi. Ini bisa berarti bahwa seseorang mencoba mencegat komunikasi anda, atau dikarenakan$name$ telah memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Nomor keamanan yang ingin Anda verifikasi telah berubah. Harap tinjau nomor keamanan baru Anda dengan $name$. Ingat, perubahan ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Signal.", + "message": "Nomor keamanan yang ingin Anda verifikasi telah berubah. Harap tinjau nomor keamanan baru Anda dengan $name$. Ingat, perubahan ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Nomor keamanan Anda dengan beberapa anggota grup telah berubah baru-baru ini. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa mereka hanya memasang ulang Signal.", + "message": "Nomor keamanan Anda dengan beberapa anggota grup telah berubah baru-baru ini. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa mereka hanya memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Nomor keamanan Anda dengan $name$ telah berubah baru-baru ini. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Signal.", + "message": "Angka keamanan Anda dengan $name$ telah berubah. Ini bisa disebabkan seseorang mencoba mencegat komunikasi Anda, atau disebabkan $name$ telah memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Nomor keamanan Anda dengan $name$ telah berubah. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Signal. Anda mungkin ingin memverifikasi nomor keamanan Anda dengan kontak ini.", + "message": "Nomor keamanan Anda dengan $name$ telah berubah. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Session. Anda mungkin ingin memverifikasi nomor keamanan Anda dengan kontak ini.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Saya mengerti!", + "message": "Paham", "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": "Kirim", "description": "" }, - "acceptNewKey": { - "message": "Terima", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Tandai terverifikasi", "description": "" @@ -428,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Anda telah memverifikasi nomor keamanan Anda dengan $name$.", + "message": "Anda menandai nomor keamanan anda dengan $name$ terverifikasi", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -452,13 +382,9 @@ "description": "" }, "newIdentity": { - "message": "Nomor keamanan baru", + "message": "Angka keamanan baru", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Nomor keamanan Anda dengan kontak ini telah berubah. Ini bisa berarti ada seseorang mencoba mencegat komunikasi Anda, atau kontak telah menghapus aplikasi Signal. Anda mungkin ingin memverifikasi nomor keamanan baru di bawah.", - "description": "" - }, "incomingError": { "message": "Gagal dalam menangani pesan masuk", "description": "" @@ -468,7 +394,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Anda tak memiliki media di dalam percakapan ini", + "message": "Tidak ada media", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +402,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Anda tidak memiliki dokumen dari percakapan ini", + "message": "Tidak ada dokumen", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -495,18 +421,6 @@ "message": "Bulan ini", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Jenis lampiran tidak didukung. Klik untuk menyimpan.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klik untuk simpan", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "File tanpa nama", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Pesan Suara", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Jenis lampiran tidak diperbolehkan untuk alasan keamanan", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Maaf, berkas tersebut melebihi batas ukuran pesan.", + "message": "Lampiran melebihi batas ukuran untuk tipe pesan yang Anda kirimkan.", "description": "" }, "unableToLoadAttachment": { - "message": "Tidak bisa memuat lampiran yang dipilih.", + "message": "Maaf, terjadi kesalahan pada pengaturan lampiran anda.", "description": "" }, - "disconnected": { - "message": "Terputus", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "Menghubungi", + "message": "Menghubungkan...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "Lihat Catatan Rilis", "description": "" }, - "goToForums": { - "message": "Cek Forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Cek halaman bantuan", "description": "Item under the Help menu, takes you to the support page" @@ -619,40 +521,20 @@ "message": "Laporkan masalah ", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferensi Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Mengenai Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Bicara", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" }, "show": { - "message": "Tunjukkan", + "message": "Tampilkan", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Sembunyikan", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Berhenti", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { - "message": "Pencarian", + "message": "Cari", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "No results for \"$searchTerm$\"", + "message": "Tidak ditemukan hasil untuk \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Selamat datang di Signal", - "description": "" - }, - "selectAContact": { - "message": "Pilih kontak atau grup untuk mulai mengobrol.", + "message": "Selamat datang di Session.", "description": "" }, "typingAlt": { @@ -695,20 +573,16 @@ } } }, - "sendMessageToContact": { - "message": "Kirim Pesan", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Beranda", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "kerja", + "message": "Kerja", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "mobil", + "message": "Mobil", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -736,7 +610,7 @@ "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" }, "replyToMessage": { - "message": "Membalas Pesan", + "message": "Balas pesan", "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { @@ -759,28 +633,14 @@ "message": "Anda", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Membalas ke $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": "Untuk mengirimkan pesan suara, izinkan Signal Desktop untuk mengakses mikrofon anda.", + "message": "Untuk mengirim pesan suara, izinkan Session mengakses mikrofon Anda.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Izinkan Akses", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Tunjukkan Pengaturan", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Batal", "description": "" }, - "failedToSend": { - "message": "Gagal mengirim. Cek sambungan jaringan Anda.", - "description": "" - }, "error": { "message": "Galat", "description": "" }, - "messageDetail": { - "message": "Detail Pesan", - "description": "" - }, "delete": { "message": "Hapus", "description": "" @@ -830,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Hapus pesan ini", + "message": "Hapus pesan", "description": "" }, "from": { - "message": "Dari", + "message": "Dari:", "description": "Label for the sender of a message" }, "to": { - "message": "to", + "message": "Kepada:", "description": "Label for the receiver of a message" }, "sent": { @@ -846,7 +694,7 @@ "description": "Label for the time a message was sent" }, "received": { - "message": "Menerima", + "message": "Diterima", "description": "Label for the time a message was received" }, "sendMessage": { @@ -854,25 +702,17 @@ "description": "Placeholder text in the message entry field" }, "groupMembers": { - "message": "Anggota Grup", - "description": "" - }, - "showMembers": { - "message": "Tampilkan anggota", + "message": "Anggota grup", "description": "" }, "resetSession": { - "message": "Mengatur ulang sesi", + "message": "Setel ulang sesi aman", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { "message": "Lihat nomor keamanan", "description": "" }, - "viewAllMedia": { - "message": "Lihat seluruh 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": "Jika Anda ingin memverifikasi keamanan enkripsi antarpengguna dengan $name$, bandingkan angka di atas dengan nomor di perangkat mereka.", "description": "", @@ -887,16 +727,8 @@ "message": "Anda belum mengirim pesan apapun dengan kontak ini. Nomor keamanan Anda dengan kontak ini akan tersedia sesaat setelah pesan pertama.", "description": "" }, - "moreInfo": { - "message": "Informasi Selengkapnya...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Mencoba mengirim kembali", - "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": "Hapus Pesan", + "message": "Hapus pesan", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -939,10 +771,6 @@ "message": "Simpan", "description": "" }, - "fileIconAlt": { - "message": "Ikon Berkas", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Gambar emoji dari '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Selamat datang di Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privasi itu mungkin. Signal membuatnya lebih mudah.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Sambungkan telpon Anda dengan Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Pengaturan Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Perangkat Tersambung", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Tombol", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "Sambungkan Perangkat Baru", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nama Perangkat", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Pilih nama perangkat Anda", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Selesaikan menghubungkan telepon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sinkronisasi dengan kontak dan grup", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Gagal menyambungkan ke peladen.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Maaf, Anda menautkan perangkat terlalu banyak. Coba hapus sebagian.", - "description": "" - }, - "settings": { - "message": "Pengaturan", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "message": "Kaitkan perangkat baru", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Perizinan", @@ -1029,34 +801,6 @@ "message": "Aktifkan pengecek ejaan dalam kotak pesan", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Bersihkan data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Ini akan menghapus semua data dalam aplikasi, membuang seluruh pesan dan informasi akun terpisah.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Bersihkan data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Hapus semua data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Anda akan menghapus semua informasi dari akun Anda dalam aplikasi ini, termasuk semua kontak dan pesan. Anda selalu dapat menghubungkan dengan perangkat seluler Anda lagi, tetapi itu tidak akan memulihkan pesan yang dihapus.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Hapus seluruh data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Putuskan sambungan dan hapuskan semua data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Pemberitahuan", "description": "Header for notification settings" @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Matikan pemberitahuan", + "message": "Bisukan pemberitahuan", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +834,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Terkini dari:", + "message": "Paling baru dari: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,23 +846,15 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Pengiriman gagal", + "message": "Gagal Mengirim", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detail", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Sembunyikan detail", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Pelajari lebih jauh tentang verifikasi nomor keamanan", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Versi Signal Desktop ini telah kedaluwarsa. Mohom memutakhirkan ke versi terbaru untuk melanjutkan pengiriman pesan.", + "message": "Versi Session Desktop ini telah kedaluwarsa. Mohom memutakhirkan ke versi terbaru untuk melanjutkan pengiriman pesan.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1126,39 +862,11 @@ "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "Pesan berisi media", + "message": "Pesan media", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nomor tidak terdaftar", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontak", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Impor semua grup Signal dan kontak dari semua perangkat mobil Anda.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Impor terakhir pada", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Impor sekarang", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Impor ...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Impor gagal. Pastikan komputer dan perangkat Anda tersambung ke jaringan internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "sekarang", + "message": "Sekarang", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1 jam", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ jam", - "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$ jam yang lalu", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ menit", - "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$ menit yang lalu", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "sekarang", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1226,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Anda mengatur pesan menghilang dalam waktu $time$", + "message": "Anda mengatur pesan menghilang dalam $time$", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ atur pesan menghilang dalam waktu $time$", + "message": "$name$ atur pesan menghilang menjadi $time$", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +924,7 @@ } }, "timerOption_0_seconds": { - "message": "padam", + "message": "Mati", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1308,7 +972,7 @@ "description": "Label for a selectable option in the message expiration timer menu" }, "disappearingMessages": { - "message": "Menghilangkan pesan", + "message": "Pesan hilang", "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { @@ -1364,7 +1028,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$menonaktifkan pesan menghilang", + "message": "$name$ menonaktifkan pesan menghilang.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Anda menonaktifkan pesan menghilang", + "message": "Anda menonaktifkan pesan menghilang.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Setel pengatur waktu ke $time$", + "message": "Waktu pesan hilang diatur ke $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1387,16 +1051,12 @@ } } }, - "audioNotificationDescription": { - "message": "Mainkan suara pemberitahuan", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { - "message": "Angka keamanan telah diganti", + "message": "Nomor keamanan berubah", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Angka keamanan dengan $name$ telah diganti", + "message": "Angka keamanan anda dengan $name$ telah berubah.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "Verifikasi Nomor Keamanan", + "message": "Periksa angka keamanan", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Terang", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Masukkan nomor telepon untuk menambahkan kontak.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Nomor salah", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Sambungkan kembali Signal Desktop ke perangkat mobil Anda untuk melanjutkan pesan.", - "description": "" - }, - "unlinked": { - "message": "Tidak tersambung", - "description": "" - }, - "relink": { - "message": "Sambungkan kembali", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Tersedia Session versi terbaru", "description": "" @@ -1476,11 +1108,11 @@ "description": "" }, "autoUpdateLaterButtonLabel": { - "message": "Selanjutnya", + "message": "Nanti", "description": "" }, "leftTheGroup": { - "message": "$name$ telah meninggalkan grup", + "message": "$name$ telah meninggalkan grup.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Judul sekarang adalah '$name$'", + "message": "Nama grup sekarang '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ bergabung dalam group", + "message": "$name$ bergabung dengan grup", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,245 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Istilah & Kebijakan Privasi" + }, + "unknown": { + "message": "Tidak dikenal" + }, + "changedSinceVerifiedTitle": { + "message": "Nomor keamanan berubah" + }, + "youMayWishToVerifyContact": { + "message": "Mungkin sebaiknya Anda memastikan angka keamanan dengan kontak ini." + }, + "about": { + "message": "Tentang" + }, + "settingsHeader": { + "message": "Pengaturan" + }, + "continue": { + "message": "Lanjutkan" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Maaf, Anda memiliki terlalu banyak perangkat yang terhubung, coba buang beberapa" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Permintaan penautan diterima" + }, + "waitingForDeviceToRegister": { + "message": "Menunggu perangkat" + }, + "pairNewDevicePrompt": { + "message": "Pindai kode QR yang tertera pada perangkat ke tautan" + }, + "noPairedDevices": { + "message": "Tidak ada perangkat yang terhubung" + }, + "deviceUnpaired": { + "message": "Sukses memutus perangkat" + }, + "sendMessageLeftGroup": { + "message": "Anda telah keluar dari grup." + }, + "moreInformation": { + "message": "Informasi lebih lanjut" + }, + "resend": { + "message": "Kirim ulang" + }, + "clearAllData": { + "message": "Hapus semua data" + }, + "deleteAccountWarning": { + "message": "Pesan, Session, dan kontak anda akan dihapus secara permanen" + }, + "deleteContactConfirmation": { + "message": "Apakah anda yakin ingin menghapus percakapan ini?" + }, + "copy": { + "message": "Salin" + }, + "linkPreviewsTitle": { + "message": "Kirim pratinjau tautan" + }, + "readReceiptSettingTitle": { + "message": "Pesan terbaca" + }, + "typingIndicatorsSettingTitle": { + "message": "Indikator penulisan" + }, + "themeToggleTitle": { + "message": "Terang" + }, + "successUnlinked": { + "message": "Sukses memutus koneksi perangkat" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Unduh" + }, + "blockUser": { + "message": "Blokir" + }, + "unblockUser": { + "message": "Buka blokir" + }, + "blockedSettingsTitle": { + "message": "Kontak yang diblokir" + }, + "leaveGroup": { + "message": "Keluar grup" + }, + "leaveGroupConfirmation": { + "message": "Apakah anda yakin ingin meninggalkan grup ini?" + }, + "noContactsForGroup": { + "message": "anda belum memiliki kontak" + }, + "editGroup": { + "message": "Ubah grup" + }, + "updateGroupDialogTitle": { + "message": "Memperbarui $name$..." + }, + "showRecoveryPhrase": { + "message": "Kata pemulihan" + }, + "yourSessionID": { + "message": "Session ID anda" + }, + "recoveryPhraseSavePromptMain": { + "message": "Kata pemulihan adalah kunci Session ID -- bisa digunakan untuk mengembalikan Session ID ketika anda kehilangan perangkat. Simpan kata pemulihan di tempat yang aman dan jangan berikan kepada siapapun" + }, + "copiedToClipboard": { + "message": "Salin ke clipboard" + }, + "unlock": { + "message": "Buka Kunci" + }, + "connectToServerFail": { + "message": "Tak bisa bergabung dengan grup" + }, + "connectingToServer": { + "message": "Menghubungkan..." + }, + "remove": { + "message": "Hapus" + }, + "invalidSessionId": { + "message": "Session salah" + }, + "emptyGroupNameError": { + "message": "Masukkan nama grup" + }, + "groupNamePlaceholder": { + "message": "Nama grup" + }, + "inviteContacts": { + "message": "Undang teman" + }, + "yourUniqueSessionID": { + "message": "Ucapkan halo pada Session ID anda" + }, + "allUsersAreRandomly...": { + "message": "Session ID adalah alamat unik yang bisa digunakan untuk mengontak anda. Tanpa koneksi dengan identitas asli, Session ID anda didesain bersifat anonim dan rahasia." + }, + "generateSessionID": { + "message": "Buat Session ID" + }, + "recoveryPhrase": { + "message": "Kata pemulihan" + }, + "enterRecoveryPhrase": { + "message": "masukan kata pemulihan" + }, + "enterDisplayName": { + "message": "Masukkan nama" + }, + "enterSessionIDHere": { + "message": "Masuk ke Session ID" + }, + "continueYourSession": { + "message": "Lanjutkan Session" + }, + "linkDevice": { + "message": "Tautkan perangkat" + }, + "restoreUsingRecoveryPhrase": { + "message": "Kembalikan akun" + }, + "newSession": { + "message": "Session baru" + }, + "searchFor...": { + "message": "Cari untuk percakapan, daftar kontak dan pesan" + }, + "enterSessionID": { + "message": "Masuk ke Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Masukkan Session ID penerima" + }, + "usersCanShareTheir...": { + "message": "Pengguna bisa membagikan Session ID miliknya dengan masuk ke pengaturan akun dan mengetuk \"Bagikan Session ID\" atau dengan membagikan kode QR mereka" + }, + "appearanceSettingsTitle": { + "message": "Penampilan" + }, + "privacySettingsTitle": { + "message": "Privasi" + }, + "notificationsSettingsTitle": { + "message": "Pemberitahuan" + }, + "devicesSettingsTitle": { + "message": "Perangkat terkait" + }, + "recoveryPhraseEmpty": { + "message": "masukan kata pemulihan" + }, + "displayNameEmpty": { + "message": "Pilih nama yang ditampilkan" + }, + "joinOpenGroup": { + "message": "Gabung ke grup terbuka" + }, + "newClosedGroup": { + "message": "Grup tertutup baru" + }, + "createClosedGroupNamePrompt": { + "message": "Nama grup" + }, + "createClosedGroupPlaceholder": { + "message": "Masukkan nama grup" + }, + "openGroupURL": { + "message": "Buka URL grup" + }, + "enterAnOpenGroupURL": { + "message": "Masukkan sebuah URL grup terbuka" + }, + "next": { + "message": "Berikutnya" + }, + "pairingDevice": { + "message": "Mengaitkan perangkat" + }, + "invalidGroupNameTooShort": { + "message": "Masukkan nama grup" + }, + "invalidGroupNameTooLong": { + "message": "Masukkan nama grup yang lebih pendek" + }, + "pickClosedGroupMember": { + "message": "Pilih setidaknya 2 anggota grup" + }, + "closedGroupMaxSize": { + "message": "Grup tertutup maksimal berisi 20 anggota" + }, + "noBlockedContacts": { + "message": "Tidak ada kontak yang diblokir" } -} +} \ No newline at end of file diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 4f97ab256..1f19d5d2c 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -3,18 +3,10 @@ "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." @@ -24,7 +16,7 @@ "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": "&Vista", + "message": "&Vedi", "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": { @@ -35,10 +27,6 @@ "message": "&Aiuto", "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": "Preferenze...", - "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": "Nascondi", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Termina Signal", + "message": "Termina Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -84,7 +72,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Seleziona tutto", + "message": "Seleziona Tutto", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -135,10 +123,6 @@ "message": "Configura con l'importazione", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configura come nuovo dispositivo", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Imposta come dispositivo autonomo", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Scegli file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carica i tuoi dati", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Hai appena completato il processo di esportazione e i tuoi contatti e i tuoi messaggi sono in attesa sul tuo computer. Seleziona la cartella che contiene i dati di Signal salvati.", + "message": "Hai appena completato il processo di esportazione e i tuoi contatti e i tuoi messaggi sono in attesa sul tuo computer. Seleziona la cartella che contiene i dati di Session salvati.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Controlla di aver scelto la cartella corretta che contiene i tuoi dati di Signal. Il suo nome dovrebbe iniziare con \"Signal Export\". Puoi anche salvare una nuova copia dei tuoi dati dall'applicazione Chrome.", + "message": "Controlla di aver scelto la cartella corretta che contiene i tuoi dati di Session. Il suo nome dovrebbe iniziare con \"Session Export\". Puoi anche salvare una nuova copia dei tuoi dati dall'applicazione Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,61 +186,31 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Inizia ad usare Signal Desktop", + "message": "Inizia ad usare Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Collega questo dispositivo con il tuo telefono", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "il percorso selezionato", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Aggiornamento database. Questo potrebbe richiedere del tempo...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Caricamento messaggi. Finora $count$...", - "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": "Me", "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Mostra", + "message": "Vedi", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Hai lasciato il gruppo", + "message": "Hai lasciato il gruppo.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scorri verso la fine della conversazione", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nuovo messaggio a seguire", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nuovi messaggi a seguire", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { - "message": "1 messaggio non letto", + "message": "$count$ Messaggio Non Letto", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ messaggi non letti", + "message": "$count$ Messaggi Non Letti", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "Hai segnato il numero di sicurezza con $name$ come verificato", + "message": "Hai segnato il codice di sicurezza con $name$ come verificato", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Hai segnato il numero di sicurezza con $name$ come non verificato", + "message": "Hai segnato il codice di sicurezza con $name$ come non verificato", "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": { @@ -306,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Hai segnato il numero di sicurezza con $name$ come verificato da un altro dispositivo", + "message": "Hai segnato il codice di sicurezza con $name$ come verificato da un altro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Hai segnato il numero di sicurezza con $name$ come non verificato da un altro dispositivo", + "message": "Hai segnato il codice di sicurezza con $name$ come non verificato da un altro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -330,11 +264,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": "Il codice di sicurezza con più membri del gruppo è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che hanno semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza con più membri del gruppo è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che hanno semplicemente reinstallato Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Il codice di sicurezza con $name$ è cambiato dall'ultima verifica. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Il codice di sicurezza che stai cercando di verificare è cambiato. Si prega di ri-verificarlo con $name$. Ricorda che questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza che stai cercando di verificare è cambiato. Si prega di ri-verificarlo con $name$. Ricorda che questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Di recente il codice di sicurezza con più membri del gruppo è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che hanno semplicemente reinstallato Signal.", + "message": "Di recente il codice di sicurezza con più membri del gruppo è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che hanno semplicemente reinstallato Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Di recente il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che il $name$ ha semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che il $name$ ha semplicemente reinstallato Session.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Capito!", + "message": "Capito", "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": "Invia", "description": "" }, - "acceptNewKey": { - "message": "Accetta", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Segna come verificato", "description": "" @@ -428,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Hai verificato il codice di sicurezza con $name$.", + "message": "Hai segnato il codice di sicurezza con $name$ come verificato", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -455,10 +385,6 @@ "message": "Nuovo codice di sicurezza", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Il codice di sicurezza con questo contatto è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che il contatto ha semplicemente reinstallato Signal.", - "description": "" - }, "incomingError": { "message": "Errore messaggio in arrivo", "description": "" @@ -468,7 +394,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Non hai alcun media in questa conversazione", + "message": "Nessun file multimediale", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +402,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Non hai alcun documento in questa conversazione", + "message": "Nessun documento", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,25 +414,13 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Questa settimana", + "message": "Questa Settimana", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Questo mese", + "message": "Questo Mese", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipo di allegato non supportato. Clicca per salvare.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Clicca per salvare", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "File senza nome", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Messaggio vocale", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Il tipo di allegato non è consentito per ragioni di sicurezza", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Caricamento anteprima...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Miniatura temporanea anteprima link per $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatura anteprima link per $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Spiacente, il file selezionato supera la dimensione predefinita per il messaggio.", + "message": "L'allegato che stai cercando di inviare supera le dimensioni consentite", "description": "" }, "unableToLoadAttachment": { - "message": "Non è stato possibile caricare l'allegato selezionato.", + "message": "Attenzione, c'è stato un errore nell'inviare il tuo allegato.", "description": "" }, - "disconnected": { - "message": "Sconnesso", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "In collegamento", + "message": "Connessione in corso...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "Vai alle note di rilascio", "description": "" }, - "goToForums": { - "message": "Vai ai forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Vai alla pagina di supporto", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Segnala un problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferenze di Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Informazioni su Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Parlato", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,24 +529,12 @@ "message": "Mostra", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Nascondi", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Esci", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Cerca", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Nessun risultato per \"$searchTerm$\"", + "message": "Nessun risultato trovato per \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Benvenuto in Signal", - "description": "" - }, - "selectAContact": { - "message": "Per iniziare una chat seleziona un contatto o un gruppo.", + "message": "Benvenuto su Session", "description": "" }, "typingAlt": { @@ -695,20 +573,16 @@ } } }, - "sendMessageToContact": { - "message": "Invia messaggio", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { - "message": "casa", + "message": "Casa", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "lavoro", + "message": "Lavoro", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "telefono", + "message": "Cellulare", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -759,28 +633,14 @@ "message": "Tu", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Rispondendo a $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": "Per inviare messaggi audio, concedi l'accesso al tuo microfono a Signal Desktop", + "message": "Per poter mandare un messaggio audio, permetti a Session di accedere al tuo microfono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Consenti accesso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostra le impostazioni", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Annulla", "description": "" }, - "failedToSend": { - "message": "Invio fallito per alcuni destinatari. Controllare la connessione di rete.", - "description": "" - }, "error": { "message": "Errore", "description": "" }, - "messageDetail": { - "message": "Dettagli messaggio", - "description": "" - }, "delete": { "message": "Cancella", "description": "" @@ -830,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Cancella il messaggio", + "message": "Cancella messaggio", "description": "" }, "from": { - "message": "Da", + "message": "Da:", "description": "Label for the sender of a message" }, "to": { - "message": "a", + "message": "A:", "description": "Label for the receiver of a message" }, "sent": { @@ -857,22 +705,14 @@ "message": "Membri del gruppo", "description": "" }, - "showMembers": { - "message": "Mostra membri", - "description": "" - }, "resetSession": { - "message": "Resetta sessione", + "message": "Azzera La Sessione Sicura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Mostra numero di sicurezza", + "message": "Mostra Codice Di Sicurezza", "description": "" }, - "viewAllMedia": { - "message": "Guarda tutti i 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": "Se desideri verificare la sicurezza della tua codifica end-to-end con $name$, confronta i numeri qui sopra con quelli del suo dispositivo.", "description": "", @@ -887,16 +727,8 @@ "message": "Non hai ancora scambiato alcun messaggio con questo contatto. Il codice di sicurezza sarà disponibile dopo il primo messaggio.", "description": "" }, - "moreInfo": { - "message": "Maggiori informazioni...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Riprova a inviare", - "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": "Elimina messaggio", + "message": "Cancella Messaggio", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -939,10 +771,6 @@ "message": "Salva", "description": "" }, - "fileIconAlt": { - "message": "Icona del file", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji immagine di '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Benvenuto in Signal per Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "La privacy è possibile. Signal la rende facile.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Collega il tuo telefono a Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Impostazioni di Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispositivi collegati", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Bottone \"+\"", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "Collega un nuovo dispositivo", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nome del dispositivo", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Scegliere il nome di questo dispositivo", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Completa il collegamento del telefono", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronizzazione contatti e gruppi", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Connessione al server non riuscita.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Spiacente, hai troppi dispositivi collegati. Prova a rimuoverne qualcuno.", - "description": "" - }, - "settings": { - "message": "Impostazioni", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "message": "Collega Nuovo Dispositivo", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permessi", @@ -1029,34 +801,6 @@ "message": "Abilita il controllo ortografico del testo inserito nella casella di composizione", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Rimuovi dati", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Questo rimuoverà tutti i dati dell'applicazione, compresi i messaggi e le informazioni dell'account.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Rimuovi dati", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Cancellare tutti i dati?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Stai per cancellare tutti i dati salvati nell'applicazione, compresi i contatti e i messaggi. Potrai sempre ricollegare il tuo dispositivo mobile, ma questo non ripristinerà i messaggi cancellati.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Cancella tutti i dati", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnessione e cancellazione di tutti i dati", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notifiche", "description": "Header for notification settings" @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Disabilita notifiche", + "message": "Silenzia notifiche", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +834,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Più recente da:", + "message": "Il più recente da: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,23 +846,15 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Invio non riuscito", + "message": "Invio Non Riuscito", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Dettagli", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Nascondi dettagli", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Scopri di più sulla verifica dei codici di sicurezza", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Questa versione di Signal Desktop è scaduta. Per continuare a chattare aggiornala all'ultima versione.", + "message": "Questa versione di Session Desktop è scaduta. Per continuare a chattare aggiornala all'ultima versione.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,36 +865,8 @@ "message": "Messaggio multimediale", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Il numero non è registrato", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contatti", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importa dal tuo dispositivo mobile tutti i contatti e i gruppi Signal.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Ultima importazione il", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importa ora", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importazione...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importazione fallita. Assicurati che il tuo computer e il tuo telefono siano connessi a Internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "ora", + "message": "Ora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1 ora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ ore", - "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$ ore fa", - "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$ minuti fa", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ora", - "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'." @@ -1226,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Hai impostato il timer dei messaggi a scomparsa a $time$", + "message": "Hai settato i messaggi a scomparsa a $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ ha impostato il timer dei messaggi a scomparsa a $time$", + "message": "$name$ ha settato i messaggi a scomparsa a $time$", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +924,7 @@ } }, "timerOption_0_seconds": { - "message": "off", + "message": "Spenti", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1364,7 +1028,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ ha disabilitato i messaggi a scomparsa", + "message": "$name$ ha disabilitato i messaggi a scomparsa.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Hai disabilitato i messaggi a scomparsa", + "message": "Hai disabilitato i messaggi a scomparsa.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Timer settato a $time$", + "message": "La scomparsa dei messaggi è settata a $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1387,16 +1051,12 @@ } } }, - "audioNotificationDescription": { - "message": "Avvia notifica audio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { - "message": "Il numero di sicurezza è cambiato", + "message": "Codice di sicurezza cambiato", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Il numero di sicurezza con $name$ è cambiato", + "message": "Il codice di sicurezza con $name$ è cambiato.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "Verifica numero di sicurezza", + "message": "Verifica Numero Sicuro.", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Chiaro", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 una nuova conversazione...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Scrivi un numero da aggiungere ai contatti", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Numero non valido", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Per continuare a scrivere messaggi ricollega Signal Desktop al tuo dispositivo mobile.", - "description": "" - }, - "unlinked": { - "message": "Scollegato", - "description": "" - }, - "relink": { - "message": "Ricollegato", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Aggiornamento Session disponibile", "description": "" @@ -1476,11 +1108,11 @@ "description": "" }, "autoUpdateLaterButtonLabel": { - "message": "Dopo", + "message": "Più tardi", "description": "" }, "leftTheGroup": { - "message": "$name$ ha lasciato il gruppo", + "message": "$name$ ha lasciato il gruppo.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Il titolo ora è \"$name$\"", + "message": "Il nome del gruppo è ora '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ si è unito al gruppo", + "message": "$name$ fa ora parte del gruppo.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ si sono uniti al gruppo", + "message": "$name$ fanno ora parte del gruppo.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,248 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Termini e Politica sulla privacy" + }, + "unknown": { + "message": "Sconosciuto" + }, + "changedSinceVerifiedTitle": { + "message": "Codice Di Sicurezza Cambiato" + }, + "youMayWishToVerifyContact": { + "message": "Dovresti verificare il codice di sicurezza con questo contatto." + }, + "about": { + "message": "A riguardo" + }, + "settingsHeader": { + "message": "Impostazioni" + }, + "continue": { + "message": "Continua" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Limite del dispositivo raggiunto" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Siamo spiacenti, hai troppi dispositivi connessi, prova a scollegarne qualcuno" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Richiesta di collegamento ricevuta" + }, + "waitingForDeviceToRegister": { + "message": "In attesa del dispositivo" + }, + "pairNewDevicePrompt": { + "message": "Scansiona il codice QR visualizzato sul dispositivo da collegare" + }, + "noPairedDevices": { + "message": "Nessun dispositivo collegato" + }, + "deviceUnpaired": { + "message": "Il dispositivo è stato scollegato correttamente" + }, + "sendMessageLeftGroup": { + "message": "Hai lasciato il gruppo." + }, + "moreInformation": { + "message": "Maggiori informazioni" + }, + "resend": { + "message": "Reinvia" + }, + "clearAllData": { + "message": "Elimina tutti i dati" + }, + "deleteAccountWarning": { + "message": "Ciò eliminerà permanentemente i tuoi messaggi, sessioni e contatti." + }, + "deleteContactConfirmation": { + "message": "Sei sicuro di voler eliminare questa conversazione?" + }, + "copy": { + "message": "Copia" + }, + "linkPreviewsTitle": { + "message": "Invia Anteprime Dei Link" + }, + "linkPreviewDescription": { + "message": "Le anteprime sono supportate per link di Imgur, Instagram, Pinterest, Reddit e YouTube." + }, + "readReceiptSettingTitle": { + "message": "Conferme Di Lettura" + }, + "typingIndicatorsSettingTitle": { + "message": "Indicatori Di Scrittura" + }, + "themeToggleTitle": { + "message": "Chiaro" + }, + "successUnlinked": { + "message": "Il dispositivo è stato scollegato correttamente" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Scarica" + }, + "blockUser": { + "message": "Blocca" + }, + "unblockUser": { + "message": "Sblocca" + }, + "blockedSettingsTitle": { + "message": "Contatti bloccati" + }, + "leaveGroup": { + "message": "Abbandona Il Gruppo" + }, + "leaveGroupConfirmation": { + "message": "Sei sicuro di voler lasciare questo gruppo?" + }, + "noContactsForGroup": { + "message": "Non hai ancora nessun contatto" + }, + "editGroup": { + "message": "Modifica gruppo" + }, + "updateGroupDialogTitle": { + "message": "Aggiornamento $name$..." + }, + "showRecoveryPhrase": { + "message": "Frase di recupero" + }, + "yourSessionID": { + "message": "La tua Sessione ID" + }, + "recoveryPhraseSavePromptMain": { + "message": "La frase di recupero è la chiave principale per la Sessione ID: puoi usarla per ripristinare la Sessione ID se perdi l'accesso al dispositivo. Conserva la frase di recupero in un luogo sicuro e non rivelarla a nessuno." + }, + "copiedToClipboard": { + "message": "Copiato negli appunti" + }, + "unlock": { + "message": "Sblocca" + }, + "connectToServerFail": { + "message": "Impossibile unirsi al gruppo" + }, + "connectingToServer": { + "message": "Connessione in corso..." + }, + "remove": { + "message": "Elimina" + }, + "invalidSessionId": { + "message": "Sessione ID non valido" + }, + "emptyGroupNameError": { + "message": "Inserisci un nome per il gruppo" + }, + "groupNamePlaceholder": { + "message": "Nome Del Gruppo" + }, + "inviteContacts": { + "message": "Invita Amici" + }, + "yourUniqueSessionID": { + "message": "Ecco la tua Sessione ID" + }, + "allUsersAreRandomly...": { + "message": "La Sessione ID è l'indirizzo univoco che le persone possono utilizzare per contattarti su una Sessione. Senza alcuna connessione con la tua vera identità, la Sessione ID è totalmente anonimo e privato fin dal incezione." + }, + "generateSessionID": { + "message": "Crea Sessione ID" + }, + "recoveryPhrase": { + "message": "Frase di recupero" + }, + "enterRecoveryPhrase": { + "message": "Inserisci la frase di recupero" + }, + "enterDisplayName": { + "message": "Inserisci il nome da visualizzare" + }, + "enterSessionIDHere": { + "message": "Inserisci la Sessione ID" + }, + "continueYourSession": { + "message": "Continua la Sessione" + }, + "linkDevice": { + "message": "Collega dispositivo" + }, + "restoreUsingRecoveryPhrase": { + "message": "Ripristina il tuo account" + }, + "newSession": { + "message": "Nuova sessione" + }, + "searchFor...": { + "message": "Cerca conversazioni, contatti e messaggi" + }, + "enterSessionID": { + "message": "Inserisci la Sessione ID" + }, + "enterSessionIDOfRecipient": { + "message": "Inserisci la Sessione ID del destinatario" + }, + "usersCanShareTheir...": { + "message": "Gli utenti possono condividere la propria Sessione ID accedendo alle impostazioni del proprio account e toccando Condividi la Sessione ID o condividendo il proprio codice QR." + }, + "appearanceSettingsTitle": { + "message": "Aspetto" + }, + "privacySettingsTitle": { + "message": "Privacy" + }, + "notificationsSettingsTitle": { + "message": "Notifiche" + }, + "devicesSettingsTitle": { + "message": "Dispositivi collegati" + }, + "recoveryPhraseEmpty": { + "message": "Inserisci la frase di recupero" + }, + "displayNameEmpty": { + "message": "Scegli il nome da visualizzare" + }, + "joinOpenGroup": { + "message": "Unisciti a un gruppo aperto" + }, + "newClosedGroup": { + "message": "Nuovo gruppo chiuso" + }, + "createClosedGroupNamePrompt": { + "message": "Nome Del Gruppo" + }, + "createClosedGroupPlaceholder": { + "message": "Inserisci un nome per il gruppo" + }, + "openGroupURL": { + "message": "Apri l'URL del gruppo" + }, + "enterAnOpenGroupURL": { + "message": "Inserisci l'URL di un gruppo aperto" + }, + "next": { + "message": "Avanti" + }, + "pairingDevice": { + "message": "Collegamento Dispositivo" + }, + "invalidGroupNameTooShort": { + "message": "Inserisci un nome per il gruppo" + }, + "invalidGroupNameTooLong": { + "message": "Inserisci un nome gruppo più breve" + }, + "pickClosedGroupMember": { + "message": "Scegli almeno 2 membri del gruppo" + }, + "closedGroupMaxSize": { + "message": "Un gruppo chiuso non può avere più di 20 membri" } -} +} \ No newline at end of file diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 1b60fd00f..e5b9a9225 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -3,18 +3,10 @@ "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." @@ -24,7 +16,7 @@ "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": "表示 (&V)", + "message": "見る (&V)", "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": { @@ -35,10 +27,6 @@ "message": "ヘルプ (&H)", "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": "設定...", - "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": "最小化", "description": "Application menu command to hide the window" @@ -68,7 +56,7 @@ "description": "Edit menu command to remove selected text and add it to clipboard" }, "editMenuCopy": { - "message": "コピー", + "message": "コピーする", "description": "Edit menu command to add selected text to clipboard" }, "editMenuPaste": { @@ -80,7 +68,7 @@ "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { - "message": "削除する", + "message": "削除", "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { @@ -135,16 +123,12 @@ "message": "インポートデータを使ってセットアップ", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "新しいデバイスとしてセットアップ", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "独立したデバイスとして設定", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" }, "loading": { - "message": "読み込んでいます", + "message": "読込中...", "description": "Message shown on the loading screen before we've loaded any messages" }, "optimizingApplication": { @@ -161,30 +145,10 @@ } } }, - "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", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "データを読み込む", "description": "Header shown on the first screen in the data import process" @@ -222,61 +186,31 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Signal Desktopを使い始める", + "message": "Session Desktopを使い始める", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "この端末をモバイル端末とリンクする", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "選択したフォルダ", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "データベースを更新しています。しばらく掛かるかも知れません。", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "メッセージを読み込んでいます。今のところ$count$通です。", - "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": "自分", "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "表示", + "message": "見る", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "グループを退出しました。", + "message": "グループを抜けました", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "一番下までスクロール", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "新着メッセージ", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "新着メッセージ", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { - "message": "1 件の未読メッセージ", + "message": "$count$通の未読メッセージ", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ 件の未読メッセージ", + "message": "$count$通の未読メッセージ", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "$name$との安全番号を検証済みにしました", + "message": "$name$に対する安全番号を検証済みにしました", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "$name$との安全番号を未検証にしました", + "message": "$name$に対する安全番号を未検証にしました", "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": { @@ -306,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "$name$との安全番号を他の端末で検証済みにしました", + "message": "$name$に対する安全番号を他端末で検証済みにしました", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "$name$との安全番号を他の端末で未検証にしました", + "message": "$name$に対する安全番号を他端末で未検証にしました", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -334,7 +268,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "$name$との安全番号に変更があります。誰かが通信を傍受しようとしているかも知れませんし,$name$がSignalをインストールし直しただけかも知れません。", + "message": "$name$に対する安全番号が変更され、未検証となりました。だれかが通信を傍受しようとしているかも知れませんし、$name$がSessionを再インストールしただけかも知れません。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -358,7 +292,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "$name$との安全番号が最近変わりました。誰かが通信を傍受しているかも知れませんし,$name$がSignalをインストールし直しただけかも知れません。", + "message": "$name$との安全番号が変更されました。通信が傍受されている可能性がありますが,$name$がSessionを再インストールしただけかも知れません。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "了解", + "message": "分かりました", "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": "提出", + "message": "送信する", "description": "" }, - "acceptNewKey": { - "message": "受け入れる", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "検証済みにする", "description": "" @@ -428,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "$name$との安全番号を検証しました", + "message": "$name$に対する安全番号を検証済みにしました", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -455,10 +385,6 @@ "message": "新しい安全番号", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "このコンタクトとの安全番号が変わりました。誰かがこの会話を盗聴しようとしていることか、コンタクトはただ、Signalをまたインストールしたの2つの理由となります。以下の安全番号を確認してください。", - "description": "" - }, "incomingError": { "message": "受信中にエラー", "description": "" @@ -468,15 +394,15 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "この会話にはメディアがありません", + "message": "メディアがありません", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { - "message": "文書", + "message": "ドキュメント", "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "この会話にはドキュメントがありません", + "message": "ドキュメントが見つかりません", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -495,18 +421,6 @@ "message": "今月", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "サポートされていない種類の添付ファイルです。クリックして保存してください。", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "クリックして保存", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "無名のファイル", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "音声メッセージ", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "セキュリティ上の理由で許可されていない種類の添付ファイルです", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "選択したファイルが大きすぎます", + "message": "添付ファイルのサイズが上限を超えています", "description": "" }, "unableToLoadAttachment": { - "message": "選択された添付ファイルをロードできません。", + "message": "添付中にエラーが発生しました。", "description": "" }, - "disconnected": { - "message": "接続オフ", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "接続完了", + "message": "接続中...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "リリースノートを閲覧", "description": "" }, - "goToForums": { - "message": "フォーラムに参加", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "サポートページへ", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "バグを報告", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop設定", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Signal Desktop とは", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "スピーチ", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,24 +529,12 @@ "message": "表示", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "最小化", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "終了", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "検索", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "No results for \"$searchTerm$\"", + "message": "「%s」に一致する情報は見つかりませんでした。", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Signalにようこそ", - "description": "" - }, - "selectAContact": { - "message": "会話を始めるには連絡先かグループを選択してください", + "message": "Sessionにようこそ", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "メッセージ送信", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "自宅", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -740,11 +614,11 @@ "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { - "message": "元のメッセージを見つけれません", + "message": "元のメッセージが見つかりません", "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" }, "originalMessageNotAvailable": { - "message": "元のメッセージは入手できません", + "message": "元のメッセージはすでに削除されています", "description": "Shown in toast if user clicks on quote that references message no longer in database" }, "messageFoundButNotLoaded": { @@ -756,31 +630,17 @@ "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { - "message": "自分", + "message": "あなた", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "$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": "音声メッセージを送るには、Signalのマイクへのアクセスを許可してください。", + "message": "音声メッセージを送るには、Sessionのマイクへのアクセスを許可してください。", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "アクセスを許可する", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "設定を表示", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "音声", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,20 +665,12 @@ "message": "キャンセル", "description": "" }, - "failedToSend": { - "message": "宛先の一部で送信に失敗しました。ネットワークの接続をチェックしてください。", - "description": "" - }, "error": { "message": "エラー", "description": "" }, - "messageDetail": { - "message": "メッセージ詳細", - "description": "" - }, "delete": { - "message": "削除する", + "message": "削除", "description": "" }, "deleteWarning": { @@ -830,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "このメッセージを削除する", + "message": "メッセージの削除", "description": "" }, "from": { - "message": "差出人", + "message": "From:", "description": "Label for the sender of a message" }, "to": { - "message": "to", + "message": "To:", "description": "Label for the receiver of a message" }, "sent": { @@ -854,25 +702,17 @@ "description": "Placeholder text in the message entry field" }, "groupMembers": { - "message": "グループのメンバー", - "description": "" - }, - "showMembers": { - "message": "メンバーを表示する", + "message": "グループメンバー", "description": "" }, "resetSession": { - "message": "接触を再設定", + "message": "安全なセッションをリセット", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "安全番号を表示する", + "message": "安全番号を見る", "description": "" }, - "viewAllMedia": { - "message": "すべてのメディアを表示", - "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": "$name$との端末間暗号の安全性を検証するには,上記の番号が相手端末上の番号と同じか確認してください。", "description": "", @@ -887,16 +727,8 @@ "message": "このコンタクトとまだメッセージを交換していません。最初のメッセージから安全番号は交換します。", "description": "" }, - "moreInfo": { - "message": "詳細...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "再送信する", - "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": "メッセージを削除", + "message": "メッセージの削除", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -939,10 +771,6 @@ "message": "保存", "description": "" }, - "fileIconAlt": { - "message": "ファイルのアイコン", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "「$title$」の絵文字画像", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Signal Desktopにようこそ", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "プライバシーは守れます。Signalを使えば簡単に。", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "モバイル端末をSignal Desktopにリンクする", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signalの設定", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "リンクされた端末", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' ボタン", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "新規の端末をリンクする", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "デバイス名", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "この端末の名前を選択", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "モバイル端末とのリンクを終了", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "連絡先とグループを同期中", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "サーバーに接続できませんでした", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "結び付けているデバイスが多すぎます。どれかを切り離してください。", - "description": "" - }, - "settings": { - "message": "設定", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "テーマ", - "description": "Header for theme settings" + "message": "新しい端末を追加", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "アクセス許可", @@ -1029,34 +801,6 @@ "message": "メッセージボックスに入力されたテキストのスペルチェックを有効にする", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "データ消去", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "アプリケーション中のすべてのメッセージと、保存されたアカウント情報を削除します。", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "データを消去", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "すべてのデータを削除しますか?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "このアプリからすべてのアカウント情報を(連絡先とメッセージも含めて)削除します。また後で再びモバイルデバイスを追加できますが、削除されるメッセージを元に戻すことができません。", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "すべてのデータを削除", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "接続を切って全データを削除しています", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "通知", "description": "Header for notification settings" @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "通知をオフにする", + "message": "通知をミュート", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,11 +834,11 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "最近の連絡先から:", + "message": "最新の受信: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { - "message": "差出人:", + "message": "From:", "description": "Displayed in notifications when setting is 'name only' and one message is waiting" }, "notificationMostRecent": { @@ -1102,17 +846,9 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "送信できませんでした", + "message": "送信失敗", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "詳細", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "詳細を隠す", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "安全番号を確認することについて", "description": "Text that links to a support article on verifying safety numbers" @@ -1126,39 +862,11 @@ "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "メディアメッセージ", + "message": "メディアでのメッセージ", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "宛先の電話番号は登録されていません", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "連絡先", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Signalのグループと連絡先を携帯端末から取り込む", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "最近の取り込みは", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "取り込む", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "取り込み中……", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "取り込みに失敗しました。パソコンと携帯端末がインターネットに接続されているか確認してください。", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "1分以内", + "message": "今", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1時間", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$時間", - "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$時間前", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$分", - "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$分前", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "1分以内", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1226,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "消えるメッセージのタイマーを$time$に設定しました", + "message": "消えるメッセージの消去時間を$time$に設定しました", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$が消えるメッセージのタイマーを$time$に設定しました", + "message": "$name$が消えるメッセージの消去時間を$time$に設定しました", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1360,11 +1024,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "消えるメッセージを無効にされました", + "message": "消えるメッセージが無効にされました", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$が消えるメッセージを無効にしました", + "message": "$name$ が消えるメッセージを無効にしました。", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "消えるメッセージを無効にしました", + "message": "消えるメッセージを無効にしました。", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "タイマーが$time$に設定されました", + "message": "消えるメッセージの消去時間が$time$に設定されました", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1387,16 +1051,12 @@ } } }, - "audioNotificationDescription": { - "message": "音声通知を有効にする", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { - "message": "安全番号が変更されました", + "message": "安全番号が変わりました", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "$name$ との安全番号が変更されました", + "message": "$name$との安全番号が変わりました", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "安全番号を確認", + "message": "安全番号を検証する", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "ライト", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "ダーク", - "description": "Label text for dark theme" - }, "noteToSelf": { - "message": "自分のためのメモ", + "message": "自分用メモ", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "メニューバーを最小化", - "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": "電話番号を入力して連絡先を追加する", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "不正な番号です", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "メッセージを継続するために携帯端末と再接続する。", - "description": "" - }, - "unlinked": { - "message": "未接続", - "description": "" - }, - "relink": { - "message": "再接続", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Sessionのアップデートがあります", "description": "" @@ -1476,11 +1108,11 @@ "description": "" }, "autoUpdateLaterButtonLabel": { - "message": "あとで", + "message": "後で", "description": "" }, "leftTheGroup": { - "message": "$name$ がグループを退会しました", + "message": "$name$がグループを抜けました。", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1500,11 +1132,11 @@ } }, "updatedTheGroup": { - "message": "グループがアップデートされました", + "message": "グループが更新されました", "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "タイトルが '$name$' になりました", + "message": "グループ名が「$name$」になりました", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ がグループに参加しました", + "message": "$name$がグループに加わりました", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ がグループに参加しました", + "message": "$name$がグループに加わりました", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,251 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "使用条件とプライバシーポリシー" + }, + "unknown": { + "message": "不明" + }, + "changedSinceVerifiedTitle": { + "message": "安全番号が変わりました" + }, + "youMayWishToVerifyContact": { + "message": "この連絡先との安全番号を確認しておいた方がいいかも知れません。" + }, + "about": { + "message": "Sessionについて" + }, + "settingsHeader": { + "message": "設定" + }, + "continue": { + "message": "続行" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "デバイス制限に達しました" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "追加している端末が多すぎます。いくつか削除してください。" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "リンクリクエストを受け取りました" + }, + "waitingForDeviceToRegister": { + "message": "デバイス待ち" + }, + "pairNewDevicePrompt": { + "message": "追加する端末に表示されているQRコードをスキャンする" + }, + "noPairedDevices": { + "message": "追加されている端末はありません" + }, + "deviceUnpaired": { + "message": "デバイスは正常にリンク解除されました" + }, + "sendMessageLeftGroup": { + "message": "グループを抜けました" + }, + "moreInformation": { + "message": "詳細" + }, + "resend": { + "message": "再送" + }, + "clearAllData": { + "message": "すべてのデータを消去する" + }, + "deleteAccountWarning": { + "message": "これにより、メッセージ、Session、連絡先が完全に削除されます。" + }, + "deleteContactConfirmation": { + "message": "この会話を削除してもよろしいですか?" + }, + "copy": { + "message": "コピーする" + }, + "linkPreviewsTitle": { + "message": "リンクプレビューを送る" + }, + "linkPreviewDescription": { + "message": "プレビューはImgur、Instagram、Pinterest、RedditおよびYouTubeリンクをサポートしています" + }, + "readReceiptSettingTitle": { + "message": "既読通知" + }, + "typingIndicatorsSettingTitle": { + "message": "入力中アイコン" + }, + "themeToggleTitle": { + "message": "ライト" + }, + "successUnlinked": { + "message": "デバイスは正常にリンク解除されました" + }, + "autoUpdateDownloadButtonLabel": { + "message": "ダウンロード" + }, + "blockUser": { + "message": "ブロック" + }, + "unblockUser": { + "message": "ブロック解除" + }, + "blockedSettingsTitle": { + "message": "ブロックした連絡先" + }, + "leaveGroup": { + "message": "グループを抜ける" + }, + "leaveGroupConfirmation": { + "message": "このグループを退会しますか?" + }, + "noContactsForGroup": { + "message": "まだ連絡先がありません" + }, + "editGroup": { + "message": "グループを編集する" + }, + "updateGroupDialogTitle": { + "message": "$name$をアップデート中..." + }, + "showRecoveryPhrase": { + "message": "リカバリーフレーズ" + }, + "yourSessionID": { + "message": "あなたの Session ID" + }, + "recoveryPhraseSavePromptMain": { + "message": "リカバリーフレーズは、Session ID のマスターキーです。デバイスにアクセスできなくなった場合、これを使用して Session ID を復元できます。リカバリーフレーズを安全な場所に保管し、誰にも教えないでください。" + }, + "copiedToClipboard": { + "message": "クリップボードにコピーされました" + }, + "unlock": { + "message": "ロック解除" + }, + "connectToServerFail": { + "message": "グループに参加できませんでした" + }, + "connectingToServer": { + "message": "接続中..." + }, + "remove": { + "message": "削除" + }, + "invalidSessionId": { + "message": "Session ID が無効です" + }, + "emptyGroupNameError": { + "message": "グループ名を入力してください" + }, + "groupNamePlaceholder": { + "message": "グループ名" + }, + "inviteContacts": { + "message": "友達にオススメする" + }, + "yourUniqueSessionID": { + "message": "Session ID をご紹介します" + }, + "allUsersAreRandomly...": { + "message": "Session ID は、Session で連絡を取るために使用できる一意のアドレスです。本当のアイデンティティに関係なく、あなたの Session ID は設計上完全に匿名でプライベートです。" + }, + "generateSessionID": { + "message": "Session ID を作成する" + }, + "recoveryPhrase": { + "message": "リカバリーフレーズ" + }, + "enterRecoveryPhrase": { + "message": "リカバリーフレーズを入力してください" + }, + "enterDisplayName": { + "message": "表示名を入力してください" + }, + "enterSessionIDHere": { + "message": "Session ID を入力してください" + }, + "continueYourSession": { + "message": "Session を続ける" + }, + "linkDevice": { + "message": "デバイスをリンクする" + }, + "restoreUsingRecoveryPhrase": { + "message": "アカウントを復元する" + }, + "newSession": { + "message": "新しい Session" + }, + "searchFor...": { + "message": "会話やメッセージ、連絡先を検索します。" + }, + "enterSessionID": { + "message": "Session ID を入力してください" + }, + "enterSessionIDOfRecipient": { + "message": "受信者の Session ID を入力してください" + }, + "usersCanShareTheir...": { + "message": "ユーザーは、アカウント設定に移動して [Session ID を共有] をタップするか、QR コードを共有することで、Session ID を共有できます。" + }, + "appearanceSettingsTitle": { + "message": "デザイン設定" + }, + "privacySettingsTitle": { + "message": "プライバシー" + }, + "notificationsSettingsTitle": { + "message": "通知" + }, + "devicesSettingsTitle": { + "message": "追加されている端末" + }, + "recoveryPhraseEmpty": { + "message": "リカバリーフレーズを入力してください" + }, + "displayNameEmpty": { + "message": "表示名を選択してください" + }, + "joinOpenGroup": { + "message": "オープングループに参加する" + }, + "newClosedGroup": { + "message": "新しいクローズドグループ" + }, + "createClosedGroupNamePrompt": { + "message": "グループ名" + }, + "createClosedGroupPlaceholder": { + "message": "グループ名を入力してください" + }, + "openGroupURL": { + "message": "グループの URL を開く" + }, + "enterAnOpenGroupURL": { + "message": "オープングループの URL を入力する" + }, + "next": { + "message": "進む" + }, + "pairingDevice": { + "message": "端末を追加中" + }, + "invalidGroupNameTooShort": { + "message": "グループ名を入力してください" + }, + "invalidGroupNameTooLong": { + "message": "短いグループ名を入力してください" + }, + "pickClosedGroupMember": { + "message": "グループメンバーを少なくとも 2 人選択してください" + }, + "closedGroupMaxSize": { + "message": "閉じたグループは 20 人を超えるメンバーを抱えることはできません" + }, + "noBlockedContacts": { + "message": "ブロックしている連絡先はありません" } -} +} \ No newline at end of file diff --git a/_locales/km/messages.json b/_locales/km/messages.json index ce300cfda..b662abcc4 100644 --- a/_locales/km/messages.json +++ b/_locales/km/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&ជំនួយ", "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": "ចំណង់ចំណូលចិត្ត...", - "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": "លាក់", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "ដំឡើង ជាមួយការនាំចូល", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "ដំឡើង ជាឧបករណ៍ថ្មី", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "ដំឡើង ជាឧបករណ៍ដាច់ដោយឡែក", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "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": "ជ្រើសរើសឯកសារ", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "ផ្ទុកទិន្នន័យរបស់អ្នក", "description": "Header shown on the first screen in the data import process" @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "សូមប្រាកដថា អ្នកបានជ្រើសរើស កន្លែងត្រឹមត្រូវដែលផ្ទុកទិន្នន័យSignalរបស់អ្នក ដែលបានរក្សាទុក។ ឈ្មោះវា គួរតែចាប់ផ្តើមដោយ 'នាំចេញ Signal។' អ្នកអាចរក្សាទុកការចម្លងថ្មីមួយនៃទិន្នន័យរបស់អ្នក ពីកម្មវិធី Chrome ។", + "message": "សូមប្រាកដថា អ្នកបានជ្រើសរើស កន្លែងត្រឹមត្រូវដែលផ្ទុកទិន្នន័យSignalរបស់អ្នក ដែលបានរក្សាទុក។ ឈ្មោះវា គួរតែចាប់ផ្តើមដោយ 'នាំចេញ Session។' អ្នកអាចរក្សាទុកការចម្លងថ្មីមួយនៃទិន្នន័យរបស់អ្នក ពីកម្មវិធី Chrome ។", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "ចាប់ផ្តើមប្រើប្រាស់ Signal Desktop", + "message": "ចាប់ផ្តើមប្រើប្រាស់ Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "តភ្ជាប់ឧបករណ៍នេះ ទៅកាន់ទូរស័ព្ទរបស់អ្នក", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "ទីតាំងអ្នកបានជ្រើសរើស", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "កំពុងដំឡើងទិន្នន័យ។ វាអាចចំណាយពេលខ្លះ...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "កំពុងផ្ទុកសារ។ $count$ ឥឡូវនេះ...", - "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": "ខ្ញុំ", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "អ្នកបានចាកចេញពីក្រុម", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "រំកិលចុះក្រោមនៃការសន្ទនា", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "សារថ្មីខាងក្រោម", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "សារថ្មីខាងក្រោម", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "សារមិនទាន់អាន 1 ", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយសមាជិកក្រុមច្រើន បានផ្លាស់ប្តូរ តាំងពីអ្នកបានផ្ទៀងផ្ទាត់លើកចុងក្រោយ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬគេបានតំឡើង Signal ឡើងវិញ។", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយសមាជិកក្រុមច្រើន បានផ្លាស់ប្តូរ តាំងពីអ្នកបានផ្ទៀងផ្ទាត់លើកចុងក្រោយ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬគេបានតំឡើង Session ឡើងវិញ។", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ តាំងពីអ្នកបានផ្ទៀងផ្ទាត់លើកចុងក្រោយ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រៀតចូលការទំនាក់ទំនង ឬ $name$ បានដំឡើង Signal ឡើងវិញ។", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ តាំងពីអ្នកបានផ្ទៀងផ្ទាត់លើកចុងក្រោយ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រៀតចូលការទំនាក់ទំនង ឬ $name$ បានដំឡើង Session ឡើងវិញ។", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "លេខសុវត្ថិភាព ដែលអ្នកកំពុងព្យាយាមផ្ទៀងផ្ទាត់បានផ្លាស់ប្តូរ។ សូមពិនិត្យមើលលេខសុវត្ថិភាពថ្មីជាមួយ $name$។ ចងចាំថា ការផ្លាស់ប្តូរនេះអាចមានន័យថា​ មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$បានតំឡើង Signal ឡើងវិញ។ ", + "message": "លេខសុវត្ថិភាព ដែលអ្នកកំពុងព្យាយាមផ្ទៀងផ្ទាត់បានផ្លាស់ប្តូរ។ សូមពិនិត្យមើលលេខសុវត្ថិភាពថ្មីជាមួយ $name$។ ចងចាំថា ការផ្លាស់ប្តូរនេះអាចមានន័យថា​ មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$បានតំឡើង Session ឡើងវិញ។ ", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយសមាជិកក្រុមច្រើន បានផ្លាស់ប្តូរ ថ្មីៗនេះ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬគេបានតំឡើង Signal ឡើងវិញ។ ", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយសមាជិកក្រុមច្រើន បានផ្លាស់ប្តូរ ថ្មីៗនេះ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬគេបានតំឡើង Session ឡើងវិញ។ ", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ ថ្មីៗនេះ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$ បានដំឡើង Signal ឡើងវិញ។", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ ថ្មីៗនេះ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$ បានដំឡើង Session ឡើងវិញ។", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$ បានតំឡើង Signal ឡើងវិញ។ អ្នកអាចត្រូវផ្ទៀងផ្ទាត់លេខសុវត្ថិភាពរបស់អ្នក ជាមួយលេខទំនាក់ទំនងនេះ។", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$ បានតំឡើង Session ឡើងវិញ។ អ្នកអាចត្រូវផ្ទៀងផ្ទាត់លេខសុវត្ថិភាពរបស់អ្នក ជាមួយលេខទំនាក់ទំនងនេះ។", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "បញ្ជូន", "description": "" }, - "acceptNewKey": { - "message": "យល់ព្រម", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "ដាក់ថាបានផ្ទៀងផ្ទាត់", "description": "" @@ -455,10 +385,6 @@ "message": "លេខសុវត្ថិភាពថ្មី", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយលេខទំនាក់ទំនងនេះបានផ្លាស់ប្តូរ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក, ឬ លេខទំនាក់ទំនងនេះបានដំឡើង Signal ឡើងវិញ។ អ្នកអាចត្រូវផ្ទៀងផ្ទាត់លេខសុវត្ថិភាពខាងក្រោម។", - "description": "" - }, "incomingError": { "message": "បញ្ហាទទួលសារផ្ញើចូល", "description": "" @@ -495,18 +421,6 @@ "message": "ខែនេះ", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "មិនគាំទ្រប្រភេទឯកសារភ្ជាប់។ ចុច ដើម្បីរក្សាទុក។", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "ចុច ដើម្បីរក្សាទុក", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "ឯកសារគ្មានឈ្មោះ", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "សារសំឡេង", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "ប្រភេទឯកសារភ្ជាប់មិនអនុញ្ញាតសម្រាប់ហេតុផលសុវត្ថិភាព", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "កំពុងផ្ទុកការមើល...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "ការមើលតំណជារូបភាពតូចៗព្រាងសម្រាប់ $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "ការមើលតំណជារូបភាពតូចៗសម្រាប់$domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "មិនអាចផ្ទុកឯកសារភ្ជាប់ដែលបានជ្រើសរើស។", "description": "" }, - "disconnected": { - "message": "បានផ្តាច់", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "កំពុងតភ្ជាប់", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "ចូលទៅកាន់កំណត់ចេញថ្មី", "description": "" }, - "goToForums": { - "message": "ចូលទៅកាន់ វេទិកា", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "ចូលទៅកាន់ទំព័រគាំទ្រ", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "រាយការណ៍បញ្ហាមួយ", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "ចំណង់ចំណូលចិត្តSignal Desktop ", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "អំពី Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "សម្តី", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "បង្ហាញ", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "លាក់", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "ចាកចេញ", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "ស្វែងរក", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "ស្វាគមន៍មកកាន់ Signal", - "description": "" - }, - "selectAContact": { - "message": "ជ្រើសរើសលេខទំនាក់ទំនងមួយ ឬក្រុម ដើម្បីចាប់ផ្តើមការសន្ទនា។", + "message": "ស្វាគមន៍មកកាន់ Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "ផ្ញើសារ", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "ផ្ទះ", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "អ្នក", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "កំពុងឆ្លើយតបទៅកាន់ $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": "ដើម្បីបញ្ជូនសារសំឡេង អនុញ្ញាតឲ្យSignal Desktop ចូលប្រើប្រាស់ម៉ៃក្រូហ្វូនរបស់អ្នក។", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "អនុញ្ញាតចូលប្រើប្រាស់", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "បង្ហាញការកំណត់", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "សំឡេង", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "លះបង់", "description": "" }, - "failedToSend": { - "message": "បរាជ័យក្នុងការផ្ញើទៅកាន់អ្នកទទួល។ ពិនិត្យការតភ្ជាប់បណ្តាញរបស់អ្នក។", - "description": "" - }, "error": { "message": "បញ្ហា", "description": "" }, - "messageDetail": { - "message": "សារលម្អិត", - "description": "" - }, "delete": { "message": "លុប", "description": "" @@ -857,10 +705,6 @@ "message": "សមាជិកក្រុម", "description": "" }, - "showMembers": { - "message": "បង្ហាញសមាជិក", - "description": "" - }, "resetSession": { "message": "កំណត់ការប្រើប្រាស់ឡើងវិញ", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "បង្ហាញលេខសុវត្ថិភាព", "description": "" }, - "viewAllMedia": { - "message": "បង្ហាញឯកសារមេឌាទាំងអស់", - "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": "បើសិនអ្នកចង់ផ្ទៀងផ្ទាត់សុវត្ថិភាព នៃកូដបនីយកម្មរបស់អ្នកជាមួយ $name$ សូមប្រៀបធៀបលេខខាងលើជាមួយលេខនៅលើឧបករណ៍របស់ពួកគេ។", "description": "", @@ -887,14 +727,6 @@ "message": "អ្នកមិនទាន់បានផ្តោះប្តូរសារណាមួយជាមួយលេខទំនាក់ទំនងនេះទេ។ លេខសុវត្ថិភាពរបស់អ្នកជាមួយគេ នឹងមានបន្ទាប់ពីផ្ញើសារដំបូង។", "description": "" }, - "moreInfo": { - "message": "ព័ត៌មានបន្ថែម...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "ផ្ញើម្តងទៀត", - "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": "លុបសារ", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "រក្សាទុក", "description": "" }, - "fileIconAlt": { - "message": "រូបតំណាងឯកសារ", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "រូបEmoji របស់ '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "ស្វាគមន៍មកកាន់ Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "ភាពឯកជនគឺអាចធ្វើទៅបាន។ Signalធ្វើបានដោយងាយស្រួល។", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "តភ្ជាប់ទូរស័ព្ទរបស់អ្នក ទៅកាន់ Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "ការកំណត់ Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "ឧបករណ៍បានតភ្ជាប់", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' ប៊ូតុង", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "តភ្ជាប់ឧបករណ៍ថ្មី", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "ឈ្មោះឧបករណ៍", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "ជ្រើសរើសឈ្មោះឧបករណ៍នេះ", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "បញ្ចប់ការតភ្ជាប់ទូរស័ព្ទ", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "កំពុងចម្លងបញ្ជីទំនាក់ទំនង និងក្រុម", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "បរាជ័យក្នុងការតភ្ជាប់ទៅកាន់ម៉ាស៊ីនមេ។", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "សុំទោស, អ្នកបានភ្ជាប់ឧបករណ៍ច្រើនរួចហើយ។ ព្យាយាមលុបចោលខ្លះ។", - "description": "" - }, - "settings": { - "message": "ការកំណត់", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "រូបរាង", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "ការអនុញ្ញាត", @@ -1029,34 +801,6 @@ "message": "បើកការត្រួតពិនិត្យអក្ខរាវិរុទ្ធនៃពាក្យដែលបានបញ្ចូលក្នុងប្រអប់ផ្ញើសារ", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "សំអាតទិន្នន័យ", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "វានឹងសំអាតទិន្នន័យទាំងអស់ក្នុងកម្មវិធី, នឹងលុបចោលសារទាំងអស់ និងព័ត៌មានគណនីដែលបានរក្សាទុក។", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "សំអាតទិន្នន័យ", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "លុបចោលទិន្នន័យទាំងអស់?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "អ្នករៀបនឹងលុបព័ត៌មានគណនី ដែលបានរក្សាទុកទាំងអស់​របស់កម្មវិធីនេះ រួមទាំង បញ្ជីទំនាក់ទំនងនិងសារទាំងអស់។ អ្នកតែងតែអាចភ្ជាប់ជាមួយឧបករណ៍ចល័តរបស់អ្នកម្ដងទៀត ប៉ុន្តែវានឹងមិនអាចស្តារសារដែលបានលុបនោះទេ។", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "លុបចោលទិន្នន័យទាំងអស់", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "កំពុងផ្តាច់ និងលុបចោលទិន្នន័យទាំងអស់", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "ការជូនដំណឹង", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "ផ្ញើបរាជ័យ", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "លម្អិត", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "លាក់ ខ្លឹមសារលម្អិត", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "ស្វែងយល់បន្ថែមពីការផ្ទៀងផ្ទាត់លេខសុវត្ថិភាព", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "ជំនាន់ Signal Desktop នេះ បានហួសសុពលភាព។ សូមដំឡើងទីកាន់ជំនាន់ចុងក្រោយ ដើម្បីបន្តការផ្ញើសារ។", + "message": "ជំនាន់ Session Desktop នេះ បានហួសសុពលភាព។ សូមដំឡើងទីកាន់ជំនាន់ចុងក្រោយ ដើម្បីបន្តការផ្ញើសារ។", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "សារមេឌា", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "លេខ មិនបានចុះឈ្មោះ", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "បញ្ជីទំនាក់ទំនង", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "នាំចូលក្រុម និងបញ្ជីទំនាក់ទំនង Signalទាំងអស់ ពីទូរស័ព្ទរបស់អ្នក។", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "នាំចូលចុងក្រោយនៅ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "នាំចូលឥឡូវ", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "កំពុងនាំចូល...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "ការនាំចូលបរាជ័យ។ ត្រូវប្រាកដថាកុំព្យូទ័រ និងទូរស័ព្ទរបស់អ្នកបានតភ្ជាប់ទៅកាន់អ៊ិនធឺណិត។", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ឥឡូវ", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ម៉ោង", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ ម៉ោង", - "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$ ម៉ោង មុន", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ នាទី", - "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$ នាទី មុន", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ឥឡូវ", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "ខែ ថ្ងៃ", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "លេងសំឡេងជូនដំណឹង", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "លេខសុវត្ថិភាពបានផ្លាស់ប្តូរ", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "ភ្លឺ", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "ចាប់ផ្តើមការសន្ទនាថ្មី...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "បញ្ចូលលេខទូរស័ព្ទ ដើម្បីបន្ថែមលេខទំនាក់ទំនង។", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "លេខមិនត្រឹមត្រូវ", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "តភ្ជាប់ Signal Desktop ទៅកាន់ទូរស័ព្ទរបស់អ្នកឡើងវិញ ដើម្បីបន្តការផ្ញើសារ។", - "description": "" - }, - "unlinked": { - "message": "បានផ្តាច់", - "description": "" - }, - "relink": { - "message": "តភ្ជាប់ឡើងវិញ", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "មានបច្ចុប្បន្នភាព Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/kn/messages.json b/_locales/kn/messages.json index 303de1ea8..ba44ef8cd 100644 --- a/_locales/kn/messages.json +++ b/_locales/kn/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Help", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Upgrading database. This may take some time...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "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": "ನಾನು", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "You left 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": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "New message below", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "ಕೆಳಗೆ ಹೊಸ ಸಂದೇಶಗಳು ಇವೆ", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ಓದದಿರುವ ಸಂದೇಶ", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "ನೀವು ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲಿಸಿದ ನಂತರ $name$ ನಿಮ್ಮ ಸುರಕ್ಷತೆ ಸಂಖ್ಯೆ ಬದಲಾಗಿದೆ. ನಿಮ್ಮ ಸಂವಹನವನ್ನು ಯಾರಾದರೂ ತಡೆಗಟ್ಟಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ ಅಥವಾ $name$ Signal ಅನ್ನು ಪುನಃ ಸ್ಥಾಪಿಸಿದ್ದಾರೆ", + "message": "ನೀವು ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲಿಸಿದ ನಂತರ $name$ ನಿಮ್ಮ ಸುರಕ್ಷತೆ ಸಂಖ್ಯೆ ಬದಲಾಗಿದೆ. ನಿಮ್ಮ ಸಂವಹನವನ್ನು ಯಾರಾದರೂ ತಡೆಗಟ್ಟಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ ಅಥವಾ $name$ Session ಅನ್ನು ಪುನಃ ಸ್ಥಾಪಿಸಿದ್ದಾರೆ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,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": "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 Session.", "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": { @@ -354,11 +288,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": "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 Session.", "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,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": "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 Session. You may wish to verify your saftey number with this contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "ಸಲ್ಲಿಸಿ", "description": "" }, - "acceptNewKey": { - "message": "ಒಪ್ಪಿಕೊಳ್ಳಿ", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Mark as verified", "description": "" @@ -455,10 +385,6 @@ "message": "ಹೊಸ ಸುರಕ್ಷತೆ ಸಂಖ್ಯೆ", "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.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "ಬೆಂಬಲವಿಲ್ಲದ ಲಗತ್ತಿನ ಪ್ರಕಾರ. ಉಳಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "ಉಳಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unnamed File", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "ಧ್ವನಿ ಸಂದೇಶ", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "ತೋರಿಸು", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "ಹುಡುಕಿ", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "ಸಿಗ್ನಲ್‌ಗೆ ಸ್ವಾಗತ", "description": "" }, - "selectAContact": { - "message": "ಸಂವಾದ ಪ್ರಾರಂಭಿಸಲು ಸಂಪರ್ಕ ಅಥವಾ ಗುಂಪುನ್ನು ಆಯ್ಕೆಮಾಡಿಕೊಳ್ಳಿ.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "ರದ್ದುಗೊಳಿಸಿ", "description": "" }, - "failedToSend": { - "message": "ಕೆಲವು ಸ್ವೀಕೃತದಾರರಿಗೆ ಕಳುಹಿಸಲಾಗಲ್ಲಿಲ್ಲ. ನಿಮ್ಮ ಜಾಲಬಂಧವನ್ನು ಪರಿಶೀಲಿಸಿ.", - "description": "" - }, "error": { "message": "ದೋಷ", "description": "" }, - "messageDetail": { - "message": "ಸಂದೇಶದ ವಿವರಗಳು", - "description": "" - }, "delete": { "message": "ಅಳಿಸು", "description": "" @@ -857,10 +705,6 @@ "message": "Group members", "description": "" }, - "showMembers": { - "message": "ಸದಸ್ಯರನ್ನು ತೋರಿಸು", - "description": "" - }, "resetSession": { "message": "Reset session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "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.", "description": "", @@ -887,14 +727,6 @@ "message": "ನೀವು ಇನ್ನೂ ಈ ಸಂಪರ್ಕದೊಂದಿಗೆ ಯಾವುದೇ ಸಂದೇಶಗಳನ್ನು ವಿನಿಮಯ ಮಾಡಿಲ್ಲ. ಅವರೊಂದಿಗೆ ನಿಮ್ಮ ಸುರಕ್ಷತಾ ಸಂಖ್ಯೆ ಮೊದಲ ಸಂದೇಶದ ನಂತರ ಲಭ್ಯವಿರುತ್ತದೆ.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "ಉಳಿಸಿ", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Signal ಗಣಕತೆರೆಗೆ ಸ್ವಾಗತ", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "ಖಾಸಗಿತನ ಸಾಧ್ಯ. Signal ಇದನ್ನು ಸುಲಭವಾಗಿಸುತ್ತದೆ.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "ಪೂರೈಕೆಗಣಕದ ಜೋತೆ ಸಂಪರ್ಕ ವಿಫಲವಾಗಿದೆ.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "ಕ್ಷಮಿಸಿ, ನೀವು ಹಲವಾರು ಸಾಧನಗಳು ಈಗಾಗಲೇ ಜೋಡಿಸಿದ್ದೀರಿ. ಕೆಲವನ್ನು ತೆಗೆದುಹಾಕಲು ಪ್ರಯತ್ನಿಸಿ.", - "description": "" - }, - "settings": { - "message": "ಸಿದ್ಧತೆಗಳು", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Theme", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "ಸೂಚನೆಗಳು", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "ವಿವರಗಳು", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "ವಿವರಗಳನ್ನು ಮರೆಮಾಡಿ", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Learn more about verifying safety numbers", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal ಡೆಸ್ಕ್ಟಾಪ್ ಈ ಆವೃತ್ತಿಯ ಅವಧಿ ಮುಗಿದಿದೆ. ಸಂದೇಶ ಮುಂದುವರೆಸಲು ಹೊಸ ಆವೃತ್ತಿಗೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ.", + "message": "Session ಡೆಸ್ಕ್ಟಾಪ್ ಈ ಆವೃತ್ತಿಯ ಅವಧಿ ಮುಗಿದಿದೆ. ಸಂದೇಶ ಮುಂದುವರೆಸಲು ಹೊಸ ಆವೃತ್ತಿಗೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "ಮಾಧ್ಯಮ ಸಂದೇಶ", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "ಸಂಖ್ಯೆ ನೋಂದಣಿಯಾಗಿಲ್ಲ", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "ಸಂಪರ್ಕಗಳು", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನದಿಂದ ಎಲ್ಲಾ Signal ಗುಂಪುಗಳು ಮತ್ತು ಸಂಪರ್ಕಗಳನ್ನು ಆಮದು ಮಾಡಿಕೋಌ", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "ಕಳೆದ ಆಮದು", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "ಈಗ ಆಮದು ಮಾಡಿ", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "ಆಮದು ಮಾಡಲಾಗುತ್ತಿದೆ ...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "ಆಮದು ವಿಫಲವಾಗಿದೆ. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಮತ್ತು ನಿಮ್ಮ ಫೋನ್ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಬಗ್ಗೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ಈಗ", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ಗಂಟೆ", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ಈಗ", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "ತಪ್ಪಾದ ಸಂಖ್ಯೆ", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "ಸಂದೇಶವನ್ನು ಮುಂದುವರಿಸಲು Signal ಡೆಸ್ಕ್ಟಾಪ್ ಅನ್ನು ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನಕ್ಕೆ ರಿಲೀಂಕ್ ಮಾಡಿ.", - "description": "" - }, - "unlinked": { - "message": "Unlinked", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index 7738b6b41..cc2680dca 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Help", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Upgrading database. This may take some time...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "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": "Me", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "You left 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": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "New message below", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "New messages below", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Unread Message", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,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": "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 Session.", "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": { @@ -354,11 +288,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": "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 Session.", "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,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": "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 Session. You may wish to verify your saftey number with this contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Submit", "description": "" }, - "acceptNewKey": { - "message": "Accept", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Mark as verified", "description": "" @@ -455,10 +385,6 @@ "message": "New safety number", "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.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Unsupported attachment type. Click to save.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Click to save", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unnamed File", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "보이스 메시지", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Disconnected", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Connecting", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "검색", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Welcome to Signal", - "description": "" - }, - "selectAContact": { - "message": "Select a contact or group to start chatting.", + "message": "Welcome to Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "메세지 보내기", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Cancel", "description": "" }, - "failedToSend": { - "message": "Failed to send to some recipients. Check your network connection.", - "description": "" - }, "error": { "message": "에러", "description": "" }, - "messageDetail": { - "message": "Message Detail", - "description": "" - }, "delete": { "message": "Delete", "description": "" @@ -857,10 +705,6 @@ "message": "Group members", "description": "" }, - "showMembers": { - "message": "Show members", - "description": "" - }, "resetSession": { "message": "Reset session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "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.", "description": "", @@ -887,14 +727,6 @@ "message": "You haven't exchanged any messages with this contact yet. Your safety number with them will be available after the first message.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "저장", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Welcome to Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacy is possible. Signal makes it easy.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Failed to connect to server.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sorry, you have too many devices linked already. Try removing some.", - "description": "" - }, - "settings": { - "message": "Settings", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Theme", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notifications", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Hide details", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Learn more about verifying safety numbers", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "This version of Signal Desktop has expired. Please upgrade to the latest version to continue messaging.", + "message": "This version of Session Desktop has expired. Please upgrade to the latest version to continue messaging.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Media message", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Number is not registered", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacts", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Import all Signal groups and contacts from your mobile device.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Last import at", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Import now", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importing...", - "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.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "now", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hour", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "now", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Invalid number", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Relink Signal Desktop to your mobile device to continue messaging.", - "description": "" - }, - "unlinked": { - "message": "Unlinked", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/lt/messages.json b/_locales/lt/messages.json index 6352b544e..14fa337b6 100644 --- a/_locales/lt/messages.json +++ b/_locales/lt/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Pagalba", "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": "Nuostatos…", - "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": "Slėpti", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Išeiti iš Signal", + "message": "Išeiti iš Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Nusistatyti importavimą", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Nusistatyti kaip naują įrenginį", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Nusistatyti kaip atskirą įrenginį", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Pasirinkti failą", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Įkelkite savo duomenis", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Jūs ką tik perėjote per eksportavimo procesą ir jūsų kontaktai bei žinutės kantriai laukia jūsų kompiuteryje. Pasirinkite aplanką, kuriame yra jūsų įrašyti Signal duomenys.", + "message": "Jūs ką tik perėjote per eksportavimo procesą ir jūsų kontaktai bei žinutės kantriai laukia jūsų kompiuteryje. Pasirinkite aplanką, kuriame yra jūsų įrašyti Session duomenys.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Įsitikinkite, kad pasirinkote teisingą katalogą, kuriame yra jūsų įrašyti Signal duomenys. Jo pavadinimas turėtų prasidėti \"Signal Export.\" Taip pat galite įrašyti naują savo duomenų kopiją iš Chrome programėlės.", + "message": "Įsitikinkite, kad pasirinkote teisingą katalogą, kuriame yra jūsų įrašyti Session duomenys. Jo pavadinimas turėtų prasidėti \"Session Export.\" Taip pat galite įrašyti naują savo duomenų kopiją iš Chrome programėlės.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Pradėti naudoti Signal Desktop", + "message": "Pradėti naudoti Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Susieti šį įrenginį su jūsų telefonu", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "jūsų pasirinkta vieta", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Naujinama duomenų bazė. Tai gali šiek tiek užtrukti...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Įkeliamos žinutės. Jau $count$ įkelta...", - "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": "Aš", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Jūs išėjote iš grupės", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Slinkti į pokalbio apačią", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nauja žinutė žemiau", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Naujos žinutės žemiau", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 neskaityta žinutė", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Jūsų saugumo numeriai su keliais grupės dalyviais nuo paskutinio patvirtinimo pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad šie asmenys, tiesiog, iš naujo įdiegė Signal.", + "message": "Jūsų saugumo numeriai su keliais grupės dalyviais nuo paskutinio patvirtinimo pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad šie asmenys, tiesiog, iš naujo įdiegė Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Jūsų saugumo numeris su $name$ nuo paskutinio patvirtinimo pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Signal.", + "message": "Jūsų saugumo numeris su $name$ nuo paskutinio patvirtinimo pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Saugumo numeris, kurį bandote patvirtinti, pasikeitė. Prašome peržiūrėti savo saugumo numerį su $name$. Atminkite, šis pokytis gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Signal.", + "message": "Saugumo numeris, kurį bandote patvirtinti, pasikeitė. Prašome peržiūrėti savo saugumo numerį su $name$. Atminkite, šis pokytis gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Jūsų saugumo numeriai su keliais grupės dalyviais neseniai pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad šie asmenys, tiesiog, iš naujo įdiegė Signal. ", + "message": "Jūsų saugumo numeriai su keliais grupės dalyviais neseniai pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad šie asmenys, tiesiog, iš naujo įdiegė Session. ", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Jūsų saugumo numeris su $name$ neseniai pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Signal.", + "message": "Jūsų saugumo numeris su $name$ neseniai pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Jūsų saugumo numeris su $name$ pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Signal. Jūs, tikriausiai, norėtumėte patvirtinti saugumo numerį su šiuo kontaktu.", + "message": "Jūsų saugumo numeris su $name$ pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Session. Jūs, tikriausiai, norėtumėte patvirtinti saugumo numerį su šiuo kontaktu.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Pateikti", "description": "" }, - "acceptNewKey": { - "message": "Priimti", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Žymėti kaip patvirtintą", "description": "" @@ -455,10 +385,6 @@ "message": "Naujas saugumo numeris", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Jūsų saugumo numeris su šiuo kontaktu pasikeitė. Tai gali reikšti, kad arba kažkas bando perimti jūsų susirašinėjimą, arba šis kontaktas, tiesiog, iš naujo įdiegė Signal. Jūs, tikriausiai, žemiau norėtumėte patvirtinti naują saugumo numerį.", - "description": "" - }, "incomingError": { "message": "Klaida, apdorojant gaunamą žinutę", "description": "" @@ -495,18 +421,6 @@ "message": "Šį mėnesį", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepalaikomas priedo tipas. Spustelėkite, kad įrašytumėte.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Spustelkite, norėdami įrašyti", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Bevardis failas", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Balso žinutė", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Priedo tipas saugumo sumetimais yra neleidžiamas", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Įkeliama peržiūra...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Juodraštinė miniatiūrinė nuorodos peržiūra, skirta $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatiūrinė nuorodos peržiūra, skirta $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Nepavyko įkelti pasirinkto priedo.", "description": "" }, - "disconnected": { - "message": "Atsijungta", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Jungiamasi", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Pereiti į laidos informaciją", "description": "" }, - "goToForums": { - "message": "Pereiti į forumus", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Pereiti į palaikymo puslapį", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Pranešti apie klaidą", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop nuostatos", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Apie Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Šneka", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Rodyti", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Slėpti", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Išeiti", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Ieškoti", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Sveiki atvykę į Signal", - "description": "" - }, - "selectAContact": { - "message": "Pasirinkite kontaktą ar grupę, kad pradėtumėte pokalbį.", + "message": "Sveiki atvykę į Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Siųsti žinutę", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "namų", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Jūs", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Atsako naudotojui $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": "Norėdami siųsti garso žinutes, suteikite Signal Desktop prieigą prie savo mikrofono.", + "message": "Norėdami siųsti garso žinutes, suteikite Session Desktop prieigą prie savo mikrofono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Leisti prieigą", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Rodyti nustatymus", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Garso įrašas", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Atsisakyti", "description": "" }, - "failedToSend": { - "message": "Nepavyko išsiųsti kai kuriems gavėjams. Patikrinkite savo tinklo ryšį.", - "description": "" - }, "error": { "message": "Klaida", "description": "" }, - "messageDetail": { - "message": "Žinutės informacija", - "description": "" - }, "delete": { "message": "Ištrinti", "description": "" @@ -857,10 +705,6 @@ "message": "Grupės dalyviai", "description": "" }, - "showMembers": { - "message": "Rodyti dalyvius", - "description": "" - }, "resetSession": { "message": "Atstatyti seansą", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Rodyti saugumo numerį", "description": "" }, - "viewAllMedia": { - "message": "Rodyti visą mediją", - "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": "Jeigu norite patvirtinti savo ištisinio šifravimo su $name$ saugumą, palyginkite aukščiau esančius numerius su numeriais šio asmens įrenginyje.", "description": "", @@ -887,14 +727,6 @@ "message": "Jūs su šiuo kontaktu dar nesate apsikeitę jokiomis žinutėmis. Jūsų saugumo numeris bus prieinamas po pirmosios žinutės.", "description": "" }, - "moreInfo": { - "message": "Daugiau informacijos...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Bandyti siųsti dar kartą", - "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": "Ištrinti žinutę", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Įrašyti", "description": "" }, - "fileIconAlt": { - "message": "Failo piktograma", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Šypsenėlė \"$title$\"", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Sveiki atvykę į Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatumas yra įmanomas. Signal jį padaro lengvą.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Susiekite savo telefoną su Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal nustatymai", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Susieti įrenginiai", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "\"+\" mygtukas", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Susieti naują įrenginį", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Įrenginio pavadinimas", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Pasirinkite šio įrenginio pavadinimą", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Užbaigti telefono susiejimą", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sinchronizuojami kontaktai ir grupės", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Nepavyko prisijungti prie serverio.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Atleiskite, jūs jau turite per daug susietų įrenginių. Pabandykite kai kuriuos pašalinti.", - "description": "" - }, - "settings": { - "message": "Nustatymai", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Leidimai", @@ -1029,34 +801,6 @@ "message": "Įjungti rašybos tikrinimą tekstui, kuris įvedamas į žinutės rašymo langelį", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Išvalyti duomenis", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Tai išvalys visus programoje esančius duomenis ir pašalins visas žinutes bei įrašytą paskyros informaciją.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Išvalyti duomenis", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Ištrinti visus duomenis?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Jūs ketinate ištrinti visą įrašytą šios programos paskyros informaciją, įskaitant visus kontaktus ir visas žinutes. Jūs visada ir vėl galite susieti programą su savo mobiliuoju įrenginiu, tačiau tai neatkurs ištrintų žinučių.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Ištrinti visus duomenis", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Atsijungiama ir ištrinami visi duomenys", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Pranešimai", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Išsiuntimas nepavyko", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Išsamesnė informacija", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Slėpti išsamesnę informaciją", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Sužinoti daugiau apie saugumo numerių patvirtinimą", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Pasibaigė šios Signal Desktop skirtos versijos galiojimas. Norint tęsti susirašinėjimą, prašome atsinaujinti iki naujausios versijos.", + "message": "Pasibaigė šios Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Medija žinutė", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numeris nėra registruotas", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontaktai", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importuoti visas Signal grupes ir kontaktus iš jūsų mobiliojo įrenginio.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Paskutinis importavimas ties", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importuoti dabar", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importuojama...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importavimas nepavyko. Įsitikinkite, kad jūsų kompiuteris ir telefonas yra prijungti prie interneto.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "dabar", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 valanda", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ val.", - "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": "prieš $hours$ val.", - "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": "prieš $minutes$ min.", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "dabar", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Groti garso pranešimus", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Pasikeitė saugumo numeris", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Šviesi", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 naują pokalbį…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Įveskite kontakto, kurį norite pridėti, numerį.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neteisingas numeris", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Norėdami tęsti susirašinėjimą, iš naujo susiekite Signal Desktop su savo mobiliuoju įrenginiu.", - "description": "" - }, - "unlinked": { - "message": "Atsietas", - "description": "" - }, - "relink": { - "message": "Susieti iš naujo", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Yra prieinamas Session atnaujinimas", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/mk/messages.json b/_locales/mk/messages.json index 9224fad9d..1e1e22a66 100644 --- a/_locales/mk/messages.json +++ b/_locales/mk/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Help", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Upgrading database. This may take some time...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "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": "Me", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "You left 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": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "New message below", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "New messages below", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Unread Message", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,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": "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 Session.", "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": { @@ -354,11 +288,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": "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 Session.", "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,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": "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 Session. You may wish to verify your saftey number with this contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Испрати", "description": "" }, - "acceptNewKey": { - "message": "Accept", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Mark as verified", "description": "" @@ -455,10 +385,6 @@ "message": "New safety number", "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.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Неподдржан тип на прилог. Кликнете за зачувување.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Click to save", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unnamed File", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Voice Message", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Неповрзан", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Connecting", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Барај", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Добредојдовте во Signal", - "description": "" - }, - "selectAContact": { - "message": "Избери контакт или група за разговор", + "message": "Добредојдовте во Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Откажи", "description": "" }, - "failedToSend": { - "message": "Failed to send to some recipients. Check your network connection.", - "description": "" - }, "error": { "message": "Грешка", "description": "" }, - "messageDetail": { - "message": "Детали за пораката", - "description": "" - }, "delete": { "message": "Delete", "description": "" @@ -857,10 +705,6 @@ "message": "Group members", "description": "" }, - "showMembers": { - "message": "Show members", - "description": "" - }, "resetSession": { "message": "Reset session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "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.", "description": "", @@ -887,14 +727,6 @@ "message": "You haven't exchanged any messages with this contact yet. Your safety number with them will be available after the first message.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Зачувај", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Welcome to Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacy is possible. Signal makes it easy.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Failed to connect to server.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sorry, you have too many devices linked already. Try removing some.", - "description": "" - }, - "settings": { - "message": "Settings", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Theme", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notifications", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Hide details", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Learn more about verifying safety numbers", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "This version of Signal Desktop has expired. Please upgrade to the latest version to continue messaging.", + "message": "This version of Session Desktop has expired. Please upgrade to the latest version to continue messaging.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Media message", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Number is not registered", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacts", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Import all Signal groups and contacts from your mobile device.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Last import at", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Import now", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importing...", - "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.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "now", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hour", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "now", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Invalid number", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Relink Signal Desktop to your mobile device to continue messaging.", - "description": "" - }, - "unlinked": { - "message": "Unlinked", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index 262e5ee53..7cc8df710 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "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": "Innstillinger…", - "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" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Avslutt Signal", + "message": "Avslutt Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Sett Opp med Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Sett Opp som Ny Enhet", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Sett Opp som Frittstående Enhet", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Velg fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Last inn din data", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har akkurat gått igjennom eksportprosessen og dine kontaker og meldinger venter tålmodig på din datamaskin. Velg mappen som inneholder dine lagrede Signal data.", + "message": "Du har akkurat gått igjennom eksportprosessen og dine kontaker og meldinger venter tålmodig på din datamaskin. Velg mappen som inneholder dine lagrede Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Vær sikker på at du har valgt mappen som inneholder dine lagrede Signal-data. Navnet skal begynne med «Signal Export». Du kan også lagre en ny kopi av dine data fra den gamle Chrome-appen.", + "message": "Vær sikker på at du har valgt mappen som inneholder dine lagrede Session-data. Navnet skal begynne med «Session Export». Du kan også lagre en ny kopi av dine data fra den gamle Chrome-appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start å bruke Signal Desktop", + "message": "Start å bruke Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Koble denne enheten 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 valgte 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": "Laster meldinger. $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" @@ -259,18 +205,6 @@ "message": "Du forlot gruppen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rull til bunnen av samtalen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ny melding nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nye meldinger nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Ulest melding", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Ditt sikkerhetsnummer med flere gruppemedlemmer er endret siden forrige gang du godkjente. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Signal.", + "message": "Ditt sikkerhetsnummer med flere gruppemedlemmer er endret siden forrige gang du godkjente. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Ditt sikkerhetsnummer sammen med $name$ har endret seg siden sist dere verifiserte. Dette kan bety at noen forsøker å overvåke kommunikasjonen eller at $name$ helt enkelt har installert Signal på nytt.", + "message": "Ditt sikkerhetsnummer sammen med $name$ har endret seg siden sist dere verifiserte. Dette kan bety at noen forsøker å overvåke kommunikasjonen eller at $name$ helt enkelt har installert Session på nytt.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Sikkerhetsnummeret du prøver å godkjenne har endret seg. Du må bekrefte det nye sikkerhetsnummeret til $name$. Husk at dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Signal.", + "message": "Sikkerhetsnummeret du prøver å godkjenne har endret seg. Du må bekrefte det nye sikkerhetsnummeret til $name$. Husk at dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Dine sikkerhetsnumre for flere gruppemedlemmer er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Signal.", + "message": "Dine sikkerhetsnumre for flere gruppemedlemmer er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ditt sikkerhetsnummer med $name$ er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Signal.", + "message": "Ditt sikkerhetsnummer med $name$ er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Ditt sikkerhetsnummer med $name$ er endret. Dette kan enten bety at noen avlytter kommunikasjonen deres, eller at $name$ bare har reinstallert Signal. Du kan ha lyst til å bekrefte ditt sikkerhetsnummer med denne kontakten.", + "message": "Ditt sikkerhetsnummer med $name$ er endret. Dette kan enten bety at noen avlytter kommunikasjonen deres, eller at $name$ bare har reinstallert Session. Du kan ha lyst til å bekrefte ditt sikkerhetsnummer med denne kontakten.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Send", "description": "" }, - "acceptNewKey": { - "message": "Godta", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Merk som verifisert", "description": "" @@ -455,10 +385,6 @@ "message": "Nytt sikkerhetsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ditt sikkerhetsnummer med denne kontakten er endret. Dette kan enten bety at noen prøver å fange opp kommunikasjonen din, eller denne kontakten kan ha installert Signal på nytt. Du kan ønske å bekrefte det nye sikkerhetsnummeret nedenfor.", - "description": "" - }, "incomingError": { "message": "Feil ved håndtering av innkommende melding", "description": "" @@ -495,18 +421,6 @@ "message": "Denne Måneden", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Vedleggstype støttes ikke. Klikk for å lagre det.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikk for å lagre", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Navnløs fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Talemelding", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Vedleggstypen er ikke tillatt av sikkerhetsårsaker", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Laster forhåndsvisning...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Utkast miniatyrbilde til linkforhåndsvisning for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatyrbilde til linkforhåndsvisning for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Kunne ikke laste valgt vedlegg.", "description": "" }, - "disconnected": { - "message": "Tilkobling brutt.", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Kobler til", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Se Endringslogg", "description": "" }, - "goToForums": { - "message": "Gå til Forumene", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå til Side for Brukerstøtte", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Rapporter et Problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Innstillinger 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" @@ -635,18 +529,6 @@ "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" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Velkommen til Signal!", - "description": "" - }, - "selectAContact": { - "message": "Velg en kontakt eller gruppe for å chatte", + "message": "Velkommen til Session!", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Melding", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hjem", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Svarer til $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": "For å sende lydmeldinger, gi Signal Desktop tilgang til mikrofonen din.", + "message": "For å sende lydmeldinger, gi Session Desktop tilgang til mikrofonen din.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Tillat Tilgang", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Vis Innstillnger", - "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" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Avbryt", "description": "" }, - "failedToSend": { - "message": "Kunne ikke sende til noen mottakere. Sjekk nettverkstilkoblingen.", - "description": "" - }, "error": { "message": "Feil", "description": "" }, - "messageDetail": { - "message": "Meldingsdetaljer", - "description": "" - }, "delete": { "message": "Slett", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppemedlemmer", "description": "" }, - "showMembers": { - "message": "Vis medlemmer", - "description": "" - }, "resetSession": { "message": "Nullstill økten", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Vis sikkerhetsnummer", "description": "" }, - "viewAllMedia": { - "message": "Se alle 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": "Hvis du ønsker å verifisere sikkerheten til din ende-til-ende kryptering med $name$, sammenlign tallene ovenfor med tallene på deres enhet.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har ikke utvekslet noen meldinger med denne kontakten ennå. Ditt sikkerhetsnummer med dem vil være tilgjengelig etter den første meldingen.", "description": "" }, - "moreInfo": { - "message": "Mer 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 Melding", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Lagre", "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", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Velkommen til Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Personvern er mulig. Signal gjør det enkelt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Koble til telefonen din til Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Instillinger for Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Tilkoblede enheter", - "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": "Koble Til En Ny Enhet", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Enhetsnavn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Velg denne enhetens navn", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Fullfør tilkoblingen av telefon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserer kontaker og grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunne ikke koble til tjeneren.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Beklager. Du har for mange enheter tilkoblet. Prøv å fjern noen.", - "description": "" - }, - "settings": { - "message": "Innstillinger", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Tillatelser", @@ -1029,34 +801,6 @@ "message": "Slå på stavekontroll av tekst du skriver i meldingsvinduet", "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 slette alle data i appen, inkludert alle meldinger og lagret 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 alle data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du er i ferd med å slette alt av denne applikasjonens lagrede brukerinformasjon, inkludert alle kontakter og meldinger. Du kan alltid koble til telefonen din igjen, men dette vil ikke gjenopprette slettede meldinger.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Slett alle data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Kobler fra og sletter alle data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Varslinger", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Sending feilet", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaljer", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skjul detaljer", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lær mer om å bekrefte sikkerhetsnummer", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Denne versjonen av Signal Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", + "message": "Denne versjonen av Session Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "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 ikke 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 kontakter fra din mobile enhet.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Siste import på", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importer nå", - "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": "Importering mislyktes. Sørg for at datamaskinen og telefonen din er koblet til internett.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nå", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "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 siden", - "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 siden", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nå", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Spill av lydvarsling", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Sikkerhetsnummer er endret", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "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 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 en ny samtale...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Skriv inn et telefonnummer for å legge til en 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": "Koble sammen Signal Desktop med din mobilenhet på nytt for å fortsette.", - "description": "" - }, - "unlinked": { - "message": "Frakoblet enhet", - "description": "" - }, - "relink": { - "message": "Koble til på nytt", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session oppdatering tilgjengelig", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index 17328b69d..0544ff37a 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Hulp", "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": "Voorkeuren…", - "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": "Verbergen", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Signal afsluiten", + "message": "Session afsluiten", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Instellen met importeren", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Instellen als nieuw apparaat", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Instellen als apart apparaat", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Kies bestand", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Laad je gegevens", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Je hebt net de exportprodedure doorlopen, en je contacten en berichten wachten geduldig op je computer. Kies de map die je opgeslagen Signal-gegevens bevat.", + "message": "Je hebt net de exportprodedure doorlopen, en je contacten en berichten wachten geduldig op je computer. Kies de map die je opgeslagen Session-gegevens bevat.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,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 kunt ook een nieuwe kopie van je gegevens uit de Chrome-app opslaan.", + "message": "Zorg dat je de juiste map met je opgeslagen Session-gegevens kiest. De naam begint normaal gezien met ‘Session 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": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Begin Signal Desktop te gebruiken", + "message": "Begin Session Desktop te gebruiken", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Koppel dit apparaat aan je telefoon", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "je geselecteerde locatie", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "De database wordt opgewaardeerd. Dit kan even duren…", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Berichten worden geladen, $count$ tot nu toe…", - "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": "Ik", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Je hebt de groep verlaten", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll naar de onderkant van het gesprek", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nieuw bericht hieronder", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nieuwe berichten hieronder", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ongelezen bericht", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "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.", + "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 Session 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$ Signal 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$ Session opnieuw heeft geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Het veiligheidsnummer dat je wilt verifiëren is veranderd. Controleer je nieuwe veiligheidsnummer met $name$. Let op: dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd.", + "message": "Het veiligheidsnummer dat je wilt verifiëren is veranderd. Controleer je nieuwe veiligheidsnummer met $name$. Let op: dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Session opnieuw heeft geïnstalleerd.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "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.", + "message": "Je veiligheidsnummers met meerdere groepsleden zijn recentelijk veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat sommige groepsleden Session opnieuw hebben geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Je veiligheidsnummer met $name$ is onlangs veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd.", + "message": "Je veiligheidsnummer met $name$ is onlangs veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Session opnieuw heeft geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,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. Het wordt aanbevolen je nieuwe veiligheidsnummer met dit contactpersoon te verifiëren.", + "message": "Je veiligheidsnummer met $name$ is veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Session 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": { @@ -415,10 +349,6 @@ "message": "Verzenden", "description": "" }, - "acceptNewKey": { - "message": "Aanvaarden", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Markeren als geverifieerd", "description": "" @@ -455,10 +385,6 @@ "message": "Nieuw veiligheidsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "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": { "message": "Fout bij het verwerken van een inkomend bericht", "description": "" @@ -495,18 +421,6 @@ "message": "Deze maand", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Niet-ondersteund bestandstype. Klik om op te slaan.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klik om op te slaan", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Naamloos bestand", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Audiobericht", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Type bijlage niet toegestaan wegens veiligheidsredenen", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Voorbeeld laden…", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Conceptvoorbeeldweergave voor $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Voorbeeldweergave voor $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Kan geselecteerde bijlage niet laden.", "description": "" }, - "disconnected": { - "message": "Verbinding verbroken", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Aan het verbinden", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Ga naar uitgaveopmerkingen", "description": "" }, - "goToForums": { - "message": "Ga naar forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Ga naar ondersteuningspagina", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Meld een probleem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop-instellingen", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Over Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Spraak", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Tonen", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Verbergen", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Afsluiten", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Zoeken", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Welkom bij Signal", - "description": "" - }, - "selectAContact": { - "message": "Selecteer een contactpersoon of groep om een gesprek te openen.", + "message": "Welkom bij Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Bericht verzenden", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "thuis", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Jij", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "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": { - "content": "$1", - "example": "John" - } - } - }, "audioPermissionNeeded": { - "message": "Om een audiobericht te versturen moet je Signal Desktop toegang tot de microfoon geven.", + "message": "Om een audiobericht te versturen moet je Session Desktop toegang tot de microfoon geven.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Toegang geven", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Toon instellingen", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "Begrepen", "description": "" @@ -809,18 +665,10 @@ "message": "Annuleren", "description": "" }, - "failedToSend": { - "message": "Verzenden naar bepaalde ontvangers mislukt. Controleer je netwerkverbinding.", - "description": "" - }, "error": { "message": "Fout", "description": "" }, - "messageDetail": { - "message": "Berichtdetails", - "description": "" - }, "delete": { "message": "Wissen", "description": "" @@ -857,10 +705,6 @@ "message": "Groepsleden", "description": "" }, - "showMembers": { - "message": "Leden tonen", - "description": "" - }, "resetSession": { "message": "Sessie opnieuw instellen", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Veiligheidsnummer bekijken", "description": "" }, - "viewAllMedia": { - "message": "Alle media bekijken", - "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": "Als je de beveiliging van je eind-tot-eind-versleuteling met $name$ wilt verifiëren, vergelijk je de nummers hierboven met de nummers op hun apparaat.", "description": "", @@ -887,14 +727,6 @@ "message": "Je hebt nog geen berichten uitgewisseld met deze contactpersoon. Je veiligheidsnummer met hem zal beschikbaar zijn na het eerste bericht.", "description": "" }, - "moreInfo": { - "message": "Meer informatie…", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "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 wissen", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Opslaan", "description": "" }, - "fileIconAlt": { - "message": "Bestandspictogram", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji-afbeelding ‘$title$’", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Welkom bij Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacy is mogelijk. Signal maakt het gemakkelijk.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Koppel je telefoon aan Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal-instellingen", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Gekoppelde apparaten", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "‘+’-knop", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Nieuw apparaat koppelen", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Apparaatnaam", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Kies de naam van dit apparaat", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Koppelen van telefoon voltooien", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Contacten en groepen worden gesynchroniseerd", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Verbinden met server mislukt.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sorry, je hebt te veel apparaten gekoppeld. Probeer er enkele te verwijderen.", - "description": "" - }, - "settings": { - "message": "Instellingen", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Thema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Toestemmingen", @@ -1029,34 +801,6 @@ "message": "Gebruik spellingscontrole voor de tekst in het berichtinvoerveld", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Gegevens wissen", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dit verwijdert alle gegevens in de toepassing, verwijdert alle berichten en opgeslagen accountinformatie.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Gegevens wissen", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "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 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 wissen", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Verbinding wordt verbroken en alle gegevens worden verwijderd", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Meldingen", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Verzenden mislukt", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Details verbergen", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lees meer over het verifiëren van veiligheidsnummers", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Deze versie van Signal Desktop is verouderd. Opwaardeer naar de laatste versie om verder te chatten.", + "message": "Deze versie van Session Desktop is verouderd. Opwaardeer naar de laatste versie om verder te chatten.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Mediabericht", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nummer is niet geregistreerd", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacten", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importeer alle Signal-groepen en -contacten van je mobiele apparaat.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Laatst geïmporteerd op", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Nu importeren", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Bezig met importeren…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importeren mislukt. Zorg ervoor dat je computer en je telefoon met het internet verbonden zijn.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nu", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 uur", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ u", - "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$ uur geleden", - "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 geleden", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nu", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Audiomelding afspelen", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Het veiligheidsnummer is veranderd", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Licht", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 nieuw gesprek…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Voer een telefoonnummer in om een contact toe te voegen.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ongeldig nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Koppel Signal Desktop opnieuw aan je mobiele apparaat om verder te kunnen chatten.", - "description": "" - }, - "unlinked": { - "message": "Ontkoppeld", - "description": "" - }, - "relink": { - "message": "Opnieuw koppelen", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Update voor Session beschikbaar", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/nn/messages.json b/_locales/nn/messages.json index bfe13d62d..40716a327 100644 --- a/_locales/nn/messages.json +++ b/_locales/nn/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "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" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Avslutt Signal", + "message": "Avslutt Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "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" @@ -161,36 +145,16 @@ } } }, - "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.", + "message": "Du har akkurat gått gjennom eksportprosessen; kontaktane og meldingane dine ventar tålmodig på datamaskina di. Vel mappa som inneheld den lagra Session-eksporten.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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.", + "message": "Stadfest at du har valt mappa som inneheld den lagra Session-eksporten din. Namnet skal byrja med «Session 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": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start å bruka Signal Desktop", + "message": "Start å bruka Session 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" @@ -259,18 +205,6 @@ "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" @@ -330,11 +264,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": "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.", + "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 Session 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.", + "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 Session på nytt.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "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.", + "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 Session.", "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": { @@ -354,11 +288,11 @@ } }, "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.", + "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 Session.", "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.", + "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "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.", + "message": "Tryggingsnummeret ditt med $name$ er endra. Dette kan enten bety at nokon avlyttar kommunikasjonen deira, eller at $name$ berre har reinstallert Session. 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": { @@ -415,10 +349,6 @@ "message": "Send", "description": "" }, - "acceptNewKey": { - "message": "Godta", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marker som godkjent", "description": "" @@ -455,10 +385,6 @@ "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": "" @@ -495,18 +421,6 @@ "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" @@ -515,13 +429,9 @@ "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", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Førehandsvisning av lenkje til $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "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." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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" @@ -635,18 +529,6 @@ "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" @@ -674,11 +556,7 @@ "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", + "message": "Velkommen til Session!", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,28 +633,14 @@ "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.", + "message": "Gi Session 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" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "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": "" @@ -857,10 +705,6 @@ "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." @@ -869,10 +713,6 @@ "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": "", @@ -887,14 +727,6 @@ "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" @@ -939,10 +771,6 @@ "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", @@ -953,65 +781,9 @@ } } }, - "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" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Tillatingar", @@ -1029,34 +801,6 @@ "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" @@ -1105,20 +849,12 @@ "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.", + "message": "Denne utgåva av Session Desktop er forelda. Oppgrader til siste utgåve for å fortsetja.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "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." @@ -1169,50 +877,6 @@ "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'." @@ -1387,10 +1051,6 @@ } } }, - "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" @@ -1419,46 +1079,18 @@ } } }, - "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": "Session-oppdatering tilgjengeleg", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/no/messages.json b/_locales/no/messages.json index 8c7cf3ff5..cbec2e123 100644 --- a/_locales/no/messages.json +++ b/_locales/no/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "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": "Innstillinger…", - "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" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Avslutt Signal", + "message": "Avslutt Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Sett Opp med Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Sett Opp som Ny Enhet", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Sett Opp som Frittstående Enhet", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Velg fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Last inn din data", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har akkurat gått igjennom eksportprosessen og dine kontaker og meldinger venter tålmodig på din datamaskin. Velg mappen som inneholder dine lagrede Signal data.", + "message": "Du har akkurat gått igjennom eksportprosessen og dine kontaker og meldinger venter tålmodig på din datamaskin. Velg mappen som inneholder dine lagrede Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Vær sikker på at du har valgt mappen som inneholder dine lagrede Signal-data. Navnet skal begynne med «Signal Export». Du kan også lagre en ny kopi av dine data fra den gamle Chrome-appen.", + "message": "Vær sikker på at du har valgt mappen som inneholder dine lagrede Session-data. Navnet skal begynne med «Session Export». Du kan også lagre en ny kopi av dine data fra den gamle Chrome-appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start å bruke Signal Desktop", + "message": "Start å bruke Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Koble denne enheten 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 valgte 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": "Laster meldinger. $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" @@ -259,18 +205,6 @@ "message": "Du forlot gruppen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rull til bunnen av samtalen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ny melding nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nye meldinger nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Ulest melding", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Ditt sikkerhetsnummer med flere gruppemedlemmer er endret siden forrige gang du godkjente. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Signal.", + "message": "Ditt sikkerhetsnummer med flere gruppemedlemmer er endret siden forrige gang du godkjente. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Ditt sikkerhetsnummer sammen med $name$ har endret seg siden sist dere verifiserte. Dette kan bety at noen forsøker å overvåke kommunikasjonen eller at $name$ helt enkelt har installert Signal på nytt.", + "message": "Ditt sikkerhetsnummer sammen med $name$ har endret seg siden sist dere verifiserte. Dette kan bety at noen forsøker å overvåke kommunikasjonen eller at $name$ helt enkelt har installert Session på nytt.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Sikkerhetsnummeret du prøver å godkjenne har endret seg. Du må bekrefte det nye sikkerhetsnummeret til $name$. Husk at dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Signal.", + "message": "Sikkerhetsnummeret du prøver å godkjenne har endret seg. Du må bekrefte det nye sikkerhetsnummeret til $name$. Husk at dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Dine sikkerhetsnumre for flere gruppemedlemmer er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Signal.", + "message": "Dine sikkerhetsnumre for flere gruppemedlemmer er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ditt sikkerhetsnummer med $name$ er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Signal.", + "message": "Ditt sikkerhetsnummer med $name$ er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Ditt sikkerhetsnummer med $name$ er endret. Dette kan enten bety at noen avlytter kommunikasjonen deres, eller at $name$ bare har reinstallert Signal. Du kan ha lyst til å bekrefte ditt sikkerhetsnummer med denne kontakten.", + "message": "Ditt sikkerhetsnummer med $name$ er endret. Dette kan enten bety at noen avlytter kommunikasjonen deres, eller at $name$ bare har reinstallert Session. Du kan ha lyst til å bekrefte ditt sikkerhetsnummer med denne kontakten.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Send", "description": "" }, - "acceptNewKey": { - "message": "Godta", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Merk som verifisert", "description": "" @@ -455,10 +385,6 @@ "message": "Nytt sikkerhetsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ditt sikkerhetsnummer med denne kontakten er endret. Dette kan enten bety at noen prøver å fange opp kommunikasjonen din, eller denne kontakten kan ha installert Signal på nytt. Du kan ønske å bekrefte det nye sikkerhetsnummeret nedenfor.", - "description": "" - }, "incomingError": { "message": "Feil ved håndtering av innkommende melding", "description": "" @@ -495,18 +421,6 @@ "message": "Denne Måneden", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Vedleggstype støttes ikke. Klikk for å lagre det.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikk for å lagre", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Navnløs fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Talemelding", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Vedleggstypen er ikke tillatt av sikkerhetsårsaker", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Kunne ikke laste valgt vedlegg.", "description": "" }, - "disconnected": { - "message": "Tilkobling brutt.", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Kobler til", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Se Endringslogg", "description": "" }, - "goToForums": { - "message": "Gå til Forumene", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå til Side for Brukerstøtte", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Rapporter et Problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Innstillinger 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" @@ -635,18 +529,6 @@ "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" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Velkommen til Signal!", - "description": "" - }, - "selectAContact": { - "message": "Velg en kontakt eller gruppe for å chatte", + "message": "Velkommen til Session!", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Melding", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hjem", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Svarer til $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": "For å sende lydmeldinger, gi Signal Desktop tilgang til mikrofonen din.", + "message": "For å sende lydmeldinger, gi Session Desktop tilgang til mikrofonen din.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Tillat Tilgang", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Vis Innstillnger", - "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" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Avbryt", "description": "" }, - "failedToSend": { - "message": "Kunne ikke sende til noen mottakere. Sjekk nettverkstilkoblingen.", - "description": "" - }, "error": { "message": "Feil", "description": "" }, - "messageDetail": { - "message": "Meldingsdetaljer", - "description": "" - }, "delete": { "message": "Slett", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppemedlemmer", "description": "" }, - "showMembers": { - "message": "Vis medlemmer", - "description": "" - }, "resetSession": { "message": "Nullstill økten", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Vis sikkerhetsnummer", "description": "" }, - "viewAllMedia": { - "message": "Se alle 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": "Hvis du ønsker å verifisere sikkerheten til din ende-til-ende kryptering med $name$, sammenlign tallene ovenfor med tallene på deres enhet.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har ikke utvekslet noen meldinger med denne kontakten ennå. Ditt sikkerhetsnummer med dem vil være tilgjengelig etter den første meldingen.", "description": "" }, - "moreInfo": { - "message": "Mer 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 Melding", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Lagre", "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", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Velkommen til Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Personvern er mulig. Signal gjør det enkelt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Koble til telefonen din til Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Instillinger for Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Tilkoblede enheter", - "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": "Koble Til En Ny Enhet", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Enhetsnavn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Velg denne enhetens navn", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Fullfør tilkoblingen av telefon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserer kontaker og grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunne ikke koble til tjeneren.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Beklager. Du har for mange enheter tilkoblet. Prøv å fjern noen.", - "description": "" - }, - "settings": { - "message": "Innstillinger", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Tillatelser", @@ -1029,34 +801,6 @@ "message": "Slå på stavekontroll av tekst du skriver i meldingsvinduet", "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 slette alle data i appen, inkludert alle meldinger og lagret 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 alle data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du er i ferd med å slette alt av denne applikasjonens lagrede brukerinformasjon, inkludert alle kontakter og meldinger. Du kan alltid koble til telefonen din igjen, men dette vil ikke gjenopprette slettede meldinger.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Slett alle data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Kobler fra og sletter alle data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Varslinger", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Sending feilet", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaljer", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skjul detaljer", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lær mer om å bekrefte sikkerhetsnummer", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Denne versjonen av Signal Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", + "message": "Denne versjonen av Session Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "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 ikke 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 kontakter fra din mobile enhet.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Siste import på", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importer nå", - "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": "Importering mislyktes. Sørg for at datamaskinen og telefonen din er koblet til internett.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nå", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "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 siden", - "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 siden", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nå", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Spill av lydvarsling", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Sikkerhetsnummer er endret", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Lyst", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Skriv inn et telefonnummer for å legge til en 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": "Koble sammen Signal Desktop med din mobilenhet på nytt for å fortsette.", - "description": "" - }, - "unlinked": { - "message": "Frakoblet enhet", - "description": "" - }, - "relink": { - "message": "Koble til på nytt", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session oppdatering tilgjengelig", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index 4a7165d8d..f48ccaa4b 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -3,18 +3,10 @@ "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." @@ -24,7 +16,7 @@ "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": "&Widok", + "message": "&Zobacz", "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": { @@ -35,10 +27,6 @@ "message": "&Pomoc", "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": "Ustawienia...", - "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": "Ukryj", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Skonfiguruj za pomocą importowania", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Skonfiguruj jako nowe urządzenie", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Skonfiguruj jako samodzielne urządzenie", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Wybierz plik", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Załaduj swoje dane", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Właśnie przeszedłeś proces eksportu, twoje kontakty i wiadomości czekają cierpliwie na twoim komputerze. Wybierz folder zawierający zapisane dane Signal.", + "message": "Właśnie przeszedłeś proces eksportu, twoje kontakty i wiadomości czekają cierpliwie na twoim komputerze. Wybierz folder zawierający zapisane dane Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Upewnij się, że wybrałeś właściwy folder zawierający dane Signal. Jego nazwa powinna zaczynać się na \"Signal Export\". Możesz też zapisać nową kopię danych z aplikacji Chrome.", + "message": "Upewnij się, że wybrałeś właściwy folder zawierający dane Session. Jego nazwa powinna zaczynać się na \"Session Export\". Możesz też zapisać nową kopię danych z aplikacji Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Rozpocznij korzystanie z Signal Desktop", + "message": "Rozpocznij korzystanie z Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Połącz to urządzenie z telefonem", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "wybrana lokalizacja", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Uaktualnianie bazy danych. To może zająć chwilę...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Ładowanie. Załadowanych wiadomości: $count$ ", - "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": "Ja", "description": "The label for yourself when shown in a group member list" @@ -256,27 +202,15 @@ "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Opuściłeś(aś) grupę", + "message": "Opuściłeś(aś) grupę.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Przewiń na koniec konwersacji", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nowa wiadomość poniżej", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nowe wiadomości poniżej", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { - "message": "1 nieprzeczytana wiadomość", + "message": "$count$ nieprzeczytana wiadomość", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "Nieprzeczytane wiadomości: $count$", + "message": "$count$ nieprzeczytanych wiadomości", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako zweryfikowany", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako zweryfikowany", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako niezweryfikowany", + "message": "Oznaczyłeś(aś) 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": { @@ -306,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako zweryfikowany z innego urządzenia", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako zweryfikowany na innym urządzeniu", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako niezweryfikowany z innego urządzenia", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako niezweryfikowany na innym urządzeniu", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -330,11 +264,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": "Twoje numery bezpieczeństwa z tymi członkami grupy zmieniły się od ostatniego czasu gdy je weryfikowałeś(aś). To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, albo że członkowie grupy po prostu przeinstalowali aplikację Signal.", + "message": "Twoje numery bezpieczeństwa z tymi członkami grupy zmieniły się od ostatniego czasu gdy je weryfikowałeś(aś). To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, albo że członkowie grupy po prostu przeinstalowali aplikację Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Twój numer bezpieczeństwa z $name$ zmienił się od ostatniego czasu gdy go zweryfikowałeś. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, albo że $name$ po prostu przeinstalował(a) aplikację Signal. ", + "message": "Twój numer bezpieczeństwa z $name$ zmienił się i nie już zweryfikowany. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub, że $name$ przeinstalował Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Numer bezpieczeństwa, który próbujesz zweryfikować zmienił się. Proszę sprawdź go z $name$. Pamiętaj, że to może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub po prostu $name$ przeinstalował(a) aplikację Signal. ", + "message": "Numer bezpieczeństwa, który próbujesz zweryfikować zmienił się. Proszę sprawdź go z $name$. Pamiętaj, że to może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub po prostu $name$ przeinstalował(a) aplikację Session. ", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Twoje numbery bezpieczeństwa z wieloma członkami grupy ostatnio się zmieniły. To może znaczyć, że ktoś próbuje przechwycić Twoją komunikację, albo że członkowie grupy po prostu przeinstalowali aplikację Signal.", + "message": "Twoje numbery bezpieczeństwa z wieloma członkami grupy ostatnio się zmieniły. To może znaczyć, że ktoś próbuje przechwycić Twoją komunikację, albo że członkowie grupy po prostu przeinstalowali aplikację Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Numer bezpieczeństwa $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub że po prostu $name$ przeinstalował(a) aplikację Signal. ", + "message": "Numer bezpieczeństwa z $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, lub że po prostu $name$ przeinstalował Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Numer bezpieczeństwa z $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub, że po prostu $name$ przeinstalował(a) aplikację Signal. Możesz zweryfikować nowy numer bezpieczeństwa poniżej.", + "message": "Numer bezpieczeństwa z $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub, że po prostu $name$ przeinstalował(a) aplikację Session. Możesz zweryfikować nowy numer bezpieczeństwa poniżej.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Rozumiem!", + "message": "Rozumiem", "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": "Wyślij", "description": "" }, - "acceptNewKey": { - "message": "Akceptuj", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Oznacz jako zweryfikowany", "description": "" @@ -428,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Zweryfikowałeś(aś) numer bezpieczeństwa z $name$.", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako zweryfikowany", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -448,27 +378,23 @@ } }, "verified": { - "message": "Zweryfikowany", + "message": "Zweryfikowano", "description": "" }, "newIdentity": { "message": "Nowy numer bezpieczeństwa", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Numer bezpieczeństwa dla tego kontaktu zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub że po prostu kontakt przeinstalował Signal. Możesz zweryfikować jego nowy numer bezpieczeństwa poniżej.", - "description": "" - }, "incomingError": { "message": "Błąd przy obsłudze przychodzącej wiadomości.", "description": "" }, "media": { - "message": "Media", + "message": "Multimedia", "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Nie masz żadnych mediów w tej rozmowie", + "message": "Brak multimediów", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,11 +402,11 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Nie masz żadnych dokumentów w tej rozmowie", + "message": "Brak dokumentów", "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": "Dziś", + "message": "Dzisiaj", "description": "Section header in the media gallery" }, "yesterday": { @@ -492,21 +418,9 @@ "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Ten miesiąc", + "message": "W tym miesiącu", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nieobsługiwany typ załącznika. Kliknij, aby zapisać.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Kliknij, aby zapisać", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Plik bez nazwy", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Wiadomość głosowa", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Ze względów bezpieczeństwa ten typ załącznika nie jest dozwolony", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Wczytywanie podglądu...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Projekt miniaturki podglądu linku do $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Podgląd miniaturki linku dla $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Wybrany plik przekracza ograniczenia rozmiaru wiadomości.", + "message": "Rozmiar tego załącznika przekracza limit wiadomości.", "description": "" }, "unableToLoadAttachment": { - "message": "Nie można załadować wybranego załącznika.", + "message": "Przepraszamy, wystąpił błąd podczas dodawania załącznika.", "description": "" }, - "disconnected": { - "message": "Odłączony", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "Trwa łączenie", + "message": "Łączenie...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "Przejdź do informacji o wersji", "description": "" }, - "goToForums": { - "message": "Przejdź do forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Przejdź do strony wsparcia", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Zgłoś problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferencje", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "O Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Mów", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Pokaż", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ukryj", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Wyjdź", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Szukaj", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Witamy w Signal", - "description": "" - }, - "selectAContact": { - "message": "Wybierz kontakt lub grupę aby zacząć rozmowę.", + "message": "Witamy w Session.", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Wyślij wiadomość", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Dom", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,30 +633,16 @@ "message": "Ty", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Odpowiedz $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": "Aby wysyłać wiadomości audio, zezwól aplikacji Signal Desktop na dostęp do mikrofonu.", + "message": "Aby wysyłać wiadomości głosowe, zezwól Session na dostęp do mikrofonu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Zezwól", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Pokaż ustawienia", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { - "message": "Dzwięk", + "message": "Dźwięk", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" }, "video": { @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Anuluj", "description": "" }, - "failedToSend": { - "message": "Nie można było wysłać wiadomości do niektórych adresatów. Sprawdź połączenie z internetem.", - "description": "" - }, "error": { "message": "Błąd", "description": "" }, - "messageDetail": { - "message": "Szczegóły wiadomości", - "description": "" - }, "delete": { "message": "Usuń", "description": "" @@ -834,11 +682,11 @@ "description": "" }, "from": { - "message": "Od", + "message": "Od:", "description": "Label for the sender of a message" }, "to": { - "message": "do", + "message": "Do:", "description": "Label for the receiver of a message" }, "sent": { @@ -846,7 +694,7 @@ "description": "Label for the time a message was sent" }, "received": { - "message": "Odebrano", + "message": "Otrzymano", "description": "Label for the time a message was received" }, "sendMessage": { @@ -857,22 +705,14 @@ "message": "Członkowie grupy", "description": "" }, - "showMembers": { - "message": "Pokaż członków", - "description": "" - }, "resetSession": { - "message": "Reset sesji", + "message": "Reset bezpiecznej sesji", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { "message": "Zobacz numer bezpieczeństwa", "description": "" }, - "viewAllMedia": { - "message": "Wyświetl wszystkie multimedia", - "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": "Jeżeli życzysz sobie aby sprawdzić bezpieczeństwo Twojego szyfrowanego połączenia z $name$, sprawdź cyfry powyżej z cyframi na jego (jej) urządzeniu.", "description": "", @@ -887,14 +727,6 @@ "message": "Jeszcze nie rozmawiałeś(aś) z tą osobą. Numer bezpieczeństwa będzie dostępny po pierwszej wiadomości.", "description": "" }, - "moreInfo": { - "message": "Więcej informacji...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Spróbuj ponownie wysłać", - "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": "Usuń wiadomość", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Zapisz", "description": "" }, - "fileIconAlt": { - "message": "Ikona pliku", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Ikonka emoji '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Witamy w Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Prywatność jest możliwa i łatwa dzięki Signal.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Połącz swój telefon z Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Ustawienia Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Połączone urządzenia", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Przycisk", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "Połącz nowe urządzenie", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nazwa urządzenia", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Wybierz nazwę urządzenia", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Zakończ łączenie telefonu", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Trwa synchronizacja grup i kontaktów", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Nie można połączyć się z serwerem.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Niestety, masz za dużo połączonych urządzeń. Spróbuj usunąć kilka.", - "description": "" - }, - "settings": { - "message": "Ustawienia", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Motyw", - "description": "Header for theme settings" + "message": "Dodaj nowe urządzenie", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Uprawnienia", @@ -1029,34 +801,6 @@ "message": "Włącz sprawdzanie pisowni podczas pisania wiadomości", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Wyczyść dane", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Spowoduje to wyczyszczenie wszystkich danych w aplikacji, usunięcie wszystkich wiadomości i zapisanych informacji o koncie.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Wyczyść dane", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Usunąć wszystkie dane?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Zamierzasz usunąć wszystkie zapisane informacje o koncie, w tym wszystkie kontakty i wszystkie wiadomości. Zawsze możesz ponownie połączyć się z urządzeniem mobilnym, ale to nie przywróci usuniętych wiadomości.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Usuń wszystkie dane", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Odłączanie i usuwanie wszystkich danych", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Powiadomienia", "description": "Header for notification settings" @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Wyłącz powiadomienia", + "message": "Wycisz powiadomienia", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +834,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Najnowsze od:", + "message": "Najnowsza z: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,23 +846,15 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Wysyłanie nie powiodło się", + "message": "Nie udało się wysłać", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Szczegóły", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ukryj szczegóły", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Dowiedz się więcej o weryfikacji numerów bezpieczeństwa", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Ta wersja Signal Desktop jest przestarzała. Aby nadal wysyłać wiadomości, wykonaj aktualizację.", + "message": "Ta wersja Session Desktop jest przestarzała. Aby nadal wysyłać wiadomości, wykonaj aktualizację.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,36 +865,8 @@ "message": "Wiadomość multimedialna", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Niezarejestrowany numer", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakty", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Zaimportuj wszystkie grupy i kontakty ze swojego urządzenia mobilnego", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Ostatni import", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importuj", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importowanie...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import nieudany. Upewnij się, że komputer i urządzenie mobilne mają połączenie z internetem.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "teraz", + "message": "Teraz", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1 godzina", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ godz", - "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$ godz temu", - "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 temu", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "teraz", - "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'." @@ -1226,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Ustawiłeś(aś) znikające wiadomości na $time$", + "message": "Ustawiłeś(aś) znikające wiadomości na $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ ustawił(a) znikające wiadomości na $time$", + "message": "$name$ ustawił(a) znikające wiadomości na $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +924,7 @@ } }, "timerOption_0_seconds": { - "message": "wyłącz", + "message": "Wyłączone", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1312,7 +976,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "wyłączone", + "message": "wyłączona", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1360,11 +1024,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Znikające wiadomości wyłączone", + "message": "Znikające wiadomości zostały wyłączone", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ wyłączył(a) znikające wiadomości", + "message": "$name$ wyłączył(a) znikające wiadomości.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Wyłączyłeś(aś) znikające wiadomości", + "message": "Wyłączyłeś(aś) znikające wiadomości.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Czas ustawiony na $time$.", + "message": "Czas znikania wiadomości ustawiony na $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1387,16 +1051,12 @@ } } }, - "audioNotificationDescription": { - "message": "Odtwórz powiadomienie dźwiękowe", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { - "message": "Numer bezpieczeństwa się zmienił", + "message": "Numer bezpieczeństwa zmienił się", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Numer bezpieczeństwa z $name$ został zmieniony", + "message": "Twój numer bezpieczeństwa z $name$ zmienił się.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Jasny", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 nową rozmowę...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Wprowadź numer telefonu, aby dodać kontakt", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Nieprawidłowy numer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Połącz ponownie Signal Desktop z urządzeniem mobilnym, aby móc dalej wysyłać wiadomości.", - "description": "" - }, - "unlinked": { - "message": "Odłączony", - "description": "" - }, - "relink": { - "message": "Połącz ponownie", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Dostępna aktualizacja aplikacji Session", "description": "" @@ -1480,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ opuścił(a) grupę", + "message": "$name$ opuścił(a) grupę.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1500,11 +1132,11 @@ } }, "updatedTheGroup": { - "message": "Grupa została uaktualniona", + "message": "Grupa zaktualizowana", "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Zmiana tytułu na '$name$'", + "message": "Aktualna nazwa grupy to '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ dołączył(a) do grupy", + "message": "$name$ dołączył(a) do grupy.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ dołączyli do grupy", + "message": "$name$ dołączyli do grupy.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,248 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Regulamin & Polityka prywatności" + }, + "unknown": { + "message": "Nieznany" + }, + "changedSinceVerifiedTitle": { + "message": "Numer bezpieczeństwa zmienił się" + }, + "youMayWishToVerifyContact": { + "message": "Możesz zweryfikować numer bezpieczeństwa z tym kontaktem." + }, + "about": { + "message": "O mnie" + }, + "settingsHeader": { + "message": "Ustawienia" + }, + "continue": { + "message": "Kontynuuj" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Osiągnięto limit urządzeń" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Masz zbyt dużo powiązanych urządzeń, spróbuj usunąć któreś z nich zanim spróbujesz ponownie" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Otrzymano żądanie połączenia" + }, + "waitingForDeviceToRegister": { + "message": "Oczekiwanie na urządzenie" + }, + "pairNewDevicePrompt": { + "message": "Zeskanuj kod QR wyświetlony na urządzeniu, które chcesz dodać" + }, + "noPairedDevices": { + "message": "Brak powiązanych urządzeń" + }, + "deviceUnpaired": { + "message": "Twoje urządzenie zostało rozłączone pomyślnie" + }, + "sendMessageLeftGroup": { + "message": "Opuściłeś(aś) grupę." + }, + "moreInformation": { + "message": "Więcej informacji" + }, + "resend": { + "message": "Wyślij ponownie" + }, + "clearAllData": { + "message": "Wyczyść wszystkie dane" + }, + "deleteAccountWarning": { + "message": "Spowoduje to trwałe usunięcie wiadomości, Session i kontaktów." + }, + "deleteContactConfirmation": { + "message": "Czy na pewno chcesz usunąć tę rozmowę?" + }, + "copy": { + "message": "Kopiuj" + }, + "linkPreviewsTitle": { + "message": "Podgląd linków" + }, + "linkPreviewDescription": { + "message": "Podglądy linków są wspierane dla Imgur, Instagram, Pinterest, Reddit i YouTube." + }, + "readReceiptSettingTitle": { + "message": "Potwierdzenia przeczytania" + }, + "typingIndicatorsSettingTitle": { + "message": "Wskaźniki pisania" + }, + "themeToggleTitle": { + "message": "Jasny" + }, + "successUnlinked": { + "message": "Twoje urządzenie zostało rozłączone pomyślnie" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Pobierz" + }, + "blockUser": { + "message": "Zablokuj" + }, + "unblockUser": { + "message": "Odblokuj" + }, + "blockedSettingsTitle": { + "message": "Zablokowane kontakty" + }, + "leaveGroup": { + "message": "Opuść grupę" + }, + "leaveGroupConfirmation": { + "message": "Czy na pewno chcesz opuścić tę grupę?" + }, + "noContactsForGroup": { + "message": "Nie masz jeszcze żadnych kontaktów" + }, + "editGroup": { + "message": "Edytuj grupę" + }, + "updateGroupDialogTitle": { + "message": "Aktualizowanie $name$..." + }, + "showRecoveryPhrase": { + "message": "Zwrot odzyskiwania" + }, + "yourSessionID": { + "message": "Twój identyfikator Session" + }, + "recoveryPhraseSavePromptMain": { + "message": "Twoja fraza odzyskiwania jest kluczem głównym do identyfikatora Session - możesz go użyć do przywrócenia identyfikatora Session, jeśli stracisz dostęp do urządzenia. Przechowuj swoją frazę odzyskiwania w bezpiecznym miejscu i nikomu jej nie udostępniaj." + }, + "copiedToClipboard": { + "message": "Skopiowane do schowka" + }, + "unlock": { + "message": "Odblokuj" + }, + "connectToServerFail": { + "message": "Nie można dołączyć do grupy" + }, + "connectingToServer": { + "message": "Łączenie..." + }, + "remove": { + "message": "Usuń" + }, + "invalidSessionId": { + "message": "Nieprawidłowy identyfikator Session" + }, + "emptyGroupNameError": { + "message": "Wpisz nazwę grupy" + }, + "groupNamePlaceholder": { + "message": "Nazwa grupy" + }, + "inviteContacts": { + "message": "Zaproś znajomych" + }, + "yourUniqueSessionID": { + "message": "Przywitaj się z identyfikatorem Session" + }, + "allUsersAreRandomly...": { + "message": "Twój identyfikator Session to unikalny adres, za pomocą którego można się z Tobą kontaktować w Sesji. Bez połączenia z twoją prawdziwą tożsamością, identyfikator Session jest z założenia całkowicie anonimowy i prywatny." + }, + "generateSessionID": { + "message": "Utwórz identyfikator Session" + }, + "recoveryPhrase": { + "message": "Zwrot odzyskiwania" + }, + "enterRecoveryPhrase": { + "message": "Wpisz swoją frazę odzyskiwania" + }, + "enterDisplayName": { + "message": "Wprowadź wyświetlaną nazwe" + }, + "enterSessionIDHere": { + "message": "Wpisz swój identyfikator Session" + }, + "continueYourSession": { + "message": "Kontynuuj swoją sesję" + }, + "linkDevice": { + "message": "Połącz urządzenie" + }, + "restoreUsingRecoveryPhrase": { + "message": "Przywróć swoje konto" + }, + "newSession": { + "message": "Nowa Session" + }, + "searchFor...": { + "message": "Szukaj rozmów, kontaktów i wiadomości" + }, + "enterSessionID": { + "message": "Wpisz identyfikator Session" + }, + "enterSessionIDOfRecipient": { + "message": "Wprowadź identyfikator Session odbiorcy" + }, + "usersCanShareTheir...": { + "message": "Użytkownicy mogą udostępnić swój identyfikator Session, przechodząc do ustawień konta i stukając opcję Udostępnij identyfikator Session lub udostępniając kod QR." + }, + "appearanceSettingsTitle": { + "message": "Wygląd" + }, + "privacySettingsTitle": { + "message": "Prywatność" + }, + "notificationsSettingsTitle": { + "message": "Powiadomienia" + }, + "devicesSettingsTitle": { + "message": "Połączone urządzenia" + }, + "recoveryPhraseEmpty": { + "message": "Wpisz swoją frazę odzyskiwania" + }, + "displayNameEmpty": { + "message": "Wybierz wyświetlaną nazwę" + }, + "joinOpenGroup": { + "message": "Dołącz do Open Group" + }, + "newClosedGroup": { + "message": "Nowa grupa zamknięta" + }, + "createClosedGroupNamePrompt": { + "message": "Nazwa grupy" + }, + "createClosedGroupPlaceholder": { + "message": "Wpisz nazwę grupy" + }, + "openGroupURL": { + "message": "Otwórz adres URL grupy" + }, + "enterAnOpenGroupURL": { + "message": "Wprowadź adres URL otwartej grupy" + }, + "next": { + "message": "Dalej" + }, + "pairingDevice": { + "message": "Rejestrowanie urządzenia" + }, + "invalidGroupNameTooShort": { + "message": "Wpisz nazwę grupy" + }, + "invalidGroupNameTooLong": { + "message": "Wprowadź krótszą nazwę grupy" + }, + "closedGroupMaxSize": { + "message": "Grupa zamknięta nie może mieć więcej niż 20 członków" + }, + "noBlockedContacts": { + "message": "Brak zablokowanych kontaktów" } -} +} \ No newline at end of file diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index 84136fba0..3b2d32270 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -3,18 +3,10 @@ "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." @@ -24,7 +16,7 @@ "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": "E&xibir", + "message": "&Ver", "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": { @@ -32,13 +24,9 @@ "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": "Aju&da", + "message": "&Ajuda", "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": "Preferências...", - "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", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Sair do Signal", + "message": "Sair do Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -80,11 +68,11 @@ "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { - "message": "Apagar", + "message": "Excluir", "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Selecionar tudo", + "message": "Selecionar Todas", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -135,10 +123,6 @@ "message": "Configurar e importar", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configurar como Novo Aparelho", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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": "Escolher arquivo", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carregar seus dados", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Você acabou de terminar o processo de exportação, e os seus contatos e mensagens esperam por você. Selecione a pasta que contém os seus dados do Signal salvos.", + "message": "Você acabou de terminar o processo de exportação, e os seus contatos e mensagens esperam por você. Selecione a pasta que contém os seus dados do Session salvos.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Confira se escolheu o diretório certo, que contém seus dados exportados do Signal. O nome da pasta deve começar com 'Signal Export'. Você também pode baixar seus dados novamente usando o Chrome App.", + "message": "Confira se escolheu o diretório certo, que contém seus dados exportados do Session. O nome da pasta deve começar com 'Session Export'. Você também pode baixar seus dados novamente usando o Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,57 +186,27 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Comece a usar o Signal Desktop", + "message": "Comece a usar o Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Religar este aparelho ao seu telefone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "você escolheu uma localização", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Atualizando a base de dados. Isso pode levar um tempo...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Carregando mensagens. $count$ até agora...", - "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": "Eu", "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Exibir", + "message": "Ver", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Voce 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": "Deslizar até o início da conversa", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nova mensagem abaixo", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Novas mensagens abaixo", - "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": "$count$ Mensagem Não Lida", "description": "Text for unread message separator, just one message" }, "unreadMessages": { @@ -286,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "Você marcou seu Número de Segurança com $name$ como verificado", + "message": "Você marcou o seu número de segurança com $name$ como verificado", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Você marcou seu Número de Segurança com $name$ como não verificado", + "message": "Você marcou o seu número de segurança com $name$como não verificado", "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": { @@ -306,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Você marcou seu Número de Segurança com $name$ como verificado usando outro aparelho", + "message": "Você marcou o seu número de segurança com $name$como verificado a partir de outro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Você marcou seu Número de Segurança com $name$ como não verificado usando outro aparelho", + "message": "Você marcou o seu número de segurança com $name$ como não verificado a partir de outro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -330,11 +264,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 seus números de segurança com vários membros de grupos mudaram desde a última vez que você os verificou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que esses contatos reinstalaram Signal.", + "message": "Os seus números de segurança com vários membros de grupos mudaram desde a última vez que você os verificou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que esses contatos reinstalaram Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "O seu número de segurança com $name$mudou desde a última vez que você o verificou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Signal.", + "message": "Seu número de segurança com $name$ mudou e não está verificado. Isso pode significar que alguém está tentando interceptar a sua comunicação ou que $name$ simplesmente reinstalou o Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "O número de segurança que você está tentando verificar mudou. Por favor, confira o seu número de segurança com $name$. Lembre-se que isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Signal.", + "message": "O número de segurança que você está tentando verificar mudou. Por favor, confira o seu número de segurança com $name$. Lembre-se que isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Os seus números de segurança com vários membros mudaram recentemente. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que esses contatos reinstalaram Signal.", + "message": "Os seus números de segurança com vários membros mudaram recentemente. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que esses contatos reinstalaram Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "O seu número de segurança com $name$mudou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Signal.", + "message": "Seu número de segurança com $name$ mudou. Isso pode significar que alguém está tentando interceptar a sua comunicação ou que $name$ simplesmente reinstalou o Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "O seu número de segurança com $name$mudou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Signal. Recomendamos que você verifique o seu número de segurança com essa pessoa.", + "message": "O seu número de segurança com $name$mudou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Session. Recomendamos que você verifique o seu número de segurança com essa pessoa.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Entendido!", + "message": "Entendi", "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", "description": "" }, - "acceptNewKey": { - "message": "Aceitar", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marcar como verificado", "description": "" @@ -428,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Você verificou o seu número de segurança com $name$.", + "message": "Você marcou o seu número de segurança com $name$ como verificado", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -455,10 +385,6 @@ "message": "Novo número de segurança", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "O seu número de segurança com este contato mudou. Isso pode significar uma tentativa de interceptação das suas comunicações ou uma simples reinstalação do Signal. Recomendamos-lhe verificar o novo número de segurança, abaixo.", - "description": "" - }, "incomingError": { "message": "Erro ao receber mensagem", "description": "" @@ -468,7 +394,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Você não possui nenhuma mídia nessa conversa", + "message": "Nenhuma mídia", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +402,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Você não possui nenhum documento nessa conversa", + "message": "Nenhum documento", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,25 +414,13 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Essa semana", + "message": "Esta Semana", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Esse mês", + "message": "Este Mês", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipo de anexo incompatível. Clique para salvar. ", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Clicar para salvar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Arquivo sem nome", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mensagem de Voz", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Tipo de anexo não permitido por motivos de segurança", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Carregando pré-visualização...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Pré-visualização em miniatura do link $domain$ (rascunho)", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Pré-visualização em miniatura do link $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Desculpe, o arquivo selecionado excede o tamanho máximo aceito.", + "message": "O anexo excede os limites de tamanho para o tipo de mensagem sendo enviada.", "description": "" }, "unableToLoadAttachment": { - "message": "Não foi possível carregar o anexo selecionado.", + "message": "Desculpe, ocorreu um erro ao anexar o documento.", "description": "" }, - "disconnected": { - "message": "Desconectado", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "Conectando…", + "message": "Conectando...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "Ir para Notas de Lançamento", "description": "" }, - "goToForums": { - "message": "Ir para Fóruns", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Ir para Página de Suporte", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Relatar um problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferências do Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Sobre o Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Fala", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,24 +529,12 @@ "message": "Exibir", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Esconder", - "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { - "message": "Buscar", + "message": "Procurar", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Sem resultados para \"$searchTerm$\"", + "message": "Nenhum resultado encontrado para \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Boas-vindas ao Signal", - "description": "" - }, - "selectAContact": { - "message": "Selecione um contato ou grupo para começar a conversar.", + "message": "Boas-vindas ao Session.", "description": "" }, "typingAlt": { @@ -695,20 +573,16 @@ } } }, - "sendMessageToContact": { - "message": "Enviar Mensagem", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { - "message": "casa", + "message": "Casa", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "trabalho", + "message": "Trabalho", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "celular", + "message": "Celular", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -759,28 +633,14 @@ "message": "Você", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Respondendo para $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": "Para enviar mensagens de áudio, permita que o Signal Desktop acesse o microfone.", + "message": "Para enviar mensagens de áudio permita ao Session acessar o microfone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Permitir acesso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostrar configurações", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Áudio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,20 +665,12 @@ "message": "Cancelar", "description": "" }, - "failedToSend": { - "message": "Falha ao enviar para alguns destinatários. Verifique a sua conexão de rede.", - "description": "" - }, "error": { "message": "Erro", "description": "" }, - "messageDetail": { - "message": "Detalhe da mensagem", - "description": "" - }, "delete": { - "message": "Apagar", + "message": "Excluir", "description": "" }, "deleteWarning": { @@ -830,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Apagar essa mensagem", + "message": "Excluir mensagem", "description": "" }, "from": { - "message": "De", + "message": "De:", "description": "Label for the sender of a message" }, "to": { - "message": "para", + "message": "Para:", "description": "Label for the receiver of a message" }, "sent": { @@ -857,22 +705,14 @@ "message": "Membros do grupo", "description": "" }, - "showMembers": { - "message": "Mostrar membros", - "description": "" - }, "resetSession": { - "message": "Reiniciar a sessão", + "message": "Reiniciar Sessão Segura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Ver número de segurança", + "message": "Ver Número De Segurança", "description": "" }, - "viewAllMedia": { - "message": "Ver todas as mídias", - "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 você quiser verificar a segurança da sua criptografia ponta a ponta com $name$, compare os números acima com os números no aparelho dessa pessoa.", "description": "", @@ -887,16 +727,8 @@ "message": "Você ainda não trocou nenhuma mensagem com a pessoa deste contato. O seu número de segurança com ela será disponível após a primeira mensagem.", "description": "" }, - "moreInfo": { - "message": "Detalhes", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Reenviar", - "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": "Excluir", + "message": "Excluir Mensagem", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -939,10 +771,6 @@ "message": "Salvar", "description": "" }, - "fileIconAlt": { - "message": "Ícone do arquivo", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Boas-vindas ao Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacidade é possível. Signal faz com que ela seja fácil.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Conecte seu telefone ao Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Configurações do Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispositivos vinculados", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Botão '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "Vincular novo dispositivo", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nome do aparelho", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Escolher o nome deste aparelho", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Terminar a conexão ao celular", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronizando contatos e grupos", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Falha de conexão ao servidor.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Desculpe. Há muitos aparelhos já religados. Tente remover alguns.", - "description": "" - }, - "settings": { - "message": "Configurações", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "message": "Vincular Novo Dispositivo", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissões", @@ -1029,36 +801,8 @@ "message": "Ativar a verificação ortográfica do texto digitado na caixa de edição de mensagens", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Limpar dados", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Você limpará todos os dados do aplicativo, removendo todas as mensagens e informações de conta salvas.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Limpar dados", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Apagar todos os dados?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Você está prestes a apagar todas as informações de conta salvas no aplicativo, inclusive todos os contatos e todas as mensagens. Você continuará podendo conectar-se ao seu aparelho celular, mas as suas mensagens apagadas não serão restauradas. ", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Apagar todos os dados", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Desconectando e apagando todos os dados", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { - "message": "Notificações ", + "message": "Notificações", "description": "Header for notification settings" }, "notificationSettingsDialog": { @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Desabilitar notificações", + "message": "Silenciar notificações", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +834,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Última:", + "message": "Mais recente de: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,23 +846,15 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Falha no envio", + "message": "Envio Falhou", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalhes", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ocultar detalhes", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Saiba mais sobre como verificar números de segurança", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Esta versão do Signal Desktop expirou. Por favor, atualize-o para a versão mais recente para continuar enviando mensagens.", + "message": "Esta versão do Session 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" }, "upgrade": { @@ -1126,39 +862,11 @@ "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "Mensagem de mídia (MMS)", + "message": "MMS", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Número não registrado", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contatos", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importar todos os grupos e contatos do seu celular para o Signal. ", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última importação feita em ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importar agora", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importando...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Erro ao importar. O seu computador e o seu celular estão conectados à Internet?", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "agora", + "message": "Agora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "Há $hours$ h", - "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": "Há $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "agora", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1226,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Você ajustou o cronômetro para $time$", + "message": "Você definiu o tempo de duração das mensagens efêmeras como $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ ajustou o cronômetro para $time$", + "message": "$name$ definiu o tempo de duração das mensagens efêmeras como $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +924,7 @@ } }, "timerOption_0_seconds": { - "message": "desligar", + "message": "Desligado", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1312,7 +976,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "desligar", + "message": "desligado", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1360,11 +1024,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Mensagens efêmeras desativadas", + "message": "Mensagens efêmeras desabilitadas", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ desativou as mensagens efêmeras", + "message": "$name$ desabilitou as mensagens efêmeras.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Você desativou as mensagens efêmeras", + "message": "Você desabilitou as mensagens efêmeras.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Cronômetro definido para $time$", + "message": "Expiração da mensagem efêmera definida para $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1387,16 +1051,12 @@ } } }, - "audioNotificationDescription": { - "message": "Tocar notificações em áudio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { - "message": "Mudança do número de segurança", + "message": "Número de segurança alterado", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Seu número de segurança com $name$ mudou", + "message": "Seu número de segurança com $name$ mudou.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "Verificar número de segurança", + "message": "Verificar Número De Segurança", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Claro", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Escuro", - "description": "Label text for dark theme" - }, "noteToSelf": { - "message": "Recado para mim", + "message": "Recado pra 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 uma conversa…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Inserir um número de telefone para adicionar um contato.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Número inválido", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Religue Signal Desktop ao seu celular para continuar a enviar mensagens.", - "description": "" - }, - "unlinked": { - "message": "Não-religado", - "description": "" - }, - "relink": { - "message": "Religar", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Atualização do Session disponível", "description": "" @@ -1480,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ saiu do grupo", + "message": "$name$ saiu do grupo.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "O nome do grupo agora é '$name$'", + "message": "O nome do grupo agora é '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ entrou no grupo", + "message": "$name$ entrou no grupo.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ entrou no grupo", + "message": "$name$ entraram no grupo.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,248 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Termos & Política de Privacidade" + }, + "unknown": { + "message": "Desconhecida" + }, + "changedSinceVerifiedTitle": { + "message": "Número De Segurança Alterado" + }, + "youMayWishToVerifyContact": { + "message": "Talvez você queira verificar seu número de segurança com esse contato." + }, + "about": { + "message": "Sobre" + }, + "settingsHeader": { + "message": "Configurações" + }, + "continue": { + "message": "Continuar" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Limite de dispositivos atingido" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Desculpe, você já possui muitos dispositivos vinculados. Tente remover alguns." + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Solicitação de sincronização recebida" + }, + "waitingForDeviceToRegister": { + "message": "Aguardando dispositivo" + }, + "pairNewDevicePrompt": { + "message": "Escaneie o código QR mostrado no aparelho para vincular" + }, + "noPairedDevices": { + "message": "Nenhum dispositivo vinculado" + }, + "deviceUnpaired": { + "message": "O seu dispositivo foi dessincronizado com sucesso" + }, + "sendMessageLeftGroup": { + "message": "Você saiu do grupo." + }, + "moreInformation": { + "message": "Mais informações" + }, + "resend": { + "message": "Reenviar" + }, + "clearAllData": { + "message": "Limpar todos os dados" + }, + "deleteAccountWarning": { + "message": "Isso excluirá permanentemente suas mensagens, sessões e contatos." + }, + "deleteContactConfirmation": { + "message": "Tem certeza de que deseja excluir esta conversa?" + }, + "copy": { + "message": "Copiar" + }, + "linkPreviewsTitle": { + "message": "Enviar Pré-Visualizações De Links" + }, + "linkPreviewDescription": { + "message": "Visualizações são suportadas para links do Imgur, Instagram, Pinterest, Reddit e YouTube" + }, + "readReceiptSettingTitle": { + "message": "Confirmações De Leitura" + }, + "typingIndicatorsSettingTitle": { + "message": "Indicadores De Digitação" + }, + "themeToggleTitle": { + "message": "Claro" + }, + "successUnlinked": { + "message": "O seu dispositivo foi dessincronizado com sucesso" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Baixar" + }, + "blockUser": { + "message": "Bloquear" + }, + "unblockUser": { + "message": "Desbloquear" + }, + "blockedSettingsTitle": { + "message": "Contatos bloqueados" + }, + "leaveGroup": { + "message": "Sair Do Grupo" + }, + "leaveGroupConfirmation": { + "message": "Tem certeza de que deseja sair deste grupo?" + }, + "noContactsForGroup": { + "message": "Você ainda não possui contatos" + }, + "editGroup": { + "message": "Editar grupo" + }, + "updateGroupDialogTitle": { + "message": "Atualizando $name$..." + }, + "showRecoveryPhrase": { + "message": "Frase de recuperação" + }, + "yourSessionID": { + "message": "Seu ID Session" + }, + "recoveryPhraseSavePromptMain": { + "message": "Sua frase de recuperação é a chave mestra do seu ID Session - você pode usá-la para restaurar seu ID Session se perder o acesso ao seu dispositivo. Armazene sua frase de recuperação em um local seguro e não a entregue a ninguém." + }, + "copiedToClipboard": { + "message": "Copiado para a área de transferência" + }, + "unlock": { + "message": "Destrancar" + }, + "connectToServerFail": { + "message": "Não foi possível entrar no grupo" + }, + "connectingToServer": { + "message": "Conectando..." + }, + "remove": { + "message": "Remover" + }, + "invalidSessionId": { + "message": "ID Session inválido" + }, + "emptyGroupNameError": { + "message": "Digite um nome de grupo" + }, + "groupNamePlaceholder": { + "message": "Nome Do Grupo" + }, + "inviteContacts": { + "message": "Convidar Amigos" + }, + "yourUniqueSessionID": { + "message": "Diga olá ao seu ID Session" + }, + "allUsersAreRandomly...": { + "message": "Seu ID Session é o endereço exclusivo que as pessoas podem usar para entrar em contato com você no Session. Sem conexão com sua identidade real, seu ID Session é totalmente anônimo e privado por definição." + }, + "generateSessionID": { + "message": "Criar ID Session" + }, + "recoveryPhrase": { + "message": "Frase de recuperação" + }, + "enterRecoveryPhrase": { + "message": "Digite sua frase de recuperação" + }, + "enterDisplayName": { + "message": "Digite um nome de exibição" + }, + "enterSessionIDHere": { + "message": "Digite seu ID Session" + }, + "continueYourSession": { + "message": "Continuar com seu Session" + }, + "linkDevice": { + "message": "Sincronize dispositivo" + }, + "restoreUsingRecoveryPhrase": { + "message": "Restaurar sua conta" + }, + "newSession": { + "message": "Nova Sessão" + }, + "searchFor...": { + "message": "Buscar conversas, contatos e mensagens" + }, + "enterSessionID": { + "message": "Digite o ID Session" + }, + "enterSessionIDOfRecipient": { + "message": "Digite o ID Session do destinatário" + }, + "usersCanShareTheir...": { + "message": "Os usuários podem compartilhar seus IDs Session acessando as configurações da conta e tocando em Compartilhar ID Session, ou compartilhando o código QR." + }, + "appearanceSettingsTitle": { + "message": "Aparência" + }, + "privacySettingsTitle": { + "message": "Privacidade" + }, + "notificationsSettingsTitle": { + "message": "Notificações" + }, + "devicesSettingsTitle": { + "message": "Dispositivos vinculados" + }, + "recoveryPhraseEmpty": { + "message": "Digite sua frase de recuperação" + }, + "displayNameEmpty": { + "message": "Escolha um nome de exibição" + }, + "joinOpenGroup": { + "message": "Participar em grupo aberto" + }, + "newClosedGroup": { + "message": "Novo grupo fechado" + }, + "createClosedGroupNamePrompt": { + "message": "Nome Do Grupo" + }, + "createClosedGroupPlaceholder": { + "message": "Digite o nome do grupo" + }, + "openGroupURL": { + "message": "URL do grupo aberto" + }, + "enterAnOpenGroupURL": { + "message": "Digite a URL do grupo aberto" + }, + "next": { + "message": "Avançar" + }, + "pairingDevice": { + "message": "Vinculando Dispositivo" + }, + "invalidGroupNameTooShort": { + "message": "Digite um nome de grupo" + }, + "invalidGroupNameTooLong": { + "message": "Digite um nome de grupo mais curto" + }, + "pickClosedGroupMember": { + "message": "Escolha pelo menos 2 membros do grupo" + }, + "closedGroupMaxSize": { + "message": "Um grupo fechado não pode ter mais de 20 membros" } -} +} \ No newline at end of file diff --git a/_locales/pt_PT/messages.json b/_locales/pt_PT/messages.json index cf50a6fdc..25cf867f4 100644 --- a/_locales/pt_PT/messages.json +++ b/_locales/pt_PT/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Ajuda", "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": "Definições...", - "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": "Ocultar", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Sair do Signal", + "message": "Sair do Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "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", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Escolher ficheiro", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carregar os seus dados", "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. Selecione 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 Session guardados.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "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. ", + "message": "Assegure-se que escolheu a diretoria correta onde se encontram os seus dados do Session. O nome da diretoria deverá começar por 'Session 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": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Começar a utilizar o Signal Desktop", + "message": "Começar a utilizar o Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Ligar este dispositivo ao seu telefone", "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 selecionada", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "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": { - "message": "A carregar mensagens. $count$ até agora...", - "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": "Eu", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "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 fim da conversa", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nova mensagem abaixo", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Novas mensagens abaixo", - "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 por ler", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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 intercetar 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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "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.", + "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,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 intercetar as suas comunicações ou simplesmente que $name$ 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 Session.", "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": { @@ -354,11 +288,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 intercetar as suas comunicações ou simplesmente que 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 Session.", "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 intercetar as suas comunicações ou simplesmente que $name$ 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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "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.", + "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 Session. 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": { @@ -415,10 +349,6 @@ "message": "Submeter", "description": "" }, - "acceptNewKey": { - "message": "Aceitar", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marcar como verificado", "description": "" @@ -455,10 +385,6 @@ "message": "Novo número de segurança", "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 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": { "message": "Erro a receber mensagem.", "description": "" @@ -495,18 +421,6 @@ "message": "Este mês", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Anexo com tipo não suportado. Clique para guardar.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Clique para guardar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Ficheiro sem nome", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mensagem de voz", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "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": { - "message": "A carregar a pré-visualização...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "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", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Pré-visualização da hiperligação da miniatura $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Não foi possível carregar o anexo selecionado.", "description": "" }, - "disconnected": { - "message": "Desligado", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "A ligar", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Ir para as notas de lançamento", "description": "" }, - "goToForums": { - "message": "Ir para os fóruns", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Ir para a página de suporte", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Reportar um problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Definições do Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Acerca do Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Fala", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Mostrar", "description": "Command under Window menu, to show the window" }, - "hide": { - "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Procurar", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bem-vindo(a) ao Signal", - "description": "" - }, - "selectAContact": { - "message": "Selecione um contacto ou grupo para começar a trocar mensagens.", + "message": "Bem-vindo(a) ao Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Enviar mensagem", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "casa", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Você", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "A responder a $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": "Para enviar mensagens de áudio, permita que o Signal aceda ao seu microfone.", + "message": "Para enviar mensagens de áudio, permita que o Session aceda ao seu microfone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Permitir o acesso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostrar definições", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Áudio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Cancelar", "description": "" }, - "failedToSend": { - "message": "Falha ao enviar para alguns destinatários. Verifique a sua ligação à rede", - "description": "" - }, "error": { "message": "Erro", "description": "" }, - "messageDetail": { - "message": "Detalhes da mensagem", - "description": "" - }, "delete": { "message": "Eliminar", "description": "" @@ -857,10 +705,6 @@ "message": "Membros do grupo", "description": "" }, - "showMembers": { - "message": "Mostrar membros", - "description": "" - }, "resetSession": { "message": "Reiniciar sessão", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Ver número de segurança", "description": "" }, - "viewAllMedia": { - "message": "Ver todos os média", - "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 existentes no dispositivo dessa pessoa.", "description": "", @@ -887,14 +727,6 @@ "message": "Ainda não trocou mensagens com este contacto. O seu número de segurança estará disponível a partir da primeira mensagem.", "description": "" }, - "moreInfo": { - "message": "Mais informação...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "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": "Eliminar mensagem", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Guardar", "description": "" }, - "fileIconAlt": { - "message": "Ícone do ficheiro", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji de '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "O Signal Desktop dá-lhe as boas-vindas!", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "A privacidade é possível. O Signal torna-a fácil.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Associar o seu telefone ao Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Definições do Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispositivos associados", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Botão '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Associar um novo dispositivo", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Nome do dispositivo", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Escolher o nome do dispositivo", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finalizar a associação ao telefone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "A sincronizar contactos e grupos", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Falha na ligação ao servidor", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Existem demasiados dispositivos associados. Tente remover alguns.", - "description": "" - }, - "settings": { - "message": "Definições", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissões", @@ -1029,34 +801,6 @@ "message": "Ative a verificação ortográfica para o texto introduzido", "description": "Description of the media permission description" }, - "clearDataHeader": { - "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 os dados guardados da sua conta.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Limpar dados", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Eliminar todos os dados?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "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": "Eliminar todos os dados", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "A desligar e a eliminar todos os dados", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificações", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Falha no envio", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalhes", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ocultar detalhes", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Saiba mais sobre a verificação dos números de segurança", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Esta versão do Signal Desktop expirou. Para poder continuar a enviar mensagens, actualize para a última versão .", + "message": "Esta versão do Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Mensagem de média", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Número não registado", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contactos", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importar todos os grupos e contactos do Signal a partir do seu dispositivo móvel.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última importação a ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importar agora", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "A importar...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "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": { "message": "agora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "há $hours$h", - "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": "há $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "agora", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Reproduzir notificação áudio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "O número de segurança foi alterado", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Claro", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 uma nova conversa…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introduza um número de telefone para adicionar como contacto.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Número inválido", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Para continuar a comunicar, volte a associar o Signal Desktop ao seu telemóvel.", - "description": "" - }, - "unlinked": { - "message": "Desassociado", - "description": "" - }, - "relink": { - "message": "Voltar a associar", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Existe uma actualização disponível para o Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/ro/messages.json b/_locales/ro/messages.json index de51cd86f..2acd34d8d 100644 --- a/_locales/ro/messages.json +++ b/_locales/ro/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Ajutor", "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": "Preferințe...", - "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": "Ascunde", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Închide Signal", + "message": "Închide Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Setează prin import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Setează ca dispozitiv nou", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Setează ca dispozitiv de sine stătător", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Alegeți fișier", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Încarcă-ți datele", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Tocmai ai trecut prin procesul de exportare și contactele și mesajele tale așteaptă răbdător în calculatorul tău. Alege directorul care conține datele tale Signal salvate.", + "message": "Tocmai ai trecut prin procesul de exportare și contactele și mesajele tale așteaptă răbdător în calculatorul tău. Alege directorul care conține datele tale Session salvate.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Începe să utlizezi Signal Desktop", + "message": "Începe să utlizezi Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Asociază acest dispozitiv cu telefonul tău", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "locația ta selectată", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Se actualizează baza de date. Va dura ceva timp...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Se încarcă mesajele. $count$ până acum...", - "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": "Eu", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Ai părăsit grupul", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Derulează în partea de jos a conversației", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Mesaj nou mai jos", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Mesaje noi mai jos", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Mesaj necitit", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Numerele tale de siguranță cu mai mulți membri din grup s-au modificat de la ultima verificare. Asta poate însemna că cineva încearcă să vă intercepteze comunicarea sau doar că ei au reinstalat Signal.", + "message": "Numerele tale de siguranță cu mai mulți membri din grup s-au modificat de la ultima verificare. Asta poate însemna că cineva încearcă să vă intercepteze comunicarea sau doar că ei au reinstalat Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Numărul tău de siguranță cu $name$ s-a modificat de când ai verificat ultima oară. Asta ar putea însemna că cineva încearcă să vă intercepteze comunicarea sau că $name$ a reinstalat Signal.", + "message": "Numărul tău de siguranță cu $name$ s-a modificat de când ai verificat ultima oară. Asta ar putea însemna că cineva încearcă să vă intercepteze comunicarea sau că $name$ a reinstalat Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Numărul de siguranță pe care il verifici s-a modificat. Te rog să revizuiești numărul de siguranță cu $name$. Reține, această schimbare poate însemna că cineva încearcă sa va intercepteze comunicarea sau că $name$ pur și simplu a reinstalat Signal.", + "message": "Numărul de siguranță pe care il verifici s-a modificat. Te rog să revizuiești numărul de siguranță cu $name$. Reține, această schimbare poate însemna că cineva încearcă sa va intercepteze comunicarea sau că $name$ pur și simplu a reinstalat Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Numerele tale de siguranță pentru mai mulți membrii din grup s-au schimbat recent. Asta poate însemna că cineva încearcă să intercepteze comunicarea, sau contactele și-au reinstalat Signal.", + "message": "Numerele tale de siguranță pentru mai mulți membrii din grup s-au schimbat recent. Asta poate însemna că cineva încearcă să intercepteze comunicarea, sau contactele și-au reinstalat Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Numărul tău de siguranță cu $name$ s-a modificat recent. Asta ar putea însemna că cineva încearcă să vă intercepteze comunicarea sau că $name$ a reinstalat Signal.", + "message": "Numărul tău de siguranță cu $name$ s-a modificat recent. Asta ar putea însemna că cineva încearcă să vă intercepteze comunicarea sau că $name$ a reinstalat Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Numărul tău de siguranță cu $name$ s-a modificat. Asta ar putea să însemne fie că cineva încearcă să intercepteze comunicarea voastră fie că $name$ pur și simplu a reinstalat Signal. Ar trebui să verifici numărul tău de siguranță cu acest contact.", + "message": "Numărul tău de siguranță cu $name$ s-a modificat. Asta ar putea să însemne fie că cineva încearcă să intercepteze comunicarea voastră fie că $name$ pur și simplu a reinstalat Session. Ar trebui să verifici numărul tău de siguranță cu acest contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Trimite", "description": "" }, - "acceptNewKey": { - "message": "Acceptă", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marchează ca fiind verificat", "description": "" @@ -455,10 +385,6 @@ "message": "Număr de siguranță nou", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Numărul de siguranță pentru acest contact s-a schimbat. Asta poate însemna că cineva încearcă să intercepteze comunicarea, sau contactul și-a reinstalat Signal. Ai putea dori să verifici noul număr de siguranță de mai jos.", - "description": "" - }, "incomingError": { "message": "Eroare la procesarea mesajului primit", "description": "" @@ -495,18 +421,6 @@ "message": "Luna asta", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipul ataşamentului nu este suportat. Click pentru a salva.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Apasă pentru a salva", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Fișier fără nume", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mesaj vocal", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "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": { - "message": "Se încarcă previzualizarea...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Nu s-a putut încărca atașamentul selectat.", "description": "" }, - "disconnected": { - "message": "Deconectat", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Se conectează", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Mergi la Notele de Lansare", "description": "" }, - "goToForums": { - "message": "Mergi la Forumuri", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Mergi la Pagina de Suport", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Raportează o problemă", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferințe Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Despre Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Vorbire", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Afișează", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ascunde", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Închide", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Căutați", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bun venit la Signal", - "description": "" - }, - "selectAContact": { - "message": "Alege un contact sau un grup pentru a discuta.", + "message": "Bun venit la Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Trimite mesaj", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "acasă", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Tu", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Răspuns de la $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": "Pentru a trimite mesaje audio, permite aplicației Signal Desktop accesul la microfonul tău.", + "message": "Pentru a trimite mesaje audio, permite aplicației Session Desktop accesul la microfonul tău.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Permite accesul", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Afișează setările", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Anulare", "description": "" }, - "failedToSend": { - "message": "Mesajul nu a putut fi trimis la unii destinatari. Verifică conexiunea la rețea.", - "description": "" - }, "error": { "message": "Eroare", "description": "" }, - "messageDetail": { - "message": "Detalii mesaj", - "description": "" - }, "delete": { "message": "Șterge", "description": "" @@ -857,10 +705,6 @@ "message": "Membrii grupului", "description": "" }, - "showMembers": { - "message": "Afișează membrii", - "description": "" - }, "resetSession": { "message": "Resetează sesiunea", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Afișează numărul de siguranță", "description": "" }, - "viewAllMedia": { - "message": "Vezi toate fișierele 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": "Dacă dorești să verifici numărul tău de siguranță a criptării conexiunii cu $name$, compară numerele de mai sus cu cele de pe dispozitivul lui.", "description": "", @@ -887,14 +727,6 @@ "message": "Nu ai schimbat până acum nici un mesaj cu acest contact. Numărul de siguranță va fi disponibil după primul mesaj.", "description": "" }, - "moreInfo": { - "message": "Mai multe informații...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Încearcă re-trimiterea", - "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": "Şterge mesajul", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Salvează", "description": "" }, - "fileIconAlt": { - "message": "Icoană fișier", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Imagine emoji pentru '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Bun venit la Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Confidențialitatea este posibilă. Signal face asta ușor.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Asociază telefonul tău cu Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Setări Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispozitive asociate", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Butonul '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Asociază dispozitiv nou", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Numele dispozitivului", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Alege numele dispozitivului", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finalizează asocierea telefonului", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronizare contacte și grupuri", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Conectarea la server a eșuat.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Ne pare rău, ai prea multe dispozitive asociate deja. Încearcă să elimini câteva.", - "description": "" - }, - "settings": { - "message": "Setări", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Temă", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permisiuni", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Șterge datele", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Această acțiune va șterge toate datele din aplicație, înlăturând toate mesajele și informațiile salvate despre cont", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Șterge datele", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Șterg toate datele?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Ești pe cale să ștergi toate informațiile de cont salvate ale acestei aplicații, inclusiv toate persoanele de contact și toate mesajele. Poți oricând să te conectezi din nou cu dispozitivul mobil, dar mesajele șterse nu vor fi restabilite.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Șterge toate datele", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Deconectare în curs și se șterg toate datele", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificări", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Trimitere eșuată", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalii", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ascunde detaliile", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Află mai multe despre verificarea numerelor de siguranță.", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Această versiune de Signal Desktop a expirat. Te rog actualizează aplicația la ultima versiune pentru a putea trimite mesaje în continuare.", + "message": "Această versiune de Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Mesaj media", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numărul nu este înregistrat", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacte", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importă toate grupurile și contactele Signal de pe dispozitivul tău mobil.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Ultima importare la", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importă acum", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Se importă...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importare eșuată. Verifică dacă calculatorul și telefonul sunt conectate la internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "acum", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "o oră", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ ore", - "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": "acum $hours$ ore", - "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": "acum $minutes$ minute", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "acum", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Redă notificarea audio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Numărul de siguranță s-a schimbat", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Deschisă", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 o conversație nouă...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introdu un număr de telefon pentru a adăuga un contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Număr invalid", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Asociază din nou Signal Desktop la dispozitivul tău mobil pentru a putea comunica din nou.", - "description": "" - }, - "unlinked": { - "message": "Disociat", - "description": "" - }, - "relink": { - "message": "Asociază din nou", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Este disponibilă o actualizare de Session ", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 0b67642b2..a319d95e0 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -3,18 +3,10 @@ "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." @@ -24,7 +16,7 @@ "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": "&Вид", + "message": "&Просмотреть", "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": { @@ -32,13 +24,9 @@ "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": "&Справка", + "message": "&Помощь", "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": "Настройки…", - "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": "Скрыть", "description": "Application menu command to hide the window" @@ -52,11 +40,11 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Выйти из Signal", + "message": "Выйти из Session", "description": "Application menu command to close the application" }, "editMenuUndo": { - "message": "Вернуть", + "message": "Отменить", "description": "Edit menu command to remove recently-typed text" }, "editMenuRedo": { @@ -84,7 +72,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Выбрать все", + "message": "Выбрать Все", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -135,10 +123,6 @@ "message": "Настроить с импортом", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Настроить как новое устройство", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Настроить как отдельное устройство", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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": "Выберите файл", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Загрузите свои данные", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Вы только что прошли процесс экспорта, и ваши контакты и сообщения терпеливо ждут вас на вашем компьютере. Выберите папку, содержащую сохраненные данные Signal.", + "message": "Вы только что прошли процесс экспорта, и ваши контакты и сообщения терпеливо ждут вас на вашем компьютере. Выберите папку, содержащую сохраненные данные Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Убедитесь, что выбран правильный каталог, содержащий сохраненные вами данные Signal. Его название должно начинаться с 'Signal Export'. Также вы можете сохранить новую копию своих данных из приложения Chrome.", + "message": "Убедитесь, что выбран правильный каталог, содержащий сохраненные вами данные Session. Его название должно начинаться с 'Session Export'. Также вы можете сохранить новую копию своих данных из приложения Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,61 +186,31 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Начните использовать Signal Desktop", + "message": "Начните использовать Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Свяжите это устройство с телефоном", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "выбранное расположение", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Обновление базы данных. Это может занять некоторое время...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Загрузка сообщений. Уже загружено $count$...", - "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": "Я", "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Просмотр", + "message": "Просмотреть", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Вы покинули группу", + "message": "Вы покинули группу.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Перейти в конец беседы", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Новое сообщение ниже", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Новые сообщения ниже", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { - "message": "1 непрочитанное сообщение", + "message": "$count$ Непрочитанное Сообщение", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ непрочитанных сообщений", + "message": "Непрочитанных Сообщений: $count$", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "Вы пометили свой код безопасности с $name$ как верифицированный.", + "message": "Вы отметили код безопасности с $name$ как подтверждённый", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Вы пометили свой код безопасности с $name$ как не верифицированный.", + "message": "Вы отметили код безопасности с $name$ как неподтверждённый", "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": { @@ -306,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Вы пометили свой код безопасности с $name$ как верифицированный на другом устройстве.", + "message": "Вы отметили код безопасности с $name$ как подтверждённый с другого устройства", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Вы пометили свой код безопасности с $name$ как не верифицированный на другом устройстве.", + "message": "Вы отметили код безопасности с $name$ как неподтверждённый с другого устройства", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -330,11 +264,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": "Коды безопасности с несколькими участниками группы изменились со времени последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или попросту кто-то из участников группы переустановил Signal.", + "message": "Коды безопасности с несколькими участниками группы изменились со времени последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или попросту кто-то из участников группы переустановил Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Код безопасности с $name$ изменился с момента последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или $name$ попросту переустановил Signal. ", + "message": "Ваш код безопасности с $name$ изменился и более не считается подтверждённым. Это означает, что либо вашу переписку пытаются перехватить, либо $name$ просто переустановил(а) Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Код безопасности который вы пытаетесь подтвердить уже изменился. Пожалуйста, перепроверьте код безопасности с $name$. Помните, что подобные изменения могут означать попытку перехвата ваших сообщений, либо $name$ попросту переустановил Signal.", + "message": "Код безопасности который вы пытаетесь подтвердить уже изменился. Пожалуйста, перепроверьте код безопасности с $name$. Помните, что подобные изменения могут означать попытку перехвата ваших сообщений, либо $name$ попросту переустановил Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Коды безопасности с несколькими участниками группы изменились со времени последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или попросту кто-то из участников переустановил Signal. ", + "message": "Коды безопасности с несколькими участниками группы изменились со времени последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или попросту кто-то из участников переустановил Session. ", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Код безопасности с $name$ изменился. Это может означать, что кто-то пытается перехватить ваши сообщения, или $name$ попросту переустановил Signal.", + "message": "Ваш код безопасности с $name$ изменился. Это означает, что либо вашу переписку пытаются перехватить, либо $name$ просто переустановил(а) Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Код безопасности с $name$ изменился. Это может означать, что кто-то пытается перехватить ваши сообщения, либо $name$ попросту переустановил Signal. Вы можете подтвердить свой код безопасности с данным контактом.", + "message": "Код безопасности с $name$ изменился. Это может означать, что кто-то пытается перехватить ваши сообщения, либо $name$ попросту переустановил Session. Вы можете подтвердить свой код безопасности с данным контактом.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Понятно!", + "message": "Понятно", "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": "Отправить", "description": "" }, - "acceptNewKey": { - "message": "Принять", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Отметить как подтвержденный", "description": "" @@ -428,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Вы подтвердили свой код безопасности с $name$.", + "message": "Вы отметили код безопасности с $name$ как подтверждённый", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -448,17 +378,13 @@ } }, "verified": { - "message": "Подтвержденный", + "message": "Подтверждён", "description": "" }, "newIdentity": { "message": "Новый код безопасности", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Код безопасности с этим контактом изменился. Это может означать, что кто-то пытается перехватить ваши сообщения, или собеседник попросту переустановил Signal. Вы можете подтвердить новый код безопасности указанный ниже.", - "description": "" - }, "incomingError": { "message": "Ошибка при обработке входящего сообщения", "description": "" @@ -468,7 +394,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "В этом разговоре нет медиафайлов", + "message": "Нет медиа-файлов", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +402,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "В этом разговоре нет документов", + "message": "Нет документов", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,25 +414,13 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "На этой неделе", + "message": "На Этой Неделе", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "В этом месяце", + "message": "В Этом Месяце", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Неподдерживаемый тип вложения. Нажмите, чтобы сохранить.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Нажмите для сохранения", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Безымянный файл", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Голосовое сообщение", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "По соображениям безопасности этот тип файлов нельзя пересылать в приложениях.", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Загрузка предварительного просмотра...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Черновик миниатюры предварительного просмотра ссылки для $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Миниатюра предварительного просмотра ссылки для $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "К сожалению, выбранный файл превышает ограничения на размер сообщений.", + "message": "Вложение превышает допустимый размер для данного типа сообщения.", "description": "" }, "unableToLoadAttachment": { - "message": "Невозможно загрузить выбранное приложение.", + "message": "Извините, произошла ошибка при обработке вложения.", "description": "" }, - "disconnected": { - "message": "Отключен", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "Соединение", + "message": "Соединяемся...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "Перейти к заметкам о релизе", "description": "" }, - "goToForums": { - "message": "Перейти к форумам", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Перейти на страницу поддержки", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Сообщить о проблеме", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Параметры Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "О Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Речь", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,24 +529,12 @@ "message": "Показать", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Скрыть", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Выйти", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Поиск", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Нет результатов для \"$searchTerm$\"", + "message": "Результаты не найдены для \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -662,7 +544,7 @@ } }, "conversationsHeader": { - "message": "Разговоры", + "message": "Беседы", "description": "Shown to separate the types of search results" }, "contactsHeader": { @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Добро пожаловать в Signal", - "description": "" - }, - "selectAContact": { - "message": "Выберите контакт или группу для начала общения.", + "message": "Добро пожаловать в Session.", "description": "" }, "typingAlt": { @@ -695,20 +573,16 @@ } } }, - "sendMessageToContact": { - "message": "Отправчить сообщение", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { - "message": "домашний", + "message": "Домашний", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "рабочий", + "message": "Рабочий", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "мобильный", + "message": "Мобильный", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -759,28 +633,14 @@ "message": "Вы", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Ответ $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": "Чтобы отправлять аудиосообщения, разрешите Signal Desktop доступ к микрофону.", + "message": "Для отправки аудиосообщений разрешите Session доступ к микрофону.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Разрешить доступ", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Показать настройки", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Аудио", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Отменить", "description": "" }, - "failedToSend": { - "message": "Не удалось отправить некоторым получателям. Проверьте сетевое соединение.", - "description": "" - }, "error": { "message": "Ошибка", "description": "" }, - "messageDetail": { - "message": "Детали сообщения", - "description": "" - }, "delete": { "message": "Удалить", "description": "" @@ -830,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Удалить это сообщение", + "message": "Удалить сообщение", "description": "" }, "from": { - "message": "От", + "message": "От:", "description": "Label for the sender of a message" }, "to": { - "message": "->", + "message": "Кому:", "description": "Label for the receiver of a message" }, "sent": { @@ -857,22 +705,14 @@ "message": "Участники группы", "description": "" }, - "showMembers": { - "message": "Показать участников", - "description": "" - }, "resetSession": { - "message": "Сбросить сессию", + "message": "Обновить Сеанс Шифрования", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Просмотреть код безопасности", + "message": "Просмотреть Код Безопасности", "description": "" }, - "viewAllMedia": { - "message": "Просмотреть все медиа", - "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": "Если вы хотите подтвердить безопасность вашего соединения с $name$, сравните код, указанные выше, с кодом на устройстве собеседника.", "description": "", @@ -887,16 +727,8 @@ "message": "Вы еще не обменивались сообщениями с данным собеседником. Код безопасности станет доступен после отправки первого сообщения.", "description": "" }, - "moreInfo": { - "message": "Больше информации...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Повторить отправку", - "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": "Удалить сообщение", + "message": "Удалить Сообщение", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -939,10 +771,6 @@ "message": "Сохранить", "description": "" }, - "fileIconAlt": { - "message": "Значок файла", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Добро пожаловать в Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Приватное общение возможно. Signal помогает его упростить.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Свяжите свой телефон с Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Настройки Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Связанные устройства", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Кнопка '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "Связать новое устройство", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Имя устройства", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Выберите имя этого устройства", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Связывание телефона закончено", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Синхронизация контактов и групп", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Не удалось подключиться к серверу.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Извините, вы привязали слишком много устройств. Попробуйте удалить неиспользуемые устройства.", - "description": "" - }, - "settings": { - "message": "Настройки", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Тема", - "description": "Header for theme settings" + "message": "Привязать Новое Устройство", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Разрешения", @@ -1029,34 +801,6 @@ "message": "Включить проверку орфографии текста, введенного в поле создания сообщения", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Очистить данные", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Это действие очистит все данные приложения, удалив все сообщения и информацию об учетной записи.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Очистить данные", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Удалить все данные?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Вы собираетесь удалить всю информацию об учетной записи из этого приложения, включая контакты и сообщения. Вы всегда можете повторно связать ваше мобильное устройство, но это не приведет к восстановлению удаленных сообщений.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Удалить все данные", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Отключение и удаление всех данных", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Уведомления", "description": "Header for notification settings" @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Отключить уведомления", + "message": "Отключить звук уведомлений", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +834,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Последние от:", + "message": "Последнее от $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,23 +846,15 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Ошибка отправки", + "message": "Не Удалось Отправить", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Подробнее", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Скрыть детали", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Дополнительные сведения о проверке кодов безопасности", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Эта версия Signal Desktop устарела. Выполните обновление до последней версии, чтобы продолжить обмен сообщениями.", + "message": "Эта версия Session Desktop устарела. Выполните обновление до последней версии, чтобы продолжить обмен сообщениями.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,36 +865,8 @@ "message": "Медиа-сообщение", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Номер не зарегистрирован", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Контакты", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Импортировать все группы и контакты Signal с мобильного устройства.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Последний импорт в", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Импортировать сейчас", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Импорт...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Ошибка импорта. Убедитесь, что компьютер и мобильное устройство подключены к интернету.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "сейчас", + "message": "Только Что", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1 час", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ ч.", - "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$ час. назад", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ мин.", - "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$ мин. назад", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "сейчас", - "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'." @@ -1226,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Вы устанавливаете таймер исчезновения сообщений на $time$", + "message": "Вы установили таймер для исчезающих сообщений на $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ установил таймер исчезновения сообщений на $time$", + "message": "$name$ установил(а) таймер для исчезающих сообщений на $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +924,7 @@ } }, "timerOption_0_seconds": { - "message": "выкл", + "message": "Выключено", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1312,7 +976,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "выкл", + "message": "выключена", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1364,7 +1028,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "Исчезающие сообщения отключены $name$", + "message": "$name$ отключил(а) исчезающие сообщения.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Вы отключили исчезающие сообщения", + "message": "Вы отключили исчезающие сообщения.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Таймер установлен на $time$", + "message": "Время исчезновения сообщений – $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1387,16 +1051,12 @@ } } }, - "audioNotificationDescription": { - "message": "Воспроизведение звукового уведомления", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { - "message": "Код безопасности был изменен", + "message": "Код безопасности изменился", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Код безопасности c $name$ был изменен.", + "message": "Ваш код безопасности с $name$ изменился.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "Верифицировать код безопасности", + "message": "Подтвердить Код Безопасности", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Светлая", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Начать новый разговор…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Введите номер телефона для добавления контакта.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Неверный номер", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Повторно свяжите Signal Desktop с вашим мобильным устройством для продолжения общения.", - "description": "" - }, - "unlinked": { - "message": "Отвязан", - "description": "" - }, - "relink": { - "message": "Привязать", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Доступно обновление Session", "description": "" @@ -1480,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ покинул(а) группу.", + "message": "$name$ покинул(a) группу.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Название теперь '$name$'", + "message": "Название группы поменялось на «$name$».", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ присоединился(лась) к группе.", + "message": "$name$ присоединился к группе.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ присоединился(-лась) к группе.", + "message": "$name$ присоединились к группе.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,659 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Положения & Политика конфиденциальности" + }, + "unknown": { + "message": "Неизвестен" + }, + "changedSinceVerifiedTitle": { + "message": "Код Безопасности Изменился" + }, + "youMayWishToVerifyContact": { + "message": "Возможно, вам стоит подтвердить код безопасности с этим контактом." + }, + "about": { + "message": "О Session" + }, + "settingsHeader": { + "message": "Настройки" + }, + "continue": { + "message": "Продолжить" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Достигнуто предельное кол-во устройств" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "К сожалению, у вас уже привязано слишком много устройств. Попробуйте отвязать некоторые из них" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Запрос на привязывание получен" + }, + "waitingForDeviceToRegister": { + "message": "Ожидание устройства" + }, + "pairNewDevicePrompt": { + "message": "Просканируйте QR-код, отображаемый на устройстве, чтобы привязать его" + }, + "noPairedDevices": { + "message": "Нет привязанных устройств" + }, + "deviceUnpaired": { + "message": "Ваше устройство успешно отвязано" + }, + "sendMessageLeftGroup": { + "message": "Вы покинули группу." + }, + "moreInformation": { + "message": "Больше информации" + }, + "resend": { + "message": "Отправить ещё раз" + }, + "clearAllData": { + "message": "Очистить все данные" + }, + "deleteAccountWarning": { + "message": "Это навсегда удалит ваши сообщения, сессии и контакты." + }, + "deleteContactConfirmation": { + "message": "Вы уверены, что хотите удалить этот разговор?" + }, + "copy": { + "message": "Копировать" + }, + "linkPreviewsTitle": { + "message": "Отправлять Предпросмотр Ссылки" + }, + "linkPreviewDescription": { + "message": "Предварительный просмотр поддерживается для ссылок Imgur, Instagram, Pinterest, Reddit и YouTube." + }, + "readReceiptSettingTitle": { + "message": "Уведомления о прочтении" + }, + "typingIndicatorsSettingTitle": { + "message": "Индикаторы Ввода" + }, + "themeToggleTitle": { + "message": "Светлая" + }, + "successUnlinked": { + "message": "Ваше устройство успешно отвязано" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Скачать" + }, + "blockUser": { + "message": "Заблокировать" + }, + "unblockUser": { + "message": "Разблокировать" + }, + "blockedSettingsTitle": { + "message": "Заблокированные контакты" + }, + "leaveGroup": { + "message": "Покинуть Группу" + }, + "leaveGroupConfirmation": { + "message": "Вы уверены, что хотите покинуть эту группу?" + }, + "noContactsForGroup": { + "message": "У вас еще нет контактов" + }, + "editGroup": { + "message": "Редактировать группу" + }, + "updateGroupDialogTitle": { + "message": "Обновляем $name$..." + }, + "showRecoveryPhrase": { + "message": "Секретная фраза" + }, + "yourSessionID": { + "message": "Ваш Session ID" + }, + "recoveryPhraseSavePromptMain": { + "message": "Ваша секретная фраза является главным ключом к вашему Session ID. Вы можете использовать ее для восстановления Session ID, если потеряете доступ к своему устройству. Сохраните свою секретную фразу в безопасном месте, и никому её не передавайте." + }, + "copiedToClipboard": { + "message": "Скопировано в буфер обмена" + }, + "unlock": { + "message": "Открыть" + }, + "connectToServerFail": { + "message": "Не удалось присоединиться к группе" + }, + "connectingToServer": { + "message": "Соединяемся..." + }, + "remove": { + "message": "Удалить" + }, + "invalidSessionId": { + "message": "Неверный Session ID" + }, + "emptyGroupNameError": { + "message": "Пожалуйста, введите название группы" + }, + "groupNamePlaceholder": { + "message": "Название Группы" + }, + "inviteContacts": { + "message": "Пригласить Друзей В Session" + }, + "yourUniqueSessionID": { + "message": "Познакомьтесь со своим Session ID" + }, + "allUsersAreRandomly...": { + "message": "Ваш Session ID - это уникальный адрес, который другие пользователи могут использовать для связи с вами при помощи Session. Поскольку ваш Session ID никак не связан с вашей настоящей личностью, он по определению является полностью анонимным и конфиденциальным." + }, + "generateSessionID": { + "message": "Создать Session ID" + }, + "recoveryPhrase": { + "message": "Секретная фраза" + }, + "enterRecoveryPhrase": { + "message": "Введите секретную фразу" + }, + "enterDisplayName": { + "message": "Введите отображаемое имя" + }, + "enterSessionIDHere": { + "message": "Введите свой Session ID" + }, + "continueYourSession": { + "message": "Восстановить Session ID" + }, + "linkDevice": { + "message": "Привязать устройство" + }, + "restoreUsingRecoveryPhrase": { + "message": "Восстановите свой аккаунт" + }, + "newSession": { + "message": "Новый Диалог" + }, + "searchFor...": { + "message": "Поиск по разговорам, контактам и сообщениям" + }, + "enterSessionID": { + "message": "Введите Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Введите Session ID получателя" + }, + "usersCanShareTheir...": { + "message": "Пользователи могут поделиться своим Session ID, зайдя в настройки своей учетной записи и нажав «Отправить Session ID», или поделившись своим QR-кодом." + }, + "appearanceSettingsTitle": { + "message": "Внешний вид" + }, + "privacySettingsTitle": { + "message": "Конфиденциальность" + }, + "notificationsSettingsTitle": { + "message": "Уведомления" + }, + "devicesSettingsTitle": { + "message": "Привязанные устройства" + }, + "recoveryPhraseEmpty": { + "message": "Введите секретную фразу" + }, + "displayNameEmpty": { + "message": "Пожалуйста, выберите отображаемое имя" + }, + "joinOpenGroup": { + "message": "Присоединиться к открытой группе" + }, + "newClosedGroup": { + "message": "Новая закрытая группа" + }, + "createClosedGroupNamePrompt": { + "message": "Название Группы" + }, + "createClosedGroupPlaceholder": { + "message": "Введите название группы" + }, + "openGroupURL": { + "message": "URL открытой группы" + }, + "enterAnOpenGroupURL": { + "message": "Введите URL открытой группы" + }, + "next": { + "message": "Далее" + }, + "pairingDevice": { + "message": "Привязка Устройства" + }, + "invalidGroupNameTooShort": { + "message": "Пожалуйста, введите название группы" + }, + "invalidGroupNameTooLong": { + "message": "Пожалуйста, введите более короткое имя группы" + }, + "pickClosedGroupMember": { + "message": "Пожалуйста, выберите как минимум 1 участников группы" + }, + "closedGroupMaxSize": { + "message": "В закрытой группе не может быть больше 20 участников" + }, + "contextMenuNoSuggestions": { + "message": "No Suggestions", + "description": "Shown in the context menu for a misspelled word to indicate that there are no suggestions to replace the misspelled word" + }, + "done": { + "message": "Done", + "description": "Button when a specific action is to be done." + }, + "cannotUpdateDetail": { + "message": "Session 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" + }, + "close": { + "message": "Close" + }, + "devicePairingRequestReceivedNoListenerDescription": { + "message": "Device linking request received but you are not on the device linking screen. \nGo to Settings > Device > Link New Device." + }, + "deviceIsSecondaryNoPairing": { + "message": "This device is a secondary device and so cannot be linked." + }, + "pairingOngoing": { + "message": "A pairing request is already ongoing. Restart the app if it takes too long." + }, + "allowPairingWithDevice": { + "message": "Allow linking with this device?" + }, + "provideDeviceAlias": { + "message": "Please provide an alias for this linked device" + }, + "showPairingWordsTitle": { + "message": "Linking Secret Words" + }, + "confirmUnpairingTitle": { + "message": "Please confirm you want to unlink the following device:" + }, + "unpairDeviceWarning": { + "message": "Are you sure you want to unlink this device?", + "description": "Warning for device unlinking in settings view" + }, + "unpairDeviceWarningSub": { + "message": "Unlinking this device will delete all history, including all messages, sessions, and contacts from this device.", + "description": "Warning description for device unlinking in settings view" + }, + "deletePublicWarning": { + "message": "Are you sure? This will permanently remove this message for everyone in this open group." + }, + "deleteMultiplePublicWarning": { + "message": "Are you sure? This will permanently remove these messages for everyone in this open group." + }, + "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." + }, + "sendMessageBlockedUser": { + "message": "You have blocked this contact" + }, + "deleteMessageForEveryone": { + "message": "Delete Message For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteMessagesForEveryone": { + "message": "Delete Messages For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteForEveryone": { + "message": "Delete For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deletePublicConversationConfirmation": { + "message": "Permanently delete the messages locally from this open group?", + "description": "Confirmation dialog text that asks the user if they really wish to delete the open group messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + }, + "sessionResetFailed": { + "message": "Secure session reset failed", + "description": "your secure session could not been transmitted to the other participant." + }, + "sessionResetOngoing": { + "message": "Secure session reset in progress", + "description": "your secure session is currently being reset, waiting for the reset acknowledgment." + }, + "linkPreviewsConfirmMessage": { + "message": "You will not have full metadata protection when sending or receiving link previews." + }, + "mediaPermissionsTitle": { + "message": "Microphone and Camera" + }, + "spellCheckTitle": { + "message": "Проверка орфографии", + "description": "Description of the media permission description" + }, + "spellCheckDirty": { + "message": "You must restart Session to apply your new settings", + "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Session." + }, + "readReceiptSettingDescription": { + "message": "Получать и отсылать уведомления о прочтении сообщений (для всех контактов).", + "description": "Description of the read receipts setting" + }, + "typingIndicatorsSettingDescription": { + "message": "Получать и отсылать уведомления когда вы и ваш собедник набирает сообщение (для всех контактов).", + "description": "Description of the typing indicators setting" + }, + "zoomFactorSettingTitle": { + "message": "Масштабирование Приложения", + "description": "Title of the Zoom Factor setting" + }, + "clockOutOfSync": { + "message": "Your clock is out of sync. Please update your clock and try again.", + "description": "Notifcation that user's clock is out of sync with Loki's servers." + }, + "messageBodyTooLong": { + "message": "Message body is too long.", + "description": "Shown if the user tries to send more than 64kb of text" + }, + "changeNickname": { + "message": "Change Nickname", + "description": "Conversation menu option to change user nickname" + }, + "clearNickname": { + "message": "Clear nickname", + "description": "Conversation menu option to clear user nickname" + }, + "themeToggleDescription": { + "message": "Choose the theme best suited to you" + }, + "hideMenuBarTitle": { + "message": "Спрятать Системное Меню", + "description": "Label text for menu bar visibility setting" + }, + "hideMenuBarDescription": { + "message": "Спрятать или показать системное меню", + "description": "Label text for menu bar visibility setting" + }, + "autoUpdateSettingTitle": { + "message": "Автоматические обновления" + }, + "autoUpdateSettingDescription": { + "message": "Автоматически проверять на наличие обновлений при запуске" + }, + "autoUpdateDownloadedMessage": { + "message": "The new update has been downloaded." + }, + "autoUpdateDownloadInstructions": { + "message": "Would you like to download the update?" + }, + "unblocked": { + "message": "Unblocked" + }, + "banUser": { + "message": "Ban User", + "description": "Ban user from open group 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." + }, + "copyMessage": { + "message": "Скопировать текст сообщения", + "description": "Button action that the user can click to copy their public keys" + }, + "selectMessage": { + "message": "Выбрать сообщение", + "description": "Button action that the user can click to select the message" + }, + "editGroupName": { + "message": "Edit group name", + "description": "Button action that the user can click to edit a group name (closed)" + }, + "setAccountPasswordTitle": { + "message": "Установить Пароль", + "description": "Prompt for user to set account password in settings view" + }, + "setAccountPasswordDescription": { + "message": "Установить пароль для разблокирования Session. Вы продолжите получать уведомления о новых сообщениях когда приложение заблокированно. Содержание уведомлений можно поменять в настройках уведомлений.", + "description": "Description for set account password setting view" + }, + "changeAccountPasswordTitle": { + "message": "Изменить Пароль", + "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": "Удалить Пароль", + "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" + }, + "pasteLongPasswordToastTitle": { + "message": "The clipboard content exceeds the maximum password length of $max_pwd_len$ characters.", + "description": "Shown when user pastes a password which is longer than MAX_PASSWORD_LEN" + }, + "showRecoveryPhrasePasswordRequest": { + "message": "Please enter your password", + "description": "Request for user to enter password to show recovery phrase." + }, + "passwordViewTitle": { + "message": "Type In Your Password", + "description": "The title shown when user needs to type in a password to unlock the messenger" + }, + "password": { + "message": "Password", + "description": "Placeholder for password input" + }, + "setPassword": { + "message": "Set Password", + "description": "Button action that the user can click to set a password" + }, + "changePassword": { + "message": "Change Password", + "description": "Button action that the user can click to change a password" + }, + "removePassword": { + "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" + }, + "invalidOldPassword": { + "message": "Old password is invalid" + }, + "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 open group" + }, + "connectToServerSuccess": { + "message": "Successfully connected to open group" + }, + "setPasswordFail": { + "message": "Failed to set password" + }, + "passwordLengthError": { + "message": "Password must be between 6 and 50 characters long", + "description": "Error string shown to the user when password doesn't meet length criteria" + }, + "passwordTypeError": { + "message": "Password must be a string", + "description": "Error string shown to the user when password is not a string" + }, + "passwordCharacterError": { + "message": "Password must only contain letters, numbers and symbols", + "description": "Error string shown to the user when password contains an invalid character" + }, + "invalidPubkeyFormat": { + "message": "Invalid Pubkey Format", + "description": "Error string shown when user types an invalid pubkey format" + }, + "lnsMappingNotFound": { + "message": "There is no LNS mapping associated with this name", + "description": "Shown in toast if user enters an unknown LNS name" + }, + "lnsLookupTimeout": { + "message": "LNS lookup timed out", + "description": "Shown in toast if user enters an unknown LNS name" + }, + "lnsTooFewNodes": { + "message": "Not enough nodes currently active for LNS lookup" + }, + "editProfileModalTitle": { + "message": "Аккаунт", + "description": "Title for the Edit Profile modal" + }, + "addModerators": { + "message": "Add Moderators" + }, + "removeModerators": { + "message": "Remove Moderators" + }, + "groupInvitation": { + "message": "Group Invitation" + }, + "addingContacts": { + "message": "Adding contacts to" + }, + "noContactsToAdd": { + "message": "No contacts to add" + }, + "noMembersInThisGroup": { + "message": "No other members in this group" + }, + "noModeratorsToRemove": { + "message": "no moderators to remove" + }, + "createAccount": { + "message": "Создать Аккаунт" + }, + "signIn": { + "message": "Войти" + }, + "getStarted": { + "message": "Get started" + }, + "anonymous": { + "message": "Anonymous", + "description": "The name of currently unidentified users" + }, + "enterOptionalPassword": { + "message": "Введите пароль (если используется)" + }, + "devicePairingHeaderReassure": { + "message": "Linking may take up to one minute to register on your primary device. Please be patient." + }, + "devicePairingHeader_Step1": { + "message": "Open Session on your other device." + }, + "devicePairingHeader_Step2": { + "message": "Navigate to the Devices section in your user account screen." + }, + "devicePairingHeader_Step3": { + "message": "Select Link New Device to prepare your other device for pairing." + }, + "devicePairingHeader_Step4": { + "message": "Enter your Session ID below to link this device to your Session ID." + }, + "linkDeviceToExistingAccount": { + "message": "Link Device to Existing Session ID" + }, + "or": { + "message": "or" + }, + "ByUsingThisService...": { + "message": "By using this service, you agree to our Terms of Service and Privacy Policy" + }, + "beginYourSession": { + "message": "Begin
your
Session." + }, + "welcomeToYourSession": { + "message": "Welcome to your Session" + }, + "message": { + "message": "Message" + }, + "addContact": { + "message": "Добавить Контакт" + }, + "permissionSettingsTitle": { + "message": "Разрешения" + }, + "members": { + "message": "$count$ members", + "placeholders": { + "count": { + "content": "$1", + "example": "26" + } + } + }, + "description": { + "message": "Description" } -} +} \ No newline at end of file diff --git a/_locales/sk/messages.json b/_locales/sk/messages.json index 255968466..72f9f0de1 100644 --- a/_locales/sk/messages.json +++ b/_locales/sk/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Pomocník", "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": "Nastavenia...", - "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": "Skryť", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Ukončiť Signal", + "message": "Ukončiť Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Nastaviť Importovaním", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Nastaviť ako Nové Zariadenie", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Nastaviť ako Samostatné Zariadenie", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Vybrať súbor", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Nahrajte svoje dáta", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Práve ste dokončili proces exportu. Vaše kontakty a správy trpezlivo čakajú na vašom počítači. Zvoľte priečinok ktorý obsahuje vaše uložené Signal dáta.", + "message": "Práve ste dokončili proces exportu. Vaše kontakty a správy trpezlivo čakajú na vašom počítači. Zvoľte priečinok ktorý obsahuje vaše uložené Session dáta.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Uistite sa, že ste zvolili správny priečinok, ktorý obsahuje Vaše Signal dáta. Meno priečinka by mal začínať \"Signal Export\". Prípadne môžete vytvoriť novú kópiu Vašich dát v Chrome aplikácii.", + "message": "Uistite sa, že ste zvolili správny priečinok, ktorý obsahuje Vaše Session dáta. Meno priečinka by mal začínať \"Session Export\". Prípadne môžete vytvoriť novú kópiu Vašich dát v Chrome aplikácii.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Začnite používať Signal Desktop", + "message": "Začnite používať Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Pripojte toto zariadenie k vašemu mobilnému telefónu", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "zvolené umiestnenie", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Aktualizácia databázy. Môže to chvíľu trvať...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Nahrávanie správ. $count$ nahraných...", - "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": "Ja", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Opustili ste skupinu", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Späť na koniec", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nová správa nižšie", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nové správy nižšie", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Neprečítaná Správa", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Vaše bezpečnostné čísla sa s viacerými členmi skupiny od posledného overenia zmenili. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštalovali Signal. ", + "message": "Vaše bezpečnostné čísla sa s viacerými členmi skupiny od posledného overenia zmenili. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštalovali Session. ", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Vaše bezpečnostné číslo s $name$ sa od posledného overenia zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Signal.", + "message": "Vaše bezpečnostné číslo s $name$ sa od posledného overenia zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Bezpečnostné číslo ktoré sa chystáte overiť sa zmenilo. Prosím, skontrolujte vaše nové bezpečnostné číslo s $name$. Táto zmena môže znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Signal.", + "message": "Bezpečnostné číslo ktoré sa chystáte overiť sa zmenilo. Prosím, skontrolujte vaše nové bezpečnostné číslo s $name$. Táto zmena môže znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Vaše bezpečnostné čísla sa s viacerými členmi skupiny nedávno zmenili. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštalovali Signal.", + "message": "Vaše bezpečnostné čísla sa s viacerými členmi skupiny nedávno zmenili. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštalovali Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Vaše bezpečnostné číslo s $name$ sa nedávno zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Signal. ", + "message": "Vaše bezpečnostné číslo s $name$ sa nedávno zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Session. ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Vaše bezpečnostné číslo s $name$ sa od posledného overenia zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Signal. Odporúčame opätovné overenie bezpečnostného čísla s týmto kontaktom.", + "message": "Vaše bezpečnostné číslo s $name$ sa od posledného overenia zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Session. Odporúčame opätovné overenie bezpečnostného čísla s týmto kontaktom.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Odoslať", "description": "" }, - "acceptNewKey": { - "message": "Prijať", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Označiť ako overené", "description": "" @@ -455,10 +385,6 @@ "message": "Nové bezpečnostné číslo", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Vaše bezpečnostné číslo sa s týmto kontaktom zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštaloval/a Signal. Odporúčame opätovné overenie bezpečnostného čísla s týmto kontaktom.", - "description": "" - }, "incomingError": { "message": "Chyba pri spracovaní prichádzajúcej správy", "description": "" @@ -495,18 +421,6 @@ "message": "Tento mesiac", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepodporovaný typ prílohy. Kliknite pre uloženie.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Kliknite pre uloženie", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Nepomenovaný Súbor", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Hlasová Správa", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Tento typ súboru je z bezpečnostných dôvodov zakázaný", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Načítavam náhľad...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Zvolenú prílohu sa nepodarilo načítať.", "description": "" }, - "disconnected": { - "message": "Odpojený", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Pripojovanie", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Navštíviť Poznámky k Vydaniu", "description": "" }, - "goToForums": { - "message": "Navštíviť Fórum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Navštíviť Stránku Podpory", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Nahlásiť Problém", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Nastavenia Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "O aplikácii Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Reč", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Zobraziť", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skryť", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Ukončiť", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Hľadať", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Vitajte v aplikácii Signal", - "description": "" - }, - "selectAContact": { - "message": "Vyberte si kontakt alebo skupinu a zahájte rozhovor.", + "message": "Vitajte v aplikácii Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Poslať správu", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "domov", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Vy", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Odpoveď pre $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": "Pre posielanie zvukových správ, povoľte aplikácii Signal Desktop prístup k mikrofónu.", + "message": "Pre posielanie zvukových správ, povoľte aplikácii Session Desktop prístup k mikrofónu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Povoliť prístup", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Otvoriť nastavenia", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Zvuk", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Zrušiť", "description": "" }, - "failedToSend": { - "message": "Správu sa nepodarilo odoslať niektorým príjemcom. Skontrolujte svoje sieťové pripojenie.", - "description": "" - }, "error": { "message": "Chyba", "description": "" }, - "messageDetail": { - "message": "Podrobnosti správy", - "description": "" - }, "delete": { "message": "Vymazať", "description": "" @@ -857,10 +705,6 @@ "message": "Členy skupiny", "description": "" }, - "showMembers": { - "message": "Zobraziť členov", - "description": "" - }, "resetSession": { "message": "Obnoviť reláciu", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Zobraziť bezpečnostné číslo", "description": "" }, - "viewAllMedia": { - "message": "Zobraziť médiá", - "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": "Keď sa chcete presvedčiť o bezpečnosti šifrovania vašej komunikácie s $name$, porovnajte vyššie uvedené čísla s číslami na druhom zariadení.", "description": "", @@ -887,14 +727,6 @@ "message": "S týmto kontaktom ste si ešte nevymenili žiadne správy. Bezpečnostné číslo bude dostupné po doručení prvej správy.", "description": "" }, - "moreInfo": { - "message": "Viac informácii...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Odoslať znovu", - "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": "Vymazať správu", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Uložiť", "description": "" }, - "fileIconAlt": { - "message": "Ikona súboru", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji \"$title$\"", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Vitajte v aplikácii Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Súkromie je možné. Signal ho uľahčuje.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Pripojte svoj mobilný telefón k Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Nastavenia Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Pripojené zariadenia", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Tlačidlo \"+\"", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Pripojiť Nové Zariadenie", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Názov zariadenia", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Zvoľte názov pre toto zariadenie", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Dokončiť pripojenie mobilného telefónu", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synchronizácia kontaktov a skupín", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Pripojenie k serveru zlyhalo.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Máte prepojených príliš veľa zariadení. Skúste odstrániť niektoré z nich.", - "description": "" - }, - "settings": { - "message": "Nastavenia", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Motív", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Povolenia", @@ -1029,34 +801,6 @@ "message": "Povoliť kontrolu pravopisu textu zadaného do textového poľa", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Mazanie dát", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Týmto zmažete všetky dáta v aplikácii, odstránite všetky správy a informácie o účte.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Vymazať dáta", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Vymazať všetky dáta?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Chystáte sa vymazať všetky informácie o účte vrátane všetkých kontaktov a správ. Opätovné prepojenie aplikácie s mobilným zariadením bude stále možné, avšak bez možnosti obnovy zmazaných správ.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Vymazať všetky dáta", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Odpojovanie a mazanie dát", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Upozornenia", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Odoslanie zlyhalo", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Podrobnosti", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skryť podrobnosti", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Dozvedieť sa viac o overovaní bezpečnostných čísiel", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Táto verzia aplikácie Signal Desktop je zastaralá. Pre pokračovanie ju prosím aktualizujte na najnovšiu verziu.", + "message": "Táto verzia aplikácie Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Multimediálna správa", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Číslo nie je registrované", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakty", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importovať všetky skupiny a kontakty Signalu z mobilného zariadenia.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Posledný import", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importovať teraz", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importuje sa...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import zlyhal. Uistite sa, že váš počítač a mobilný telefón majú prístup k internetu.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "teraz", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hodina", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hod", - "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": "pred $hours$ h", - "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": "pred $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "teraz", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Prehrať zvuk upozornenia", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Zmenilo sa bezpečnosné číslo", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Svetlý", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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ť nový rozhovor…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Pre pridanie kontaktu zadajte telefónne číslo.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neplatné číslo", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Pre pokračovanie znovu pripojte Signal Desktop k vašemu mobilnému zariadeniu.", - "description": "" - }, - "unlinked": { - "message": "Odpojené", - "description": "" - }, - "relink": { - "message": "Prepojiť znovu", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Dostupná aktualizácia pre Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/sl/messages.json b/_locales/sl/messages.json index a7434c0e3..3bdd63fc4 100644 --- a/_locales/sl/messages.json +++ b/_locales/sl/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Pomoč", "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": "Nastavitve ...", - "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": "Skrij", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Zapusti Signal", + "message": "Zapusti Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Nastavi z uvozom podatkov", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Nastavi kot novo napravo", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Nastavi kot samostojno napravo", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "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" }, - "chooseFile": { - "message": "Izberite datoteko", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Naložite svoje podatke", "description": "Header shown on the first screen in the data import process" @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Preverite, če ste izbrali pravo mapo s shranjenimi podatki. Ime mape bi moralo biti \"Signal Export\". Lahko tudi ponovno izvozite podatke iz aplikacije v brskalniku Chrome.", + "message": "Preverite, če ste izbrali pravo mapo s shranjenimi podatki. Ime mape bi moralo biti \"Session Export\". Lahko tudi ponovno izvozite podatke iz aplikacije v brskalniku Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Začni z uporabo aplikacije Signal Desktop", + "message": "Začni z uporabo aplikacije Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Povežite napravo s svojim telefonom", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "izbrana lokacija", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Posodabljam zbirko podatkov. To lahko traja nekaj časa ...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Nalagam sporočila. $count$ doslej ...", - "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": "Jaz", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Zapustili ste skupino", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Pomaknite se na dno pogovora", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Novo sporočilo spodaj", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nova sporočila spodaj", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 novo sporočilo", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Varnostna števila z večimi člani skupine so bila nedavno spremenjena. To lahko pomeni, da skuša nekdo prestrezati vašo komunikacijo ali pa, da so te osebe zgolj ponovno namestile aplikacijo Signal.", + "message": "Varnostna števila z večimi člani skupine so bila nedavno spremenjena. To lahko pomeni, da skuša nekdo prestrezati vašo komunikacijo ali pa, da so te osebe zgolj ponovno namestile aplikacijo Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Vaše varnostno število z uporabnikom $name$ je bilo od zadnjega preverjanja spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Signal.", + "message": "Vaše varnostno število z uporabnikom $name$ je bilo od zadnjega preverjanja spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Varnostno število, ki ga potrjujete, je bilo spremenjeno. Prosimo, še enkrat preverite svoje novo varnostno število z uporabnikom $name$. Pozor, ta sprememba lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Signal.", + "message": "Varnostno število, ki ga potrjujete, je bilo spremenjeno. Prosimo, še enkrat preverite svoje novo varnostno število z uporabnikom $name$. Pozor, ta sprememba lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Varnostna števila z večimi člani skupine so bila nedavno spremenjena. To lahko pomeni, da skuša nekdo prestrezati vašo komunikacijo ali pa, da so te osebe zgolj ponovno namestile aplikacijo Signal.", + "message": "Varnostna števila z večimi člani skupine so bila nedavno spremenjena. To lahko pomeni, da skuša nekdo prestrezati vašo komunikacijo ali pa, da so te osebe zgolj ponovno namestile aplikacijo Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Vaše varnostno število z uporabnikom $name$ je bilo nedavno spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa je uporabnik $name$ zgolj ponovno namestil aplikacijo Signal.", + "message": "Vaše varnostno število z uporabnikom $name$ je bilo nedavno spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa je uporabnik $name$ zgolj ponovno namestil aplikacijo Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Vaše varnostno število z uporabnikom $name$ je bilo spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Signal. Morebiti bi želeli preveriti svoje varnostno število z njim.", + "message": "Vaše varnostno število z uporabnikom $name$ je bilo spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Session. Morebiti bi želeli preveriti svoje varnostno število z njim.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Objavi", "description": "" }, - "acceptNewKey": { - "message": "Sprejmi", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Označi kot potrjeno.", "description": "" @@ -455,10 +385,6 @@ "message": "Novo varnostno število", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Vaše varnostno število s to osebo je bilo spremenjeno. To lahko pomeni, da poskuša nekdo prestrezati vajino komunikacijo ali pa je vaš partner zgolj na novo namestil aplikacijo Signal. Novo varnostno število lahko preverite spodaj.", - "description": "" - }, "incomingError": { "message": "Napaka pri obdelavi dohodnega sporočila", "description": "" @@ -495,18 +421,6 @@ "message": "Ta mesec", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepodprta vrsta priponke. Kliknite, če jo želite shraniti.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Shrani", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Neimenovana datoteka", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Glasovno sporočilo", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Ta vrsta priponke iz varnostnih razlogov ni dovoljena", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Nalagam predogled ...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Osnutek predogledne sličice povezave na: $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Predogledna sličica povezave na: $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Izbrane priponke ni bilo mogoče zagnati.", "description": "" }, - "disconnected": { - "message": "Povezava je prekinjena", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Povezujem", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Opombe k izdaji", "description": "" }, - "goToForums": { - "message": "Forumi", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Podporna stran", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Prijava napake", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Nastavitve Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "O aplikaciji Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Nagovor", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Prikaži", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skrij", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Končaj", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Iskanje", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Dobrodošli v aplikaciji Signal", - "description": "" - }, - "selectAContact": { - "message": "Izberite osebo ali skupino in začnite s pogovorom.", + "message": "Dobrodošli v aplikaciji Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Pošlji sporočilo", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "doma", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Vi", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Odgovor uporabniku $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": "Za pošiljanje glasovnih sporočil potrebuje aplikacija Signal Desktop dostop do vašega mikrofona.", + "message": "Za pošiljanje glasovnih sporočil potrebuje aplikacija Session Desktop dostop do vašega mikrofona.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Dovoli dostop", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Prikaži nastavitve", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Zvok", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Prekliči", "description": "" }, - "failedToSend": { - "message": "Pošiljanje nekaterim prejemnikom ni uspelo. Preverite povezavo z omrežjem.", - "description": "" - }, "error": { "message": "Napaka", "description": "" }, - "messageDetail": { - "message": "Podrobnosti sporočila", - "description": "" - }, "delete": { "message": "Izbriši", "description": "" @@ -857,10 +705,6 @@ "message": "Člani skupine", "description": "" }, - "showMembers": { - "message": "Prikaži člane", - "description": "" - }, "resetSession": { "message": "Ponastavi sejo", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Preglej varnostno število", "description": "" }, - "viewAllMedia": { - "message": "Vse medijske datoteke", - "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": "Če želite preveriti varnost od konca do konca šifrirane komunikacije z uporabnikom $name$, primerjajte gornje število s številom na njegovi napravi.", "description": "", @@ -887,14 +727,6 @@ "message": "S to osebo še niste izmenjali sporočil. Vajino varnostno število bo na voljo po prvem poslanem sporočilu.", "description": "" }, - "moreInfo": { - "message": "Več informacij ...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Ponovno pošlji", - "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": "Izbriši sporočilo", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Shrani", "description": "" }, - "fileIconAlt": { - "message": "Ikona datoteke", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji znak za '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Dobrodošli v aplikaciji Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Zasebnost obstaja. Signal jo naredi preprosto.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Povežite svoj telefon z aplikacijo Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Nastavitve Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Povezane naprave", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Gumb '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Poveži novo napravo", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Ime naprave", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Izberite ime te naprave", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Zaključujem povezavo s telefonom", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Usklajujem stike in skupine", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Ne morem se povezati s strežnikom.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Na žalost imate dodanih preveč naprav. Poskusite odstraniti kakšno izmed njih.", - "description": "" - }, - "settings": { - "message": "Nastavitve", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Dovoljenja", @@ -1029,34 +801,6 @@ "message": "Vklop črkovalnika v okencu za vnašanje sporočila", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Izbris podatkov", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "S tem boste izbrisali vse podatke v aplikaciji, odstranili vsa sporočila in podatke o računu.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Izbris podatkov", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Želite izbrisati vse podatke?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Ste pred korakom, s katerim boste izbrisali vse podatke v aplikaciji Signal, vključno s stiki in sporočili. Naknadno se boste lahko zopet povezali s svojo mobilno napravo, a to ne bo povrnilo izbrisanih sporočil.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Izbris vseh podatkov", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Odjava in brisanje vseh podatkov", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Obvestila", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Pošiljanje ni uspelo", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Podrobnosti", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skrij podrobnosti", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Več o verifikaciji varnostnih števil", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Pričujoča različica programa Signal Desktop je potekla. Za ponovno delovanje morate program posodobiti na zadnjo različico.", + "message": "Pričujoča različica programa Session Desktop je potekla. Za ponovno delovanje morate program posodobiti na zadnjo različico.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Multimedijsko sporočilo", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Številka ni registrirana", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Stiki", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Uvoz stikov in skupin Signal iz mobilne naprave.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Nazadnje uvoženo: ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Uvozi zdaj", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Uvažam ...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Uvoz ni bil uspešen. Preverite, da sta vaša mobilna naprava in računalnik povezana z internetom.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ravnokar", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 uro", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "Pred $hours$ h", - "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": "Pred $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ravnokar", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Predvajaj zvočna obvestila", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Varnostno število je bilo spremenjeno", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Svetla", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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čni nov pogovor ...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Z vnosom telefonske številke boste ustvarili nov stik", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neveljavna številka", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Za nadaljevanje komunikacije ponovno povežite aplikacijo Signal Desktop s svojo mobilno napravo.", - "description": "" - }, - "unlinked": { - "message": "Nepovezan", - "description": "" - }, - "relink": { - "message": "Poveži", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Na voljo je posodobitev aplikacije Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/sq/messages.json b/_locales/sq/messages.json index 89da7d48d..a2b32f9df 100644 --- a/_locales/sq/messages.json +++ b/_locales/sq/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Ndihmë", "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": "Parapëlqime…", - "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": "Fshihe", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Mbylle Signal-in", + "message": "Mbylle Session-in", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Rregulloje me Importim", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Rregulloje si Pajisje të Re", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Rregulloje si Pajisje Më Vete", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Zgjidhni kartelë", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Ngarkoni të dhënat tuaja", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Sapo kaluat nëpër procesin e eksportimit, dhe kontaktet dhe mesazhet tuaj po presin me qetësi në kompjuterin tuaj. Përzgjidhni dosjen që përmban të dhëna tuajat Signal të ruajtura.", + "message": "Sapo kaluat nëpër procesin e eksportimit, dhe kontaktet dhe mesazhet tuaj po presin me qetësi në kompjuterin tuaj. Përzgjidhni dosjen që përmban të dhëna tuajat Session të ruajtura.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Sigurohuni se keni zgjedhur drejtorinë e duhur që përmban të dhënat tuaja Signal të ruajtura. Emri i saj duhet të fillojë me 'Signal Export.' Mundeni edhe të ruani një kopje të re të të dhënave tuaja që nga Aplikacioni Chrome.", + "message": "Sigurohuni se keni zgjedhur drejtorinë e duhur që përmban të dhënat tuaja Session të ruajtura. Emri i saj duhet të fillojë me 'Session Export.' Mundeni edhe të ruani një kopje të re të të dhënave tuaja që nga Aplikacioni Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Filloni të përdorni Signal-in për Desktop", + "message": "Filloni të përdorni Session-in për Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Lidheni këtë pajisje me telefonin tuaj", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "te vendi juaj parazgjedhje", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Po përmirësohet baza e të dhënave. Kjo mund të hajë ca kohë…", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Po ngarkohen mesazhe. $count$ deri tani…", - "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": "Unë", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "E keni braktisur grupin", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rrëshqitni drejt fundit të bisedës", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Mesazh i ri më poshtë", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Mesazhe të rinj më poshtë", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Mesazh i Palexuar", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Numrat tuaj të sigurisë me një numër anëtarësh të grupit kanë ndryshuar që nga hera e fundit që i verifikuat. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se ata thjesht kanë riinstaluar Signal-in.", + "message": "Numrat tuaj të sigurisë me një numër anëtarësh të grupit kanë ndryshuar që nga hera e fundit që i verifikuat. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se ata thjesht kanë riinstaluar Session-in.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Numri juaj i sigurisë me $name$ ka ndryshuar që nga hera e fundit që e verifikuat. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Signal-in.", + "message": "Numri juaj i sigurisë me $name$ ka ndryshuar që nga hera e fundit që e verifikuat. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Session-in.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Numri i sigurisë që po provoni të verifikoni ka ndryshuar. Ju lutemi, shqyrtoni numrin tuaj të ri të sigurisë me $name$. Mos harroni, ky ndryshim mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Signal-in.", + "message": "Numri i sigurisë që po provoni të verifikoni ka ndryshuar. Ju lutemi, shqyrtoni numrin tuaj të ri të sigurisë me $name$. Mos harroni, ky ndryshim mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Session-in.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Numrat tuaj të sigurisë me shumë anëtarë të grupit kanë ndryshuar tani së fundi. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se thjesht ata kanë riinstaluar Signal-in.", + "message": "Numrat tuaj të sigurisë me shumë anëtarë të grupit kanë ndryshuar tani së fundi. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se thjesht ata kanë riinstaluar Session-in.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Numri juaj i sigurisë me $name$ ka ndryshuar tani së fundi. Kjo mund të jetë shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Signal-in.", + "message": "Numri juaj i sigurisë me $name$ ka ndryshuar tani së fundi. Kjo mund të jetë shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Session-in.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Numri juaj i sigurisë për me $name$ ka ndryshuar. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Signal-in. Mund të donit të verifikonit numrin tuaj të sigurisë me këtë kontakt.", + "message": "Numri juaj i sigurisë për me $name$ ka ndryshuar. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Session-in. Mund të donit të verifikonit numrin tuaj të sigurisë me këtë kontakt.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Parashtrojeni", "description": "" }, - "acceptNewKey": { - "message": "Pranoje", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Vëri shenjë si i verifikuar", "description": "" @@ -455,10 +385,6 @@ "message": "Numër i ri sigurie", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Numri juaj i sigurisë me këtë kontakt ka ndryshuar. Kjo mund të dojë të thotë se ose dikush po rreket të përgjojë komunikimin tuaj, ose se ky kontakt thjesht riinstaloi Signal-in. Mund të donit të verifikoni numrin e ri të sigurisë më poshtë.", - "description": "" - }, "incomingError": { "message": "Gabim në trajtimin e mesazhit ardhës", "description": "" @@ -495,18 +421,6 @@ "message": "Këtë Muaj", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Lloj bashkëngjitjeje i pambuluar. Klikoni që të ruhet.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikoni që të ruhet", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Kartelë Pa Emër", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mesazh Zanor", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Lloj bashkëngjitjeje i palejuar për arsye sigurie", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Po ngarkohet Paraparja…", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Paraparje lidhjeje miniature skice për $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Paraparje lidhjeje miniature për $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "S’arrihet të ngarkohet bashkëngjitja e përzgjedhur.", "description": "" }, - "disconnected": { - "message": "I shkëputur", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Po lidhet", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Kalo te Shënime Versioni", "description": "" }, - "goToForums": { - "message": "Kalo te Forumet", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Kalo te Faqja e Asistencës", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Njoftoni një Problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Parapëlqime për Signal-in në Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Mbi Signal-in për Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "E folur", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Shfaqe", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Fshihe", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Dil", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Kërko", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Mirë se vini te Signal-i", - "description": "" - }, - "selectAContact": { - "message": "Përzgjidhni një kontakt ose grup që të filloni të fjaloseni.", + "message": "Mirë se vini te Session-i", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Dërgo Mesazh", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "shtëpie", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Ju", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Përgjigje për $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": "Për të dërguar mesazhe audio, lejojeni Signal-in për Desktop të përdorë mikrofonin tuaj.", + "message": "Për të dërguar mesazhe audio, lejojeni Session-in për Desktop të përdorë mikrofonin tuaj.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Lejoje Përdorimin", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Shfaq Rregullime", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Anuloje", "description": "" }, - "failedToSend": { - "message": "Dështoi dërgimi te disa marrës. Kontrolloni lidhjen tuaj në rrjet.", - "description": "" - }, "error": { "message": "Gabim", "description": "" }, - "messageDetail": { - "message": "Hollësi Mesazhi", - "description": "" - }, "delete": { "message": "Fshije", "description": "" @@ -857,10 +705,6 @@ "message": "Anëtarë grupi", "description": "" }, - "showMembers": { - "message": "Shfaq anëtarët", - "description": "" - }, "resetSession": { "message": "Rinis sesionin", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Shihni numër sigurie", "description": "" }, - "viewAllMedia": { - "message": "Shihni krejt mediat", - "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": "Nëse doni të verifikoni sigurinë e fshehtëzimit tuaj skaj-më-skaj me $name$, krahasoni numrat më sipër me numrat në pajisjen e tij.", "description": "", @@ -887,14 +727,6 @@ "message": "S’keni shkëmbyer ende ndonjë mesazh me këtë grup. Numri juaj i sigurisë me të do të jetë i passhëm pas mesazhit të parë.", "description": "" }, - "moreInfo": { - "message": "Më Tepër të Dhëna…", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Riprovo Dërgimin", - "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": "Fshije Mesazhin", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Ruaje", "description": "" }, - "fileIconAlt": { - "message": "Ikonë kartele", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Figurë emoji e '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Mirë se vini te Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatësia është e mundur. Signal-i e bën të lehtë.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Lidheni telefonin tuaj me Signal-in për Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Rregullime Signal-i", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Pajisje të Lidhura", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Butoni '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Lidhini Pajisje të Re", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Emër pajisjeje", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Zgjidhni emër të kësaj pajisje", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Përfundoje lidhjen e telefonit", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Po njëkohësohen kontakte dhe grupe", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Dështoi lidhja me shërbyesin.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Na ndjeni, keni shumë pajisje të lidhura tashmë. Provoni të hiqni ndoca.", - "description": "" - }, - "settings": { - "message": "Rregullime", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Temë", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Leje", @@ -1029,34 +801,6 @@ "message": "Aktivizo kontroll drejtshkrimi të tekstit të dhënë te kutia e hartimit të mesazheve", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Pastroji të Dhënat", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Kjo do të pastrojë krejt të dhënat te aplikacioni, duke hequr krejt mesazhet dhe të dhëna llogarie të ruajtura.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Pastroji të dhënat", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Të fshihen krejt të dhënat?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Ju ndan një hap nga fshirja e krejt të dhënave të llogarisë të ruajtura për këtë aplikacion, përfshi krejt kontaktet dhe krejt mesazhet. Mundeni përherë ta rilidhni pajisjen tuaj celulare, por kjo nuk do të sjellë rikthim të mesazheve të fshirë.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Fshiji krejt të dhënat", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Po bëhet shkëputja dhe fshirja e krejt të dhënave", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Njoftime", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Dërgimi dështoi", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Hollësi", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Fshihi hollësitë", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Mësoni më tepër rreth verifikimit të numrave të sigurisë", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "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.", + "message": "Ky version i Session-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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Mesazh media", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numri s’është i regjistruar", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakte", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importoni krejt grupet dhe kontaktet Signal nga pajisja juaj celulare.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Importimi i fundit më", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importoji tani", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Po importohen…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importimi dështoi. Sigurohuni që kompjuteri dhe telefoni juaj janë të lidhur në internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "tani", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 orë", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr më parë", - "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 më parë", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "tani", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Luaj një tingull njoftimi ", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Ka ndryshuar Numër Sigurie", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "E çelët", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Filloni bisedë të re…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Jepni një numër telefoni që të shtohet një kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Numër i pavlefshëm", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Që të vazhdoni shkëmbim mesazhesh, rilidheni Signal-in për Desktop me pajisjen tuaj celulare.", - "description": "" - }, - "unlinked": { - "message": "Jo e lidhur", - "description": "" - }, - "relink": { - "message": "Rilidhe", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Ka gati përditësim të Session-it", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index 4a6c715d7..3a627d302 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Help", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "ваша одабрана локација", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Унапређујем базу података. Ово може потрајати неко време...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Учитавање порука. $count$ до сад...", - "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": "Ја", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Напустили сте групу", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Иди на крај преписке", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Нова порука испод", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Нове поруке испод", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 непрочитана порука", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Ваше шифре преписки за више чланова ове групе су промењене од како сте последњи пут проверавали. Ово значи или да неко пресреће вашу преписку, или су једноставно извршили поновну инсталацију Signal-а.", + "message": "Ваше шифре преписки за више чланова ове групе су промењене од како сте последњи пут проверавали. Ово значи или да неко пресреће вашу преписку, или су једноставно извршили поновну инсталацију Session-а.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Шифра преписке са $name$ је промењена од како сте последњи пут проверавли. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Signal-а. ", + "message": "Шифра преписке са $name$ је промењена од како сте последњи пут проверавли. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Session-а. ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Шифра преписке коју покушавате да проверите је промењена. Молимо да проверите вашу нову шифру преписке са $name$. Имајте у виду да ово може значити да неко покушава да пресретне вашу преписку или то да је $name$ једноставно извршио поновну инсталацију Signal-а.", + "message": "Шифра преписке коју покушавате да проверите је промењена. Молимо да проверите вашу нову шифру преписке са $name$. Имајте у виду да ово може значити да неко покушава да пресретне вашу преписку или то да је $name$ једноставно извршио поновну инсталацију Session-а.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Ваше шифре преписки за више чланова ове групе су недавно промењене. Ово значи или да неко покушава да пресретне вашу преписку, или су једноставно извршили поновну инсталацију Signal-а.", + "message": "Ваше шифре преписки за више чланова ове групе су недавно промењене. Ово значи или да неко покушава да пресретне вашу преписку, или су једноставно извршили поновну инсталацију Session-а.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Шифра преписке са $name$ је промењена. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Signal-а. ", + "message": "Шифра преписке са $name$ је промењена. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Session-а. ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Шифра преписке са $name$ је промењена. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Signal-а. Можда би требало да пoтврдите шифру преписке са овим контактом.", + "message": "Шифра преписке са $name$ је промењена. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Session-а. Можда би требало да пoтврдите шифру преписке са овим контактом.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Пошаљи", "description": "" }, - "acceptNewKey": { - "message": "Прихвати", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Означи као проверено", "description": "" @@ -455,10 +385,6 @@ "message": "Нова шифра преписке", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Шифра преписке са овим дописником је другачија. Ово значи или да неко пресреће вашу преписку, или је овај дописник једноставно извршио поновну инсталацију Signal-а. Можда желите да верификујете приказану шифру.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Тип уграђеног садржаја није подржан. Притисните да би преузели.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Притисните да би сте сачували", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Неименована датотека", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Гласовна порука", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Прекинуто", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Повезујем се", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Тражи", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Добродошли у Signal", - "description": "" - }, - "selectAContact": { - "message": "Започните преписку одабиром дописника или групе.", + "message": "Добродошли у Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Одустани", "description": "" }, - "failedToSend": { - "message": "Неким дописницима није послато. Проверите статус мреже.", - "description": "" - }, "error": { "message": "Грешка", "description": "" }, - "messageDetail": { - "message": "Детаљи поруке", - "description": "" - }, "delete": { "message": "Обриши", "description": "" @@ -857,10 +705,6 @@ "message": "Чланови групе", "description": "" }, - "showMembers": { - "message": "Прикажи чланове", - "description": "" - }, "resetSession": { "message": "Обнови везу", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "Ако желите да проверите безбедност ваше end-to-end енкрипције са $name$, упоредите горе приказане бројеве са бројевима на њиховом уређају.", "description": "", @@ -887,14 +727,6 @@ "message": "Морате разменити бар једну поруку са овим дописником. Шифра за дописивање ће се створити након прве преписке.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Сачувај", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Добродошли у Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Приватност је достижна. Signal вам то олакшава.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Неуспешно повезивање са сервером.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Жао нам је, повезали сте превише уређаја. Развежите неке од њих.", - "description": "" - }, - "settings": { - "message": "Подешавања", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Стил", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Обавештења", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Опширније", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Основно", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Више о верификацији шифара преписки", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Ваша верзија Signal-а за десктоп је застарела. Да би сте наставили дописивање, молимо вас да ажурирате програм.", + "message": "Ваша верзија Session-а за десктоп је застарела. Да би сте наставили дописивање, молимо вас да ажурирате програм.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Без текста", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Корисник није регистрован", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Дописници", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Увезите све групе Signal-а и особе са вашег мобилног уређаја.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Задњи пут увежено", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Увези сад", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Увозим...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Увоз неуспешан. Оба уређаја треба да буду повезана на интернет.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "сада", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 час", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "сада", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Звучно обавештење", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Упишите број телефона за нову особу.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Неисправан број", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Да би наставили дописивање, поново повежите Signal за десктоп са мобилним уређајем.", - "description": "" - }, - "unlinked": { - "message": "Развезано", - "description": "" - }, - "relink": { - "message": "Поново вежи", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Нова верзија Session-а је доступна", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 53bf2670c..cd6d21e01 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Hjälp", "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": "Inställningar", - "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": "Göm", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Stäng Signal", + "message": "Stäng Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "Ställ in med import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Ställ in som ny enhet", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Ställ in som fristående enhet", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Välj fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Läs in din data", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har just gått igenom exporteringsprocessen och dina kontakter och meddelanden ligger nu på din dator. Vänligen välj mappen som innehåller din sparade data för Signal.", + "message": "Du har just gått igenom exporteringsprocessen och dina kontakter och meddelanden ligger nu på din dator. Vänligen välj mappen som innehåller din sparade data för Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Kontrollera att du valt rätt mapp som innehåller dina sparade Signal-data. Dess namn borde börja med 'Signal Export.' Du kan också spara en ny kopia av din data från Chrome-appen.", + "message": "Kontrollera att du valt rätt mapp som innehåller dina sparade Session-data. Dess namn borde börja med 'Session Export.' Du kan också spara en ny kopia av din data från Chrome-appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Börja använd Signal Desktop", + "message": "Börja använd Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Länka denna enhet till din mobil", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "din valda plats", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Uppgraderar databasen. Detta kan ta lite tid...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Läser in meddelanden. $count$ hittills...", - "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": "Jag", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Du lämnade gruppen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rulla till botten av konversationen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nytt meddelande nedanför", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nya meddelanden nedanför", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 oläst meddelande", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Dina säkerhetsnummer med flera gruppmedlemmar har ändrats sen du sist verifierade dem. Detta kan betyda att någon försöker lyssna av din kommunikation eller att de bara installerat om Signal.", + "message": "Dina säkerhetsnummer med flera gruppmedlemmar har ändrats sen du sist verifierade dem. Detta kan betyda att någon försöker lyssna av din kommunikation eller att de bara installerat om Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Ditt säkerhetsnummer med $name$ har ändrats sen du senast verifierade. Detta kan betyda att någon försöker avlyssna din konversation eller att $name$ har ominstallerat Signal.", + "message": "Ditt säkerhetsnummer med $name$ har ändrats sen du senast verifierade. Detta kan betyda att någon försöker avlyssna din konversation eller att $name$ har ominstallerat Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Säkerhetsnyckeln som du försöker verifiera har ändrats. Dubbelkolla ditt nya säkerhetsnummer med $name$. Kom ihåg, detta kan betyda att någon försöker komma åt din konversation eller att $name$ har ominstallerat Signal.", + "message": "Säkerhetsnyckeln som du försöker verifiera har ändrats. Dubbelkolla ditt nya säkerhetsnummer med $name$. Kom ihåg, detta kan betyda att någon försöker komma åt din konversation eller att $name$ har ominstallerat Session.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Dina säkerhetsnummer med flera gruppmedlemmar har nyligen ändrats. Det kan innebära att någon försöker lyssna av din kommunikation eller att de bara installerat om Signal.", + "message": "Dina säkerhetsnummer med flera gruppmedlemmar har nyligen ändrats. Det kan innebära att någon försöker lyssna av din kommunikation eller att de bara installerat om Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ditt säkerhetsnummer med $name$ har nyligen ändrats. Detta kan betyda att någon försöker avlyssna konversationen eller att $name$ har ominstallerat Signal.", + "message": "Ditt säkerhetsnummer med $name$ har nyligen ändrats. Detta kan betyda att någon försöker avlyssna konversationen eller att $name$ har ominstallerat Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Ditt säkerhetsnummer med $name$ har ändrats. Detta kan antingen betyda att någon försöker avlyssna din konversation eller att $name$ har ominstallerat Signal. Du kanske vill verifiera det nya säkerhetsnumret med denna kontakt.", + "message": "Ditt säkerhetsnummer med $name$ har ändrats. Detta kan antingen betyda att någon försöker avlyssna din konversation eller att $name$ har ominstallerat Session. Du kanske vill verifiera det nya säkerhetsnumret med denna kontakt.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Skicka", "description": "" }, - "acceptNewKey": { - "message": "Godkänn", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Märk som verifierat", "description": "" @@ -455,10 +385,6 @@ "message": "Nytt säkerhetsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ditt säkerhetsnummer med den här kontakten har ändrats. Detta kan antingen innebära att någon försöker avlyssna din kommunikation, eller att kontakten har ominstallerat Signal. Du kan verifiera det nya säkerhetsnumret nedan.", - "description": "" - }, "incomingError": { "message": "Fel med att hantera inkommande meddelande", "description": "" @@ -495,18 +421,6 @@ "message": "Denna månad", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Okänd filtyp på bilaga. Klicka för att spara.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klicka för att spara", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Namnlös fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Röstmeddelande", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Bilagor av denna typ tillåts inte på grund av säkerhetsskäl", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Läser in förhandsvisning...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Utkast av länkförhandsvisning i miniatyrbild för $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Länkförhandsvisning i miniatyrbild för $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Kunde inte läsa in vald bilaga", "description": "" }, - "disconnected": { - "message": "Frånkopplad", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Ansluter", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Gå till versionsanteckningar", "description": "" }, - "goToForums": { - "message": "Gå till forumet", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå till supportsidan", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Rapportera ett fel", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktops preferenser", - "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": "Tal", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Visa", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Göm", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Avsluta", - "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" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Välkommen till Signal", - "description": "" - }, - "selectAContact": { - "message": "Välj en kontakt eller grupp för att börja prata.", + "message": "Välkommen till Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Skicka meddelande", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hem", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Svarar till $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": "Om du vill skicka röstmeddelanden måste Signal Desktop ha tillgång till din mikrofon.", + "message": "Om du vill skicka röstmeddelanden måste Session Desktop ha tillgång till din mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Tillåt åtkomst", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Visa inställningar", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Ljud", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Avbryt", "description": "" }, - "failedToSend": { - "message": "Kunde inte skicka till vissa mottagare. Kontrollera din internetuppkoppling.", - "description": "" - }, "error": { "message": "Fel", "description": "" }, - "messageDetail": { - "message": "Meddelandedetaljer", - "description": "" - }, "delete": { "message": "Radera", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppmedlemmar", "description": "" }, - "showMembers": { - "message": "Visa medlemmar", - "description": "" - }, "resetSession": { "message": "Återställ session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Visa säkerhetsnummer", "description": "" }, - "viewAllMedia": { - "message": "Visa alla 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": "Om du vill verifiera krypteringen mellan dig och $name$, jämför siffrorna ovan med siffrorna på deras enhet.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har inte utbytt några meddelanden med denna kontakt ännu. Ditt säkerhetsnummer med dem kommer att vara tillgängliga efter det första meddelandet.", "description": "" }, - "moreInfo": { - "message": "Mer info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Skicka igen", - "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": "Radera meddelande", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Spara", "description": "" }, - "fileIconAlt": { - "message": "Filikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emojibild av '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Välkommen till Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Integritet är möjligt. Signal gör det lätt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Länka din mobil till Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal-inställningar", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Länkade enheter", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+'-knappen", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Länka ny enhet", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Enhetsnamn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Välj enhetsnamn", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Slutför länkning till mobil", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserar kontakter och grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunde inte kontakta servern.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Tyvärr har du för många enheter redan länkade. Försök att ta bort några.", - "description": "" - }, - "settings": { - "message": "Inställningar", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Behörigheter", @@ -1029,34 +801,6 @@ "message": "Slå på stavningskontroll för text som anges i meddelandefältet", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Rensa data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Detta kommer radera all data i applikationen, det tar bort alla meddelanden och sparad kontoinformation.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Radera data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Radera all data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du är på väg att radera alla denna applikations sparade kontoinformation, inklusive alla kontakter och alla meddelanden. Du kan länka till din mobila enhet igen, men det kommer inte återställa de raderade meddelandena.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Radera all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Kopplar bort och raderar all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Aviseringar", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Att skicka meddelandet misslyckades", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Info", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Göm info", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lär dig mer om att verifiera säkerhetsnummer", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Den här versionen av Signal Desktop har utgått. Vänligen uppgradera till den senaste versionen för att fortsätta chatta.", + "message": "Den här versionen av Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Mediameddelande", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numret är inte registrerat", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakter", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importera alla grupper och kontakter från Signal på din mobil.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Senaste import", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importera nu", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importerar...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importen misslyckades. Kontrollera att din dator och din telefon har en fungerande internetuppkoppling.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nyss", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 timme", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "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": { - "content": "$1", - "example": "2" - } - } - }, - "hoursAgo": { - "message": "$hours$ t sen", - "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$ minuter sedan", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nyss", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Spela ljudavisering", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Säkerhetsnumret har ändrats", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Ljust", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Starta en ny konversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Ange ett telefonnummer för att lägga till en kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Felaktigt nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Länka om Signal Desktop till din mobila enhet för att fortsätta skicka meddelanden.", - "description": "" - }, - "unlinked": { - "message": "Olänkad", - "description": "" - }, - "relink": { - "message": "Återkoppla", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Uppdatering för Session tillgänglig", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/th/messages.json b/_locales/th/messages.json index 08d3e2af2..19b88bc73 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&ความช่วยเหลือ", "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": "การกำหนด...", - "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": "ซ่อน", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "ออกจาก Signal", + "message": "ออกจาก Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "ตั้งค่าด้วยการนำเข้า", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "ตั้งค่าให้เป็นอุปกรณ์ใหม่", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "ตั้งค่าเป็นอุปกรณ์สแตนด์อโลน", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "โหลดข้อมูลของคุณ", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "คุณพึ่งจะผ่านพ้นขั้นตอนการส่งออกและข้อมูลผู้ติดต่อและข้อความของคุณยังคงรออยู่ในเครื่องคอมพิวเตอร์ของคุณ เลือกโฟลเดอร์ที่จัดเก็บข้อมูล Signal ที่บันทึกไว้ของคุณ", + "message": "คุณพึ่งจะผ่านพ้นขั้นตอนการส่งออกและข้อมูลผู้ติดต่อและข้อความของคุณยังคงรออยู่ในเครื่องคอมพิวเตอร์ของคุณ เลือกโฟลเดอร์ที่จัดเก็บข้อมูล Session ที่บันทึกไว้ของคุณ", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "โปรดแน่ใจว่าคุณได้เลือกโฟลเดอร์ที่จัดเก็บข้อมูล Signal ที่บันทึกไว้ของคุณอย่างถูกต้อง โดยชื่อของโฟลเดอร์ควรจะเริ่มต้นด้วยคำว่า 'Signal Export' คุณยังสามารถทำการบันทึกข้อมูลของคุณใหม่ผ่านทางแอปใน Chrome", + "message": "โปรดแน่ใจว่าคุณได้เลือกโฟลเดอร์ที่จัดเก็บข้อมูล Session ที่บันทึกไว้ของคุณอย่างถูกต้อง โดยชื่อของโฟลเดอร์ควรจะเริ่มต้นด้วยคำว่า 'Session Export' คุณยังสามารถทำการบันทึกข้อมูลของคุณใหม่ผ่านทางแอปใน Chrome", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "เริ่มต้นใช้งาน Signal Desktop", + "message": "เริ่มต้นใช้งาน Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "เชื่อมโยงอุปกรณ์นี้กับโทรศัพท์ของคุณ", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "ตำแหน่งที่คุณเลือก", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "กำลังอัพเกรดฐานข้อมูล อาจต้องใช้เวลาสักพักหนึ่ง...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "ถึงตอนนี้กำลังโหลดข้อความไปแล้ว $count$ ข้อความ...", - "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": "ฉัน", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "คุณได้ออกจากกลุ่ม", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "เลื่อนไปที่ด้านล่างสุดของการสนทนา", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "ข้อความใหม่ข้างล่าง", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "ข้อความใหม่ข้างล่าง", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ข้อความที่ยังไม่ได้อ่าน", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับสมาชิกในหลายกลุ่มนับตั้งแต่การยืนยันครั้งล่าสุดของคุณ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่พวกเขาเหล่านั้นได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับสมาชิกในหลายกลุ่มนับตั้งแต่การยืนยันครั้งล่าสุดของคุณ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่พวกเขาเหล่านั้นได้ติดตั้งแอป Session ใหม่", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ นับตั้งแต่การยืนยันครั้งล่าสุดของคุณ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ นับตั้งแต่การยืนยันครั้งล่าสุดของคุณ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Session ใหม่", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยที่คุณกำลังจะทำการยืนยัน โปรดตรวจสอบรหัสความปลอดภัยของคุณกับ $name$ โปรดจำไว้ว่า การเปลี่ยนแปลงนี้อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยที่คุณกำลังจะทำการยืนยัน โปรดตรวจสอบรหัสความปลอดภัยของคุณกับ $name$ โปรดจำไว้ว่า การเปลี่ยนแปลงนี้อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Session ใหม่", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "มีการเปลี่ยนแปลงรหัสความปลอดภัยของคุณกับสมาชิกในหลายกลุ่มเมื่อเร็วๆ นี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่พวกเขาเหล่านั้นได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงรหัสความปลอดภัยของคุณกับสมาชิกในหลายกลุ่มเมื่อเร็วๆ นี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่พวกเขาเหล่านั้นได้ติดตั้งแอป Session ใหม่", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ เมื่อเร็วๆ นี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ เมื่อเร็วๆ นี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Session ใหม่", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Signal ใหม่ คุณอาจจะต้องยืนยันรหัสความปลอดภัยกับผู้ติดต่อนี้", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Session ใหม่ คุณอาจจะต้องยืนยันรหัสความปลอดภัยกับผู้ติดต่อนี้", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "ส่ง", "description": "" }, - "acceptNewKey": { - "message": "ยอมรับ", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "ทำเครื่องหมายว่ายืนยันแล้ว", "description": "" @@ -455,10 +385,6 @@ "message": "รหัสความปลอดภัยใหม่", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับผู้ติดต่อนี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ผู้ติดต่อนี้ได้ติดตั้งแอป Signal ใหม่ คุณอาจจะต้องยืนยันรหัสความปลอดภัยใหม่ด้านล่างนี้", - "description": "" - }, "incomingError": { "message": "เกิดข้อผิดพลาดในการจัดการข้อความขาเข้า", "description": "" @@ -495,18 +421,6 @@ "message": "เดือนนี้", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "ประเภทไฟล์แนบที่ไม่รองรับ คลิกเพื่อบันทึก", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "คลิกเพื่อบันทึก", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "ไฟล์ที่ไม่มีชื่อ", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "ข้อความเสียง", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "เลิกการเชื่อมต่อแล้ว", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "กำลังเชื่อมต่อ", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "ไปที่บันทึกประจำรุ่น", "description": "" }, - "goToForums": { - "message": "ไปที่ฟอรัม", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "ไปที่หน้าการสนับสนุน", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "รายงานปัญหา", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "การกำหนดลักษณะ Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "เกี่ยวกับ Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "การพูด", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "แสดง", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "ซ่อน", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "ออก", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "ค้นหา", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "ยินดีต้อนรับสู่ Signal", - "description": "" - }, - "selectAContact": { - "message": "เลือกผู้ติดต่อหรือกลุ่มเพื่อเริ่มต้นการแชต", + "message": "ยินดีต้อนรับสู่ Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "ส่งข้อความ", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "บ้าน", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "คุณ", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "ตอบกลับหา $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": "เพื่อจะส่งข้อความเสียง ต้องอนุญาตให้ Signal Desktop ใช้งานไมโครโฟนของคุณ", + "message": "เพื่อจะส่งข้อความเสียง ต้องอนุญาตให้ Session Desktop ใช้งานไมโครโฟนของคุณ", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "อนุญาตให้เข้าถึง", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "แสดงการตั้งค่า", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "เสียง", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "ยกเลิก", "description": "" }, - "failedToSend": { - "message": "ส่งไปยังผู้รับบางคนไม่สำเร็จ ตรวจสอบการเชื่อมต่อเครือข่ายของคุณ", - "description": "" - }, "error": { "message": "ข้อผิดพลาด", "description": "" }, - "messageDetail": { - "message": "รายละเอียดข้อความ", - "description": "" - }, "delete": { "message": "ลบ", "description": "" @@ -857,10 +705,6 @@ "message": "สมาชิกกลุ่ม", "description": "" }, - "showMembers": { - "message": "แสดงสมาชิก", - "description": "" - }, "resetSession": { "message": "ตั้งค่าเซสชันใหม่", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "แสดงรหัสความปลอดภัย", "description": "" }, - "viewAllMedia": { - "message": "ดูสื่อทั้งหมด", - "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": "หากคุณต้องการยืนยันความปลอดภัยในการเข้ารหัสจากต้นทางถึงปลายทางระหว่างคุณกับ $name$ ให้เปรียบเทียบตัวเลขด้านบนกับตัวเลขบนอุปกรณ์ของเขา", "description": "", @@ -887,14 +727,6 @@ "message": "คุณยังไม่ได้แลกเปลี่ยนข้อความใดๆ กับผู้ติดต่อนี้ รหัสความปลอดภัยของคุณกับพวกเขาจะมีให้หลังเริ่มส่งข้อความแรก", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "ลบข้อความนี้", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "บันทึก", "description": "" }, - "fileIconAlt": { - "message": "ไอคอนไฟล์", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "รูปอีโมจิของ '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "ยินดีต้อนรับสู่ Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "ความเป็นส่วนตัวเป็นไปได้อย่างง่ายดายด้วย Signal", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "เชื่อมโยงโทรศัพท์ของคุณกับ Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "การตั้งค่า Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "อุปกรณ์ที่เชื่อมโยง", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "ปุ่ม '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "เชื่อมโยงอุปกรณ์ใหม่", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "ชื่ออุปกรณ์", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "เลือกชื่อของอุปกรณ์นี้", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "เชื่อมโยงโทรศัพท์เสร็จสิ้น", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "กำลังซิงค์รายชื่อผู้ติดต่อและกลุ่ม", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "เชื่อมต่อกับเซิร์ฟเวอร์ล้มเหลว", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "ขออภัย คุณมีอุปกรณ์ที่เชื่อมโยงมากเกินไป ลองถอนการเชื่อมโยงจากบางอุปกรณ์บ้าง", - "description": "" - }, - "settings": { - "message": "การตั้งค่า", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "ธีม", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "สิทธิ์", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "ล้างข้อมูล", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "นี่จะเป็นการล้างข้อมูลทั้งหมดในโปรแกรม ลบข้อความทั้งหมดรวมทั้งข้อมูลทางบัญชีที่บันทึกไว้", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "ล้างข้อมูล", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "ลบข้อมูลทั้งหมดหรือ", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "คุณกำลังจะลบข้อมูลบัญชีที่บันทึกไว้ของโปรแกรมนี้ทั้งหมด ซึ่งรวมถึงผู้ติดต่อและข้อความทั้งหมด คุณสามารถเชื่อมต่อกับอุปกรณ์เคลื่อนที่ของคุณใหม่ได้เสมอแต่จะไม่สามารถเรียกคืนข้อความที่ถูกลบไปแล้ว", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "ลบข้อมูลทั้งหมด", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "กำลังยกเลิกการเชื่อมต่อและลบข้อมูลทั้งหมด", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "การแจ้งเตือน", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "รายละเอียด", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "ซ่อนรายละเอียด", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "เรียนรู้เพิ่มเติมเกี่ยวกับการยืนยันรหัสความปลอดภัย", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal Desktop เวอร์ชันนี้หมดอายุแล้ว โปรดอัพเกรดไปเป็นเวอร์ชันล่าสุดเพื่อดำเนินการส่งข้อความต่อ", + "message": "Session Desktop เวอร์ชันนี้หมดอายุแล้ว โปรดอัพเกรดไปเป็นเวอร์ชันล่าสุดเพื่อดำเนินการส่งข้อความต่อ", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "ข้อความสื่อ", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "ยังไม่ได้ลงทะเบียนรหัส", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "ผู้ติดต่อ", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "นำเข้ากลุ่มและผู้ติดต่อใน Signal ทั้งหมดจากอุปกรณ์เคลื่อนที่ของคุณ", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "นำเข้าครั้งล่าสุดเมื่อ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "นำเข้าเดี๋ยวนี้", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "กำลังนำเข้า...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "การนำเข้าล้มเหลว แน่ใจว่าคอมพิวเตอร์และโทรศัพท์ของคุณเชื่อมต่อกับอินเตอร์เน็ตแล้ว", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "เดี๋ยวนี้", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ชั่วโมง", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "เดี๋ยวนี้", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "ดดด ว", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "เล่นการแจ้งเตือนด้วยเสียง", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "ป้อนหมายเลขโทรศัพท์เพื่อเพิ่มผู้ติดต่อ", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "หมายเลขไม่ถูกต้อง", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "เชื่อมโยง Signal Desktop กับอุปกรณ์เคลื่อนที่ของคุณอีกครั้งเพื่อใช้งานการส่งข้อความอย่างต่อเนื่อง", - "description": "" - }, - "unlinked": { - "message": "เลิกเชื่อมโยงแล้ว", - "description": "" - }, - "relink": { - "message": "เชื่อมโยงอีกครั้ง", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "มีการอัพเดทสำหรับ Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 7ee802fd2..6d3b9d8bf 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "&Yardım", "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": "Tercihler...", - "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": "Gizle", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Signal'den Çık", + "message": "Session'den Çık", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "İçe Aktarma seçeneği ile kur", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Yeni Cihaz olarak kur", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Bağımsız Cihaz olarak kur", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Dosya seçin", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Verilerinizi yükleyin", "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 iletileriniz 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 Session verilerinizi içeren klasörü seçin.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Kaydedilmiş Signal verilerinizi içeren doğru dizini seçtiğinizden emin olun. Dizinin ismi 'Signal Export' ile başlamalı. Verinizin yeni bir kopyasını Chrome Uygulamasından kaydededebilirsiniz.", + "message": "Kaydedilmiş Session verilerinizi içeren doğru dizini seçtiğinizden emin olun. Dizinin ismi 'Session Export' ile başlamalı. Verinizin yeni bir kopyasını Chrome Uygulamasından kaydededebilirsiniz.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Signal Desktop'ı kullanmaya başlayın", + "message": "Session Desktop'ı kullanmaya başlayın", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Bu cihazı telefonunuza bağlayın", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "seçtiğiniz konum", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Veritabanı yükseltiliyor. Bu biraz zaman alabilir...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "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": { - "content": "$1", - "example": "5" - } - } - }, "me": { "message": "Ben", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Gruptan ayrıldınız", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Sohbetin en altına kaydır", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "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 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ış İleti", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "Birden fazla grup üyesiyle olan güvenlik numaralarınız son doğrulamanızdan bu yana. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da kişilerin Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "Birden fazla grup üyesiyle olan güvenlik numaralarınız son doğrulamanızdan bu yana. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da kişilerin Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "$name$ ile olan güvenlik numaranız son doğrulamanızdan bu yana değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "$name$ ile olan güvenlik numaranız son doğrulamanızdan bu yana değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Doğrulamaya çalıştığınız güvenlik numarası değişti. Lütfen $name$ ile olan yeni güvenlik numaranızı gözden geçirin. Unutmayın, bu değişiklik birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "Doğrulamaya çalıştığınız güvenlik numarası değişti. Lütfen $name$ ile olan yeni güvenlik numaranızı gözden geçirin. Unutmayın, bu değişiklik birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Birden fazla grup üyesiyle olan güvenlik numaralarınız yakın zamanda değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da kişilerin Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "Birden fazla grup üyesiyle olan güvenlik numaralarınız yakın zamanda değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da kişilerin Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "$name$ ile olan güvenlik numaranız yakın zamanda değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "$name$ ile olan güvenlik numaranız yakın zamanda değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "$name$ ile olan güvenlik numaranız değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Signal'i yeniden yüklemiş olduğu anlamına gelebilir. Bu kişi ile güvenlik numaranızı doğrulamak isteyebilirsiniz.", + "message": "$name$ ile olan güvenlik numaranız değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Session'i yeniden yüklemiş olduğu anlamına gelebilir. Bu kişi ile güvenlik numaranızı doğrulamak isteyebilirsiniz.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Gönder", "description": "" }, - "acceptNewKey": { - "message": "Kabul et", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Doğrulanmış olarak işaretle", "description": "" @@ -455,10 +385,6 @@ "message": "Yeni güvenlik numarası", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Bu kişiyle olan güvenlik numaranız değişti. Bu birisinin iletişiminizi kesmeye çalıştığı veya bu kişinin Signal'i yeniden yüklemiş olduğu anlamına gelebilir. Aşağıdaki yeni güvenlik numarasını doğrulamak isteyebilirsiniz.", - "description": "" - }, "incomingError": { "message": "Gelen ileti işlenirken hata oluştu", "description": "" @@ -495,18 +421,6 @@ "message": "Bu Ay", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Desteklenmeyen eklenti türü. Kaydetmek için tıkla.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Kaydetmek için tıkla", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "İsimsiz Dosya", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Sesli İleti", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Eklenti türüne güvenlik sebeplerinden dolayı izin verilmemektedir", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Öz İzleme Yükleniyor...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "$domain$ için bağlantı ön izlemesi küçük resim taslağı", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "$domain$ için bağlantı ön izlemesi küçük resmi", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Seçilen eklenti yüklenemedi.", "description": "" }, - "disconnected": { - "message": "Bağlantı yok", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Bağlanıyor", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Sürüm Notlarına Git", "description": "" }, - "goToForums": { - "message": "Forumlara Git", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Destek Sayfasına Git", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Sorun Bildir", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Tercihleri", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Signal Desktop Hakkında", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Konuşma", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Göster", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Gizle", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Çıkış Yap", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Ara", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Signal'e Hoşgeldin", - "description": "" - }, - "selectAContact": { - "message": "Sohbete başlamak için bir kişi veya grup seçin.", + "message": "Session'e Hoşgeldin", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "İleti Gönder", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "ev", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "Siz", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "$name$ Cevaben", - "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": "Sesli iletiler göndermek için, Signal Desktop'ın mikrofonunuza erişimine izin verin.", + "message": "Sesli iletiler göndermek için, Session Desktop'ın mikrofonunuza erişimine izin verin.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Erişimine İzin Ver", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Ayarları Göster", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Ses", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "İptal", "description": "" }, - "failedToSend": { - "message": "Bazı alıcılara gönderilemedi. Ağ bağlantınızı kontrol edin.", - "description": "" - }, "error": { "message": "Hata", "description": "" }, - "messageDetail": { - "message": "İleti Detayı", - "description": "" - }, "delete": { "message": "Sil", "description": "" @@ -857,10 +705,6 @@ "message": "Grup üyeleri", "description": "" }, - "showMembers": { - "message": "Üyeleri göster", - "description": "" - }, "resetSession": { "message": "Oturumu sıfırla", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Güvenlik numarasını görüntüle", "description": "" }, - "viewAllMedia": { - "message": "Tüm medyaları görüntüle", - "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": "$name$ ile olan uçtan uca şifrelemenizin güvenliğini doğrulamak isterseniz, yukarıdaki numaraları cihazlarındaki numaralarla karşılaştırın.", "description": "", @@ -887,14 +727,6 @@ "message": "Bu kişiyle herhangi bir iletişimde bulunmadınız. Güvenlik numaralarınız ilk iletiden sonra oluşturulacaktır.", "description": "" }, - "moreInfo": { - "message": "Daha Fazla Bilgi...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Tekrar Gönder", - "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": "İletiyi Sil", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Kaydet", "description": "" }, - "fileIconAlt": { - "message": "Dosya ikonu", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "'$title$' emoji resmi", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Signal Desktop'a Hoş Geldiniz", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Gizlilik mümkün. Signal bunu kolaylaştırır.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Signal Desktop'a telefonunuzu bağlayın", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Ayarları", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Bağlı cihazlar", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Düğmesi", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Yeni Cihaz Bağla", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Cihaz adı", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Bu cihazı adlandırın", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Telefon bağlantısını tamamla", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Kişiler ve gruplar senkronize ediliyor", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Sunucuya bağlanılamadı.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Üzgünüz, halihazırda bağlı olan çok fazla cihazınız var. Bazılarını kaldırmayı deneyin.", - "description": "" - }, - "settings": { - "message": "Ayarlar", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "İzinler", @@ -1029,34 +801,6 @@ "message": "İleti kutusuna girilen sözcüklerin denetlenmesini etkinleştir", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Verileri Temizle", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "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": { - "message": "Verileri temizle", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Tüm veri silinsin mi?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "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": { - "message": "Tüm verileri sil", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Bağlantı kesiliyor ve tüm veriler siliniyor", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Bildirimler", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "Gönderme başarısız", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaylar", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Detayları gizle", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Güvenlik numaralarını doğrulama hakkında daha fazla bilgi edinin", "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. İletişime devam etmek için lütfen en son sürüme geçin.", + "message": "Session 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" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "Medya iletisi", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numara kayıtlı değil", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kişiler", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Tüm Signal gruplarını ve kişileri mobil cihazınızdan buraya aktarın.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Son senkronize zamanı", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Şimdi içe aktar", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "İçe aktarılıyor...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "İçe aktarma başarısız oldu. Bilgisayarınızın ve telefonunuzun İnternet'e bağlı olduğundan emin olun.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "şimdi", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 saat", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ s", - "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$ s önce", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ dk", - "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$ dk önce", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "şimdi", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Sesli bildirim oynat", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Güvenlik Numarası değişti", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Açık", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "Yeni sohbet başlat…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Kişi eklemek için telefon numarasını girin.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Geçersiz numara", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "İletişime devam etmek için Signal Desktop'ı mobil cihazınıza yeniden bağlayın.", - "description": "" - }, - "unlinked": { - "message": "Bağlantı koparıldı", - "description": "" - }, - "relink": { - "message": "Yeniden bağla", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session güncellemesi mevcut", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index 26b4629cc..c55c35da6 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -1,20 +1,12 @@ { "copyErrorAndQuit": { - "message": "Copy error and quit", + "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": "Database Error", + "message": "Помилка бази даних", "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." @@ -28,51 +20,47 @@ "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": "В&ікно", + "message": "&Вікно", "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": "&Допомога", "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": "Preferences…", - "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": "Сховати", "description": "Application menu command to hide the window" }, "appMenuHideOthers": { - "message": "Hide Others", + "message": "Сховати інші", "description": "Application menu command to hide all other windows" }, "appMenuUnhide": { - "message": "Show All", + "message": "Показати всі", "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Session", + "message": "Завершити сесію", "description": "Application menu command to close the application" }, "editMenuUndo": { - "message": "Undo", + "message": "Назад", "description": "Edit menu command to remove recently-typed text" }, "editMenuRedo": { - "message": "Redo", + "message": "Вперед", "description": "Edit menu command to restore previously undone typed text" }, "editMenuCut": { - "message": "Cut", + "message": "Вирізати", "description": "Edit menu command to remove selected text and add it to clipboard" }, "editMenuCopy": { - "message": "Copy", + "message": "Копіювати", "description": "Edit menu command to add selected text to clipboard" }, "editMenuPaste": { - "message": "Paste", + "message": "Вставити", "description": "Edit menu command to insert text from clipboard at cursor location" }, "editMenuPasteAndMatchStyle": { @@ -84,27 +72,27 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Select All", + "message": "Вибрати все", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { - "message": "Start speaking", + "message": "Почати розмову", "description": "Edit menu item under 'speech' to start dictation" }, "editMenuStopSpeaking": { - "message": "Stop speaking", + "message": "Закінчити розмову", "description": "Edit menu item under 'speech' to stop dictation" }, "windowMenuClose": { - "message": "Close Window", + "message": "Закрити вікно", "description": "Window menu command to close the current window" }, "windowMenuMinimize": { - "message": "Minimize", + "message": "Згорнути в трей", "description": "Window menu command to minimize the current window" }, "windowMenuZoom": { - "message": "Zoom", + "message": "Збільшити", "description": "Window menu command to make the current window the size of the whole screen" }, "windowMenuBringAllToFront": { @@ -112,33 +100,29 @@ "description": "Window menu command to bring all windows of current applicatinon to front" }, "viewMenuResetZoom": { - "message": "Actual Size", + "message": "Актуальний розмір", "description": "View menu command to go back to the default zoom" }, "viewMenuZoomIn": { - "message": "Zoom In", + "message": "Збільшити", "description": "View menu command to make everything bigger" }, "viewMenuZoomOut": { - "message": "Zoom Out", + "message": "Зменшити", "description": "View menu command to make everything smaller" }, "viewMenuToggleFullScreen": { - "message": "Toggle Full Screen", + "message": "Відкрити на повний екран", "description": "View menu command to enter or leave Full Screen mode" }, "viewMenuToggleDevTools": { - "message": "Toggle Developer Tools", + "message": "Відкрити засоби розробника", "description": "View menu command to show or hide the developer tools" }, "menuSetupWithImport": { "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -148,7 +132,7 @@ "description": "Message shown on the loading screen before we've loaded any messages" }, "optimizingApplication": { - "message": "Optimizing application...", + "message": "Оптимізація програми...", "description": "Message shown on the loading screen while we are doing application optimizations" }, "migratingToSQLCipher": { @@ -161,36 +145,16 @@ } } }, - "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", + "message": "Обрати теку", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { - "message": "Load your data", + "message": "Завантаження даних", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -198,15 +162,15 @@ "description": "Title of the popup window used to select data previously exported" }, "importErrorHeader": { - "message": "Something went wrong!", + "message": "Щось пішло не так!", "description": "Header of the error screen after a failed import" }, "importingHeader": { - "message": "Loading contacts and messages", + "message": "Завантаження контактів та повідомлень", "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "Обране місце", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Оновлюється база даних, це займе трохи часу…", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Оновлюємо повідомлення. Бачимо поки $count$…", - "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": "Я", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Ви покинули групу", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Перейти в кінець бесіди", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Нове повідомлення нижче", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Нові повідомлення нижче", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 непрочитане повідомлення", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "З того часу, як ви востаннє підтверджували коди безпеки, у декількох учасників групи вони змінилися. Це означає, що хтось намагався перехопити ваші повідомлення, або ваші співрозмовники просто перевстановили Signal.", + "message": "З того часу, як ви востаннє підтверджували коди безпеки, у декількох учасників групи вони змінилися. Це означає, що хтось намагався перехопити ваші повідомлення, або ваші співрозмовники просто перевстановили Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Віднедавна $name$ та ви використовуєте новий код безпеки. Це значить, що хтось намагався перехопити ваші повідомлення або $name$ тепер просто має перевстановлений Signal.", + "message": "Віднедавна $name$ та ви використовуєте новий код безпеки. Це значить, що хтось намагався перехопити ваші повідомлення або $name$ тепер просто має перевстановлений Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Код безпеки, який ви намагаєтеся підтвердити, змінився. Перевірте новий код безпеки, який $name$ використовує для зв’язку з вами. Пам’ятайте: зміна коду означає, що хтось намагався перехопити ваші повідомлення або додаток чи програма Signal, яку використовує $name$, просто була перевстановлена.", + "message": "Код безпеки, який ви намагаєтеся підтвердити, змінився. Перевірте новий код безпеки, який $name$ використовує для зв’язку з вами. Пам’ятайте: зміна коду означає, що хтось намагався перехопити ваші повідомлення або додаток чи програма Session, яку використовує $name$, просто була перевстановлена.", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Нещодавно змінилися ваші коди безпеки з декількома учасниками групи. Це означає, що хтось намагався перехопити ваші повідомлення, або ваші співрозмовники просто перевстановили Signal.", + "message": "Нещодавно змінилися ваші коди безпеки з декількома учасниками групи. Це означає, що хтось намагався перехопити ваші повідомлення, або ваші співрозмовники просто перевстановили Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Віднедавна $name$ та ви використовуєте новий код безпеки. Це значить, що хтось намагався перехопити ваші повідомлення або $name$ тепер просто має перевстановлений Signal.", + "message": "Віднедавна $name$ та ви використовуєте новий код безпеки. Це значить, що хтось намагався перехопити ваші повідомлення або $name$ тепер просто має перевстановлений Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Змінився код безпеки, який $name$ використовує для зв’язку з вами. Це означає, що хтось намався перехопити ваші повідомлення, або додаток чи програма Signal, яку використовує $name$, була перевстановлена. Можливо, ви забажаєте підтвердити новий код безпеки.", + "message": "Змінився код безпеки, який $name$ використовує для зв’язку з вами. Це означає, що хтось намався перехопити ваші повідомлення, або додаток чи програма Session, яку використовує $name$, була перевстановлена. Можливо, ви забажаєте підтвердити новий код безпеки.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "Надіслати", "description": "" }, - "acceptNewKey": { - "message": "Прийняти", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Відмітити перевіреним", "description": "" @@ -455,10 +385,6 @@ "message": "Новий код безпеки", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ваш код безпеки з контактом змінився. Це може означати, що хтось намагається перехопити ваші повідомлення, або співрозмовник просто перевстановив Signal. Ви можете підтвердити новий код безпеки вказаний нижче.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "Цей місяць", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Непідтримуваний формат вкладення. Клацніть щоб зберегти.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Натисніть, щоб зберегти", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Безіменний файл", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Голосове повідомлення", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Від'єднано", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "З'єднання", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Про Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Розмова", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Показати", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Сховати", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Вийти", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Пошук", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Ласкаво просимо до Signal", - "description": "" - }, - "selectAContact": { - "message": "Оберіть контакт чи групу щоб почати спілкування.", + "message": "Ласкаво просимо до Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Надіслати повідомлення", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Аудіо", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "Відмінити", "description": "" }, - "failedToSend": { - "message": "Не вдалося відіслати деяким адресатам. Перевірте ваше мережеве з'єднання.", - "description": "" - }, "error": { "message": "Помилка", "description": "" }, - "messageDetail": { - "message": "Деталі повідомлення", - "description": "" - }, "delete": { "message": "Видалити", "description": "" @@ -857,10 +705,6 @@ "message": "Члени групи", "description": "" }, - "showMembers": { - "message": "Показати членів групи", - "description": "" - }, "resetSession": { "message": "Скинути сесію", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "Якщо бажаєте перевірити, чи безпечне наскрізне шифрування, коли $name$ надсилає та отримує ваші повідомлення, порівняйте цифри нижче з цифрами на пристрої вашого співрозмовника.", "description": "", @@ -887,14 +727,6 @@ "message": "Ви ще не обмінювалися повідомленнями з даними співрозмовником. Код безпеки стане доступний після першого надсилання повідомлення.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Видалити повідомлення", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Зберегти", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Ласкаво просимо до Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Приватність - це можливо. Signal робить її досягнення простим.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Під’єднані пристрої", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Під’єднати новий пристрій", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Не вдалося підключитись до сервера.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Вибачте, у вас забагато пов'язаних пристроїв. Видаліть які-небудь.", - "description": "" - }, - "settings": { - "message": "Налаштування", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Тема", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Нотифікації", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Деталі", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Сховати деталі", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Дізнатися більше про підтвердження кодів безпеки", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Медіа повідомлення", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Номер не зареєстровано", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Контакти", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Імпортувати всі контакти та групи з вашого мобільного пристрою.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Останній імпорт в", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Імпортувати", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Імпортую...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Імпорт закінчився невдало. Впевніться, що ваш комп'ютер та мобільний пристрій маютть доступ до інтернету.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "зараз", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 година", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "зараз", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Звукові повідомлення", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", + "message": "Почати нову розмову…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Введіть номер телефону щоб додати контакт.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Невірний номер", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Прив'яжіть Signal Desktop до вашого мобільного пристрою для продовження спілкування.", - "description": "" - }, - "unlinked": { - "message": "Відв'язан", - "description": "" - }, - "relink": { - "message": "Прив'язати", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Доступне оновлення Session", "description": "" @@ -1480,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ left the group", + "message": "$name$ покинув групу", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1490,7 +1122,7 @@ } }, "multipleLeftTheGroup": { - "message": "$name$ left the group", + "message": "$name$ покинули групу", "description": "Shown in the conversation history when multiple people leave the group", "placeholders": { "name": { @@ -1500,7 +1132,7 @@ } }, "updatedTheGroup": { - "message": "Group updated", + "message": "Групу оновлено", "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { @@ -1514,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ joined the group", + "message": "$name$ приєднався до групи", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ joined the group", + "message": "$names$ приєдналися до групи", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index 9c194999d..dcd2c9cc2 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -3,18 +3,10 @@ "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." @@ -32,13 +24,9 @@ "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": "&Help", + "message": "&Trợ giúp", "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": "Preferences…", - "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": "Hide", "description": "Application menu command to hide the window" @@ -56,7 +44,7 @@ "description": "Application menu command to close the application" }, "editMenuUndo": { - "message": "Undo", + "message": "Hoàn tác", "description": "Edit menu command to remove recently-typed text" }, "editMenuRedo": { @@ -68,7 +56,7 @@ "description": "Edit menu command to remove selected text and add it to clipboard" }, "editMenuCopy": { - "message": "Copy", + "message": "Sao chép", "description": "Edit menu command to add selected text to clipboard" }, "editMenuPaste": { @@ -80,11 +68,11 @@ "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { - "message": "Delete", + "message": "Xóa", "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Select All", + "message": "Chọn tất cả", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -135,10 +123,6 @@ "message": "Set Up with Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set Up as New Device", - "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", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "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": "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "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": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session Export.' You can also save a new copy of your data from the Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "Link this device to your phone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Đang cập nhật dữ liệu. Cần một chút thời gian...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "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": "Me", "description": "The label for yourself when shown in a group member list" @@ -256,21 +202,9 @@ "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "You left the group", + "message": "Bạn đã rời nhóm.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll to bottom of conversation", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Tin nhắn mới bên dưới", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Tin nhắn mới bên dưới", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 tin nhắn chưa đọc", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "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": "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,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": "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 Session.", "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": { @@ -354,11 +288,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": "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 Session.", "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": "Mã số an toàn với $name$ đã thay đổi. Điều này có thể là do ai đó đang tìm cách đánh chặn thông tin của bạn, hoặc $name$ đã chỉ vừa mới cài lại Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,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": "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 Session. You may wish to verify your saftey number with this contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -408,17 +342,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Đã rõ!", + "message": "Đã nhận được", "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": "Gửi", + "message": "Nộp", "description": "" }, - "acceptNewKey": { - "message": "Chấp nhận", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Đánh dấu như đã chứng thực", "description": "" @@ -455,10 +385,6 @@ "message": "Số-an-toàn mới", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Số-an-toàn của bạn với người (liên lạc) này đã thay đổi. Điều này có nghĩa rằng người nào đó đang xâm nhập vào liên lạc của bạn, hoặc đơn giản là người (liên lạc) này đã cài đặt lại Signal. Bạn muốn xác nhận số-an-toàn mới bên dưới.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -472,7 +398,7 @@ "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { - "message": "Documents", + "message": "Tài liệu", "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { @@ -480,7 +406,7 @@ "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": "Today", + "message": "Hôm nay", "description": "Section header in the media gallery" }, "yesterday": { @@ -488,25 +414,13 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "This Week", + "message": "Tuần này", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "This Month", + "message": "Tháng này", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Không hỗ trợ loại đính kèm. Bấm để lưu.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Click để lưu", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Tập tin không có tên", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Tin nhắn thoại", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -562,19 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Rất tiếc, các tập tin đã chọn vượt quá giới hạn kích thước của tin nhắn.", + "message": "Văn bản đính kèm vượt quá giới hạn kích cỡ cho loại tin nhắn mà bạn đang gửi.", "description": "" }, "unableToLoadAttachment": { - "message": "Unable to load selected attachment.", + "message": "Xin lỗi, có lỗi thiết đặt tập tin đính kèm của bạn.", "description": "" }, - "disconnected": { - "message": "Đã ngắt kết nối", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { - "message": "Đang kết nối", + "message": "Đang kết nối...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -607,10 +513,6 @@ "message": "Go to Release Notes", "description": "" }, - "goToForums": { - "message": "Go to Forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Go to Support Page", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Preferences", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Hide", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Tìm kiếm", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Chào mừng đến với Signal", - "description": "" - }, - "selectAContact": { - "message": "Chọn một liên hệ hoặc nhóm để bắt đầu chat.", + "message": "Chào mừng bạn đến với Session.", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "home", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -756,37 +630,23 @@ "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { - "message": "You", + "message": "Bạn", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Replying to $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": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "Allow Access", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Show Settings", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { - "message": "Audio", + "message": "Âm thanh", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" }, "video": { - "message": "Video", + "message": "Đoạn phim", "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video" }, "photo": { @@ -797,10 +657,6 @@ "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": "" @@ -809,20 +665,12 @@ "message": "Hủy", "description": "" }, - "failedToSend": { - "message": "Không thể gửi đến một số người nhận. Kiểm tra kết nối mạng của bạn.", - "description": "" - }, "error": { "message": "Lỗi", "description": "" }, - "messageDetail": { - "message": "Chi tiết tin nhắn", - "description": "" - }, "delete": { - "message": "Delete", + "message": "Xóa", "description": "" }, "deleteWarning": { @@ -830,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "xóa tin nhắn này", + "message": "Xóa tin nhắn", "description": "" }, "from": { - "message": "Từ", + "message": "Từ:", "description": "Label for the sender of a message" }, "to": { - "message": "to", + "message": "Đến:", "description": "Label for the receiver of a message" }, "sent": { @@ -854,25 +702,17 @@ "description": "Placeholder text in the message entry field" }, "groupMembers": { - "message": "Thành viên", - "description": "" - }, - "showMembers": { - "message": "Show members", + "message": "Thành viên trong nhóm", "description": "" }, "resetSession": { - "message": "Đăng nhập lại", + "message": "Tái thiết lập phiên bảo mật", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { "message": "View safety number", "description": "" }, - "viewAllMedia": { - "message": "View 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": "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.", "description": "", @@ -887,16 +727,8 @@ "message": "Bạn chưa trao đổi tin nhắn nào với liên hệ này. Số an toàn của bạn sẽ có sau tin nhắn đầu tiên.", "description": "" }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Retry Send", - "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": "Delete Message", + "message": "Xóa tin nhắn", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -939,10 +771,6 @@ "message": "Lưu", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "Chào mừng đến với Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Sự riêng tư là có thể. Signal khiến điều đó trở nên dễ dàng.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Link your phone to Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Settings", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Linked Devices", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Button", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { - "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "Device name", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choose this device's name", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finish linking phone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Syncing contacts and groups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kết nối đến máy chủ thất bại.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Rất tiếc, bạn có quá nhiều thiết bị đã được kết nối. Thử gỡ bỏ vài thiết bị.", - "description": "" - }, - "settings": { - "message": "Các cài đặt", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Chủ đề", - "description": "Header for theme settings" + "message": "Liên kết thiết bị mới", + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Clear Data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "This will clear all data in the application, removing all messages and saved account information.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Clear data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Delete all data?", - "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.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnecting and deleting all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Thông báo", "description": "Header for notification settings" @@ -1066,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Vô hiệu hóa thông báo", + "message": "Tạm im thông báo", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,11 +834,11 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Most recent from:", + "message": "Gần đây nhất từ: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { - "message": "From:", + "message": "Từ:", "description": "Displayed in notifications when setting is 'name only' and one message is waiting" }, "notificationMostRecent": { @@ -1102,23 +846,15 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Send failed", + "message": "Gửi thất bại", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Chi tiết", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ẩn chi tiết", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Tìm hiểu thêm về xác nhận các số-an-toàn.", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "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.", + "message": "Phiên bản này của Session 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" }, "upgrade": { @@ -1129,36 +865,8 @@ "message": "Tin nhắn đa phương tiện", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Số điện thoại chưa đăng ký", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Liên hệ", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Nhập tất cả liên hệ và nhóm của Signal từ thiết bị di động của bạn.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Lần nhập cuối cùng lúc", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Nhập ngay bây giờ", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Đăng nhập", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Nhập thất bại. Chắc chắn rằng máy tính và điện thoại của bạn đã kết nối internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { - "message": "hiện tại", + "message": "Bây giờ", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1169,50 +877,6 @@ "message": "1 giờ", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hr", - "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$ hr ago", - "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 ago", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "hiện tại", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "Tháng Ngày", "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'." @@ -1312,7 +976,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "Tắt", + "message": "tắt", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Phát thông báo nhạc hiệu", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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 new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Nhập số điện thoại để thêm một liên hệ", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Số không chính xác", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Relink Signal Desktop to your mobile device to continue messaging.", - "description": "" - }, - "unlinked": { - "message": "Đã bỏ liên kết", - "description": "" - }, - "relink": { - "message": "Tái liên kết", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1476,11 +1108,11 @@ "description": "" }, "autoUpdateLaterButtonLabel": { - "message": "Later", + "message": "Sau này", "description": "" }, "leftTheGroup": { - "message": "$name$ left the group", + "message": "$name$ đã rời khỏi nhóm.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Group name has been set to '$name$'", + "message": "Tên nhóm hiện giờ là '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1524,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ joined the group", + "message": "$name$ đã tham gia nhóm.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1164,206 @@ "example": "Alice, Bob" } } + }, + "unknown": { + "message": "Không rõ" + }, + "youMayWishToVerifyContact": { + "message": "Bạn có thể sẽ cần xác minh mã số an toàn với liên hệ này." + }, + "settingsHeader": { + "message": "Cài đặt" + }, + "continue": { + "message": "Tiếp tục" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Đã đạt tới giới hạn thiết bị" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Đã nhận được yêu cầu liên kết" + }, + "waitingForDeviceToRegister": { + "message": "Đang đợi thiết bị" + }, + "pairNewDevicePrompt": { + "message": "Quét mã QR hiển thị trên thiết bị để liên kết" + }, + "deviceUnpaired": { + "message": "Thiết bị của bạn đã được hủy liên kết thành công" + }, + "sendMessageLeftGroup": { + "message": "Bạn đã rời nhóm." + }, + "resend": { + "message": "Gửi lại" + }, + "clearAllData": { + "message": "Xóa tất cả dữ liệu" + }, + "deleteAccountWarning": { + "message": "Thao tác này sẽ xóa vĩnh viễn các tin nhắn, sessions, và danh bạ của bạn." + }, + "deleteContactConfirmation": { + "message": "Bạn có chắc chắn rằng bạn muốn xoá cuộc hội thoại này không?" + }, + "copy": { + "message": "Sao chép" + }, + "themeToggleTitle": { + "message": "Lợt" + }, + "successUnlinked": { + "message": "Thiết bị của bạn đã được ngắt liên kết thành công" + }, + "blockUser": { + "message": "Chặn" + }, + "unblockUser": { + "message": "Không chặn" + }, + "blockedSettingsTitle": { + "message": "Chặn các liên lạc" + }, + "leaveGroup": { + "message": "Rời nhóm" + }, + "leaveGroupConfirmation": { + "message": "Bạn có chắc chắn rằng bạn muốn rời nhóm này không?" + }, + "noContactsForGroup": { + "message": "Bạn chưa có danh bạ nào" + }, + "updateGroupDialogTitle": { + "message": "Cập nhật $name$..." + }, + "showRecoveryPhrase": { + "message": "Cụm từ khôi phục" + }, + "yourSessionID": { + "message": "Session ID của bạn" + }, + "recoveryPhraseSavePromptMain": { + "message": "Cụm từ khôi phục của bạn là chìa khoá chủ cho Session ID của bạn — bạn có thể sử dụng nó để khôi phục Session ID khi bị mất tiếp cận với thiết bị của bạn. Hãy lưu cụm từ khôi phục của bạn ở một nơi an toàn và không cung cấp cho bất kì ai." + }, + "copiedToClipboard": { + "message": "Sao chép vào bộ nhớ tạm" + }, + "unlock": { + "message": "Mở khóa" + }, + "connectToServerFail": { + "message": "Không thể tham gia nhóm" + }, + "connectingToServer": { + "message": "Đang kết nối..." + }, + "remove": { + "message": "Bỏ" + }, + "invalidSessionId": { + "message": "Session ID không hợp lệ" + }, + "emptyGroupNameError": { + "message": "Vui lòng nhập tên nhóm" + }, + "groupNamePlaceholder": { + "message": "Tên nhóm" + }, + "inviteContacts": { + "message": "Mời bạn bè" + }, + "yourUniqueSessionID": { + "message": "Bắt đầu với Session ID của bạn" + }, + "allUsersAreRandomly...": { + "message": "Session ID của bạn là địa chỉ duy nhất mà mọi người có thể dùng để liên lạc với bạn trên ứng dụng Session. Session ID của bạn được thiết kế đảm bảo tuyệt đối ẩn danh và riêng tư vì nó không liên kết với danh tính thật của bạn." + }, + "generateSessionID": { + "message": "Tạo Session ID" + }, + "recoveryPhrase": { + "message": "Cụm từ khôi phục" + }, + "enterRecoveryPhrase": { + "message": "Nhập cụm từ khôi phục của bạn." + }, + "enterDisplayName": { + "message": "Nhập một tên hiển thị" + }, + "enterSessionIDHere": { + "message": "Nhập Session ID của bạn" + }, + "continueYourSession": { + "message": "Tiếp tục Session của bạn" + }, + "linkDevice": { + "message": "Liên kết Thiết bị" + }, + "restoreUsingRecoveryPhrase": { + "message": "Khôi phục lại tài khoản của bạn" + }, + "newSession": { + "message": "Session mới" + }, + "enterSessionID": { + "message": "Nhập Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Nhập Session ID của người nhận" + }, + "usersCanShareTheir...": { + "message": "Người dùng có thể chia sẻ Session ID của mình bằng cách tới mục cài đặt tài khoản và chạm vào “Chia sẻ Session ID”, hoặc bằng cách chia sẻ mã QR của họ." + }, + "appearanceSettingsTitle": { + "message": "Diện mạo" + }, + "privacySettingsTitle": { + "message": "Riêng tư" + }, + "notificationsSettingsTitle": { + "message": "Thông báo" + }, + "devicesSettingsTitle": { + "message": "Các thiết bị đã liên kết" + }, + "recoveryPhraseEmpty": { + "message": "Nhập cụm từ khôi phục của bạn." + }, + "displayNameEmpty": { + "message": "Vui lòng chọn một tên hiển thị" + }, + "joinOpenGroup": { + "message": "Tham gia nhóm mở" + }, + "newClosedGroup": { + "message": "Nhóm kín mới" + }, + "createClosedGroupNamePrompt": { + "message": "Tên nhóm" + }, + "createClosedGroupPlaceholder": { + "message": "Nhập tên nhóm" + }, + "openGroupURL": { + "message": "URL của nhóm mở" + }, + "enterAnOpenGroupURL": { + "message": "Nhập URL của nhóm mở" + }, + "pairingDevice": { + "message": "Liên kết thiết bị" + }, + "invalidGroupNameTooShort": { + "message": "Vui lòng nhập tên nhóm" + }, + "invalidGroupNameTooLong": { + "message": "Vui lòng nhập một tên nhóm ngắn hơn" + }, + "pickClosedGroupMember": { + "message": "Vui lòng chọn ít nhất 2 thành viên trong nhóm" + }, + "closedGroupMaxSize": { + "message": "Một nhóm kín không thể có nhiều hơn 20 thành viên" } -} +} \ No newline at end of file diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json index 695575f2b..916c500e0 100644 --- a/_locales/zh_CN/messages.json +++ b/_locales/zh_CN/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "帮助(&H)", "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": "偏好设置...", - "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": "隐藏", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "退出 Signal", + "message": "退出 Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "使用导入的数据进行配置", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "配置为新设备", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "配置为独立设备", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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": "选择文件", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "加载您的数据", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "您已完成了导出步骤,被导出的联系人和消息在等着您给它们一个新家。请选择包含您 Signal 数据的文件夹。", + "message": "您已完成了导出步骤,被导出的联系人和消息在等着您给它们一个新家。请选择包含您 Session 数据的文件夹。", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "请确认您选对了包含已保存 Signal 数据 的文件夹,其名字一般以“Signal Export”开头。您还可以在 Chrome App 上保存一份新的数据。", + "message": "请确认您选对了包含已保存 Session 数据 的文件夹,其名字一般以“Session Export”开头。您还可以在 Chrome App 上保存一份新的数据。", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "开始使用 Signal Desktop", + "message": "开始使用 Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "将这个设备关联到您的手机", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "您已选的位置", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "更新数据库。这可能需要一点时间...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "加载消息。目前数目 $count$...", - "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": "我", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "你已经离开了群组", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "滚动到对话的底部", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "下面的新消息", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "下面的新消息", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1条未读消息", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "自上次验证以来,您与多位群组成员的安全码已发生改变。这可能意味着有人试图截取您的对话,或者只是联系人重新安装了 Signal。", + "message": "自上次验证以来,您与多位群组成员的安全码已发生改变。这可能意味着有人试图截取您的对话,或者只是联系人重新安装了 Session。", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "您与$name$的安全码自上次确认后已改变。这可能意味着有人正在尝试拦截您的通讯,或者$name$只是重装了 Signal。", + "message": "您与$name$的安全码自上次确认后已改变。这可能意味着有人正在尝试拦截您的通讯,或者$name$只是重装了 Session。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "您想验证的安全码已改变。请检查您与$name$的新安全码。切记,验证码改变意味着可能有人试图截取您的通讯,也可能只是$name$重新安装了 Signal。", + "message": "您想验证的安全码已改变。请检查您与$name$的新安全码。切记,验证码改变意味着可能有人试图截取您的通讯,也可能只是$name$重新安装了 Session。", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "您与多位群组成员的安全码已发生改变。这可能表示有人试图偷听您的对话,或者只是联系人他们重新安装了 Signal。", + "message": "您与多位群组成员的安全码已发生改变。这可能表示有人试图偷听您的对话,或者只是联系人他们重新安装了 Session。", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "您与$name$的安全码最近发生了变化。这可能意味着有人正在尝试拦截您的通讯,或者$name$只是重装了 Signal。", + "message": "您与$name$的安全码最近发生了变化。这可能意味着有人正在尝试拦截您的通讯,或者$name$只是重装了 Session。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "您与$name$的安全码已改变。这表示可能有人试图偷听您的对话,也可能只是$name$重新安装了 Signal。您可能要重新验证与联系人的安全码。", + "message": "您与$name$的安全码已改变。这表示可能有人试图偷听您的对话,也可能只是$name$重新安装了 Session。您可能要重新验证与联系人的安全码。", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "提交", "description": "" }, - "acceptNewKey": { - "message": "接受", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "标记为已确认", "description": "" @@ -455,10 +385,6 @@ "message": "新的安全代码", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "您的此联系人的安全代码已更改。这可能意味着有人试图拦截你的通信,或者这个联系人重新安装了Signal。您可能想验证以下新安全代码。", - "description": "" - }, "incomingError": { "message": "处理传入消息时出错", "description": "" @@ -495,18 +421,6 @@ "message": "本月", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "不支持的附件类型,点击保存。", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "单击保存", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "未命名的文件", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "语音消息", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "为了安全,不允许此附件类型", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "加载预览中...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "待发送的$domain$链接预览", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "$domain$的链接预览缩略图", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "无法加载选中的附件。", "description": "" }, - "disconnected": { - "message": "已断开连接", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "正在连接", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "前往发布说明", "description": "" }, - "goToForums": { - "message": "前往论坛", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "前往支持页面", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "反馈问题", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop偏好", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "关于 Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "语音", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "显示", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "隐藏", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "退出", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "桌面版Signal", - "description": "Tooltip for the tray icon" - }, "search": { "message": "搜索", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "欢迎来到Signal", "description": "" }, - "selectAContact": { - "message": "选择一个联系人或群组来开始聊天。", - "description": "" - }, "typingAlt": { "message": "这个对话中的“正在输入”提示", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "发送消息", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "家", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,28 +633,14 @@ "message": "您", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "回复 $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": "发送音频消息前,请先允许 Signal Desktop访问您的麦克风。", + "message": "发送音频消息前,请先允许 Session Desktop访问您的麦克风。", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { "message": "允许访问", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "打开设置", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "音频", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "取消", "description": "" }, - "failedToSend": { - "message": "无法发送给某些收件人,请检查您的网络连接。", - "description": "" - }, "error": { "message": "错误", "description": "" }, - "messageDetail": { - "message": "信息属性", - "description": "" - }, "delete": { "message": "删除", "description": "" @@ -857,10 +705,6 @@ "message": "群组成员", "description": "" }, - "showMembers": { - "message": "显示成员", - "description": "" - }, "resetSession": { "message": "重置会话", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "查看安全码", "description": "" }, - "viewAllMedia": { - "message": "查看所有媒体", - "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": "如果您想要确认与$name$端对端加密是否安全,请将以上数字和对方设备的数字进行比对。", "description": "", @@ -887,14 +727,6 @@ "message": "您还未与该联系人有任何通讯,您的安全代码将会在您对其发送第一条消息后显示。", "description": "" }, - "moreInfo": { - "message": "更多信息...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "重试发送", - "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": "删除消息", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "保存", "description": "" }, - "fileIconAlt": { - "message": "文件图标", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "“$title$”的表情图片", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "欢迎来到Signal桌面版", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Signal让隐私保护触手可及。", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "关联您的手机到 Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal 设置", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "已关联的设备", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "“+” 按键", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "关联新设备", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "设备名称", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "选择这个设备的名称", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "完成手机关联", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "正在同步联系人和群组", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "连接服务器失败", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "很抱歉,您已连接过多的设备,请删除一些然后重试。", - "description": "" - }, - "settings": { - "message": "设置", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "主题", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "权限", @@ -1029,34 +801,6 @@ "message": "启用输入框拼写检查", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "清空数据", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "这会清空程序中所有的数据,包括删除所有消息和账号信息。", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "清空数据", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "是否删除所有数据?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "您即将删除本应用所有账户信息,包括全部联系人和消息。您可以随时重新连接移动设备,但这不会恢复已删除的消息。", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "删除所有数据", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "断开连接并删除所有数据", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "提醒", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "发送失败", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "更多", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "隐藏", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "了解更多有关安全代码的信息", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "附件信息", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "号码未注册", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "联系人", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "从您的移动设备导入所有Signal的群组和联系人。", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "最后一次导入于", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "已导入", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "导入中...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "导入失败,确保您的电脑和手机已连网。", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "现在", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1小时", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$小时", - "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$小时前", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$分钟", - "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$分钟前", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "现在", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "播放语音提醒", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "安全码已改变", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "亮色", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "开始新会话...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "键入电话号码来添加联系人", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "无效的号码", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "重新链接桌面版Signal到您的移动设备来继续。", - "description": "" - }, - "unlinked": { - "message": "未连接", - "description": "" - }, - "relink": { - "message": "重新连接", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session 有可用更新", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json index b0c5e69b4..44656abfe 100644 --- a/_locales/zh_TW/messages.json +++ b/_locales/zh_TW/messages.json @@ -3,18 +3,10 @@ "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." @@ -35,10 +27,6 @@ "message": "協助(&H)", "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": "偏好設定…", - "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": "隱藏", "description": "Application menu command to hide the window" @@ -52,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "關閉 Signal", + "message": "關閉 Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -135,10 +123,6 @@ "message": "設定匯入", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "設定新裝置", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "設定為獨立的裝置", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,36 +145,16 @@ } } }, - "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": "選擇檔案", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "載入你的資料", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "您剛完成匯出流程,您的聯絡人與訊息正在電腦上耐心等待。選擇包含您儲存的 Signal 資料的資料夾。", + "message": "您剛完成匯出流程,您的聯絡人與訊息正在電腦上耐心等待。選擇包含您儲存的 Session 資料的資料夾。", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -206,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": " 確認您選取了存放 Signal 資料的正確目錄夾,它的名稱應是以 'Signal Export.' 為前綴。您也可以自 Chrome App 取得自己的資料複本。", + "message": " 確認您選取了存放 Session 資料的正確目錄夾,它的名稱應是以 'Session Export.' 為前綴。您也可以自 Chrome App 取得自己的資料複本。", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -222,31 +186,13 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "開始使用 Signal Desktop", + "message": "開始使用 Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { "message": "此裝置與您的手機連結", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "你已選擇的位置", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "正在升級資料庫。這也許會花一些時間...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "正在載入訊息中。目前有 $count$ 則...", - "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": "我", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "你已離開此群組", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "捲動至底下對話", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "底下有一則新訊息", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "底下有新訊息", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 則未讀訊息", "description": "Text for unread message separator, just one message" @@ -330,11 +264,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": "你與這個多個群組成員的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為他們重新安裝 Signal。", + "message": "你與這個多個群組成員的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為他們重新安裝 Session。", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "自上次驗證後,你與 $name$ 的安全碼已經產生變動。這有可能是有不明人士試圖攔截您的通訊,或是,只因為 $name$ 重新安裝 Signal。", + "message": "自上次驗證後,你與 $name$ 的安全碼已經產生變動。這有可能是有不明人士試圖攔截您的通訊,或是,只因為 $name$ 重新安裝 Session。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -344,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "你試著驗證的安全已經改變,請檢視你與 $name$ 的新安全碼。記得,這個變動可能是有不明人士試圖攔截你的通訊,或是,只因為 $name$ 重新安裝 Signal。", + "message": "你試著驗證的安全已經改變,請檢視你與 $name$ 的新安全碼。記得,這個變動可能是有不明人士試圖攔截你的通訊,或是,只因為 $name$ 重新安裝 Session。", "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": { @@ -354,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "你與多個群組成員的安全碼在最近已經有了變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為他們重新安裝 Signal。", + "message": "你與多個群組成員的安全碼在最近已經有了變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為他們重新安裝 Session。", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "你與 $name$ 的安全碼在最近已經有了變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為$name$ 重新安裝 Signal。", + "message": "你與 $name$ 的安全碼在最近已經有了變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為$name$ 重新安裝 Session。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -368,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "你與這 $name$ 的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為 $name$ 重新安裝 Signal。你也許希望驗證你與聯絡人的安全碼。", + "message": "你與這 $name$ 的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為 $name$ 重新安裝 Session。你也許希望驗證你與聯絡人的安全碼。", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -415,10 +349,6 @@ "message": "送出", "description": "" }, - "acceptNewKey": { - "message": "接受", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "標記為已驗證", "description": "" @@ -455,10 +385,6 @@ "message": "新的安全碼", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "你與這個聯絡人的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為這個聯絡人重新安裝 Signal。你能驗證下方新的安全碼。", - "description": "" - }, "incomingError": { "message": "在處理來訊時出現錯誤", "description": "" @@ -495,18 +421,6 @@ "message": "本月", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "不支援的附加檔案類型。點擊儲存。", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "點擊儲存", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "未命名的檔案", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "語音訊息", "description": "Name for a voice message attachment" @@ -515,13 +429,9 @@ "message": "因安全考量無法傳送此類附件\n", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "讀取預覽中...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "$domain$ 的草稿縮圖連結預覽", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -531,7 +441,7 @@ }, "previewThumbnail": { "message": "$domain$ 的縮圖連結預覽", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -569,10 +479,6 @@ "message": "無法上傳所選附件。", "description": "" }, - "disconnected": { - "message": "已斷線", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "連線中", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "前往發行紀錄", "description": "" }, - "goToForums": { - "message": "前往論壇", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "前往支援頁面", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "回報問題", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop設定", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "關於 Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "語音", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "顯示", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "隱藏", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "離開", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "搜尋", "description": "Placeholder text in the search input" @@ -674,11 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "歡迎來到 Signal", - "description": "" - }, - "selectAContact": { - "message": "選擇一個聯絡人或群組開始聊天。", + "message": "歡迎來到 Session", "description": "" }, "typingAlt": { @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "傳送訊息", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "主頁", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "你", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "正在回覆給 $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": "要傳送語音訊息,須授權 Siganl 桌面版可以使用您設備的麥克風。 ", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "允許存取", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "顯示設定", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "聲音", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "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": "" @@ -809,18 +665,10 @@ "message": "取消", "description": "" }, - "failedToSend": { - "message": "無法傳送給一些接收者。檢查你的網路連線。", - "description": "" - }, "error": { "message": "錯誤", "description": "" }, - "messageDetail": { - "message": "詳細訊息", - "description": "" - }, "delete": { "message": "刪除", "description": "" @@ -857,10 +705,6 @@ "message": "群組成員", "description": "" }, - "showMembers": { - "message": "顯示成員", - "description": "" - }, "resetSession": { "message": "重設對話", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "檢視安全碼", "description": "" }, - "viewAllMedia": { - "message": "檢視全部媒體", - "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": "如果你想要你與 $name$ 驗證端對端加密的安全性,比較上方的號碼與他們裝置上的號碼。", "description": "", @@ -887,14 +727,6 @@ "message": "你尚未與這個聯絡人交換訊息。你與他們的安全碼將會在初次送出訊息後生效。", "description": "" }, - "moreInfo": { - "message": "更多資訊...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "重新傳送", - "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": "刪除訊息", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "儲存", "description": "" }, - "fileIconAlt": { - "message": "檔案圖示", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": " '$title$' 的表情符號圖片", "description": "Used in the alt tag of all emoji images", @@ -953,65 +781,9 @@ } } }, - "installWelcome": { - "message": "歡迎來到 Signal Desktop版", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "隱私是有可能的。Signal 讓隱私更簡單。", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "您的手機與 Signal Desktop連結", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal 設定", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "已連結的裝置", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "「+」按鈕", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "連結新裝置", - "description": "The menu option shown in Signal iOS to add a new linked device" - }, - "deviceName": { - "message": "裝置名稱", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "選擇此裝置的名稱", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "完成連結手機", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "正在同步聯絡人與群組", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "無法連線到伺服器。", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "抱歉,你已經有太多連結的裝置。試著移除一些。", - "description": "" - }, - "settings": { - "message": "設定", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "主題", - "description": "Header for theme settings" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "許可", @@ -1029,34 +801,6 @@ "message": "在訊息撰寫時啟用文字輸入的拼字檢查", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "清除資料", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "這會清除所有應用程式的資料,移除所有訊息及已儲存的帳號資訊。", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "清除資料", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "刪除所有資料?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "你即將刪除所有應用程式已儲存的帳號資訊,包含所有聯絡人及訊息。你通常能再與行動裝置連結,但無法還原被刪除的訊息。", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "刪除所有資料", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "離線中並刪除所有資料", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "通知", "description": "Header for notification settings" @@ -1105,20 +849,12 @@ "message": "傳送失敗", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "細節", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "隱藏細節", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "了解更多關於驗證安全碼", "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal Desktop版的版本已經過期。請更新到最新版來傳送訊息。", + "message": "Session Desktop版的版本已經過期。請更新到最新版來傳送訊息。", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1129,34 +865,6 @@ "message": "媒體訊息", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "號碼尚未註冊", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "聯絡人", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "從你的行動裝置,匯入 Signal 群組和聯絡人。", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "上一次匯入在", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "現在匯入", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "正在匯入...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "匯入失敗。確認你的電腦與電話都連線到網路。", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "現在", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 小時", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$小時", - "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$ 小時之前", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ 分鐘", - "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$ 分鐘前", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "現在", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "播放通知音效", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "安全號碼已變更", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "亮色系", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "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": "開始新的對話...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "輸入電話號碼來加入聯絡人", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "無效號碼", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "重新連結 Signal Desktop到你的行動裝置來持續發送訊息。", - "description": "" - }, - "unlinked": { - "message": "未連結的", - "description": "" - }, - "relink": { - "message": "重新連結", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session 可用的更新", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/app/menu.js b/app/menu.js index 840bc9214..60aa1f49f 100644 --- a/app/menu.js +++ b/app/menu.js @@ -11,7 +11,6 @@ exports.createTemplate = (options, messages) => { openReleaseNotes, openSupportPage, platform, - setupAsNewDevice, setupAsStandalone, setupWithImport, showAbout, @@ -143,7 +142,7 @@ exports.createTemplate = (options, messages) => { type: 'separator', }, { - label: messages.aboutSignalDesktop.message, + label: messages.about.message, click: showAbout, }, ], @@ -164,10 +163,6 @@ exports.createTemplate = (options, messages) => { fileMenu.submenu.unshift({ type: 'separator', }); - fileMenu.submenu.unshift({ - label: messages.menuSetupAsNewDevice.message, - click: setupAsNewDevice, - }); fileMenu.submenu.unshift({ label: messages.menuSetupWithImport.message, click: setupWithImport, @@ -184,7 +179,6 @@ exports.createTemplate = (options, messages) => { function updateForMac(template, messages, options) { const { includeSetup, - setupAsNewDevice, setupAsStandalone, setupWithImport, showAbout, @@ -208,10 +202,6 @@ function updateForMac(template, messages, options) { label: messages.menuSetupWithImport.message, click: setupWithImport, }, - { - label: messages.menuSetupAsNewDevice.message, - click: setupAsNewDevice, - }, ], }; @@ -227,10 +217,10 @@ function updateForMac(template, messages, options) { // Add the OSX-specific Signal Desktop menu at the far left template.unshift({ - label: messages.lokiMessenger.message, + label: messages.sessionMessenger.message, submenu: [ { - label: messages.aboutSignalDesktop.message, + label: messages.about.message, click: showAbout, }, { diff --git a/app/sql.js b/app/sql.js index 301956921..7b5fa4363 100644 --- a/app/sql.js +++ b/app/sql.js @@ -110,7 +110,6 @@ module.exports = { getPublicConversationsByServer, getPubkeysInPublicConversation, getAllConversationIds, - getAllPrivateConversations, getAllGroupsInvolvingId, removeAllConversations, removeAllPrivateConversations, @@ -130,6 +129,7 @@ module.exports = { removeMessage, getUnreadByConversation, getMessageBySender, + getMessagesBySender, getMessageIdsFromServerIds, getMessageById, getAllMessages, @@ -171,6 +171,7 @@ module.exports = { getSenderKeys, createOrUpdateSenderKeys, + removeAllClosedGroupRatchets, }; function generateUUID() { @@ -811,6 +812,8 @@ const LOKI_SCHEMA_VERSIONS = [ updateToLokiSchemaVersion5, updateToLokiSchemaVersion6, updateToLokiSchemaVersion7, + updateToLokiSchemaVersion8, + updateToLokiSchemaVersion9, ]; async function updateToLokiSchemaVersion1(currentVersion, instance) { @@ -824,7 +827,6 @@ async function updateToLokiSchemaVersion1(currentVersion, instance) { `ALTER TABLE messages ADD COLUMN serverId INTEGER;` ); - await instance.run( `CREATE TABLE servers( serverUrl STRING PRIMARY KEY ASC, @@ -922,6 +924,12 @@ async function createOrUpdateSenderKeys(data) { ); } +async function removeAllClosedGroupRatchets(groupId) { + await db.run(`DELETE FROM ${SENDER_KEYS_TABLE} WHERE groupId = $groupId;`, { + $groupId: groupId, + }); +} + async function updateToLokiSchemaVersion4(currentVersion, instance) { if (currentVersion >= 4) { return; @@ -1052,6 +1060,49 @@ async function updateToLokiSchemaVersion7(currentVersion, instance) { console.log('updateToLokiSchemaVersion7: success!'); } +async function updateToLokiSchemaVersion8(currentVersion, instance) { + if (currentVersion >= 8) { + return; + } + console.log('updateToLokiSchemaVersion8: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await instance.run( + `ALTER TABLE messages + ADD COLUMN serverTimestamp INTEGER;` + ); + + await instance.run( + `INSERT INTO loki_schema ( + version + ) values ( + 8 + );` + ); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToLokiSchemaVersion8: success!'); +} + +async function updateToLokiSchemaVersion9(currentVersion, instance) { + if (currentVersion >= 9) { + return; + } + console.log('updateToLokiSchemaVersion9: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await removePrefixFromGroupConversations(instance); + + await instance.run( + `INSERT INTO loki_schema ( + version + ) values ( + 9 + );` + ); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToLokiSchemaVersion9: success!'); +} + async function updateLokiSchema(instance) { const result = await instance.get( "SELECT name FROM sqlite_master WHERE type = 'table' AND name='loki_schema';" @@ -1176,7 +1227,7 @@ async function initialize({ configDir, key, messages, passwordAttempt }) { const buttonIndex = dialog.showMessageBox({ buttons: [ messages.copyErrorAndQuit.message, - messages.deleteAndRestart.message, + messages.clearAllData.message, ], defaultId: 0, detail: redactAll(error.stack), @@ -1948,16 +1999,6 @@ async function getAllConversationIds() { return map(rows, row => row.id); } -async function getAllPrivateConversations() { - const rows = await db.all( - `SELECT json FROM ${CONVERSATIONS_TABLE} WHERE - type = 'private' - ORDER BY id ASC;` - ); - - return map(rows, row => jsonToObject(row.json)); -} - async function getAllPublicConversations() { const rows = await db.all( `SELECT json FROM conversations WHERE @@ -2103,6 +2144,7 @@ async function saveMessage(data, { forceSave } = {}) { hasVisualMediaAttachments, id, serverId, + serverTimestamp, // eslint-disable-next-line camelcase received_at, schemaVersion, @@ -2122,6 +2164,7 @@ async function saveMessage(data, { forceSave } = {}) { $json: objectToJSON(data), $serverId: serverId, + $serverTimestamp: serverTimestamp, $body: body, $conversationId: conversationId, $expirationStartTimestamp: expirationStartTimestamp, @@ -2145,6 +2188,7 @@ async function saveMessage(data, { forceSave } = {}) { `UPDATE messages SET json = $json, serverId = $serverId, + serverTimestamp = $serverTimestamp, body = $body, conversationId = $conversationId, expirationStartTimestamp = $expirationStartTimestamp, @@ -2180,6 +2224,7 @@ async function saveMessage(data, { forceSave } = {}) { json, serverId, + serverTimestamp, body, conversationId, expirationStartTimestamp, @@ -2201,6 +2246,7 @@ async function saveMessage(data, { forceSave } = {}) { $json, $serverId, + $serverTimestamp, $body, $conversationId, $expirationStartTimestamp, @@ -2394,6 +2440,20 @@ async function getMessageBySender({ source, sourceDevice, sent_at }) { return map(rows, row => jsonToObject(row.json)); } +async function getMessagesBySender({ source, sourceDevice }) { + const rows = await db.all( + `SELECT json FROM messages WHERE + source = $source AND + sourceDevice = $sourceDevice`, + { + $source: source, + $sourceDevice: sourceDevice, + } + ); + + return map(rows, row => jsonToObject(row.json)); +} + async function getAllUnsentMessages() { const rows = await db.all(` SELECT json FROM messages WHERE @@ -2430,7 +2490,7 @@ async function getMessagesByConversation( conversationId = $conversationId AND received_at < $received_at AND type LIKE $type - ORDER BY sent_at DESC + ORDER BY serverTimestamp DESC, serverId DESC, sent_at DESC LIMIT $limit; `, { @@ -3007,3 +3067,82 @@ async function removeKnownAttachments(allAttachments) { return Object.keys(lookup); } + +async function getMessagesCountByConversation(instance, conversationId) { + const row = await instance.get( + 'SELECT count(*) from messages WHERE conversationId = $conversationId;', + { $conversationId: conversationId } + ); + + return row ? row['count(*)'] : 0; +} + +async function removePrefixFromGroupConversations(instance) { + const rows = await instance.all( + `SELECT json FROM conversations WHERE + type = 'group' AND + id LIKE '__textsecure_group__!%';` + ); + + const objs = map(rows, row => jsonToObject(row.json)); + + const conversationIdRows = await instance.all( + `SELECT id FROM ${CONVERSATIONS_TABLE} ORDER BY id ASC;` + ); + const allOldConversationIds = map(conversationIdRows, row => row.id); + + await Promise.all( + objs.map(async o => { + const oldId = o.id; + const newId = oldId.replace('__textsecure_group__!', ''); + console.log(`migrating conversation, ${oldId} to ${newId}`); + + if (allOldConversationIds.includes(newId)) { + console.log( + 'Found a duplicate conversation after prefix removing. We need to take care of it' + ); + // We have another conversation with the same future name. + // We decided to keep only the conversation with the higher number of messages + const countMessagesOld = await getMessagesCountByConversation( + instance, + oldId, + { limit: Number.MAX_VALUE } + ); + const countMessagesNew = await getMessagesCountByConversation( + instance, + newId, + { limit: Number.MAX_VALUE } + ); + + console.log( + `countMessagesOld: ${countMessagesOld}, countMessagesNew: ${countMessagesNew}` + ); + + const deleteId = countMessagesOld > countMessagesNew ? newId : oldId; + await instance.run( + `DELETE FROM ${CONVERSATIONS_TABLE} WHERE id = $id;`, + { + $id: deleteId, + } + ); + } + + const morphedObject = { + ...o, + id: newId, + }; + + await instance.run( + `UPDATE ${CONVERSATIONS_TABLE} SET + id = $newId, + json = $json + WHERE id = $oldId;`, + { + $newId: newId, + $json: objectToJSON(morphedObject), + $oldId: oldId, + } + ); + }) + ); +} diff --git a/app/tray_icon.js b/app/tray_icon.js index e05781723..7dfdf1fd2 100644 --- a/app/tray_icon.js +++ b/app/tray_icon.js @@ -65,12 +65,13 @@ function createTrayIcon(getMainWindow, messages) { trayContextMenu = Menu.buildFromTemplate([ { id: 'toggleWindowVisibility', - label: messages[mainWindow.isVisible() ? 'hide' : 'show'].message, + label: + messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'].message, click: tray.toggleWindowVisibility, }, { id: 'quit', - label: messages.quit.message, + label: messages.appMenuQuit.message, click: app.quit.bind(app), }, ]); @@ -97,7 +98,7 @@ function createTrayIcon(getMainWindow, messages) { tray.on('click', tray.showWindow); - tray.setToolTip(messages.lokiMessenger.message); + tray.setToolTip(messages.sessionMessenger.message); tray.updateContextMenu(); return tray; diff --git a/background.d.ts b/background.d.ts new file mode 100644 index 000000000..186854e5c --- /dev/null +++ b/background.d.ts @@ -0,0 +1,14 @@ +export interface ConfirmationDialogParams { + title?: string; + message: string; + messageSub?: string; + resolve?: any; + reject?: any; + okText?: string; + okTheme?: string; + closeTheme?: string; + cancelText?: string; + hideCancel?: boolean; + sessionIcon?: SessionIconType; + iconSize?: SessionIconSize; +} diff --git a/background.html b/background.html index 605976ea9..f9b14827d 100644 --- a/background.html +++ b/background.html @@ -28,16 +28,12 @@ --> - - - - - - @@ -455,14 +314,10 @@ - - - - @@ -470,7 +325,6 @@ - @@ -483,8 +337,9 @@
-
- +
diff --git a/background_test.html b/background_test.html index c891c7238..686ccaf65 100644 --- a/background_test.html +++ b/background_test.html @@ -28,14 +28,9 @@ --> - - @@ -49,8 +44,9 @@
-
- +
@@ -94,9 +90,6 @@
-
-
-
- - - - - - @@ -455,14 +317,10 @@ - - - - @@ -470,7 +328,6 @@ - @@ -483,8 +340,9 @@
-
- +
diff --git a/images/group_default.png b/images/group_default.png deleted file mode 100644 index 6b503e9ff..000000000 Binary files a/images/group_default.png and /dev/null differ diff --git a/images/profile-group.svg b/images/profile-group.svg deleted file mode 100644 index a6c9788bc..000000000 --- a/images/profile-group.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - Group/group-28 - Created with Sketch. - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/images/profile-individual.svg b/images/profile-individual.svg deleted file mode 100644 index f28b9ea45..000000000 --- a/images/profile-individual.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - Profile/profile-28 - Created with Sketch. - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/images/session/full-logo.svg b/images/session/full-logo.svg deleted file mode 100644 index 01fb1cd36..000000000 --- a/images/session/full-logo.svg +++ /dev/null @@ -1,64 +0,0 @@ - -image/svg+xml \ No newline at end of file diff --git a/images/session/session-text.svg b/images/session/session-text.svg new file mode 100644 index 000000000..0d47d11c0 --- /dev/null +++ b/images/session/session-text.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html index 2d781b911..305e4e8c1 100644 --- a/index.html +++ b/index.html @@ -13,8 +13,9 @@
-
- +
diff --git a/integration_test/integration_test.js b/integration_test/integration_test.js deleted file mode 100644 index e37cac9ae..000000000 --- a/integration_test/integration_test.js +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable more/no-then */ -/* eslint-disable global-require */ -/* eslint-disable import/no-extraneous-dependencies */ - -const { before } = require('mocha'); -const common = require('./common'); - -require('./registration_test'); -require('./open_group_test'); -require('./add_friends_test'); -require('./link_device_test'); -require('./closed_group_test'); -require('./message_functions_test'); -require('./settings_test'); -require('./message_sync_test'); -require('./sender_keys_test'); - -before(async () => { - // start the app once before all tests to get the platform-dependent - // path of user data and store it to common.USER_DATA_ROOT_FOLDER - const app1 = await common.startApp(); - common.USER_DATA_ROOT_FOLDER = await app1.electron.remote.app.getPath( - 'appData' - ); - await common.stopApp(app1); -}); diff --git a/integration_test/link_device_test.js b/integration_test/link_device_test.js deleted file mode 100644 index 6ccbd14f1..000000000 --- a/integration_test/link_device_test.js +++ /dev/null @@ -1,70 +0,0 @@ -/* eslint-disable prefer-destructuring */ -/* eslint-disable more/no-then */ -/* eslint-disable func-names */ -/* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); -const common = require('./common'); - -describe('Link Device', function() { - let app; - let app2; - this.timeout(60000); - this.slow(15000); - - beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); - - const app1Props = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, - }; - - const app2Props = {}; - - [app, app2] = await Promise.all([ - common.startAndStub(app1Props), - common.startAndStubN(app2Props, 2), - ]); - }); - - afterEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); - }); - - it('linkDevice: link two desktop devices', async () => { - await common.linkApp2ToApp(app, app2, common.TEST_PUBKEY1); - }); - - it('linkDevice: unlink two devices', async () => { - await common.linkApp2ToApp(app, app2, common.TEST_PUBKEY1); - await common.timeout(1000); - await common.triggerUnlinkApp2FromApp(app, app2); - }); - - it('linkDevice:sync no groups, closed group, nor open groups', async () => { - await common.linkApp2ToApp(app, app2, common.TEST_PUBKEY1); - await common.timeout(10000); - - // get logs at this stage (getRenderProcessLogs() clears the app logs) - const secondaryRenderLogs = await app2.client.getRenderProcessLogs(); - // pairing request message sent from secondary to primary pubkey - await common.logsContains( - secondaryRenderLogs, - `Sending pairing-request:pairing-request message to ${common.TEST_PUBKEY1}` - ); - - const primaryRenderLogs = await app.client.getRenderProcessLogs(); - // primary grant pairing request - await common.logsContains( - primaryRenderLogs, - 'Sending pairing-request:pairing-request message to OUR SECONDARY PUBKEY' - ); - - // no friends, no closed groups, no open groups. we should see those message sync in the log - await common.logsContains(primaryRenderLogs, 'No closed group to sync.', 1); - await common.logsContains(primaryRenderLogs, 'No open groups to sync', 1); - await common.logsContains(primaryRenderLogs, 'No contacts to sync.', 1); - }); -}); diff --git a/js/background.js b/js/background.js index 78972d5dd..7922755cd 100644 --- a/js/background.js +++ b/js/background.js @@ -73,7 +73,6 @@ 'folder-outline.svg', 'forward.svg', 'gear.svg', - 'group_default.png', 'hourglass_empty.svg', 'hourglass_full.svg', 'icon_1024.png', @@ -368,7 +367,7 @@ // These make key operations available to IPC handlers created in preload.js window.Events = { - getThemeSetting: () => 'dark', // storage.get('theme-setting', 'dark') + getThemeSetting: () => storage.get('theme-setting', 'light'), setThemeSetting: value => { storage.put('theme-setting', value); onChangeTheme(); @@ -532,13 +531,6 @@ } ); - Whisper.events.on('setupAsNewDevice', () => { - const { appView } = window.owsDesktopApp; - if (appView) { - appView.openInstaller(); - } - }); - Whisper.events.on('setupAsStandalone', () => { const { appView } = window.owsDesktopApp; if (appView) { @@ -557,6 +549,13 @@ window.dispatchEvent(new Event('storage_ready')); window.log.info('Cleanup: starting...'); + window.getOurDisplayName = () => { + const ourNumber = window.storage.get('primaryDevicePubKey'); + const conversation = ConversationController.get(ourNumber, 'private'); + const profile = conversation.getLokiProfile(); + return profile && profile.displayName; + }; + const results = await Promise.all([ window.Signal.Data.getOutgoingWithoutExpiresAt({ MessageCollection: Whisper.MessageCollection, @@ -665,11 +664,6 @@ Whisper.events.on('reconnectTimer', () => { appView.inboxView.networkStatusView.setSocketReconnectInterval(60000); }); - Whisper.events.on('contactsync', () => { - if (appView.installView) { - appView.openInbox(); - } - }); window.addEventListener('focus', () => Whisper.Notifications.clear()); window.addEventListener('unload', () => Whisper.Notifications.fastClear()); @@ -693,15 +687,16 @@ closeTheme: params.closeTheme || undefined, cancelText: params.cancelText || undefined, hideCancel: params.hideCancel || false, - centeredText: params.centeredText || false, + sessionIcon: params.sessionIcon || undefined, + iconSize: params.iconSize || undefined, }); confirmDialog.render(); }; - window.showQRDialog = window.owsDesktopApp.appView.showQRDialog; window.showSeedDialog = window.owsDesktopApp.appView.showSeedDialog; window.showPasswordDialog = window.owsDesktopApp.appView.showPasswordDialog; + window.showEditProfileDialog = async callback => { const ourNumber = window.storage.get('primaryDevicePubKey'); const conversation = await ConversationController.getOrCreateAndWait( @@ -735,7 +730,6 @@ profileName: displayName, pubkey: ourNumber, avatarPath, - avatarColor: conversation.getColor(), onOk: async (newName, avatar) => { let newAvatarPath = ''; let url = null; @@ -997,22 +991,21 @@ return; } - const serverAPI = await window.lokiPublicChatAPI.findOrCreateServer( - sslServerUrl - ); - if (!serverAPI) { - window.log.warn(`Could not connect to ${serverAddress}`); - return; - } - const conversation = await ConversationController.getOrCreateAndWait( conversationId, 'group' ); - - serverAPI.findOrCreateChannel(channelId, conversationId); await conversation.setPublicSource(sslServerUrl, channelId); + const channelAPI = await window.lokiPublicChatAPI.findOrCreateChannel( + sslServerUrl, + channelId, + conversationId + ); + if (!channelAPI) { + window.log.warn(`Could not connect to ${serverAddress}`); + return; + } appView.openConversation(conversationId, {}); } ); @@ -1069,7 +1062,6 @@ profileName: displayName, pubkey: userPubKey, avatarPath, - avatarColor: conversation.getColor(), isRss: conversation.isRss(), onStartConversation: () => { Whisper.events.trigger('showConversation', userPubKey); @@ -1098,12 +1090,6 @@ } }); - Whisper.events.on('showSessionRestoreConfirmation', options => { - if (appView) { - appView.showSessionRestoreConfirmation(options); - } - }); - Whisper.events.on('showNicknameDialog', options => { if (appView) { appView.showNicknameDialog(options); @@ -1116,13 +1102,6 @@ } }); - Whisper.events.on('showQRDialog', async () => { - if (appView) { - const ourNumber = textsecure.storage.user.getNumber(); - appView.showQRDialog(ourNumber); - } - }); - Whisper.events.on('showDevicePairingDialog', async (options = {}) => { if (appView) { appView.showDevicePairingDialog(options); @@ -1146,10 +1125,15 @@ Whisper.events.on( 'publicMessageSent', - ({ pubKey, timestamp, serverId }) => { + ({ pubKey, timestamp, serverId, serverTimestamp }) => { try { const conversation = ConversationController.get(pubKey); - conversation.onPublicMessageSent(pubKey, timestamp, serverId); + conversation.onPublicMessageSent( + pubKey, + timestamp, + serverId, + serverTimestamp + ); } catch (e) { window.log.error('Error setting public on message'); } @@ -1351,7 +1335,7 @@ messageReceiver = new textsecure.MessageReceiver(mySignalingKey, options); messageReceiver.addEventListener( 'message', - window.NewReceiver.handleMessageEvent + window.DataMessageReceiver.handleMessageEvent ); window.textsecure.messaging = new textsecure.MessageSender(); return; @@ -1362,11 +1346,11 @@ messageReceiver = new textsecure.MessageReceiver(mySignalingKey, options); messageReceiver.addEventListener( 'message', - window.NewReceiver.handleMessageEvent + window.DataMessageReceiver.handleMessageEvent ); messageReceiver.addEventListener( 'sent', - window.NewReceiver.handleMessageEvent + window.DataMessageReceiver.handleMessageEvent ); messageReceiver.addEventListener('empty', onEmpty); messageReceiver.addEventListener('reconnect', onReconnect); diff --git a/js/conversation_controller.js b/js/conversation_controller.js index 93099767a..58f6beae2 100644 --- a/js/conversation_controller.js +++ b/js/conversation_controller.js @@ -1,4 +1,4 @@ -/* global _, Whisper, Backbone, storage, textsecure, libsignal, log */ +/* global Whisper, Backbone, textsecure, libsignal, log */ /* eslint-disable more/no-then */ @@ -15,10 +15,6 @@ this.listenTo(conversations, 'reset', () => this.reset([])); this.listenTo(conversations, 'remove', this.remove); - this.on( - 'add remove change:unreadCount', - _.debounce(this.updateUnreadCount.bind(this), 1000) - ); this.startPruning(); }, addActive(model) { @@ -29,23 +25,6 @@ this.remove(model); } }, - updateUnreadCount() { - const newUnreadCount = _.reduce( - this.map(m => m.get('unreadCount')), - (item, memo) => item + memo, - 0 - ); - storage.put('unreadCount', newUnreadCount); - - if (newUnreadCount > 0) { - window.setBadgeCount(newUnreadCount); - window.document.title = `${window.getTitle()} (${newUnreadCount})`; - } else { - window.setBadgeCount(0); - window.document.title = window.getTitle(); - } - window.updateTrayIcon(newUnreadCount); - }, startPruning() { const halfHour = 30 * 60 * 1000; this.interval = setInterval(() => { diff --git a/js/models/conversations.d.ts b/js/models/conversations.d.ts index 0ab5d6c0b..f8ae37c73 100644 --- a/js/models/conversations.d.ts +++ b/js/models/conversations.d.ts @@ -16,6 +16,8 @@ interface ConversationAttributes { timestamp: number; // timestamp of what? groupAdmins?: Array; isKickedFromGroup?: boolean; + avatarPath?: string; + isMe?: boolean; } export interface ConversationModel diff --git a/js/models/conversations.js b/js/models/conversations.js index c545d63f7..b9e1e9202 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -32,7 +32,6 @@ UNRESTRICTED: 3, }; - const { Util } = window.Signal; const { Conversation, Contact, @@ -540,14 +539,13 @@ await Promise.all(messages.map(m => m.setCalculatingPoW())); }, - async onPublicMessageSent(pubKey, timestamp, serverId) { + async onPublicMessageSent(pubKey, timestamp, serverId, serverTimestamp) { const messages = this._getMessagesWithTimestamp(pubKey, timestamp); - await Promise.all( - messages.map(message => [ - message.setIsPublic(true), - message.setServerId(serverId), - ]) - ); + if (messages && messages.length === 1) { + await messages[0].setIsPublic(true); + await messages[0].setServerId(serverId); + await messages[0].setServerTimestamp(serverTimestamp); + } }, async onNewMessage(message) { @@ -577,7 +575,6 @@ getProps() { const { format } = PhoneNumber; const regionCode = storage.get('regionCode'); - const color = this.getColor(); const typingKeys = Object.keys(this.contactTypingTimers || {}); const result = { @@ -585,7 +582,6 @@ isArchived: this.get('isArchived'), activeAt: this.get('active_at'), avatarPath: this.getAvatarPath(), - color, type: this.isPrivate() ? 'direct' : 'group', isMe: this.isMe(), isPublic: this.isPublic(), @@ -651,9 +647,7 @@ this.set({ verified }); // we don't await here because we don't need to wait for this to finish - window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + this.commit(); return; } @@ -716,9 +710,7 @@ } this.set({ verified }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); // Three situations result in a verification notice in the conversation: // 1) The message came from an explicit verification in another client (not @@ -823,16 +815,12 @@ secondaryStatus: newStatus, primaryDevicePubKey, }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async updateGroupAdmins(groupAdmins) { this.set({ groupAdmins }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); }, isUnverified() { if (this.isPrivate()) { @@ -1057,7 +1045,7 @@ ); }, - getUnread() { + async getUnread() { return window.Signal.Data.getUnreadByConversation(this.id, { MessageCollection: Whisper.MessageCollection, }); @@ -1301,6 +1289,9 @@ if (this.isPrivate()) { message.set({ destination }); } + if (this.isPublic()) { + message.setServerTimestamp(new Date().getTime()); + } const id = await window.Signal.Data.saveMessage(message.attributes, { Message: Whisper.Message, @@ -1314,9 +1305,7 @@ timestamp: now, isArchived: false, }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); // We're offline! if (!textsecure.messaging) { @@ -1410,7 +1399,7 @@ await libsession .getMessageQueue() - .send(destinationPubkey, mediumGroupChatMessage); + .sendToGroup(mediumGroupChatMessage); } else { const closedGroupChatMessage = new libsession.Messages.Outgoing.ClosedGroupChatMessage( { @@ -1501,17 +1490,13 @@ this.set(lastMessageUpdate); if (this.hasChanged()) { - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setArchived(isArchived) { this.set({ isArchived }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); }, async updateExpirationTimer( @@ -1548,9 +1533,7 @@ const timestamp = (receivedAt || Date.now()) - 1; this.set({ expireTimer }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); const message = this.messageCollection.add({ // Even though this isn't reflected to the user, we want to place the last seen @@ -1643,9 +1626,7 @@ } if (this.get('sessionResetStatus') !== newStatus) { this.set({ sessionResetStatus: newStatus }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async onSessionResetInitiated() { @@ -1748,6 +1729,7 @@ await window.Signal.Data.updateConversation(this.id, this.attributes, { Conversation: Whisper.Conversation, }); + await this.trigger('change', this); }, async addMessage(messageAttributes) { @@ -1873,7 +1855,6 @@ conversationId, }) ); - let unreadMessages = await this.getUnread(); const oldUnread = unreadMessages.filter( @@ -1906,7 +1887,7 @@ unreadMessages = unreadMessages.filter(m => Boolean(m.isIncoming())); const unreadCount = unreadMessages.length - read.length; - this.set({ unreadCount }); + this.set('unreadCount', unreadCount); const mentionRead = (() => { const stillUnread = unreadMessages.filter( @@ -1925,9 +1906,7 @@ this.set({ mentionedUs: false }); } - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); // If a message has errors, we don't want to send anything out about it. // read syncs - let's wait for a client that really understands the message @@ -1986,21 +1965,17 @@ } this.set({ nickname: trimmed }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); await this.updateProfileName(); }, async setLokiProfile(newProfile) { if (!_.isEqual(this.get('profile'), newProfile)) { this.set({ profile: newProfile }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } - // if set to null, it will show a jazzIcon + // if set to null, it will show a placeholder with color and first letter await this.setProfileAvatar({ path: newProfile.avatar }); await this.updateProfileName(); @@ -2049,9 +2024,7 @@ channelId: newChannelId, active_at: Date.now(), }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, getPublicSource() { @@ -2088,9 +2061,7 @@ } if (this.get('lastPublicMessage') !== newLastMessageId) { this.set({ lastPublicMessage: newLastMessageId }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, isModerator(pubKey) { @@ -2107,9 +2078,7 @@ // TODO: compare array properly if (!_.isEqual(this.get('moderators'), moderators)) { this.set({ moderators }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, @@ -2144,18 +2113,14 @@ const profileName = this.get('profileName'); if (profileName !== name) { this.set({ profileName: name }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setGroupName(name) { const profileName = this.get('name'); if (profileName !== name) { this.set({ name }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setSubscriberCount(count) { @@ -2174,18 +2139,14 @@ this.set({ name }); } // save - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setProfileAvatar(avatar) { const profileAvatar = this.get('profileAvatar'); if (profileAvatar !== avatar) { this.set({ profileAvatar: avatar }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setProfileKey(profileKey) { @@ -2202,9 +2163,7 @@ await this.deriveAccessKeyIfNeeded(); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, @@ -2309,19 +2268,18 @@ this.contactCollection.reset(contacts); }); }, + // returns true if this is a closed/medium or open group + isGroup() { + return this.get('type') === 'group'; + }, copyPublicKey() { clipboard.writeText(this.id); - const isGroup = this.getProps().type === 'group'; - const copiedMessage = isGroup - ? i18n('copiedChatId') - : i18n('copiedPublicKey'); - window.pushToast({ - title: copiedMessage, + title: i18n('copiedToClipboard'), type: 'success', - id: 'copiedPublicKey', + id: 'copiedToClipboard', }); }, @@ -2334,15 +2292,12 @@ }, deleteContact() { - let title = i18n('deleteContact'); + let title = i18n('delete'); let message = i18n('deleteContactConfirmation'); - if (this.isPublic()) { - title = i18n('leaveOpenGroup'); - message = i18n('leaveOpenGroupConfirmation'); - } else if (this.isClosedGroup()) { - title = i18n('leaveClosedGroup'); - message = i18n('leaveClosedGroupConfirmation'); + if (this.isGroup()) { + title = i18n('leaveGroup'); + message = i18n('leaveGroupConfirmation'); } window.confirmationDialog({ @@ -2403,11 +2358,9 @@ let params; if (this.isPublic()) { - params = { - title: i18n('deleteMessages'), - message: i18n('deletePublicConversationConfirmation'), - resolve: () => ConversationController.deleteContact(this.id), - }; + throw new Error( + 'Called deleteMessages() on an open group. Only leave group is supported.' + ); } else { params = { title: i18n('deleteMessages'), @@ -2440,16 +2393,14 @@ }); } - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); }, getName() { if (this.isPrivate()) { return this.get('name'); } - return this.get('name') || i18n('unknownGroup'); + return this.get('name') || i18n('unknown'); }, getTitle() { @@ -2518,33 +2469,10 @@ return this.id; }, - getInitials(name) { - if (!name) { - return null; - } - - const cleaned = name.replace(/[^A-Za-z\s]+/g, '').replace(/\s+/g, ' '); - const parts = cleaned.split(' '); - const initials = parts.map(part => part.trim()[0]); - if (!initials.length) { - return null; - } - - return initials.slice(0, 2).join(''); - }, - isPrivate() { return this.get('type') === 'private'; }, - getColor() { - if (!this.isPrivate()) { - return 'signal-blue'; - } - - const { migrateColor } = Util; - return migrateColor(this.get('color')); - }, getAvatarPath() { const avatar = this.get('avatar') || this.get('profileAvatar'); @@ -2559,20 +2487,9 @@ return null; }, getAvatar() { - const title = this.get('name'); - const color = this.getColor(); const url = this.getAvatarPath(); - if (url) { - return { url, color }; - } else if (this.isPrivate()) { - const symbol = this.isValid() ? '#' : '!'; - return { - color, - content: this.getInitials(title) || symbol, - }; - } - return { url: 'images/group_default.png', color }; + return { url: url || null }; }, getNotificationIcon() { diff --git a/js/models/messages.js b/js/models/messages.js index 6f75ecdc9..c7d170465 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -173,7 +173,7 @@ if (!conversation) { return number; } - return conversation.getDisplayName(); + return conversation.getProfileName(); }, getLokiNameForNumber(number) { const conversation = ConversationController.get(number); @@ -229,7 +229,7 @@ messages.push(i18n('kickedFromTheGroup', names[0])); } } - return messages.join(', '); + return messages.join(' '); } if (this.isEndSession()) { return i18n(this.getEndSessionTranslationKey()); @@ -399,7 +399,6 @@ const regionCode = storage.get('regionCode'); const contactModel = this.findContact(phoneNumber); - const color = contactModel ? contactModel.getColor() : null; let profileName; if (phoneNumber === window.storage.get('primaryDevicePubKey')) { profileName = i18n('you'); @@ -411,7 +410,7 @@ phoneNumber: format(phoneNumber, { ourRegionCode: regionCode, }), - color, + color: null, avatarPath: contactModel ? contactModel.getAvatarPath() : null, name: contactModel ? contactModel.getName() : null, profileName, @@ -550,7 +549,6 @@ const contact = this.findAndFormatContact(phoneNumber); const contactModel = this.findContact(phoneNumber); - const authorColor = contactModel ? contactModel.getColor() : null; const authorAvatarPath = contactModel ? contactModel.getAvatarPath() : null; @@ -581,9 +579,9 @@ id: this.id, direction: this.isIncoming() ? 'incoming' : 'outgoing', timestamp: this.get('sent_at'), + serverTimestamp: this.get('serverTimestamp'), status: this.getMessagePropStatus(), contact: this.getPropsForEmbeddedContact(), - authorColor, authorName: contact.name, authorProfileName: contact.profileName, authorPhoneNumber: contact.phoneNumber, @@ -747,7 +745,6 @@ const { author, id, referencedMessageNotFound } = quote; const contact = author && ConversationController.get(author); - const authorColor = contact ? contact.getColor() : 'grey'; const authorPhoneNumber = format(author, { ourRegionCode: regionCode, @@ -777,7 +774,6 @@ authorPhoneNumber, authorProfileName, authorName, - authorColor, onClick, referencedMessageNotFound, }; @@ -819,7 +815,7 @@ return Boolean(lookup[contactId]); }, - getPropsForMessageDetail() { + async getPropsForMessageDetail() { const newIdentity = i18n('newIdentity'); const OUTGOING_KEY_ERROR = 'OutgoingIdentityKeyError'; @@ -855,39 +851,43 @@ // that contact. Otherwise, it will be a standalone entry. const errors = _.reject(allErrors, error => Boolean(error.number)); const errorsGroupedById = _.groupBy(allErrors, 'number'); - const primaryDevicePubKey = this.get('conversationId'); - const finalContacts = (phoneNumbers || []).map(id => { - const errorsForContact = errorsGroupedById[id]; - const isOutgoingKeyError = Boolean( - _.find(errorsForContact, error => error.name === OUTGOING_KEY_ERROR) - ); - const isUnidentifiedDelivery = - storage.get('unidentifiedDeliveryIndicators') && - this.isUnidentifiedDelivery(id, unidentifiedLookup); + const finalContacts = await Promise.all( + (phoneNumbers || []).map(async id => { + const errorsForContact = errorsGroupedById[id]; + const isOutgoingKeyError = Boolean( + _.find(errorsForContact, error => error.name === OUTGOING_KEY_ERROR) + ); + const isUnidentifiedDelivery = + storage.get('unidentifiedDeliveryIndicators') && + this.isUnidentifiedDelivery(id, unidentifiedLookup); + const primary = await window.libsession.Protocols.MultiDeviceProtocol.getPrimaryDevice( + id + ); - const isPrimaryDevice = id === primaryDevicePubKey; + const isPrimaryDevice = id === primary.key; - const contact = this.findAndFormatContact(id); - const profileName = isPrimaryDevice - ? contact.profileName - : `${contact.profileName} (Secondary Device)`; - return { - ...contact, - status: this.getStatus(id), - errors: errorsForContact, - isOutgoingKeyError, - isUnidentifiedDelivery, - isPrimaryDevice, - profileName, - onSendAnyway: () => - this.trigger('force-send', { - contact: this.findContact(id), - message: this, - }), - onShowSafetyNumber: () => - this.trigger('show-identity', this.findContact(id)), - }; - }); + const contact = this.findAndFormatContact(id); + const profileName = isPrimaryDevice + ? contact.profileName + : `${contact.profileName} (Secondary Device)`; + return { + ...contact, + status: this.getStatus(id), + errors: errorsForContact, + isOutgoingKeyError, + isUnidentifiedDelivery, + isPrimaryDevice, + profileName, + onSendAnyway: () => + this.trigger('force-send', { + contact: this.findContact(id), + message: this, + }), + onShowSafetyNumber: () => + this.trigger('show-identity', this.findContact(id)), + }; + }) + ); // The prefix created here ensures that contacts with errors are listed // first; otherwise it's alphabetical @@ -919,9 +919,9 @@ } window.pushToast({ - title: i18n('copiedPublicKey'), + title: i18n('copiedToClipboard'), type: 'success', - id: 'copiedPublicKey', + id: 'copiedToClipboard', }); }, @@ -972,9 +972,9 @@ clipboard.writeText(this.get('body')); window.pushToast({ - title: i18n('copiedMessage'), + title: i18n('copiedToClipboard'), type: 'success', - id: 'copiedMessage', + id: 'copiedToClipboard', }); }, @@ -1208,13 +1208,13 @@ * This function is called by inbox_view.js when a message was successfully sent for one device. * So it might be called several times for the same message */ - async handleMessageSentSuccess(sentMessage) { + async handleMessageSentSuccess(sentMessage, wrappedEnvelope) { let sentTo = this.get('sent_to') || []; const isOurDevice = await window.libsession.Protocols.MultiDeviceProtocol.isOurDevice( sentMessage.device ); - + // FIXME this is not correct and will cause issues with syncing // At this point the only way to check for medium // group is by comparing the encryption type const isMediumGroupMessage = @@ -1229,32 +1229,105 @@ // if we did not sync or trigger a sync message for this specific message already const shouldTriggerSyncMessage = !isOurDevice && - !isOpenGroupMessage && !isMediumGroupMessage && !this.get('synced') && !this.get('sentSync'); // A message is synced if we triggered a sync message (sentSync) // and the current message was sent to our device (so a sync message) - const shouldMarkMessageAsSynced = - isOurDevice && !isOpenGroupMessage && this.get('sentSync'); + const shouldMarkMessageAsSynced = isOurDevice && this.get('sentSync'); - // Handle the sync logic here - if (shouldTriggerSyncMessage) { + const isSessionOrClosedMessage = !isOpenGroupMessage; + + if (!isOpenGroupMessage) { const contentDecoded = textsecure.protobuf.Content.decode( sentMessage.plainTextBuffer ); const { dataMessage } = contentDecoded; - if (dataMessage) { - await this.sendSyncMessage(dataMessage); - } - } else if (shouldMarkMessageAsSynced) { - this.set({ synced: true }); - } - if (!isOpenGroupMessage) { const primaryPubKey = await libsession.Protocols.MultiDeviceProtocol.getPrimaryDevice( sentMessage.device ); + + if (isMediumGroupMessage) { + // Delete all ratchets (it's important that this happens * after * sending out the update) + const shouldTriggerRatchetReset = + dataMessage && + dataMessage.mediumGroupUpdate && + dataMessage.mediumGroupUpdate.senderKeys && + dataMessage.mediumGroupUpdate.senderKeys.length === 0; + if (shouldTriggerRatchetReset) { + const { groupPublicKey } = dataMessage.mediumGroupUpdate; + const groupPubKeyUint = new Uint8Array( + groupPublicKey.toArrayBuffer() + ); + const groupId = libsession.Utils.StringUtils.decode( + groupPubKeyUint, + 'hex' + ); + await window.Signal.Data.removeAllClosedGroupRatchets(groupId); + // Send out the user's new ratchet to all members (minus the removed ones) using established channels + const ourPrimary = await window.Signal.Util.UserUtil.getPrimary(); + + const userSenderKey = await window.libsession.MediumGroup.createSenderKeyForGroup( + groupId, + ourPrimary + ); + + const currentMembers = this.getConversation().get('members'); + + window.log.warn( + 'Sharing our new senderKey with remainingMembers via established channels with', + currentMembers + ); + + await window.libsession.MediumGroup.shareSenderKeys( + groupId, + currentMembers, + userSenderKey + ); + } + } + + /** + * We should hit the notify endpoint for push notification only if: + * • It's a one-to-one chat or a closed group + * • The message has either text or attachments + */ + const hasBodyOrAttachments = Boolean( + dataMessage && + (dataMessage.body || + (dataMessage.attachments && dataMessage.attachments.length)) + ); + const shouldNotifyPushServer = + hasBodyOrAttachments && isSessionOrClosedMessage; + + if (shouldNotifyPushServer) { + // notify the push notification server if needed + if (!wrappedEnvelope) { + window.log.warn( + 'Should send PN notify but no wrapped envelope set.' + ); + } else { + if (!window.LokiPushNotificationServer) { + window.LokiPushNotificationServer = new window.LokiPushNotificationServerApi(); + } + + window.LokiPushNotificationServer.notify( + wrappedEnvelope, + primaryPubKey.key + ); + } + } + + // Handle the sync logic here + if (shouldTriggerSyncMessage) { + if (dataMessage) { + await this.sendSyncMessage(dataMessage); + } + } else if (shouldMarkMessageAsSynced) { + this.set({ synced: true }); + } + sentTo = _.union(sentTo, [primaryPubKey.key]); } @@ -1416,6 +1489,19 @@ Message: Whisper.Message, }); }, + async setServerTimestamp(serverTimestamp) { + if (_.isEqual(this.get('serverTimestamp'), serverTimestamp)) { + return; + } + + this.set({ + serverTimestamp, + }); + + await window.Signal.Data.saveMessage(this.attributes, { + Message: Whisper.Message, + }); + }, async setIsPublic(isPublic) { if (_.isEqual(this.get('isPublic'), isPublic)) { return; @@ -1645,13 +1731,6 @@ Whisper.MessageCollection = Backbone.Collection.extend({ model: Whisper.Message, - comparator(left, right) { - if (left.get('sent_at') === right.get('sent_at')) { - return (left.get('received_at') || 0) - (right.get('received_at') || 0); - } - - return (left.get('sent_at') || 0) - (right.get('sent_at') || 0); - }, initialize(models, options) { if (options) { this.conversation = options.conversation; @@ -1702,7 +1781,7 @@ ); } - this.add(models); + this.add(models.reverse()); if (unreadCount <= 0) { return; diff --git a/js/modules/data.d.ts b/js/modules/data.d.ts index 35a87b0f5..b19fb4c5a 100644 --- a/js/modules/data.d.ts +++ b/js/modules/data.d.ts @@ -197,7 +197,6 @@ export function getAllConversations({ }): Promise>; export function getAllConversationIds(): Promise>; -export function getAllPrivateConversations(): Promise>; export function getAllPublicConversations(): Promise>; export function getPublicConversationsByServer( server: string, @@ -224,7 +223,6 @@ export function searchMessagesInConversation( conversationId: string, { limit }?: { limit: any } ): Promise; -export function getMessageCount(): Promise; export function saveMessage( data: Mesasge, { forceSave, Message }?: { forceSave?: any; Message?: any } @@ -267,6 +265,10 @@ export function getMessageBySender( }: { source: any; sourceDevice: any; sent_at: any }, { Message }: { Message: any } ): Promise; +export function getMessagesBySender( + { source, sourceDevice }: { source: any; sourceDevice: any }, + { Message }: { Message: any } +): Promise; export function getMessageIdsFromServerIds( serverIds: any, conversationId: any @@ -322,6 +324,7 @@ export function getMessagesByConversation( type?: string; } ): Promise; + export function getSeenMessagesByHashList(hashes: any): Promise; export function getLastHashBySnode(convoId: any, snode: any): Promise; @@ -409,3 +412,4 @@ export function getMessagesWithFileAttachments( // Sender Keys export function getSenderKeys(groupId: any, senderIdentity: any): Promise; export function createOrUpdateSenderKeys(data: any): Promise; +export function removeAllClosedGroupRatchets(groupId: string): Promise; diff --git a/js/modules/data.js b/js/modules/data.js index e532978e1..c135bf44c 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -123,7 +123,6 @@ module.exports = { getAllConversations, getAllConversationIds, - getAllPrivateConversations, getAllPublicConversations, getPublicConversationsByServer, getPubkeysInPublicConversation, @@ -135,7 +134,6 @@ module.exports = { searchMessages, searchMessagesInConversation, - getMessageCount, saveMessage, cleanSeenMessages, cleanLastHashes, @@ -151,6 +149,7 @@ module.exports = { removeAllMessagesInConversation, getMessageBySender, + getMessagesBySender, getMessageIdsFromServerIds, getMessageById, getAllMessages, @@ -197,6 +196,7 @@ module.exports = { getSenderKeys, createOrUpdateSenderKeys, + removeAllClosedGroupRatchets, }; function init() { @@ -705,6 +705,10 @@ async function createOrUpdateSenderKeys(data) { await channels.createOrUpdateSenderKeys(data); } +async function removeAllClosedGroupRatchets(groupId) { + await channels.removeAllClosedGroupRatchets(groupId); +} + // Sessions async function createOrUpdateSession(data) { @@ -818,14 +822,6 @@ async function getAllPublicConversations({ ConversationCollection }) { return collection; } -async function getAllPrivateConversations({ ConversationCollection }) { - const conversations = await channels.getAllPrivateConversations(); - - const collection = new ConversationCollection(); - collection.add(conversations); - return collection; -} - async function getPubkeysInPublicConversation(id) { return channels.getPubkeysInPublicConversation(id); } @@ -882,9 +878,6 @@ async function searchMessagesInConversation( } // Message -async function getMessageCount() { - return channels.getMessageCount(); -} async function cleanSeenMessages() { await channels.cleanSeenMessages(); @@ -1015,6 +1008,22 @@ async function getMessageBySender( return new Message(messages[0]); } +async function getMessagesBySender( + // eslint-disable-next-line camelcase + { source, sourceDevice }, + { Message } +) { + const messages = await channels.getMessagesBySender({ + source, + sourceDevice, + }); + if (!messages || !messages.length) { + return null; + } + + return messages.map(m => new Message(m)); +} + async function getUnreadByConversation(conversationId, { MessageCollection }) { const messages = await channels.getUnreadByConversation(conversationId); return new MessageCollection(messages); diff --git a/js/modules/debug.js b/js/modules/debug.js index 5f0e4037c..e763758aa 100644 --- a/js/modules/debug.js +++ b/js/modules/debug.js @@ -50,11 +50,7 @@ exports.createConversation = async ({ unread: numMessages, }); const conversationId = conversation.get('id'); - await Signal.Data.updateConversation( - conversationId, - conversation.attributes, - { Conversation: Whisper.Conversation } - ); + await conversation.commit(); await Promise.all( range(0, numMessages).map(async index => { diff --git a/js/modules/loki_app_dot_net_api.d.ts b/js/modules/loki_app_dot_net_api.d.ts index 318facf52..68d705850 100644 --- a/js/modules/loki_app_dot_net_api.d.ts +++ b/js/modules/loki_app_dot_net_api.d.ts @@ -30,10 +30,11 @@ export interface LokiPublicChannelAPI { body?: string; }, timestamp: number - ): Promise; + ): Promise<{ serverId; serverTimestamp }>; } declare class LokiAppDotNetServerAPI implements LokiAppDotNetServerInterface { + public baseServerUrl: string; constructor(ourKey: string, url: string); } diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index ae606fb35..ca78976a1 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -6,13 +6,13 @@ const { URL, URLSearchParams } = require('url'); const FormData = require('form-data'); const https = require('https'); const path = require('path'); +const dataMessage = require('../../ts/receiver/dataMessage'); // Can't be less than 1200 if we have unauth'd requests const PUBLICCHAT_MSG_POLL_EVERY = 1.5 * 1000; // 1.5s const PUBLICCHAT_CHAN_POLL_EVERY = 20 * 1000; // 20s const PUBLICCHAT_DELETION_POLL_EVERY = 5 * 1000; // 5s const PUBLICCHAT_MOD_POLL_EVERY = 30 * 1000; // 30s -const PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES = 10 * 1000; // 10s // FIXME: replace with something on urlPubkeyMap... const FILESERVER_HOSTS = [ @@ -26,11 +26,16 @@ const LOKIFOUNDATION_DEVFILESERVER_PUBKEY = 'BSZiMVxOco/b3sYfaeyiMWv/JnqokxGXkHoclEx8TmZ6'; const LOKIFOUNDATION_FILESERVER_PUBKEY = 'BWJQnVm97sQE3Q1InB4Vuo+U/T1hmwHBv0ipkiv8tzEc'; +const LOKIFOUNDATION_APNS_PUBKEY = + 'BWQqZYWRl0LlotTcUSRJZPvNi8qyt1YSQH3li4EHQNBJ'; + const urlPubkeyMap = { 'https://file-dev.getsession.org': LOKIFOUNDATION_DEVFILESERVER_PUBKEY, 'https://file-dev.lokinet.org': LOKIFOUNDATION_DEVFILESERVER_PUBKEY, 'https://file.getsession.org': LOKIFOUNDATION_FILESERVER_PUBKEY, 'https://file.lokinet.org': LOKIFOUNDATION_FILESERVER_PUBKEY, + 'https://dev.apns.getsession.org': LOKIFOUNDATION_APNS_PUBKEY, + 'https://live.apns.getsession.org': LOKIFOUNDATION_APNS_PUBKEY, }; const HOMESERVER_USER_ANNOTATION_TYPE = 'network.loki.messenger.homeserver'; @@ -46,6 +51,8 @@ const snodeHttpsAgent = new https.Agent({ const timeoutDelay = ms => new Promise(resolve => setTimeout(resolve, ms)); +const MAX_SEND_ONION_RETRIES = 3; + const sendViaOnion = async (srvPubKey, url, fetchOptions, options = {}) => { if (!srvPubKey) { log.error( @@ -132,6 +139,12 @@ const sendViaOnion = async (srvPubKey, url, fetchOptions, options = {}) => { `loki_app_dot_net:::sendViaOnion #${options.requestNumber} - Retry #${options.retry} Couldnt handle onion request, retrying`, payloadObj ); + if (options.retry && options.retry >= MAX_SEND_ONION_RETRIES) { + log.error( + `sendViaOnion too many retries: ${options.retry}. Stopping retries.` + ); + return {}; + } return sendViaOnion(srvPubKey, url, fetchOptions, { ...options, retry: options.retry + 1, @@ -169,14 +182,14 @@ const sendViaOnion = async (srvPubKey, url, fetchOptions, options = {}) => { ); } } else { - // why is + // FIXME why is // https://chat-dev.lokinet.org/loki/v1/channel/1/deletes?count=200&since_id= // difference in response than all the other calls.... - log.info( - `loki_app_dot_net:::sendViaOnion #${ - options.requestNumber - } - got object response ${url.toString()}` - ); + // log.info( + // `loki_app_dot_net:::sendViaOnion #${ + // options.requestNumber + // } - got object response ${url.toString()}` + // ); } // result.status has the http response code if (!txtResponse) { @@ -1424,7 +1437,7 @@ class LokiPublicChannelAPI { value: { name: 'Your Public Chat', description: 'Your public chat room', - avatar: 'images/group_default.png', + avatar: null, }, }, ]; @@ -1606,14 +1619,7 @@ class LokiPublicChannelAPI { if (data.counts && Number.isInteger(data.counts.subscribers)) { this.conversation.setSubscriberCount(data.counts.subscribers); } - - await window.Signal.Data.updateConversation( - this.conversation.id, - this.conversation.attributes, - { - Conversation: Whisper.Conversation, - } - ); + await this.conversation.commit(); } // get moderation actions @@ -1800,6 +1806,8 @@ class LokiPublicChannelAPI { return { timestamp, + serverTimestamp: + new Date(`${adnMessage.created_at}`).getTime() || timestamp, attachments, preview, quote, @@ -1913,9 +1921,13 @@ class LokiPublicChannelAPI { if (messengerData === false) { return false; } - + // eslint-disable-next-line no-param-reassign + adnMessage.timestamp = messengerData.timestamp; + // eslint-disable-next-line no-param-reassign + adnMessage.body = messengerData.text; const { timestamp, + serverTimestamp, quote, attachments, preview, @@ -1927,20 +1939,15 @@ class LokiPublicChannelAPI { } // Duplicate check - const isDuplicate = message => { - // The username in this case is the users pubKey - const sameUsername = message.username === pubKey; - const sameText = message.text === adnMessage.text; - // Don't filter out messages that are too far apart from each other - const timestampsSimilar = - Math.abs(message.timestamp - timestamp) <= - PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES; - - return sameUsername && sameText && timestampsSimilar; - }; + const isDuplicate = (message, testedMessage) => + dataMessage.isDuplicate( + message, + testedMessage, + testedMessage.user.username + ); // Filter out any messages that we got previously - if (this.lastMessagesCache.some(isDuplicate)) { + if (this.lastMessagesCache.some(m => isDuplicate(m, adnMessage))) { return false; // Duplicate message } @@ -1949,9 +1956,11 @@ class LokiPublicChannelAPI { this.lastMessagesCache = [ ...this.lastMessagesCache, { - username: pubKey, - text: adnMessage.text, - timestamp, + attributes: { + source: pubKey, + body: adnMessage.text, + sent_at: timestamp, + }, }, ].splice(-5); @@ -1990,9 +1999,9 @@ class LokiPublicChannelAPI { isSessionRequest: false, source: pubKey, sourceDevice: 1, - timestamp, + timestamp, // sender timestamp - serverTimestamp: timestamp, + serverTimestamp, // server created_at, used to order messages receivedAt, isPublic: true, message: { @@ -2008,7 +2017,7 @@ class LokiPublicChannelAPI { profileKey, timestamp, received_at: receivedAt, - sent_at: timestamp, + sent_at: timestamp, // sender timestamp inner quote, contact: [], preview, @@ -2342,7 +2351,10 @@ class LokiPublicChannelAPI { objBody: payload, }); if (!res.err && res.response) { - return res.response.data.id; + return { + serverId: res.response.data.id, + serverTimestamp: new Date(`${res.response.data.created_at}`).getTime(), + }; } if (res.err) { log.error(`POST ${this.baseChannelUrl}/messages failed`); @@ -2354,9 +2366,8 @@ class LokiPublicChannelAPI { } else { log.warn(res.response); } - // there's no retry on desktop - // this is supposed to be after retries - return -1; + + return { serverId: -1, serverTimestamp: -1 }; } } diff --git a/js/modules/loki_message_api.js b/js/modules/loki_message_api.js index 586e57df3..fa67288cb 100644 --- a/js/modules/loki_message_api.js +++ b/js/modules/loki_message_api.js @@ -60,7 +60,8 @@ class LokiMessageAPI { 'Failed to send public chat message' ); } - messageEventData.serverId = res; + messageEventData.serverId = res.serverId; + messageEventData.serverTimestamp = res.serverTimestamp; window.Whisper.events.trigger('publicMessageSent', messageEventData); return; } diff --git a/js/modules/loki_public_chat_api.js b/js/modules/loki_public_chat_api.js index e37c01f3c..4578baade 100644 --- a/js/modules/loki_public_chat_api.js +++ b/js/modules/loki_public_chat_api.js @@ -117,7 +117,7 @@ class LokiPublicChatFactoryAPI extends EventEmitter { // after verification then we can start up all the pollers if (process.env.USE_STUBBED_NETWORK) { // eslint-disable-next-line global-require - const StubAppDotNetAPI = require('../../integration_test/stubs/stub_app_dot_net_api.js'); + const StubAppDotNetAPI = require('../.././ts/test/session/integration/stubs/stub_app_dot_net_api'); thisServer = new StubAppDotNetAPI(this.ourKey, serverUrl); } else { thisServer = new LokiAppDotNetAPI(this.ourKey, serverUrl); diff --git a/js/modules/loki_push_notification_server_api.js b/js/modules/loki_push_notification_server_api.js new file mode 100644 index 000000000..91531a47b --- /dev/null +++ b/js/modules/loki_push_notification_server_api.js @@ -0,0 +1,28 @@ +/* global dcodeIO */ + +const LokiAppDotNetAPI = require('./loki_app_dot_net_api'); + +class LokiPushNotificationServerApi { + constructor() { + this.ourKey = + '642a6585919742e5a2d4dc51244964fbcd8bcab2b75612407de58b810740d049'; + this.serverUrl = 'https://live.apns.getsession.org'; + this._server = new LokiAppDotNetAPI(this.ourKey, this.serverUrl); + + // make sure pubKey & pubKeyHex are set in _server + this.pubKey = this._server.getPubKeyForUrl(); + } + + async notify(plainTextBuffer, sentTo) { + const options = { + method: 'post', + objBody: { + data: dcodeIO.ByteBuffer.wrap(plainTextBuffer).toString('base64'), + send_to: sentTo, + }, + }; + return this._server.serverRequest('notify', options); + } +} + +module.exports = LokiPushNotificationServerApi; diff --git a/js/modules/metadata/CiphertextMessage.js b/js/modules/metadata/CiphertextMessage.js index 1e2ddb6ea..20274e204 100644 --- a/js/modules/metadata/CiphertextMessage.js +++ b/js/modules/metadata/CiphertextMessage.js @@ -11,5 +11,5 @@ module.exports = { ENCRYPTED_MESSAGE_OVERHEAD: 53, - LOKI_FRIEND_REQUEST: 101, + FALLBACK_MESSAGE: 101, }; diff --git a/js/modules/metadata/SecretSessionCipher.js b/js/modules/metadata/SecretSessionCipher.js index 5f8d38495..3e0166c42 100644 --- a/js/modules/metadata/SecretSessionCipher.js +++ b/js/modules/metadata/SecretSessionCipher.js @@ -199,8 +199,8 @@ function _createUnidentifiedSenderMessageContentFromBuffer(serialized) { case TypeEnum.PREKEY_MESSAGE: type = CiphertextMessage.PREKEY_TYPE; break; - case TypeEnum.LOKI_FRIEND_REQUEST: - type = CiphertextMessage.LOKI_FRIEND_REQUEST; + case TypeEnum.FALLBACK_MESSAGE: + type = CiphertextMessage.FALLBACK_MESSAGE; break; default: throw new Error(`Unknown type: ${message.type}`); @@ -226,8 +226,8 @@ function _getProtoMessageType(type) { return TypeEnum.MESSAGE; case CiphertextMessage.PREKEY_TYPE: return TypeEnum.PREKEY_MESSAGE; - case CiphertextMessage.LOKI_FRIEND_REQUEST: - return TypeEnum.LOKI_FRIEND_REQUEST; + case CiphertextMessage.FALLBACK_MESSAGE: + return TypeEnum.FALLBACK_MESSAGE; default: throw new Error(`_getProtoMessageType: type '${type}' does not exist`); } @@ -481,7 +481,7 @@ SecretSessionCipher.prototype = { signalProtocolStore, sender ).decryptPreKeyWhisperMessage(message.content); - case CiphertextMessage.LOKI_FRIEND_REQUEST: + case CiphertextMessage.FALLBACK_MESSAGE: return new libloki.crypto.FallBackSessionCipher(sender).decrypt( message.content ); diff --git a/js/modules/signal.js b/js/modules/signal.js index 5fe517ea2..fc782f966 100644 --- a/js/modules/signal.js +++ b/js/modules/signal.js @@ -30,8 +30,11 @@ const { const { ContactListItem } = require('../../ts/components/ContactListItem'); const { ContactName } = require('../../ts/components/conversation/ContactName'); const { - ConversationHeader, + ConversationHeaderWithDetails, } = require('../../ts/components/conversation/ConversationHeader'); +const { + SessionRightPanelWithDetails, +} = require('../../ts/components/session/conversation/SessionRightPanel'); const { EmbeddedContact, } = require('../../ts/components/conversation/EmbeddedContact'); @@ -60,9 +63,6 @@ const { const { SessionToast } = require('../../ts/components/session/SessionToast'); const { SessionToggle } = require('../../ts/components/session/SessionToggle'); const { SessionModal } = require('../../ts/components/session/SessionModal'); -const { - SessionQRModal, -} = require('../../ts/components/session/SessionQRModal'); const { SessionSeedModal, } = require('../../ts/components/session/SessionSeedModal'); @@ -278,7 +278,8 @@ exports.setup = (options = {}) => { ContactDetail, ContactListItem, ContactName, - ConversationHeader, + ConversationHeaderWithDetails, + SessionRightPanelWithDetails, SettingsView, EmbeddedContact, Emojify, @@ -304,7 +305,6 @@ exports.setup = (options = {}) => { SessionToggle, SessionConfirm, SessionModal, - SessionQRModal, SessionSeedModal, SessionPasswordModal, SessionPasswordPrompt, diff --git a/js/notifications.js b/js/notifications.js index b5120bb6e..4c341e31f 100644 --- a/js/notifications.js +++ b/js/notifications.js @@ -123,9 +123,7 @@ if (messagesNotificationCount === 1) { message = `${i18n('notificationFrom')} ${lastMessageTitle}`; } else { - message = `${i18n( - 'notificationMostRecentFrom' - )} ${lastMessageTitle}`; + message = i18n('notificationMostRecentFrom', lastMessageTitle); } break; } diff --git a/js/views/app_view.js b/js/views/app_view.js index 3bfbe282a..15312133d 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -11,31 +11,31 @@ Whisper.AppView = Backbone.View.extend({ initialize() { this.inboxView = null; - this.installView = null; this.applyTheme(); + this.applyRtl(); this.applyHideMenu(); this.showSeedDialog = this.showSeedDialog.bind(this); this.showPasswordDialog = this.showPasswordDialog.bind(this); }, events: { - 'click .openInstaller': 'openInstaller', // NetworkStatusView has this button openInbox: 'openInbox', }, + applyRtl() { + const rtlLocales = ['fa']; + + const loc = window.i18n.getLocale(); + if (rtlLocales.includes(loc)) { + this.$el.addClass('rtl'); + } + }, applyTheme() { - const iOS = storage.get('userAgent') === 'OWI'; - const theme = 'dark'; // storage.get('theme-setting') || 'dark'; + const theme = storage.get('theme-setting') || 'light'; this.$el .removeClass('light-theme') .removeClass('dark-theme') .addClass(`${theme}-theme`); - - if (iOS) { - this.$el.addClass('ios-theme'); - } else { - this.$el.removeClass('ios-theme'); - } }, applyHideMenu() { const hideMenuBar = storage.get('hide-menu-bar', true); @@ -65,46 +65,14 @@ const importView = new Whisper.ImportView(); this.importView = importView; - this.listenTo( - importView, - 'light-import', - this.finishLightImport.bind(this) - ); this.openView(this.importView); }, - finishLightImport() { - const options = { - hasExistingData: true, - }; - this.openInstaller(options); - }, closeImporter() { if (this.importView) { this.importView.remove(); this.importView = null; } }, - openInstaller(options = {}) { - // If we're in the middle of import, we don't want to show the menu options - // allowing the user to switch to other ways to set up the app. If they - // switched back and forth in the middle of a light import, they'd lose all - // that imported data. - if (!options.hasExistingData) { - window.addSetupMenuItems(); - } - - this.resetViews(); - const installView = new Whisper.InstallView(options); - this.installView = installView; - - this.openView(this.installView); - }, - closeInstaller() { - if (this.installView) { - this.installView.remove(); - this.installView = null; - } - }, openStandalone() { window.addSetupMenuItems(); this.resetViews(); @@ -118,7 +86,6 @@ } }, resetViews() { - this.closeInstaller(); this.closeImporter(); this.closeStandalone(); }, @@ -137,9 +104,6 @@ // this.initialLoadComplete. An example of this: on a phone-pairing setup. _.defaults(options, { initialLoadComplete: this.initialLoadComplete }); - // window.log.info('open inbox'); - this.closeInstaller(); - if (!this.inboxView) { // We create the inbox immediately so we don't miss an update to // this.initialLoadComplete between the start of this method and the @@ -207,12 +171,6 @@ const dialog = new Whisper.SeedDialogView(); this.el.prepend(dialog.el); }, - showQRDialog(string) { - const dialog = new Whisper.QRDialogView({ - value: string, - }); - this.el.append(dialog.el); - }, showDevicePairingDialog(options) { const dialog = new Whisper.DevicePairingDialogView(options); this.el.prepend(dialog.el); @@ -229,22 +187,16 @@ const dialog = new Whisper.UpdateGroupMembersDialogView(groupConvo); this.el.append(dialog.el); }, - showSessionRestoreConfirmation(options) { - const dialog = new Whisper.ConfirmSessionResetView(options); - this.el.append(dialog.el); - }, showLeaveGroupDialog(groupConvo) { - let title = i18n('deleteContact'); - let message = i18n('deleteContactConfirmation'); - - if (groupConvo.isPublic()) { - title = i18n('leaveOpenGroup'); - message = i18n('leaveOpenGroupConfirmation'); - } else if (groupConvo.isClosedGroup()) { - title = i18n('leaveClosedGroup'); - message = i18n('leaveClosedGroupConfirmation'); + if (!groupConvo.isGroup()) { + throw new Error( + 'showLeaveGroupDialog() called with a non group convo.' + ); } + const title = i18n('leaveGroup'); + const message = i18n('leaveGroupConfirmation'); + window.confirmationDialog({ title, message, diff --git a/js/views/beta_release_disclaimer_view.js b/js/views/beta_release_disclaimer_view.js deleted file mode 100644 index 004d3582c..000000000 --- a/js/views/beta_release_disclaimer_view.js +++ /dev/null @@ -1,38 +0,0 @@ -/* global Whisper, window */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - Whisper.BetaReleaseDisclaimer = Whisper.View.extend({ - className: 'loki-dialog beta-disclaimer-dialog modal', - initialize() { - this.close = this.close.bind(this); - this.render(); - }, - - render() { - this.dialogView = new Whisper.ReactWrapperView({ - className: 'session-beta-disclaimer', - Component: window.Signal.Components.SessionConfirm, - props: { - title: window.i18n('betaDisclaimerTitle'), - message: window.i18n('betaDisclaimerSubtitle'), - messageSub: window.i18n('betaDisclaimerDescription'), - hideCancel: true, - onClickOk: this.close, - }, - }); - - this.$el.append(this.dialogView.el); - return this; - }, - - close() { - window.storage.put('betaReleaseDisclaimerAccepted', true); - this.remove(); - }, - }); -})(); diff --git a/js/views/confirm_session_reset_view.js b/js/views/confirm_session_reset_view.js deleted file mode 100644 index aa34e420f..000000000 --- a/js/views/confirm_session_reset_view.js +++ /dev/null @@ -1,50 +0,0 @@ -/* global Whisper, i18n */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - Whisper.ConfirmSessionResetView = Whisper.View.extend({ - className: 'loki-dialog modal', - initialize({ pubkey, onOk }) { - this.title = i18n('couldNotDecryptMessage'); - - this.onOk = onOk; - this.messageText = i18n('confirmSessionRestore', pubkey); - this.okText = i18n('yes'); - this.cancelText = i18n('cancel'); - - this.close = this.close.bind(this); - this.confirm = this.confirm.bind(this); - - this.$el.focus(); - this.render(); - }, - render() { - this.dialogView = new Whisper.ReactWrapperView({ - className: 'leave-group-dialog', - Component: window.Signal.Components.ConfirmDialog, - props: { - titleText: this.title, - messageText: this.messageText, - okText: this.okText, - cancelText: this.cancelText, - onConfirm: this.confirm, - onClose: this.close, - }, - }); - - this.$el.append(this.dialogView.el); - return this; - }, - async confirm() { - this.onOk(); - this.close(); - }, - close() { - this.remove(); - }, - }); -})(); diff --git a/js/views/confirmation_dialog_view.js b/js/views/confirmation_dialog_view.js deleted file mode 100644 index a62e1024c..000000000 --- a/js/views/confirmation_dialog_view.js +++ /dev/null @@ -1,61 +0,0 @@ -/* global Whisper, i18n */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - Whisper.ConfirmationDialogView = Whisper.View.extend({ - className: 'confirmation-dialog modal', - templateName: 'confirmation-dialog', - initialize(options) { - this.message = options.message; - this.hideCancel = options.hideCancel; - - this.resolve = options.resolve; - this.okText = options.okText || i18n('ok'); - - this.reject = options.reject; - this.cancelText = options.cancelText || i18n('cancel'); - - this.title = options.title; - - this.render(); - }, - events: { - keyup: 'onKeyup', - 'click .ok': 'ok', - 'click .cancel': 'cancel', - }, - render_attributes() { - return { - message: this.message, - showCancel: !this.hideCancel, - cancel: this.cancelText, - ok: this.okText, - title: this.title, - }; - }, - ok() { - this.remove(); - if (this.resolve) { - this.resolve(); - } - }, - cancel() { - this.remove(); - if (this.reject) { - this.reject(); - } - }, - onKeyup(event) { - if (event.key === 'Escape' || event.key === 'Esc') { - this.cancel(); - } - }, - focusCancel() { - this.$('.cancel').focus(); - }, - }); -})(); diff --git a/js/views/contact_list_view.js b/js/views/contact_list_view.js new file mode 100644 index 000000000..631ec390d --- /dev/null +++ b/js/views/contact_list_view.js @@ -0,0 +1,57 @@ +/* global Whisper: false */ +/* global textsecure: false */ + +// eslint-disable-next-line func-names +(function() { + 'use strict'; + + window.Whisper = window.Whisper || {}; + + Whisper.ContactListView = Whisper.ListView.extend({ + tagName: 'div', + itemView: Whisper.View.extend({ + tagName: 'div', + className: 'contact', + templateName: 'contact', + initialize(options) { + this.ourNumber = textsecure.storage.user.getNumber(); + this.listenBack = options.listenBack; + + this.listenTo(this.model, 'change', this.render); + }, + render() { + if (this.contactView) { + this.contactView.remove(); + this.contactView = null; + } + + const isMe = this.ourNumber === this.model.id; + + this.contactView = new Whisper.ReactWrapperView({ + className: 'contact-wrapper', + Component: window.Signal.Components.ContactListItem, + props: { + isMe, + avatarPath: this.model.getAvatarPath(), + phoneNumber: this.model.getNumber(), + name: this.model.getName(), + profileName: this.model.getProfileName(), + verified: this.model.isVerified(), + onClick: this.showIdentity.bind(this), + }, + }); + this.$el.append(this.contactView.el); + return this; + }, + showIdentity() { + if (this.model.id === this.ourNumber) { + return; + } + const view = new Whisper.KeyVerificationPanelView({ + model: this.model, + }); + this.listenBack(view); + }, + }), + }); +})(); diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 1ccba8d90..41edb4aa4 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -165,7 +165,6 @@ name: this.model.getName(), phoneNumber: this.model.getNumber(), profileName: this.model.getProfileName(), - color: this.model.getColor(), avatarPath: this.model.getAvatarPath(), isVerified: this.model.isVerified(), isMe: this.model.isMe(), @@ -261,9 +260,64 @@ }, }; }; + const getGroupSettingsProps = () => { + const members = this.model.get('members') || []; + const ourPK = window.textsecure.storage.user.getNumber(); + const isAdmin = this.model.isMediumGroup() + ? true + : this.model.get('groupAdmins').includes(ourPK); + + return { + id: this.model.id, + name: this.model.getName(), + phoneNumber: this.model.getNumber(), + profileName: this.model.getProfileName(), + avatarPath: this.model.getAvatarPath(), + isGroup: !this.model.isPrivate(), + isPublic: this.model.isPublic(), + isAdmin, + isRss: this.model.isRss(), + memberCount: members.length, + amMod: this.model.isModerator( + window.storage.get('primaryDevicePubKey') + ), + isKickedFromGroup: this.model.get('isKickedFromGroup'), + isBlocked: this.model.isBlocked(), + + timerOptions: Whisper.ExpirationTimerOptions.map(item => ({ + name: item.getName(), + value: item.get('seconds'), + })), + + onSetDisappearingMessages: seconds => + this.setDisappearingMessages(seconds), + + onGoBack: () => { + this.hideConversationRight(); + }, + + onUpdateGroupName: () => { + window.Whisper.events.trigger('updateGroupName', this.model); + }, + onUpdateGroupMembers: () => { + window.Whisper.events.trigger('updateGroupMembers', this.model); + }, + + onLeaveGroup: () => { + window.Whisper.events.trigger('leaveGroup', this.model); + }, + + onInviteContacts: () => { + window.Whisper.events.trigger('inviteContacts', this.model); + }, + onShowLightBox: (lightBoxOptions = {}) => { + this.showChannelLightbox(lightBoxOptions); + }, + }; + }; this.titleView = new Whisper.ReactWrapperView({ className: 'title-wrapper', - Component: window.Signal.Components.ConversationHeader, + Component: window.Signal.Components.ConversationHeaderWithDetails, props: getHeaderProps(), }); this.updateHeader = () => this.titleView.update(getHeaderProps()); @@ -284,15 +338,37 @@ this.hideConversationRight = () => { this.$('.conversation-content-right').css({ - 'margin-right': '-22vw', + 'margin-inline-end': '-22vw', }); }; this.showConversationRight = () => { this.$('.conversation-content-right').css({ - 'margin-right': '0vw', + 'margin-inline-end': '0vw', }); }; + this.showGroupSettings = () => { + if (!this.groupSettings) { + this.groupSettings = new Whisper.ReactWrapperView({ + className: 'group-settings', + Component: window.Signal.Components.SessionRightPanelWithDetails, + props: getGroupSettingsProps(this.model), + }); + this.$('.conversation-content-right').append(this.groupSettings.el); + this.updateGroupSettingsPanel = () => + this.groupSettings.update(getGroupSettingsProps(this.model)); + this.listenTo(this.model, 'change', this.updateGroupSettingsPanel); + } else { + this.groupSettings.update(getGroupSettingsProps(this.model)); + } + + this.showConversationRight(); + }; + + this.hideGroupSettings = () => { + this.showConversationRight(); + }; + this.memberView.render(); this.bulkEditView = new Whisper.BulkEditView({ @@ -307,7 +383,7 @@ this.window.addEventListener('resize', this.onResize); this.onFocus = () => { - if (this.$el.css('display') !== 'none') { + if (!this.isHidden()) { this.markRead(); } }; @@ -620,9 +696,13 @@ const { sender } = mostRecent; const contact = ConversationController.getOrCreate(sender, 'private'); + // we need the opposite theme + const color = + window.Events.getThemeSetting() === 'light' ? 'dark' : 'light'; const props = { ...contact.format(), conversationType: this.model.isPrivate() ? 'direct' : 'group', + color, }; if (this.typingBubbleView) { @@ -643,16 +723,17 @@ }, async toggleMicrophone() { - const allowMicrophone = await window.getMediaPermissions(); - if ( - !allowMicrophone || - this.$('.send-message').val().length > 0 || - this.fileInput.hasFiles() - ) { - this.$('.capture-audio').hide(); - } else { - this.$('.capture-audio').show(); - } + // FIXME audric hide microphone for now until refactor branch is merged + // const allowMicrophone = await window.getMediaPermissions(); + // if ( + // !allowMicrophone || + // this.$('.send-message').val().length > 0 || + // this.fileInput.hasFiles() + // ) { + this.$('.capture-audio').hide(); + // } else { + // this.$('.capture-audio').show(); + // } }, captureAudio(e) { e.preventDefault(); @@ -1157,6 +1238,7 @@ contact.getTitle(), contact.getTitle(), ]), + messageSub: i18n('youMayWishToVerifyContact'), okText: i18n('sendAnyway'), resolve: async () => { await contact.updateVerified(); @@ -1274,12 +1356,16 @@ // If removable from server, we "Unsend" - otherwise "Delete" let title; if (isPublic) { - title = multiple ? i18n('unsendMessages') : i18n('unsendMessage'); + title = multiple + ? i18n('deleteMessagesForEveryone') + : i18n('deleteMessageForEveryone'); } else { title = multiple ? i18n('deleteMessages') : i18n('deleteMessage'); } - const okText = isServerDeletable ? i18n('unsend') : i18n('delete'); + const okText = isServerDeletable + ? i18n('deleteForEveryone') + : i18n('delete'); window.confirmationDialog({ title, @@ -1391,14 +1477,14 @@ Signal.Backbone.Views.Lightbox.show(this.lightboxGalleryView.el); }, - showMessageDetail(message) { + async showMessageDetail(message) { const onClose = () => { this.stopListening(message, 'change', update); this.resetPanel(); this.updateHeader(); }; - const props = message.getPropsForMessageDetail(); + const props = await message.getPropsForMessageDetail(); const view = new Whisper.ReactWrapperView({ className: 'message-detail-wrapper', Component: Signal.Components.MessageDetail, @@ -1406,7 +1492,8 @@ onClose, }); - const update = () => view.update(message.getPropsForMessageDetail()); + const update = async () => + view.update(await message.getPropsForMessageDetail()); this.listenTo(message, 'change', update); this.listenTo(message, 'expired', onClose); // We could listen to all involved contacts, but we'll call that overkill @@ -2548,7 +2635,8 @@ isHidden() { return ( - this.$el.css('display') === 'none' || + (this.$el.css('display') !== 'none' && + this.$el.css('display') !== '') || this.$('.panel').css('display') === 'none' ); }, diff --git a/js/views/create_group_dialog_view.js b/js/views/create_group_dialog_view.js index c9d00af96..ddc183d2e 100644 --- a/js/views/create_group_dialog_view.js +++ b/js/views/create_group_dialog_view.js @@ -12,7 +12,8 @@ this.groupName = groupConvo.get('name'); this.conversation = groupConvo; - this.titleText = i18n('updateGroupDialogTitle'); + this.titleText = i18n('updateGroupDialogTitle', this.groupName); + this.close = this.close.bind(this); this.onSubmit = this.onSubmit.bind(this); this.isPublic = groupConvo.isPublic(); @@ -20,16 +21,13 @@ this.members = groupConvo.get('members') || []; this.avatarPath = groupConvo.getAvatarPath(); - const ourPK = textsecure.storage.user.getNumber(); - - this.isAdmin = groupConvo.get('groupAdmins').includes(ourPK); + // any member can update a closed group name + this.isAdmin = true; // public chat settings overrides if (this.isPublic) { // fix the title - this.titleText = `${i18n('updatePublicGroupDialogTitle')}: ${ - this.groupName - }`; + this.titleText = i18n('updateGroupDialogTitle', this.groupName); // I'd much prefer to integrate mods with groupAdmins // but lets discuss first... this.isAdmin = groupConvo.isModerator( @@ -47,6 +45,7 @@ props: { titleText: this.titleText, isPublic: this.isPublic, + pubkey: this.groupId, groupName: this.groupName, okText: i18n('ok'), cancelText: i18n('cancel'), @@ -79,7 +78,6 @@ Whisper.UpdateGroupMembersDialogView = Whisper.View.extend({ className: 'loki-dialog modal', initialize(groupConvo) { - const ourPK = textsecure.storage.user.getNumber(); this.groupName = groupConvo.get('name'); this.close = this.close.bind(this); this.onSubmit = this.onSubmit.bind(this); @@ -88,9 +86,7 @@ this.avatarPath = groupConvo.getAvatarPath(); if (this.isPublic) { - this.titleText = `${i18n('updatePublicGroupDialogTitle')}: ${ - this.groupName - }`; + this.titleText = i18n('updateGroupDialogTitle', this.groupName); // I'd much prefer to integrate mods with groupAdmins // but lets discuss first... this.isAdmin = groupConvo.isModerator( @@ -100,8 +96,12 @@ this.contactsAndMembers = []; this.existingMembers = []; } else { - this.titleText = i18n('updateGroupDialogTitle'); - this.isAdmin = groupConvo.get('groupAdmins').includes(ourPK); + this.titleText = i18n('updateGroupDialogTitle', this.groupName); + // anybody can edit a closed group name or members + const ourPK = window.textsecure.storage.user.getNumber(); + this.isAdmin = groupConvo.isMediumGroup() + ? true + : groupConvo.get('groupAdmins').includes(ourPK); const convos = window.getConversations().models.filter(d => !!d); this.existingMembers = groupConvo.get('members') || []; diff --git a/js/views/edit_profile_dialog_view.js b/js/views/edit_profile_dialog_view.js index b96eabfec..cb1996753 100644 --- a/js/views/edit_profile_dialog_view.js +++ b/js/views/edit_profile_dialog_view.js @@ -8,21 +8,13 @@ Whisper.EditProfileDialogView = Whisper.View.extend({ className: 'loki-dialog modal', - initialize({ - profileName, - avatarPath, - avatarColor, - pubkey, - onOk, - callback, - }) { + initialize({ profileName, avatarPath, pubkey, onOk, callback }) { this.close = this.close.bind(this); this.callback = callback; this.profileName = profileName; this.pubkey = pubkey; this.avatarPath = avatarPath; - this.avatarColor = avatarColor; this.onOk = onOk; this.$el.focus(); diff --git a/js/views/identicon_svg_view.js b/js/views/identicon_svg_view.js index 996a57605..0acf9c83b 100644 --- a/js/views/identicon_svg_view.js +++ b/js/views/identicon_svg_view.js @@ -13,7 +13,6 @@ templateName: 'identicon-svg', initialize(options) { this.render_attributes = options; - this.render_attributes.color = COLORS[this.render_attributes.color]; }, getSVGUrl() { const html = this.render().$el.html(); @@ -40,19 +39,4 @@ }); }, }); - - const COLORS = { - red: '#cc163d', - deep_orange: '#c73800', - brown: '#746c53', - pink: '#a23474', - purple: '#862caf', - indigo: '#5951c8', - blue: '#336ba3', - teal: '#067589', - green: '#3b7845', - light_green: '#1c8260', - blue_grey: '#895d66', - grey: '#6b6b78', - }; })(); diff --git a/js/views/import_view.js b/js/views/import_view.js index ee1d88cbb..5b733f7b0 100644 --- a/js/views/import_view.js +++ b/js/views/import_view.js @@ -44,7 +44,7 @@ Whisper.ImportView = Whisper.View.extend({ templateName: 'import-flow-template', - className: 'full-screen-flow', + // className: 'full-screen-flow', events: { 'click .choose': 'onImport', 'click .restart': 'onRestart', diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js index ab78cabf3..61ae084c4 100644 --- a/js/views/inbox_view.js +++ b/js/views/inbox_view.js @@ -100,11 +100,6 @@ model: { window: options.window }, }); - if (!window.storage.get('betaReleaseDisclaimerAccepted')) { - // Beta disclaimer disabled. - // this.showBetaReleaseDisclaimer(); - } - if (!options.initialLoadComplete) { this.appLoadingScreen = new Whisper.AppLoadingScreen(); this.appLoadingScreen.render(); @@ -143,12 +138,10 @@ }); // FIXME: Fix this for new react views - this.updateInboxSectionUnread(); this.setupLeftPane(); }, render_attributes: { welcomeToSession: i18n('welcomeToSession'), - selectAContact: i18n('selectAContact'), }, events: { click: 'onClick', @@ -293,14 +286,14 @@ return { msg }; }, - async handleMessageSentSuccess(sentMessage) { + async handleMessageSentSuccess(sentMessage, wrappedEnvelope) { const fetchedData = await this.fetchHandleMessageSentData(sentMessage); if (!fetchedData) { return; } const { msg } = fetchedData; - msg.handleMessageSentSuccess(sentMessage); + msg.handleMessageSentSuccess(sentMessage, wrappedEnvelope); }, async handleMessageSentFailure(sentMessage, error) { @@ -408,24 +401,6 @@ } this.$('.conversation:first .recorder').trigger('close'); }, - updateInboxSectionUnread() { - // FIXME: Fix this for new react views - // const $section = this.$('.section-conversations-unread-counter'); - // const models = - // (this.inboxListView.collection && - // this.inboxListView.collection.models) || - // []; - // const unreadCount = models.reduce( - // (count, m) => count + Math.max(0, m.get('unreadCount')), - // 0 - // ); - // $section.text(unreadCount); - // if (unreadCount > 0) { - // $section.show(); - // } else { - // $section.hide(); - // } - }, onClick(e) { this.closeRecording(e); }, @@ -436,10 +411,6 @@ toast.$el.appendTo(this.$('.gutter')); toast.render(); }, - showBetaReleaseDisclaimer() { - const dialog = new Whisper.BetaReleaseDisclaimer(); - this.el.append(dialog.el); - }, }); Whisper.ExpiredAlertBanner = Whisper.View.extend({ diff --git a/js/views/install_view.js b/js/views/install_view.js deleted file mode 100644 index b45257f40..000000000 --- a/js/views/install_view.js +++ /dev/null @@ -1,202 +0,0 @@ -/* global Whisper, i18n, getAccountManager, $, textsecure, QRCode */ - -/* eslint-disable more/no-then */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - const Steps = { - INSTALL_SIGNAL: 2, - SCAN_QR_CODE: 3, - ENTER_NAME: 4, - PROGRESS_BAR: 5, - TOO_MANY_DEVICES: 'TooManyDevices', - NETWORK_ERROR: 'NetworkError', - }; - - const DEVICE_NAME_SELECTOR = 'input.device-name'; - const CONNECTION_ERROR = -1; - const TOO_MANY_DEVICES = 411; - - Whisper.InstallView = Whisper.View.extend({ - templateName: 'link-flow-template', - className: 'main full-screen-flow', - events: { - 'click .try-again': 'connect', - 'click .finish': 'finishLinking', - // the actual next step happens in confirmNumber() on submit form #link-phone - }, - initialize(options = {}) { - this.selectStep(Steps.SCAN_QR_CODE); - this.connect(); - this.on('disconnected', this.reconnect); - - // Keep data around if it's a re-link, or the middle of a light import - this.shouldRetainData = - Whisper.Registration.everDone() || options.hasExistingData; - }, - render_attributes() { - let errorMessage; - - if (this.error) { - if ( - this.error.name === 'HTTPError' && - this.error.code === TOO_MANY_DEVICES - ) { - errorMessage = i18n('installTooManyDevices'); - } else if ( - this.error.name === 'HTTPError' && - this.error.code === CONNECTION_ERROR - ) { - errorMessage = i18n('installConnectionFailed'); - } else if (this.error.message === 'websocket closed') { - // AccountManager.registerSecondDevice uses this specific - // 'websocket closed' error message - errorMessage = i18n('installConnectionFailed'); - } - - return { - isError: true, - errorHeader: 'Something went wrong!', - errorMessage, - errorButton: 'Try again', - }; - } - - return { - isStep3: this.step === Steps.SCAN_QR_CODE, - linkYourPhone: i18n('linkYourPhone'), - signalSettings: i18n('signalSettings'), - linkedDevices: i18n('linkedDevices'), - androidFinalStep: i18n('plusButton'), - appleFinalStep: i18n('linkNewDevice'), - - isStep4: this.step === Steps.ENTER_NAME, - chooseName: i18n('chooseDeviceName'), - finishLinkingPhoneButton: i18n('finishLinkingPhone'), - - isStep5: this.step === Steps.PROGRESS_BAR, - syncing: i18n('initialSync'), - }; - }, - selectStep(step) { - this.step = step; - this.render(); - }, - connect() { - this.error = null; - this.selectStep(Steps.SCAN_QR_CODE); - this.clearQR(); - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - - const accountManager = getAccountManager(); - - accountManager - .registerSecondDevice( - this.setProvisioningUrl.bind(this), - this.confirmNumber.bind(this) - ) - .catch(this.handleDisconnect.bind(this)); - }, - handleDisconnect(error) { - window.log.error( - 'provisioning failed', - error && error.stack ? error.stack : error - ); - - this.error = error; - this.render(); - - if (error.message === 'websocket closed') { - this.trigger('disconnected'); - } else if ( - error.name !== 'HTTPError' || - (error.code !== CONNECTION_ERROR && error.code !== TOO_MANY_DEVICES) - ) { - throw error; - } - }, - reconnect() { - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - this.timeout = setTimeout(this.connect.bind(this), 10000); - }, - clearQR() { - this.$('#qr img').remove(); - this.$('#qr canvas').remove(); - this.$('#qr .container').show(); - this.$('#qr').removeClass('ready'); - }, - setProvisioningUrl(url) { - if ($('#qr').length === 0) { - window.log.error('Did not find #qr element in the DOM!'); - return; - } - - this.$('#qr .container').hide(); - this.qr = new QRCode(this.$('#qr')[0]).makeCode(url); - this.$('#qr').removeAttr('title'); - this.$('#qr').addClass('ready'); - }, - setDeviceNameDefault() { - const deviceName = textsecure.storage.user.getDeviceName(); - - this.$(DEVICE_NAME_SELECTOR).val(deviceName || window.getHostName()); - this.$(DEVICE_NAME_SELECTOR).focus(); - }, - finishLinking() { - // We use a form so we get submit-on-enter behavior - this.$('#link-phone').submit(); - }, - confirmNumber() { - const tsp = textsecure.storage.protocol; - - window.removeSetupMenuItems(); - this.selectStep(Steps.ENTER_NAME); - this.setDeviceNameDefault(); - - return new Promise(resolve => { - this.$('#link-phone').submit(e => { - e.stopPropagation(); - e.preventDefault(); - - let name = this.$(DEVICE_NAME_SELECTOR).val(); - name = name.replace(/\0/g, ''); // strip unicode null - if (name.trim().length === 0) { - this.$(DEVICE_NAME_SELECTOR).focus(); - return null; - } - - this.selectStep(Steps.PROGRESS_BAR); - - const finish = () => resolve(name); - - // Delete all data from database unless we're in the middle - // of a re-link, or we are finishing a light import. Without this, - // app restarts at certain times can cause weird things to happen, - // like data from a previous incomplete light import showing up - // after a new install. - if (this.shouldRetainData) { - return finish(); - } - - return tsp.removeAllData().then(finish, error => { - window.log.error( - 'confirmNumber: error clearing database', - error && error.stack ? error.stack : error - ); - finish(); - }); - }); - }); - }, - }); -})(); diff --git a/js/views/invite_contacts_dialog_view.js b/js/views/invite_contacts_dialog_view.js index 826dd34a9..a79adc2dc 100644 --- a/js/views/invite_contacts_dialog_view.js +++ b/js/views/invite_contacts_dialog_view.js @@ -80,12 +80,9 @@ // Do not trigger an update if there is too many members if ( newMembers.length + existingMembers.length > - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT + window.CONSTANTS.MEDIUM_GROUP_SIZE_LIMIT ) { - const msg = window.i18n( - 'maxGroupMembersError', - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - ); + const msg = window.i18n('closedGroupMaxSize'); window.pushToast({ title: msg, diff --git a/js/views/last_seen_indicator_view.js b/js/views/last_seen_indicator_view.js index 12049d59e..de475aff5 100644 --- a/js/views/last_seen_indicator_view.js +++ b/js/views/last_seen_indicator_view.js @@ -25,7 +25,7 @@ render_attributes() { const unreadMessages = this.count === 1 - ? i18n('unreadMessage') + ? i18n('unreadMessage', [this.count]) : i18n('unreadMessages', [this.count]); return { diff --git a/js/views/message_list_view.js b/js/views/message_list_view.js index 84a8d58bc..13ac989d5 100644 --- a/js/views/message_list_view.js +++ b/js/views/message_list_view.js @@ -55,7 +55,7 @@ this.triggerLazyScroll(); }, atBottom() { - return this.bottomOffset < 30; + return this.bottomOffset ? this.bottomOffset < 30 : true; }, measureScrollPosition() { if (this.el.scrollHeight === 0) { diff --git a/js/views/network_status_view.js b/js/views/network_status_view.js index de5034f19..a780f87cd 100644 --- a/js/views/network_status_view.js +++ b/js/views/network_status_view.js @@ -50,8 +50,6 @@ let message = ''; let instructions = ''; let hasInterruption = false; - let action = null; - let buttonClass = null; const socketStatus = this.getSocketStatus(); switch (socketStatus) { @@ -72,7 +70,7 @@ // Intentional fallthrough default: { const markOffline = () => { - message = i18n('disconnected'); + message = i18n('offline'); instructions = i18n('checkNetworkConnection'); hasInterruption = true; }; @@ -106,20 +104,14 @@ hasInterruption = true; message = i18n('offline'); instructions = i18n('checkNetworkConnection'); - } else if (!Whisper.Registration.isDone()) { - hasInterruption = true; - message = i18n('unlinked'); - instructions = i18n('unlinkedWarning'); - action = i18n('relink'); - buttonClass = 'openInstaller'; } return { message, instructions, hasInterruption, - action, - buttonClass, + action: null, + buttonClass: null, }; }, update() { diff --git a/js/views/qr_dialog_view.js b/js/views/qr_dialog_view.js deleted file mode 100644 index 6019f87c9..000000000 --- a/js/views/qr_dialog_view.js +++ /dev/null @@ -1,36 +0,0 @@ -/* global Whisper */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - Whisper.QRDialogView = Whisper.View.extend({ - className: 'loki-dialog qr-dialog modal', - initialize(options) { - this.value = options.value || ''; - this.close = this.close.bind(this); - - this.render(); - }, - - render() { - this.dialogView = new Whisper.ReactWrapperView({ - className: 'qr-dialog-wrapper', - Component: window.Signal.Components.SessionQRModal, - props: { - value: this.value, - onClose: this.close, - }, - }); - - this.$el.append(this.dialogView.el); - return this; - }, - - close() { - this.remove(); - }, - }); -})(); diff --git a/js/views/session_confirm_view.js b/js/views/session_confirm_view.js index ae31cec29..a86fd3017 100644 --- a/js/views/session_confirm_view.js +++ b/js/views/session_confirm_view.js @@ -21,6 +21,8 @@ okTheme: options.okTheme, closeTheme: options.closeTheme, hideCancel: options.hideCancel, + sessionIcon: options.sessionIcon, + iconSize: options.iconSize, }; }, diff --git a/js/views/user_details_dialog_view.js b/js/views/user_details_dialog_view.js index 98c164691..d86340cfb 100644 --- a/js/views/user_details_dialog_view.js +++ b/js/views/user_details_dialog_view.js @@ -11,7 +11,6 @@ initialize({ profileName, avatarPath, - avatarColor, pubkey, isRss, onOk, @@ -23,7 +22,6 @@ this.pubkey = pubkey; this.isRss = isRss; this.avatarPath = avatarPath; - this.avatarColor = avatarColor; this.onOk = onOk; this.onStartConversation = onStartConversation; diff --git a/libloki/modules/mnemonic.d.ts b/libloki/modules/mnemonic.d.ts new file mode 100644 index 000000000..75c47462c --- /dev/null +++ b/libloki/modules/mnemonic.d.ts @@ -0,0 +1,6 @@ +export interface RecoveryPhraseUtil { + mn_encode(str: string, wordset_name: string): string; + mn_decode(str: string, wordset_name: string): string; + get_languages(): Array; + pubkey_to_secret_words(pubKey?: string): string; +} diff --git a/libtextsecure/account_manager.js b/libtextsecure/account_manager.js index 790584a5f..b30778621 100644 --- a/libtextsecure/account_manager.js +++ b/libtextsecure/account_manager.js @@ -127,7 +127,7 @@ return this.queueTask(() => generateKeypair().then(async identityKeyPair => createAccount(identityKeyPair) - .then(() => this.saveMnemonic(mnemonic)) + .then(() => this.saveRecoveryPhrase(mnemonic)) .then(clearSessionsAndPreKeys) .then(generateKeys) .then(confirmKeys) @@ -507,10 +507,10 @@ const hex = StringView.arrayBufferToHex(seed); return mnemonic.mn_encode(hex, language); }, - getCurrentMnemonic() { + getCurrentRecoveryPhrase() { return textsecure.storage.get('mnemonic'); }, - saveMnemonic(mnemonic) { + saveRecoveryPhrase(mnemonic) { return textsecure.storage.put('mnemonic', mnemonic); }, async registrationDone(number, displayName) { diff --git a/libtextsecure/sendmessage.js b/libtextsecure/sendmessage.js index 7ecc67971..0364b5b17 100644 --- a/libtextsecure/sendmessage.js +++ b/libtextsecure/sendmessage.js @@ -1,4 +1,4 @@ -/* global textsecure, WebAPI, libsignal, window, libloki, _, libsession */ +/* global textsecure, WebAPI, window, libloki, _, libsession */ /* eslint-disable more/no-then, no-bitwise */ @@ -192,174 +192,6 @@ function MessageSender() { MessageSender.prototype = { constructor: MessageSender, - // makeAttachmentPointer :: Attachment -> Promise AttachmentPointerProto - async makeAttachmentPointer(attachment, publicServer = null, options = {}) { - const { isRaw = false, isAvatar = false } = options; - if (typeof attachment !== 'object' || attachment == null) { - return Promise.resolve(undefined); - } - - if ( - !(attachment.data instanceof ArrayBuffer) && - !ArrayBuffer.isView(attachment.data) - ) { - return Promise.reject( - new TypeError( - `\`attachment.data\` must be an \`ArrayBuffer\` or \`ArrayBufferView\`; got: ${typeof attachment.data}` - ) - ); - } - - const proto = new textsecure.protobuf.AttachmentPointer(); - let attachmentData; - const server = publicServer || this.server; - - if (publicServer || isRaw) { - attachmentData = attachment.data; - } else { - proto.key = libsignal.crypto.getRandomBytes(64); - const iv = libsignal.crypto.getRandomBytes(16); - const result = await textsecure.crypto.encryptAttachment( - attachment.data, - proto.key, - iv - ); - proto.digest = result.digest; - attachmentData = result.ciphertext; - } - - const result = isAvatar - ? await server.putAvatar(attachmentData) - : await server.putAttachment(attachmentData); - - if (!result) { - return Promise.reject( - new Error('Failed to upload data to attachment fileserver') - ); - } - const { url, id } = result; - proto.id = id; - proto.url = url; - proto.contentType = attachment.contentType; - - if (attachment.size) { - proto.size = attachment.size; - } - if (attachment.fileName) { - proto.fileName = attachment.fileName; - } - if (attachment.flags) { - proto.flags = attachment.flags; - } - if (attachment.width) { - proto.width = attachment.width; - } - if (attachment.height) { - proto.height = attachment.height; - } - if (attachment.caption) { - proto.caption = attachment.caption; - } - - return proto; - }, - - queueJobForNumber(number, runJob) { - const taskWithTimeout = textsecure.createTaskWithTimeout( - runJob, - `queueJobForNumber ${number}` - ); - - const runPrevious = this.pendingMessages[number] || Promise.resolve(); - this.pendingMessages[number] = runPrevious.then( - taskWithTimeout, - taskWithTimeout - ); - - const runCurrent = this.pendingMessages[number]; - runCurrent.then(() => { - if (this.pendingMessages[number] === runCurrent) { - delete this.pendingMessages[number]; - } - }); - }, - - uploadAttachments(message, publicServer) { - return Promise.all( - message.attachments.map(attachment => - this.makeAttachmentPointer(attachment, publicServer) - ) - ) - .then(attachmentPointers => { - // eslint-disable-next-line no-param-reassign - message.attachmentPointers = attachmentPointers; - }) - .catch(error => { - if (error instanceof Error && error.name === 'HTTPError') { - throw new textsecure.MessageError(message, error); - } else { - throw error; - } - }); - }, - - async uploadLinkPreviews(message, publicServer) { - try { - const preview = await Promise.all( - (message.preview || []).map(async item => ({ - ...item, - image: await this.makeAttachmentPointer(item.image, publicServer), - })) - ); - // eslint-disable-next-line no-param-reassign - message.preview = preview; - } catch (error) { - if (error instanceof Error && error.name === 'HTTPError') { - throw new textsecure.MessageError(message, error); - } else { - throw error; - } - } - }, - - uploadThumbnails(message, publicServer) { - const makePointer = this.makeAttachmentPointer.bind(this); - const { quote } = message; - - if (!quote || !quote.attachments || quote.attachments.length === 0) { - return Promise.resolve(); - } - - return Promise.all( - quote.attachments.map(attachment => { - const { thumbnail } = attachment; - if (!thumbnail) { - return null; - } - - return makePointer(thumbnail, publicServer).then(pointer => { - // eslint-disable-next-line no-param-reassign - attachment.attachmentPointer = pointer; - }); - }) - ).catch(error => { - if (error instanceof Error && error.name === 'HTTPError') { - throw new textsecure.MessageError(message, error); - } else { - throw error; - } - }); - }, - - uploadAvatar(attachment) { - // isRaw is true since the data is already encrypted - // and doesn't need to be encrypted again - return this.makeAttachmentPointer(attachment, null, { - isRaw: true, - isAvatar: true, - }); - }, - async sendContactSyncMessage(convos) { let convosToSync; if (!convos) { @@ -542,7 +374,6 @@ textsecure.MessageSender = function MessageSenderWrapper() { this.sendOpenGroupsSyncMessage = sender.sendOpenGroupsSyncMessage.bind( sender ); - this.uploadAvatar = sender.uploadAvatar.bind(sender); this.syncReadMessages = sender.syncReadMessages.bind(sender); this.syncVerification = sender.syncVerification.bind(sender); this.makeProxiedRequest = sender.makeProxiedRequest.bind(sender); diff --git a/libtextsecure/test/blanket_mocha.js b/libtextsecure/test/blanket_mocha.js index ccab29937..b7040f09d 100644 --- a/libtextsecure/test/blanket_mocha.js +++ b/libtextsecure/test/blanket_mocha.js @@ -4472,7 +4472,7 @@ _blanket.extend({ })(blanket); blanket.defaultReporter = function(coverage){ - var cssSytle = "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-left:50px; width:150px; float:right} .bl-nb {padding-right:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", + var cssSytle = "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-inline-start:50px; width:150px; float:right} .bl-nb {padding-inline-end:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", successRate = 60, head = document.head, fileNumber = 0, @@ -5237,73 +5237,73 @@ _blanket.extend({ })(blanket); -(function() { - - if(!mocha) { - throw new Exception("mocha library does not exist in global namespace!"); - } - - - /* - * Mocha Events: - * - * - `start` execution started - * - `end` execution complete - * - `suite` (suite) test suite execution started - * - `suite end` (suite) all tests (and sub-suites) have finished - * - `test` (test) test execution started - * - `test end` (test) test completed - * - `hook` (hook) hook execution started - * - `hook end` (hook) hook complete - * - `pass` (test) test passed - * - `fail` (test, err) test failed - * - */ - - var OriginalReporter = mocha._reporter; - - var BlanketReporter = function(runner) { - runner.on('start', function() { - blanket.setupCoverage(); - }); - - runner.on('end', function() { - blanket.onTestsDone(); - }); - - runner.on('suite', function() { - blanket.onModuleStart(); - }); - - runner.on('test', function() { - blanket.onTestStart(); - }); - - runner.on('test end', function(test) { - blanket.onTestDone(test.parent.tests.length, test.state === 'passed'); - }); - - // NOTE: this is an instance of BlanketReporter - new OriginalReporter(runner); - }; - - BlanketReporter.prototype = OriginalReporter.prototype; - - mocha.reporter(BlanketReporter); - - var oldRun = mocha.run, - oldCallback = null; - - mocha.run = function (finishCallback) { - oldCallback = finishCallback; - console.log("waiting for blanket..."); - }; - blanket.beforeStartTestRunner({ - callback: function(){ - if (!blanket.options("existingRequireJS")){ - oldRun(oldCallback); - } - mocha.run = oldRun; - } - }); -})(); +(function() { + + if(!mocha) { + throw new Exception("mocha library does not exist in global namespace!"); + } + + + /* + * Mocha Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * + */ + + var OriginalReporter = mocha._reporter; + + var BlanketReporter = function(runner) { + runner.on('start', function() { + blanket.setupCoverage(); + }); + + runner.on('end', function() { + blanket.onTestsDone(); + }); + + runner.on('suite', function() { + blanket.onModuleStart(); + }); + + runner.on('test', function() { + blanket.onTestStart(); + }); + + runner.on('test end', function(test) { + blanket.onTestDone(test.parent.tests.length, test.state === 'passed'); + }); + + // NOTE: this is an instance of BlanketReporter + new OriginalReporter(runner); + }; + + BlanketReporter.prototype = OriginalReporter.prototype; + + mocha.reporter(BlanketReporter); + + var oldRun = mocha.run, + oldCallback = null; + + mocha.run = function (finishCallback) { + oldCallback = finishCallback; + console.log("waiting for blanket..."); + }; + blanket.beforeStartTestRunner({ + callback: function(){ + if (!blanket.options("existingRequireJS")){ + oldRun(oldCallback); + } + mocha.run = oldRun; + } + }); +})(); diff --git a/main.js b/main.js index f9bfb59c3..f6f33a645 100644 --- a/main.js +++ b/main.js @@ -513,12 +513,6 @@ function setupWithImport() { } } -function setupAsNewDevice() { - if (mainWindow) { - mainWindow.webContents.send('set-up-as-new-device'); - } -} - function setupAsStandalone() { if (mainWindow) { mainWindow.webContents.send('set-up-as-standalone'); @@ -607,7 +601,7 @@ function showAbout() { width: 500, height: 400, resizable: false, - title: locale.messages.aboutSignalDesktop.message, + title: locale.messages.about.message, autoHideMenuBar: true, backgroundColor: '#2090EA', show: false, @@ -649,7 +643,7 @@ async function showDebugLogWindow() { width: Math.max(size[0] - 100, WINDOW_SIZE.minWidth), height: Math.max(size[1] - 100, WINDOW_SIZE.minHeight), resizable: false, - title: locale.messages.signalDesktopPreferences.message, + title: locale.messages.debugLog.message, autoHideMenuBar: true, backgroundColor: '#FFFFFF', show: false, @@ -697,7 +691,7 @@ async function showPermissionsPopupWindow() { width: Math.min(400, size[0]), height: Math.min(150, size[1]), resizable: false, - title: locale.messages.signalDesktopPreferences.message, + title: locale.messages.permissions.message, autoHideMenuBar: true, backgroundColor: '#FFFFFF', show: false, @@ -874,7 +868,6 @@ function setupMenu(options) { openSupportPage, platform, setupWithImport, - setupAsNewDevice, setupAsStandalone, }); const template = createTemplate(menuOptions, locale.messages); @@ -994,7 +987,7 @@ ipc.on('draw-attention', () => { if (!mainWindow) { return; } - if (process.platform === 'win32' || process.platform === 'linux') { + if (process.platform === 'win32') { mainWindow.flashFrame(true); } }); diff --git a/package.json b/package.json index ee571b6fc..ea74bc0a1 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "session-desktop", "productName": "Session", "description": "Private messaging from your desktop", - "version": "1.2.1", + "version": "1.4.0", "license": "GPL-3.0", "author": { "name": "Loki Project", @@ -31,9 +31,9 @@ "test-lib-view": "NODE_ENV=test-lib yarn run start", "test-loki-view": "NODE_ENV=test-loki yarn run start", "test-electron": "yarn grunt test", - "test-integration": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js", - "test-node": "mocha --recursive --exit test/app test/modules ts/test libloki/test/node --timeout 10000", - "test-session": "mocha --recursive --exit ts/test/session --timeout 10000", + "test-integration": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --full-trace --timeout 10000 ts/test/session/integration/integration_itest.js", + "test-node": "mocha --recursive --exit --timeout 10000 test/app test/modules \"./ts/test/**/*_test.js\" libloki/test/node ", + "test-session": "mocha --recursive --exit ts/test/session/unit --full-trace --timeout 10000", "test-medium-groups": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js --grep 'senderkeys'", "test-groups": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js --grep 'Closed groups'", "eslint": "eslint --cache .", @@ -48,6 +48,7 @@ "tslint": "tslint --format stylish --project .", "format": "prettier --list-different --write `git ls-files --modified *.{css,js,json,scss,ts,tsx}` `git ls-files --modified ./**/*.{css,js,json,scss,ts,tsx}`", "format-full": "prettier --list-different --write \"*.{css,js,json,scss,ts,tsx}\" \"./**/*.{css,js,json,scss,ts,tsx}\"", + "format-full-check": "prettier --check \"*.{css,js,json,scss,ts,tsx}\" \"./**/*.{css,js,json,scss,ts,tsx}\"", "transpile": "tsc --incremental", "clean-transpile": "rimraf ts/**/*.js && rimraf ts/*.js", "pow-metrics": "node metrics_app.js localhost 9000", diff --git a/password.html b/password.html index 1f117737e..0d131e92b 100644 --- a/password.html +++ b/password.html @@ -16,7 +16,7 @@ - + @@ -25,10 +25,11 @@
-
- -
+ - +
+ diff --git a/permissions_popup.html b/permissions_popup.html index 17ef7a30f..239762e8b 100644 --- a/permissions_popup.html +++ b/permissions_popup.html @@ -19,20 +19,8 @@ - - diff --git a/preload.js b/preload.js index 7d6be586e..8eb25ab25 100644 --- a/preload.js +++ b/preload.js @@ -85,7 +85,7 @@ window.CONSTANTS = new (function() { this.MAX_LINKED_DEVICES = 1; this.MAX_CONNECTION_DURATION = 5000; // Limited due to the proof-of-work requirement - this.SMALL_GROUP_SIZE_LIMIT = 10; + this.MEDIUM_GROUP_SIZE_LIMIT = 20; // Number of seconds to turn on notifications after reconnect/start of app this.NOTIFICATION_ENABLE_TIMEOUT_SECONDS = 10; this.SESSION_ID_LENGTH = 66; @@ -230,10 +230,6 @@ ipc.on('set-up-with-import', () => { Whisper.events.trigger('setupWithImport'); }); -ipc.on('set-up-as-new-device', () => { - Whisper.events.trigger('setupAsNewDevice'); -}); - ipc.on('set-up-as-standalone', () => { Whisper.events.trigger('setupAsStandalone'); }); @@ -344,10 +340,10 @@ const { OnionAPI } = require('./ts/session/onions'); window.OnionAPI = OnionAPI; if (process.env.USE_STUBBED_NETWORK) { - const StubMessageAPI = require('./integration_test/stubs/stub_message_api'); + const StubMessageAPI = require('./ts/test/session/integration/stubs/stub_message_api'); window.LokiMessageAPI = StubMessageAPI; - const StubAppDotNetAPI = require('./integration_test/stubs/stub_app_dot_net_api'); + const StubAppDotNetAPI = require('./ts/test/session/integration/stubs/stub_app_dot_net_api'); window.LokiAppDotNetServerAPI = StubAppDotNetAPI; } else { window.LokiMessageAPI = require('./js/modules/loki_message_api'); @@ -357,6 +353,7 @@ if (process.env.USE_STUBBED_NETWORK) { window.LokiPublicChatAPI = require('./js/modules/loki_public_chat_api'); window.LokiFileServerAPI = require('./js/modules/loki_file_server_api'); +window.LokiPushNotificationServerApi = require('./js/modules/loki_push_notification_server_api'); window.mnemonic = require('./libloki/modules/mnemonic'); const WorkerInterface = require('./js/modules/util_worker_interface'); @@ -427,6 +424,7 @@ window.addEventListener('contextmenu', e => { }); window.NewReceiver = require('./ts/receiver/receiver'); +window.DataMessageReceiver = require('./ts/receiver/dataMessage'); window.NewSnodeAPI = require('./ts/session/snode_api/serviceNodeAPI'); window.SnodePool = require('./ts/session/snode_api/snodePool'); @@ -456,7 +454,7 @@ window.lokiFeatureFlags = { useSnodeProxy: !process.env.USE_STUBBED_NETWORK, useOnionRequests: true, useFileOnionRequests: true, - enableSenderKeys: false, + enableSenderKeys: true, onionRequestHops: 3, debugMessageLogs: process.env.ENABLE_MESSAGE_LOGS, useMultiDevice: false, @@ -498,6 +496,9 @@ if (config.environment.includes('test-integration')) { enableSenderKeys: true, useMultiDevice: false, }; + /* eslint-disable global-require, import/no-extraneous-dependencies */ + window.sinon = require('sinon'); + /* eslint-enable global-require, import/no-extraneous-dependencies */ } // Blocking @@ -507,7 +508,6 @@ const { } = require('./ts/util/blockedNumberController'); window.BlockedNumberController = BlockedNumberController; - window.deleteAccount = async reason => { try { window.log.info('Deleting everything!'); diff --git a/protos/SignalService.proto b/protos/SignalService.proto index 54391519f..741d5ab8f 100644 --- a/protos/SignalService.proto +++ b/protos/SignalService.proto @@ -42,7 +42,7 @@ message Content { message MediumGroupCiphertext { optional bytes ciphertext = 1; - optional string source = 2; + optional bytes source = 2; optional uint32 keyIdx = 3; } @@ -55,9 +55,8 @@ message MediumGroupUpdate { enum Type { NEW = 0; // groupPublicKey, name, senderKeys, members, admins, groupPrivateKey INFO = 1; // groupPublicKey, name, senderKeys, members, admins - SENDER_KEY = 2; // groupPublicKey, senderKeys - SENDER_KEY_REQUEST = 3; // groupPublicKey - QUIT = 4; // groupPublicKey + SENDER_KEY_REQUEST = 2; // groupPublicKey + SENDER_KEY = 3; // groupPublicKey, senderKeys } message SenderKey { diff --git a/protos/UnidentifiedDelivery.proto b/protos/UnidentifiedDelivery.proto index 9b49b8c9b..ee7422d65 100644 --- a/protos/UnidentifiedDelivery.proto +++ b/protos/UnidentifiedDelivery.proto @@ -25,7 +25,7 @@ message UnidentifiedSenderMessage { enum Type { PREKEY_MESSAGE = 1; MESSAGE = 2; - LOKI_FRIEND_REQUEST = 3; + FALLBACK_MESSAGE = 3; } optional Type type = 1; diff --git a/session-file-server b/session-file-server index 52b77bf30..5173163fe 160000 --- a/session-file-server +++ b/session-file-server @@ -1 +1 @@ -Subproject commit 52b77bf3039aec88b3900e8a7ed6e62d30a4d0d4 +Subproject commit 5173163fe18ac575676020e2f8621cf7a2956df3 diff --git a/stylesheets/_avatar.scss b/stylesheets/_avatar.scss new file mode 100644 index 000000000..5cad1f342 --- /dev/null +++ b/stylesheets/_avatar.scss @@ -0,0 +1,132 @@ +// Module: Avatar + +.module-avatar { + position: relative; + vertical-align: middle; + display: inline-block; + border-radius: 50%; + + img { + object-fit: cover; + border-radius: 50%; + border: 1px solid $borderAvatarColor; + } +} + +.module-avatar__label { + width: 100%; + text-align: center; + font-weight: 300; + text-transform: uppercase; + color: $color-white; +} + +.module-avatar__icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.module-avatar__icon--crown-wrapper { + position: relative; + bottom: -38px; + right: -16px; + height: 21px; + width: 21px; + transform: translate(25%, 25%); + padding: 9%; + background-color: $color-white; + border-radius: 50%; + filter: drop-shadow(0px 0px 4px rgba(0, 0, 0, 0.3)); +} + +.module-avatar__icon--crown { + @include color-svg('../images/crown.svg', #ffb000); + height: 100%; + width: 100%; +} + +.module-avatar__icon-closed .module-avatar--28, +.module-avatar--28 { + height: 28px; + width: 28px; + + img { + height: 28px; + width: 28px; + } +} + +.module-avatar__icon-closed .module-avatar--36, +.module-avatar--36 { + height: 36px; + width: 36px; + + img { + height: 36px; + width: 36px; + } +} + +.module-avatar__icon-closed .module-avatar--48, +.module-avatar--48 { + height: 48px; + width: 48px; + + img { + height: 48px; + width: 48px; + } +} + +.module-avatar__icon-closed .module-avatar--64, +.module-avatar--64 { + height: 64px; + width: 64px; + + img { + height: 64px; + width: 64px; + } +} + +.module-avatar__icon-closed .module-avatar--80, +.module-avatar--80 { + height: 80px; + width: 80px; + + img { + height: 80px; + width: 80px; + } +} + +.module-avatar--300 { + height: 300px; + width: 300px; + + img { + height: 300px; + width: 300px; + } +} + +.module-avatar__icon--crown-wrapper { + background-color: $color-gray-75; +} + +.module-avatar__icon-closed { + .module-avatar:last-child { + position: absolute; + right: 0px; + bottom: 0px; + } +} + +.module-avatar-clickable { + transition: $session-transition-duration; + &:hover { + opacity: $session-subtle-factor; + } +} diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index 30ef2c0f5..8e546a1b7 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -29,19 +29,21 @@ display: flex; flex-direction: column; flex-grow: 1; + width: 100%; } .main.panel { + @include themify($themes) { + border-top: themed('sessionBorder'); + border-left: themed('sessionBorder'); + } + .discussion-container { flex-grow: 1; position: relative; max-width: 100%; margin: 0; - .bar-container { - height: 5px; - } - .message-list { -webkit-padding-start: 0px; position: absolute; @@ -111,20 +113,17 @@ } } -.session-message { - padding-left: 16px; - padding-right: 16px; -} - .public-chat-message-wrapper { - padding-left: 10px; - padding-right: 10px; + padding-inline-start: 10px; + padding-inline-end: 10px; } .session-message { display: flow-root; padding-bottom: 4px; padding-top: 4px; + padding-inline-start: 16px; + padding-inline-end: 16px; } .group-invitation-container { @@ -184,12 +183,12 @@ background-color: #00f782; color: white; padding: 6px 10px; - margin-left: 6px; + margin-inline-start: 6px; border-radius: 2px; box-shadow: none; user-select: none; cursor: pointer; - transition: 0.25s; + transition: $session-transition-duration; &:hover { background-color: #00d672; @@ -229,14 +228,14 @@ padding: 18px; // This makes sure the message counter is right in the center width: 80px; - margin-right: -80px; + margin-inline-end: -80px; user-select: none; } .cancel-button { padding: 18px; width: 80px; - margin-left: -80px; + margin-inline-start: -80px; user-select: none; } @@ -245,8 +244,8 @@ display: flex; align-items: center; user-select: none; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } } @@ -260,18 +259,12 @@ padding-bottom: 40px; } -.bottom-bar .module-quote { - margin: 0; - - border-left-style: none; -} - // We need to use the wrapper because the conversation view calculates the height of all // things in the composition area. A margin on an inner div won't be included in that // height calculation. .bottom-bar .quote-wrapper { - margin-left: 37px; - margin-right: 73px; + margin-inline-start: 37px; + margin-inline-end: 73px; margin-top: 3px; margin-bottom: -5px; } @@ -294,16 +287,16 @@ .bottom-bar .preview-wrapper { margin-top: 3px; - margin-left: 37px; - margin-right: 73px; + margin-inline-start: 37px; + margin-inline-end: 73px; margin-bottom: 2px; } .bottom-bar { box-sizing: content-box; $button-width: 36px; - - form.active { + @include themify($themes) { + border-top: themed('sessionBorder'); } form.send { @@ -366,7 +359,7 @@ display: flex; flex-direction: row; align-items: center; - margin-bottom: 8px; + margin-bottom: 7px; padding: 0px 15px; .send-message { @@ -383,7 +376,6 @@ max-height: 100px; padding: 10px; border-radius: 4px; - background-color: $color-loki-light-gray; margin-top: 3px; margin-bottom: 6px; color: $color-light-90; @@ -393,6 +385,10 @@ resize: none; font-size: 1em; font-family: inherit; + + &[disabled='disabled'] { + cursor: not-allowed; + } } .capture-audio { float: right; @@ -424,234 +420,29 @@ box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.12), 0 0 0 0.5px rgba(0, 0, 0, 0.08); } -.confirmation-dialog { - .content { - max-width: 350px; - margin: 100px auto; - padding: 1em; - background: white; - border-radius: $border-radius; - overflow: auto; - box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3); - - .buttons { - margin-top: 10px; - - button { - float: right; - margin-left: 10px; - background-color: $grey_l; - border-radius: $border-radius; - padding: 5px 8px; - border: 1px solid $grey_l2; - - &:hover { - background-color: $grey_l2; - border-color: $grey_l3; - } - } - } - } -} - -.loki-dialog { - display: flex; - align-items: center; - justify-content: center; - - .content { - max-width: 75%; - min-width: 60%; - padding: 1em; - background: white; - border-radius: $border-radius; - overflow: auto; - box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3); - } - - button { - float: right; - margin-left: 10px; - background-color: $color-loki-green; - border-radius: 100px; - padding: 5px 15px; - border: 1px solid $color-loki-green; - color: white; - outline: none; - user-select: none; - - &:hover, - &:disabled { - background-color: $color-loki-green-dark; - border-color: $color-loki-green-dark; - } - - &:disabled { - cursor: not-allowed; - } - } - - input { - width: 100%; - padding: 8px; - margin-bottom: 15px; - border: 0; - outline: none; - border-radius: 4px; - background-color: $color-loki-light-gray; - - &:focus { - outline: none; - } - } - - h4 { - margin-top: 8px; - margin-bottom: 16px; - } -} - -.nickname-dialog { - .message { - font-style: italic; - color: $grey; - font-size: 12px; - margin-bottom: 16px; - } -} - -.seed-dialog { - .title { - font-weight: bold; - } - - .fields { - margin-top: 20px; - } - - .seed { - padding: 20px 0; - font-style: oblique; - } -} - -.permissions-popup, -.debug-log-window { - .modal { - background-color: transparent; - padding: 0; - } - - .confirmation-dialog .content { - box-shadow: 0px 0px 0px 0px; - max-width: 1000px; - margin: 0; - margin-left: auto; - margin-right: auto; - margin-top: 15px; - } -} - -.conversation-loading-screen { - z-index: 99; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - display: flex; - align-items: center; - background-color: $color-white; - - .content { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - - .container { - position: absolute; - left: 50%; - width: 120px; - transform: translate(-50%, 0); - } - - .dot { - width: 14px; - height: 14px; - border: 3px solid $blue; - border-radius: 50%; - float: left; - margin: 0 6px; - transform: scale(0); - - animation: loading 1500ms ease infinite 0ms; - &:nth-child(2) { - animation: loading 1500ms ease infinite 333ms; - } - &:nth-child(3) { - animation: loading 1500ms ease infinite 666ms; - } - } -} - .module-last-seen-indicator { padding-top: 25px; padding-bottom: 35px; - margin-left: 28px; - margin-right: 28px; -} + margin-inline-start: 28px; + margin-inline-end: 28px; -.module-last-seen-indicator__bar { - background-color: $color-light-60; - width: 100%; - height: 2px; -} + &__bar { + @include themify($themes) { + background-color: themed('lastSeenIndicatorColor'); + } + width: 100%; + height: 2px; + } -.module-last-seen-indicator__text { - margin-top: 3px; - font-size: 11px; - line-height: 16px; - letter-spacing: 0.3px; - text-transform: uppercase; - - text-align: center; - color: $color-light-90; -} - -.module-scroll-down { - z-index: 100; - position: absolute; - right: 20px; - bottom: 10px; -} - -.module-scroll-down__button { - height: 44px; - width: 44px; - border-radius: 22px; - text-align: center; - background-color: $color-light-35; - border: none; - box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.2); - outline: none; - - &:hover { - background-color: $color-light-45; + &__text { + margin-top: 3px; + font-size: 11px; + line-height: 16px; + letter-spacing: 0.3px; + text-transform: uppercase; + @include themify($themes) { + color: themed('lastSeenIndicatorTextColor'); + } + text-align: center; } } - -.module-scroll-down__button--new-messages { - background-color: $color-signal-blue; - - &:hover { - background-color: #1472bd; - } -} - -.module-scroll-down__icon { - @include color-svg('../images/down.svg', $color-white); - height: 100%; - width: 100%; -} diff --git a/stylesheets/_emoji.scss b/stylesheets/_emoji.scss index c9d46d00c..052fd0175 100644 --- a/stylesheets/_emoji.scss +++ b/stylesheets/_emoji.scss @@ -90,6 +90,7 @@ button.emoji { &:before { content: ''; + margin-top: 5px; display: inline-block; width: $button-height; height: $button-height; @@ -130,15 +131,4 @@ button.emoji { .ep-slide { background-color: $blue; } - .ep ::-webkit-scrollbar { - // matches what is set in _global.scss; needs !important to override emoji panel CSS - width: 9px !important; - } - .ep ::-webkit-scrollbar-thumb { - background: $color-light-35; - - &:hover { - background: $color-light-45; - } - } } diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index 89c8983bb..9d742c87f 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -1,3 +1,5 @@ +@import 'themes.scss'; + * { box-sizing: border-box; } @@ -11,31 +13,29 @@ body { height: 100%; width: 100%; margin: 0; - font-family: $roboto; + font-family: $session-font-default; font-size: 14px; - color: $color-light-90; } +// scrollbars ::-webkit-scrollbar { width: 9px; height: 9px; } -::-webkit-scrollbar-track { - background: $color-white; -} - ::-webkit-scrollbar-thumb { - background: $color-light-35; - border: 2px solid $color-white; - + @include themify($themes) { + background: themed('scrollBarThumb'); + border: solid 2px themed('textColorOpposite'); + } &:hover { background: $color-light-45; } } - -::-webkit-scrollbar-corner { - background: $color-white; +::-webkit-scrollbar-track { + @include themify($themes) { + background: themed('scrollBarTrack'); + } } audio { @@ -264,7 +264,7 @@ $loading-height: 16px; line-height: 36px; padding: 0 20px; background: $blue; - margin-left: 20px; + margin-inline-start: 20px; } .message { @@ -289,20 +289,18 @@ $loading-height: 16px; right: 0; top: 0; bottom: 0; - background-color: white; - color: $color-white; display: flex; align-items: center; user-select: none; .content { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; text-align: center; } .container { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; width: 78px; height: 22px; } @@ -330,544 +328,6 @@ $loading-height: 16px; } } -.full-screen-flow { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - font-family: roboto-light; - - &.overlay { - // .modal, used for the settings view, is 100 - z-index: 200; - } - - color: black; - a { - color: $blue; - } - background: linear-gradient( - to bottom, - /* (1 - 0.41) * 255 + 0.41 * 213*/ rgb(238, 238, 238) 0%, - /* (1 - 0.19) * 255 + 0.19 * 191*/ rgb(243, 243, 243) 12%, - rgb(255, 255, 255) 27%, - rgb(255, 255, 255) 60%, - /* (1 - 0.19) * 255 + 0.19 * 222*/ rgb(249, 249, 249) 85%, - /* (1 - 0.27) * 255 + 0.27 * 98 */ rgb(213, 213, 213) 100% - ); - display: flex; - align-items: center; - text-align: center; - - font-size: 10pt; - input { - margin-bottom: 1em; - font-size: 12pt; - font-family: roboto-light; - border: 2px solid $blue; - padding: 0.5em; - text-align: center; - width: 20em; - } - - @media (min-height: 750px) and (min-width: 700px) { - font-size: 14pt; - - input { - font-size: 16pt; - } - } - - #qr { - display: inline-block; - - &.ready { - border: 5px solid $blue; - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); - } - - img { - height: 20em; - border: 5px solid white; - } - - @media (max-height: 475px) { - img { - width: 8em; - height: 8em; - } - } - - .dot { - width: 14px; - height: 14px; - border: 3px solid $blue; - border-radius: 50%; - float: left; - margin: 0 6px; - transform: scale(0); - - animation: loading 1500ms ease infinite 0ms; - &:nth-child(2) { - animation: loading 1500ms ease infinite 333ms; - } - &:nth-child(3) { - animation: loading 1500ms ease infinite 666ms; - } - } - - canvas { - display: none; - } - } - - .os-icon { - height: 3em; - width: 3em; - vertical-align: text-bottom; - display: inline-block; - margin: 0.5em; - - &.apple { - @include color-svg('../images/apple.svg', black); - } - &.android { - @include color-svg('../images/android.svg', black); - } - } - - .header { - font-weight: normal; - margin-bottom: 1.5em; - - font-size: 20pt; - - @media (min-height: 750px) and (min-width: 700px) { - font-size: 28pt; - } - } - - .body-text { - max-width: 22em; - text-align: left; - margin-left: auto; - margin-right: auto; - } - .body-text-wide { - max-width: 30em; - text-align: left; - margin-left: auto; - margin-right: auto; - } - - form { - height: 100%; - width: 100%; - } - .step { - display: flex; - align-items: center; - min-width: 100%; - min-height: 100%; - margin: auto; - padding: 10px 0; - } - .step-body { - margin-left: auto; - margin-right: auto; - max-width: 35em; - } - - .inner { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - height: 100%; - width: 100%; - } - - .banner-image { - margin: 1em; - display: none; - - @media (min-height: 550px) { - display: inline-block; - height: 10em; - width: 10em; - } - } - - .banner-icon { - display: none; - margin: 1em; - - // 640px by 338px is the smallest the window can go - @media (min-height: 550px) { - display: inline-block; - height: 10em; - width: 10em; - } - - // generic - &.check-circle-outline { - @include color-svg('../images/check-circle-outline.svg', #dedede); - } - &.alert-outline { - @include color-svg('../images/alert-outline.svg', #dedede); - } - - // import and export - &.folder-outline { - @include color-svg('../images/folder-outline.svg', #dedede); - } - &.import { - @include color-svg('../images/import.svg', #dedede); - } - &.export { - @include color-svg('../images/export.svg', #dedede); - } - - // registration process - &.lead-pencil { - @include color-svg('../images/lead-pencil.svg', #dedede); - } - &.sync { - @include color-svg('../images/sync.svg', #dedede); - } - - // delete - &.alert-outline-red { - @include color-svg('../images/alert-outline.svg', red); - } - &.delete { - @include color-svg('../images/delete.svg', #dedede); - } - } - - .button { - cursor: pointer; - display: inline-block; - border: none; - min-width: 300px; - padding: 0.75em; - color: white; - background: $blue; - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); - user-select: none; - font-size: 12pt; - margin-top: 4px; - - &.neutral { - color: black; - background: #dedede; - } - &.destructive { - background: red; - } - - @media (min-height: 750px) and (min-width: 700px) { - font-size: 20pt; - } - } - a.link { - display: block; - cursor: pointer; - text-decoration: underline; - margin: 0.5em; - color: #2090ea; - } - - .progress { - text-align: center; - padding: 1em; - width: 80%; - margin: auto; - - .bar-container { - height: 1em; - margin: 1em; - background-color: $grey_l; - } - .bar { - width: 100%; - height: 100%; - background-color: $blue_l; - transition: width 0.25s; - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); - } - } - - .nav { - width: 100%; - bottom: 50px; - margin-top: auto; - padding-bottom: 2em; - padding-left: 20px; - padding-right: 20px; - - .instructions { - text-align: left; - margin-left: auto; - margin-right: auto; - margin-bottom: 2em; - margin-top: 2em; - max-width: 30em; - } - .instructions:after { - clear: both; - } - .android { - float: left; - } - .apple { - float: right; - } - .label { - float: left; - } - .body { - float: left; - } - } -} - -.standalone-fullscreen { - background: $color-dark-85; - overflow-y: auto; -} - -.standalone { - color: $color-dark-05; - height: auto; - padding: 0; - background: inherit; - - ::-webkit-scrollbar-track { - background: $color-dark-85; - } - - ::-webkit-scrollbar-thumb { - border: 2px solid $color-dark-85; - } - - .step-body { - width: 80%; - min-width: 100px; - max-width: none; - } - - .section-toggle { - background: $color-dark-75; - - &:first-of-type { - border-radius: 8px 8px 0 0; - } - - &:last-of-type { - border-radius: 0 0 8px 8px; - } - } - - .section-toggle-visible:last-of-type { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - } - - .section-content { - padding: 1em 0; - background-color: $color-dark-72; - - &:last-of-type { - border-radius: 0 0 8px 8px; - } - } - - #display-name { - font-weight: bold; - font-size: 25px; - border-radius: 100px; - - &:focus { - outline: none; - } - } - - #status { - margin-top: 12px; - } - - .standalone-mnemonic-inputs { - display: flex; - flex-direction: row; - align-items: center; - margin: 0 8px; - - input { - flex: 1; - margin: 0; - margin-right: 12px; - } - } - - input { - border: 1px solid $color-light-60; - border-radius: 4px; - - &:focus { - outline: solid 1px $blue; - } - } - - .button { - background: $color-loki-green-gradient; - border-radius: 100px; - - &:disabled, - &:disabled:hover { - background: $color-loki-dark-gray; - cursor: default; - } - } - - #mnemonic-display { - margin: 2em 8px; - font-size: 16px; - font-style: italic; - } - - .standalone-register-warning { - font-weight: bold; - font-size: 16px; - margin: 0px 8px; - } - - .standalone-register-language { - display: flex; - align-items: center; - justify-content: center; - margin-top: 2em; - - &.restore { - margin-bottom: 2em; - } - - span { - margin-right: 8px; - } - } - - .input-header { - margin-bottom: 8px; - font-size: 14px; - } - - .button.grey { - background: $grey; - } - - .buttons { - margin-top: 24px; - } - - .select-container { - position: relative; - display: block; - width: 13em; - line-height: 2.8; - background: white; - overflow: hidden; - border-radius: 0.25em; - - select { - // Reset select - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - appearance: none; - outline: 0; - box-shadow: none; - border: 0 !important; - background: white; - background-image: none; - - // Our own stlying - width: 100%; - height: 100%; - margin: 0; - padding: 0 0 0 0.5em; - color: black; - cursor: pointer; - font-size: 14px; - - ::-ms-expand { - display: none; - } - } - - &:after { - content: '\25BC'; - position: absolute; - top: 0; - right: 0; - bottom: 0; - padding: 0 1em; - background: $color-dark-85; - pointer-events: none; - -webkit-transition: 0.25s all ease; - -o-transition: 0.25s all ease; - transition: 0.25s all ease; - } - } - - .password-inputs, - .standalone-mnemonic-inputs { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - - input { - margin-bottom: 0.5em; - } - - .error { - margin-bottom: 1em; - } - - .error-input { - border: 3px solid $color-vermilion; - - &:focus { - outline: none; - } - } - - .match-input { - border: 3px solid $color-loki-green; - - &:focus { - outline: none; - } - } - } - - @media (min-height: 750px) and (min-width: 700px) { - .input-header { - font-size: 18px; - } - - .standalone-register-warning { - font-size: 20px; - } - - #mnemonic-display { - font-size: 20px; - } - } -} - //yellow border fix .inbox:focus { outline: none; @@ -876,17 +336,3 @@ $loading-height: 16px; .inbox { position: relative; } - -.qr-dialog { - .content { - width: 300px !important; - max-width: none !important; - min-width: auto !important; - } - - #qr { - display: flex; - justify-content: center; - margin-bottom: 1em; - } -} diff --git a/stylesheets/_index.scss b/stylesheets/_index.scss index 672319a6a..08dd2d873 100644 --- a/stylesheets/_index.scss +++ b/stylesheets/_index.scss @@ -50,12 +50,13 @@ .avatar-center-inner { display: flex; + padding-top: 30px; } .upload-btn-background { background-color: #ffffff70; align-self: center; - margin-left: -24px; + margin-inline-start: -24px; margin-top: 40px; z-index: 1; border-radius: 8px; @@ -79,16 +80,6 @@ } .gutter { - background-color: $color-dark-85; - - ::-webkit-scrollbar-track { - background: $color-dark-85; - } - - ::-webkit-scrollbar-thumb { - border: 2px solid $color-dark-85; - } - display: flex; flex-direction: column; float: left; @@ -182,29 +173,12 @@ h4.section-toggle, .section-conversations-container { display: flex; flex-direction: row; - margin-right: 3em; + margin-inline-end: 3em; align-items: center; h4 { flex: 1; } - - .section-conversations-unread-counter { - color: #ffffff; - background-color: #2090ea; - text-align: center; - padding-top: 1px; - padding-left: 3px; - padding-right: 3px; - font-weight: 300; - font-size: 11px; - letter-spacing: 0.25px; - height: 16px; - min-width: 16px; - line-height: 16px; - border-radius: 8px; - box-shadow: 0px 0px 0px 1px #1a1c20; - } } .network-status-container { @@ -213,7 +187,7 @@ h4.section-toggle, background-size: 25px 25px; background-color: #fcd156; padding: 10px; - padding-left: 2 * $button-height; + padding-inline-start: 2 * $button-height; display: none; .network-status-message { @@ -284,14 +258,14 @@ h4.section-toggle, } $search-x-size: 16px; -$search-padding-right: 12px; -$search-padding-left: 30px; +$search-padding-inline-end: 12px; +$search-padding-inline-start: 30px; input.search { border: 1px solid $color-black-02; - padding: 0 $search-padding-right 0 $search-padding-left; - margin-left: 8px; - margin-right: 8px; + padding: 0 $search-padding-inline-end 0 $search-padding-inline-start; + margin-inline-start: 8px; + margin-inline-end: 8px; outline: 0; height: 32px; width: calc(100% - 16px); @@ -313,11 +287,11 @@ input.search { background-size: $search-x-size; &.ltr { - background-position: right $search-padding-right center; + background-position: right $search-padding-inline-end center; } &.rtl { - background-position: left $search-padding-left center; + background-position: left $search-padding-inline-start center; } } @@ -347,7 +321,7 @@ input.search { .contact-details .number { display: block; font-style: italic; - padding-right: 8px; + padding-inline-end: 8px; } &.valid { @@ -419,26 +393,6 @@ input.search { } } -.conversation.placeholder { - text-align: center; - user-select: none; - - .container { - position: absolute; - height: 100%; - width: 100%; - display: flex; - justify-content: center; - align-items: center; - } - .content { - display: inline-block; - } - - h3 { - font-size: large; - } -} .contact.placeholder { position: absolute; top: 50px; diff --git a/stylesheets/_ios.scss b/stylesheets/_ios.scss deleted file mode 100644 index cf3ba988c..000000000 --- a/stylesheets/_ios.scss +++ /dev/null @@ -1,347 +0,0 @@ -// When paired with an iOS device, this stylesheet will apply - -.ios-theme { - // _modules - - .module-message__container--outgoing { - background-color: $color-signal-blue; - color: $color-white; - } - - .module-message__container--incoming { - background-color: $color-light-10; - color: $color-gray-90; - } - - .module-message__author { - color: $color-gray-90; - } - - .module-message__text { - color: $color-white; - font-size: 14px; - a { - text-decoration: underline; - color: $color-white; - } - } - - .module-message__text--incoming { - color: $color-gray-90; - a { - text-decoration: underline; - color: $color-gray-90; - } - } - - .module-message__metadata__date { - color: $color-white-08; - } - .module-message__metadata__date--incoming { - color: $color-gray-60; - } - .module-message__metadata__date--with-image-no-caption { - color: $color-white; - } - - .module-message__metadata__status-icon--sending { - @include color-svg('../images/sending.svg', $color-white); - } - - .module-message__metadata__status-icon--pow { - @include color-svg('../images/pow.svg', $color-white); - } - - .module-message__metadata__status-icon--sent { - @include color-svg('../images/check-circle-outline.svg', $color-white-08); - } - .module-message__metadata__status-icon--delivered { - @include color-svg('../images/double-check.svg', $color-white-08); - } - .module-message__metadata__status-icon--read { - @include color-svg('../images/read.svg', $color-white-08); - } - - .module-message__metadata__status-icon--with-image-no-caption { - background-color: $color-white; - } - - .module-message__generic-attachment__file-name { - color: $color-white; - } - - .module-message__generic-attachment__file-name--incoming { - color: $color-gray-90; - } - - .module-message__generic-attachment__file-size { - color: $color-white; - } - - .module-message__generic-attachment__file-size--incoming { - color: $color-gray-90; - } - - .module-expire-timer { - background-color: $color-white-08; - } - - .module-expire-timer--incoming { - background-color: $color-gray-60; - } - - .module-quote--outgoing { - border-left-color: $color-white; - background-color: $color-white-06; - } - - .module-quote--incoming { - background-color: $color-signal-blue-025; - border-left-color: $color-signal-blue; - } - - .module-quote__reference-warning--incoming { - background-color: $color-signal-blue-mix; - } - - // When you're composing a new quote - .bottom-bar { - .module-quote { - background-color: $color-signal-blue-025; - border-left-color: $color-signal-blue; - } - } - - .module-embedded-contact__contact-name { - color: $color-white; - } - - .module-embedded-contact__contact-method { - color: $color-white-07; - } - - .module-embedded-contact__contact-name--incoming { - color: $color-gray-90; - } - - .module-embedded-contact__contact-method--incoming { - color: $color-light-60; - } - - .module-typing-animation__dot { - background-color: $color-gray-60; - } - - .module-typing-animation__dot--light { - background-color: $color-gray-60; - } - - .module-spinner__circle--incoming { - background-color: $color-white-04; - } - .module-spinner__arc--incoming { - background-color: $color-gray-60; - } - - .module-spinner__circle--outgoing { - background-color: $color-white-04; - } - .module-spinner__arc--outgoing { - background-color: $color-white; - } - - &.dark-theme { - // _modules - - .module-message__container--outgoing { - background-color: $color-signal-blue; - color: $color-gray-05; - } - - .module-message__container--incoming { - background-color: $color-gray-75; - color: $color-gray-05; - } - - .module-message__author { - color: $color-gray-05; - } - - .module-message__text--incoming { - color: $color-gray-05; - a { - text-decoration: underline; - color: $color-gray-05; - } - } - - .module-message__metadata__status-icon--sending { - @include color-svg('../images/sending.svg', $color-white); - } - - .module-message__metadata__status-icon--pow { - @include color-svg('../images/pow.svg', $color-white); - } - - .module-message__metadata__status-icon--sent { - @include color-svg('../images/check-circle-outline.svg', $color-white-08); - } - .module-message__metadata__status-icon--delivered { - @include color-svg('../images/double-check.svg', $color-white-08); - } - .module-message__metadata__status-icon--read { - @include color-svg('../images/read.svg', $color-white-08); - } - - .module-message__metadata__date { - color: $color-white-08; - } - - .module-message__metadata__date--incoming { - color: $color-gray-25; - } - - .module-message__generic-attachment__file-name--incoming { - color: $color-gray-25; - } - .module-message__generic-attachment__file-size--incoming { - color: $color-gray-25; - } - - .module-expire-timer { - background-color: $color-white-08; - } - - .module-expire-timer--incoming { - background-color: $color-gray-25; - } - - .module-quote--outgoing { - border-left-color: $color-black; - background-color: $color-conversation-blue-shade; - } - - .module-quote--incoming { - background-color: $color-conversation-blue-shade; - border-left-color: $color-signal-blue; - } - - .module-quote__primary__author { - color: $color-gray-05; - } - - .module-quote__primary__text { - color: $color-gray-05; - a { - color: $color-gray-05; - } - } - - .module-quote__primary__type-label { - color: $color-gray-05; - } - - .module-quote__primary__type-label--incoming { - color: $color-gray-05; - } - - .module-quote__primary__author--incoming { - color: $color-gray-05; - } - - .module-quote__primary__text--incoming { - color: $color-gray-05; - a { - color: $color-gray-05; - } - } - - .module-quote__generic-file__text { - color: $color-gray-05; - } - - .module-quote__generic-file__text--incoming { - color: $color-gray-05; - } - - .module-quote__reference-warning { - background-color: $color-white-04; - } - - .module-quote__reference-warning--incoming { - background-color: $color-signal-blue-050; - } - - .module-quote__reference-warning__text { - color: $color-gray-90; - } - - .module-quote__reference-warning__text--incoming { - color: $color-gray-05; - } - - .module-quote__reference-warning__icon { - @include color-svg('../images/broken-link.svg', $color-signal-blue); - } - - .module-quote__reference-warning__icon--incoming { - @include color-svg('../images/broken-link.svg', $color-gray-75); - } - - // When you're composing a new quote - .bottom-bar { - .module-quote__primary__author { - color: $color-gray-05; - } - - .module-quote__primary__type-label { - color: $color-gray-05; - } - - .module-quote__generic-file__text { - color: $color-gray-05; - } - - .module-quote__primary__text { - color: $color-gray-05; - a { - color: $color-gray-05; - } - } - } - - .module-embedded-contact__contact-name--incoming { - color: $color-gray-05; - } - - .module-embedded-contact__contact-method--incoming { - color: $color-gray-25; - } - - .module-spinner__circle--incoming { - background-color: $color-white-04; - } - .module-spinner__arc--incoming { - background-color: $color-gray-25; - } - .module-spinner__circle--small-incoming { - background-color: $color-white-04; - } - .module-spinner__arc--small-incoming { - background-color: $color-gray-25; - } - - .module-spinner__circle--outgoing { - background-color: $color-white-04; - } - .module-spinner__arc--outgoing { - background-color: $color-gray-05; - } - .module-spinner__circle--small-outgoing { - background-color: $color-white-04; - } - .module-spinner__arc--small-outgoing { - background-color: $color-gray-05; - } - } -} diff --git a/stylesheets/_mentions.scss b/stylesheets/_mentions.scss index c32a70d55..34337564c 100644 --- a/stylesheets/_mentions.scss +++ b/stylesheets/_mentions.scss @@ -1,98 +1,5 @@ -.leave-group-dialog { - .content { - max-width: 100% !important; - } - - .titleText { - font-size: large; - text-align: center; - margin: 2px; - } - - .ok { - background-color: orangered; - min-width: 70px; - border: none; - - &:hover { - background-color: red; - } - } - - .cancel { - border: none; - min-width: 70px; - } -} - -.member-preview { - margin-left: 10px; -} - -/* remove scroll bars */ -.loki-dialog .add-moderators-dialog .content { - padding: 1.1em; -} - -.invite-friends-dialog, -.add-moderators-dialog, -.remove-moderators-dialog, -.create-group-dialog { - .content { - max-width: 100% !important; - } - - .buttons { - margin: 8px; - } - - .group-name { - font-size: larger; - } - - .titleText { - font-size: large; - text-align: center; - } -} - -.create-group-dialog, -.add-moderators-dialog, -.remove-moderators-dialog, -.invite-friends-dialog { - .no-friends { - text-align: center; - } - - .hidden { - display: none; - } -} - -.create-group-dialog, -.add-moderators-dialog, -.remove-moderators-dialog, -.edit-profile-dialog { - .error-message { - text-align: center; - color: red; - display: block; - user-select: none; - } - - .error-faded { - opacity: 0; - margin-top: -5px; - transition: all 100ms linear; - } - - .error-shown { - opacity: 1; - transition: all 250ms linear; - } -} - -.friend-selection-list { +// used for the list after adding a `@` in the compose text input +.contact-selection-list { max-height: 240px; overflow-y: auto; margin: 4px; @@ -119,7 +26,7 @@ } .dark-theme { - .friend-selection-list { + .contact-selection-list { .check-mark { color: rgb(230, 230, 230); } @@ -153,11 +60,11 @@ .name-part { font-weight: 300; - margin-left: 12px; + margin-inline-start: 12px; } .pubkey-part { - margin-left: 10px; + margin-inline-start: 10px; opacity: 0.6; } } @@ -178,28 +85,23 @@ color: black; } -.message-highlighted { - border-radius: $message-container-border-radius; - background-color: rgba(255, 197, 50, 0.2); -} - .module-conversation-list-item--mentioned-us { border-left: 4px solid $session-color-green !important; } .at-symbol { - background-color: $session-color-green; - + @include themify($themes) { + background-color: themed('accent'); + } color: $color-black; text-align: center; padding-top: 1px; - padding-left: 3px; - padding-right: 3px; + padding-inline-start: 3px; + padding-inline-end: 3px; - position: absolute; - left: 50%; - margin-left: 30px; + position: static; + margin-inline-start: 5px; top: 2px; font-weight: 300; diff --git a/stylesheets/_mixins.scss b/stylesheets/_mixins.scss index f47a758e0..9a7e9b664 100644 --- a/stylesheets/_mixins.scss +++ b/stylesheets/_mixins.scss @@ -28,3 +28,9 @@ @include color-svg($svg, black); } } + +@keyframes highlightedMessageAnimation { + 1% { + background-color: #00f782; + } +} diff --git a/stylesheets/_modal.scss b/stylesheets/_modal.scss index 428cc46f3..d55046a49 100644 --- a/stylesheets/_modal.scss +++ b/stylesheets/_modal.scss @@ -20,3 +20,278 @@ box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.2); } } + +/* remove scroll bars */ +.loki-dialog .add-moderators-dialog .content { + padding: 1.1em; +} + +.create-group-dialog, +.add-moderators-dialog, +.remove-moderators-dialog, +.invite-friends-dialog { + .content { + max-width: 100% !important; + } + + .buttons { + margin: 8px; + } + + .group-name { + font-size: larger; + } + + .titleText { + font-size: large; + text-align: center; + } + + .no-contacts { + text-align: center; + } + + .hidden { + display: none; + } +} + +.create-group-dialog, +.add-moderators-dialog, +.remove-moderators-dialog, +.edit-profile-dialog { + .error-message { + text-align: center; + color: red; + display: block; + user-select: none; + } + + .error-faded { + opacity: 0; + margin-top: -5px; + transition: all 100ms linear; + } + + .error-shown { + opacity: 1; + transition: all 250ms linear; + } +} + +.loki-dialog { + display: flex; + align-items: center; + justify-content: center; + + .content { + max-width: 75%; + min-width: 60%; + padding: 1em; + background: white; + border-radius: $border-radius; + overflow: auto; + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3); + } + + button { + float: right; + margin-inline-start: 10px; + background-color: $color-loki-green; + border-radius: 100px; + padding: 5px 15px; + border: 1px solid $color-loki-green; + color: white; + outline: none; + user-select: none; + + &:hover, + &:disabled { + background-color: $color-loki-green-dark; + border-color: $color-loki-green-dark; + } + + &:disabled { + cursor: not-allowed; + } + } + + input { + width: 100%; + padding: 8px; + margin-bottom: 15px; + border: 0; + outline: none; + border-radius: 4px; + background-color: $color-loki-light-gray; + + &:focus { + outline: none; + } + } + + h4 { + margin-top: 8px; + margin-bottom: 16px; + } +} + +.nickname-dialog { + .message { + font-style: italic; + color: $grey; + font-size: 12px; + margin-bottom: 16px; + } +} + +.seed-dialog { + .title { + font-weight: bold; + } + + .fields { + margin-top: 20px; + } + + .seed { + padding: 20px 0; + font-style: oblique; + } +} + +.permissions-popup, +.debug-log-window { + .modal { + background-color: transparent; + padding: 0; + } +} + +.loki-dialog { + & ~ .index.inbox { + filter: blur(2px); + transition: filter 0.1s; + } + + input { + @include themify($themes) { + background-color: themed('inputBackground'); + color: themed('textColor'); + border: themed('sessionBorder'); + } + } +} + +.nickname-dialog { + .message { + color: $color-light-35; + } +} + +.edit-profile-dialog { + .session-modal__header__title { + font-size: $session-font-lg; + } + + .session-modal { + width: $session-modal-size-md; + + &__header { + height: 68.45px; + } + } + + .avatar-center-inner { + position: relative; + + .module-avatar { + @include themify($themes) { + box-shadow: 0px 0px 13px 0.5px themed('sessionShadowColor'); + } + } + + .qr-view-button { + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + right: -3px; + height: 26px; + width: 26px; + border-radius: 50%; + padding-top: 3px; + background-color: $session-color-white; + transition: $session-transition-duration; + + &:hover { + filter: brightness(90%); + } + + .session-icon-button { + opacity: 1; + } + } + } + + .session-id-section { + display: flex; + align-items: center; + flex-direction: column; + + .panel-text-divider { + margin-top: 35px; + margin-bottom: 35px; + } + + &-display { + user-select: text; + text-align: center; + word-break: break-all; + font-size: $session-font-md; + padding: 0px $session-margin-lg; + font-family: $session-font-default; + font-weight: 100; + @include themify($themes) { + color: themed('textColor'); + } + font-size: $session-font-md; + padding: 0px $session-margin-sm; + } + + .session-button { + width: 148px; + } + } + + .profile-name { + display: flex; + justify-content: center; + margin-top: $session-margin-lg; + + input { + height: 38px; + width: 142px; + border-radius: 5px; + text-align: center; + font-size: $session-font-md; + @include themify($themes) { + background: themed('inputBackground'); + color: themed('textColor'); + border: themed('sessionBorder'); + } + } + + &-uneditable { + display: flex; + align-items: center; + justify-content: center; + + p { + font-size: $session-font-md; + padding: 0px $session-margin-sm; + } + } + } +} diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index 3c8d04552..768f3e48e 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -71,103 +71,19 @@ // Spec: container < 438px .module-message--incoming { - margin-left: 0; - margin-right: 32px; + margin-inline-start: 0; + margin-inline-end: 32px; } .module-message--outgoing { float: right; - margin-right: 0; - margin-left: 32px; + margin-inline-end: 0; + margin-inline-start: 32px; } -.module-message__buttons { - position: absolute; - top: 0; - bottom: 0; - display: inline-flex; - flex-direction: row; - align-items: center; - opacity: 0; -} - -.module-message:hover .module-message__buttons { +.module-message:hover { opacity: 1; } -.module-message__buttons--incoming { - left: 100%; -} -.module-message__buttons--outgoing { - right: 100%; -} - -.module-message__buttons__upload { - height: 24px; - width: 24px; - transform: rotate(180deg); - display: inline-block; - cursor: pointer; - @include color-svg('../images/download.svg', $color-light-45); - &:hover { - @include color-svg('../images/download.svg', $color-gray-90); - } -} - -.module-message__buttons__download { - min-height: 24px; - min-width: 24px; - display: inline-block; - cursor: pointer; - @include color-svg('../images/download.svg', $color-light-45); - &:hover { - @include color-svg('../images/download.svg', $color-gray-90); - } -} - -.module-message__buttons__download--incoming { - margin-left: 12px; -} -.module-message__buttons__download--outgoing { - margin-right: 12px; -} - -.module-message__buttons__reply { - min-height: 24px; - min-width: 24px; - display: inline-block; - cursor: pointer; - @include color-svg('../images/reply.svg', $color-light-45); - &:hover { - @include color-svg('../images/reply.svg', $color-gray-90); - } -} - -.module-message__buttons__reply--incoming { - margin-left: 12px; -} -.module-message__buttons__reply--outgoing { - margin-right: 12px; -} - -.module-message__buttons__menu { - height: 24px; - width: 24px; - display: inline-block; - cursor: pointer; - @include color-svg('../images/ellipsis.svg', $color-light-45); - &:hover { - @include color-svg('../images/ellipsis.svg', $color-gray-90); - } -} - -.module-message__buttons__menu--incoming { - margin-left: 12px; -} - -.module_message__buttons__menu--outgoing { - margin-right: 12px; -} - .module-message__error-container { width: 28px; position: relative; @@ -179,7 +95,7 @@ display: inline-block; position: absolute; bottom: 4px; - @include color-svg('../images/error.svg', $color-core-red); + @include color-svg('../images/error.svg', $session-color-danger); } .module-message__error--outgoing { @@ -194,63 +110,20 @@ position: relative; display: inline-block; border-radius: $message-container-border-radius; - padding-right: 12px; - padding-left: 12px; + padding-inline-end: 12px; + padding-inline-start: 12px; padding-top: 10px; padding-bottom: 10px; min-width: 0px; } -.module-message__container--outgoing { - background-color: $color-light-10; -} - -// In case the color gets messed up -.module-message__container--incoming { - background-color: $color-conversation-grey; -} - -.module-message__container--incoming-red { - background-color: $color-conversation-red; -} -.module-message__container--incoming-deep_orange { - background-color: $color-conversation-deep_orange; -} -.module-message__container--incoming-brown { - background-color: $color-conversation-brown; -} -.module-message__container--incoming-pink { - background-color: $color-conversation-pink; -} -.module-message__container--incoming-purple { - background-color: $color-conversation-purple; -} -.module-message__container--incoming-indigo { - background-color: $color-conversation-indigo; -} -.module-message__container--incoming-blue { - background-color: $color-conversation-blue; -} -.module-message__container--incoming-teal { - background-color: $color-conversation-teal; -} -.module-message__container--incoming-green { - background-color: $color-conversation-green; -} -.module-message__container--incoming-light_green { - background-color: $color-conversation-light_green; -} -.module-message__container--incoming-blue_grey { - background-color: $color-conversation-blue_grey; -} - .module-message__attachment-container { // Entirely to ensure that images are centered if they aren't full width of bubble text-align: center; position: relative; - margin-left: -12px; - margin-right: -12px; + margin-inline-start: -12px; + margin-inline-end: -12px; margin-top: -10px; margin-bottom: -10px; @@ -309,16 +182,16 @@ position: relative; } .module-message__generic-attachment__spinner-container { - padding-left: 4px; - padding-right: 4px; + padding-inline-start: 4px; + padding-inline-end: 4px; } .module-message__generic-attachment__icon { background: url('../images/file-gradient.svg') no-repeat center; height: 44px; width: 56px; - margin-left: -13px; - margin-right: -14px; + margin-inline-start: -13px; + margin-inline-end: -14px; margin-bottom: -4px; // So we can center the extension text inside this icon @@ -344,7 +217,7 @@ height: 16px; width: 16px; - @include color-svg('../images/error-filled.svg', $color-core-red); + @include color-svg('../images/error-filled.svg', $session-color-danger); } .module-message__generic-attachment__icon__extension { @@ -356,8 +229,8 @@ // Along with flow layout in parent item, centers text text-align: center; width: 25px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; // We don't have much room for text here, cut it off without ellipse overflow-x: hidden; @@ -369,7 +242,7 @@ .module-message__generic-attachment__text { flex-grow: 1; - margin-left: 8px; + margin-inline-start: 8px; // The width of the icon plus our 8px margin max-width: calc(100% - 37px); } @@ -387,30 +260,27 @@ text-overflow: ellipsis; } +.module-message__generic-attachment__file-size, +.module-message__generic-attachment__file-name--outgoing, +.module-message__generic-attachment__file-size--incoming, +.module-message__generic-attachment__file-size--outgoing, .module-message__generic-attachment__file-name--incoming { - color: $color-white; + @include themify($themes) { + color: themed('textColor'); + } } .module-message__generic-attachment__file-size { - color: $color-gray-90; font-size: 11px; line-height: 16px; letter-spacing: 0.3px; margin-top: 3px; } -.module-message__generic-attachment__file-size--incoming { - color: $color-white; -} - -.module-message__generic-attachment__file-size--incoming { - color: $color-white; -} - .module-message__link-preview { cursor: pointer; - margin-left: -12px; - margin-right: -12px; + margin-inline-start: -12px; + margin-inline-end: -12px; margin-top: -10px; margin-bottom: 5px; border-top-left-radius: 16px; @@ -443,7 +313,7 @@ .module-message__link-preview__icon_container { margin: -2px; - margin-right: 8px; + margin-inline-end: 8px; display: inline-block; } @@ -475,7 +345,6 @@ } .module-conversation__user, .module-message__author { - color: $color-white; font-size: 13px; font-weight: 300; line-height: 18px; @@ -507,18 +376,6 @@ } } -.module-message__text--incoming { - color: $color-white; - a { - text-decoration: underline; - color: $color-white; - } -} - -.module-message__text--error { - font-style: italic; -} - .module-message__metadata { display: flex; flex-direction: row; @@ -528,7 +385,7 @@ span { opacity: 0.5; - transition: 0.25s; + transition: $session-transition-duration; &:not(.module-message__metadata__badge--separator):hover { opacity: 1; @@ -548,7 +405,7 @@ width: 100%; // Because this is absolutely positioned, we 100% is too big, take it down by parent // padding sizes. - padding-right: 24px; + padding-inline-end: 24px; } .module-message__metadata__date, @@ -582,9 +439,9 @@ width: 12px; height: 12px; display: inline-block; - margin-left: 6px; + margin-inline-start: 6px; margin-bottom: 2px; - margin-left: 5px; + margin-inline-start: 5px; } .module-message__metadata__status-icon--sending { @@ -626,14 +483,14 @@ font-weight: 300; font-size: 13px; line-height: 18px; - color: $color-signal-blue; + color: $color-loki-green; background-color: $color-light-02; border: 1px solid $color-black-012; margin-top: 8px; margin-bottom: -10px; - margin-left: -12px; - margin-right: -12px; + margin-inline-start: -12px; + margin-inline-end: -12px; text-align: center; padding: 10px; @@ -645,7 +502,7 @@ .module-message__author-avatar { flex-direction: column-reverse; display: inline-flex; - padding-right: 4px; + padding-inline-end: 4px; } .module-message__typing-container { @@ -659,7 +516,7 @@ // Module: Expire Timer .module-expire-timer-margin { - margin-left: 6px; + margin-inline-start: 6px; } .module-expire-timer { @@ -716,328 +573,6 @@ background-color: $color-white; } -// Module: Quoted Reply - -.module-quote-container { - margin-left: -6px; - margin-right: -6px; - margin-top: -4px; - margin-bottom: 5px; -} - -.module-quote-container--with-content-above { - margin-top: 3px; -} - -.module-quote { - position: relative; - border-radius: 4px; - border-top-left-radius: 10px; - border-top-right-radius: 10px; - - cursor: pointer; - display: flex; - flex-direction: row; - align-items: stretch; - overflow: hidden; - - border-left-width: 4px; - border-left-style: solid; -} - -.module-quote--no-click { - cursor: auto; -} - -.module-quote--with-content-above { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.module-quote--with-reference-warning { - border-bottom-left-radius: 0px; - border-bottom-right-radius: 0px; -} - -.module-quote--outgoing { - border-left-color: $color-conversation-grey; - background-color: $color-conversation-grey-tint; -} -.module-quote--outgoing-red { - border-left-color: $color-conversation-red; - background-color: $color-conversation-red-tint; -} -.module-quote--outgoing-deep_orange { - border-left-color: $color-conversation-deep_orange; - background-color: $color-conversation-deep_orange-tint; -} -.module-quote--outgoing-brown { - border-left-color: $color-conversation-brown; - background-color: $color-conversation-brown-tint; -} -.module-quote--outgoing-pink { - border-left-color: $color-conversation-pink; - background-color: $color-conversation-pink-tint; -} -.module-quote--outgoing-purple { - border-left-color: $color-conversation-purple; - background-color: $color-conversation-purple-tint; -} -.module-quote--outgoing-indigo { - border-left-color: $color-conversation-indigo; - background-color: $color-conversation-indigo-tint; -} -.module-quote--outgoing-blue { - border-left-color: $color-conversation-blue; - background-color: $color-conversation-blue-tint; -} -.module-quote--outgoing-teal { - border-left-color: $color-conversation-teal; - background-color: $color-conversation-teal-tint; -} -.module-quote--outgoing-green { - border-left-color: $color-conversation-green; - background-color: $color-conversation-green-tint; -} -.module-quote--outgoing-light_green { - border-left-color: $color-conversation-light_green; - background-color: $color-conversation-light_green-tint; -} -.module-quote--outgoing-blue_grey { - border-left-color: $color-conversation-blue_grey; - background-color: $color-conversation-blue_grey-tint; -} - -.module-quote--incoming { - border-left-color: $color-white; - background-color: $color-conversation-grey-tint; -} -.module-quote--incoming-red { - background-color: $color-conversation-red-tint; -} -.module-quote--incoming-deep_orange { - background-color: $color-conversation-deep_orange-tint; -} -.module-quote--incoming-brown { - background-color: $color-conversation-brown-tint; -} -.module-quote--incoming-pink { - background-color: $color-conversation-pink-tint; -} -.module-quote--incoming-purple { - background-color: $color-conversation-purple-tint; -} -.module-quote--incoming-indigo { - background-color: $color-conversation-indigo-tint; -} -.module-quote--incoming-blue { - background-color: $color-conversation-blue-tint; -} -.module-quote--incoming-teal { - background-color: $color-conversation-teal-tint; -} -.module-quote--incoming-green { - background-color: $color-conversation-green-tint; -} -.module-quote--incoming-light_green { - background-color: $color-conversation-light_green-tint; -} -.module-quote--incoming-blue_grey { - background-color: $color-conversation-blue_grey-tint; -} - -.module-quote__primary { - flex-grow: 1; - padding-left: 8px; - padding-right: 8px; - padding-top: 7px; - padding-bottom: 7px; - - max-width: 100%; -} - -.module-quote__primary__author { - font-size: 13px; - line-height: 18px; - font-weight: 300; - color: $color-gray-90; - - overflow-x: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.module-quote__primary__profile-name { - font-style: italic; -} - -.module-quote__primary__text { - font-size: 14px; - line-height: 18px; - color: $color-gray-90; - text-align: start; - - a { - color: $color-gray-90; - } - - overflow-wrap: break-word; - word-wrap: break-word; - word-break: break-word; - white-space: pre-wrap; - - overflow: hidden; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - - // Note: -webkit-line-clamp doesn't work for RTL text, and it forces you to use - // ... as the truncation indicator. That's not a solution that works well for - // all languages. More resources: - // - http://hackingui.com/front-end/a-pure-css-solution-for-multiline-text-truncation/ - // - https://medium.com/mofed/css-line-clamp-the-good-the-bad-and-the-straight-up-broken-865413f16e5 -} - -.module-quote__primary__type-label { - font-style: italic; - color: $color-gray-90; - font-size: 13px; - line-height: 18px; -} - -.module-quote__primary__filename-label { - font-size: 12px; -} - -.module-quote__close-container { - position: absolute; - top: 4px; - right: 4px; - height: 16px; - width: 16px; - - background-color: rgba(255, 255, 255, 0.75); - border-radius: 50%; -} - -.module-quote__close-button { - width: 100%; - height: 100%; - cursor: pointer; - @include color-svg('../images/x.svg', $grey); -} - -.module-quote__icon-container { - flex: initial; - min-width: 54px; - width: 54px; - max-height: 54px; - position: relative; - - img { - width: 100%; - height: 100%; - object-fit: cover; - } -} - -.module-quote__icon-container__inner { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - - text-align: center; - display: flex; - align-items: center; - justify-content: center; -} - -.module-quote__icon-container__circle-background { - display: flex; - align-items: center; - justify-content: center; - - height: 32px; - width: 32px; - border-radius: 50%; - background-color: $color-white; -} - -.module-quote__icon-container__icon { - width: 24px; - height: 24px; -} - -.module-quote__icon-container__icon--file { - @include color-svg('../images/file.svg', $color-signal-blue); -} -.module-quote__icon-container__icon--image { - @include color-svg('../images/image.svg', $color-signal-blue); -} -.module-quote__icon-container__icon--microphone { - @include color-svg('../images/microphone.svg', $color-signal-blue); -} -.module-quote__icon-container__icon--play { - @include color-svg('../images/play.svg', $color-signal-blue); -} -.module-quote__icon-container__icon--movie { - @include color-svg('../images/movie.svg', $color-signal-blue); -} - -.module-quote__generic-file { - display: flex; - flex-direction: row; - align-items: center; -} -.module-quote__generic-file__icon { - background: url('../images/file-gradient.svg'); - background-size: 75%; - background-repeat: no-repeat; - height: 28px; - width: 36px; - margin-left: -4px; - margin-right: -6px; - margin-bottom: 5px; -} -.module-quote__generic-file__text { - font-size: 14px; - line-height: 18px; - color: $color-gray-90; - - max-width: calc(100% - 26px); - overflow-x: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.module-quote__reference-warning { - height: 26px; - display: flex; - flex-direction: row; - align-items: center; - - background-color: $color-white-085; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - padding-left: 8px; - padding-right: 8px; -} - -.module-quote__reference-warning__icon { - height: 16px; - width: 16px; - @include color-svg('../images/broken-link.svg', $color-gray-60); -} - -.module-quote__reference-warning__text { - margin-left: 6px; - color: $color-gray-90; - font-size: 13px; - line-height: 18px; -} - // Module: Embedded Contact .module-embedded-contact { @@ -1057,13 +592,13 @@ } .module-embedded-contact__spinner-container { - padding-left: 5px; - padding-right: 5px; + padding-inline-start: 5px; + padding-inline-end: 5px; } .module-embedded-contact__text-container { flex-grow: 1; - margin-left: 8px; + margin-inline-start: 8px; max-width: calc(100% - 58px); } @@ -1167,8 +702,8 @@ .module-contact-detail { text-align: center; max-width: 300px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } .module-contact-detail__avatar { @@ -1213,7 +748,7 @@ height: 17px; width: 18px; display: inline-block; - margin-right: 5px; + margin-inline-end: 5px; @include color-svg('../images/chat-bubble.svg', white); } @@ -1243,7 +778,10 @@ .module-group-notification__change, .module-timer-notification__message { - background-color: rgba(33, 33, 33, 0.4); + @include themify($themes) { + background: themed('fakeChatBubbleBackground'); + color: themed('textColor'); + } width: 90%; max-width: 700px; margin: 10px auto; @@ -1278,8 +816,8 @@ .module-safety-number-notification__icon { height: 24px; width: 24px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; margin-bottom: 7px; @include color-svg('../images/shield.svg', $color-gray-60); } @@ -1303,7 +841,7 @@ font-weight: 300; line-height: 18px; padding: 12px; - color: $color-signal-blue; + color: $color-loki-green; background-color: $color-light-02; border-radius: 4px; } @@ -1326,8 +864,8 @@ .module-verification-notification__icon--mark-verified { height: 24px; width: 24px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; margin-bottom: 4px; @include color-svg('../images/verified-check.svg', $color-gray-60); } @@ -1335,8 +873,8 @@ .module-verification-notification__icon--mark-not-verified { height: 24px; width: 24px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; margin-bottom: 7px; @include color-svg('../images/shield.svg', $color-gray-60); } @@ -1353,8 +891,8 @@ } .module-timer-notification__icon-container { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; display: inline-flex; flex-direction: row; align-items: center; @@ -1376,7 +914,7 @@ font-size: 11px; line-height: 16px; letter-spacing: 0.3px; - margin-left: 6px; + margin-inline-start: 6px; text-transform: uppercase; // Didn't seem centered otherwise @@ -1410,8 +948,8 @@ .module-notification__icon { height: 24px; width: 24px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } // Module: Contact List Item @@ -1431,7 +969,7 @@ } .module-contact-list-item__text { - margin-left: 8px; + margin-inline-start: 8px; } .module-contact-list-item__text__name { @@ -1465,18 +1003,13 @@ display: flex; flex-direction: row; align-items: center; - - color: $color-gray-90; - - background-color: $color-white; - border-bottom: 1px solid $color-black-02; } .module-conversation-header__back-icon { @include color-svg('../images/back.svg', $color-gray-90); display: inline-block; - margin-left: -10px; - margin-right: -2px; + margin-inline-start: -10px; + margin-inline-end: -2px; width: 35px; height: 35px; min-width: 35px; @@ -1497,8 +1030,8 @@ } .module-conversation-header__title-flex { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; display: inline-flex; flex-direction: row; align-items: center; @@ -1513,7 +1046,7 @@ } .module-conversation-header__title { - margin-left: 6px; + margin: 0px 20px; min-width: 0; font-size: 16px; @@ -1531,6 +1064,12 @@ align-items: center; -webkit-user-select: text; + + .module-contact-name__profile-name { + width: 100%; + overflow: hidden !important; + text-overflow: ellipsis; + } } .module-conversation-header__title__profile-name { @@ -1549,8 +1088,8 @@ display: flex; flex-direction: row; align-items: center; - padding-left: 8px; - padding-right: 8px; + padding-inline-start: 8px; + padding-inline-end: 8px; } .module-conversation-header__expiration__clock-icon { @@ -1561,7 +1100,7 @@ } .module-conversation-header__expiration__setting { - margin-left: 5px; + margin-inline-start: 5px; text-align: center; } @@ -1569,7 +1108,7 @@ @include color-svg('../images/gear.svg', $color-gray-60); height: 20px; width: 20px; - margin-left: 4px; + margin-inline-start: 4px; cursor: pointer; } @@ -1577,8 +1116,8 @@ .module-message-detail { max-width: 650px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; padding: 20px; } @@ -1597,11 +1136,13 @@ .module-message-detail__label { font-weight: 300; - padding-right: 5px; + padding-inline-end: 5px; } .module-message-detail__unix-timestamp { - color: $color-light-10; + @include themify($themes) { + color: subtle(themed('textColor')); + } } .module-message-detail__delete-button-container { @@ -1612,7 +1153,7 @@ .module-message-detail__delete-button { @include button-reset; - background-color: $color-core-red; + background-color: $session-color-danger; color: $color-white; box-shadow: 0 0 10px -3px rgba(97, 97, 97, 0.7); border-radius: 5px; @@ -1623,7 +1164,7 @@ } .module-message-detail__contact-container { - margin: 20px; + margin: 20px 0 20px 0; } .module-message-detail__contact { @@ -1634,12 +1175,12 @@ } .module-message-detail__contact__text { - margin-left: 10px; + margin-inline-start: 10px; flex-grow: 1; } .module-message-detail__contact__error { - color: $color-core-red; + color: $session-color-danger; font-weight: 300; } @@ -1648,7 +1189,7 @@ height: 12px; display: inline-block; margin-bottom: 2px; - margin-left: 5px; + margin-inline-start: 5px; } .module-message-detail__contact__status-icon--sending { @@ -1676,12 +1217,12 @@ width: 18px; } .module-message-detail__contact__status-icon--error { - @include color-svg('../images/error.svg', $color-core-red); + @include color-svg('../images/error.svg', $session-color-danger); } .module-message-detail__contact__unidentified-delivery-icon { - margin-left: 6px; - margin-right: 10px; + margin-inline-start: 6px; + margin-inline-end: 10px; width: 20px; height: 20px; @@ -1703,8 +1244,8 @@ .module-message-detail__contact__send-anyway { @include button-reset; color: $color-white; - background-color: $color-core-red; - margin-left: 5px; + background-color: $session-color-danger; + margin-inline-start: 5px; margin-top: 5px; padding: 4px; border-radius: 4px; @@ -1717,7 +1258,7 @@ flex-direction: column; flex-grow: 1; width: 100%; - height: 100%; + overflow: hidden; } .module-media-gallery__tab-container { @@ -1730,15 +1271,10 @@ .module-media-gallery__tab { width: 100%; - background-color: $color-light-02; padding: 20px; text-align: center; } -.module-media-gallery__tab--active { - border-bottom: 2px solid $color-signal-blue; -} - .module-media-gallery__content { display: flex; flex-grow: 1; @@ -1775,7 +1311,7 @@ // Module: Document List Item .module-document-list-item { - padding-right: 10px; + padding-inline-end: 10px; width: 100%; height: 72px; } @@ -1806,8 +1342,8 @@ flex-direction: column; flex-grow: 1; flex-shrink: 0; - margin-left: 8px; - margin-right: 8px; + margin-inline-start: 8px; + margin-inline-end: 8px; } .module-document-list-item__file-name { @@ -1832,7 +1368,7 @@ width: 94px; cursor: pointer; background-color: $color-light-10; - margin-right: 4px; + margin-inline-end: 4px; margin-bottom: 4px; position: relative; } @@ -1883,7 +1419,7 @@ height: 36px; width: 36px; - @include color-svg('../images/play.svg', $color-signal-blue); + @include color-svg('../images/play.svg', $color-loki-green); } .module-media-grid-item__icon-video { @@ -1911,8 +1447,8 @@ max-width: 300px; display: flex; flex-direction: row; - padding-right: 16px; - padding-left: 16px; + padding-inline-end: 16px; + padding-inline-start: 16px; align-items: center; cursor: pointer; @@ -1921,44 +1457,21 @@ background-color: $color-dark-70; } - .module-avatar { - background-color: $color-dark-85; + &--is-blocked { + @include themify($themes) { + border-left: 4px solid themed('destructive') !important; + } } } -.module-conversation-list-item--has-unread { - padding-left: 12px; - border-left: 4px solid $color-signal-blue; -} - -.module-conversation-list-item--has-friend-request { - padding-left: 12px; - border-left: 4px solid $color-conversation-indigo; -} - -.module-conversation-list-item--is-blocked { - padding-left: 12px; - border-left: 4px solid $color-conversation-red; -} - -.module-conversation-list-item--is-selected { - background-color: $color-dark-70; -} - -.module-conversation-list-item__avatar-container { - position: relative; - margin-top: 8px; - margin-bottom: 8px; -} - .module-conversation-list-item__unread-count { color: $color-white; - background-color: $color-signal-blue; + background-color: $color-loki-green; text-align: center; padding-top: 1px; - padding-left: 3px; - padding-right: 3px; + padding-inline-start: 3px; + padding-inline-end: 3px; position: absolute; right: -6px; @@ -1978,7 +1491,7 @@ .module-conversation-list-item__content { flex-grow: 1; - margin-left: 12px; + margin-inline-start: 12px; display: flex; flex-direction: column; align-items: stretch; @@ -2002,7 +1515,6 @@ text-overflow: ellipsis; font-weight: 300; - color: $color-gray-05; } .module-conversation-list-item__header__name--with-unread { @@ -2011,7 +1523,7 @@ .module-conversation-list-item__header__timestamp { flex-shrink: 0; - margin-left: 6px; + margin-inline-start: 6px; font-size: 11px; line-height: 16px; @@ -2065,7 +1577,7 @@ width: 12px; height: 13px; display: inline-block; - margin-left: 6px; + margin-inline-start: 6px; } .module-conversation-list-item__message__status-icon--sending { @@ -2093,217 +1605,7 @@ width: 18px; } .module-conversation-list-item__message__status-icon--error { - @include color-svg('../images/error.svg', $color-core-red); -} - -// Module: Avatar - -.module-avatar { - position: relative; - vertical-align: middle; - display: inline-block; - border-radius: 50%; - - img { - object-fit: cover; - border-radius: 50%; - } -} - -.module-avatar__label { - width: 100%; - text-align: center; - font-weight: 300; - text-transform: uppercase; - color: $color-white; -} - -.module-avatar__icon { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -.module-avatar__icon--crown-wrapper { - position: relative; - bottom: -38px; - right: -16px; - height: 21px; - width: 21px; - transform: translate(25%, 25%); - padding: 9%; - background-color: $color-white; - border-radius: 50%; - filter: drop-shadow(0px 0px 4px rgba(0, 0, 0, 0.3)); -} - -.module-avatar__icon--crown { - @include color-svg('../images/crown.svg', #ffb000); - height: 100%; - width: 100%; -} - -.module-avatar__icon--group { - @include color-svg('../images/profile-group.svg', $color-white); -} - -.module-avatar__icon--direct { - @include color-svg('../images/profile-individual.svg', $color-white); -} - -.module-avatar--28 { - height: 28px; - width: 28px; - - img { - height: 28px; - width: 28px; - } -} - -.module-avatar__label--28 { - font-size: 14px; - line-height: 28px; -} - -.module-avatar__icon--28 { - height: 16px; - width: 16px; -} - -.module-avatar--36 { - height: 36px; - width: 36px; - - img { - height: 36px; - width: 36px; - } -} - -.module-avatar__label--36 { - margin-top: 1px; - width: 36px; - font-size: 16px; - letter-spacing: 0.19px; - line-height: 36px; -} - -.module-avatar__icon--36 { - height: 20px; - width: 20px; -} - -.module-avatar--48 { - height: 48px; - width: 48px; - - img { - height: 48px; - width: 48px; - } -} - -.module-avatar__label--48 { - width: 48px; - font-size: 20px; - letter-spacing: 0.19px; - line-height: 48px; -} - -.module-avatar__icon--48 { - height: 26px; - width: 26px; -} - -.module-avatar--80 { - height: 80px; - width: 80px; - - img { - height: 80px; - width: 80px; - } -} - -.module-avatar__label--80 { - width: 80px; - font-size: 40px; - line-height: 82px; -} - -.module-avatar__icon--80 { - height: 42px; - width: 42px; -} - -.module-avatar--300 { - height: 300px; - width: 300px; - - img { - height: 300px; - width: 300px; - } -} - -.module-avatar__label--300 { - width: 300px; - font-size: 150px; - line-height: 302px; -} - -.module-avatar__icon--300 { - height: 158px; - width: 158px; -} - -.module-avatar__icon--note-to-self { - width: 70%; - height: 70%; - @include color-svg('../images/note-28.svg', $color-white); -} - -.module-avatar--no-image { - background-color: $color-conversation-grey; -} - -.module-avatar--signal-blue { - background-color: $color-signal-blue; -} -.module-avatar--red { - background-color: $color-conversation-red; -} -.module-avatar--deep_orange { - background-color: $color-conversation-deep_orange; -} -.module-avatar--brown { - background-color: $color-conversation-brown; -} -.module-avatar--pink { - background-color: $color-conversation-pink; -} -.module-avatar--purple { - background-color: $color-conversation-purple; -} -.module-avatar--indigo { - background-color: $color-conversation-indigo; -} -.module-avatar--blue { - background-color: $color-conversation-blue; -} -.module-avatar--teal { - background-color: $color-conversation-teal; -} -.module-avatar--green { - background-color: $color-conversation-green; -} -.module-avatar--light_green { - background-color: $color-conversation-light_green; -} -.module-avatar--blue_grey { - background-color: $color-conversation-blue_grey; + @include color-svg('../images/error.svg', $session-color-danger); } // Module: Main Header @@ -2317,7 +1619,7 @@ .module-main-header__title { height: 55px; - padding-left: 16px; + padding-inline-start: 16px; flex: 1; flex-direction: row; display: flex; @@ -2381,7 +1683,7 @@ .module-main-header__contact-name { font-weight: 300; - margin-left: 12px; + margin-inline-start: 12px; color: $color-dark-05; overflow-x: auto; flex: 1; @@ -2401,8 +1703,8 @@ background-color: $color-gray-95; border: 1px solid $color-light-60; padding: 0 26px 0 30px; - margin-left: 8px; - margin-right: 8px; + margin-inline-start: 8px; + margin-inline-end: 8px; outline: 0; height: 32px; width: calc(100% - 16px); @@ -2575,7 +1877,7 @@ height: 36px; width: 36px; - @include color-svg('../images/play.svg', $color-signal-blue); + @include color-svg('../images/play.svg', $color-loki-green); } .module-image__text-container { @@ -2642,8 +1944,8 @@ height: 8px; width: 38px; - padding-left: 1px; - padding-right: 1px; + padding-inline-start: 1px; + padding-inline-end: 1px; } .module-typing-animation__dot { @@ -2745,8 +2047,8 @@ .module-attachments__rail { margin-top: 12px; - margin-left: 16px; - padding-right: 16px; + margin-inline-start: 16px; + padding-inline-end: 16px; overflow-x: scroll; max-height: 142px; white-space: nowrap; @@ -2785,8 +2087,8 @@ background: url('../images/file-gradient.svg') no-repeat center; height: 44px; width: 56px; - margin-left: 32px; - margin-right: 32px; + margin-inline-start: 32px; + margin-inline-end: 32px; margin-bottom: -4px; // So we can center the extension text inside this icon @@ -2804,8 +2106,8 @@ // Along with flow layout in parent item, centers text text-align: center; width: 25px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; // We don't have much room for text here, cut it off without ellipse overflow-x: hidden; @@ -2820,7 +2122,7 @@ margin-top: 5px; text-align: center; - font-family: Roboto; + font-family: $session-font-default; font-size: 14px; overflow: hidden; @@ -2906,8 +2208,8 @@ flex-direction: row; align-items: middle; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } .module-caption-editor__input-container { @@ -2925,21 +2227,21 @@ border-radius: 18px; background-color: $color-black; padding: 9px; - padding-left: 12px; - padding-right: 65px; + padding-inline-start: 12px; + padding-inline-end: 65px; &::placeholder { color: $color-white-07; } &:focus { - border: 1px solid $color-signal-blue; + border: 1px solid $color-loki-green; outline: none; } } .module-caption-editor__save-button { position: absolute; - background-color: $color-signal-blue; + background-color: $color-loki-green; color: $color-white; cursor: pointer; @@ -2947,8 +2249,8 @@ border-radius: 15px; padding: 5px; - padding-left: 12px; - padding-right: 12px; + padding-inline-start: 12px; + padding-inline-end: 12px; right: 4px; top: 4px; @@ -3008,10 +2310,10 @@ } .module-staged-link-preview__icon-container { - margin-right: 8px; + margin-inline-end: 8px; } .module-staged-link-preview__content { - margin-right: 20px; + margin-inline-end: 20px; } .module-staged-link-preview__title { color: $color-gray-90; @@ -3047,8 +2349,8 @@ // Module: Spinner .module-spinner__container { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; position: relative; height: 56px; width: 56px; @@ -3151,7 +2453,7 @@ height: 36px; line-height: 36px; - margin-left: 16px; + margin-inline-start: 16px; font-size: 14px; font-weight: 300; @@ -3168,7 +2470,7 @@ height: 36px; line-height: 36px; - margin-left: 16px; + margin-inline-start: 16px; font-size: 14px; font-weight: 300; @@ -3179,7 +2481,7 @@ height: 36px; line-height: 36px; - margin-left: 16px; + margin-inline-start: 16px; font-size: 14px; font-weight: 300; @@ -3190,8 +2492,8 @@ .module-message-search-result { padding: 8px; - padding-left: 16px; - padding-right: 16px; + padding-inline-start: 16px; + padding-inline-end: 16px; min-height: 64px; max-width: 300px; @@ -3211,7 +2513,7 @@ .module-message-search-result__text { flex-grow: 1; - margin-left: 12px; + margin-inline-start: 12px; // parent - 48px (for avatar) - 16px (our right margin) max-width: calc(100% - 64px); @@ -3241,7 +2543,7 @@ .module-message-search-result__header__timestamp { flex-shrink: 0; - margin-left: 6px; + margin-inline-start: 6px; font-size: 11px; line-height: 16px; @@ -3289,8 +2591,6 @@ // Module: Left Pane .module-left-pane { - border-right: 1px solid $color-dark-90; - display: inline-flex; flex-direction: column; width: 380px; @@ -3336,7 +2636,7 @@ } .module-left-pane__to-inbox-button { - margin-left: 2px; + margin-inline-start: 2px; width: 35px; height: 35px; @@ -3430,7 +2730,7 @@ .module-start-new-conversation__content { overflow: hidden; - margin-left: 12px; + margin-inline-start: 12px; flex: 1; } @@ -3462,6 +2762,7 @@ border: 1px solid $color-dark-05; opacity: 0; user-select: none; + transition: opacity $session-transition-duration; } .react-contextmenu--visible { @@ -3477,10 +2778,10 @@ line-height: 18px; white-space: nowrap; - padding-left: 16px; + padding-inline-start: 16px; padding-top: 3px; padding-bottom: 2px; - padding-right: 16px; + padding-inline-end: 16px; } .react-contextmenu-item--checked:before { @@ -3497,6 +2798,7 @@ .react-contextmenu-item.react-contextmenu-submenu > .react-contextmenu-item { padding-right: 36px; + // We will probably need to make this padding-inline-end once the whole app is working on rtl } .react-contextmenu-item.react-contextmenu-submenu @@ -3529,14 +2831,6 @@ // All media query widths have 300px added to account for the left pane // And have been tweaked for smoother transitions -// To hide in small breakpoints -.module-message__buttons__download { - display: none; -} -.module-message__buttons__reply { - display: none; -} - // To limit messages with things forcing them wider, like long attachment names .module-message__container { max-width: 300px; @@ -3557,20 +2851,12 @@ // Spec: container < 438px .module-message--incoming { - margin-left: 0; - margin-right: auto; + margin-inline-start: 0; + margin-inline-end: auto; } .module-message--outgoing { - margin-right: 0; - margin-left: auto; - } - - // To hide in small breakpoints - .module-message__buttons__download { - display: inline-block; - } - .module-message__buttons__reply { - display: inline-block; + margin-inline-end: 0; + margin-inline-start: auto; } // To hide in larger breakpoints @@ -3596,20 +2882,12 @@ } .module-message--incoming { - margin-left: 0; - margin-right: auto; + margin-inline-start: 0; + margin-inline-end: auto; } .module-message--outgoing { - margin-right: 0; - margin-left: auto; - } - - // To hide in small breakpoints - .module-message__buttons__download { - display: inline-block; - } - .module-message__buttons__reply { - display: inline-block; + margin-inline-end: 0; + margin-inline-start: auto; } // To hide in larger breakpoints diff --git a/stylesheets/_options.scss b/stylesheets/_options.scss deleted file mode 100644 index 51b78dccd..000000000 --- a/stylesheets/_options.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import 'variables'; -@import 'progress'; diff --git a/stylesheets/_progress.scss b/stylesheets/_progress.scss deleted file mode 100644 index 2b7d7b421..000000000 --- a/stylesheets/_progress.scss +++ /dev/null @@ -1,87 +0,0 @@ -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress-bar-striped { - background-image: -webkit-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.75) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.75) 50%, - rgba(255, 255, 255, 0.75) 75%, - transparent 75%, - transparent - ); - background-image: -o-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.75) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.75) 50%, - rgba(255, 255, 255, 0.75) 75%, - transparent 75%, - transparent - ); - background-image: linear-gradient( - 45deg, - rgba(255, 255, 255, 0.75) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.75) 50%, - rgba(255, 255, 255, 0.75) 75%, - transparent 75%, - transparent - ); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress-bar-striped { - background-image: -webkit-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.75) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.75) 50%, - rgba(255, 255, 255, 0.75) 75%, - transparent 75%, - transparent - ); - background-image: -o-linear-gradient( - 45deg, - rgba(255, 255, 255, 0.75) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.75) 50%, - rgba(255, 255, 255, 0.75) 75%, - transparent 75%, - transparent - ); - background-image: linear-gradient( - 45deg, - rgba(255, 255, 255, 0.75) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.75) 50%, - rgba(255, 255, 255, 0.75) 75%, - transparent 75%, - transparent - ); -} -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.bar-container { - background: $blue_l; - - .progress-bar { - height: 100%; - } -} diff --git a/stylesheets/_quote.scss b/stylesheets/_quote.scss new file mode 100644 index 000000000..8bdca3d76 --- /dev/null +++ b/stylesheets/_quote.scss @@ -0,0 +1,366 @@ +// This is related to all quote logics +.module-quote { + position: relative; + + cursor: pointer; + display: flex; + flex-direction: row; + align-items: stretch; + overflow: hidden; + border-radius: 4px; + border-left-width: 4px; + border-left-style: solid; + + @include themify($themes) { + border-color: themed('accentButton'); + } + + &__primary__type-label { + @include themify($themes) { + border-color: themed('textColor'); + } + } +} + +// This is related to the bottomBar quote&mention logic +.bottom-bar .module-quote { + margin: 0; + border-left-style: none; + @include themify($themes) { + background: themed('quoteBottomBarBackground'); + } + + .module-quote__primary__author { + @include themify($themes) { + color: themed('textColor'); + } + } + .module-quote__primary__text { + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } + a { + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } + } + } + + // close button when quoting a message + &__close { + &-container { + @include themify($themes) { + background: themed('backgroundPrimary'); + } + } + + &-button { + @include themify($themes) { + @include color-svg('../images/x.svg', themed('foregroundPrimary')); + } + } + } +} + +// This is related to the quote logic inside messages +.module-quote { + &--incoming { + @include themify($themes) { + background: themed('sentMessageBackground'); + } + } + + &--outgoing { + @include themify($themes) { + background: themed('receivedMessageBackground'); + } + .module-quote__primary__author { + @include themify($themes) { + color: themed('sentMessageText'); + font-weight: bold; + } + } + .module-quote__primary__text { + @include themify($themes) { + @include session-color-subtle(themed('sentMessageText')); + } + a { + @include themify($themes) { + @include session-color-subtle(themed('sentMessageText')); + } + } + } + } + + &--incoming { + .module-quote__primary__author { + @include themify($themes) { + color: themed('receivedMessageText'); + font-weight: bold; + } + } + .module-quote__primary__text { + @include themify($themes) { + @include session-color-subtle(themed('receivedMessageText')); + } + a { + @include themify($themes) { + @include session-color-subtle(themed('receivedMessageText')); + } + } + } + } +} + +.module-quote__icon-container__icon--file { + @include color-svg('../images/file.svg', $color-loki-green); +} +.module-quote__icon-container__icon--image { + @include color-svg('../images/image.svg', $color-loki-green); +} +.module-quote__icon-container__icon--microphone { + @include color-svg('../images/microphone.svg', $color-loki-green); +} +.module-quote__icon-container__icon--play { + @include color-svg('../images/play.svg', $color-loki-green); +} +.module-quote__icon-container__icon--movie { + @include color-svg('../images/movie.svg', $color-loki-green); +} + +.module-quote__generic-file__text { + color: $color-dark-05; +} + +.module-quote__reference-warning { + background-color: $color-black-06; +} + +.module-quote__reference-warning__icon { + @include color-svg('../images/broken-link.svg', $color-dark-30); +} + +.module-quote__reference-warning__text { + color: $color-dark-05; +} + +.module-quote-container { + margin-inline-start: -6px; + margin-inline-end: -6px; + margin-top: -4px; + margin-bottom: 5px; +} + +.module-quote-container--with-content-above { + margin-top: 3px; +} + +.module-quote--no-click { + cursor: auto; +} + +.module-quote__primary { + flex-grow: 1; + padding-inline-start: 8px; + padding-inline-end: 8px; + padding-top: 7px; + padding-bottom: 7px; + + max-width: 100%; +} + +.module-quote__primary__author { + font-size: 13px; + line-height: 18px; + font-weight: 300; + color: $color-gray-90; + + overflow-x: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.module-quote__primary__profile-name { + font-style: italic; +} + +.module-quote__primary__text { + font-size: 14px; + line-height: 18px; + color: $color-gray-90; + text-align: start; + + a { + color: $color-gray-90; + } + + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; + white-space: pre-wrap; + + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + + // Note: -webkit-line-clamp doesn't work for RTL text, and it forces you to use + // ... as the truncation indicator. That's not a solution that works well for + // all languages. More resources: + // - http://hackingui.com/front-end/a-pure-css-solution-for-multiline-text-truncation/ + // - https://medium.com/mofed/css-line-clamp-the-good-the-bad-and-the-straight-up-broken-865413f16e5 +} + +.module-quote__primary__type-label { + font-style: italic; + color: $color-gray-90; + font-size: 13px; + line-height: 18px; +} + +.module-quote__primary__filename-label { + font-size: 12px; +} + +.module-quote__close-container { + position: absolute; + top: 4px; + right: 4px; + height: 16px; + width: 16px; + + background-color: rgba(255, 255, 255, 0.75); + border-radius: 50%; +} + +.module-quote__close-button { + width: 100%; + height: 100%; + cursor: pointer; + @include color-svg('../images/x.svg', $grey); +} + +.module-quote__icon-container { + flex: initial; + min-width: 54px; + width: 54px; + max-height: 54px; + position: relative; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + + &__inner { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + + text-align: center; + display: flex; + align-items: center; + justify-content: center; + } +} + +.module-quote__icon-container__circle-background { + display: flex; + align-items: center; + justify-content: center; + + height: 32px; + width: 32px; + border-radius: 50%; + background-color: $color-white; +} + +.module-quote__icon-container__icon { + width: 24px; + height: 24px; + + &--file { + @include color-svg('../images/file.svg', $color-loki-green); + } + &--image { + @include color-svg('../images/image.svg', $color-loki-green); + } + &--microphone { + @include color-svg('../images/microphone.svg', $color-loki-green); + } + &--play { + @include color-svg('../images/play.svg', $color-loki-green); + } + &--movie { + @include color-svg('../images/movie.svg', $color-loki-green); + } +} + +.module-quote__generic { + &-file { + display: flex; + flex-direction: row; + align-items: center; + } + &-file__icon { + background: url('../images/file-gradient.svg'); + background-size: 75%; + background-repeat: no-repeat; + height: 28px; + width: 36px; + margin-inline-start: -4px; + margin-inline-end: -6px; + margin-bottom: 5px; + } + &-file__text { + font-size: 14px; + line-height: 18px; + color: $color-gray-90; + + max-width: calc(100% - 26px); + overflow-x: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} + +.module-quote__reference { + &-warning { + height: 26px; + display: flex; + flex-direction: row; + align-items: center; + + background-color: $color-white-085; + padding-inline-start: 8px; + padding-inline-end: 8px; + } + + &-warning__icon { + height: 16px; + width: 16px; + @include color-svg('../images/broken-link.svg', $color-gray-60); + } + + &-warning__text { + margin-inline-start: 6px; + color: $color-gray-90; + font-size: 13px; + line-height: 18px; + } +} + +.bottom-bar .member-item { + @include themify($themes) { + border-bottom: themed('sessionBorder'); + } + + &:hover { + @include themify($themes) { + background: themed('clickableHovered'); + } + } +} diff --git a/stylesheets/_recorder.scss b/stylesheets/_recorder.scss index b76a1985e..040fbb9f5 100644 --- a/stylesheets/_recorder.scss +++ b/stylesheets/_recorder.scss @@ -33,7 +33,7 @@ width: 36px; height: 36px; border-radius: 36px; - margin-left: 5px; + margin-inline-start: 5px; opacity: 0.5; text-align: center; padding: 0; @@ -52,20 +52,20 @@ } .finish { - background: lighten($color-core-green, 20%); - border: 1px solid $color-core-green; + background: lighten($session-color-green, 20%); + border: 1px solid $session-color-green; .icon { - @include color-svg('../images/check.svg', $color-core-green); + @include color-svg('../images/check.svg', $session-color-green); } } .close { - background: lighten($color-core-red, 20%); - border: 1px solid $color-core-red; + background: lighten($session-color-danger, 20%); + border: 1px solid $session-color-danger; .icon { - @include color-svg('../images/x.svg', $color-core-red); + @include color-svg('../images/x.svg', $session-color-danger); } } @@ -94,7 +94,7 @@ width: 10px; height: 10px; background: #f00; - margin-right: 10px; + margin-inline-end: 10px; opacity: 0; animation: pulse 2s infinite; } diff --git a/stylesheets/_rtl.scss b/stylesheets/_rtl.scss new file mode 100644 index 000000000..9b7cf7187 --- /dev/null +++ b/stylesheets/_rtl.scss @@ -0,0 +1,23 @@ +body.rtl { + input, + textarea, + .module-left-pane, + .module-conversation-list-item, + .group-settings-item, + .contact-selection-list, + .group-member-list__selection, + .react-contextmenu-item, + .session-settings-list { + direction: rtl; + } + + // text inside rtl textarea must be manually right-sided + textarea { + text-align: right; + } + // no matter what, keep left-pane-settings on tlr + // because it breaks the UI (arrow and more), and we don't care for now + .left-pane-setting-content { + direction: ltr; + } +} diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 80ba03a01..a3bad8483 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -8,12 +8,6 @@ div.spacer-lg { height: $session-margin-lg; } -// Blur for modals -.loki-dialog ~ .index.inbox { - filter: blur(2px); - transition: filter 0.1s; -} - .subtle { opacity: 0.6; } @@ -48,7 +42,9 @@ textarea { user-select: text; &::selection { - background: rgba($session-color-green, 0.6); + @include themify($themes) { + background: themed('textHighlight'); + } } } } @@ -79,8 +75,8 @@ textarea { .button-group > div { display: inline-flex; - margin-left: 5px; - margin-right: 5px; + margin-inline-start: 5px; + margin-inline-end: 5px; } .session-button { @@ -111,10 +107,14 @@ textarea { &.default, &.square, &.brand { - color: $session-color-white; + @include themify($themes) { + color: themed('foregroundPrimary'); + } &:not(.disabled):hover { - filter: brightness(90%); + @include themify($themes) { + background: themed('clickableHovered'); + } } &.green, @@ -130,14 +130,26 @@ textarea { } &.green { - background-color: $session-color-green; + @include themify($themes) { + background-color: themed('accentButton'); + } } &.white { - background-color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } } &.primary { - background-color: $session-color-primary; + @include themify($themes) { + background-color: themed('backgroundPrimary'); + } + + .session-icon { + @include themify($themes) { + fill: themed('foregroundPrimary'); + } + } } &.secondary { background-color: $session-color-secondary; @@ -162,7 +174,9 @@ textarea { border: none; &.green { - @include transparent-background($session-color-green); + @include themify($themes) { + @include transparent-background(themed('buttonGreen')); + } } &.white { @include transparent-background($session-color-white); @@ -205,8 +219,10 @@ textarea { border-radius: 500px; &:not(.disabled):hover { - color: $session-color-white; - border-color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + border-color: themed('textColor'); + } } } @@ -318,7 +334,7 @@ textarea { position: absolute; font-size: 1.3em; top: -0.5em; - margin-left: -0.125em; + margin-inline-start: -0.125em; } } @@ -333,12 +349,11 @@ textarea { } .session-icon { - fill: $session-color-white; + @include themify($themes) { + fill: themed('textColor'); + } } -$session-separator-element-border: 1px solid $session-shade-6; -$session-element-border-green: 4px solid $session-color-green; - /* CONVERSATION AND MESSAGES */ @mixin standard-icon-button() { @@ -363,7 +378,10 @@ $session-element-border-green: 4px solid $session-color-green; font-size: $session-font-md; &-text { - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } + font-family: $session-font-default; font-weight: 300; font-size: $session-font-xs; @@ -392,8 +410,8 @@ $session-element-border-green: 4px solid $session-color-green; .module-message__author-avatar { display: inline-flex; - margin-right: 20px; - margin-top: 3px; + margin-inline-end: 20px; + padding-top: 5px; } .module-message__container { @@ -418,7 +436,7 @@ label { } .search-icon { - margin-right: 10px; + margin-inline-end: 10px; } .session-icon-button { @@ -461,7 +479,9 @@ label { .session-toast { position: relative; padding: $session-margin-md $session-margin-md; - background-color: rgba($session-shade-6, 0.8); + @include themify($themes) { + background: rgba(themed('cellBackground'), 0.8); + } margin-bottom: $session-margin-md; display: flex; flex-direction: row; @@ -475,10 +495,10 @@ label { } .toast-icon { - padding-right: $session-icon-size-md; + padding-inline-end: $session-icon-size-md; } .toast-info { - margin-right: $session-icon-size-sm + $session-icon-size-sm; + margin-inline-end: $session-icon-size-sm + $session-icon-size-sm; width: 350px; &-container { @@ -496,23 +516,31 @@ label { line-height: $session-font-sm; margin-bottom: $session-margin-sm; padding-top: 0px; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } padding-top: 0px; } .description { font-size: $session-font-xs; - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } } .toast-close { - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } position: absolute; top: $session-margin-md; right: $session-margin-md; &:hover { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } } } @@ -540,8 +568,12 @@ label { box-sizing: border-box; max-height: 70vh; max-width: 70vw; - background-color: $session-shade-4; - border: 1px solid $session-shade-8; + @include themify($themes) { + background-color: themed('modalBackground'); + color: themed('textColor'); + border: themed('sessionBorder'); + box-shadow: themed('sessionShadow'); + } overflow: hidden; display: flex; flex-direction: column; @@ -569,8 +601,8 @@ label { .session-modal__header__icons > div { float: left; - padding-left: 0px; - padding-right: 10px; + padding-inline-start: 0px; + padding-inline-end: 10px; } } @@ -586,7 +618,7 @@ label { } &__icons > div { float: right; - padding-left: 10px; + padding-inline-start: 10px; } } @@ -608,6 +640,10 @@ label { } } + .group-member-list__selection { + overflow-y: auto; + } + &__centered { display: flex; flex-direction: column; @@ -651,22 +687,11 @@ label { } } -.sealed-sender-toggle { - display: flex; - padding: 6px; -} - -.sender-keys-description { - display: flex; - align-items: center; - padding-left: 10px; -} - .session-modal__body { display: flex; flex-direction: column; - .friend-selection-list { + .contact-selection-list { width: unset; } @@ -714,7 +739,8 @@ label { box-shadow: 0 0 3px 1px rgba(0, 0, 0, 0.05), 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05); - transition: transform 0.25s ease, background-color 0.25s ease; + transition: transform $session-transition-duration ease, + background-color $session-transition-duration ease; } &.active { @@ -738,13 +764,15 @@ label { .react-contextmenu-item { display: flex; align-items: center; + transition: $session-transition-duration; height: 25px; padding: $session-margin-md $session-margin-sm; - background-color: $session-shade-4; - - color: $session-color-white; + @include themify($themes) { + background: themed('contextMenuBackground'); + color: themed('textColor'); + } font-family: $session-font-accent; font-size: $session-font-sm; line-height: $session-icon-size-sm; @@ -752,7 +780,9 @@ label { &--active, &--selected { - background-color: $session-shade-7 !important; + @include themify($themes) { + background: themed('clickableHovered'); + } } &:active, &:visited, @@ -773,8 +803,17 @@ label { height: 50px; padding: 0px $session-margin-md; font-size: $session-font-sm; - color: $session-color-white; - background-color: $session-shade-1; + + @include themify($themes) { + color: themed('textColor'); + background: themed('cellBackground'); + } + + &:hover { + @include themify($themes) { + background: themed('clickableHovered'); + } + } .session-icon { opacity: 0.6; @@ -782,7 +821,7 @@ label { } &__list-container { - z-index: 200; + z-index: 99; display: block; position: absolute; top: 50px; @@ -802,33 +841,43 @@ label { justify-content: center; height: 35px; padding: 0 $session-margin-md; - color: $session-color-white; - background-color: $session-shade-1; + @include themify($themes) { + background: themed('cellBackground'); + color: themed('textColor'); + } font-size: 0.8rem; width: -webkit-fill-available; transition: $session-transition-duration; &:first-child { - border-top: $session-separator-element-border; + @include themify($themes) { + border-top: themed('sessionBorder'); + } } &:last-child { - border-bottom: $session-separator-element-border; + @include themify($themes) { + border-top: themed('sessionBorder'); + } } &:hover { - @include session-dark-background-hover; + @include themify($themes) { + background: themed('clickableHovered'); + } } .session-icon { - margin-left: 6px; + margin-inline-start: 6px; } .item-content { - margin-left: 6px; + margin-inline-start: 6px; } &.active, &:hover { - background-color: $session-shade-7; + @include themify($themes) { + background: themed('clickableHovered'); + } } &.danger { @@ -837,112 +886,15 @@ label { } &:hover { + @include themify($themes) { + background: themed('clickableHovered'); + } .session-icon { opacity: 1; } } } -.edit-profile-dialog { - .session-modal__header__title { - font-size: $session-font-lg; - } - - .session-modal { - width: $session-modal-size-md; - - &__header { - height: 68.45px; - } - } - - .avatar-center-inner { - position: relative; - - .module-avatar { - box-shadow: 0 0 23px 0 rgba($session-color-black, 0.78); - } - - .qr-view-button { - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - position: absolute; - right: -3px; - height: 26px; - width: 26px; - border-radius: 50%; - padding-top: 3px; - background-color: $session-color-white; - transition: $session-transition-duration; - - &:hover { - filter: brightness(90%); - } - - .session-icon-button { - opacity: 1; - } - } - } - - .session-id-section { - display: flex; - align-items: center; - flex-direction: column; - - .panel-text-divider { - margin-top: 35px; - margin-bottom: 35px; - } - - &-display { - user-select: text; - text-align: center; - word-break: break-all; - font-size: $session-font-md; - padding: 0px $session-margin-lg; - font-family: $session-font-default; - font-weight: 100; - color: rgba($session-color-white, 0.8); - font-size: $session-font-md; - padding: 0px $session-margin-sm; - } - - .session-button { - width: 148px; - } - } - - .profile-name { - display: flex; - justify-content: center; - margin-top: $session-margin-lg; - - &-input { - height: 38px; - width: 142px; - border-radius: 5px; - text-align: center; - font-size: $session-font-md; - background-color: $session-shade-5 !important; - } - - &-uneditable { - display: flex; - align-items: center; - justify-content: center; - margin-left: $session-margin-lg; - - p { - font-size: $session-font-md; - padding: 0px $session-margin-sm; - } - } - } -} - .image-upload-section { display: flex; align-items: center; @@ -953,7 +905,6 @@ label { height: 80px; border-radius: 100%; background-color: rgba($session-color-black, 0.72); - box-shadow: 0px 0px 3px 0.5px rgba(0, 0, 0, 0.75); opacity: 0; transition: $session-transition-duration; @@ -1063,9 +1014,10 @@ label { flex-direction: row; justify-content: center; align-items: center; - background-color: $session-shade-6; height: $main-view-header-height; - + @include themify($themes) { + background: themed('cellBackground'); + } &-title { line-height: $main-view-header-height; font-weight: bold; @@ -1076,19 +1028,20 @@ label { .session-button, .session-icon-button { - margin-right: $session-margin-lg; + margin-inline-end: $session-margin-lg; } } &-item { font-size: $session-font-md; - color: $session-color-white; - background-color: $session-shade-1; - padding: $session-margin-lg; margin-bottom: 20px; - border-bottom: 1px solid $session-shade-5; + @include themify($themes) { + background: themed('cellBackground'); + color: themed('textColor'); + border-bottom: themed('sessionBorder'); + } &.inline { display: flex; align-items: center; @@ -1096,7 +1049,7 @@ label { } &__info { - padding-right: $session-margin-lg; + padding-inline-end: $session-margin-lg; } &__title { @@ -1110,12 +1063,21 @@ label { font-size: $session-font-sm; font-weight: 100; max-width: 700px; - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } } &__content { label { - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } + } + } + &__selection { + .session-toggle { + transition: $session-transition-duration; } } } @@ -1133,7 +1095,7 @@ label { justify-content: space-between; padding: $session-margin-sm $session-margin-md; - background-color: $session-shade-5; + background: none; font-size: $session-font-xs; span { @@ -1197,14 +1159,6 @@ label { border-radius: 3px; } -.qr-dialog { - &__description { - max-width: $session-modal-size-sm; - text-align: center; - margin: 0 auto; - } -} - .seed-dialog { &__description { max-width: $session-modal-size-lg; @@ -1229,13 +1183,53 @@ label { } } +.bottom-bar { + .compose { + max-height: 200px; + } + + .send-message-container { + display: flex; + flex-grow: 1; + height: 48px; + margin-bottom: -5px; + } + + textarea.send-message { + @include themify($themes) { + background: themed('composeViewBackground'); + color: themed('textColor'); + } + border: none; + margin: 0px; + padding: 0px $session-margin-lg; + font-size: $session-font-md; + line-height: 1.3em; + align-self: center; + } +} + +.bottom-bar form { + &.send { + @include themify($themes) { + background: themed('composeViewBackground'); + } + } + + &.active textarea { + border: none; + } +} + .dark-theme .bottom-bar .send-message[disabled='disabled'] { - background: $session-shade-4 !important; + @include themify($themes) { + background: themed('composeViewBackground'); + } } .session-radio-group fieldset { border: none; - margin-left: $session-margin-sm; + margin-inline-start: $session-margin-sm; margin-top: $session-margin-sm; .session-radio { @@ -1253,7 +1247,7 @@ label { } label { - margin-right: 1em; + margin-inline-end: 1em; } label:before { @@ -1261,22 +1255,29 @@ label { display: inline-block; width: 0.5em; height: 0.5em; - margin-right: 0.8em; + margin-inline-end: 0.8em; border-radius: 100%; vertical-align: -3px; border: 2px solid rgba($session-color-white, 0.6); padding: 0.2em; - background-color: transparent; + @include themify($themes) { + background: none; + border-color: themed('accent'); + } background-clip: content-box; + transition: $session-transition-duration; } input:hover + label:before { - border-color: $session-color-white; + @include themify($themes) { + background: themed('accent'); + } } input:checked + label:before { - background-color: $session-color-white; - border-color: $session-color-white; + @include themify($themes) { + background: themed('accent'); + } } } @@ -1295,7 +1296,7 @@ label { padding: 0px 5px 20px 5px; &.session-id-editable-textarea:placeholder-shown { - padding: 20px 5px 0px 5px; + padding: 10px 5px 0px 5px; } &.group-id-editable-textarea { @@ -1311,7 +1312,9 @@ input { .dark-theme .invite-friends-dialog .member-item { height: 64px; background-color: $session-shade-4; - border: $session-separator-element-border; + @include themify($themes) { + border: themed('sessionBorder'); + } display: flex; align-items: center; transition: $session-transition-duration; @@ -1330,37 +1333,10 @@ input { } } -.dark-theme .modal .content { - background-color: $session-shade-4; -} - -.loki-dialog button { - border: none; -} - -.friend-selection-list { +.contact-selection-list { width: 20vw; } -.session-beta-disclaimer { - .session-modal { - width: 600px; - - &__header { - font-size: $session-font-lg; - } - - &__body > div:first-child { - padding: $session-margin-lg; - } - - .session-confirm-main-message { - opacity: 0.8; - margin-bottom: $session-margin-xs; - } - } -} - .session-confirm-wrapper { position: absolute; height: 100%; @@ -1400,131 +1376,15 @@ input { } } -/* Memberlist */ -.member-list-container .member { - &-item { - font-family: $session-font-default; - padding: $session-margin-sm $session-margin-md; - background-color: $session-shade-5; - - &:hover:not(.member-selected) { - background-color: $session-shade-7; - } - } - - &-selected { - background-color: $session-shade-8; - } -} - -.standalone { - .button { - background: $session-color-green; - } - - #reset-button { - color: $session-color-green; - } - - .inputs { - input { - color: $color-dark-05; - background-color: $color-dark-70; - border-color: $color-dark-55; - - &:focus { - outline: none; - } - } - } -} - -.onboarding-message-section { - display: flex; - flex-grow: 1; - align-items: flex-start; - position: relative; - padding: $session-margin-lg 2 * $session-margin-lg; - background: linear-gradient( - 180deg, - rgba(29, 28, 28, 1) 0%, - rgba(18, 18, 18, 1) 100% - ); - - &__exit { - position: absolute; - top: $session-margin-lg; - left: $session-margin-lg; - } - - &__container { - display: flex; - flex-grow: 1; - flex-direction: column; - align-items: center; - justify-content: space-between; - padding-top: 3 * $session-margin-lg; - - height: 400px; - - text-align: center; - font-family: $session-font-default; - } - - &__title h1 { - color: $session-color-white; - font-size: $session-font-h1; - font-weight: bold; - margin-bottom: 2 * $session-margin-lg; - } - - &__icons img { - width: 180px; - margin-bottom: 2 * $session-margin-lg; - } - - &__info { - font-family: $session-font-accent; - margin-bottom: 2 * $session-margin-lg; - - &--title { - font-size: $session-font-h3; - line-height: $session-font-h2; - margin-bottom: $session-margin-md; - } - - &--subtitle { - font-family: $session-font-default; - font-weight: 300; - line-height: $session-font-md; - opacity: 0.8; - } - } - - &__spinner-container { - display: flex; - flex-grow: 1; - align-items: center; - justify-content: center; - } - - &__buttons { - width: 100%; - - .session-button:first-child { - margin-bottom: $session-margin-md; - } - } -} - .group-member-list { &__container { padding: 2px 0px; width: 100%; max-height: 400px; overflow-y: auto; - box-shadow: inset 0px 14px 7px -15px $session-color-dark-grey, - inset 0px -14px 7px -15px $session-color-dark-grey; + @include themify($themes) { + border: themed('sessionBorder'); + } } &__selection { @@ -1535,18 +1395,14 @@ input { &__no-contacts { font-family: $session-font-mono; + @include themify($themes) { + background: themed('cellBackground'); + } text-align: center; padding: 20px; } - - // Height at which scroll bar appears on the group member list - @media (max-height: 804px) { - &__container { - overflow-y: visible; - max-height: none; - } - } } + .create-group-name-input { display: flex; justify-content: center; @@ -1573,16 +1429,26 @@ input { display: flex; justify-content: space-between; transition: $session-transition-duration; - - &:first-child { - border-top: 1px solid rgba($session-shade-8, 0.6); + @include themify($themes) { + background: themed('cellBackground'); } - &:last-child { - border-bottom: 1px solid rgba($session-shade-8, 0.6); + + &:not(:last-child) { + @include themify($themes) { + border-bottom: themed('sessionBorder'); + } + } + + &:hover { + @include themify($themes) { + background-color: themed('clickableHovered'); + } } &.selected { - background-color: $session-shade-4; + @include themify($themes) { + background-color: themed('conversationItemSelected'); + } } &__checkmark { @@ -1591,6 +1457,11 @@ input { &.selected { opacity: 1; + svg { + @include themify($themes) { + fill: themed('accent') !important; + } + } } } @@ -1602,10 +1473,10 @@ input { &__name { font-weight: bold; - margin-left: $session-margin-md; + margin-inline-start: $session-margin-md; } &__pubkey { - margin-left: 5px; + margin-inline-start: 5px; opacity: 0.8; } @@ -1614,11 +1485,6 @@ input { } } -.invite-friends-container { - height: $session-icon-size-lg; - width: $session-icon-size-lg; -} - .module-message-detail { .module-message { pointer-events: none; diff --git a/stylesheets/_session_constants.scss b/stylesheets/_session_constants.scss index c977852ee..a87ebcc34 100644 --- a/stylesheets/_session_constants.scss +++ b/stylesheets/_session_constants.scss @@ -73,9 +73,6 @@ $session-font-mono: 'SpaceMono'; // Brand $session-color-green: #00f782; -$session-color-green-alt-1: #00f480; -$session-color-green-alt-2: #00fd73; -$session-color-green-alt-3: #00f782; // Shades $session-shade-1: #0c0c0c; @@ -125,7 +122,6 @@ $session-color-secondary: $session-shade-6; // Opacity and Shadow $session-shadow-opacity: 0.15; $session-overlay-opacity: 0.3; -$session-dark-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.37); // ////////////////////////////////////////////// // /////////////////// Text ///////////////////// @@ -157,7 +153,13 @@ $session-font-h4: 16px; } @mixin session-color-subtle($color) { - color: rgba($color, 0.6); + color: subtle($color); +} + +$session-subtle-factor: 0.6; + +@function subtle($color) { + @return rgba($color, $session-subtle-factor); } // ////////////////////////////////////////////// @@ -215,18 +217,3 @@ $session-fadein-duration: 0.1s; @mixin session-dark-background-hover { background-color: $session-shade-7; } -@mixin session-filter-color-green { - filter: brightness(0) saturate(100%) invert(67%) sepia(69%) saturate(2367%) - hue-rotate(101deg) brightness(107%) contrast(101%); -} - -$session-gradient-green: linear-gradient( - 270deg, - rgba($session-color-green-alt-1, 1), - rgba($session-color-green-alt-1, 0.6) -); -$session-gradient-black: linear-gradient( - 90deg, - rgba($session-shade-3, 1), - rgba($session-shade-4, 0.6) -); diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index 6ec497c16..4403555cd 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -1,21 +1,25 @@ .conversation-content-right { transition: $session-transition-duration; width: 22vw; - margin-right: -22vw; + margin-inline-end: -22vw; } .group-settings { display: flex; flex-direction: column; height: 100vh; - width: 22vw; - flex-shrink: 0; - border: $session-separator-element-border; - background-color: $session-shade-4; + width: -webkit-fill-available; + + @include themify($themes) { + background: themed('leftpaneOverlayBackground'); + border-left: themed('sessionBorder'); + } align-items: center; &-header { margin-top: $session-margin-lg; + margin-inline-start: $session-margin-sm; + margin-inline-end: $session-margin-sm; width: -webkit-fill-available; display: flex; flex-direction: row; @@ -24,11 +28,6 @@ .module-avatar { margin: auto; } - - .session-icon-button, - .invite-friends-container { - margin: 0 $session-margin-md; - } } h2 { @@ -37,11 +36,13 @@ .description { margin: $session-margin-md 0; - border: $session-separator-element-border; - background-color: $session-shade-1; min-height: 4rem; width: inherit; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + background: themed('cellBackground'); + border: themed('sessionBorder'); + } text-align: center; display: none; } @@ -49,19 +50,23 @@ &-item { display: flex; align-items: center; - background-color: $session-shade-1; min-height: 3rem; font-size: 0.8rem; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + background: themed('cellBackground'); + border-top: themed('sessionBorder'); + border-bottom: themed('sessionBorder'); + } width: -webkit-fill-available; padding: 0 $session-margin-md; - border-bottom: $session-separator-element-border; - border-top: $session-separator-element-border; transition: $session-transition-duration; cursor: pointer; &:hover { - @include session-dark-background-hover; + @include themify($themes) { + background: themed('clickableHovered'); + } } } @@ -75,10 +80,14 @@ margin-top: auto; width: 100%; border: none; - height: 60px; + height: 51px; background-color: black; flex-shrink: 0; align-items: center; + @include themify($themes) { + border: none; + border-top: themed('sessionBorder'); + } } .module-empty-state { @@ -104,7 +113,9 @@ } &__tab { - color: white; + @include themify($themes) { + color: themed('textColor'); + } font-weight: bold; font-size: 0.9rem; padding: 0.6rem; @@ -120,7 +131,9 @@ margin: 0 auto; width: 70%; padding-top: 0.5rem; - border-bottom: $session-element-border-green; + @include themify($themes) { + border-bottom: themed('sessionUnreadBorder'); + } } } } @@ -131,12 +144,13 @@ .module-media-grid-item__image, .module-media-grid-item { height: calc( - 22vw / 3.5 - ); //.group-settings is 22vw and we want three rows with some space so divide it by 3.5 + 22vw / 4 + ); //.group-settings is 22vw and we want three rows with some space so divide it by 4 width: calc( - 22vw / 3.5 - ); //.group-settings is 22vw and we want three rows with some space so divide it by 3.5 + 22vw / 4 + ); //.group-settings is 22vw and we want three rows with some space so divide it by 4 margin: auto; + margin-bottom: 1vh; } } } diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 71fb51a5e..7338410aa 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -1,65 +1,63 @@ $session-compose-margin: 20px; -.module-conversation-list-item { - transition: $session-transition-duration; - @at-root .light-theme #{&} { - @include session-dark-background-lighter; - &:hover { - @include session-dark-background-hover; - } - } - @at-root .dark-theme #{&} { - @include session-dark-background-lighter; - &:hover { - @include session-dark-background-hover; - } - } - - &--is-selected { - @at-root .light-theme #{&} { - @include session-dark-background-hover; - &:hover { - @include session-dark-background-hover; - } - } - @at-root .dark-theme #{&} { - @include session-dark-background-hover; - &:hover { - @include session-dark-background-hover; - } - } - .module-conversation__user__profile-number, - .module-conversation__user__profile-name, - .module-conversation-list-item__message__text { - @at-root .light-theme #{&} { - color: $session-color-black; - } - @at-root .dark-theme #{&} { - color: $session-color-white; - } - } - } -} .gutter { width: 380px !important; - background: none !important; - padding-right: 5px !important; + padding-inline-end: 5px !important; + transition: $session-transition-duration; + + @include themify($themes) { + background: themed('cellBackground'); + } } .module-conversation { + // default conversation list item text color + &__user__profile { + &-number, + &-name { + @include fontAccentBold(); + font-size: 15px; + + @include themify($themes) { + color: themed('textColorSubtle'); + } + } + } + &-list-item { + transition: $session-transition-duration; + + &:hover { + @include themify($themes) { + background: themed('clickableHovered'); + } + } + + &--is-selected { + @include themify($themes) { + background: themed('conversationItemSelected'); + } + + .module-conversation__user__profile-number, + .module-conversation__user__profile-name, + .module-conversation-list-item__message__text { + @include themify($themes) { + color: themed('textColor'); + } + } + } + &--has-unread { - border-left: $session-element-border-green !important; + @include themify($themes) { + border-left: themed('sessionUnreadBorder'); + background: themed('conversationItemHasUnread'); + } } &__unread-count { - @at-root .light-theme #{&} { - color: $session-color-black !important; - background-color: $session-color-white !important; - } - @at-root .dark-theme #{&} { - color: $session-color-white !important; - background-color: $session-shade-10 !important; + @include themify($themes) { + color: themed('textColor'); + background: themed('clickableHovered'); } position: static !important; @@ -77,76 +75,31 @@ $session-compose-margin: 20px; &__message__text { color: $session-shade-17; &--has-unread { - @at-root .light-theme #{&} { - color: $session-shade-4 !important; - } - @at-root .dark-theme #{&} { - color: $session-color-white !important; + @include themify($themes) { + color: themed('textColor'); } } } &__header__name { - flex-grow: 0 !important; - padding-right: 5px !important; - - @at-root .light-theme #{&} { - color: $session-color-black; - } - @at-root .dark-theme #{&} { - color: $session-shade-17; - } + flex-grow: 0; + padding-inline-end: 5px; } &__header__name--with-unread .module-conversation__user__profile-number, &__header__name--with-unread .module-conversation__user__profile-name { - @at-root .light-theme #{&} { - color: $session-color-black; - } - @at-root .dark-theme #{&} { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); } } } - - &__user__profile { - &-number, - &-name { - @include fontAccentBold(); - font-size: 15px; - - @at-root .light-theme #{&} { - color: $session-color-white; - } - @at-root .dark-theme #{&} { - color: $session-shade-17; - } - } - } -} - -.inbox { - @at-root .light-theme #{&} { - color: $session-color-black; - } - @at-root .dark-theme #{&} { - @include session-dark-background; - } } .module-left-pane { - border-right: 1px solid rgba($session-color-white, 0.1) !important; width: $session-left-pane-width; position: relative; height: -webkit-fill-available; - @at-root .light-theme #{&} { - background: $session-color-white !important; - } - @at-root .dark-theme #{&} { - background: $session-shade-4 !important; - } - &-session { display: flex; height: 100vh; @@ -157,6 +110,9 @@ $session-compose-margin: 20px; width: $session-left-pane-sections-container-width; display: inline-flex; flex-direction: column; + @include themify($themes) { + border-right: themed('sessionBorder'); + } .module-avatar, .session-icon-button { @@ -166,7 +122,6 @@ $session-compose-margin: 20px; &:last-child { margin: auto auto 0px auto; /* Hide theme icon until light theme is ready */ - display: none; } &:first-child { @@ -182,17 +137,11 @@ $session-compose-margin: 20px; justify-content: space-between; align-items: center; height: $main-view-header-height; - padding-right: 7px; - - @at-root .light-theme #{&} { - background-color: $session-color-white; - } - @at-root .dark-theme #{&} { - background-color: $session-shade-3; - } + padding-inline-end: 7px; + transition: $session-transition-duration; .session-button { - margin-left: auto; + margin-inline-start: auto; @include fontAccentBold(); } @@ -209,9 +158,10 @@ $session-compose-margin: 20px; &__title { cursor: pointer; - padding-right: $session-margin-sm; - padding-left: $session-margin-sm; + padding-inline-end: $session-margin-sm; + padding-inline-start: $session-margin-sm; transition: $session-transition-duration; + flex-grow: 1; } &__list { @@ -224,18 +174,10 @@ $session-compose-margin: 20px; } } - &-compose { - @at-root .light-theme #{&} { - background: $session-color-white; - } - @at-root .dark-theme #{&} { - @include session-dark-background-lighter; - } - } - &-overlay { - background: linear-gradient(180deg, #171717 0%, $session-background 100%); - box-shadow: 0 0 100px 0 rgba(0, 0, 0, 0.5); + @include themify($themes) { + background: themed('leftpaneOverlayBackground'); + } display: flex; flex-direction: column; flex-grow: 1; @@ -262,8 +204,10 @@ $session-compose-margin: 20px; .green-border { position: absolute; - color: $session-color-green; - background-color: $session-color-green; + @include themify($themes) { + color: themed('accent'); + background-color: themed('accent'); + } height: 5px; left: -10px; right: -10px; @@ -284,7 +228,7 @@ $session-compose-margin: 20px; .exit { margin-top: 10px; - margin-left: 13px; + margin-inline-start: 13px; align-self: flex-start; } @@ -335,6 +279,11 @@ $session-compose-margin: 20px; display: flex; flex-direction: column; flex-grow: 1; + transition: $session-transition-duration; + + @include themify($themes) { + background: themed('conversationList'); + } .left-pane-contact-bottom-buttons .session-button { vertical-align: middle; @@ -352,6 +301,7 @@ $session-compose-margin: 20px; .user-search-dropdown { width: 100%; + min-height: 34px; flex-grow: 1; overflow-y: auto; } @@ -359,20 +309,11 @@ $session-compose-margin: 20px; .session-search-input { height: $session-search-input-height; width: 100%; - margin-right: 1px; + margin-inline-end: 1px; margin-bottom: 10px; display: inline-flex; flex-shrink: 0; - @at-root .light-theme #{&} { - color: $session-color-black; - background: $session-color-white; - } - @at-root .dark-theme #{&} { - color: $session-color-white; - background: $session-shade-4; - } - .session-icon-button { margin: auto 10px; } @@ -385,55 +326,71 @@ $session-compose-margin: 20px; font-size: $session-font-sm; font-family: $session-font-default; text-overflow: ellipsis; - + background: none; + @include themify($themes) { + color: themed('textColor'); + } &:focus { outline: none !important; } - - @at-root .light-theme #{&} { - color: $session-color-black; - background: $session-color-white; - } - @at-root .dark-theme #{&} { - color: $session-color-white; - background: $session-shade-4; - } } } +.conversation.placeholder .container { + display: flex; + height: 100%; +} + .session-full-logo { - width: 250px; - height: 250px; + display: flex; + flex-direction: column; + align-items: center; + margin: auto; + + .session-brand-logo { + height: 180px; + filter: brightness(0) saturate(100%) invert(75%) sepia(84%) saturate(3272%) + hue-rotate(103deg) brightness(106%) contrast(103%); + } + + .session-text-logo { + margin-top: 10px; + width: 250px; + @include themify($themes) { + filter: themed('filterSessionText'); + } + transition: 0s; + } } .app-loading-screen { - @include session-dark-background; + @include themify($themes) { + background: themed('inboxBackground'); + } + .session-text-logo { + @include themify($themes) { + filter: themed('filterSessionText') !important; + } + // filter: none ; // force no filter on the text of the app loading + // as the theme is not set right on the start. + // this is to avoid a text color switch on app loading. + } } @mixin bottom-buttons() { display: flex; flex-direction: row; width: 100%; - - @at-root .light-theme #{&} { - background-color: $session-color-white; - } - @at-root .dark-theme #{&} { - background-color: $session-background; - } + background: none; .session-button.square-outline.square.green, .session-button.square-outline.square.white, .session-button.square-outline.square.danger { flex-grow: 1; - height: 50px; - // line-height: 50px; + height: 51px; - @at-root .light-theme #{&} { - border: 1px solid $session-shade-15; - } - @at-root .dark-theme #{&} { - border: 1px solid $session-shade-6; + @include themify($themes) { + border: themed('sessionBorder'); } } } @@ -448,27 +405,30 @@ $session-compose-margin: 20px; padding: 8px 20px; margin: 0px $session-compose-margin; - @at-root .light-theme #{&} { - background: $session-shade-15; - color: $session-color-black; - } - @at-root .dark-theme #{&} { - background: $session-shade-4; - color: $session-color-light-grey; - } + // FIXME themify once this component is enabled back + // @at-root .light-theme #{&} { + // background: $session-shade-15; + // color: $session-color-black; + // } + // @at-root .dark-theme #{&} { + // background: $session-shade-4; + // color: $session-color-light-grey; + // } &-selected, &:hover { font-weight: bold; - @at-root .light-theme #{&} { - color: $session-color-black; - background: $session-color-white; - } - @at-root .dark-theme #{&} { - color: $session-color-white; - background: $session-shade-8; - } + // FIXME themify once this component is enabled back + + // @at-root .light-theme #{&} { + // color: $session-color-black; + // background: $session-color-white; + // } + // @at-root .dark-theme #{&} { + // color: $session-color-white; + // background: $session-shade-8; + // } } } } @@ -482,25 +442,6 @@ $session-compose-margin: 20px; flex: 1; .module-conversation-list-item { - background-color: $session-shade-4; - - &--is-selected { - background-color: $session-shade-5; - } - - &--has-friend-request { - &:first-child { - border-top: none !important; - } - - border: 1px solid $session-shade-8 !important; - - .module-conversation__user__profile-number, - .module-conversation__user__profile-name { - font-size: 13px !important; - } - } - &__header__date, &__message { display: none; @@ -520,10 +461,6 @@ $session-compose-margin: 20px; } } - &-content { - @include session-dark-background-lighter; - } - &-bottom-buttons { @include bottom-buttons(); @@ -546,7 +483,7 @@ $session-compose-margin: 20px; } &-category-list-item { - @include session-dark-background; + background: none; display: flex; flex-direction: row; justify-content: space-between; @@ -563,11 +500,15 @@ $session-compose-margin: 20px; } &.active { - background-color: $session-shade-5; + @include themify($themes) { + background: themed('conversationItemSelected'); + } } &:hover { - background-color: $session-shade-6; + @include themify($themes) { + background: themed('clickableHovered'); + } } &__buttons { @@ -617,16 +558,6 @@ $session-compose-margin: 20px; } } -.friend-request-title { - font-weight: bold; - font-size: 13px; - padding: 11px; - border-right: 1px solid $session-shade-8 !important; - border-top: 1px solid $session-shade-8 !important; - border-left: 1px solid $session-shade-8 !important; - @include session-dark-background-lighter; -} - .panel-text-divider { width: 100%; text-align: center; @@ -634,7 +565,9 @@ $session-compose-margin: 20px; margin: 50px 0 50px; .panel-text-divider-line { - border-bottom: 1px solid $session-color-dark-grey; + @include themify($themes) { + border-bottom: 1px solid themed('pillDividerColor'); + } line-height: 0.1em; flex-grow: 1; height: 1px; @@ -644,8 +577,10 @@ $session-compose-margin: 20px; span { padding: 5px 10px; border-radius: 50px; - color: $session-color-light-grey; - border: 1px solid $session-color-dark-grey; + @include themify($themes) { + color: themed('pillDividerTextColor'); + border: 1px solid themed('pillDividerColor'); + } font-family: $session-font-default; font-size: $session-font-sm; } diff --git a/stylesheets/_session_password.scss b/stylesheets/_session_password.scss index 72130a66c..e9ee8badc 100644 --- a/stylesheets/_session_password.scss +++ b/stylesheets/_session_password.scss @@ -1,7 +1,6 @@ .password { height: 100vh; - .clear-data, .password-prompt { &-wrapper { display: flex; @@ -57,7 +56,7 @@ color: $session-color-white; } svg { - margin-right: $session-margin-lg; + margin-inline-end: $session-margin-lg; } } diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss index 824240f91..5950dd324 100644 --- a/stylesheets/_session_signin.scss +++ b/stylesheets/_session_signin.scss @@ -1,6 +1,8 @@ .session { &-fullscreen { - @include session-dark-background; + @include themify($themes) { + background: themed('cellBackground'); + } overflow-y: auto; height: 100%; } @@ -14,10 +16,12 @@ &-accent { flex-grow: 1; - padding-left: 20px; + padding-inline-start: 20px; &-text { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-family: $session-font-accent; .title { @@ -29,7 +33,7 @@ } &-registration { - padding-right: 128px; + padding-inline-end: 128px; } &-header { @@ -77,6 +81,13 @@ padding-top: 20px; &__secret-words { + display: flex; + flex-direction: column; + align-items: center; + @include themify($themes) { + background: themed('inputBackground'); + } + padding: $session-margin-sm $session-margin-lg; border-radius: 8px; label { @@ -101,9 +112,11 @@ left: 0; right: 0; - margin-left: auto; - margin-right: auto; - color: $session-color-white; + margin-inline-start: auto; + margin-inline-end: auto; + @include themify($themes) { + background: themed('cellBackground'); + } } &__tab { @@ -112,19 +125,25 @@ padding-bottom: 10px; background-color: transparent; text-align: center; - color: $session-color-white; - border-bottom: 2px solid $session-color-dark-grey; + @include themify($themes) { + border-bottom: themed('sessionBorder'); + color: themed('textColor'); + } transition: border-color $session-transition-duration linear; line-height: 17px; font-size: 15px; &--active { - border-bottom: $session-element-border-green; + @include themify($themes) { + border-bottom: 4px solid themed('accent'); + } } } @mixin registration-label-mixin { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-weight: bold; padding: 12px; } @@ -140,7 +159,7 @@ &__unique-session-id { @include registration-label-mixin; - padding-top: 3em; + padding-top: 1em; text-align: center; } @@ -151,13 +170,15 @@ } &-input-floating-label-show-hide { - padding-right: 30px; + padding-inline-end: 30px; } &-input-with-label-container { height: 46.5px; width: 280px; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } padding: 2px 0 2px 0; transition: opacity $session-transition-duration; opacity: 1; @@ -166,7 +187,9 @@ label { line-height: 14px; opacity: 0; - color: #737373; + @include themify($themes) { + color: themed('textColor'); + } font-size: 10px; line-height: 11px; position: absolute; @@ -178,7 +201,9 @@ } &.error { - color: red; + @include themify($themes) { + color: themed('destructive'); + } } input { @@ -187,7 +212,9 @@ height: 14px; width: 280px; background: transparent; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-size: 12px; line-height: 14px; position: absolute; @@ -196,7 +223,9 @@ } hr { - border: 1px solid $session-color-light-grey; + @include themify($themes) { + border: themed('sessionBorder'); + } width: 100%; position: absolute; bottom: 0px; @@ -212,7 +241,9 @@ &-terms-conditions-agreement { padding-top: $session-margin-md; - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } text-align: center; font-size: 12px; @@ -220,15 +251,21 @@ white-space: nowrap; font-weight: bold; text-decoration: none; - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } transition: $session-transition-duration; &:visited &:link { - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } } &:hover { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } } } } @@ -237,13 +274,15 @@ &-signin-device-pairing-header { padding-top: 10px; padding-bottom: 20px; - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } text-align: center; font-size: 12px; line-height: 20px; ol { - margin-left: 20px; + margin-inline-start: 20px; padding: 0px; text-align: justify; } @@ -255,7 +294,7 @@ justify-content: center; padding: 20px; border-radius: 8px; - border: 2px solid #353535; + border: 1px solid subtle(#353535); margin-bottom: 20px; textarea { @@ -263,7 +302,9 @@ outline: 0; border: none; background: transparent; - color: #fff; + @include themify($themes) { + color: themed('textColor'); + } font-size: 15px; line-height: 18px; text-align: center; @@ -280,7 +321,9 @@ [contenteditable='true']:empty::before { content: attr(placeholder); - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } font-size: 13px; } diff --git a/stylesheets/_session_slider.scss b/stylesheets/_session_slider.scss index 85aa3f3f9..bac8d767c 100644 --- a/stylesheets/_session_slider.scss +++ b/stylesheets/_session_slider.scss @@ -7,7 +7,7 @@ &-info { display: block; - margin-left: 20px; + margin-inline-start: 20px; text-align: center; p { @@ -34,7 +34,9 @@ .rc-slider-rail { position: absolute; width: 100%; - background-color: $session-shade-6; + @include themify($themes) { + background: themed('inputBackground'); + } height: 8px; border-radius: 6px; margin: 0px 0px 0px -1px; @@ -104,7 +106,9 @@ margin-left: -4px; width: 3px; height: 6px; - background-color: $session-shade-6; + @include themify($themes) { + background: themed('clickableHovered'); + } cursor: pointer; border-radius: 2px; vertical-align: middle; diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index ef91ccab8..680451a33 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -1,82 +1,101 @@ // Messages +@import 'themes.scss'; -.discussion-container { - @at-root .light-theme #{&} { - background-color: $session-color-white; - } - @at-root .dark-theme #{&} { - background-color: $session-shade-2; - } -} +// body.dark-theme { +// @include themify($themes) { +// background-color: themed('cellBackground'); +// } +// color: red; + +// background-color: blue +// } .conversation { background: none !important; } .module-conversation-header { - @at-root .light-theme #{&} { - background-color: $session-color-white; - border-bottom: none; - } - @at-root .dark-theme #{&} { - background-color: $session-shade-4; - border-bottom: none; + @include themify($themes) { + background: themed('cellBackground'); } } .module-message { - &__author, - &__metadata__badge, - &__metadata__date--incoming, - &__metadata__date--outgoing { - @at-root .light-theme #{&} { - @include session-color-subtle($session-color-black); - } - @at-root .dark-theme #{&} { - @include session-color-subtle($session-color-white); - } + &__text-error { + font-style: italic; } &__container--incoming { - @at-root .light-theme #{&} { - @include session-color-subtle($session-color-white); + @include themify($themes) { + background: themed('receivedMessageBackground'); } - @at-root .dark-theme #{&} { - background-color: $session-shade-5; + + .module-message__text { + @include themify($themes) { + color: themed('receivedMessageText'); + } + a { + text-decoration: underline; + @include themify($themes) { + color: themed('receivedMessageText'); + } + } + } + + .module-message__author, + .module-message__metadata, + .module-message__metadata__date, + .module-message__metadata__badge, + .module-message__metadata__badge--separator { + @include themify($themes) { + @include session-color-subtle(themed('receivedMessageText')); + } } } &__container--outgoing { - @at-root .light-theme #{&} { - background-color: $session-color-white; + @include themify($themes) { + background: themed('sentMessageBackground'); } - @at-root .dark-theme #{&} { - background-color: $session-shade-11; + + .module-message__text { + @include themify($themes) { + color: themed('sentMessageText'); + } + a { + text-decoration: underline; + @include themify($themes) { + color: themed('sentMessageText'); + } + } + } + + .module-message__author, + .module-message__metadata, + .module-message__metadata__date, + .module-message__metadata__badge, + .module-message__metadata__badge--separator { + @include themify($themes) { + @include session-color-subtle(themed('sentMessageText')); + } } } &__container { - transition: background-color 0.25s; - box-shadow: 0px 0px 8px 2px rgba(0, 0, 0, 0.69); + transition: background-color $session-transition-duration; } } .message { &-highlighted { - border-radius: 0; - - @at-root .light-theme #{&} { - background-color: $session-shade-5; - } - @at-root .dark-theme #{&} { - background-color: $session-color-white; - } + animation: highlightedMessageAnimation 1s ease-in-out; } &-selected { .module-message { &__container { - background-image: $session-gradient-green; - box-shadow: $session-dark-shadow; + @include themify($themes) { + box-shadow: themed('sessionShadow'); + } } &__author { @@ -86,20 +105,24 @@ } &-read-receipt-container { - margin-left: 5px; + margin-inline-start: 5px; + .session-icon.check { + @include themify($themes) { + fill: subtle(themed('sentMessageText')); + } + } } } .inbox { - background: linear-gradient(180deg, #171717 0%, $session-background 100%); + @include themify($themes) { + background: themed('inboxBackground'); + color: themed('textColor'); + } } .conversation { - background: none !important; -} - -.discussion-container { - background-color: #141414; + background: none; } @mixin session-h-title { @@ -113,27 +136,35 @@ h1 { margin: 0; &.active { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } } } h2 { @include session-h-title; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-size: 22px; text-align: center; } h3 { @include session-h-title; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-size: 18px; padding-top: 22px; } h4 { @include session-h-title; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-size: 17px; text-align: center; } diff --git a/stylesheets/_settings.scss b/stylesheets/_settings.scss deleted file mode 100644 index c229724a2..000000000 --- a/stylesheets/_settings.scss +++ /dev/null @@ -1,123 +0,0 @@ -.settings { - user-select: none; - - &.modal { - padding: 0; - background-color: transparent; - - .content { - margin: 0; - margin-left: auto; - margin-right: auto; - - width: 100%; - max-width: 450px; - border-radius: 0; - box-shadow: 0px 0px 0px 0px; - } - } - hr { - margin: 10px 0; - } - .device-name-settings { - text-align: center; - margin-bottom: 1em; - } - .syncSettings { - button { - float: right; - line-height: 36px; - padding: 0 20px; - margin: 0 0 20px 20px; - } - .synced_at { - font-size: $font-size-small; - color: $grey; - } - .sync_failed { - display: none; - font-size: $font-size-small; - color: red; - } - } - - .blocked-user-settings { - display: flex; - flex: 1; - flex-direction: row; - align-items: center; - } - - .blocked-user-settings { - select { - flex: 1; - cursor: pointer; - font-size: 14px; - } - button { - line-height: 28px; - padding: 0 20px; - margin: auto; - margin-left: 20px; - } - } - - .blocked-user-settings ul { - list-style-type: none; - padding: 0; - margin: 0; - } - - .wordwrap { - white-space: pre-wrap; /* CSS3 */ - white-space: -moz-pre-wrap; /* Firefox */ - white-space: -pre-wrap; /* Opera <7 */ - white-space: -o-pre-wrap; /* Opera 7 */ - word-wrap: break-word; /* IE */ - } - - .restart-needed { - margin-top: 1em; - } - - .clear-data-settings { - button { - float: right; - line-height: 36px; - padding: 0 20px; - margin: 0 0 20px 20px; - } - .destructive { - background-color: red; - color: white; - } - } - - .message-ttl-setting { - .inputs { - display: flex; - padding-top: 18px; - } - - #warning { - padding-top: 12px; - font-weight: 300; - color: red; - } - - input { - flex: 1; - } - label { - padding-left: 12px; - } - } - - .send-link-previews-setting { - margin-top: 0.75em; - } - .description { - margin-top: 0.3em; - margin-left: 1.5em; - } -} diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index 28130c8d8..17b11b8ef 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -1,131 +1,4 @@ -// Don't forget to handle the background of the popup windows! -body.dark-theme { - background-color: $color-black; - color: $color-gray-05; -} - .dark-theme { - // _conversation - - .conversation { - background-color: $color-gray-95; - } - - .discussion-container { - background-color: $color-gray-95; - } - - .bottom-bar { - form.send { - &.video-attachment { - .outer { - .play.icon { - @include color-svg('../images/play.svg', white); - } - } - } - } - - .send-message { - outline: 0; - - &[disabled='disabled'] { - cursor: not-allowed; - } - } - } - - .toast { - background-color: $color-gray-45; - color: $color-white; - box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.12), - 0 0 0 0.5px rgba(0, 0, 0, 0.08); - } - - .confirmation-dialog { - .content { - background: $color-black; - color: $color-dark-05; - - .buttons { - button { - background-color: $color-dark-85; - border-radius: $border-radius; - border: 1px solid $color-dark-60; - color: $color-dark-05; - - &:hover { - background-color: $color-dark-70; - border-color: $color-dark-55; - } - } - } - } - } - - .loki-dialog { - .content { - background: $color-black; - color: $color-dark-05; - } - - button { - background-color: $color-dark-85; - border-radius: $border-radius; - color: $color-dark-05; - - &:hover { - background-color: $color-dark-70; - border-color: $color-dark-55; - } - } - - input { - color: $color-dark-05; - background-color: $color-dark-70; - border-color: $color-dark-55; - } - } - - .nickname-dialog { - .message { - color: $color-light-35; - } - } - - .conversation-loading-screen { - background-color: $color-gray-95; - } - - .module-last-seen-indicator__bar { - background-color: #353535; - } - - .module-last-seen-indicator__text { - color: $color-dark-30; - } - - .module-scroll-down__button { - background-color: $color-light-35; - box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.2); - - &:hover { - background-color: $color-light-45; - } - } - - .module-scroll-down__button--new-messages { - background-color: $color-signal-blue; - - &:hover { - background-color: #1472bd; - } - } - - .module-scroll-down__icon { - @include color-svg('../images/down.svg', $color-white); - } - // _debugLog .debug-log { @@ -175,35 +48,8 @@ body.dark-theme { } } - .emoji-panel-container { - .ep ::-webkit-scrollbar-thumb { - background: $color-dark-55; - - &:hover { - background: $color-dark-30; - } - } - } - // _global - ::-webkit-scrollbar-track { - background: $color-black; - } - - ::-webkit-scrollbar-thumb { - background: $color-dark-55; - border: 2px solid $color-black; - - &:hover { - background: $color-dark-30; - } - } - - ::-webkit-scrollbar-corner { - background: $color-black; - } - .dark-overlay { background-color: $color-gray-95; } @@ -279,16 +125,17 @@ body.dark-theme { } } + // banner shown when app version expired and must be updated .expiredAlert { background: $session-color-green; color: black; /* biggest we can make the font without wrapping the current text at minimum app width */ font-family: $session-font-accent; - font-size: 20px; + font-size: 16px; height: 60px; span { - line-height: 36px; + line-height: 45px; } button { @@ -299,125 +146,7 @@ body.dark-theme { } } - .full-screen-flow { - color: black; - a { - color: $blue; - } - background: linear-gradient( - to bottom, - /* (1 - 0.41) * 255 + 0.41 * 213*/ rgb(238, 238, 238) 0%, - /* (1 - 0.19) * 255 + 0.19 * 191*/ rgb(243, 243, 243) 12%, - rgb(255, 255, 255) 27%, - rgb(255, 255, 255) 60%, - /* (1 - 0.19) * 255 + 0.19 * 222*/ rgb(249, 249, 249) 85%, - /* (1 - 0.27) * 255 + 0.27 * 98 */ rgb(213, 213, 213) 100% - ); - input { - border: 2px solid $blue; - } - - #qr { - &.ready { - border: 5px solid $blue; - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); - } - - img { - border: 5px solid white; - } - - .dot { - border: 3px solid $blue; - } - } - - .os-icon { - &.apple { - @include color-svg('../images/apple.svg', black); - } - &.android { - @include color-svg('../images/android.svg', black); - } - } - - .banner-icon { - // generic - &.check-circle-outline { - @include color-svg('../images/check-circle-outline.svg', #dedede); - } - &.alert-outline { - @include color-svg('../images/alert-outline.svg', #dedede); - } - - // import and export - &.folder-outline { - @include color-svg('../images/folder-outline.svg', #dedede); - } - &.import { - @include color-svg('../images/import.svg', #dedede); - } - &.export { - @include color-svg('../images/export.svg', #dedede); - } - - // registration process - &.lead-pencil { - @include color-svg('../images/lead-pencil.svg', #dedede); - } - &.sync { - @include color-svg('../images/sync.svg', #dedede); - } - - // delete - &.alert-outline-red { - @include color-svg('../images/alert-outline.svg', red); - } - &.delete { - @include color-svg('../images/delete.svg', #dedede); - } - } - - .button { - color: white; - background: $blue; - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); - - &.neutral { - color: black; - background: #dedede; - } - &.destructive { - background: red; - } - } - a.link { - color: $session-color-green; - } - - .progress { - .bar-container { - background-color: $grey_l; - } - .bar { - background-color: $blue_l; - } - } - } - // _index - - .gutter { - background-color: $color-dark-85; - - ::-webkit-scrollbar-track { - background: $color-dark-85; - } - - ::-webkit-scrollbar-thumb { - border: 2px solid $color-dark-85; - } - } .network-status-container { .network-status { background: url('../images/error_red.svg') no-repeat left 10px center; @@ -547,76 +276,8 @@ body.dark-theme { // Module: Message - .module-message__buttons__download { - @include color-svg('../images/download.svg', $color-light-45); - &:hover { - @include color-svg('../images/download.svg', $color-dark-05); - } - } - - .module-message__buttons__reply { - @include color-svg('../images/reply.svg', $color-light-45); - &:hover { - @include color-svg('../images/reply.svg', $color-dark-05); - } - } - - .module-message__buttons__menu { - @include color-svg('../images/ellipsis.svg', $color-light-45); - &:hover { - @include color-svg('../images/ellipsis.svg', $color-dark-05); - } - } - .module-message__error { - @include color-svg('../images/error.svg', $color-core-red); - } - - .module-message__container--outgoing { - background-color: $color-dark-70; - } - - // In case the color gets messed up - .module-message__container--incoming { - background-color: $color-conversation-grey; - } - - .module-message__container--incoming-red { - background-color: $color-conversation-red; - } - .module-message__container--incoming-deep_orange { - background-color: $color-conversation-deep_orange; - } - .module-message__container--incoming-brown { - background-color: $color-conversation-brown; - } - .module-message__container--incoming-pink { - background-color: $color-conversation-pink; - } - .module-message__container--incoming-purple { - background-color: $color-conversation-purple; - } - .module-message__container--incoming-indigo { - background-color: $color-conversation-indigo; - } - .module-message__container--incoming-blue { - background-color: $color-conversation-blue; - } - .module-message__container--incoming-teal { - background-color: $color-conversation-teal; - } - .module-message__container--incoming-green { - background-color: $color-conversation-green; - } - .module-message__container--incoming-light_green { - background-color: $color-conversation-light_green; - } - .module-message__container--incoming-blue_grey { - background-color: $color-conversation-blue_grey; - } - - .module-message__attachment-container { - background-color: $color-gray-95; + @include color-svg('../images/error.svg', $session-color-danger); } .module-message__img-border-overlay { @@ -657,37 +318,13 @@ body.dark-theme { } .module-message__video-overlay__play-icon { - @include color-svg('../images/play.svg', $color-signal-blue); + @include color-svg('../images/play.svg', $color-loki-green); } .module-message__broken-video-screenshot { color: $color-dark-05; } - .module-message__broken-video-screenshot--incoming { - color: $color-white; - } - - .module-message__generic-attachment__icon { - // background: url('../images/file-gradient.svg') no-repeat center; - } - - .module-message__generic-attachment__file-name { - color: $color-dark-05; - } - - .module-message__generic-attachment__file-name--incoming { - color: $color-white; - } - - .module-message__generic-attachment__file-size { - color: $color-dark-05; - } - - .module-message__generic-attachment__file-size--incoming { - color: $color-white; - } - .module-message__link-preview__content { background-color: $color-gray-95; border: 1px solid $color-gray-60; @@ -705,31 +342,7 @@ body.dark-theme { .module-message__link-preview__location { color: $color-gray-25; } - .module-conversation__user, - .module-message__author { - color: $color-white; - } - .module-message__text { - color: #ffffff; - a { - color: #ffffff; - } - } - - .module-message__text--incoming { - color: $color-white; - a { - color: $color-white; - } - } - - .module-message__metadata__date { - color: $color-white-08; - } - .module-message__metadata__date--incoming { - color: $color-white-08; - } .module-message__metadata__date--with-image-no-caption { color: $color-white-08; } @@ -760,7 +373,7 @@ body.dark-theme { } .module-message__send-message-button { - color: $color-signal-blue; + color: $color-loki-green; background-color: $color-dark-70; border: 1px solid $color-dark-60; } @@ -817,189 +430,6 @@ body.dark-theme { background-color: $color-dark-05; } - // Module: Quoted Reply - - .module-quote--outgoing { - border-left-color: $color-conversation-grey; - background-color: $color-conversation-grey-shade; - } - .module-quote--outgoing-red { - border-left-color: $color-conversation-red; - background-color: $color-conversation-red-shade; - } - .module-quote--outgoing-deep_orange { - border-left-color: $color-conversation-deep_orange; - background-color: $color-conversation-deep_orange-shade; - } - .module-quote--outgoing-brown { - border-left-color: $color-conversation-brown; - background-color: $color-conversation-brown-shade; - } - .module-quote--outgoing-pink { - border-left-color: $color-conversation-pink; - background-color: $color-conversation-pink-shade; - } - .module-quote--outgoing-purple { - border-left-color: $color-conversation-purple; - background-color: $color-conversation-purple-shade; - } - .module-quote--outgoing-indigo { - border-left-color: $color-conversation-indigo; - background-color: $color-conversation-indigo-shade; - } - .module-quote--outgoing-blue { - border-left-color: $color-conversation-blue; - background-color: $color-conversation-blue-shade; - } - .module-quote--outgoing-teal { - border-left-color: $color-conversation-teal; - background-color: $color-conversation-teal-shade; - } - .module-quote--outgoing-green { - border-left-color: $color-conversation-green; - background-color: $color-conversation-green-shade; - } - .module-quote--outgoing-light_green { - border-left-color: $color-conversation-light_green; - background-color: $color-conversation-light_green-shade; - } - .module-quote--outgoing-blue_grey { - border-left-color: $color-conversation-blue_grey; - background-color: $color-conversation-blue_grey-shade; - } - - .module-quote--incoming { - border-left-color: $color-black; - background-color: $color-conversation-grey-shade; - } - .module-quote--incoming-red { - background-color: $color-conversation-red-shade; - } - .module-quote--incoming-deep_orange { - background-color: $color-conversation-deep_orange-shade; - } - .module-quote--incoming-brown { - background-color: $color-conversation-brown-shade; - } - .module-quote--incoming-pink { - background-color: $color-conversation-pink-shade; - } - .module-quote--incoming-purple { - background-color: $color-conversation-purple-shade; - } - .module-quote--incoming-indigo { - background-color: $color-conversation-indigo-shade; - } - .module-quote--incoming-blue { - background-color: $color-conversation-blue-shade; - } - .module-quote--incoming-teal { - background-color: $color-conversation-teal-shade; - } - .module-quote--incoming-green { - background-color: $color-conversation-green-shade; - } - .module-quote--incoming-light_green { - background-color: $color-conversation-light_green-shade; - } - .module-quote--incoming-blue_grey { - background-color: $color-conversation-blue_grey-shade; - } - - .module-quote__primary__author { - color: $color-dark-05; - } - - .module-quote__primary__author-red { - color: $color-dark-05; - } - .module-quote__primary__author-deep_orange { - color: $color-dark-05; - } - .module-quote__primary__author-brown { - color: $color-dark-05; - } - .module-quote__primary__author-pink { - color: $color-dark-05; - } - .module-quote__primary__author-purple { - color: $color-dark-05; - } - .module-quote__primary__author-indigo { - color: $color-dark-05; - } - .module-quote__primary__author-blue { - color: $color-dark-05; - } - .module-quote__primary__author-teal { - color: $color-dark-05; - } - .module-quote__primary__author-green { - color: $color-dark-05; - } - .module-quote__primary__author-light_green { - color: $color-dark-05; - } - .module-quote__primary__author-blue_grey { - color: $color-dark-05; - } - - .module-quote__primary__text { - color: $color-dark-05; - - a { - color: $color-dark-05; - } - } - - .module-quote__primary__type-label { - color: $color-dark-05; - } - - .module-quote__close-container { - background-color: rgba(255, 255, 255, 0.75); - } - - .module-quote__close-button { - @include color-svg('../images/x.svg', $grey); - } - - .module-quote__icon-container__circle-background { - background-color: $color-white; - } - - .module-quote__icon-container__icon--file { - @include color-svg('../images/file.svg', $color-signal-blue); - } - .module-quote__icon-container__icon--image { - @include color-svg('../images/image.svg', $color-signal-blue); - } - .module-quote__icon-container__icon--microphone { - @include color-svg('../images/microphone.svg', $color-signal-blue); - } - .module-quote__icon-container__icon--play { - @include color-svg('../images/play.svg', $color-signal-blue); - } - .module-quote__icon-container__icon--movie { - @include color-svg('../images/movie.svg', $color-signal-blue); - } - - .module-quote__generic-file__text { - color: $color-dark-05; - } - - .module-quote__reference-warning { - background-color: $color-black-06; - } - - .module-quote__reference-warning__icon { - @include color-svg('../images/broken-link.svg', $color-dark-30); - } - - .module-quote__reference-warning__text { - color: $color-dark-05; - } - // Module: Embedded Contact .module-embedded-contact__contact-name { @@ -1060,7 +490,7 @@ body.dark-theme { } .module-verification-notification__button { - color: $color-signal-blue; + color: $color-loki-green; background-color: $color-gray-75; } @@ -1104,12 +534,6 @@ body.dark-theme { // Module: Conversation Header - .module-conversation-header { - color: $color-dark-05; - background-color: $color-gray-95; - border-bottom: 1px solid $color-light-60; - } - .module-conversation-header__back-icon { @include color-svg('../images/back.svg', $color-dark-05); } @@ -1118,37 +542,17 @@ body.dark-theme { color: $color-dark-05; } - .module-conversation-header__note-to-self { - color: $color-dark-05; - } - - .module-conversation-header__title__verified-icon { - @include color-svg('../images/verified-check.svg', $color-dark-05); - } - - .module-conversation-header__expiration__clock-icon { - @include color-svg('../images/timer.svg', $color-dark-30); - } - - .module-conversation-header__gear-icon { - @include color-svg('../images/gear.svg', $color-dark-30); - } - // Module: Message Detail - .module-message-detail__unix-timestamp { - color: $color-dark-55; - } - .module-message-detail__delete-button { - background-color: $color-core-red; + background-color: $session-color-danger; color: $color-white; box-shadow: 0 0 10px -3px rgba(97, 97, 97, 0.7); border: solid 1px $color-light-35; } .module-message-detail__contact__error { - color: $color-core-red; + color: $session-color-danger; } .module-message-detail__contact__status-icon--sending { @@ -1165,7 +569,7 @@ body.dark-theme { @include color-svg('../images/read.svg', $color-light-35); } .module-message-detail__contact__status-icon--error { - @include color-svg('../images/error.svg', $color-core-red); + @include color-svg('../images/error.svg', $session-color-danger); } .module-message-detail__contact__show-safety-number { @@ -1174,7 +578,7 @@ body.dark-theme { } .module-message-detail__contact__send-anyway { color: $color-white; - background-color: $color-core-red; + background-color: $session-color-danger; } // Module: Media Gallery @@ -1184,7 +588,7 @@ body.dark-theme { } .module-media-gallery__tab--active { - border-bottom: 2px solid $color-signal-blue; + border-bottom: 2px solid $color-loki-green; } // Module: Document List Item @@ -1220,34 +624,15 @@ body.dark-theme { .module-empty-state { color: $color-dark-55; } - // Module: Conversation List Item - .module-conversation-list-item { - &:hover { - background-color: $color-dark-70; - } - } - - .module-conversation-list-item--has-unread { - border-left: 4px solid $color-signal-blue; - } - - .module-conversation-list-item--has-friend-request { - border-left: 4px solid $color-conversation-indigo; - } - - .module-conversation-list-item--is-blocked { - border-left: 4px solid $color-conversation-red; - } - .module-conversation-list-item--is-selected { background-color: $color-dark-70; } .module-conversation-list-item__unread-count { color: $color-white; - background-color: $color-signal-blue; + background-color: $color-loki-green; box-shadow: 0px 0px 0px 1px $color-dark-85; } @@ -1287,75 +672,8 @@ body.dark-theme { width: 18px; } - // Module: Avatar - - .module-avatar__label { - color: $color-gray-05; - } - - .module-avatar__icon--group { - background-color: $color-gray-05; - } - - .module-avatar__icon--direct { - background-color: $color-gray-05; - } - - .module-avatar__icon--note-to-self { - background-color: $color-gray-05; - } - - .module-avatar__icon--crown-wrapper { - background-color: $color-gray-75; - } - - .module-avatar--no-image { - background-color: $color-conversation-grey-shade; - } - - .module-avatar--signal-blue { - background-color: $color-signal-blue; - } - .module-avatar--red { - background-color: $color-conversation-red-shade; - } - .module-avatar--deep_orange { - background-color: $color-conversation-deep_orange-shade; - } - .module-avatar--brown { - background-color: $color-conversation-brown-shade; - } - .module-avatar--pink { - background-color: $color-conversation-pink-shade; - } - .module-avatar--purple { - background-color: $color-conversation-purple-shade; - } - .module-avatar--indigo { - background-color: $color-conversation-indigo-shade; - } - .module-avatar--blue { - background-color: $color-conversation-blue-shade; - } - .module-avatar--teal { - background-color: $color-conversation-teal-shade; - } - .module-avatar--green { - background-color: $color-conversation-green-shade; - } - .module-avatar--light_green { - background-color: $color-conversation-light_green-shade; - } - .module-avatar--blue_grey { - background-color: $color-conversation-blue_grey-shade; - } - // Module: Main Header - .module-main-header { - border-bottom: 1px solid $color-gray-75; - } - .module-main-header__search__input { background-color: $color-gray-95; border-radius: 14px; @@ -1372,10 +690,6 @@ body.dark-theme { } } - .module-main-header__search__icon { - @include color-svg('../images/search.svg', $color-gray-25); - } - .module-main-header__search__cancel-icon { @include color-svg('../images/x-16.svg', $color-gray-25); } @@ -1394,8 +708,6 @@ body.dark-theme { background-color: $color-white-015; } - // Module: Image Grid - // Module: Typing Animation .module-typing-animation__dot { @@ -1511,18 +823,16 @@ body.dark-theme { color: $color-white-07; } &:focus { - border: 1px solid $color-signal-blue; + border: 1px solid $color-loki-green; outline: none; } } .module-caption-editor__save-button { - background-color: $color-signal-blue; + background-color: $color-loki-green; color: $color-white; } - // Module: Highlighted Message Body - // Module: Search Results .module-search-results__conversations-header { @@ -1559,105 +869,6 @@ body.dark-theme { color: $color-gray-05; } - // Module: Left Pane - - .module-left-pane { - background-color: $color-dark-85; - border-right: 1px solid $color-gray-75; - } - - .module-left-pane__archive-header { - border-bottom: 1px solid $color-gray-75; - } - - .module-left-pane__to-inbox-button { - background-color: $color-gray-25; - } - - .module-left-pane__archive-header-text { - color: $color-gray-05; - } - - .module-left-pane__archive-helper-text { - color: $color-gray-25; - background-color: $color-gray-75; - } - - .module-left-pane__archived-button { - color: $color-gray-25; - &:hover { - background-color: $color-gray-75; - } - } - - .module-left-pane__archived-button__archived-count { - color: $color-gray-25; - background-color: $color-gray-75; - } - - // Module: Start New Conversation - - .module-start-new-conversation { - &:hover { - background-color: $color-dark-70; - } - } - - .module-start-new-conversation__number { - color: $color-gray-05; - } - - .module-start-new-conversation__text { - color: $color-gray-45; - } - - // Third-party module: react-contextmenu - - .react-contextmenu { - background-color: $color-dark-85; - border: 1px solid $color-light-60; - } - - .react-contextmenu-item { - color: $color-dark-05; - } - - .react-contextmenu-item--checked:before { - color: $color-dark-05; - } - - .react-contextmenu-item.react-contextmenu-submenu - > .react-contextmenu-item:after { - content: '⯈'; - color: $color-dark-05; - } - - .react-contextmenu-item.react-contextmenu-item--active, - .react-contextmenu-item.react-contextmenu-item--selected { - color: $color-white; - background-color: $color-light-35; - } - - .react-contextmenu-item.react-contextmenu-item--active.react-contextmenu-item--checked:before, - .react-contextmenu-item.react-contextmenu-item--selected.react-contextmenu-item--checked:before { - color: $color-white; - } - - .react-contextmenu-item.react-contextmenu-submenu - > .react-contextmenu-item.react-contextmenu-item--active:after, - .react-contextmenu-item.react-contextmenu-submenu - > .react-contextmenu-item.react-contextmenu-item--selected:after { - color: $color-white; - } - - // _options - - // _progress - - // Not sure we need to change anything there - it's blue - - // _recorder - .capture-audio { .microphone { &:before { @@ -1669,20 +880,20 @@ body.dark-theme { background: $color-black; .finish { - background: lighten($color-core-green, 20%); - border: 1px solid $color-core-green; + background: lighten($session-color-green, 20%); + border: 1px solid $session-color-green; .icon { - @include color-svg('../images/check.svg', $color-core-green); + @include color-svg('../images/check.svg', $session-color-green); } } .close { - background: lighten($color-core-red, 20%); - border: 1px solid $color-core-red; + background: lighten($session-color-danger, 20%); + border: 1px solid $session-color-danger; .icon { - @include color-svg('../images/x.svg', $color-core-red); + @include color-svg('../images/x.svg', $session-color-danger); } } @@ -1690,26 +901,4 @@ body.dark-theme { color: $grey; } } - - // _settings - - hr { - border-color: $color-dark-60; - } - - .syncSettings { - .synced_at { - color: $grey; - } - .sync_failed { - color: red; - } - } - - .clear-data-settings { - .destructive { - background-color: red; - color: white; - } - } } diff --git a/stylesheets/_variables.scss b/stylesheets/_variables.scss index a3643e9ae..a0a90bd42 100644 --- a/stylesheets/_variables.scss +++ b/stylesheets/_variables.scss @@ -1,35 +1,3 @@ -@font-face { - font-family: 'Roboto-Light'; - src: url('../fonts/Roboto-Light.ttf') format('truetype'); -} -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Regular.ttf') format('truetype'); -} -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Medium.ttf') format('truetype'); - font-weight: 300; -} -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Italic.ttf') format('truetype'); - font-style: italic; -} -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Bold.ttf') format('truetype'); - font-weight: bold; -} - -$roboto: Roboto, 'Helvetica Neue', 'Source Sans Pro', 'Source Han Sans SC', - 'Source Han Sans CN', 'Hiragino Sans GB', 'Hiragino Kaku Gothic', - 'Microsoft Yahei UI', Helvetica, Arial, sans-serif; -$roboto-light: Roboto-Light, 'Helvetica Neue', 'Source Sans Pro Light', - 'Source Han Sans SC Light', 'Source Han Sans CN Light', - 'Hiragino Sans GB Light', 'Hiragino Kaku Gothic Light', - 'Microsoft Yahei UI Light', Helvetica, Arial, sans-serif; - // Loki colors $color-loki-light-gray: #e9e9e9; $color-loki-dark-gray: #323232; @@ -42,15 +10,6 @@ $color-loki-green-gradient: linear-gradient( rgb(0, 133, 34) 100% ); -// New colors - -$color-signal-blue: #2090ea; -$color-core-green: #4caf50; -$color-core-red: #f44336; - -$color-signal-blue-025: rgba($color-signal-blue, 0.25); -$color-signal-blue-050: rgba($color-signal-blue, 0.5); - $color-white: #ffffff; $color-gray-02: #f8f9f9; $color-gray-05: #eeefef; @@ -64,45 +23,6 @@ $color-gray-90: #17191d; $color-gray-95: #0f1012; $color-black: #000000; -$color-crimson: #cc163d; -$color-vermilion: #c73800; -$color-burlap: #746c53; -$color-forest: #3b7845; -$color-wintergreen: #1c8260; -$color-teal: #067589; -$color-blue: #336ba3; -$color-indigo: #5951c8; -$color-violet: #862caf; -$color-plum: #a23474; -$color-taupe: #895d66; -$color-steel: #6b6b78; - -$color-crimson-tint: #eda6ae; -$color-vermilion-tint: #eba78e; -$color-burlap-tint: #c4b997; -$color-forest-tint: #8fcc9a; -$color-wintergreen-tint: #9bcfbd; -$color-teal-tint: #a5cad5; -$color-blue-tint: #adc8e1; -$color-indigo-tint: #c2c1e7; -$color-violet-tint: #cdaddc; -$color-plum-tint: #dcb2ca; -$color-taupe-tint: #cfb5bb; -$color-steel-tint: #bebec6; - -$color-crimson-shade: #8a0f29; -$color-vermilion-shade: #872600; -$color-burlap-shade: #58513c; -$color-forest-shade: #2b5934; -$color-wintergreen-shade: #36544a; -$color-teal-shade: #055968; -$color-blue-shade: #285480; -$color-indigo-shade: #4840a0; -$color-violet-shade: #6b248a; -$color-plum-shade: #881b5b; -$color-taupe-shade: #6a4e54; -$color-steel-shade: #5a5a63; - $color-white-015: rgba($color-white, 0.15); $color-white-02: rgba($color-white, 0.2); $color-white-04: rgba($color-white, 0.4); @@ -139,47 +59,6 @@ $color-black-02: rgba($color-black, 0.2); $color-black-04: rgba($color-black, 0.4); $color-black-06: rgba($color-black, 0.6); -$color-signal-blue-mix: mix($color-signal-blue-025, $color-white-04); - -$color-conversation-red: $color-crimson; -$color-conversation-deep_orange: $color-vermilion; -$color-conversation-brown: $color-burlap; -$color-conversation-pink: $color-plum; -$color-conversation-purple: $color-violet; -$color-conversation-indigo: $color-indigo; -$color-conversation-blue: $color-blue; -$color-conversation-teal: $color-teal; -$color-conversation-green: $color-forest; -$color-conversation-light_green: $color-wintergreen; -$color-conversation-blue_grey: $color-taupe; -$color-conversation-grey: $color-steel; - -$color-conversation-red-tint: $color-crimson-tint; -$color-conversation-deep_orange-tint: $color-vermilion-tint; -$color-conversation-brown-tint: $color-burlap-tint; -$color-conversation-pink-tint: $color-plum-tint; -$color-conversation-purple-tint: $color-violet-tint; -$color-conversation-indigo-tint: $color-indigo-tint; -$color-conversation-blue-tint: $color-blue-tint; -$color-conversation-teal-tint: $color-teal-tint; -$color-conversation-green-tint: $color-forest-tint; -$color-conversation-light_green-tint: $color-wintergreen-tint; -$color-conversation-blue_grey-tint: $color-taupe-tint; -$color-conversation-grey-tint: $color-steel-tint; - -$color-conversation-red-shade: $color-crimson-shade; -$color-conversation-deep_orange-shade: $color-vermilion-shade; -$color-conversation-brown-shade: $color-burlap-shade; -$color-conversation-pink-shade: $color-plum-shade; -$color-conversation-purple-shade: $color-violet-shade; -$color-conversation-indigo-shade: $color-indigo-shade; -$color-conversation-blue-shade: $color-blue-shade; -$color-conversation-teal-shade: $color-teal-shade; -$color-conversation-green-shade: $color-forest-shade; -$color-conversation-light_green-shade: $color-wintergreen-shade; -$color-conversation-blue_grey-shade: $color-taupe-shade; -$color-conversation-grey-shade: $color-steel-shade; - // Old colors $blue_l: #a2d2f4; diff --git a/stylesheets/manifest.scss b/stylesheets/manifest.scss index 4cb9ab39c..8c3179dbb 100644 --- a/stylesheets/manifest.scss +++ b/stylesheets/manifest.scss @@ -3,27 +3,26 @@ @import 'node_modules/react-h5-audio-player/lib/styles.css'; // Global Settings, Variables, and Mixins +@import 'themes.scss'; @import 'session_constants'; @import 'variables'; @import 'mixins'; @import 'global'; // Components -@import 'progress'; @import 'modal'; @import 'debugLog'; @import 'lightbox'; @import 'recorder'; @import 'emoji'; @import 'mentions'; -@import 'settings'; +@import 'avatar'; // Build the main view @import 'index'; @import 'conversation'; // Themes -@import 'ios'; @import 'theme_dark'; // /////////////////// // @@ -31,6 +30,8 @@ // /////////////////// // @import 'modules'; @import 'session'; +@import 'quote'; +@import 'rtl'; // Separate screens @import 'session_signin'; @@ -42,6 +43,3 @@ @import 'session_slider'; @import 'session_conversation'; - -// Installer -@import 'options'; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss new file mode 100644 index 000000000..372bfbce6 --- /dev/null +++ b/stylesheets/themes.scss @@ -0,0 +1,139 @@ +// 13592 lines for manifest.css on date 25 august + +$white: #ffffff; +$black: #000000; +$destructive: #ff453a; +$accentLightTheme: #00e97b; +$accentDarkTheme: #00f782; + +$borderLightTheme: #f1f1f1; // search for references on ts TODO: make this exposed on ts +$borderDarkTheme: rgba($white, 0.06); + +$borderAvatarColor: #00000059; // search for references on ts TODO: make this exposed on ts + +$themes: ( + light: ( + accent: $accentLightTheme, + accentButton: $black, + destructive: $destructive, + cellBackground: #fcfcfc, + modalBackground: #fcfcfc, + fakeChatBubbleBackground: #f5f5f5, + // input + inputBackground: rgba(#8e8e93, 0.12), + // text + textColor: $black, + textColorSubtle: #a0a0a0, + textColorOpposite: $white, + textHighlight: rgba($black, 0.2), + // inbox + inboxBackground: $white, + // buttons + backgroundPrimary: #272726, + foregroundPrimary: $white, + buttonGreen: #272726, + // conversation view + composeViewBackground: #fcfcfc, + composeViewTextFieldBackground: #ededed, + receivedMessageBackground: #f5f5f5, + sentMessageBackground: $accentLightTheme, + receivedMessageText: $black, + sentMessageText: $black, + sessionShadow: 0 0 4px 0 rgba($black, 0.37), + sessionShadowColor: rgba($black, 0.37), + // left pane + conversationList: $white, + conversationItemHasUnread: #fcfcfc, + conversationItemSelected: #f0f0f0, + clickableHovered: #dfdfdf, + sessionBorder: 1px solid $borderLightTheme, + sessionUnreadBorder: 4px solid $accentLightTheme, + leftpaneOverlayBackground: $white, + // scrollbars + scrollBarTrack: #fcfcfc, + scrollBarThumb: #474646, + // pill divider: + pillDividerColor: rgba($black, 0.1), + pillDividerTextColor: #555555, + // context menu + contextMenuBackground: #f5f5f5, + filterSessionText: brightness(0) saturate(100%), + lastSeenIndicatorColor: #62656a, + lastSeenIndicatorTextColor: #070c14, + quoteBottomBarBackground: #f0f0f0, + ), + dark: ( + accent: $accentDarkTheme, + accentButton: $accentDarkTheme, + destructive: $destructive, + cellBackground: #1b1b1b, + modalBackground: #101011, + fakeChatBubbleBackground: #212121, + // input + inputBackground: rgba(#8e8e93, 0.12), + // text + textColor: $white, + textColorSubtle: #a0a0a0, + textColorOpposite: $black, + textHighlight: rgba($accentDarkTheme, 0.6), + // inbox + inboxBackground: linear-gradient(180deg, #171717 0%, #121212 100%), + // buttons + backgroundPrimary: #474646, + foregroundPrimary: $white, + buttonGreen: $accentDarkTheme, + // conversation view + composeViewBackground: #1b1b1b, + composeViewTextFieldBackground: #141414, + receivedMessageBackground: #222325, + sentMessageBackground: #3f4146, + receivedMessageText: $white, + sentMessageText: $white, + sessionShadow: 0 0 4px 0 rgba($white, 0.2), + sessionShadowColor: rgba($white, 0.2), + // left pane + conversationList: #1b1b1b, + conversationItemHasUnread: #2c2c2c, + conversationItemSelected: #404040, + clickableHovered: #414347, + sessionBorder: 1px solid $borderDarkTheme, + sessionUnreadBorder: 4px solid $accentDarkTheme, + leftpaneOverlayBackground: linear-gradient(180deg, #171717 0%, #121212 100%), + // scrollbars + scrollBarTrack: #1b1b1b, + scrollBarThumb: #474646, + // pill divider: + pillDividerColor: #353535, + pillDividerTextColor: #a0a0a0, + // context menu + contextMenuBackground: #212121, + filterSessionText: none, + lastSeenIndicatorColor: #353535, + lastSeenIndicatorTextColor: #a8a9aa, + quoteBottomBarBackground: #404040, + ), +); + +@mixin themify($themes: $themes) { + @each $theme, $map in $themes { + .#{$theme}-theme & { + $theme-map: () !global; + @each $key, $submap in $map { + $value: map-get(map-get($themes, $theme), '#{$key}'); + $theme-map: map-merge( + $theme-map, + ( + $key: $value, + ) + ) !global; + } + + @content; + $theme-map: null !global; + } + } +} + +@function themed($key) { + @return map-get($theme-map, $key); +} diff --git a/test/app/fixtures/menu-mac-os-setup.json b/test/app/fixtures/menu-mac-os-setup.json index 861511f8a..5332b7b73 100644 --- a/test/app/fixtures/menu-mac-os-setup.json +++ b/test/app/fixtures/menu-mac-os-setup.json @@ -3,7 +3,7 @@ "label": "Session", "submenu": [ { - "label": "About Session", + "label": "About", "click": null }, { @@ -39,10 +39,6 @@ { "label": "Set Up with Import", "click": null - }, - { - "label": "Set Up as New Device", - "click": null } ] }, @@ -81,7 +77,7 @@ "role": "delete" }, { - "label": "Select All", + "label": "Select all", "role": "selectall" }, { diff --git a/test/app/fixtures/menu-mac-os.json b/test/app/fixtures/menu-mac-os.json index b2ea56aaf..7e4a9a3c0 100644 --- a/test/app/fixtures/menu-mac-os.json +++ b/test/app/fixtures/menu-mac-os.json @@ -3,7 +3,7 @@ "label": "Session", "submenu": [ { - "label": "About Session", + "label": "About", "click": null }, { @@ -68,7 +68,7 @@ "role": "delete" }, { - "label": "Select All", + "label": "Select all", "role": "selectall" }, { diff --git a/test/app/fixtures/menu-windows-linux-setup.json b/test/app/fixtures/menu-windows-linux-setup.json index e72303d39..3425a1184 100644 --- a/test/app/fixtures/menu-windows-linux-setup.json +++ b/test/app/fixtures/menu-windows-linux-setup.json @@ -6,10 +6,6 @@ "label": "Set Up with Import", "click": null }, - { - "label": "Set Up as New Device", - "click": null - }, { "type": "separator" }, @@ -57,7 +53,7 @@ "role": "delete" }, { - "label": "Select All", + "label": "Select all", "role": "selectall" } ] @@ -134,7 +130,7 @@ "type": "separator" }, { - "label": "About Session", + "label": "About", "click": null } ] diff --git a/test/app/fixtures/menu-windows-linux.json b/test/app/fixtures/menu-windows-linux.json index aa6a1171d..30a6301d0 100644 --- a/test/app/fixtures/menu-windows-linux.json +++ b/test/app/fixtures/menu-windows-linux.json @@ -46,7 +46,7 @@ "role": "delete" }, { - "label": "Select All", + "label": "Select all", "role": "selectall" } ] @@ -123,7 +123,7 @@ "type": "separator" }, { - "label": "About Session", + "label": "About", "click": null } ] diff --git a/test/app/menu_test.js b/test/app/menu_test.js index e84f8f115..f6ebf31ce 100644 --- a/test/app/menu_test.js +++ b/test/app/menu_test.js @@ -51,7 +51,6 @@ describe('SignalMenu', () => { openSupportPage: null, platform, includeSetup, - setupAsNewDevice: null, setupAsStandalone: null, setupWithImport: null, showAbout: null, diff --git a/test/blanket_mocha.js b/test/blanket_mocha.js index f6b2b0ed1..c10e5eb0c 100644 --- a/test/blanket_mocha.js +++ b/test/blanket_mocha.js @@ -5039,7 +5039,7 @@ var parseAndModify = inBrowser ? window.falafel : require('falafel'); blanket.defaultReporter = function(coverage) { var cssSytle = - "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-left:50px; width:150px; float:right} .bl-nb {padding-right:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", + "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-inline-start:50px; width:150px; float:right} .bl-nb {padding-inline-end:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", successRate = 60, head = document.head, fileNumber = 0, @@ -5990,20 +5990,20 @@ blanket.defaultReporter = function(coverage) { throw new Exception('mocha library does not exist in global namespace!'); } - /* - * Mocha Events: - * - * - `start` execution started - * - `end` execution complete - * - `suite` (suite) test suite execution started - * - `suite end` (suite) all tests (and sub-suites) have finished - * - `test` (test) test execution started - * - `test end` (test) test completed - * - `hook` (hook) hook execution started - * - `hook end` (hook) hook complete - * - `pass` (test) test passed - * - `fail` (test, err) test failed - * + /* + * Mocha Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * */ var OriginalReporter = mocha._reporter; diff --git a/test/index.html b/test/index.html index 1cc16c31c..3c7380577 100644 --- a/test/index.html +++ b/test/index.html @@ -18,14 +18,9 @@
- - @@ -38,8 +33,9 @@
-
- +
@@ -76,9 +72,6 @@
-
-
-
- - - - - - - @@ -503,14 +326,10 @@ - - - - @@ -518,7 +337,6 @@ - diff --git a/test/models/conversations_test.js b/test/models/conversations_test.js index e8a7b1548..4e9c741d6 100644 --- a/test/models/conversations_test.js +++ b/test/models/conversations_test.js @@ -129,13 +129,6 @@ describe('Conversation', () => { assert.equal(convo.getNumber(), ''); }); - it('has an avatar', () => { - const convo = new Whisper.ConversationCollection().add(attributes); - const avatar = convo.getAvatar(); - assert.property(avatar, 'content'); - assert.property(avatar, 'color'); - }); - describe('when set to private', () => { it('correctly validates hex numbers', () => { const regularId = new Whisper.Conversation({ diff --git a/test/models/messages_test.js b/test/models/messages_test.js index 7b0f7ece0..fbe3e7de8 100644 --- a/test/models/messages_test.js +++ b/test/models/messages_test.js @@ -94,21 +94,21 @@ describe('MessageCollection', () => { message = messages.add({ group_update: { left: 'Alice' } }); assert.equal( message.getDescription(), - 'Alice left the group', + 'Alice has left the group.', 'Notes one person leaving the group.' ); message = messages.add({ group_update: { name: 'blerg' } }); assert.equal( message.getDescription(), - "Group name has been set to 'blerg'", + "Group name is now 'blerg'.", 'Returns a single notice if only group_updates.name changes.' ); message = messages.add({ group_update: { joined: ['Bob'] } }); assert.equal( message.getDescription(), - 'Bob joined the group', + 'Bob joined the group.', 'Returns a single notice if only group_updates.joined changes.' ); @@ -117,7 +117,7 @@ describe('MessageCollection', () => { }); assert.equal( message.getDescription(), - 'Bob, Alice, Eve joined the group', + 'Bob, Alice, Eve joined the group.', 'Notes when >1 person joins the group.' ); @@ -126,7 +126,7 @@ describe('MessageCollection', () => { }); assert.equal( message.getDescription(), - "Group name has been set to 'blerg', Bob joined the group", + "Group name is now 'blerg'. Bob joined the group.", 'Notes when there are multiple changes to group_updates properties.' ); diff --git a/test/views/inbox_view_test.js b/test/views/inbox_view_test.js index dea936399..c16b24ef4 100644 --- a/test/views/inbox_view_test.js +++ b/test/views/inbox_view_test.js @@ -22,6 +22,7 @@ describe('InboxView', () => { textsecure.storage.user.getNumber(), 'private' ); + window.getOurDisplayName = () => 'display name test'; inboxView = new Whisper.InboxView({ model: {}, window, diff --git a/test/views/network_status_view_test.js b/test/views/network_status_view_test.js index 85cb64c68..488ff7101 100644 --- a/test/views/network_status_view_test.js +++ b/test/views/network_status_view_test.js @@ -74,27 +74,6 @@ describe('NetworkStatusView', () => { assert.match(networkStatusView.$el.text(), /Offline/); }); }); - describe('network status when registration is not done', () => { - beforeEach(() => { - Whisper.Registration.remove(); - }); - it('should display an unlinked message', () => { - networkStatusView.update(); - assert.match(networkStatusView.$el.text(), /Relink/); - }); - it('should override socket status', () => { - _([ - WebSocket.CONNECTING, - WebSocket.OPEN, - WebSocket.CLOSING, - WebSocket.CLOSED, - ]).forEach(socketStatusVal => { - socketStatus = socketStatusVal; - networkStatusView.update(); - assert.match(networkStatusView.$el.text(), /Relink/); - }); - }); - }); describe('network status when registration is done', () => { beforeEach(() => { networkStatusView.navigatorOnLine = () => true; diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 000000000..63a0c1e3d --- /dev/null +++ b/tools/README.md @@ -0,0 +1,36 @@ +**Those tools can be used to keep in sync our locale in the app between different language and with android translations** + + + +## Step 1: Find unused key locales in EN + +`tools/unusedLocalizedString.py` is iterating over all root keys in _locales/en/message.json and try to find them on the code with a regex. If it does not find it, it will print a line with False. +Some key exceptions are hardcoded to not report false negative + + +So just run: +`tools/unusedLocalizedString.py |grep False` +and double check by searching in the app if you can effectively remove those keys. + + +## Step 2: Sync keys between each locales on desktop + +This step removes every key in all locales not found in the locale EN. +So if for example, you have a key in `it` which is not present in `en`, it will be removed and the `it` file will be written without it. + +A summary for each language file is printed on the screen to let you know if anything was changed during the process + +`python3 tools/compareLocalizedStrings.py` + + +## Step 3: Map translations from android to desktop + +This step matches translations from android to desktop. It needs to be run for each locale you want to update. + + +`python3 tools/mapAndroidTranslationsToDesktop.py fr ` + +Under the hood, it uses a item from the EN desktop locale called `androidKey` to find the matching translation for each locale. + +Note that if a desktop key does not have an `androidKey` set, it will just be skipped +The goal is to have an androidKey for each item, if possible. But for now apps are too different for that to make sense. \ No newline at end of file diff --git a/tools/compareLocalizedStrings.py b/tools/compareLocalizedStrings.py new file mode 100755 index 000000000..71e5b06e2 --- /dev/null +++ b/tools/compareLocalizedStrings.py @@ -0,0 +1,46 @@ +#!/bin/python3 + + +# usage : ./tools/compareLocalizedStrings.py en de + +import re +from os import path, listdir +from glob import glob +import json +import sys + +LOCALES_FOLDER = './_locales' + + +if len(sys.argv) != 1 and len(sys.argv) != 2: + print(f'usage: {sys.argv[0]} . If compared locale is not set, all found locales will be cleaned') + sys.exit(1) + +if (len(sys.argv) > 1): + localesToCheck = [f'{LOCALES_FOLDER}{sys.argv[1]}'] +else: + localesToCheck = [path.join(LOCALES_FOLDER, o) for o in listdir(LOCALES_FOLDER) if path.isdir(path.join(LOCALES_FOLDER,o))] + +for dest in localesToCheck: + if dest == f'{LOCALES_FOLDER}/en': + print('skipping "en" locale...') + continue + + destFilePath = f'{dest}/messages.json' + # print(f'dest {dest}, destFilePath {destFilePath}') + + jsonInSrc = json.loads(open(f'{LOCALES_FOLDER}/en/messages.json', 'r').read()) + jsonInDest = json.loads(open(destFilePath, 'r').read()) + keysInSrc = jsonInSrc.keys() + keysInDest = jsonInDest.keys() + + destMinusSrc = list(set(keysInDest) - set(keysInSrc)) + for key in destMinusSrc: + # print(f'Present in "{dest}" but not found in "{src}": {key}') + del jsonInDest[key] + + print(f'total keys in "{dest}" to remove: {len(destMinusSrc)}') + + # write the updated json dict to the file + with open(destFilePath, 'w') as outfile: + json.dump(jsonInDest, outfile, indent=4, ensure_ascii=False) diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py new file mode 100755 index 000000000..a49a0ca7e --- /dev/null +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -0,0 +1,257 @@ +#!/bin/python3 + +import json +import sys +import xmltodict +import traceback + +# androidKey +# "androidKeyCount": "one" or "other" used to find matching key with quantity +# "sentenceCase": true capitalize first word (must be called before addStart) +# "ignoreCase": true ignore case difference between android EN and desktop EN values (some stuff are put in maj on android but not on desktop) +# "addStart": "&" char to add as start char +# "androidReplace": replace all occurences of key value pair + +ALLOWED_ITEM_KEYS = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'androidKeyCount', 'androidReplace', 'addStart', 'ignoreCase', 'sentenceCase'] + +SPECIFIC_LOCALES_MAPPING = { + 'zh_CN': 'zh-rCN', + 'pt_BR': 'pt-rBR', + 'id': 'in' +} + +if len(sys.argv) != 3: + print(f"usage: {sys.argv[0]} ") + sys.exit(1) + +dest = sys.argv[1] +androidRoot = sys.argv[2] + +desktopSrc = json.loads(open(f"_locales/en/messages.json", + "r").read()) +destFilePath = f"_locales/{dest}/messages.json" +desktopDest = json.loads(open(destFilePath, + "r").read()) + +androidEnValueFile = f"{androidRoot}/res/values/strings.xml" + + +def getAndroidTranslatedFile(androidRoot, dest): + if dest in SPECIFIC_LOCALES_MAPPING.keys(): + return f"{androidRoot}/res/values-{SPECIFIC_LOCALES_MAPPING[dest]}/strings.xml" + return f"{androidRoot}/res/values-{dest}/strings.xml" + +androidTranslatedValueFile = getAndroidTranslatedFile(androidRoot, dest) + +def getDictFromFile(filepath, keyToSearch): + xml = open(filepath, "r").read() + asDict = xmltodict.parse(xml)['resources'][keyToSearch] + return [dict(item) for item in asDict] + +def getStringFromFileAsJSON(filepath): + return getDictFromFile(filepath, 'string') + +def getPluralsFromFileAsJSON(filepath): + plurals = getDictFromFile(filepath, 'plurals') + # we need to force plurals to be an array (if plurals contains only one item, the dict won't contain an array itself) + for item in plurals: + if not isinstance(item['item'], list): + item['item'] = [item['item']] + + return plurals + +# read and extract values from xml file in EN android side +androidEnJsonSingular = getStringFromFileAsJSON(androidEnValueFile) +androidEnJsonPlurals = getPluralsFromFileAsJSON(androidEnValueFile) + +# read and extract values from xml file in DESTINATION LANGUAGE android side +androidDestJsonSingular = getStringFromFileAsJSON(androidTranslatedValueFile) +androidDestJsonPlurals = getPluralsFromFileAsJSON(androidTranslatedValueFile) + +# print(f"androidDestJsonSingular {androidDestJsonSingular}") +# print(f"androidDestJsonPlurals {androidDestJsonPlurals}") +# print(f"\n\n\n\n androidEnJsonSingular {androidEnJsonSingular}") +# print(f"\n\n\n\n androidEnJsonPlurals {androidEnJsonPlurals}") + +missingAndroidKeyCount = 0 +notMatchingCount = 0 + +def findCountInItem(quantityStr, items): + # print(f'searching qty: {quantityStr}, items: {items}') + found = [item for item in items if item['@quantity'] == quantityStr] + # print(f'findCountInItem: {found}, quantityStr: {quantityStr}') + + if len(found) != 1: + # special case for japanese. There is no plural, so all quantityString = `other` + if dest == 'ja': + found = [item for item in items if item['@quantity'] == 'other'] + if len(found) != 1: + str = f'quantityStr not found: other' + raise KeyError(str) + else: + str = f'quantityStr not found: "{quantityStr}"' + raise KeyError(str) + return dict(found[0]) + + +def findByNameSingular(keySearchedFor, singularString): + found = [item for item in singularString if item['@name'] == keySearchedFor] + # print(f'findByNameSingular: searching {keySearchedFor}, found: {found}') + + if len(found) != 1: + str = f'android key singular not found: "{keySearchedFor}" but should have been found' + raise KeyError(str) + return found[0] + + +def findByNamePlurals(keySearchedFor, pluralsString, quantityStr): + found = [item for item in pluralsString if item['@name'] == keySearchedFor] + if len(found) != 1: + str = f'android key plurals not found: "{keySearchedFor}" but should have been found' + raise KeyError(str) + # f = found[0] + # print(f'\t\tquantityStr {quantityStr}, found {found}, f {f}, pluralsString {pluralsString}') + return findCountInItem(quantityStr, found[0]['item']) + + +def validateKeysPresent(items): + for keyItem, valueItem in items: + if keyItem not in ALLOWED_ITEM_KEYS: + print(f"Invalid key item: {keyItem}") + exit(1) + # print(f"keyItem: '{keyItem}', valueItem: '{valueItem}'") + + +# morph a string from android syntax to desktop syntax. Like replacing char, or %s +def morphToDesktopSyntax(androidString, desktopItem): + replaced = androidString.replace(r"\'", "'") + + if('sentenceCase' in desktopItem.keys() and desktopItem['sentenceCase']): + replaced = replaced.capitalize() + + if ('androidReplace' in desktopItem.keys()): + for key, value in desktopItem['androidReplace'].items(): + replaced = replaced.replace(key.title(), value) + replaced = replaced.replace(key, value) + + # print(f"androidString: '{androidString}', replaced: '{replaced}'") + if ('addStart' in desktopItem.keys()): + toAdd = desktopItem['addStart'] + replaced = f'{toAdd}{replaced}' + return replaced + + # morph a string from android syntax to desktop syntax. Like replacing char, or %s +def morphToDesktopSyntaxTranslated(androidString, desktopItem): + replaced = androidString.replace(r"\'", "'") + + if('sentenceCase' in desktopItem.keys() and desktopItem['sentenceCase']): + replaced = replaced.capitalize() + + if ('androidReplace' in desktopItem.keys()): + for key, value in desktopItem['androidReplace'].items(): + replaced = replaced.replace(key.title(), value) + replaced = replaced.replace(key, value) + + # print(f"desktopItem: '{desktopItem}', replaced: '{desktopItem}'") + if ('addStart' in desktopItem.keys()): + toAdd = desktopItem['addStart'] + # special case for ja. appen the & and first char from desktop EN item + if dest == 'ja': + replaced = f'{replaced} ({toAdd}{desktopItem["message"][1]})' + else: + replaced = f'{toAdd}{replaced}' + return replaced + +def getAndroidItem(androidKey, androidKeyCount, singularJson, pluralsJson): + # print(f"\tandroidKey: '{androidKey}'") + # print(f"\tandroidKeyCount: '{androidKeyCount}'") + if androidKeyCount: + return findByNamePlurals(androidKey, pluralsJson, androidKeyCount) + else: + return findByNameSingular(androidKey, singularJson) + +def getAndroidKeyCountFromItem(item): + androidKeyCount = None + if 'androidKeyCount' in item.keys(): + androidKeyCount = item['androidKeyCount'] + return androidKeyCount + +def keysDifference(src, dest): + srcKeys = set(src.keys()) + destKeys = set(dest.keys()) + return list (srcKeys - destKeys) + +def addEnglishItemAsPlaceHolder(desktopDest, itemEnDesktop): + # add only if the key does not already exists on desktopDest + if key not in desktopDest.keys(): + desktopDest[key] = itemEnDesktop + + +# number of keys on src which do not exist at all on 'dest' +# print('keysDifference:', len(keysDifference(desktopSrc, desktopDest))) + +def doesAndroidEnAndDesktopMatches(txtEnDesktop, morphedEnAndroid, desktopItemEn): + if 'ignoreCase' in desktopItemEn.keys() and desktopItemEn['ignoreCase']: + return txtEnDesktop.lower() == morphedEnAndroid.lower() + return txtEnDesktop == morphedEnAndroid + +################### MAIN ##################### +for key, itemEnDesktop in desktopSrc.items(): + # print(f"key: '{key}', itemEnDesktop: '{itemEnDesktop}'") + items = itemEnDesktop.items() + validateKeysPresent(items) + if 'androidKey' not in itemEnDesktop.keys(): + # print('androidKey not found for {key}') + missingAndroidKeyCount = missingAndroidKeyCount + 1 + # ENABLE ME to add a placeholder item from the EN file when it is missing on the target locale + # addEnglishItemAsPlaceHolder(desktopDest, itemEnDesktop) + continue + androidKey = itemEnDesktop['androidKey'] + androidKeyCount = getAndroidKeyCountFromItem(itemEnDesktop) + # print(f'key: {key}, androidKey: {androidKey}, androidKeyCount: {androidKeyCount}') + txtEnDesktop = itemEnDesktop['message'] + itemEnAndroid = getAndroidItem(androidKey, androidKeyCount, androidEnJsonSingular, androidEnJsonPlurals) + + txtEnAndroid = itemEnAndroid['#text'] + + morphedEnAndroid = morphToDesktopSyntax(txtEnAndroid, itemEnDesktop) + if not doesAndroidEnAndDesktopMatches(txtEnDesktop, morphedEnAndroid, itemEnDesktop): + print(f'\t\tDOES NOT MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}", itemEnDesktop: {itemEnDesktop}\n\n') + notMatchingCount = notMatchingCount + 1 + else: + # if it does match, find the corresponding value on the target language on android + # print(f'=============== EN to EN MATCH, continuing... : "{txtEnDesktop}" vs "{morphedEnAndroid}"') + try: + textTranslated = getAndroidItem(androidKey, androidKeyCount, androidDestJsonSingular, androidDestJsonPlurals)['#text'] + # print(f'textTranslated: "{textTranslated}"') + + textMorphed = morphToDesktopSyntaxTranslated(textTranslated, itemEnDesktop) + existingItemTranslated = None + existingTranslation = None + if key in desktopDest.keys(): + existingItemTranslated = desktopDest[key] + existingTranslation = existingItemTranslated['message'] + + # print(f'existingItemTranslated: "{existingItemTranslated}"') + if existingTranslation != textMorphed: + print(f'not matching: "{existingTranslation}" and "{textMorphed}"') + if key not in desktopDest.keys(): + desktopDest[key] = {'message': textMorphed} + else: + desktopDest[key]['message'] = textMorphed + + except KeyError: + print('KeyError exception:', traceback.format_exc()) + + + +# write the updated json dict to the file +with open(destFilePath, 'w') as outfile: + json.dump(desktopDest, outfile, indent=4, ensure_ascii=False) + + + + + +print(f"total keys missing {missingAndroidKeyCount}") # androidKey set on desktop but not found on android EN resources +print(f"total text not matching EN to EN {notMatchingCount}") diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 6adb05d16..f6249fb35 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -1,22 +1,15 @@ import React from 'react'; import classNames from 'classnames'; -import { JazzIcon } from './JazzIcon'; -import { getInitials } from '../util/getInitials'; -import { LocalizerType } from '../types/Util'; +import { AvatarPlaceHolder, ClosedGroupAvatar } from './AvatarPlaceHolder'; +import { ConversationAvatar } from './session/usingClosedConversationDetails'; interface Props { avatarPath?: string; - color?: string; - conversationType: 'group' | 'direct'; - noteToSelf?: boolean; - name?: string; - phoneNumber?: string; - profileName?: string; + name?: string; // display name, profileName or phoneNumber, whatever is set first + pubkey?: string; size: number; - borderColor?: string; - borderWidth?: number; - i18n?: LocalizerType; + memberAvatars?: Array; // this is added by usingClosedConversationDetails onAvatarClick?: () => void; } @@ -40,136 +33,80 @@ export class Avatar extends React.PureComponent { } public handleImageError() { - // tslint:disable-next-line no-console - console.log('Avatar: Image failed to load; failing over to placeholder'); + window.log.warn( + 'Avatar: Image failed to load; failing over to placeholder' + ); this.setState({ imageBroken: true, }); } public renderIdenticon() { - const { phoneNumber, borderColor, borderWidth, size } = this.props; + const { size, name, pubkey } = this.props; - if (!phoneNumber) { - return this.renderNoImage(); - } + const userName = name || '0'; - const borderStyle = this.getBorderStyle(borderColor, borderWidth); - - // Generate the seed - const hash = phoneNumber.substring(0, 12); - const seed = parseInt(hash, 16) || 1234; - - return ; + return ( + + ); } public renderImage() { - const { - avatarPath, - name, - phoneNumber, - profileName, - borderColor, - borderWidth, - } = this.props; + const { avatarPath, name } = this.props; const { imageBroken } = this.state; if (!avatarPath || imageBroken) { return null; } - const title = `${name || phoneNumber}${ - !name && profileName ? ` ~${profileName}` : '' - }`; - - const borderStyle = this.getBorderStyle(borderColor, borderWidth); - return ( {window.i18n('contactAvatarAlt', ); } public renderNoImage() { - const { - conversationType, - name, - noteToSelf, - size, - borderColor, - borderWidth, - } = this.props; - - const initials = getInitials(name); - const isGroup = conversationType === 'group'; - - if (noteToSelf) { + const { memberAvatars, size } = this.props; + // if no image but we have conversations set for the group, renders group members avatars + if (memberAvatars) { return ( -
); } - const borderStyle = this.getBorderStyle(borderColor, borderWidth); - - if (!isGroup && initials) { - return ( -
- {initials} -
- ); - } - - return ( -
- ); + return this.renderIdenticon(); } public render() { - const { - avatarPath, - color, - size, - noteToSelf, - conversationType, - } = this.props; + const { avatarPath, size, memberAvatars } = this.props; const { imageBroken } = this.state; - - // If it's a direct conversation then we must have an identicon - const hasAvatar = avatarPath || conversationType === 'direct'; - const hasImage = !noteToSelf && hasAvatar && !imageBroken; + const isClosedGroupAvatar = memberAvatars && memberAvatars.length; + const hasImage = avatarPath && !imageBroken && !isClosedGroupAvatar; if ( size !== 28 && size !== 36 && size !== 48 && + size !== 64 && size !== 80 && size !== 300 ) { throw new Error(`Size ${size} is not supported!`); } + const isClickable = !!this.props.onAvatarClick; return (
{ 'module-avatar', `module-avatar--${size}`, hasImage ? 'module-avatar--with-image' : 'module-avatar--no-image', - !hasImage ? `module-avatar--${color}` : null + isClickable && 'module-avatar-clickable' )} onClick={e => { this.onAvatarClickBound(e); }} role="button" > - {hasImage ? this.renderAvatarOrIdenticon() : this.renderNoImage()} + {hasImage ? this.renderImage() : this.renderNoImage()}
); } @@ -196,28 +133,13 @@ export class Avatar extends React.PureComponent { } } - private renderAvatarOrIdenticon() { - const { avatarPath, conversationType } = this.props; - - // If it's a direct conversation then we must have an identicon - const hasAvatar = avatarPath || conversationType === 'direct'; - - return hasAvatar && avatarPath - ? this.renderImage() - : this.renderIdenticon(); + private getAvatarColors(): Array { + // const theme = window.Events.getThemedSettings(); + // defined in session-android as `profile_picture_placeholder_colors` + return ['#5ff8b0', '#26cdb9', '#f3c615', '#fcac5a']; } - private getBorderStyle(_color?: string, _width?: number) { - //const borderWidth = typeof width === 'number' ? width : 3; - - // no border at all for now - return undefined; - /* return color - ? { - borderColor: color, - borderStyle: 'solid', - borderWidth: borderWidth, - } - : undefined; */ + private getAvatarBorderColor(): string { + return '#00000059'; // borderAvatarColor in themes.scss } } diff --git a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx new file mode 100644 index 000000000..8e7d1e8fd --- /dev/null +++ b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx @@ -0,0 +1,124 @@ +import React from 'react'; +import { getInitials } from '../../util/getInitials'; + +interface Props { + diameter: number; + name: string; + pubkey?: string; + colors: Array; + borderColor: string; +} + +interface State { + sha512Seed?: string; +} + +export class AvatarPlaceHolder extends React.PureComponent { + public constructor(props: Props) { + super(props); + + this.state = { + sha512Seed: undefined, + }; + } + + public componentDidMount() { + const { pubkey } = this.props; + if (pubkey) { + void this.sha512(pubkey).then((sha512Seed: string) => { + this.setState({ sha512Seed }); + }); + } + } + + public componentDidUpdate(prevProps: Props, prevState: State) { + const { pubkey, name } = this.props; + if (pubkey === prevProps.pubkey && name === prevProps.name) { + return; + } + + if (pubkey) { + void this.sha512(pubkey).then((sha512Seed: string) => { + this.setState({ sha512Seed }); + }); + } + } + + public render() { + const { borderColor, colors, diameter, name } = this.props; + const diameterWithoutBorder = diameter - 2; + const viewBox = `0 0 ${diameter} ${diameter}`; + const r = diameter / 2; + const rWithoutBorder = diameterWithoutBorder / 2; + + if (!this.state.sha512Seed) { + // return grey circle + return ( + + + + + + ); + } + + const initial = getInitials(name)?.toLocaleUpperCase() || '0'; + const fontSize = diameter * 0.5; + + // Generate the seed simulate the .hashCode as Java + const hash = parseInt(this.state.sha512Seed.substring(0, 12), 16) || 0; + + const bgColorIndex = hash % colors.length; + + const bgColor = colors[bgColorIndex]; + + return ( + + + + + {initial} + + + + ); + } + + private async sha512(str: string) { + // tslint:disable-next-line: await-promise + const buf = await crypto.subtle.digest( + 'SHA-512', + new TextEncoder().encode(str) + ); + + // tslint:disable: prefer-template restrict-plus-operands + return Array.prototype.map + .call(new Uint8Array(buf), (x: any) => ('00' + x.toString(16)).slice(-2)) + .join(''); + } +} diff --git a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx new file mode 100644 index 000000000..31a8b2fea --- /dev/null +++ b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { Avatar } from '../Avatar'; +import { LocalizerType } from '../../types/Util'; +import { ConversationAvatar } from '../session/usingClosedConversationDetails'; + +interface Props { + size: number; + memberAvatars: Array; // this is added by usingClosedConversationDetails + i18n: LocalizerType; +} + +export class ClosedGroupAvatar extends React.PureComponent { + public getClosedGroupAvatarsSize(size: number) { + // Always use the size directly under the one requested + switch (size) { + case 36: + return 28; + case 48: + return 36; + case 64: + return 48; + case 80: + return 64; + case 300: + return 80; + default: + throw new Error( + `Invalid size request for closed group avatar: ${size}` + ); + } + } + + public render() { + const { memberAvatars, size } = this.props; + const avatarsDiameter = this.getClosedGroupAvatarsSize(size); + + const conv1 = memberAvatars.length > 0 ? memberAvatars[0] : undefined; + const conv2 = memberAvatars.length > 1 ? memberAvatars[1] : undefined; + const name1 = conv1?.name || conv1?.id || undefined; + const name2 = conv2?.name || conv2?.id || undefined; + + // use the 2 first members as group avatars + return ( +
+ + +
+ ); + } +} diff --git a/ts/components/AvatarPlaceHolder/index.ts b/ts/components/AvatarPlaceHolder/index.ts new file mode 100644 index 000000000..f6f819bd6 --- /dev/null +++ b/ts/components/AvatarPlaceHolder/index.ts @@ -0,0 +1,2 @@ +export { AvatarPlaceHolder } from './AvatarPlaceHolder'; +export { ClosedGroupAvatar } from './ClosedGroupAvatar'; diff --git a/ts/components/ContactListItem.tsx b/ts/components/ContactListItem.tsx index ebffc0b32..0cf81a6f4 100644 --- a/ts/components/ContactListItem.tsx +++ b/ts/components/ContactListItem.tsx @@ -10,7 +10,6 @@ interface Props { phoneNumber: string; isMe?: boolean; name?: string; - color: string; verified: boolean; profileName?: string; avatarPath?: string; @@ -20,25 +19,16 @@ interface Props { export class ContactListItem extends React.Component { public renderAvatar() { - const { - avatarPath, - i18n, - color, - name, - phoneNumber, - profileName, - } = this.props; + const { avatarPath, name, phoneNumber, profileName } = this.props; + + const userName = name || profileName || phoneNumber; return ( ); } diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index cdd3294f8..6418ac3e3 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -10,16 +10,22 @@ import { Timestamp } from './conversation/Timestamp'; import { ContactName } from './conversation/ContactName'; import { TypingAnimation } from './conversation/TypingAnimation'; -import { Colors, LocalizerType } from '../types/Util'; +import { LocalizerType } from '../types/Util'; import { getBlockMenuItem, getClearNicknameMenuItem, - getCopyIdMenuItem, + getCopyMenuItem, getDeleteContactMenuItem, + getDeleteMessagesMenuItem, getInviteContactMenuItem, getLeaveGroupMenuItem, } from '../session/utils/Menu'; +import { + ConversationAvatar, + usingClosedConversationDetails, +} from './session/usingClosedConversationDetails'; + export type PropsData = { id: string; phoneNumber: string; @@ -52,6 +58,7 @@ export type PropsData = { isSecondary?: boolean; isGroupInvitation?: boolean; isKickedFromGroup?: boolean; + memberAvatars?: Array; // this is added by usingClosedConversationDetails }; type PropsHousekeeping = { @@ -69,64 +76,52 @@ type PropsHousekeeping = { type Props = PropsData & PropsHousekeeping; -export class ConversationListItem extends React.PureComponent { +class ConversationListItem extends React.PureComponent { + public constructor(props: Props) { + super(props); + } + public renderAvatar() { const { avatarPath, - color, - type, i18n, - isMe, name, phoneNumber, profileName, - isOnline, + memberAvatars, } = this.props; - const borderColor = isOnline ? Colors.ONLINE : Colors.OFFLINE; - const iconSize = 36; + const userName = name || profileName || phoneNumber; return (
); } - public renderUnread() { - const { unreadCount, mentionedUs } = this.props; + public renderHeader() { + const { unreadCount, mentionedUs, i18n, isMe, lastUpdated } = this.props; + const {} = this.props; + let atSymbol = null; + let unreadCountDiv = null; if (unreadCount > 0) { - const atSymbol = mentionedUs ?

@

: null; - - return ( -
-

- {unreadCount} -

- {atSymbol} -
+ atSymbol = mentionedUs ?

@

: null; + unreadCountDiv = ( +

+ {unreadCount} +

); } - return null; - } - - public renderHeader() { - const { unreadCount, i18n, isMe, lastUpdated } = this.props; - return (
{ : null )} > - {isMe ? i18n('noteToSelf') : this.renderUser()} + {this.renderUser()}
- {this.renderUnread()} + {unreadCountDiv} + {atSymbol} {
{ {i18n('changeNickname')} ) : null} */} - { getClearNicknameMenuItem( + {getClearNicknameMenuItem( isPublic, isRss, isMe, hasNickname, onClearNickname, i18n - ) } - {getCopyIdMenuItem( + )} + {getCopyMenuItem( isPublic, isRss, type === 'group', onCopyPublicKey, i18n )} - {i18n('deleteMessages')} + {getDeleteMessagesMenuItem(isPublic, onDeleteMessages, i18n)} {getInviteContactMenuItem( type === 'group', isPublic, @@ -306,11 +302,10 @@ export class ConversationListItem extends React.PureComponent { style, mentionedUs, } = this.props; - - const triggerId = `${phoneNumber}-ctxmenu-${Date.now()}`; + const triggerId = `conversation-item-${phoneNumber}-ctxmenu`; return ( -
+
{ } private renderUser() { - const { name, phoneNumber, profileName } = this.props; + const { name, phoneNumber, profileName, isMe, i18n } = this.props; const shortenedPubkey = window.shortenPubkey(phoneNumber); const displayedPubkey = profileName ? shortenedPubkey : phoneNumber; + const displayName = isMe ? i18n('noteToSelf') : profileName; + + let shouldShowPubkey = false; + if (!name || name.length === 0) { + shouldShowPubkey = true; + } return (
); } } + +export const ConversationListItemWithDetails = usingClosedConversationDetails( + ConversationListItem +); diff --git a/ts/components/DevicePairingDialog.tsx b/ts/components/DevicePairingDialog.tsx index 8c5079d74..c141a2c8d 100644 --- a/ts/components/DevicePairingDialog.tsx +++ b/ts/components/DevicePairingDialog.tsx @@ -5,6 +5,7 @@ import { SessionModal } from './session/SessionModal'; import { SessionButton, SessionButtonColor } from './session/SessionButton'; import { SessionSpinner } from './session/SessionSpinner'; import classNames from 'classnames'; +import { ToastUtils } from '../session/utils'; interface Props { onClose: any; @@ -73,7 +74,7 @@ export class DevicePairingDialog extends React.Component { public renderFilterRequestsView() { const { currentPubKey, accepted, deviceAlias } = this.state; - let secretWords: undefined; + let secretWords: string | undefined; if (currentPubKey) { secretWords = window.mnemonic.pubkey_to_secret_words(currentPubKey); } @@ -119,14 +120,9 @@ export class DevicePairingDialog extends React.Component { {window.i18n('allowPairingWithDevice')} {this.renderErrors()} +
{window.i18n('secretWords')}
-
- +
{secretWords}
@@ -286,7 +282,7 @@ export class DevicePairingDialog extends React.Component { errors: null, }); this.closeDialog(); - window.pushToast({ + ToastUtils.push({ title: window.i18n('devicePairedSuccessfully'), type: 'success', }); @@ -371,7 +367,7 @@ export class DevicePairingDialog extends React.Component { private triggerUnpairDevice() { const deviceUnpaired = () => { - window.pushToast({ + ToastUtils.push({ title: window.i18n('deviceUnpaired'), }); this.closeDialog(); diff --git a/ts/components/EditProfileDialog.tsx b/ts/components/EditProfileDialog.tsx index 293bf1349..065490bcb 100644 --- a/ts/components/EditProfileDialog.tsx +++ b/ts/components/EditProfileDialog.tsx @@ -17,6 +17,7 @@ import { } from './session/icon'; import { SessionModal } from './session/SessionModal'; import { PillDivider } from './session/PillDivider'; +import { ToastUtils } from '../session/utils'; declare global { interface Window { @@ -29,7 +30,6 @@ interface Props { i18n: any; profileName: string; avatarPath: string; - avatarColor: string; pubkey: string; onClose: any; onOk: any; @@ -133,7 +133,7 @@ export class EditProfileDialog extends React.Component { )} @@ -256,20 +256,12 @@ export class EditProfileDialog extends React.Component { } private renderAvatar() { - const avatarPath = this.state.avatar; - const color = this.props.avatarColor; + const { avatar, profileName } = this.state; + const { pubkey } = this.props; + const userName = name || profileName || pubkey; return ( - + ); } @@ -304,10 +296,10 @@ export class EditProfileDialog extends React.Component { private copySessionID(sessionID: string) { window.clipboard.writeText(sessionID); - window.pushToast({ - title: window.i18n('copiedSessionID'), + ToastUtils.push({ + title: window.i18n('copiedToClipboard'), type: 'success', - id: 'copiedSessionID', + id: 'copiedToClipboard', }); } diff --git a/ts/components/JazzIcon/JazzIcon.tsx b/ts/components/JazzIcon/JazzIcon.tsx deleted file mode 100644 index 3cc17044b..000000000 --- a/ts/components/JazzIcon/JazzIcon.tsx +++ /dev/null @@ -1,166 +0,0 @@ -// Modified from https://github.com/redlanta/react-jazzicon - -import React from 'react'; -import Color from 'color'; -import { Paper } from './Paper'; -import { RNG } from './RNG'; - -const defaultColors = [ - '#01888c', // teal - '#fc7500', // bright orange - '#034f5d', // dark teal - '#E784BA', // light pink - '#81C8B6', // bright green - '#c7144c', // raspberry - '#f3c100', // goldenrod - '#1598f2', // lightning blue - '#2465e1', // sail blue - '#f19e02', // gold -]; - -const isColor = (str: string) => /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(str); -const isColors = (arr: Array) => { - if (!Array.isArray(arr)) { - return false; - } - - if (arr.every(value => typeof value === 'string' && isColor(value))) { - return true; - } - - return false; -}; - -interface Props { - diameter: number; - seed: number; - paperStyles?: Object; - svgStyles?: Object; - shapeCount?: number; - wobble?: number; - colors?: Array; -} - -// tslint:disable-next-line no-http-string -const svgns = 'http://www.w3.org/2000/svg'; -const shapeCount = 4; -const wobble = 30; - -export class JazzIcon extends React.PureComponent { - public render() { - const { - colors: customColors, - diameter, - paperStyles, - seed, - svgStyles, - } = this.props; - - const generator = new RNG(seed); - - const colors = customColors || defaultColors; - - const newColours = this.hueShift( - this.colorsForIcon(colors).slice(), - generator - ); - const shapesArr = Array(shapeCount).fill(null); - const shuffledColours = this.shuffleArray(newColours, generator); - - return ( - - - {shapesArr.map((_, i) => - this.genShape( - shuffledColours[i + 1], - diameter, - i, - shapeCount - 1, - generator - ) - )} - - - ); - } - - private hueShift(colors: Array, generator: RNG) { - const amount = generator.random() * 30 - wobble / 2; - - return colors.map(hex => - Color(hex) - .rotate(amount) - .hex() - ); - } - - private genShape( - colour: string, - diameter: number, - i: number, - total: number, - generator: RNG - ) { - const center = diameter / 2; - const firstRot = generator.random(); - const angle = Math.PI * 2 * firstRot; - const velocity = - (diameter / total) * generator.random() + (i * diameter) / total; - const tx = Math.cos(angle) * velocity; - const ty = Math.sin(angle) * velocity; - const translate = `translate(${tx} ${ty})`; - - // Third random is a shape rotation on top of all of that. - const secondRot = generator.random(); - const rot = firstRot * 360 + secondRot * 180; - const rotate = `rotate(${rot.toFixed(1)} ${center} ${center})`; - const transform = `${translate} ${rotate}`; - - return ( - - ); - } - - private colorsForIcon(arr: Array) { - if (isColors(arr)) { - return arr; - } - - return defaultColors; - } - - private shuffleArray(array: Array, generator: RNG) { - let currentIndex = array.length; - const newArray = [...array]; - - // While there remain elements to shuffle... - while (currentIndex > 0) { - // Pick a remaining element... - const randomIndex = generator.next() % currentIndex; - currentIndex -= 1; - // And swap it with the current element. - const temporaryValue = newArray[currentIndex]; - newArray[currentIndex] = newArray[randomIndex]; - newArray[randomIndex] = temporaryValue; - } - - return newArray; - } -} diff --git a/ts/components/JazzIcon/Paper.tsx b/ts/components/JazzIcon/Paper.tsx deleted file mode 100644 index ee3791637..000000000 --- a/ts/components/JazzIcon/Paper.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; - -const styles = { - borderRadius: '50%', - display: 'inline-block', - margin: 0, - overflow: 'hidden', - padding: 0, -}; - -// @ts-ignore -export const Paper = ({ children, color, diameter, style: styleOverrides }) => ( -
- {children} -
-); diff --git a/ts/components/JazzIcon/RNG.tsx b/ts/components/JazzIcon/RNG.tsx deleted file mode 100644 index b6c18ac6b..000000000 --- a/ts/components/JazzIcon/RNG.tsx +++ /dev/null @@ -1,21 +0,0 @@ -export class RNG { - private _seed: number; - constructor(seed: number) { - this._seed = seed % 2147483647; - if (this._seed <= 0) { - this._seed += 2147483646; - } - } - - public next() { - return (this._seed = (this._seed * 16807) % 2147483647); - } - - public nextFloat() { - return (this.next() - 1) / 2147483646; - } - - public random() { - return this.nextFloat(); - } -} diff --git a/ts/components/JazzIcon/index.tsx b/ts/components/JazzIcon/index.tsx deleted file mode 100644 index 204774dc6..000000000 --- a/ts/components/JazzIcon/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -import { JazzIcon } from './JazzIcon'; -export { JazzIcon }; diff --git a/ts/components/LeftPane.tsx b/ts/components/LeftPane.tsx index a4c4c600c..dbf97a13e 100644 --- a/ts/components/LeftPane.tsx +++ b/ts/components/LeftPane.tsx @@ -112,6 +112,7 @@ export class LeftPane extends React.Component { const { openConversationInternal, conversations, + contacts, searchResults, searchTerm, isSecondaryDevice, @@ -119,12 +120,19 @@ export class LeftPane extends React.Component { search, clearSearch, } = this.props; + // be sure to filter out secondary conversations + let filteredConversations = conversations; + if (conversations !== undefined) { + filteredConversations = conversations.filter( + conversation => !conversation.isSecondary + ); + } return (
-
+
full-brand-logo + full-brand-logo
@@ -44,19 +50,20 @@ export class MessageView extends React.Component { async function createClosedGroup( groupName: string, groupMembers: Array, - senderKeys: boolean, onSuccess: any ) { // Validate groupName and groupMembers length - if ( - groupName.length === 0 || - groupName.length > window.CONSTANTS.MAX_GROUP_NAME_LENGTH - ) { - window.pushToast({ - title: window.i18n( - 'invalidGroupName', - window.CONSTANTS.MAX_GROUP_NAME_LENGTH - ), + if (groupName.length === 0) { + ToastUtils.push({ + title: window.i18n('invalidGroupNameTooShort'), + type: 'error', + id: 'invalidGroupName', + }); + + return; + } else if (groupName.length > window.CONSTANTS.MAX_GROUP_NAME_LENGTH) { + ToastUtils.push({ + title: window.i18n('invalidGroupNameTooLong'), type: 'error', id: 'invalidGroupName', }); @@ -64,18 +71,22 @@ async function createClosedGroup( return; } - // >= because we add ourself as a member after this. so a 10 group is already invalid as it will be 11 with ourself - if ( - groupMembers.length === 0 || - groupMembers.length >= window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - ) { - window.pushToast({ - title: window.i18n( - 'invalidGroupSize', - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - ), + // >= because we add ourself as a member AFTER this. so a 10 group is already invalid as it will be 11 with ourself + // the same is valid with groups count < 1 + + if (groupMembers.length < 1) { + ToastUtils.push({ + title: window.i18n('pickClosedGroupMember'), type: 'error', - id: 'invalidGroupSize', + id: 'pickClosedGroupMember', + }); + + return; + } else if (groupMembers.length >= window.CONSTANTS.MEDIUM_GROUP_SIZE_LIMIT) { + ToastUtils.push({ + title: window.i18n('closedGroupMaxSize'), + type: 'error', + id: 'closedGroupMaxSize', }); return; @@ -83,7 +94,7 @@ async function createClosedGroup( const groupMemberIds = groupMembers.map(m => m.id); - if (senderKeys) { + if (window.lokiFeatureFlags.enableSenderKeys) { await createMediumGroup(groupName, groupMemberIds); } else { await createLegacyGroup(groupName, groupMemberIds); diff --git a/ts/components/MessageSearchResult.tsx b/ts/components/MessageSearchResult.tsx index 7c561a8e0..936aa2211 100644 --- a/ts/components/MessageSearchResult.tsx +++ b/ts/components/MessageSearchResult.tsx @@ -68,6 +68,7 @@ export class MessageSearchResult extends React.PureComponent { profileName={from.profileName} i18n={i18n} module="module-message-search-result__header__name" + shouldShowPubkey={false} /> ); } @@ -86,6 +87,7 @@ export class MessageSearchResult extends React.PureComponent { name={to.name} profileName={to.profileName} i18n={i18n} + shouldShowPubkey={false} />
@@ -100,20 +102,15 @@ export class MessageSearchResult extends React.PureComponent { } public renderAvatar() { - const { from, i18n, to } = this.props; - const isNoteToSelf = from.isMe && to.isMe; + const { from } = this.props; + const userName = from.profileName || from.phoneNumber; return ( ); } diff --git a/ts/components/SearchResults.tsx b/ts/components/SearchResults.tsx index 8f7f39c09..0791320e5 100644 --- a/ts/components/SearchResults.tsx +++ b/ts/components/SearchResults.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { - ConversationListItem, + ConversationListItemWithDetails, PropsData as ConversationListItemPropsType, } from './ConversationListItem'; import { @@ -62,7 +62,7 @@ export class SearchResults extends React.Component { {i18n('conversationsHeader')}
{conversations.map(conversation => ( - {
{hideMessagesHeader ? null : (
- {i18n('messages')} + {i18n('messagesHeader')}
)} {messages.map(message => ( @@ -106,7 +106,7 @@ export class SearchResults extends React.Component {
{header}
{items.map(contact => ( - { } private renderAvatar() { - const avatarPath = this.props.avatarPath; - const color = this.props.avatarColor; + const { avatarPath, pubkey, profileName } = this.props; const size = this.state.isEnlargedImageShown ? 300 : 80; + const userName = name || profileName || pubkey; return ( ); } diff --git a/ts/components/conversation/ContactDetail.tsx b/ts/components/conversation/ContactDetail.tsx index 2c209b624..5a16ddbfe 100644 --- a/ts/components/conversation/ContactDetail.tsx +++ b/ts/components/conversation/ContactDetail.tsx @@ -81,50 +81,7 @@ export class ContactDetail extends React.Component { i18n: (key: string, values?: Array) => string; onSendMessage: () => void; }) { - if (!hasSignalAccount) { - return null; - } - - // We don't want the overall click handler for this element to fire, so we stop - // propagation before handing control to the caller's callback. - const onClick = (e: React.MouseEvent<{}>): void => { - e.stopPropagation(); - onSendMessage(); - }; - - return ( -
- -
- ); - } - - public renderEmail(items: Array | undefined, i18n: LocalizerType) { - if (!items || items.length === 0) { - return; - } - - return items.map((item: Email) => { - return ( -
-
- {getLabelForEmail(item, i18n)} -
- {item.value} -
- ); - }); + return null; } public renderPhone(items: Array | undefined, i18n: LocalizerType) { @@ -217,7 +174,6 @@ export class ContactDetail extends React.Component { {renderContactShorthand({ contact, isIncoming, module })} {this.renderSendMessage({ hasSignalAccount, i18n, onSendMessage })} {this.renderPhone(contact.number, i18n)} - {this.renderEmail(contact.email, i18n)} {this.renderAddresses(contact.address, i18n)}
); diff --git a/ts/components/conversation/ContactName.tsx b/ts/components/conversation/ContactName.tsx index 42465489a..02252f909 100644 --- a/ts/components/conversation/ContactName.tsx +++ b/ts/components/conversation/ContactName.tsx @@ -12,6 +12,7 @@ interface Props { module?: string; boldProfileName?: Boolean; compact?: Boolean; + shouldShowPubkey: Boolean; } export class ContactName extends React.Component { @@ -24,20 +25,27 @@ export class ContactName extends React.Component { module, boldProfileName, compact, + shouldShowPubkey, } = this.props; const prefix = module ? module : 'module-contact-name'; const title = name ? name : phoneNumber; - const shouldShowProfile = Boolean(profileName && !name); - + const shouldShowProfile = Boolean(profileName || name); const styles = (boldProfileName ? { fontWeight: 'bold', } : {}) as React.CSSProperties; + const textProfile = profileName || name || i18n('anonymous'); const profileElement = shouldShowProfile ? ( - + + + ) : null; + + const pubKeyElement = shouldShowPubkey ? ( + + ) : null; @@ -45,14 +53,7 @@ export class ContactName extends React.Component { {profileElement} {shouldShowProfile ? ' ' : null} - - - + {pubKeyElement} ); } diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 215929462..8aff94d87 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -16,6 +16,10 @@ import { SessionButtonType, } from '../session/SessionButton'; import * as Menu from '../../session/utils/Menu'; +import { + ConversationAvatar, + usingClosedConversationDetails, +} from '../session/usingClosedConversationDetails'; export interface TimerOption { name: string; @@ -87,9 +91,10 @@ interface Props { onUpdateGroupName: () => void; i18n: LocalizerType; + memberAvatars?: Array; // this is added by usingClosedConversationDetails } -export class ConversationHeader extends React.Component { +class ConversationHeader extends React.Component { public showMenuBound: (event: React.MouseEvent) => void; public onAvatarClickBound: (userPubKey: string) => void; public menuTriggerRef: React.RefObject; @@ -170,16 +175,7 @@ export class ConversationHeader extends React.Component { {text} ); - let title; - if (profileName) { - title = `${profileName} ${window.shortenPubkey(phoneNumber)}`; - } else { - if (name) { - title = `${name}`; - } else { - title = `User ${window.shortenPubkey(phoneNumber)}`; - } - } + const title = profileName || name || phoneNumber; return (
@@ -192,34 +188,25 @@ export class ConversationHeader extends React.Component { public renderAvatar() { const { avatarPath, - i18n, - isGroup, - isMe, + memberAvatars, name, phoneNumber, profileName, - isOnline, } = this.props; - const borderColor = isOnline ? Colors.ONLINE : Colors.OFFLINE_LIGHT; - const conversationType = isGroup ? 'group' : 'direct'; + const userName = name || profileName || phoneNumber; return ( { this.onAvatarClickBound(phoneNumber); }} + memberAvatars={memberAvatars} + pubkey={phoneNumber} /> ); @@ -300,14 +287,8 @@ export class ConversationHeader extends React.Component { return ( {this.renderPublicMenuItems()} - {Menu.getCopyIdMenuItem( - isPublic, - isRss, - isGroup, - onCopyPublicKey, - i18n - )} - {i18n('deleteMessages')} + {Menu.getCopyMenuItem(isPublic, isRss, isGroup, onCopyPublicKey, i18n)} + {Menu.getDeleteMessagesMenuItem(isPublic, onDeleteMessages, i18n)} {Menu.getAddModeratorsMenuItem( amMod, isKickedFromGroup, @@ -363,7 +344,7 @@ export class ConversationHeader extends React.Component { } = this.props; const isServerDeletable = isPublic; const deleteMessageButtonText = i18n( - isServerDeletable ? 'unsend' : 'delete' + isServerDeletable ? 'deleteForEveryone' : 'delete' ); return ( @@ -390,7 +371,7 @@ export class ConversationHeader extends React.Component { public render() { const { id, isKickedFromGroup } = this.props; - const triggerId = `conversation-${id}-${Date.now()}`; + const triggerId = `conversation-header-${id}-${Date.now()}`; const selectionMode = !!this.props.selectedMessages.length; return ( @@ -424,7 +405,7 @@ export class ConversationHeader extends React.Component { public highlightMessageSearch() { // This is a temporary fix. In future we want to search // messages in the current conversation - $('.session-search-input input').focus(); + ($('.session-search-input input') as any).focus(); } // tslint:disable-next-line: cyclomatic-complexity @@ -476,6 +457,7 @@ export class ConversationHeader extends React.Component { isPublic, isRss, isGroup, + isBlocked, onResetSession, i18n ); @@ -499,3 +481,7 @@ export class ConversationHeader extends React.Component { ); } } + +export const ConversationHeaderWithDetails = usingClosedConversationDetails( + ConversationHeader +); diff --git a/ts/components/conversation/CreateGroupDialog.tsx b/ts/components/conversation/CreateGroupDialog.tsx index faefd0fdd..81d81bb58 100644 --- a/ts/components/conversation/CreateGroupDialog.tsx +++ b/ts/components/conversation/CreateGroupDialog.tsx @@ -8,7 +8,7 @@ import { createLegacyGroup } from '../../session/medium_group'; declare global { interface Window { Lodash: any; - SMALL_GROUP_SIZE_LIMIT: number; + MEDIUM_GROUP_SIZE_LIMIT: number; } } @@ -50,7 +50,6 @@ export class CreateGroupDialog extends React.Component { authorProfileName: name, selected: false, authorName: name, // different from ProfileName? - authorColor: d.getColor(), checkmarked: false, }; }); @@ -117,7 +116,7 @@ export class CreateGroupDialog extends React.Component { autoFocus={true} aria-required={true} /> -
+
{ if ( updatedContacts.filter(d => d.checkmarked).length > - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - 1 + window.CONSTANTS.MEDIUM_GROUP_SIZE_LIMIT - 1 ) { - const msg = `${this.props.i18n('maxGroupMembersError')} ${ - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - }`; + const msg = this.props.i18n('closedGroupMaxSize'); this.onShowError(msg); return; diff --git a/ts/components/conversation/InviteContactsDialog.tsx b/ts/components/conversation/InviteContactsDialog.tsx index 721fd4be5..3268564a3 100644 --- a/ts/components/conversation/InviteContactsDialog.tsx +++ b/ts/components/conversation/InviteContactsDialog.tsx @@ -42,9 +42,9 @@ export class InviteContactsDialog extends React.Component { id: d.id, authorPhoneNumber: d.id, authorProfileName: name, + authorAvatarPath: d?.cachedProps?.avatarPath, selected: false, authorName: name, - authorColor: d.getColor(), checkmarked: false, existingMember, }; @@ -72,11 +72,11 @@ export class InviteContactsDialog extends React.Component { >
-
{this.renderMemberList()}
+
{this.renderMemberList()}
{hasContacts ? null : ( <>
-

{window.i18n('noContactsToAdd')}

+

{window.i18n('noContactsToAdd')}

)} diff --git a/ts/components/conversation/MemberList.tsx b/ts/components/conversation/MemberList.tsx index 69a7c2d58..0ea697af2 100644 --- a/ts/components/conversation/MemberList.tsx +++ b/ts/components/conversation/MemberList.tsx @@ -8,7 +8,6 @@ export interface Contact { authorProfileName: string; authorPhoneNumber: string; authorName: string; - authorColor: any; authorAvatarPath: string; checkmarked: boolean; existingMember: boolean; @@ -91,16 +90,20 @@ class MemberItem extends React.Component { } private renderAvatar() { + const { + authorName, + authorAvatarPath, + authorPhoneNumber, + authorProfileName, + } = this.props.member; + const userName = authorName || authorProfileName || authorPhoneNumber; + return ( ); } diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 872259e75..03e63bd9c 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -69,6 +69,7 @@ export interface Props { collapseMetadata?: boolean; direction: 'incoming' | 'outgoing'; timestamp: number; + serverTimestamp?: number; status?: 'sending' | 'sent' | 'delivered' | 'read' | 'error'; // What if changed this over to a single contact like quote, and put the events on it? contact?: Contact & { @@ -81,8 +82,6 @@ export interface Props { authorProfileName?: string; /** Note: this should be formatted for display */ authorPhoneNumber: string; - firstMessageOfSeries: boolean; - authorColor?: ColorType; conversationType: 'group' | 'direct'; attachments?: Array; quote?: { @@ -92,7 +91,6 @@ export interface Props { authorPhoneNumber: string; authorProfileName?: string; authorName?: string; - authorColor?: ColorType; onClick?: () => void; referencedMessageNotFound: boolean; }; @@ -259,6 +257,7 @@ export class Message extends React.PureComponent { text, textPending, timestamp, + serverTimestamp, } = this.props; if (collapseMetadata) { @@ -301,7 +300,7 @@ export class Message extends React.PureComponent { ) : ( { public renderQuote() { const { conversationType, - authorColor, direction, i18n, quote, @@ -629,8 +627,6 @@ export class Message extends React.PureComponent { const withContentAbove = conversationType === 'group' && direction === 'incoming'; - const quoteColor = - direction === 'incoming' ? authorColor : quote.authorColor; const shortenedPubkey = window.shortenPubkey(quote.authorPhoneNumber); @@ -651,7 +647,6 @@ export class Message extends React.PureComponent { authorPhoneNumber={displayedPubkey} authorProfileName={quote.authorProfileName} authorName={quote.authorName} - authorColor={quoteColor} referencedMessageNotFound={quote.referencedMessageNotFound} isFromMe={quote.isFromMe} withContentAbove={withContentAbove} @@ -690,64 +685,40 @@ export class Message extends React.PureComponent { ); } - public renderSendMessageButton() { - const { contact, i18n } = this.props; - if (!contact || !contact.hasSignalAccount) { - return null; - } - - return ( -
- {i18n('sendMessageToContact')} -
- ); - } - public renderAvatar() { const { authorAvatarPath, authorName, authorPhoneNumber, authorProfileName, - firstMessageOfSeries, collapseMetadata, senderIsModerator, - authorColor, conversationType, direction, i18n, onShowUserDetails, } = this.props; - const shouldRenderAvatar = - (firstMessageOfSeries || - !collapseMetadata || - conversationType === 'group') && - direction === 'incoming'; + if ( + collapseMetadata || + conversationType !== 'group' || + direction === 'outgoing' + ) { + return; + } + const userName = authorName || authorProfileName || authorPhoneNumber; return (
- <> - {shouldRenderAvatar && ( - { - onShowUserDetails(authorPhoneNumber); - }} - /> - )} - + { + onShowUserDetails(authorPhoneNumber); + }} + pubkey={authorPhoneNumber} + /> {senderIsModerator && (
@@ -829,89 +800,6 @@ export class Message extends React.PureComponent { } } - public renderMenu(isCorrectSide: boolean, triggerId: string) { - const { - attachments, - direction, - disableMenu, - isKickedFromGroup, - onDownload, - onReply, - } = this.props; - - if (!isCorrectSide || disableMenu || isKickedFromGroup) { - return null; - } - - const fileName = - attachments && attachments[0] ? attachments[0].fileName : null; - const isDangerous = isFileDangerous(fileName || ''); - const multipleAttachments = attachments && attachments.length > 1; - const firstAttachment = attachments && attachments[0]; - - const downloadButton = - !multipleAttachments && firstAttachment && !firstAttachment.pending ? ( -
{ - if (onDownload) { - onDownload(isDangerous); - } - e.stopPropagation(); - }} - role="button" - className={classNames( - 'module-message__buttons__download', - `module-message__buttons__download--${direction}` - )} - /> - ) : null; - - const replyButton = ( -
{ - if (onReply) { - onReply(); - } - e.stopPropagation(); - }} - role="button" - className={classNames( - 'module-message__buttons__reply', - `module-message__buttons__download--${direction}` - )} - /> - ); - - const menuButton = ( - -
- - ); - - const first = direction === 'incoming' ? downloadButton : menuButton; - const last = direction === 'incoming' ? menuButton : downloadButton; - - return ( -
- {first} - {replyButton} - {last} -
- ); - } - public renderContextMenu(triggerId: string) { const { attachments, @@ -960,7 +848,9 @@ export class Message extends React.PureComponent { }; const isServerDeletable = !!this.props.isPublic; - const deleteMessageCtxText = i18n(isServerDeletable ? 'unsend' : 'delete'); + const deleteMessageCtxText = i18n( + isServerDeletable ? 'deleteForEveryone' : 'delete' + ); return ( { }} onClick={wrap(onShowDetail)} > - {i18n('moreInfo')} + {i18n('moreInformation')} {showRetry ? ( { }} onClick={wrap(onRetrySend)} > - {i18n('retrySend')} + {i18n('resend')} ) : null} {isDeletable ? ( @@ -1021,11 +911,6 @@ export class Message extends React.PureComponent { {deleteMessageCtxText} ) : null} - {isPublic ? ( - - {i18n('copyPublicKey')} - - ) : null} {isModerator && isPublic ? ( {i18n('banUser')} ) : null} @@ -1102,7 +987,6 @@ export class Message extends React.PureComponent { public render() { const { authorPhoneNumber, - authorColor, direction, id, isKickedFromGroup, @@ -1116,15 +1000,10 @@ export class Message extends React.PureComponent { } = this.props; const { expired, expiring } = this.state; - // This id is what connects our triple-dot click with our associated pop-up menu. - // It needs to be unique. // The Date.now() is a workaround to be sure a single triggerID with this id exists - const triggerId = id - ? String(`${id}-${Date.now()}`) - : String(`${authorPhoneNumber}-${timestamp}`); const rightClickTriggerId = id - ? String(`${id}-ctx-${Date.now()}`) - : String(`${authorPhoneNumber}-ctx-${timestamp}`); + ? String(`message-ctx-${id}-${Date.now()}`) + : String(`message-ctx-${authorPhoneNumber}-${timestamp}`); if (expired) { return null; } @@ -1187,19 +1066,33 @@ export class Message extends React.PureComponent { }} > {this.renderError(isIncoming)} - {enableContextMenu ? this.renderMenu(!isIncoming, triggerId) : null}
{ + const selection = window.getSelection(); + // Text is being selected + if (selection && selection.type === 'Range') { + return; + } + + // User clicked on message body + const target = event.target as HTMLDivElement; + if (target.className === 'text-selectable') { + return; + } + + if (id) { + this.props.onSelectMessage(id); + } + }} > {this.renderAuthor()} {this.renderQuote()} @@ -1208,13 +1101,8 @@ export class Message extends React.PureComponent { {this.renderEmbeddedContact()} {this.renderText()} {this.renderMetadata()} - {this.renderSendMessageButton()}
{this.renderError(!isIncoming)} - {isRss || multiSelectMode - ? null - : this.renderMenu(isIncoming, triggerId)} - {enableContextMenu ? this.renderContextMenu(triggerId) : null} {enableContextMenu ? this.renderContextMenu(rightClickTriggerId) : null} @@ -1232,6 +1120,7 @@ export class Message extends React.PureComponent { conversationType, direction, i18n, + isPublic, } = this.props; const title = authorName ? authorName : authorPhoneNumber; @@ -1255,6 +1144,7 @@ export class Message extends React.PureComponent { module="module-message__author" i18n={i18n} boldProfileName={true} + shouldShowPubkey={Boolean(isPublic)} />
); diff --git a/ts/components/conversation/MessageDetail.tsx b/ts/components/conversation/MessageDetail.tsx index 5fbe88419..1b432c432 100644 --- a/ts/components/conversation/MessageDetail.tsx +++ b/ts/components/conversation/MessageDetail.tsx @@ -37,18 +37,15 @@ interface Props { export class MessageDetail extends React.Component { public renderAvatar(contact: Contact) { const { i18n } = this.props; - const { avatarPath, color, phoneNumber, name, profileName } = contact; + const { avatarPath, phoneNumber, name, profileName } = contact; + const userName = name || profileName || phoneNumber; return ( ); } @@ -110,6 +107,7 @@ export class MessageDetail extends React.Component { name={contact.name} profileName={contact.profileName} i18n={i18n} + shouldShowPubkey={true} />
{errors.map((error, index) => ( diff --git a/ts/components/conversation/ModeratorsAddDialog.tsx b/ts/components/conversation/ModeratorsAddDialog.tsx index 6a9e19129..c97b6a869 100644 --- a/ts/components/conversation/ModeratorsAddDialog.tsx +++ b/ts/components/conversation/ModeratorsAddDialog.tsx @@ -51,7 +51,6 @@ export class AddModeratorsDialog extends React.Component { authorProfileName: name, selected: false, authorName: name, - authorColor: d.getColor(), checkmarked: false, existingMember, }; @@ -97,7 +96,6 @@ export class AddModeratorsDialog extends React.Component { authorAvatarPath: '', selected: true, authorName: this.state.inputBoxValue, - authorColor: '#000000', checkmarked: true, existingMember: false, }); @@ -148,7 +146,7 @@ export class AddModeratorsDialog extends React.Component {

From friends:

-
+
{ const lokiProfile = d.getLokiProfile(); name = lokiProfile ? lokiProfile.displayName : 'Anonymous'; } - const authorColor = d.getColor ? d.getColor() : '#000000'; // TODO: should take existing members into account const existingMember = false; @@ -44,7 +43,6 @@ export class RemoveModeratorsDialog extends React.Component { authorProfileName: name, selected: false, authorName: name, - authorColor, checkmarked: true, existingMember, }; @@ -67,7 +65,7 @@ export class RemoveModeratorsDialog extends React.Component {

Existing moderators:

-
+
{ i18n, isFromMe, isIncoming, + isPublic, } = this.props; return ( @@ -316,11 +316,12 @@ export class Quote extends React.Component { i18n('you') ) : ( )}
@@ -365,7 +366,6 @@ export class Quote extends React.Component { public render() { const { - authorColor, isIncoming, onClick, referencedMessageNotFound, @@ -389,9 +389,6 @@ export class Quote extends React.Component { className={classNames( 'module-quote', isIncoming ? 'module-quote--incoming' : 'module-quote--outgoing', - isIncoming - ? `module-quote--incoming-${authorColor}` - : `module-quote--outgoing-${authorColor}`, !onClick ? 'module-quote--no-click' : null, withContentAbove ? 'module-quote--with-content-above' : null, referencedMessageNotFound diff --git a/ts/components/conversation/SafetyNumberNotification.tsx b/ts/components/conversation/SafetyNumberNotification.tsx new file mode 100644 index 000000000..e31a90b09 --- /dev/null +++ b/ts/components/conversation/SafetyNumberNotification.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +// import classNames from 'classnames'; + +import { ContactName } from './ContactName'; +import { Intl } from '../Intl'; +import { LocalizerType } from '../../types/Util'; + +interface Contact { + phoneNumber: string; + profileName?: string; + name?: string; +} + +interface Props { + isGroup: boolean; + contact: Contact; + i18n: LocalizerType; + onVerify: () => void; +} + +export class SafetyNumberNotification extends React.Component { + public render() { + const { contact, isGroup, i18n, onVerify } = this.props; + const changeKey = isGroup + ? 'safetyNumberChangedGroup' + : 'safetyNumberChanged'; + + return ( +
+
+
+ + + , + ]} + i18n={i18n} + /> +
+
+ {i18n('verifyNewNumber')} +
+
+ ); + } +} diff --git a/ts/components/conversation/StagedLinkPreview.tsx b/ts/components/conversation/StagedLinkPreview.tsx index 2aa7477b1..d1bc3ae5d 100644 --- a/ts/components/conversation/StagedLinkPreview.tsx +++ b/ts/components/conversation/StagedLinkPreview.tsx @@ -31,7 +31,7 @@ export class StagedLinkPreview extends React.Component { > {!isLoaded ? (
- {i18n('loadingPreview')} + {i18n('loading')}
) : null} {isLoaded && image && isImage ? ( diff --git a/ts/components/conversation/TimerNotification.tsx b/ts/components/conversation/TimerNotification.tsx index a1b95b738..440732328 100644 --- a/ts/components/conversation/TimerNotification.tsx +++ b/ts/components/conversation/TimerNotification.tsx @@ -50,6 +50,7 @@ export class TimerNotification extends React.Component { name={name} module="module-message__author" boldProfileName={true} + shouldShowPubkey={false} />, timespan, ]} diff --git a/ts/components/conversation/TypingBubble.tsx b/ts/components/conversation/TypingBubble.tsx index 7df38332a..5f5f9efb0 100644 --- a/ts/components/conversation/TypingBubble.tsx +++ b/ts/components/conversation/TypingBubble.tsx @@ -20,29 +20,24 @@ export class TypingBubble extends React.Component { public renderAvatar() { const { avatarPath, - color, name, phoneNumber, profileName, conversationType, - i18n, } = this.props; if (conversationType !== 'group') { return; } + const userName = name || profileName || phoneNumber; return (
); @@ -59,12 +54,11 @@ export class TypingBubble extends React.Component {
- +
{this.renderAvatar()}
diff --git a/ts/components/conversation/UpdateGroupMembersDialog.tsx b/ts/components/conversation/UpdateGroupMembersDialog.tsx index 374a8564e..97ce71de7 100644 --- a/ts/components/conversation/UpdateGroupMembersDialog.tsx +++ b/ts/components/conversation/UpdateGroupMembersDialog.tsx @@ -49,9 +49,9 @@ export class UpdateGroupMembersDialog extends React.Component { id: d.id, authorPhoneNumber: d.id, authorProfileName: name, + authorAvatarPath: d?.cachedProps?.avatarPath, selected: false, authorName: name, // different from ProfileName? - authorColor: d.getColor(), checkmarked: false, existingMember, }; @@ -119,7 +119,6 @@ export class UpdateGroupMembersDialog extends React.Component { {`${checkMarkedCount} members`} -
)} @@ -216,8 +215,7 @@ export class UpdateGroupMembersDialog extends React.Component { private onMemberClicked(selected: any) { if (selected.existingMember && !this.props.isAdmin) { - this.onShowError(this.props.i18n('nonAdminDeleteMember')); - + window.console.warn('Only group admin can remove members!'); return; } diff --git a/ts/components/conversation/UpdateGroupNameDialog.tsx b/ts/components/conversation/UpdateGroupNameDialog.tsx index 4b8c8c235..7dc9e12c7 100644 --- a/ts/components/conversation/UpdateGroupNameDialog.tsx +++ b/ts/components/conversation/UpdateGroupNameDialog.tsx @@ -7,6 +7,7 @@ import { Avatar } from '../Avatar'; interface Props { titleText: string; + pubkey: string; isPublic: boolean; groupName: string; okText: string; @@ -49,21 +50,19 @@ export class UpdateGroupNameDialog extends React.Component { } public onClickOK() { + const { i18n, onSubmit } = this.props; if (!this.state.groupName.trim()) { - this.onShowError(this.props.i18n('emptyGroupNameError')); + this.onShowError(i18n('emptyGroupNameError')); return; } const avatar = - this.inputEl && - this.inputEl.current && - this.inputEl.current.files && - this.inputEl.current.files.length > 0 + this?.inputEl?.current?.files?.length > 0 ? this.inputEl.current.files[0] : null; // otherwise use the current avatar - this.props.onSubmit(this.state.groupName, avatar); + onSubmit(this.state.groupName, avatar); this.closeDialog(); } @@ -178,9 +177,8 @@ export class UpdateGroupNameDialog extends React.Component {
{ profileName={contact.profileName} phoneNumber={contact.phoneNumber} module="module-verification-notification__contact" + shouldShowPubkey={true} />, ]} i18n={i18n} diff --git a/ts/components/conversation/_contactUtil.tsx b/ts/components/conversation/_contactUtil.tsx index 496aba756..0fb6810b1 100644 --- a/ts/components/conversation/_contactUtil.tsx +++ b/ts/components/conversation/_contactUtil.tsx @@ -35,15 +35,9 @@ export function renderAvatar({ ); } + const pubkey = contact.name?.givenName || '0'; return ( - + ); } diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index 84d653bfa..a8f1ea8f7 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -2,8 +2,6 @@ import React from 'react'; import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; import { Avatar } from '../Avatar'; import { PropsData as ConversationListItemPropsType } from '../ConversationListItem'; -import { MultiDeviceProtocol } from '../../session/protocols'; -import { UserUtil } from '../../util'; import { createOrUpdateItem, getItemById } from '../../../js/modules/data'; export enum SectionType { @@ -59,10 +57,46 @@ export class ActionsPanel extends React.Component { }, 'refreshAvatarCallback' ); + + void this.showLightThemeDialogIfNeeded(); } ); } + public async showLightThemeDialogIfNeeded() { + const currentTheme = window.Events.getThemeSetting(); // defaults to light on new registration + if (currentTheme !== 'light') { + const message = 'Light Mode'; + const messageSub = + 'Whoops, who left the lights on?

\ + That’s right, Session has a spiffy new light mode! Take the fresh new color palette for a spin — it’s now the default mode.

\ + Want to go back to the dark side? Just tap the moon symbol in the lower left corner of the app to switch modes.'; + const hasSeenLightMode = await getItemById('hasSeenLightModeDialog'); + + if (hasSeenLightMode?.value === true) { + // if hasSeen is set and true, we have nothing to do + return; + } + // force light them right now, then ask for permission + await window.Events.setThemeSetting('light'); + window.confirmationDialog({ + message, + messageSub, + resolve: async () => { + const data = { + id: 'hasSeenLightModeDialog', + value: true, + }; + void createOrUpdateItem(data); + }, + okTheme: 'default primary', + hideCancel: true, + sessionIcon: SessionIconType.Sun, + iconSize: SessionIconSize.Max, + }); + } + } + public refreshAvatarCallback(conversation: any) { if (conversation.changed?.profileAvatar) { this.setState({ @@ -88,29 +122,32 @@ export class ActionsPanel extends React.Component { onSelect?: (event: SectionType) => void; type: SectionType; avatarPath?: string; - avatarColor?: string; notificationCount?: number; }) => { const handleClick = onSelect ? () => { - type === SectionType.Profile - ? /* tslint:disable-next-line:no-void-expression */ - this.editProfileHandle() - : /* tslint:disable-next-line:no-void-expression */ - onSelect(type); + /* tslint:disable:no-void-expression */ + if (type === SectionType.Profile) { + this.editProfileHandle(); + } else if (type === SectionType.Moon) { + window.toggleTheme(); + } else { + onSelect(type); + } + /* tslint:enable:no-void-expression */ } : undefined; if (type === SectionType.Profile) { + const pubkey = window.storage.get('primaryDevicePubKey'); + const userName = window.getOurDisplayName() || pubkey; return ( ); } diff --git a/ts/components/session/LeftPaneContactSection.tsx b/ts/components/session/LeftPaneContactSection.tsx index 68de97471..eec649874 100644 --- a/ts/components/session/LeftPaneContactSection.tsx +++ b/ts/components/session/LeftPaneContactSection.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { - ConversationListItem, + ConversationListItemWithDetails, PropsData as ConversationListItemPropsType, } from '../ConversationListItem'; import { PropsData as SearchResultsProps } from '../SearchResults'; @@ -22,6 +22,7 @@ import { SessionClosableOverlayType, } from './SessionClosableOverlay'; import { MainViewController } from '../MainViewController'; +import { ToastUtils } from '../../session/utils'; export interface Props { searchTerm: string; @@ -39,7 +40,6 @@ export interface Props { interface State { showAddContactView: boolean; - selectedTab: number; addContactRecipientID: string; pubKeyPasted: string; } @@ -51,27 +51,33 @@ export class LeftPaneContactSection extends React.Component { super(props); this.state = { showAddContactView: false, - selectedTab: 0, addContactRecipientID: '', pubKeyPasted: '', }; this.debouncedSearch = debounce(this.search.bind(this), 20); - this.handleTabSelected = this.handleTabSelected.bind(this); this.handleToggleOverlay = this.handleToggleOverlay.bind(this); this.handleOnAddContact = this.handleOnAddContact.bind(this); this.handleRecipientSessionIDChanged = this.handleRecipientSessionIDChanged.bind( this ); + this.closeOverlay = this.closeOverlay.bind(this); + } + + public componentDidMount() { + MainViewController.renderMessageView(); + + window.Whisper.events.on('calculatingPoW', this.closeOverlay); + } + + public componentDidUpdate() { + MainViewController.renderMessageView(); } public componentWillUnmount() { this.updateSearch(''); this.setState({ addContactRecipientID: '' }); - } - - public handleTabSelected(tabType: number) { - this.setState({ selectedTab: tabType, showAddContactView: false }); + window.Whisper.events.off('calculatingPoW', this.closeOverlay); } public renderHeader(): JSX.Element | undefined { @@ -79,7 +85,7 @@ export class LeftPaneContactSection extends React.Component { return LeftPane.RENDER_HEADER( labels, - this.handleTabSelected, + null, undefined, undefined, undefined, @@ -87,14 +93,6 @@ export class LeftPaneContactSection extends React.Component { ); } - public componentDidMount() { - MainViewController.renderMessageView(); - } - - public componentDidUpdate() { - MainViewController.renderMessageView(); - } - public render(): JSX.Element { return (
@@ -115,7 +113,7 @@ export class LeftPaneContactSection extends React.Component { const item = contacts[index]; return ( - { ); } + private closeOverlay({ pubKey }: { pubKey: string }) { + if (this.state.addContactRecipientID === pubKey) { + this.setState({ showAddContactView: false, addContactRecipientID: '' }); + } + } + private handleToggleOverlay() { this.setState((prevState: { showAddContactView: boolean }) => ({ showAddContactView: !prevState.showAddContactView, @@ -192,7 +196,7 @@ export class LeftPaneContactSection extends React.Component { const error = validateNumber(sessionID, window.i18n); if (error) { - window.pushToast({ + ToastUtils.push({ title: error, type: 'error', id: 'addContact', @@ -216,36 +220,16 @@ export class LeftPaneContactSection extends React.Component { } private renderBottomButtons(): JSX.Element { - const { selectedTab } = this.state; - const edit = window.i18n('edit'); const addContact = window.i18n('addContact'); - const createGroup = window.i18n('createGroup'); - const showEditButton = false; return (
- {showEditButton && ( - - )} - {selectedTab === 0 ? ( - - ) : ( - - )} +
); } diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 259921528..e67f1f59e 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -4,7 +4,7 @@ import { AutoSizer, List } from 'react-virtualized'; import { MainViewController } from '../MainViewController'; import { - ConversationListItem, + ConversationListItemWithDetails, PropsData as ConversationListItemPropsType, } from '../ConversationListItem'; import { ConversationType } from '../../state/ducks/conversations'; @@ -30,6 +30,7 @@ import { SessionButtonType, } from './SessionButton'; import { OpenGroup } from '../../session/types'; +import { ToastUtils } from '../../session/utils'; export interface Props { searchTerm: string; @@ -76,19 +77,6 @@ export class LeftPaneMessageSection extends React.Component { valuePasted: '', }; - const conversations = this.getCurrentConversations(); - - const realConversations: Array = []; - if (conversations) { - conversations.forEach(conversation => { - const isRSS = - conversation.id && - !!(conversation.id && conversation.id.match(/^rss:/)); - - return !isRSS && realConversations.push(conversation); - }); - } - this.updateSearchBound = this.updateSearch.bind(this); this.handleOnPaste = this.handleOnPaste.bind(this); @@ -105,25 +93,21 @@ export class LeftPaneMessageSection extends React.Component { this.renderClosableOverlay = this.renderClosableOverlay.bind(this); this.debouncedSearch = debounce(this.search.bind(this), 20); + this.closeOverlay = this.closeOverlay.bind(this); + } + + public componentDidMount() { + MainViewController.renderMessageView(); + window.Whisper.events.on('calculatingPoW', this.closeOverlay); + } + + public componentDidUpdate() { + MainViewController.renderMessageView(); } public componentWillUnmount() { this.updateSearch(''); - } - - public getCurrentConversations(): - | Array - | undefined { - const { conversations } = this.props; - - let conversationList = conversations; - if (conversationList !== undefined) { - conversationList = conversationList.filter( - conversation => !conversation.isSecondary - ); - } - - return conversationList; + window.Whisper.events.off('calculatingPoW', this.closeOverlay); } public renderRow = ({ @@ -131,9 +115,7 @@ export class LeftPaneMessageSection extends React.Component { key, style, }: RowRendererParamsType): JSX.Element => { - const { openConversationInternal } = this.props; - - const conversations = this.getCurrentConversations(); + const { conversations, openConversationInternal } = this.props; if (!conversations) { throw new Error('renderRow: Tried to render without conversations'); @@ -143,7 +125,7 @@ export class LeftPaneMessageSection extends React.Component { const conversationKey = conversation.id; return ( - { }; public renderList(): JSX.Element | Array { - const { openConversationInternal, searchResults } = this.props; + const { + conversations, + openConversationInternal, + searchResults, + } = this.props; const contacts = searchResults?.contacts || []; if (searchResults) { @@ -168,7 +154,6 @@ export class LeftPaneMessageSection extends React.Component { ); } - const conversations = this.getCurrentConversations(); if (!conversations) { throw new Error( 'render: must provided conversations if no search results are provided' @@ -177,7 +162,6 @@ export class LeftPaneMessageSection extends React.Component { const length = conversations.length; const listKey = 0; - // Note: conversations is not a known prop for List, but it is required to ensure that // it re-renders when our conversation data changes. Otherwise it would just render // on startup and scroll. @@ -203,12 +187,10 @@ export class LeftPaneMessageSection extends React.Component { return [list]; } - public componentDidMount() { - MainViewController.renderMessageView(); - } - - public componentDidUpdate() { - MainViewController.renderMessageView(); + public closeOverlay({ pubKey }: { pubKey: string }) { + if (this.state.valuePasted === pubKey) { + this.setState({ overlay: false, valuePasted: '' }); + } } public renderHeader(): JSX.Element { @@ -242,7 +224,7 @@ export class LeftPaneMessageSection extends React.Component { {this.renderList()} {this.renderBottomButtons()} @@ -324,9 +306,8 @@ export class LeftPaneMessageSection extends React.Component { }} onButtonClick={async ( groupName: string, - groupMembers: Array, - senderKeys: boolean - ) => this.onCreateClosedGroup(groupName, groupMembers, senderKeys)} + groupMembers: Array + ) => this.onCreateClosedGroup(groupName, groupMembers)} searchTerm={searchTerm} updateSearch={this.updateSearchBound} showSpinner={loading} @@ -363,21 +344,11 @@ export class LeftPaneMessageSection extends React.Component { } private renderBottomButtons(): JSX.Element { - const edit = window.i18n('edit'); const joinOpenGroup = window.i18n('joinOpenGroup'); - const createClosedGroup = window.i18n('createClosedGroup'); - const showEditButton = false; + const newClosedGroup = window.i18n('newClosedGroup'); return (
- {showEditButton && ( - - )} - { }} /> { @@ -417,7 +388,7 @@ export class LeftPaneMessageSection extends React.Component { const { openConversationInternal } = this.props; if (!this.state.valuePasted && !this.props.searchTerm) { - window.pushToast({ + ToastUtils.push({ title: window.i18n('invalidNumberError'), type: 'error', id: 'invalidPubKey', @@ -433,7 +404,7 @@ export class LeftPaneMessageSection extends React.Component { if (!error) { openConversationInternal(pubkey); } else { - window.pushToast({ + ToastUtils.push({ title: error, type: 'error', id: 'invalidPubKey', @@ -448,15 +419,10 @@ export class LeftPaneMessageSection extends React.Component { return; } - // Server URL entered? - if (serverUrl.length === 0) { - return; - } - // Server URL valid? - if (!OpenGroup.validate(serverUrl)) { - window.pushToast({ - title: window.i18n('noServerURL'), + if (serverUrl.length === 0 || !OpenGroup.validate(serverUrl)) { + ToastUtils.push({ + title: window.i18n('invalidOpenGroupUrl'), id: 'connectToServer', type: 'error', }); @@ -466,7 +432,7 @@ export class LeftPaneMessageSection extends React.Component { // Already connected? if (Boolean(await OpenGroup.getConversation(serverUrl))) { - window.pushToast({ + ToastUtils.push({ title: window.i18n('publicChatExists'), id: 'publicChatExists', type: 'error', @@ -477,16 +443,21 @@ export class LeftPaneMessageSection extends React.Component { // Connect to server try { + ToastUtils.push({ + title: window.i18n('connectingToServer'), + id: 'connectToServer', + type: 'success', + }); + this.setState({ loading: true }); await OpenGroup.join(serverUrl, async () => { if (await OpenGroup.serverExists(serverUrl)) { - window.pushToast({ - title: window.i18n('connectingToServer'), + ToastUtils.push({ + title: window.i18n('connectToServerSuccess'), id: 'connectToServer', type: 'success', }); - - this.setState({ loading: true }); } + this.setState({ loading: false }); }); const openGroupConversation = await OpenGroup.getConversation(serverUrl); @@ -503,11 +474,12 @@ export class LeftPaneMessageSection extends React.Component { } } catch (e) { window.console.error('Failed to connect to server:', e); - window.pushToast({ + ToastUtils.push({ title: window.i18n('connectToServerFail'), id: 'connectToServer', type: 'error', }); + this.setState({ loading: false }); } finally { this.setState({ loading: false, @@ -518,22 +490,11 @@ export class LeftPaneMessageSection extends React.Component { private async onCreateClosedGroup( groupName: string, - groupMembers: Array, - senderKeys: boolean + groupMembers: Array ) { - await MainViewController.createClosedGroup( - groupName, - groupMembers, - senderKeys, - () => { - this.handleToggleOverlay(undefined); - - window.pushToast({ - title: window.i18n('closedGroupCreatedToastTitle'), - type: 'success', - }); - } - ); + await MainViewController.createClosedGroup(groupName, groupMembers, () => { + this.handleToggleOverlay(undefined); + }); } private handleNewSessionButtonClick() { diff --git a/ts/components/session/LeftPaneSettingSection.tsx b/ts/components/session/LeftPaneSettingSection.tsx index 77ec15498..f0a93c794 100644 --- a/ts/components/session/LeftPaneSettingSection.tsx +++ b/ts/components/session/LeftPaneSettingSection.tsx @@ -151,8 +151,8 @@ export class LeftPaneSettingSection extends React.Component { const dangerButtonText = isSecondaryDevice ? window.i18n('unpairDevice') - : window.i18n('deleteAccount'); - const showSeed = window.i18n('showSeed'); + : window.i18n('clearAllData'); + const showRecoveryPhrase = window.i18n('showRecoveryPhrase'); return (
@@ -164,7 +164,7 @@ export class LeftPaneSettingSection extends React.Component { /> {!isSecondaryDevice && ( { const { isSecondaryDevice } = this.props; const title = window.i18n( - isSecondaryDevice ? 'unpairDevice' : 'deleteAccount' + isSecondaryDevice ? 'unpairDevice' : 'clearAllData' ); const message = window.i18n( isSecondaryDevice ? 'unpairDeviceWarning' : 'deleteAccountWarning' ); - const messageSub = window.i18n( - isSecondaryDevice ? 'unpairDeviceWarningSub' : 'deleteAccountWarningSub' - ); + const messageSub = isSecondaryDevice + ? window.i18n('unpairDeviceWarningSub') + : ''; window.confirmationDialog({ title, @@ -212,6 +212,11 @@ export class LeftPaneSettingSection extends React.Component { title: window.i18n('privacySettingsTitle'), hidden: false, }, + { + id: SessionSettingCategory.Blocked, + title: window.i18n('blockedSettingsTitle'), + hidden: false, + }, { id: SessionSettingCategory.Permissions, title: window.i18n('permissionSettingsTitle'), diff --git a/ts/components/session/RegistrationTabs.tsx b/ts/components/session/RegistrationTabs.tsx index 20a6a2231..27f8abbd6 100644 --- a/ts/components/session/RegistrationTabs.tsx +++ b/ts/components/session/RegistrationTabs.tsx @@ -11,11 +11,12 @@ import { trigger } from '../../shims/events'; import { SessionHtmlRenderer } from './SessionHTMLRenderer'; import { SessionIdEditable } from './SessionIdEditable'; import { SessionSpinner } from './SessionSpinner'; -import { StringUtils } from '../../session/utils'; +import { StringUtils, ToastUtils } from '../../session/utils'; +import { createOrUpdateItem } from '../../../js/modules/data'; enum SignInMode { Default, - UsingSeed, + UsingRecoveryPhrase, LinkingDevice, } @@ -40,8 +41,8 @@ interface State { validatePassword: string; passwordErrorString: string; passwordFieldsMatch: boolean; - mnemonicSeed: string; - generatedMnemonicSeed: string; + recoveryPhrase: string; + generatedRecoveryPhrase: string; hexGeneratedPubKey: string; primaryDevicePubKey: string; mnemonicError: string | undefined; @@ -116,8 +117,8 @@ export class RegistrationTabs extends React.Component<{}, State> { validatePassword: '', passwordErrorString: '', passwordFieldsMatch: false, - mnemonicSeed: '', - generatedMnemonicSeed: '', + recoveryPhrase: '', + generatedRecoveryPhrase: '', hexGeneratedPubKey: '', primaryDevicePubKey: '', mnemonicError: undefined, @@ -165,7 +166,7 @@ export class RegistrationTabs extends React.Component<{}, State> { } private async generateMnemonicAndKeyPair() { - if (this.state.generatedMnemonicSeed === '') { + if (this.state.generatedRecoveryPhrase === '') { const language = 'english'; const mnemonic = await this.accountManager.generateMnemonic(language); @@ -184,7 +185,7 @@ export class RegistrationTabs extends React.Component<{}, State> { const hexGeneratedPubKey = StringUtils.decode(keyPair.pubKey, 'hex'); this.setState({ - generatedMnemonicSeed: mnemonic, + generatedRecoveryPhrase: mnemonic, hexGeneratedPubKey, // our 'frontend' sessionID }); } @@ -203,7 +204,7 @@ export class RegistrationTabs extends React.Component<{}, State> { validatePassword: '', passwordErrorString: '', passwordFieldsMatch: false, - mnemonicSeed: '', + recoveryPhrase: '', primaryDevicePubKey: '', mnemonicError: undefined, displayNameError: undefined, @@ -212,8 +213,8 @@ export class RegistrationTabs extends React.Component<{}, State> { private onSeedChanged(val: string) { this.setState({ - mnemonicSeed: val, - mnemonicError: !val ? window.i18n('mnemonicEmpty') : undefined, + recoveryPhrase: val, + mnemonicError: !val ? window.i18n('recoveryPhraseEmpty') : undefined, }); } @@ -397,13 +398,13 @@ export class RegistrationTabs extends React.Component<{}, State> { private renderRegistrationContent() { const { signInMode, signUpMode } = this.state; - if (signInMode === SignInMode.UsingSeed) { + if (signInMode === SignInMode.UsingRecoveryPhrase) { return (
{ this.onSeedChanged(val); @@ -498,7 +499,7 @@ export class RegistrationTabs extends React.Component<{}, State> { /> { {!!password && ( { this.onPasswordVerifyChanged(val); @@ -558,7 +559,7 @@ export class RegistrationTabs extends React.Component<{}, State> { if (signInMode === SignInMode.Default) { return (
- {this.renderRestoreUsingSeedButton( + {this.renderRestoreUsingRecoveryPhraseButton( SessionButtonType.BrandOutline, SessionButtonColor.Green )} @@ -579,7 +580,7 @@ export class RegistrationTabs extends React.Component<{}, State> { {!this.state.secretWords && ( <>

{or}

- {this.renderRestoreUsingSeedButton( + {this.renderRestoreUsingRecoveryPhraseButton( SessionButtonType.BrandOutline, SessionButtonColor.White )} @@ -611,7 +612,7 @@ export class RegistrationTabs extends React.Component<{}, State> { } private handleContinueYourSessionClick() { - if (this.state.signInMode === SignInMode.UsingSeed) { + if (this.state.signInMode === SignInMode.UsingRecoveryPhrase) { this.register('english').ignore(); } else { this.registerSecondaryDevice().ignore(); @@ -628,17 +629,17 @@ export class RegistrationTabs extends React.Component<{}, State> { mnemonicError, primaryDevicePubKey, displayName, - mnemonicSeed, + recoveryPhrase, password, } = this.state; let enableContinue = true; let text = window.i18n('continueYourSession'); const displayNameOK = !displayNameError && !!displayName; // Display name required - const mnemonicOK = !mnemonicError && !!mnemonicSeed; // Mnemonic required + const mnemonicOK = !mnemonicError && !!recoveryPhrase; // Mnemonic required const passwordsOK = !password || (!passwordErrorString && passwordFieldsMatch); // password is valid if empty, or if no error and fields are matching - if (signInMode === SignInMode.UsingSeed) { + if (signInMode === SignInMode.UsingRecoveryPhrase) { enableContinue = displayNameOK && mnemonicOK && passwordsOK; } else if (signInMode === SignInMode.LinkingDevice) { enableContinue = !!primaryDevicePubKey; @@ -675,7 +676,7 @@ export class RegistrationTabs extends React.Component<{}, State> { ); } - private renderRestoreUsingSeedButton( + private renderRestoreUsingRecoveryPhraseButton( buttonType: SessionButtonType, buttonColor: SessionButtonColor ) { @@ -684,16 +685,16 @@ export class RegistrationTabs extends React.Component<{}, State> { onClick={() => { this.cancelSecondaryDevice().ignore(); this.setState({ - signInMode: SignInMode.UsingSeed, + signInMode: SignInMode.UsingRecoveryPhrase, primaryDevicePubKey: '', - mnemonicSeed: '', + recoveryPhrase: '', displayName: '', signUpMode: SignUpMode.Default, }); }} buttonType={buttonType} buttonColor={buttonColor} - text={window.i18n('restoreUsingSeed')} + text={window.i18n('restoreUsingRecoveryPhrase')} /> ); } @@ -704,7 +705,7 @@ export class RegistrationTabs extends React.Component<{}, State> { onClick={() => { this.setState({ signInMode: SignInMode.LinkingDevice, - mnemonicSeed: '', + recoveryPhrase: '', displayName: '', signUpMode: SignUpMode.Default, }); @@ -724,7 +725,7 @@ export class RegistrationTabs extends React.Component<{}, State> { return; } - if (signInMode === SignInMode.UsingSeed) { + if (signInMode === SignInMode.UsingRecoveryPhrase) { this.handleContinueYourSessionClick(); return; @@ -794,8 +795,8 @@ export class RegistrationTabs extends React.Component<{}, State> { private async register(language: string) { const { password, - mnemonicSeed, - generatedMnemonicSeed, + recoveryPhrase, + generatedRecoveryPhrase, signInMode, displayName, passwordErrorString, @@ -808,7 +809,7 @@ export class RegistrationTabs extends React.Component<{}, State> { if (!trimName) { window.log.warn('invalid trimmed name for registration'); - window.pushToast({ + ToastUtils.push({ title: window.i18n('displayNameEmpty'), type: 'error', id: 'invalidDisplayName', @@ -819,7 +820,7 @@ export class RegistrationTabs extends React.Component<{}, State> { if (passwordErrorString) { window.log.warn('invalid password for registration'); - window.pushToast({ + ToastUtils.push({ title: window.i18n('invalidPassword'), type: 'error', id: 'invalidPassword', @@ -831,7 +832,7 @@ export class RegistrationTabs extends React.Component<{}, State> { if (!!password && !passwordFieldsMatch) { window.log.warn('passwords does not match for registration'); - window.pushToast({ + ToastUtils.push({ title: window.i18n('passwordsDoNotMatch'), type: 'error', id: 'invalidPassword', @@ -840,11 +841,11 @@ export class RegistrationTabs extends React.Component<{}, State> { return; } - if (signInMode === SignInMode.UsingSeed && !mnemonicSeed) { + if (signInMode === SignInMode.UsingRecoveryPhrase && !recoveryPhrase) { window.log.warn('empty mnemonic seed passed in seed restoration mode'); return; - } else if (!generatedMnemonicSeed) { + } else if (!generatedRecoveryPhrase) { window.log.warn('empty generated seed'); return; @@ -854,9 +855,9 @@ export class RegistrationTabs extends React.Component<{}, State> { window.textsecure.storage.remove('secondaryDeviceStatus'); const seedToUse = - signInMode === SignInMode.UsingSeed - ? mnemonicSeed - : generatedMnemonicSeed; + signInMode === SignInMode.UsingRecoveryPhrase + ? recoveryPhrase + : generatedRecoveryPhrase; try { await this.resetRegistration(); @@ -867,9 +868,15 @@ export class RegistrationTabs extends React.Component<{}, State> { language, trimName ); + // FIXME remove everything related to hasSeenLightModeDialog at some point in the future (27/08/2020) + const data = { + id: 'hasSeenLightModeDialog', + value: true, + }; + await createOrUpdateItem(data); trigger('openInbox'); } catch (e) { - window.pushToast({ + ToastUtils.push({ title: `Error: ${e.message || 'Something went wrong'}`, type: 'error', id: 'registrationError', @@ -900,7 +907,7 @@ export class RegistrationTabs extends React.Component<{}, State> { // tslint:disable-next-line: no-backbone-get-set-outside-model if (window.textsecure.storage.get('secondaryDeviceStatus') === 'ongoing') { window.log.warn('registering secondary device already ongoing'); - window.pushToast({ + ToastUtils.push({ title: window.i18n('pairingOngoing'), type: 'error', id: 'pairingOngoing', @@ -943,7 +950,7 @@ export class RegistrationTabs extends React.Component<{}, State> { const validationError = c.validateNumber(); if (validationError) { onError('Invalid public key').ignore(); - window.pushToast({ + ToastUtils.push({ title: window.i18n('invalidNumberError'), type: 'error', id: 'invalidNumberError', @@ -952,7 +959,7 @@ export class RegistrationTabs extends React.Component<{}, State> { return; } try { - const fakeMnemonic = this.state.mnemonicSeed; + const fakeMnemonic = this.state.recoveryPhrase; await this.accountManager.registerSingleDevice( fakeMnemonic, diff --git a/ts/components/session/SessionChannelSettings.tsx b/ts/components/session/SessionChannelSettings.tsx deleted file mode 100644 index adfc331d6..000000000 --- a/ts/components/session/SessionChannelSettings.tsx +++ /dev/null @@ -1,301 +0,0 @@ -import React from 'react'; -import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; -import { Avatar } from '../Avatar'; -import { - SessionButton, - SessionButtonColor, - SessionButtonType, -} from './SessionButton'; -import { SessionDropdown } from './SessionDropdown'; -import { MediaGallery } from '../conversation/media-gallery/MediaGallery'; -import _ from 'lodash'; -import { TimerOption } from '../conversation/ConversationHeader'; -import { Constants } from '../../session'; - -interface Props { - id: string; - name: string; - memberCount: number; - description: string; - avatarPath: string; - timerOptions: Array; - isPublic: boolean; - - onGoBack: () => void; - onInviteContacts: () => void; - onLeaveGroup: () => void; - onShowLightBox: (options: any) => void; - onSetDisappearingMessages: (seconds: number) => void; -} - -export class SessionChannelSettings extends React.Component { - public constructor(props: Props) { - super(props); - - this.state = { - documents: Array(), - media: Array(), - onItemClick: undefined, - }; - } - - public componentWillMount() { - this.getMediaGalleryProps() - .then(({ documents, media, onItemClick }) => { - this.setState({ - documents, - media, - onItemClick, - }); - }) - .ignore(); - } - - public componentDidUpdate() { - const mediaScanInterval = 1000; - - setTimeout(() => { - this.getMediaGalleryProps() - .then(({ documents, media, onItemClick }) => { - this.setState({ - documents, - media, - onItemClick, - }); - }) - .ignore(); - }, mediaScanInterval); - } - - public async getMediaGalleryProps() { - // We fetch more documents than media as they don’t require to be loaded - // into memory right away. Revisit this once we have infinite scrolling: - const conversationId = this.props.id; - const rawMedia = await window.Signal.Data.getMessagesWithVisualMediaAttachments( - conversationId, - { - limit: Constants.CONVERSATION.DEFAULT_MEDIA_FETCH_COUNT, - MessageCollection: window.Whisper.MessageCollection, - } - ); - const rawDocuments = await window.Signal.Data.getMessagesWithFileAttachments( - conversationId, - { - limit: Constants.CONVERSATION.DEFAULT_DOCUMENTS_FETCH_COUNT, - MessageCollection: window.Whisper.MessageCollection, - } - ); - - // First we upgrade these messages to ensure that they have thumbnails - const max = rawMedia.length; - for (let i = 0; i < max; i += 1) { - const message = rawMedia[i]; - const { schemaVersion } = message; - - if (schemaVersion < message.VERSION_NEEDED_FOR_DISPLAY) { - // Yep, we really do want to wait for each of these - // eslint-disable-next-line no-await-in-loop - rawMedia[i] = await window.Signal.Migrations.upgradeMessageSchema( - message - ); - // eslint-disable-next-line no-await-in-loop - await window.Signal.Data.saveMessage(rawMedia[i], { - Message: window.Whisper.Message, - }); - } - } - - // tslint:disable-next-line: underscore-consistent-invocation - const media = _.flatten( - rawMedia.map((message: { attachments: any }) => { - const { attachments } = message; - - return (attachments || []) - .filter( - (attachment: { thumbnail: any; pending: any; error: any }) => - attachment.thumbnail && !attachment.pending && !attachment.error - ) - .map( - ( - attachment: { path?: any; contentType?: any; thumbnail?: any }, - index: any - ) => { - const { thumbnail } = attachment; - - return { - objectURL: window.Signal.Migrations.getAbsoluteAttachmentPath( - attachment.path - ), - thumbnailObjectUrl: thumbnail - ? window.Signal.Migrations.getAbsoluteAttachmentPath( - thumbnail.path - ) - : null, - contentType: attachment.contentType, - index, - attachment, - message, - }; - } - ); - }) - ); - - // Unlike visual media, only one non-image attachment is supported - const documents = rawDocuments.map( - (message: { attachments: Array }) => { - const attachments = message.attachments || []; - const attachment = attachments[0]; - - return { - contentType: attachment.contentType, - index: 0, - attachment, - message, - }; - } - ); - - const saveAttachment = async ({ attachment, message }: any = {}) => { - const timestamp = message.received_at; - window.Signal.Types.Attachment.save({ - attachment, - document, - getAbsolutePath: window.Signal.Migrations.getAbsoluteAttachmentPath, - timestamp, - }); - }; - - const onItemClick = async ({ message, attachment, type }: any) => { - switch (type) { - case 'documents': { - saveAttachment({ message, attachment }).ignore(); - break; - } - - case 'media': { - const lightBoxOptions = { - media, - attachment, - message, - }; - this.onShowLightBox(lightBoxOptions); - break; - } - - default: - throw new TypeError(`Unknown attachment type: '${type}'`); - } - }; - - return { - media, - documents, - onItemClick, - }; - } - - public onShowLightBox(options: any) { - this.props.onShowLightBox(options); - } - - public render() { - const { - memberCount, - name, - timerOptions, - onLeaveGroup, - isPublic, - } = this.props; - const { documents, media, onItemClick } = this.state; - const showMemberCount = !!(memberCount && memberCount > 0); - const hasDisappearingMessages = !isPublic; - const leaveGroupString = isPublic - ? window.i18n('leaveOpenGroup') - : window.i18n('leaveClosedGroup'); - - const disappearingMessagesOptions = timerOptions.map(option => { - return { - content: option.name, - onClick: () => { - this.props.onSetDisappearingMessages(option.value); - }, - }; - }); - - return ( -
- {this.renderHeader()} -

{name}

- {showMemberCount && ( - <> -
-
- {window.i18n('members', memberCount)} -
-
- - )} - - -
- {window.i18n('notifications')} -
- - {hasDisappearingMessages && ( - - )} - - - -
- ); - } - - private renderHeader() { - const { id, onGoBack, onInviteContacts, avatarPath } = this.props; - const shouldShowInviteFriends = !this.props.isPublic; - - return ( -
- - - -
- {shouldShowInviteFriends && ( - - )} -
-
- ); - } -} diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 28aafe99c..3c1008f81 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -37,7 +37,6 @@ interface Props { interface State { groupName: string; selectedMembers: Array; - senderKeys: boolean; } export class SessionClosableOverlay extends React.Component { @@ -49,7 +48,6 @@ export class SessionClosableOverlay extends React.Component { this.state = { groupName: '', selectedMembers: [], - senderKeys: false, }; this.inputRef = React.createRef(); @@ -94,16 +92,16 @@ export class SessionClosableOverlay extends React.Component { id: d.id, authorPhoneNumber: d.id, authorProfileName: title, + authorAvatarPath: d.avatarPath, selected: false, authorName: name, - authorColor: d.color, checkmarked: false, existingMember, }; }); } - // tslint:disable-next-line max-func-body-length */ + // tslint:disable-next-line max-func-body-length cyclomatic-complexity */ public render(): JSX.Element { const { overlayMode, @@ -134,33 +132,32 @@ export class SessionClosableOverlay extends React.Component { buttonText = window.i18n('next'); descriptionLong = window.i18n('usersCanShareTheir...'); subtitle = window.i18n('enterSessionID'); - placeholder = window.i18n('enterSessionID'); + placeholder = window.i18n('enterSessionIDOfRecipient'); break; case 'contact': title = window.i18n('addContact'); buttonText = window.i18n('next'); descriptionLong = window.i18n('usersCanShareTheir...'); subtitle = window.i18n('enterSessionID'); - placeholder = window.i18n('enterSessionID'); + placeholder = window.i18n('enterSessionIDOfRecipient'); break; case 'open-group': title = window.i18n('joinOpenGroup'); - buttonText = window.i18n('joinOpenGroup'); - descriptionLong = window.i18n('addChannelDescription'); - subtitle = window.i18n('enterOpenGroupURL'); - placeholder = window.i18n('channelUrlPlaceholder'); + buttonText = window.i18n('next'); + // descriptionLong = ''; + subtitle = window.i18n('openGroupURL'); + placeholder = window.i18n('enterAnOpenGroupURL'); break; case 'closed-group': title = window.i18n('newClosedGroup'); - buttonText = window.i18n('createClosedGroup'); - descriptionLong = window.i18n('createClosedGroupDescription'); + buttonText = window.i18n('done'); subtitle = window.i18n('createClosedGroupNamePrompt'); placeholder = window.i18n('createClosedGroupPlaceholder'); break; default: } - const { groupName, selectedMembers, senderKeys } = this.state; + const { groupName, selectedMembers } = this.state; const ourSessionID = window.textsecure.storage.user.getNumber(); const contacts = this.getContacts(); @@ -232,14 +229,16 @@ export class SessionClosableOverlay extends React.Component { )} -
{descriptionLong}
- {isMessageView &&

{window.i18n('or')}

} - - {isMessageView && ( + {descriptionLong && ( +
{descriptionLong}
+ )} + {isMessageView && false &&

{window.i18n('or')}

} + {/* FIXME enable back those two items when they are working */} + {isMessageView && false && ( )} @@ -256,33 +255,18 @@ export class SessionClosableOverlay extends React.Component { /> )} - {isClosedGroupView && window.lokiFeatureFlags.enableSenderKeys && ( -
- { - const value = this.state.senderKeys; - this.setState({ senderKeys: !value }); - }} - /> - - - {window.i18n('useSenderKeys')} - -
- )} - onButtonClick(groupName, selectedMembers, senderKeys)} + onClick={() => + onButtonClick( + groupName, + selectedMembers, + window.lokiFeatureFlags.enableSenderKeys + ) + } />
); diff --git a/ts/components/session/SessionConfirm.tsx b/ts/components/session/SessionConfirm.tsx index d66742094..f0b611834 100644 --- a/ts/components/session/SessionConfirm.tsx +++ b/ts/components/session/SessionConfirm.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { SessionModal } from './SessionModal'; import { SessionButton, SessionButtonColor } from './SessionButton'; -import classNames from 'classnames'; import { SessionHtmlRenderer } from './SessionHTMLRenderer'; +import { SessionIcon, SessionIconSize, SessionIconType } from './icon'; interface Props { message: string; @@ -17,7 +17,8 @@ interface Props { hideCancel: boolean; okTheme: SessionButtonColor; closeTheme: SessionButtonColor; - centeredText?: boolean; + sessionIcon?: SessionIconType; + iconSize?: SessionIconSize; } export class SessionConfirm extends React.Component { @@ -43,7 +44,8 @@ export class SessionConfirm extends React.Component { onClickOk, onClickClose, hideCancel, - centeredText, + sessionIcon, + iconSize, } = this.props; const okText = this.props.okText || window.i18n('ok'); @@ -65,21 +67,23 @@ export class SessionConfirm extends React.Component { {!showHeader &&
}
+ {sessionIcon && ( +
+ +
+
+ )} + - {messageSub && ( - - {messageSub} - - )} +
diff --git a/ts/components/session/SessionKeyVerification.tsx b/ts/components/session/SessionKeyVerification.tsx index bced9b117..4559bc751 100644 --- a/ts/components/session/SessionKeyVerification.tsx +++ b/ts/components/session/SessionKeyVerification.tsx @@ -14,7 +14,6 @@ import { SessionSpinner } from './SessionSpinner'; import classNames from 'classnames'; import { SessionIcon, SessionIconSize, SessionIconType } from './icon'; import { Constants } from '../../session'; -import { Emojify } from '../conversation/Emojify'; interface Props { conversation: ConversationModel; @@ -147,7 +146,6 @@ export class SessionKeyVerification extends React.Component { conversationModel.attributes.profileName, ]), hideCancel: true, - centeredText: true, }); } diff --git a/ts/components/session/SessionMemberListItem.tsx b/ts/components/session/SessionMemberListItem.tsx index ff9f930be..540fe122f 100644 --- a/ts/components/session/SessionMemberListItem.tsx +++ b/ts/components/session/SessionMemberListItem.tsx @@ -11,7 +11,6 @@ export interface ContactType { authorProfileName: string; authorPhoneNumber: string; authorName: string; - authorColor: any; authorAvatarPath: string; checkmarked: boolean; existingMember: boolean; @@ -51,8 +50,6 @@ export class SessionMemberListItem extends React.Component { const { isSelected } = this.state; const name = this.props.member.authorProfileName; - const pubkey = this.props.member.authorPhoneNumber; - const shortPubkey = window.shortenPubkey(pubkey); return (
{ {this.renderAvatar()} {name} - {shortPubkey}
{ } private renderAvatar() { + const { + authorAvatarPath, + authorName, + authorPhoneNumber, + authorProfileName, + } = this.props.member; + const userName = authorName || authorProfileName || authorPhoneNumber; return ( ); } diff --git a/ts/components/session/SessionPasswordModal.tsx b/ts/components/session/SessionPasswordModal.tsx index 9e9d4b19f..99a5b485f 100644 --- a/ts/components/session/SessionPasswordModal.tsx +++ b/ts/components/session/SessionPasswordModal.tsx @@ -3,6 +3,7 @@ import React from 'react'; import { SessionModal } from './SessionModal'; import { SessionButton, SessionButtonColor } from './SessionButton'; import { PasswordUtil } from '../../util/'; +import { ToastUtils } from '../../session/utils'; export enum PasswordAction { Set = 'set', Change = 'change', @@ -232,16 +233,12 @@ export class SessionPasswordModal extends React.Component { throw new Error(`Invalid action ${action}`); } - const toastParams = { + ToastUtils.push({ + id: 'set-password-success-toast', + type: action !== Remove ? 'success' : 'warning', title: title, description: description, - type: action !== Remove ? 'success' : 'warning', icon: action !== Remove ? 'lock' : undefined, - }; - - window.pushToast({ - id: 'set-password-success-toast', - ...toastParams, }); onSuccess(this.props.action); @@ -265,7 +262,7 @@ export class SessionPasswordModal extends React.Component { ) ); - window.pushToast({ + ToastUtils.push({ title, type: 'warning', }); diff --git a/ts/components/session/SessionPasswordPrompt.tsx b/ts/components/session/SessionPasswordPrompt.tsx index 6485e2ccb..b68befaa2 100644 --- a/ts/components/session/SessionPasswordPrompt.tsx +++ b/ts/components/session/SessionPasswordPrompt.tsx @@ -54,13 +54,13 @@ export class SessionPasswordPrompt extends React.PureComponent<{}, State> { ? 'warning-info-area' : 'password-info-area'; const infoTitle = this.state.clearDataView - ? window.i18n('clearDataHeader') + ? window.i18n('clearAllData') : window.i18n('passwordViewTitle'); const buttonGroup = this.state.clearDataView ? this.renderClearDataViewButtons() : this.renderPasswordViewButtons(); const featureElement = this.state.clearDataView ? ( -

{window.i18n('clearDataExplanation')}

+

{window.i18n('deleteAccountWarning')}

) : ( { /> { - constructor(props: any) { - super(props); - } - public render() { - const { value, onClose } = this.props; - - // Foreground equivalent to .session-modal background color - const bgColor = '#FFFFFF'; - const fgColor = '#1B1B1B'; - - return ( - null} - onClose={onClose} - > -
- -
- -
-
- -
- -
- -
-
- -
- - ); - } -} diff --git a/ts/components/session/SessionScrollButton.tsx b/ts/components/session/SessionScrollButton.tsx index f563f025b..16054514a 100644 --- a/ts/components/session/SessionScrollButton.tsx +++ b/ts/components/session/SessionScrollButton.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; interface Props { - onClick?: any; + onClick?: () => any; show?: boolean; } diff --git a/ts/components/session/SessionSeedModal.tsx b/ts/components/session/SessionSeedModal.tsx index ed5fdb242..094a32258 100644 --- a/ts/components/session/SessionSeedModal.tsx +++ b/ts/components/session/SessionSeedModal.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { SessionModal } from './SessionModal'; import { SessionButton } from './SessionButton'; +import { ToastUtils } from '../../session/utils'; interface Props { onClose: any; @@ -11,7 +12,7 @@ interface State { error: string; loadingPassword: boolean; loadingSeed: boolean; - seed: string; + recoveryPhrase: string; hasPassword: boolean | null; passwordHash: string; passwordValid: boolean; @@ -25,28 +26,28 @@ export class SessionSeedModal extends React.Component { error: '', loadingPassword: true, loadingSeed: true, - seed: '', + recoveryPhrase: '', hasPassword: null, passwordHash: '', passwordValid: false, }; - this.copySeed = this.copySeed.bind(this); - this.getSeed = this.getSeed.bind(this); + this.copyRecoveryPhrase = this.copyRecoveryPhrase.bind(this); + this.getRecoveryPhrase = this.getRecoveryPhrase.bind(this); this.confirmPassword = this.confirmPassword.bind(this); this.checkHasPassword = this.checkHasPassword.bind(this); this.onEnter = this.onEnter.bind(this); } public componentDidMount() { - setTimeout(() => $('#seed-input-password').focus(), 100); + setTimeout(() => ($('#seed-input-password') as any).focus(), 100); } public render() { const i18n = window.i18n; this.checkHasPassword(); - this.getSeed().ignore(); + this.getRecoveryPhrase().ignore(); const { onClose } = this.props; const { hasPassword, passwordValid } = this.state; @@ -56,7 +57,7 @@ export class SessionSeedModal extends React.Component { <> {!loading && ( null} onClose={onClose} > @@ -81,7 +82,7 @@ export class SessionSeedModal extends React.Component { return ( <> -

{i18n('showSeedPasswordRequest')}

+

{i18n('showRecoveryPhrasePasswordRequest')}

{
- +
@@ -119,13 +117,13 @@ export class SessionSeedModal extends React.Component { <>

- {i18n('seedSavePromptMain')} -
- {i18n('seedSavePromptAlt')} + {i18n('recoveryPhraseSavePromptMain')}

- {this.state.seed} + + {this.state.recoveryPhrase} +
@@ -133,9 +131,9 @@ export class SessionSeedModal extends React.Component { { - this.copySeed(this.state.seed); + this.copyRecoveryPhrase(this.state.recoveryPhrase); }} />
@@ -145,7 +143,7 @@ export class SessionSeedModal extends React.Component { private confirmPassword() { const passwordHash = this.state.passwordHash; - const passwordValue = $('#seed-input-password').val(); + const passwordValue = jQuery('#seed-input-password').val(); const isPasswordValid = window.passwordUtil.matchesHash( passwordValue, passwordHash @@ -193,29 +191,29 @@ export class SessionSeedModal extends React.Component { }); } - private async getSeed() { - if (this.state.seed) { + private async getRecoveryPhrase() { + if (this.state.recoveryPhrase) { return false; } const manager = await window.getAccountManager(); - const seed = manager.getCurrentMnemonic(); + const recoveryPhrase = manager.getCurrentRecoveryPhrase(); this.setState({ - seed, + recoveryPhrase, loadingSeed: false, }); return true; } - private copySeed(seed: string) { - window.clipboard.writeText(seed); + private copyRecoveryPhrase(recoveryPhrase: string) { + window.clipboard.writeText(recoveryPhrase); - window.pushToast({ - title: window.i18n('copiedMnemonic'), + ToastUtils.push({ + title: window.i18n('copiedToClipboard'), type: 'success', - id: 'copySeedToast', + id: 'copyRecoveryPhraseToast', }); } diff --git a/ts/components/session/SessionToggle.tsx b/ts/components/session/SessionToggle.tsx index b9df7c319..e56978973 100644 --- a/ts/components/session/SessionToggle.tsx +++ b/ts/components/session/SessionToggle.tsx @@ -9,7 +9,7 @@ interface Props { // setting item in SessionSettings.tsx are like such: // confirmationDialogParams: { // shouldShowConfirm: false, - // title: window.i18n('linkPreviewsConfirmTitle'), + // title: window.i18n('linkPreviewsTitle'), // message: window.i18n('linkPreviewsConfirmMessage'), // okTheme: 'danger', // } diff --git a/ts/components/session/conversation/SessionConversation.tsx b/ts/components/session/conversation/SessionConversation.tsx index d5783014b..c926267a6 100644 --- a/ts/components/session/conversation/SessionConversation.tsx +++ b/ts/components/session/conversation/SessionConversation.tsx @@ -4,7 +4,6 @@ import React from 'react'; import classNames from 'classnames'; -import { ConversationHeader } from '../../conversation/ConversationHeader'; import { SessionCompositionBox } from './SessionCompositionBox'; import { SessionProgress } from '../SessionProgress'; @@ -14,14 +13,14 @@ import { TimerNotification } from '../../conversation/TimerNotification'; import { getTimestamp } from './SessionConversationManager'; import { SessionScrollButton } from '../SessionScrollButton'; -import { SessionGroupSettings } from './SessionGroupSettings'; import { ResetSessionNotification } from '../../conversation/ResetSessionNotification'; -import { Constants, getMessageQueue } from '../../../session'; -import { MessageQueue } from '../../../session/sending'; +import { Constants } from '../../../session'; import { SessionKeyVerification } from '../SessionKeyVerification'; import _ from 'lodash'; import { UserUtil } from '../../../util'; import { MultiDeviceProtocol } from '../../../session/protocols'; +import { ConversationHeaderWithDetails } from '../../conversation/ConversationHeader'; +import { SessionRightPanelWithDetails } from './SessionRightPanel'; interface State { conversationKey: string; @@ -284,7 +283,7 @@ export class SessionConversation extends React.Component { showOptionsPane && 'show' )} > - +
)} @@ -348,7 +347,7 @@ export class SessionConversation extends React.Component { public renderHeader() { const headerProps = this.getHeaderProps(); - return ; + return ; } public renderMessage( @@ -488,7 +487,6 @@ export class SessionConversation extends React.Component { name: conversation.getName(), phoneNumber: conversation.getNumber(), profileName: conversation.getProfileName(), - color: conversation.getColor(), avatarPath: conversation.getAvatarPath(), isVerified: conversation.isVerified(), isMe: conversation.isMe(), @@ -599,7 +597,6 @@ export class SessionConversation extends React.Component { memberCount: members.length, phoneNumber: conversation.getNumber(), profileName: conversation.getProfileName(), - color: conversation.getColor(), description: '', // TODO VINCE: ENSURE DESCRIPTION IS SET avatarPath: conversation.getAvatarPath(), amMod: conversation.isModerator(), @@ -886,7 +883,6 @@ export class SessionConversation extends React.Component { okText, okTheme: 'danger', resolve: doDelete, - centeredText: true, }); } diff --git a/ts/components/session/conversation/SessionGroupSettings.tsx b/ts/components/session/conversation/SessionRightPanel.tsx similarity index 86% rename from ts/components/session/conversation/SessionGroupSettings.tsx rename to ts/components/session/conversation/SessionRightPanel.tsx index b4651b908..f3399019e 100644 --- a/ts/components/session/conversation/SessionGroupSettings.tsx +++ b/ts/components/session/conversation/SessionRightPanel.tsx @@ -11,6 +11,10 @@ import { MediaGallery } from '../../conversation/media-gallery/MediaGallery'; import _ from 'lodash'; import { TimerOption } from '../../conversation/ConversationHeader'; import { Constants } from '../../../session'; +import { + ConversationAvatar, + usingClosedConversationDetails, +} from '../usingClosedConversationDetails'; interface Props { id: string; @@ -24,6 +28,7 @@ interface Props { amMod: boolean; isKickedFromGroup: boolean; isBlocked: boolean; + memberAvatars?: Array; // this is added by usingClosedConversationDetails onGoBack: () => void; onInviteContacts: () => void; @@ -34,7 +39,13 @@ interface Props { onSetDisappearingMessages: (seconds: number) => void; } -export class SessionGroupSettings extends React.Component { +interface State { + documents: Array; + media: Array; + onItemClick: any; +} + +class SessionRightPanel extends React.Component { public constructor(props: Props) { super(props); @@ -63,17 +74,27 @@ export class SessionGroupSettings extends React.Component { setTimeout(() => { this.getMediaGalleryProps() .then(({ documents, media, onItemClick }) => { - this.setState({ - documents, - media, - onItemClick, - }); + const { documents: oldDocs, media: oldMedias } = this.state; + if ( + oldDocs.length !== documents.length || + oldMedias.length !== media.length + ) { + this.setState({ + documents, + media, + onItemClick, + }); + } }) .ignore(); }, mediaScanInterval); } - public async getMediaGalleryProps() { + public async getMediaGalleryProps(): Promise<{ + documents: Array; + media: Array; + onItemClick: any; + }> { // We fetch more documents than media as they don’t require to be loaded // into memory right away. Revisit this once we have infinite scrolling: const conversationId = this.props.id; @@ -222,8 +243,10 @@ export class SessionGroupSettings extends React.Component { const hasDisappearingMessages = !isPublic && !isKickedFromGroup && !isBlocked; const leaveGroupString = isPublic - ? window.i18n('leaveOpenGroup') - : window.i18n('leaveClosedGroup'); + ? window.i18n('leaveGroup') + : isKickedFromGroup + ? window.i18n('youGotKickedFromGroup') + : window.i18n('leaveGroup'); const disappearingMessagesOptions = timerOptions.map(option => { return { @@ -237,7 +260,7 @@ export class SessionGroupSettings extends React.Component { const showUpdateGroupNameButton = isPublic && !isKickedFromGroup ? amMod && !isBlocked - : isAdmin && !isBlocked; + : isAdmin && !isBlocked && !isKickedFromGroup; const showUpdateGroupMembersButton = !isPublic && !isKickedFromGroup && !isBlocked && isAdmin; @@ -264,9 +287,7 @@ export class SessionGroupSettings extends React.Component { role="button" onClick={this.props.onUpdateGroupName} > - {isPublic - ? window.i18n('editGroupNameOrPicture') - : window.i18n('editGroupName')} + {isPublic ? window.i18n('editGroup') : window.i18n('editGroupName')}
)} {showUpdateGroupMembersButton && ( @@ -275,7 +296,7 @@ export class SessionGroupSettings extends React.Component { role="button" onClick={this.props.onUpdateGroupMembers} > - {window.i18n('showMembers')} + {window.i18n('groupMembers')}
)} {/*
@@ -307,6 +328,7 @@ export class SessionGroupSettings extends React.Component { private renderHeader() { const { + memberAvatars, id, onGoBack, onInviteContacts, @@ -320,6 +342,7 @@ export class SessionGroupSettings extends React.Component { const showInviteContacts = (isPublic || isAdmin) && !isKickedFromGroup && !isBlocked; + const userName = id; return (
{ />
{showInviteContacts && ( @@ -347,3 +371,7 @@ export class SessionGroupSettings extends React.Component { ); } } + +export const SessionRightPanelWithDetails = usingClosedConversationDetails( + SessionRightPanel +); diff --git a/ts/components/session/icon/Icons.tsx b/ts/components/session/icon/Icons.tsx index df9d2b5e4..393b3c99e 100644 --- a/ts/components/session/icon/Icons.tsx +++ b/ts/components/session/icon/Icons.tsx @@ -31,6 +31,7 @@ export enum SessionIconType { Send = 'send', Star = 'star', Stopwatch = 'stopwatch', + Sun = 'sun', QR = 'qr', Users = 'users', Upload = 'upload', @@ -42,6 +43,7 @@ export enum SessionIconSize { Medium = 'medium', Large = 'large', Huge = 'huge', + Max = 'max', } export const icons = { @@ -214,6 +216,11 @@ export const icons = { 'M9.38,2.17c-1.73,0-3.12,1.4-3.12,3.12s1.4,3.12,3.12,3.12s3.12-1.4,3.12-3.12S11.1,2.17,9.38,2.17z M16.93,0.25c2.3,0.59,3.92,2.67,3.92,5.05s-1.61,4.46-3.92,5.05c-0.56,0.14-1.12-0.19-1.27-0.75c-0.14-0.56,0.19-1.12,0.75-1.27 c1.38-0.35,2.35-1.6,2.35-3.03s-0.97-2.67-2.35-3.03c-0.56-0.14-0.9-0.71-0.75-1.27C15.8,0.44,16.37,0.11,16.93,0.25z M9.38,0.08 c2.88,0,5.21,2.33,5.21,5.21s-2.33,5.21-5.21,5.21S4.17,8.17,4.17,5.29C4.17,2.42,6.5,0.08,9.38,0.08z M21.09,12.75 c2.22,0.57,3.8,2.53,3.9,4.81L25,17.79v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08 c0-1.42-0.96-2.67-2.34-3.02c-0.56-0.14-0.89-0.71-0.75-1.27C19.97,12.94,20.54,12.61,21.09,12.75z M13.54,12.58 c2.8,0,5.09,2.21,5.2,4.99v0.22v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08 c0-1.67-1.3-3.03-2.95-3.12h-0.18H5.21c-1.67,0-3.03,1.3-3.12,2.95v0.18v2.08c0,0.58-0.47,1.04-1.04,1.04 c-0.54,0-0.98-0.41-1.04-0.93L0,19.88V17.8c0-2.8,2.21-5.09,4.99-5.2h0.22h8.33V12.58z', viewBox: '0 0 25 21', }, + [SessionIconType.Sun]: { + path: + 'M5.99997005,30 L2.00002995,30 C0.895437462,30 0,30.8955438 0,32 C0,33.1044562 0.895437462,34 2.00002995,34 L5.99997005,34 C7.10444275,34 8,33.1045759 8,32 C8,30.8954241 7.10444275,30 5.99997005,30 Z M61.9999701,30 L58.0000299,30 C56.8955573,30 56,30.8954241 56,32 C56,33.1045759 56.8954375,34 58.0000299,34 L61.9999701,34 C63.1044427,34 64,33.1045759 64,32 C64,30.8954241 63.1045625,30 61.9999701,30 Z M32,56 C30.8955438,56 30,56.8954375 30,58.0000299 L30,61.9999701 C30,63.1044427 30.8954241,64 32,64 C33.1045759,64 34,63.1045625 34,61.9999701 L34,58.0000299 C34,56.8955573 33.1044562,56 32,56 Z M32,0 C30.8955438,0 30,0.895437462 30,2.00002995 L30,5.99997005 C30,7.10444275 30.8954241,8 32,8 C33.1045759,8 34,7.10456254 34,5.99997005 L34,2.00002995 C34,0.895437462 33.1044562,0 32,0 Z M47.7317718,56.7845838 L45.7319182,53.0721056 C45.1797305,52.0469599 43.9566528,51.6955731 43.0002063,52.2875514 C42.0437597,52.8794013 41.7160405,54.1903297 42.2682282,55.2154754 L44.2680818,58.9279535 C44.8205091,59.9536127 46.0439461,60.3041008 46.9997937,59.7125077 C47.9562403,59.1206578 48.2839595,57.8097294 47.7317718,56.7845838 Z M21.7317718,8.78454964 L19.7319182,5.07209798 C19.1797305,4.0469596 17.9566528,3.69557529 17.0002063,4.28754937 C16.0437597,4.87939507 15.7160405,6.19031404 16.2682282,7.21545242 L18.2680818,10.9279041 C18.8205091,11.953556 20.0439461,12.30417 20.9997937,11.7124527 C21.9562403,11.120607 22.2839595,9.80968802 21.7317718,8.78454964 Z M58.9279441,44.2681449 L55.2154404,42.2683526 C54.1901593,41.7159423 52.8793503,42.0437712 52.2874963,43.0003082 C51.6956424,43.9567254 52.0469032,45.1797656 53.0720559,45.7319364 L56.7845596,47.7317287 C57.8091988,48.2837797 59.1203929,47.9566694 59.7125037,46.9997731 C60.3043576,46.0433559 59.9530968,44.8203157 58.9279441,44.2681449 Z M10.9279935,18.2681287 L7.21546334,16.2683276 C6.1901749,15.7159149 4.87922822,16.043865 4.28749839,17.0002864 C3.69564018,17.9567078 4.04690354,19.1797533 5.07206359,19.7319265 L8.78459372,21.7317275 C9.80924022,22.2837809 11.1204437,21.9566692 11.7125587,20.9997687 C12.3042885,20.0433474 11.9531535,18.8203018 10.9279935,18.2681287 Z M59.7125037,17.0002509 C59.1206497,16.0438126 57.8098407,15.7159764 56.7845596,16.2682791 L53.0720559,18.2681157 C52.0469032,18.8202986 51.6956424,20.0433659 52.2874963,20.9998042 C52.8796071,21.9567217 54.1909296,22.2837194 55.2154404,21.731776 L58.9279441,19.7319395 C59.9530968,19.1797565 60.3043576,17.9566893 59.7125037,17.0002509 Z M11.7124767,43.0002066 C11.1207531,42.0437597 9.80969199,41.7160405 8.78454285,42.2682283 L5.07205219,44.2680826 C4.04690304,44.8202704 3.69564342,46.0433485 4.28749534,46.9997953 C4.87960402,47.9567213 6.19092192,48.2837219 7.21542915,47.7317736 L10.9279198,45.7319194 C11.9531973,45.1797315 12.3043286,43.9566534 11.7124767,43.0002066 Z M46.9997937,4.28760336 C46.0432274,3.69550719 44.8202695,4.04701615 44.2680818,5.07214363 L42.2682282,8.78455581 C41.7160405,9.80968329 42.0437597,11.1205883 43.0002063,11.7124277 C43.9561737,12.3041388 45.1794909,11.9536568 45.7319182,10.9278875 L47.7317718,7.21547528 C48.2839595,6.19047618 47.9562403,4.87957115 46.9997937,4.28760336 Z M20.9997937,52.2876314 C20.0433472,51.6955352 18.8201497,52.0469158 18.2680818,53.0721716 L16.2682282,56.7845838 C15.7160405,57.8097113 16.0437597,59.1206163 17.0002063,59.7124557 C17.9561737,60.3041668 19.1794909,59.9535565 19.7319182,58.9279155 L21.7317718,55.2155033 C22.2839595,54.1903758 21.9562403,52.8794708 20.9997937,52.2876314 Z M31.5,12 C20.7477571,12 12,20.7477571 12,31.5 C12,42.2522429 20.7477571,51 31.5,51 C42.2522429,51 51,42.2522429 51,31.5 C51,20.7477571 42.252368,12 31.5,12 Z M31.5,47.6430057 C22.5988336,47.6430057 15.3569943,40.4012983 15.3569943,31.5 C15.3569943,22.5987017 22.5988336,15.3569943 31.5,15.3569943 C40.4011664,15.3569943 47.6430057,22.5988336 47.6430057,31.5 C47.6430057,40.4011664 40.4012983,47.6430057 31.5,47.6430057 Z', + viewBox: '0 0 64 64', + }, [SessionIconType.Upload]: { path: 'M380.032,133.472l-112-128C264.992,2.016,260.608,0,256,0c-4.608,0-8.992,2.016-12.032,5.472l-112,128 c-4.128,4.736-5.152,11.424-2.528,17.152C132.032,156.32,137.728,160,144,160h64v208c0,8.832,7.168,16,16,16h64 c8.832,0,16-7.168,16-16V160h64c6.272,0,11.968-3.648,14.56-9.376C385.152,144.896,384.192,138.176,380.032,133.472z M432,352v96H80v-96H16v128c0,17.696,14.336,32,32,32h416c17.696,0,32-14.304,32-32V352H432z', diff --git a/ts/components/session/icon/SessionIcon.tsx b/ts/components/session/icon/SessionIcon.tsx index de8e7c43c..28844ba19 100644 --- a/ts/components/session/icon/SessionIcon.tsx +++ b/ts/components/session/icon/SessionIcon.tsx @@ -49,6 +49,9 @@ export class SessionIcon extends React.PureComponent { case SessionIconSize.Huge: iconDimensions = '30'; break; + case SessionIconSize.Max: + iconDimensions = '80'; + break; default: iconDimensions = '20'; } diff --git a/ts/components/session/settings/SessionSettingListItem.tsx b/ts/components/session/settings/SessionSettingListItem.tsx index fd7ea27d9..13fd3179a 100644 --- a/ts/components/session/settings/SessionSettingListItem.tsx +++ b/ts/components/session/settings/SessionSettingListItem.tsx @@ -61,7 +61,7 @@ export class SessionSettingListItem extends React.Component {
{type === SessionSettingType.Toggle && ( -
+
{ } public componentDidMount() { - setTimeout(() => $('#password-lock-input').focus(), 100); + setTimeout(() => ($('#password-lock-input') as any).focus(), 100); window.Whisper.events.on('refreshLinkedDeviceList', async () => { setTimeout(() => { @@ -111,6 +111,9 @@ export class SettingsView extends React.Component { if (category === SessionSettingCategory.Devices) { // special case for linked devices settings = this.getLinkedDeviceSettings(); + } else if (category === SessionSettingCategory.Blocked) { + // special case for blocked user + settings = this.getBlockedUserSettings(); } else { // Grab initial values from database on startup // ID corresponds to installGetter parameters in preload.js @@ -197,7 +200,7 @@ export class SettingsView extends React.Component {
@@ -206,7 +209,7 @@ export class SettingsView extends React.Component { } public async validatePasswordLock() { - const enteredPassword = String($('#password-lock-input').val()); + const enteredPassword = String(jQuery('#password-lock-input').val()); if (!enteredPassword) { this.setState({ @@ -273,7 +276,9 @@ export class SettingsView extends React.Component { } public setOptionsSetting(settingID: string) { - const selectedValue = $(`#${settingID} .session-radio input:checked`).val(); + const selectedValue = jQuery( + `#${settingID} .session-radio input:checked` + ).val(); window.setSettingValue(settingID, selectedValue); } @@ -390,7 +395,7 @@ export class SettingsView extends React.Component { confirmationDialogParams: { shouldShowConfirm: () => !window.getSettingValue('link-preview-setting'), - title: window.i18n('linkPreviewsConfirmTitle'), + title: window.i18n('linkPreviewsTitle'), message: window.i18n('linkPreviewsConfirmMessage'), okTheme: 'danger', }, @@ -435,32 +440,16 @@ export class SettingsView extends React.Component { confirmationDialogParams: undefined, }, { - id: 'message-ttl', - title: window.i18n('messageTTL'), - description: window.i18n('messageTTLSettingDescription'), - // TODO: Revert - // TTL set to 2 days for mobile push notification compabability - // temporary fix .t 13/07/2020 - // - // TODO: Hook up this TTL to message sending when re-enabling. - // This setting is not used in any libsession sending code - hidden: true, - type: SessionSettingType.Slider, - category: SessionSettingCategory.Privacy, - setFn: undefined, + id: 'media-permissions', + title: window.i18n('mediaPermissionsTitle'), + description: window.i18n('mediaPermissionsDescription'), + hidden: false, + type: SessionSettingType.Toggle, + category: SessionSettingCategory.Permissions, + setFn: window.toggleMediaPermissions, + content: undefined, comparisonValue: undefined, onClick: undefined, - content: { - dotsEnabled: true, - step: 6, - min: 12, - max: 96, - defaultValue: NumberUtils.msAsUnit( - window.CONSTANTS.TTL_DEFAULT_REGULAR_MESSAGE, - 'hour' - ), - info: (value: number) => `${value} Hours`, - }, confirmationDialogParams: undefined, }, { @@ -598,6 +587,73 @@ export class SettingsView extends React.Component { ]; } + private getBlockedUserSettings(): Array { + const results: Array = []; + const blockedNumbers = BlockedNumberController.getBlockedNumbers(); + + for (const blockedNumber of blockedNumbers) { + let title: string; + + const currentModel = window.ConversationController.get(blockedNumber); + if (currentModel) { + title = + currentModel.getProfileName() || + currentModel.getName() || + window.i18n('anonymous'); + } else { + title = window.i18n('anonymous'); + } + + results.push({ + id: blockedNumber, + title, + description: '', + type: SessionSettingType.Button, + category: SessionSettingCategory.Blocked, + content: { + buttonColor: SessionButtonColor.Danger, + buttonText: window.i18n('unblockUser'), + }, + comparisonValue: undefined, + setFn: async () => { + if (currentModel) { + await currentModel.unblock(); + } else { + await BlockedNumberController.unblock(blockedNumber); + this.forceUpdate(); + } + ToastUtils.push({ + title: window.i18n('unblocked'), + id: 'unblocked', + }); + }, + hidden: false, + onClick: undefined, + confirmationDialogParams: undefined, + }); + } + + if (blockedNumbers.length === 0) { + return [ + { + id: 'noBlockedContacts', + title: '', + description: window.i18n('noBlockedContacts'), + type: undefined, + category: SessionSettingCategory.Blocked, + content: undefined, + comparisonValue: undefined, + setFn: undefined, + hidden: false, + onClick: undefined, + confirmationDialogParams: undefined, + }, + ]; + } + + return results; + } + private getLinkedDeviceSettings(): Array { const { linkedPubKeys } = this.state; const { isSecondaryDevice } = this.props; @@ -677,7 +733,9 @@ export class SettingsView extends React.Component { } private async onKeyUp(event: any) { - const lockPasswordFocussed = $('#password-lock-input').is(':focus'); + const lockPasswordFocussed = ($('#password-lock-input') as any).is( + ':focus' + ); if (event.key === 'Enter' && lockPasswordFocussed) { await this.validatePasswordLock(); diff --git a/ts/components/session/settings/SessionSettingsHeader.tsx b/ts/components/session/settings/SessionSettingsHeader.tsx index 854438b59..0dfbba819 100644 --- a/ts/components/session/settings/SessionSettingsHeader.tsx +++ b/ts/components/session/settings/SessionSettingsHeader.tsx @@ -31,7 +31,9 @@ export class SettingsHeader extends React.Component { } public focusSearch() { - $('.left-pane-setting-section .session-search-input input').focus(); + ($( + '.left-pane-setting-section .session-search-input input' + ) as any).focus(); } public showAddLinkedDeviceModal() { diff --git a/ts/components/session/usingClosedConversationDetails.tsx b/ts/components/session/usingClosedConversationDetails.tsx new file mode 100644 index 000000000..ccac5fb4d --- /dev/null +++ b/ts/components/session/usingClosedConversationDetails.tsx @@ -0,0 +1,88 @@ +import { GroupUtils } from '../../session/utils'; +import { UserUtil } from '../../util'; +import { PubKey } from '../../session/types'; +import React from 'react'; +import * as _ from 'lodash'; + +export type ConversationAvatar = { + avatarPath?: string; + id?: string; // member's pubkey + name?: string; +}; + +type State = { + memberAvatars?: Array; // this is added by usingClosedConversationDetails +}; + +export function usingClosedConversationDetails(WrappedComponent: any) { + return class extends React.Component { + constructor(props: any) { + super(props); + this.state = { + memberAvatars: undefined, + }; + } + + public componentDidMount() { + void this.fetchClosedConversationDetails(); + } + + public componentWillReceiveProps() { + void this.fetchClosedConversationDetails(); + } + + public render() { + return ( + + ); + } + + private async fetchClosedConversationDetails() { + const { + isPublic, + type, + conversationType, + isGroup, + phoneNumber, + id, + } = this.props; + + if ( + !isPublic && + (conversationType === 'group' || type === 'group' || isGroup) + ) { + const groupId = id || phoneNumber; + const ourPrimary = await UserUtil.getPrimary(); + let members = await GroupUtils.getGroupMembers(PubKey.cast(groupId)); + + const ourself = members.find(m => m.key !== ourPrimary.key); + // add ourself back at the back, so it's shown only if only 1 member and we are still a member + members = members.filter(m => m.key !== ourPrimary.key); + members.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)); + if (ourself) { + members.push(ourPrimary); + } + // no need to forward more than 2 conversations for rendering the group avatar + members = members.slice(0, 2); + const memberConvos = await Promise.all( + members.map(async m => + window.ConversationController.getOrCreateAndWait(m.key, 'private') + ) + ); + const memberAvatars = memberConvos.map(m => { + return { + avatarPath: m.getAvatar()?.url || null, + id: m.id, + name: m.get('name') || m.get('profileName') || m.id, + }; + }); + this.setState({ memberAvatars }); + } else { + this.setState({ memberAvatars: undefined }); + } + } + }; +} diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 87439cb82..bb6fec351 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -18,17 +18,22 @@ import ByteBuffer from 'bytebuffer'; import { BlockedNumberController } from '../util/blockedNumberController'; import { decryptWithSenderKey } from '../session/medium_group/ratchet'; import { StringUtils } from '../session/utils'; +import { UserUtil } from '../util'; export async function handleContentMessage(envelope: EnvelopePlus) { - const plaintext = await decrypt(envelope, envelope.content); + try { + const plaintext = await decrypt(envelope, envelope.content); - if (!plaintext) { - window.log.warn('handleContentMessage: plaintext was falsey'); - return; - } else if (plaintext instanceof ArrayBuffer && plaintext.byteLength === 0) { - return; + if (!plaintext) { + window.log.warn('handleContentMessage: plaintext was falsey'); + return; + } else if (plaintext instanceof ArrayBuffer && plaintext.byteLength === 0) { + return; + } + await innerHandleContentMessage(envelope, plaintext); + } catch (e) { + window.log.warn(e); } - await innerHandleContentMessage(envelope, plaintext); } async function decryptForMediumGroup( @@ -46,8 +51,6 @@ async function decryptForMediumGroup( throw new Error(`Secret key is empty for group ${groupId}!`); } - const { senderIdentity } = envelope; - const { ciphertext: outerCiphertext, ephemeralKey, @@ -64,18 +67,29 @@ async function decryptForMediumGroup( outerCiphertext ); - const { ciphertext, keyIdx } = SignalService.MediumGroupCiphertext.decode( + const { + source, + ciphertext, + keyIdx, + } = SignalService.MediumGroupCiphertext.decode( new Uint8Array(mediumGroupCiphertext) ); - + const ourNumber = (await UserUtil.getCurrentDevicePubKey()) as string; + const sourceAsStr = StringUtils.decode(source, 'hex'); + if (sourceAsStr === ourNumber) { + window.console.info( + 'Dropping message from ourself after decryptForMediumGroup' + ); + return null; + } + envelope.senderIdentity = sourceAsStr; const plaintext = await decryptWithSenderKey( ciphertext, keyIdx, groupId, - senderIdentity + sourceAsStr ); - - return plaintext; + return plaintext ? unpad(plaintext) : null; } function unpad(paddedData: ArrayBuffer): ArrayBuffer { @@ -276,25 +290,25 @@ async function decrypt( if (error && error instanceof textsecure.SenderKeyMissing) { const groupId = envelope.source; const { senderIdentity } = error; + if (senderIdentity) { + log.info( + 'Requesting missing key for identity: ', + senderIdentity, + 'groupId: ', + groupId + ); - log.info( - 'Requesting missing key for identity: ', - senderIdentity, - 'groupId: ', - groupId - ); + const params = { + timestamp: Date.now(), + groupId, + }; - const params = { - timestamp: Date.now(), - groupId, - }; + const requestKeysMessage = new MediumGroupRequestKeysMessage(params); + const sender = new PubKey(senderIdentity); + void libsession.getMessageQueue().send(sender, requestKeysMessage); - const requestKeysMessage = new MediumGroupRequestKeysMessage(params); - const sender = new PubKey(senderIdentity); - // tslint:disable-next-line no-floating-promises - libsession.getMessageQueue().send(sender, requestKeysMessage); - - return; + return; + } } let errorToThrow = error; @@ -377,81 +391,83 @@ export async function innerHandleContentMessage( plaintext: ArrayBuffer ): Promise { const { ConversationController } = window; + try { + const content = SignalService.Content.decode(new Uint8Array(plaintext)); - const content = SignalService.Content.decode(new Uint8Array(plaintext)); + const blocked = await isBlocked(envelope.source); + if (blocked) { + // We want to allow a blocked user message if that's a control message for a known group and the group is not blocked + if (shouldDropBlockedUserMessage(content)) { + window.log.info('Dropping blocked user message'); + return; + } else { + window.log.info( + 'Allowing group-control message only from blocked user' + ); + } + } + const { FALLBACK_MESSAGE } = SignalService.Envelope.Type; - const blocked = await isBlocked(envelope.source); - if (blocked) { - // We want to allow a blocked user message if that's a control message for a known group and the group is not blocked - if (shouldDropBlockedUserMessage(content)) { - window.log.info('Dropping blocked user message'); + await ConversationController.getOrCreateAndWait(envelope.source, 'private'); + + if (content.preKeyBundleMessage) { + await handleSessionRequestMessage(envelope, content.preKeyBundleMessage); + } else if (envelope.type !== FALLBACK_MESSAGE) { + const device = new PubKey(envelope.source); + + await SessionProtocol.onSessionEstablished(device); + await libsession.getMessageQueue().processPending(device); + } + + if (content.pairingAuthorisation) { + await handlePairingAuthorisationMessage( + envelope, + content.pairingAuthorisation, + content.dataMessage + ); return; - } else { - window.log.info('Allowing group-control message only from blocked user'); } - } - const { FALLBACK_MESSAGE } = SignalService.Envelope.Type; - - await ConversationController.getOrCreateAndWait(envelope.source, 'private'); - - if (content.preKeyBundleMessage) { - await handleSessionRequestMessage(envelope, content.preKeyBundleMessage); - } else if (envelope.type !== FALLBACK_MESSAGE) { - const device = new PubKey(envelope.source); - - await SessionProtocol.onSessionEstablished(device); - await libsession.getMessageQueue().processPending(device); - } - - if (content.pairingAuthorisation) { - await handlePairingAuthorisationMessage( - envelope, - content.pairingAuthorisation, - content.dataMessage - ); - return; - } - - if (content.syncMessage) { - await handleSyncMessage(envelope, content.syncMessage); - return; - } - - if (content.dataMessage) { - if ( - content.dataMessage.profileKey && - content.dataMessage.profileKey.length === 0 - ) { - content.dataMessage.profileKey = null; + if (content.syncMessage) { + await handleSyncMessage(envelope, content.syncMessage); + return; } - await handleDataMessage(envelope, content.dataMessage); - return; - } - if (content.nullMessage) { - await handleNullMessage(envelope); - return; - } - if (content.callMessage) { - await handleCallMessage(envelope); - return; - } - if (content.receiptMessage) { - await handleReceiptMessage(envelope, content.receiptMessage); - return; - } - if (content.typingMessage) { - if ( - content.typingMessage.groupId && - content.typingMessage.groupId.length === 0 - ) { - content.typingMessage.groupId = null; - } - await handleTypingMessage(envelope, content.typingMessage); - return; - } - return; + if (content.dataMessage) { + if ( + content.dataMessage.profileKey && + content.dataMessage.profileKey.length === 0 + ) { + content.dataMessage.profileKey = null; + } + await handleDataMessage(envelope, content.dataMessage); + return; + } + if (content.nullMessage) { + await handleNullMessage(envelope); + return; + } + if (content.callMessage) { + await handleCallMessage(envelope); + return; + } + if (content.receiptMessage) { + await handleReceiptMessage(envelope, content.receiptMessage); + return; + } + if (content.typingMessage) { + if ( + content.typingMessage.groupId && + content.typingMessage.groupId.length === 0 + ) { + content.typingMessage.groupId = null; + } + await handleTypingMessage(envelope, content.typingMessage); + return; + } + } catch (e) { + window.log.warn(e); + } } function onReadReceipt(readAt: any, timestamp: any, reader: any) { diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index dddde9cfb..ea8049a71 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -43,7 +43,7 @@ export async function updateProfile( isRaw: true, }); - // null => use jazzicon + // null => use placeholder with color and first letter let path = null; if (profileKey) { // Convert profileKey to ArrayBuffer, if needed @@ -296,7 +296,7 @@ export async function handleDataMessage( } const message = await processDecrypted(envelope, dataMessage); const ourPubKey = window.textsecure.storage.user.getNumber(); - const senderPubKey = envelope.source; + const senderPubKey = envelope.senderIdentity || envelope.source; const isMe = senderPubKey === ourPubKey; const conversation = window.ConversationController.get(senderPubKey); @@ -356,30 +356,53 @@ interface MessageId { source: any; sourceDevice: any; timestamp: any; + message: any; } +const PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES = 10 * 1000; // 10s async function isMessageDuplicate({ source, sourceDevice, timestamp, + message, }: MessageId) { const { Errors } = window.Signal.Types; try { - const result = await window.Signal.Data.getMessageBySender( - { source, sourceDevice, sent_at: timestamp }, + const result = await window.Signal.Data.getMessagesBySender( + { source, sourceDevice }, { Message: window.Whisper.Message, } ); - - return Boolean(result); + if (!result) { + return false; + } + const filteredResult = result.filter( + (m: any) => m.attributes.body === message.body + ); + const isSimilar = filteredResult.some((m: any) => + isDuplicate(m, message, source) + ); + return isSimilar; } catch (error) { window.log.error('isMessageDuplicate error:', Errors.toLogFormat(error)); return false; } } +export const isDuplicate = (m: any, testedMessage: any, source: string) => { + // The username in this case is the users pubKey + const sameUsername = m.attributes.source === source; + const sameText = m.attributes.body === testedMessage.body; + // Don't filter out messages that are too far apart from each other + const timestampsSimilar = + Math.abs(m.attributes.sent_at - testedMessage.timestamp) <= + PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES; + + return sameUsername && sameText && timestampsSimilar; +}; + async function handleProfileUpdate( profileKeyBuffer: Uint8Array, convoId: string, @@ -427,6 +450,7 @@ interface MessageCreationData { source: boolean; serverId: string; message: any; + serverTimestamp: any; // Needed for synced outgoing messages unidentifiedStatus: any; // ??? @@ -445,6 +469,7 @@ export function initIncomingMessage(data: MessageCreationData): MessageModel { source, serverId, message, + serverTimestamp, } = data; const type = 'incoming'; @@ -457,6 +482,7 @@ export function initIncomingMessage(data: MessageCreationData): MessageModel { sourceDevice, serverId, // + (not present below in `createSentMessage`) sent_at: timestamp, + serverTimestamp, received_at: receivedAt || Date.now(), conversationId: groupId ?? source, unidentifiedDeliveryReceived, // + @@ -476,6 +502,7 @@ function createSentMessage(data: MessageCreationData): MessageModel { const { timestamp, + serverTimestamp, isPublic, receivedAt, sourceDevice, @@ -508,6 +535,7 @@ function createSentMessage(data: MessageCreationData): MessageModel { const messageData: any = { source: window.textsecure.storage.user.getNumber(), sourceDevice, + serverTimestamp, sent_at: timestamp, received_at: isPublic ? receivedAt : now, conversationId: destination, // conversation ID will might change later (if it is a group) @@ -588,9 +616,7 @@ export async function handleMessageEvent(event: MessageEvent): Promise { // if the message is `sent` (from secondary device) we have to set the sender manually... (at least for now) source = source || msg.get('source'); - const isDuplicate = await isMessageDuplicate(data); - - if (isDuplicate) { + if (await isMessageDuplicate(data)) { // RSS expects duplicates, so squelch log if (!source.match(/^rss:/)) { window.log.warn('Received duplicate message', msg.idForLogging()); @@ -618,10 +644,11 @@ export async function handleMessageEvent(event: MessageEvent): Promise { // - group.id if it is a group message let conversationId = id; if (isGroupMessage) { - /* handle one part of the group logic here: - handle requesting info of a new group, - dropping an admin only update from a non admin, ... - */ + // remove the prefix from the source object so this is correct for all other + message.group.id = message.group.id.replace( + PubKey.PREFIX_GROUP_TEXTSECURE, + '' + ); conversationId = message.group.id; } diff --git a/ts/receiver/errors.ts b/ts/receiver/errors.ts index a41179f85..26e2201b4 100644 --- a/ts/receiver/errors.ts +++ b/ts/receiver/errors.ts @@ -16,9 +16,7 @@ async function onNoSession(ev: any) { if (!convo.get('sessionRestoreSeen')) { convo.set({ sessionRestoreSeen: true }); - await window.Signal.Data.updateConversation(convo.id, convo.attributes, { - Conversation: Whisper.Conversation, - }); + await convo.commit(); await SessionProtocol.sendSessionRequestIfNeeded(new PubKey(pubkey)); } else { @@ -85,10 +83,7 @@ export async function onError(ev: any) { if (ev.confirm) { ev.confirm(); } - - await window.Signal.Data.updateConversation(id, conversation.attributes, { - Conversation: Whisper.Conversation, - }); + await conversation.commit(); } throw error; diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 021bdcb31..1265a35ba 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -10,10 +10,13 @@ import * as SenderKeyAPI from '../session/medium_group'; import { getChainKey } from '../session/medium_group/ratchet'; import { StringUtils } from '../session/utils'; import { BufferType } from '../session/utils/String'; -import { MultiDeviceProtocol } from '../session/protocols'; import { ConversationModel } from '../../js/models/conversations'; import { UserUtil } from '../util'; -import { RatchetState } from '../session/medium_group/senderKeys'; +import { + createSenderKeyForGroup, + RatchetState, + shareSenderKeys, +} from '../session/medium_group/senderKeys'; const toHex = (d: BufferType) => StringUtils.decode(d, 'hex'); const fromHex = (d: string) => StringUtils.encode(d, 'hex'); @@ -32,13 +35,19 @@ async function handleSenderKeyRequest( log.debug('[sender key] sender key request from:', senderIdentity); - const maybeKey = await getChainKey(groupId, ourIdentity); + let maybeKey = await getChainKey(groupId, ourIdentity); if (!maybeKey) { - // Regenerate? This should never happen though - log.error('Could not find own sender key'); - await removeFromCache(envelope); - return; + log.error('Could not find own sender key. Generating new one.'); + maybeKey = await SenderKeyAPI.createSenderKeyForGroup( + groupId, + PubKey.cast(ourIdentity) + ); + if (!maybeKey) { + log.error('Could not find own sender key after regenerate'); + await removeFromCache(envelope); + return; + } } // We reuse the same message type for sender keys @@ -67,23 +76,6 @@ async function handleSenderKeyRequest( await removeFromCache(envelope); } -async function shareSenderKeys( - groupId: string, - recipientsPrimary: Array, - senderKey: RatchetState -) { - const message = new MediumGroupResponseKeysMessage({ - timestamp: Date.now(), - groupId, - senderKey, - }); - - const recipients = recipientsPrimary.map(pk => PubKey.cast(pk)); - await Promise.all( - recipients.map(pk => getMessageQueue().sendUsingMultiDevice(pk, message)) - ); -} - async function handleSenderKey( envelope: EnvelopePlus, groupUpdate: SignalService.MediumGroupUpdate @@ -215,7 +207,10 @@ async function handleNewGroup( // We only set group admins on group creation convo.set('groupAdmins', admins); - + // update the unreadCount for this convo + convo.set({ + unreadCount: Number(convo.get('unreadCount')) + 1, + }); convo.commit(); const secretKeyHex = toHex(groupPrivateKey); @@ -243,10 +238,10 @@ function sanityCheckMediumGroupUpdate( const joining = diff.joiningMembers || []; const leaving = diff.leavingMembers || []; - // 1. When there are no member changes, we don't expect any sender keys + // 1. When there are no member changes, we expect all sender keys if (!joining.length && !leaving.length) { - if (groupUpdate.senderKeys.length) { - window.log.error('Unexpected sender keys in group update'); + if (groupUpdate.senderKeys.length !== groupUpdate.members.length) { + window.log.error('Incorrect number of sender keys in group update'); } } @@ -270,13 +265,10 @@ async function handleMediumGroupChange( envelope: EnvelopePlus, groupUpdate: SignalService.MediumGroupUpdate ) { - const senderIdentity = envelope.source; - const { name, groupPublicKey, members: membersBinary, - admins: adminsBinary, senderKeys, } = groupUpdate; const { log } = window; @@ -307,8 +299,8 @@ async function handleMediumGroupChange( return; } - // // Check that the sender is admin (make sure it words with multidevice) - const isAdmin = curAdmins.includes(senderIdentity); + // Check that the sender is admin (make sure it words with multidevice) + const isAdmin = true; if (!isAdmin) { log.warn('Rejected attempt to update a group by non-admin'); @@ -317,7 +309,7 @@ async function handleMediumGroupChange( } // NOTE: right now, we don't expect admins to change - const admins = adminsBinary.map(toHex); + // const admins = adminsBinary.map(toHex); const members = membersBinary.map(toHex); const diff = SenderKeyAPI.calculateGroupDiff(convo, { name, members }); @@ -326,7 +318,7 @@ async function handleMediumGroupChange( const primary = await UserUtil.getPrimary(); sanityCheckMediumGroupUpdate(primary, diff, groupUpdate); - + // console.log(`Got group update`, groupUpdate); await saveIncomingRatchetKeys(groupId, senderKeys); // Only add update message if we have something to show @@ -342,73 +334,31 @@ async function handleMediumGroupChange( convo.set('isKickedFromGroup', true); // Disable typing: convo.updateTextInputState(); + window.SwarmPolling.removePubkey(groupId); + } else { + if (maybeConvo.get('isKickedFromGroup')) { + // Enable typing: + maybeConvo.set('isKickedFromGroup', false); + maybeConvo.set('left', false); + // Subscribe to this group id + window.SwarmPolling.addGroupId(new PubKey(groupId)); + maybeConvo.updateTextInputState(); + } } await convo.commit(); - await removeFromCache(envelope); -} + if (diff.leavingMembers && diff.leavingMembers.length > 0 && !areWeKicked) { + // Send out the user's new ratchet to all members (minus the removed ones) using established channels + const userSenderKey = await createSenderKeyForGroup(groupId, primary); + window.log.warn( + 'Sharing our new senderKey with remainingMembers via message', + members + ); -async function handleQuit( - envelope: EnvelopePlus, - groupUpdate: SignalService.MediumGroupUpdate -) { - const quitter = envelope.source; - const groupId = toHex(groupUpdate.groupPublicKey); - - const quitterPrimary = await MultiDeviceProtocol.getPrimaryDevice(quitter); - - const maybeConvo = await window.ConversationController.get(groupId); - - if (!maybeConvo) { - window.log.warn('Received QUIT for a non-existing medium group'); - await removeFromCache(envelope); - return; + await shareSenderKeys(groupId, members, userSenderKey); } - const convo = maybeConvo; - - // 1. Remove primary device from members: - - const members = convo.get('members'); - - const membersUpdated = _.without(members, quitterPrimary.key); - - convo.set({ members: membersUpdated }); - - convo.commit(); - - // 2. Show message (device left the group); - - await SenderKeyAPI.addUpdateMessage( - convo, - { leavingMembers: [quitterPrimary.key] }, - 'incoming' - ); - - const ourNumber = (await UserUtil.getCurrentDevicePubKey()) as string; - const primary = await UserUtil.getPrimary(); - - if (quitterPrimary.key === primary.key) { - convo.set('isKickedFromGroup', true); - // Disable typing: - convo.updateTextInputState(); - await convo.commit(); - - await removeFromCache(envelope); - return; - } - - // 3. update your own sender key - const senderKey = await SenderKeyAPI.createSenderKeyForGroup( - groupId, - PubKey.cast(ourNumber) - ); - - // Send keys in the background - // tslint:disable-next-line no-floating-promises - shareSenderKeys(groupId, membersUpdated, senderKey); - await removeFromCache(envelope); } @@ -427,8 +377,6 @@ export async function handleMediumGroupUpdate( await handleNewGroup(envelope, groupUpdate); } else if (type === Type.INFO) { await handleMediumGroupChange(envelope, groupUpdate); - } else if (type === Type.QUIT) { - await handleQuit(envelope, groupUpdate); } else { window.log.error('Unknown group update type: ', type); } diff --git a/ts/receiver/multidevice.ts b/ts/receiver/multidevice.ts index c1c69261d..a46de5286 100644 --- a/ts/receiver/multidevice.ts +++ b/ts/receiver/multidevice.ts @@ -4,7 +4,7 @@ import { EnvelopePlus } from './types'; import * as Data from '../../js/modules/data'; import { SignalService } from '../protobuf'; -import { updateProfile } from './receiver'; +import { updateProfile } from './dataMessage'; import { onVerified } from './syncMessages'; import { StringUtils } from '../session/utils'; @@ -409,10 +409,7 @@ async function onContactReceived(details: any) { ); conversation.set(newAttributes); } - - await window.Signal.Data.updateConversation(id, conversation.attributes, { - Conversation: Whisper.Conversation, - }); + await conversation.commit(); const { expireTimer } = details; const isValidExpireTimer = typeof expireTimer === 'number'; if (isValidExpireTimer) { diff --git a/ts/receiver/receiver.ts b/ts/receiver/receiver.ts index 5825e63c0..b2ced26a1 100644 --- a/ts/receiver/receiver.ts +++ b/ts/receiver/receiver.ts @@ -1,9 +1,7 @@ // TODO: fix libloki and textsecure not being available here yet -import { handleEndSession } from './sessionHandling'; import { EnvelopePlus } from './types'; -import { downloadAttachment } from './attachments'; -import { handleMediumGroupUpdate } from './mediumGroups'; +export { downloadAttachment } from './attachments'; import { addToCache, getAllFromCache, removeFromCache } from './cache'; import { processMessage } from '../session/snode_api/swarmPolling'; @@ -19,27 +17,14 @@ import _ from 'lodash'; export { processMessage, onDeliveryReceipt }; -import { - handleDataMessage, - handleMessageEvent, - updateProfile, -} from './dataMessage'; +import { handleMessageEvent, updateProfile } from './dataMessage'; import { getEnvelopeId } from './common'; import { StringUtils } from '../session/utils'; import { SignalService } from '../protobuf'; -import { BlockedNumberController } from '../util/blockedNumberController'; import { MultiDeviceProtocol } from '../session/protocols'; // TODO: check if some of these exports no longer needed -export { - handleEndSession, - handleMediumGroupUpdate, - downloadAttachment, - handleDataMessage, - updateProfile, - handleMessageEvent, -}; interface ReqOptions { conversationId: string; @@ -126,7 +111,6 @@ async function handleRequestDetail( lastPromise: Promise ): Promise { const { textsecure } = window; - const envelope: any = SignalService.Envelope.decode(plaintext); // After this point, decoding errors are not the server's @@ -166,7 +150,9 @@ async function handleRequestDetail( // receiving pipeline refactor. It is to be implemented in the next PR. // To ensure that we queue in the same order we receive messages + await lastPromise; + queueEnvelope(envelope); } catch (error) { window.log.error( diff --git a/ts/receiver/syncMessages.ts b/ts/receiver/syncMessages.ts index 10983ebb8..4c180ee87 100644 --- a/ts/receiver/syncMessages.ts +++ b/ts/receiver/syncMessages.ts @@ -11,14 +11,12 @@ import { handleMessageEvent, isMessageEmpty, processDecrypted, + updateProfile, } from './dataMessage'; -import { updateProfile } from './receiver'; import { handleContacts } from './multidevice'; import { updateOrCreateGroupFromSync } from '../session/medium_group'; import { MultiDeviceProtocol } from '../session/protocols'; -import { DataMessage } from '../session/messages/outgoing'; import { BlockedNumberController } from '../util'; -import { StringUtils } from '../session/utils'; export async function handleSyncMessage( envelope: EnvelopePlus, diff --git a/ts/session/crypto/MessageEncrypter.ts b/ts/session/crypto/MessageEncrypter.ts index ba97ca7a2..a605034cb 100644 --- a/ts/session/crypto/MessageEncrypter.ts +++ b/ts/session/crypto/MessageEncrypter.ts @@ -4,6 +4,7 @@ import { UserUtil } from '../../util'; import { CipherTextObject } from '../../../libtextsecure/libsignal-protocol'; import { encryptWithSenderKey } from '../../session/medium_group/ratchet'; import { PubKey } from '../types'; +import { StringUtils } from '../utils'; /** * Add padding to a message buffer @@ -51,7 +52,7 @@ export async function encrypt( const plainText = padPlainTextBuffer(plainTextBuffer); if (encryptionType === EncryptionType.MediumGroup) { - return encryptForMediumGroup(device, plainTextBuffer); + return encryptForMediumGroup(device, plainText); } const address = new window.libsignal.SignalProtocolAddress(device.key, 1); @@ -90,7 +91,7 @@ export async function encryptForMediumGroup( // We should include ciphertext idx in the message const content = SignalService.MediumGroupCiphertext.encode({ ciphertext, - source: ourKey, + source: new Uint8Array(StringUtils.encode(ourKey, 'hex')), keyIdx, }).finish(); diff --git a/ts/session/index.ts b/ts/session/index.ts index c2a115733..1db6e3736 100644 --- a/ts/session/index.ts +++ b/ts/session/index.ts @@ -4,7 +4,8 @@ import * as Types from './types'; import * as Utils from './utils'; import * as Sending from './sending'; import * as Constants from './constants'; +import * as MediumGroup from './medium_group'; export * from './instance'; -export { Messages, Utils, Protocols, Types, Sending, Constants }; +export { Messages, Utils, Protocols, Types, Sending, Constants, MediumGroup }; diff --git a/ts/session/medium_group/index.ts b/ts/session/medium_group/index.ts index 1ce3d5197..4949066a4 100644 --- a/ts/session/medium_group/index.ts +++ b/ts/session/medium_group/index.ts @@ -8,12 +8,12 @@ import { RatchetState, saveSenderKeys, saveSenderKeysInner, + shareSenderKeys, } from './senderKeys'; import { getChainKey } from './ratchet'; import { MultiDeviceProtocol } from '../protocols'; import { BufferType } from '../utils/String'; import { UserUtil } from '../../util'; -import { MediumGroupQuitMessage } from '../messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage'; import { ClosedGroupChatMessage, ClosedGroupMessage, @@ -21,7 +21,6 @@ import { ExpirationTimerUpdateMessage, MediumGroupCreateMessage, MediumGroupMessage, - Message, } from '../messages/outgoing'; import { MessageModel, MessageModelType } from '../../../js/models/messages'; import { getMessageQueue } from '../../session'; @@ -35,6 +34,7 @@ export { saveSenderKeys, saveSenderKeysInner, getChainKey, + shareSenderKeys, }; const toHex = (d: BufferType) => StringUtils.decode(d, 'hex'); @@ -118,12 +118,14 @@ export async function createMediumGroup( const dbMessage = await addUpdateMessage(convo, groupDiff, 'outgoing'); + // be sure to call this before sending the message. + // the sending pipeline needs to know from GroupUtils when a message is for a medium group + await updateOrCreateGroup(groupDetails); + await sendGroupUpdate(convo, groupDiff, groupDetails, dbMessage.id); // ***** 3. Add update message to the conversation ***** - await updateOrCreateGroup(groupDetails); - convo.updateGroupAdmins(admins); window.owsDesktopApp.appView.openConversation(groupId, {}); @@ -185,6 +187,7 @@ export async function leaveMediumGroup(groupId: string) { // TODO: need to reset everyone's sender keys window.SwarmPolling.removePubkey(groupId); + // TODO audric: we just left a group, we have to regenerate our senderkey const maybeConvo = await ConversationController.get(groupId); @@ -207,16 +210,23 @@ export async function leaveMediumGroup(groupId: string) { sent_at: now, received_at: now, }); + const ourPrimary = await UserUtil.getPrimary(); - const updateParams = { - timestamp: Date.now(), - identifier: dbMessage.id, - groupId, + const members = convo.get('members').filter(m => m !== ourPrimary.key); + // do not include senderkey as everyone needs to generate new one + const groupUpdate: GroupInfo = { + id: convo.get('id'), + name: convo.get('name'), + members, + is_medium_group: true, + admins: convo.get('groupAdmins'), }; - const message = new MediumGroupQuitMessage(updateParams); - - await sendToMembers(groupId, message, dbMessage); + await sendGroupUpdateForMedium( + { leavingMembers: [ourPrimary.key] }, + groupUpdate, + dbMessage.id + ); } // Just a container to store two named list of keys @@ -251,48 +261,22 @@ async function getExistingSenderKeysForGroup( return maybeKeys.filter(d => d !== null).map(d => d as RatchetState); } -// Create all sender keys based on the changes in -// the group's composition -async function getOrCreateSenderKeysForUpdate( +// Get a list of senderKeys we have to send to joining members +// Basically this is the senderkey of all members who joined concatenated with +// the one of members currently in the group. + +// Also, the list of senderkeys for existing member must be empty if there is any leaving members, +// as they each member need to regenerate a new senderkey +async function getOrUpdateSenderKeysForJoiningMembers( groupId: string, - members: Array, - changes: MemberChanges -): Promise { - // 1. Create sender keys for every joining member - const joining = changes.joiningMembers || []; - const leaving = changes.leavingMembers || []; - - let newKeys = await createSenderKeysForMembers(groupId, joining); - - // 2. Get ratchet states for existing members - - const existingMembers = _.difference(members, joining); + members: Array +): Promise> { // get all devices for members - const allDevices = _.flatten( - await Promise.all( - existingMembers.map(m => MultiDeviceProtocol.getAllDevices(m)) - ) + await Promise.all(members.map(m => MultiDeviceProtocol.getAllDevices(m))) ); - let existingKeys: Array = []; - - if (leaving.length > 0) { - // If we have leaving members, we have to re-generate ratchet - // keys for existing members - const otherKeys = await Promise.all( - allDevices.map(async device => { - return createSenderKeyForGroup(groupId, PubKey.cast(device)); - }) - ); - - newKeys = _.union(newKeys, otherKeys); - } else { - // We can reuse existing keys - existingKeys = await getExistingSenderKeysForGroup(groupId, allDevices); - } - - return { existingKeys, newKeys }; + return getExistingSenderKeysForGroup(groupId, allDevices); } async function getGroupSecretKey(groupId: string): Promise { @@ -313,6 +297,9 @@ async function getGroupSecretKey(groupId: string): Promise { } async function syncMediumGroup(group: ConversationModel) { + throw new Error( + 'Medium group syncing must be done once multi device is enabled back' + ); const ourPrimary = await UserUtil.getPrimary(); const groupId = group.get('id'); @@ -343,7 +330,6 @@ async function syncMediumGroup(group: ConversationModel) { members: group.get('members'), is_medium_group: true, admins: group.get('groupAdmins'), - senderKeysContainer, secretKey, }; @@ -409,12 +395,7 @@ export async function initiateGroupUpdate( }; if (isMediumGroup) { - // Send sender keys and group secret key - updateObj.senderKeysContainer = await getOrCreateSenderKeysForUpdate( - groupId, - members, - diff - ); + // Send group secret key const secretKey = await getGroupSecretKey(groupId); updateObj.secretKey = secretKey; @@ -522,7 +503,6 @@ interface GroupInfo { blocked?: boolean; admins?: Array; secretKey?: Uint8Array; - senderKeysContainer?: SenderKeysContainer; } interface UpdatableGroupState { @@ -596,29 +576,28 @@ export function calculateGroupDiff( return groupDiff; } -async function sendGroupUpdateForExistingMembers( - leavingMembers: Array, - remainingMembers: Array, +async function sendGroupUpdateForMedium( + diff: MemberChanges, groupUpdate: GroupInfo, messageId?: string ) { const { id: groupId, members, name: groupName } = groupUpdate; + const ourPrimary = await UserUtil.getPrimary(); + + const leavingMembers = diff.leavingMembers || []; + const joiningMembers = diff.joiningMembers || []; + const wasAnyUserRemoved = leavingMembers.length > 0; + const isUserLeaving = leavingMembers.includes(ourPrimary.key); const membersBin = members.map( (pkHex: string) => new Uint8Array(fromHex(pkHex)) ); const admins = groupUpdate.admins || []; - const adminsBin = admins.map( (pkHex: string) => new Uint8Array(fromHex(pkHex)) ); - // Existing members only receive new sender keys - const senderKeys = groupUpdate.senderKeysContainer - ? groupUpdate.senderKeysContainer.newKeys - : []; - const params = { timestamp: Date.now(), identifier: messageId || uuid(), @@ -626,106 +605,91 @@ async function sendGroupUpdateForExistingMembers( members: membersBin, groupName, admins: adminsBin, - senderKeys, }; - const message = new MediumGroupUpdateMessage(params); + if (wasAnyUserRemoved) { + if (isUserLeaving && leavingMembers.length !== 1) { + window.log.warn("Can't remove self and others simultaneously."); + return; + } + // Send the update to the group (don't include new ratchets as everyone should regenerate new ratchets individually) + const paramsWithoutSenderKeys = { + ...params, + senderKeys: [], + }; - remainingMembers.forEach(async member => { - const memberPubKey = new PubKey(member); - await getMessageQueue().sendUsingMultiDevice(memberPubKey, message); - }); - - // Remove sender keys from the params to send to leaving memebers - params.senderKeys = []; - const strippedMessage = new MediumGroupUpdateMessage(params); - leavingMembers.forEach(async member => { - const memberPubKey = new PubKey(member); - await getMessageQueue().sendUsingMultiDevice(memberPubKey, strippedMessage); - }); -} - -async function sendGroupUpdateForJoiningMembers( - recipients: Array, - groupUpdate: GroupInfo, - messageId?: string -) { - const { id: groupId, name, members } = groupUpdate; - - const now = Date.now(); - - const { secretKey, senderKeysContainer } = groupUpdate; - - if (!secretKey) { - window.log.error('Group secret key not specified, aborting...'); - return; - } - - let senderKeys: Array = []; - if (!senderKeysContainer) { - window.log.warn('Sender keys for joining members not found'); + const messageStripped = new MediumGroupUpdateMessage( + paramsWithoutSenderKeys + ); + window.log.warn('Sending to groupUpdateMessage without senderKeys'); + await getMessageQueue().sendToGroup(messageStripped); } else { - // Joining members should receive all known sender keys - senderKeys = _.union( - senderKeysContainer.existingKeys, - senderKeysContainer.newKeys + let senderKeys: Array; + if (joiningMembers.length > 0) { + // Generate ratchets for any new members + senderKeys = await createSenderKeysForMembers(groupId, joiningMembers); + } else { + // It's not a member change, maybe an name change. So just reuse all senderkeys + senderKeys = await getOrUpdateSenderKeysForJoiningMembers( + groupId, + members + ); + } + const paramsWithSenderKeys = { + ...params, + senderKeys, + }; + // Send a closed group update message to the existing members with the new members' ratchets (this message is aimed at the group) + const message = new MediumGroupUpdateMessage(paramsWithSenderKeys); + window.log.warn( + 'Sending to groupUpdateMessage with joining members senderKeys to groupAddress', + senderKeys ); - } - const membersBin = members.map( - (pkHex: string) => new Uint8Array(fromHex(pkHex)) - ); + await getMessageQueue().sendToGroup(message); - const admins = groupUpdate.admins || []; + // now send a CREATE group message with all senderkeys no matter what to all joining members, using established channels + if (joiningMembers.length) { + const { secretKey } = groupUpdate; - const adminsBin = admins.map( - (pkHex: string) => new Uint8Array(fromHex(pkHex)) - ); + if (!secretKey) { + window.log.error('Group secret key not specified, aborting...'); + return; + } + const allSenderKeys = await getOrUpdateSenderKeysForJoiningMembers( + groupId, + members + ); - const createParams = { - timestamp: now, - groupId, - identifier: messageId || uuid(), - groupSecretKey: secretKey, - members: membersBin, - groupName: name, - admins: adminsBin, - senderKeys, - }; + const createParams = { + timestamp: Date.now(), + identifier: messageId || uuid(), + groupSecretKey: secretKey, + groupId, + members: membersBin, + groupName, + admins: adminsBin, + senderKeys: allSenderKeys, + }; - const mediumGroupCreateMessage = new MediumGroupCreateMessage(createParams); + const mediumGroupCreateMessage = new MediumGroupCreateMessage( + createParams + ); + // console.warn( + // 'sending group create to', + // joiningMembers, + // ' obj: ', + // mediumGroupCreateMessage + // ); - recipients.forEach(async member => { - const memberPubKey = new PubKey(member); - await getMessageQueue().sendUsingMultiDevice( - memberPubKey, - mediumGroupCreateMessage - ); - }); -} - -async function sendGroupUpdateForMedium( - diff: MemberChanges, - groupUpdate: GroupInfo, - messageId?: string -) { - const joining = diff.joiningMembers || []; - const leaving = diff.leavingMembers || []; - - // 1. create group for all joining members (send timeout timer if necessary) - if (joining.length) { - await sendGroupUpdateForJoiningMembers(joining, groupUpdate, messageId); - } - - // 2. send group update to all other members - const others = _.difference(groupUpdate.members, joining); - if (others.length) { - await sendGroupUpdateForExistingMembers( - leaving, - others, - groupUpdate, - messageId - ); + joiningMembers.forEach(async member => { + const memberPubKey = new PubKey(member); + await getMessageQueue().sendUsingMultiDevice( + memberPubKey, + mediumGroupCreateMessage + ); + }); + } } } diff --git a/ts/session/medium_group/ratchet.ts b/ts/session/medium_group/ratchet.ts index 223a16266..2c3180fa7 100644 --- a/ts/session/medium_group/ratchet.ts +++ b/ts/session/medium_group/ratchet.ts @@ -2,6 +2,8 @@ import { PubKey } from '../types'; import * as Data from '../../../js/modules/data'; import { saveSenderKeysInner } from './index'; import { StringUtils } from '../utils'; +import { MediumGroupRequestKeysMessage } from '../messages/outgoing'; +import { getMessageQueue } from '..'; const toHex = (buffer: ArrayBuffer) => StringUtils.decode(buffer, 'hex'); const fromHex = (hex: string) => StringUtils.encode(hex, 'hex'); @@ -14,12 +16,16 @@ async function queueJobForNumber(number: string, runJob: any) { const runCurrent = runPrevious.then(runJob, runJob); jobQueue[number] = runCurrent; // tslint:disable-next-line no-floating-promises - runCurrent.then(() => { - if (jobQueue[number] === runCurrent) { - // tslint:disable-next-line no-dynamic-delete - delete jobQueue[number]; - } - }); + runCurrent + .then(() => { + if (jobQueue[number] === runCurrent) { + // tslint:disable-next-line no-dynamic-delete + delete jobQueue[number]; + } + }) + .catch((e: any) => { + window.log.error('queueJobForNumber() Caught error', e); + }); return runCurrent; } @@ -198,6 +204,11 @@ async function advanceRatchet( log.error('[idx] not found key for idx: ', idx); // I probably want a better error handling than this return null; + } else if (idx === ratchet.keyIdx) { + log.error( + `advanceRatchet() called with idx:${idx}, current ratchetIdx:${ratchet.keyIdx}. We already burnt that keyIdx before.` + ); + return null; } const { messageKeys } = ratchet; @@ -265,11 +276,19 @@ async function decryptWithSenderKeyInner( return null; } - // TODO: this might fail, handle this - const plaintext = await window.libloki.crypto.DecryptGCM( - messageKey, - ciphertext - ); - - return plaintext; + try { + const plaintext = await window.libloki.crypto.DecryptGCM( + messageKey, + ciphertext + ); + return plaintext; + } catch (e) { + window.log.error('Got error during DecryptGCM()', e); + if (e instanceof DOMException) { + window.log.error( + 'Got DOMException during DecryptGCM(). Rethrowing as SenderKeyMissing ' + ); + throw new window.textsecure.SenderKeyMissing(senderIdentity); + } + } } diff --git a/ts/session/medium_group/senderKeys.ts b/ts/session/medium_group/senderKeys.ts index 5c645e557..b48a2f17b 100644 --- a/ts/session/medium_group/senderKeys.ts +++ b/ts/session/medium_group/senderKeys.ts @@ -1,6 +1,8 @@ import { PubKey } from '../types'; import { StringUtils } from '../utils'; import * as Data from '../../../js/modules/data'; +import { MediumGroupResponseKeysMessage } from '../messages/outgoing'; +import { getMessageQueue } from '..'; const toHex = (buffer: ArrayBuffer) => StringUtils.decode(buffer, 'hex'); const fromHex = (hex: string) => StringUtils.encode(hex, 'hex'); @@ -86,3 +88,20 @@ export async function saveSenderKeys( messageKeys ); } + +export async function shareSenderKeys( + groupId: string, + recipientsPrimary: Array, + senderKey: RatchetState +) { + const message = new MediumGroupResponseKeysMessage({ + timestamp: Date.now(), + groupId, + senderKey, + }); + + const recipients = recipientsPrimary.map(pk => PubKey.cast(pk)); + await Promise.all( + recipients.map(pk => getMessageQueue().sendUsingMultiDevice(pk, message)) + ); +} diff --git a/ts/session/messages/outgoing/content/data/ChatMessage.ts b/ts/session/messages/outgoing/content/data/ChatMessage.ts index 3f07a3de4..83026306c 100644 --- a/ts/session/messages/outgoing/content/data/ChatMessage.ts +++ b/ts/session/messages/outgoing/content/data/ChatMessage.ts @@ -108,7 +108,7 @@ export class ChatMessage extends DataMessage { } dataMessage.profile = profile; } - if (this.profileKey) { + if (this.profileKey && this.profileKey.length) { dataMessage.profileKey = this.profileKey; } diff --git a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts index 3a25caa7b..88eb245f4 100644 --- a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts +++ b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts @@ -37,9 +37,13 @@ export class ExpirationTimerUpdateMessage extends DataMessage { if (this.groupId) { const groupMessage = new SignalService.GroupContext(); - groupMessage.id = new Uint8Array( - StringUtils.encode(this.groupId.key, 'utf8') - ); + let groupIdWithPrefix: string = this.groupId.key; + if (!this.groupId.key.startsWith(PubKey.PREFIX_GROUP_TEXTSECURE)) { + groupIdWithPrefix = PubKey.PREFIX_GROUP_TEXTSECURE + this.groupId.key; + } + const encoded = StringUtils.encode(groupIdWithPrefix, 'utf8'); + const id = new Uint8Array(encoded); + groupMessage.id = id; groupMessage.type = SignalService.GroupContext.Type.DELIVER; data.group = groupMessage; @@ -48,7 +52,7 @@ export class ExpirationTimerUpdateMessage extends DataMessage { if (this.expireTimer) { data.expireTimer = this.expireTimer; } - if (this.profileKey) { + if (this.profileKey && this.profileKey.length) { data.profileKey = this.profileKey; } diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts index 9b6c80704..c17fdbe4f 100644 --- a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts @@ -32,7 +32,12 @@ export abstract class ClosedGroupMessage extends DataMessage { } protected groupContext(): SignalService.GroupContext { - const id = new Uint8Array(StringUtils.encode(this.groupId.key, 'utf8')); + let groupIdWithPrefix: string = this.groupId.key; + if (!this.groupId.key.startsWith(PubKey.PREFIX_GROUP_TEXTSECURE)) { + groupIdWithPrefix = PubKey.PREFIX_GROUP_TEXTSECURE + this.groupId.key; + } + const encoded = StringUtils.encode(groupIdWithPrefix, 'utf8'); + const id = new Uint8Array(encoded); return new SignalService.GroupContext({ id }); } diff --git a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupChatMessage.ts b/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupChatMessage.ts index 1d5021c16..5cbeb8625 100644 --- a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupChatMessage.ts +++ b/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupChatMessage.ts @@ -1,7 +1,6 @@ -import { SignalService } from '../../../../../../protobuf'; import { ChatMessage } from '../ChatMessage'; import { PubKey } from '../../../../../types'; -import { MediumGroupMessage } from './MediumGroupMessage'; +import { ClosedGroupChatMessage } from '../group/ClosedGroupChatMessage'; interface MediumGroupChatMessageParams { identifier?: string; @@ -9,21 +8,12 @@ interface MediumGroupChatMessageParams { chatMessage: ChatMessage; } -export class MediumGroupChatMessage extends MediumGroupMessage { - private readonly chatMessage: ChatMessage; - +export class MediumGroupChatMessage extends ClosedGroupChatMessage { constructor(params: MediumGroupChatMessageParams) { super({ - timestamp: params.chatMessage.timestamp, identifier: params.identifier ?? params.chatMessage.identifier, groupId: params.groupId, + chatMessage: params.chatMessage, }); - this.chatMessage = params.chatMessage; - } - - public dataProto(): SignalService.DataMessage { - const messageProto = this.chatMessage.dataProto(); - - return messageProto; } } diff --git a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage.ts b/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage.ts deleted file mode 100644 index 42d6e9f9b..000000000 --- a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SignalService } from '../../../../../../protobuf'; -import { MediumGroupMessage } from '.'; - -export class MediumGroupQuitMessage extends MediumGroupMessage { - protected mediumGroupContext(): SignalService.MediumGroupUpdate { - const mediumGroupContext = super.mediumGroupContext(); - - mediumGroupContext.type = SignalService.MediumGroupUpdate.Type.QUIT; - - return mediumGroupContext; - } -} diff --git a/ts/session/sending/MessageQueue.ts b/ts/session/sending/MessageQueue.ts index a92248378..ca495f63c 100644 --- a/ts/session/sending/MessageQueue.ts +++ b/ts/session/sending/MessageQueue.ts @@ -7,6 +7,8 @@ import { ClosedGroupMessage, ContentMessage, ExpirationTimerUpdateMessage, + MediumGroupChatMessage, + MediumGroupMessage, OpenGroupMessage, SessionRequestMessage, SyncMessage, @@ -51,7 +53,7 @@ export class MessageQueue implements MessageQueueInterface { } public async sendToGroup( - message: OpenGroupMessage | ContentMessage + message: OpenGroupMessage | ContentMessage | MediumGroupMessage ): Promise { // Open groups if (message instanceof OpenGroupMessage) { @@ -62,13 +64,14 @@ export class MessageQueue implements MessageQueueInterface { try { const result = await MessageSender.sendToOpenGroup(message); // sendToOpenGroup returns -1 if failed or an id if succeeded - if (result < 0) { + if (result.serverId < 0) { this.events.emit('fail', message, error); } else { const messageEventData = { pubKey: message.group.groupId, timestamp: message.timestamp, - serverId: result, + serverId: result.serverId, + serverTimestamp: result.serverTimestamp, }; this.events.emit('success', message); @@ -92,11 +95,20 @@ export class MessageQueue implements MessageQueueInterface { groupId = message.groupId; } else if (message instanceof ExpirationTimerUpdateMessage) { groupId = message.groupId; + } else if (message instanceof MediumGroupMessage) { + groupId = message.groupId; } if (!groupId) { throw new Error('Invalid group message passed in sendToGroup.'); } + // if this is a medium group message. We just need to send to the group pubkey + if ( + message instanceof MediumGroupMessage || + message instanceof MediumGroupChatMessage + ) { + return this.send(PubKey.cast(groupId), message); + } // Get devices in group let recipients = await GroupUtils.getGroupMembers(groupId); @@ -151,8 +163,8 @@ export class MessageQueue implements MessageQueueInterface { // We put the event handling inside this job to avoid sending duplicate events const job = async () => { try { - await MessageSender.send(message); - this.events.emit('success', message); + const wrappedEnvelope = await MessageSender.send(message); + this.events.emit('success', message, wrappedEnvelope); } catch (e) { this.events.emit('fail', message, e); } finally { diff --git a/ts/session/sending/MessageQueueInterface.ts b/ts/session/sending/MessageQueueInterface.ts index 3fb6df28a..596b84bea 100644 --- a/ts/session/sending/MessageQueueInterface.ts +++ b/ts/session/sending/MessageQueueInterface.ts @@ -1,6 +1,7 @@ import { ClosedGroupMessage, ContentMessage, + MediumGroupMessage, OpenGroupMessage, SyncMessage, } from '../messages/outgoing'; @@ -8,10 +9,16 @@ import { RawMessage } from '../types/RawMessage'; import { TypedEventEmitter } from '../utils'; import { PubKey } from '../types'; -type GroupMessageType = OpenGroupMessage | ClosedGroupMessage; +type GroupMessageType = + | OpenGroupMessage + | ClosedGroupMessage + | MediumGroupMessage; export interface MessageQueueInterfaceEvents { - success: (message: RawMessage | OpenGroupMessage) => void; + success: ( + message: RawMessage | OpenGroupMessage, + wrappedEnvelope?: Uint8Array + ) => void; fail: (message: RawMessage | OpenGroupMessage, error: Error) => void; } diff --git a/ts/session/sending/MessageSender.ts b/ts/session/sending/MessageSender.ts index 835f9468f..374fc2d10 100644 --- a/ts/session/sending/MessageSender.ts +++ b/ts/session/sending/MessageSender.ts @@ -27,7 +27,7 @@ export function canSendToSnode(): boolean { export async function send( message: RawMessage, attempts: number = 3 -): Promise { +): Promise { if (!canSendToSnode()) { throw new Error('lokiMessageAPI is not initialized.'); } @@ -39,12 +39,20 @@ export async function send( plainTextBuffer, encryption ); - const envelope = await buildEnvelope(envelopeType, timestamp, cipherText); + const envelope = await buildEnvelope( + envelopeType, + device.key, + timestamp, + cipherText + ); + // console.warn('sending', envelope, ' to ', device.key); const data = wrapEnvelope(envelope); return pRetry( - async () => - window.lokiMessageAPI.sendMessage(device.key, data, timestamp, ttl), + async () => { + await window.lokiMessageAPI.sendMessage(device.key, data, timestamp, ttl); + return data; + }, { retries: Math.max(attempts - 1, 0), factor: 1, @@ -54,11 +62,15 @@ export async function send( async function buildEnvelope( type: SignalService.Envelope.Type, + sskSource: string | undefined, timestamp: number, content: Uint8Array ): Promise { let source: string | undefined; - if (type !== SignalService.Envelope.Type.UNIDENTIFIED_SENDER) { + + if (type === SignalService.Envelope.Type.MEDIUM_GROUP_CIPHERTEXT) { + source = sskSource; + } else if (type !== SignalService.Envelope.Type.UNIDENTIFIED_SENDER) { source = await UserUtil.getCurrentDevicePubKey(); } @@ -98,7 +110,7 @@ function wrapEnvelope(envelope: SignalService.Envelope): Uint8Array { */ export async function sendToOpenGroup( message: OpenGroupMessage -): Promise { +): Promise<{ serverId: number; serverTimestamp: number }> { /* Note: Retrying wasn't added to this but it can be added in the future if needed. The only problem is that `channelAPI.sendMessage` returns true/false and doesn't throw any error so we can never be sure why sending failed. @@ -112,7 +124,7 @@ export async function sendToOpenGroup( ); if (!channelAPI) { - return -1; + return { serverId: -1, serverTimestamp: -1 }; } // Returns -1 on fail or an id > 0 on success diff --git a/ts/session/snode_api/lokiRpc.ts b/ts/session/snode_api/lokiRpc.ts index 8b9559d3e..0151643bd 100644 --- a/ts/session/snode_api/lokiRpc.ts +++ b/ts/session/snode_api/lokiRpc.ts @@ -30,15 +30,12 @@ async function lokiPlainFetch( if (!response.ok) { throw new window.textsecure.HTTPError('Loki_rpc error', response); } + const result = await response.text(); - let result; - if (response.headers.get('Content-Type') === 'application/json') { - result = await response.json(); - } else { - result = await response.text(); - } - - return result; + return { + body: result, + status: response.status, + }; } interface FetchOptions { @@ -88,7 +85,7 @@ export async function snodeRpc( params: any, targetNode: Snode ): Promise { - const url = `https://${targetNode.ip}${targetNode.port}/storage_rpc/v1`; + const url = `https://${targetNode.ip}:${targetNode.port}/storage_rpc/v1`; // TODO: The jsonrpc and body field will be ignored on storage server if (params.pubKey) { diff --git a/ts/session/snode_api/onions.ts b/ts/session/snode_api/onions.ts index 176f4c23b..a7987e3cc 100644 --- a/ts/session/snode_api/onions.ts +++ b/ts/session/snode_api/onions.ts @@ -170,7 +170,7 @@ const processOnionResponse = async ( return RequestError.OTHER; } - const ciphertext = await response.text(); + let ciphertext = await response.text(); if (!ciphertext) { log.warn( `(${reqIdx}) [path] lokiRpc::processOnionResponse - Target node return empty ciphertext` @@ -186,6 +186,13 @@ const processOnionResponse = async ( let plaintext; let ciphertextBuffer; + + try { + const jsonRes = JSON.parse(ciphertext); + ciphertext = jsonRes.result; + } catch (e) { + // just try to get a json object from what is inside (for PN requests), if it fails, continue () + } try { ciphertextBuffer = dcodeIO.ByteBuffer.wrap( ciphertext, diff --git a/ts/session/snode_api/serviceNodeAPI.ts b/ts/session/snode_api/serviceNodeAPI.ts index 7dad5fdee..ea7d610f3 100644 --- a/ts/session/snode_api/serviceNodeAPI.ts +++ b/ts/session/snode_api/serviceNodeAPI.ts @@ -3,7 +3,6 @@ import https from 'https'; import fetch from 'node-fetch'; -import { PubKey } from '../types'; import { snodeRpc } from './lokiRpc'; import { sendOnionRequestLsrpcDest, SnodeResponse } from './onions'; @@ -328,6 +327,15 @@ export async function storeOnNode( return false; } else if (e instanceof textsecure.WrongDifficultyError) { const { newDifficulty } = e; + // difficulty of 100 happens when a snode restarts. We have to exit the loop and markNodeUnreachable() + if (newDifficulty === 100) { + log.warn( + 'loki_message:::storeOnNode - invalid new difficulty:100. Marking node as bad.' + ); + successiveFailures = MAX_ACCEPTABLE_FAILURES; + continue; + } + if (!Number.isNaN(newDifficulty)) { window.storage.put('PoWDifficulty', newDifficulty); } @@ -387,6 +395,8 @@ export async function retrieveNextMessages( const json = JSON.parse(res.body); return json.messages || []; } catch (e) { + window.log.warn('exception while parsing json of nextMessage:', e); + return []; } } diff --git a/ts/session/snode_api/swarmPolling.ts b/ts/session/snode_api/swarmPolling.ts index b481bd4ed..0f3407c27 100644 --- a/ts/session/snode_api/swarmPolling.ts +++ b/ts/session/snode_api/swarmPolling.ts @@ -21,7 +21,6 @@ export function processMessage(message: string, options: any = {}) { try { const dataPlaintext = new Uint8Array(StringUtils.encode(message, 'base64')); const messageBuf = SignalService.WebSocketMessage.decode(dataPlaintext); - if (messageBuf.type === SignalService.WebSocketMessage.Type.REQUEST) { // tslint:disable-next-line no-floating-promises Receiver.handleRequest(messageBuf.request?.body, options); @@ -48,17 +47,20 @@ export class SwarmPolling { public async start(): Promise { this.loadGroupIds(); - // tslint:disable: no-floating-promises - this.pollForAllKeys(); + void this.pollForAllKeys(); } public addGroupId(pubkey: PubKey) { - this.groupPubkeys.push(pubkey); + if (this.groupPubkeys.findIndex(m => m.key === pubkey.key) === -1) { + this.groupPubkeys.push(pubkey); + } } public addPubkey(pk: PubKey | string) { const pubkey = PubKey.cast(pk); - this.pubkeys.push(pubkey); + if (this.pubkeys.findIndex(m => m.key === pubkey.key) === -1) { + this.pubkeys.push(pubkey); + } } public removePubkey(pk: PubKey | string) { @@ -133,7 +135,7 @@ export class SwarmPolling { const lastMessage = _.last(messages); - this.updateLastHash( + await this.updateLastHash( edkey, pubkey, lastMessage.hash, @@ -187,10 +189,13 @@ export class SwarmPolling { const groupPromises = this.groupPubkeys.map(async pk => { return this.pollOnceForKey(pk, true); }); - - await Promise.all(_.concat(directPromises, groupPromises)); - - setTimeout(this.pollForAllKeys.bind(this), 2000); + try { + await Promise.all(_.concat(directPromises, groupPromises)); + } catch (e) { + window.log.warn('pollForAllKeys swallowing exception: ', e); + } finally { + setTimeout(this.pollForAllKeys.bind(this), 2000); + } } private async updateLastHash( diff --git a/ts/session/types/OpenGroup.ts b/ts/session/types/OpenGroup.ts index 290e1c7f9..e8fd0f2e2 100644 --- a/ts/session/types/OpenGroup.ts +++ b/ts/session/types/OpenGroup.ts @@ -1,4 +1,5 @@ import { ConversationModel } from '../../../js/models/conversations'; +import { PromiseUtils } from '../utils'; interface OpenGroupParams { server: string; @@ -126,8 +127,14 @@ export class OpenGroup { onLoading(); } - conversation = await window.attemptConnection(prefixedServer, channel); - conversationId = conversation?.cid; + conversation = await PromiseUtils.timeout( + window.attemptConnection(prefixedServer, channel), + 15000 + ); + if (!conversation) { + throw new Error(window.i18n('connectToServerFail')); + } + conversationId = (conversation as any)?.cid; } catch (e) { throw new Error(e); } diff --git a/ts/session/types/PubKey.ts b/ts/session/types/PubKey.ts index d3fbb7c0c..7e63b32e9 100644 --- a/ts/session/types/PubKey.ts +++ b/ts/session/types/PubKey.ts @@ -1,17 +1,29 @@ export class PubKey { public static readonly PUBKEY_LEN = 66; + private static readonly HEX = '[0-9a-fA-F]'; + // This is a temporary fix to allow groupPubkeys created from mobile to be handled correctly // They have a different regex to match // FIXME move this to a new class which validates group ids and use it in all places where we have group ids (message sending included) - public static readonly MOBILE_GROUP_PUBKEY_LEN = 32; - public static readonly regexForPubkeys = `((05)?[0-9a-fA-F]{${PubKey.PUBKEY_LEN - - 2}})`; - - private static readonly regexForMobileGroupID = `__textsecure_group__![0-9a-fA-F]{${PubKey.MOBILE_GROUP_PUBKEY_LEN}}`; + // tslint:disable: member-ordering + public static readonly regexForPubkeys = `((05)?${PubKey.HEX}{64})`; + public static readonly PREFIX_GROUP_TEXTSECURE = '__textsecure_group__!'; // prettier-ignore private static readonly regex: RegExp = new RegExp( - `^${PubKey.regexForPubkeys}|${PubKey.regexForMobileGroupID}$` + `^(${PubKey.PREFIX_GROUP_TEXTSECURE})?(05)?(${PubKey.HEX}{64}|${PubKey.HEX}{32})$` ); + /** + * If you want to update this regex. Be sure that those are matches ; + * __textsecure_group__!05010203040506070809a0b0c0d0e0f0ff010203040506070809a0b0c0d0e0f0ff + * __textsecure_group__!010203040506070809a0b0c0d0e0f0ff010203040506070809a0b0c0d0e0f0ff + * __textsecure_group__!05010203040506070809a0b0c0d0e0f0ff + * __textsecure_group__!010203040506070809a0b0c0d0e0f0ff + * 05010203040506070809a0b0c0d0e0f0ff010203040506070809a0b0c0d0e0f0ff + * 010203040506070809a0b0c0d0e0f0ff010203040506070809a0B0c0d0e0f0FF + * 05010203040506070809a0b0c0d0e0f0ff + * 010203040506070809a0b0c0d0e0f0ff + */ + public readonly key: string; /** diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 165056090..812cca30c 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -9,9 +9,7 @@ function showTimerOptions( isKickedFromGroup: boolean, isBlocked: boolean ): boolean { - return ( - Boolean(!isPublic) && Boolean(!isRss) && !isKickedFromGroup && !isBlocked - ); + return !isPublic && !isRss && !isKickedFromGroup && !isBlocked; } function showMemberMenu( @@ -19,7 +17,7 @@ function showMemberMenu( isRss: boolean, isGroup: boolean ): boolean { - return Boolean(!isPublic) && Boolean(!isRss) && isGroup; + return !isPublic && !isRss && isGroup; } function showSafetyNumber( @@ -28,92 +26,85 @@ function showSafetyNumber( isGroup: boolean, isMe: boolean ): boolean { - return Boolean(!isPublic) && Boolean(!isRss) && !isGroup && !isMe; + return !isPublic && !isRss && !isGroup && !isMe; } function showResetSession( isPublic: boolean, isRss: boolean, - isGroup: boolean + isGroup: boolean, + isBlocked: boolean ): boolean { - return Boolean(!isPublic) && Boolean(!isRss) && Boolean(!isGroup); + return !isPublic && !isRss && !isGroup && !isBlocked; } -function showBlock( - isMe: boolean | undefined, - isPrivate: boolean | undefined -): boolean { - return Boolean(!isMe) && Boolean(isPrivate); +function showBlock(isMe: boolean, isPrivate: boolean): boolean { + return !isMe && isPrivate; } function showClearNickname( - isPublic: boolean | undefined, - isRss: boolean | undefined, - isMe: boolean | undefined, - hasNickname: boolean | undefined + isPublic: boolean, + isRss: boolean, + isMe: boolean, + hasNickname: boolean ): boolean { - return ( - Boolean(!isPublic) && - Boolean(!isRss) && - Boolean(!isMe) && - Boolean(hasNickname) - ); + return !isPublic && !isRss && !isMe && hasNickname; +} + +function showDeleteMessages(isPublic: boolean): boolean { + return !isPublic; } function showCopyId( - isPublic: boolean | undefined, - isRss: boolean | undefined + isPublic: boolean, + isRss: boolean, + isGroup: boolean ): boolean { - return Boolean(!isPublic) && Boolean(!isRss); + return !isGroup && !isRss; } function showDeleteContact( - isMe: boolean | undefined, - isClosable: boolean | undefined, - isGroup: boolean | undefined, - isPublic: boolean | undefined, - isRss: boolean | undefined + isMe: boolean, + isClosable: boolean, + isGroup: boolean, + isPublic: boolean, + isRss: boolean ): boolean { - return ( - Boolean(!isMe) && Boolean(isClosable) && !!(!isGroup || isPublic || isRss) - ); + return !isMe && isClosable && !!(!isGroup || isPublic || isRss); } function showAddModerators( - amMod: boolean | undefined, - isKickedFromGroup: boolean | undefined + amMod: boolean, + isKickedFromGroup: boolean ): boolean { - return Boolean(!isKickedFromGroup) && Boolean(amMod); + return !isKickedFromGroup && amMod; } function showRemoveModerators( - amMod: boolean | undefined, - isKickedFromGroup: boolean | undefined + amMod: boolean, + isKickedFromGroup: boolean ): boolean { - return Boolean(!isKickedFromGroup) && Boolean(amMod); + return !isKickedFromGroup && amMod; } function showUpdateGroupName( - amMod: boolean | undefined, - isKickedFromGroup: boolean | undefined + amMod: boolean, + isKickedFromGroup: boolean ): boolean { - return Boolean(!isKickedFromGroup) && Boolean(amMod); + return !isKickedFromGroup && amMod; } function showLeaveGroup( - isKickedFromGroup: boolean | undefined, - isGroup: boolean | undefined, - isPublic: boolean | undefined, - isRss: boolean | undefined + isKickedFromGroup: boolean, + isGroup: boolean, + isPublic: boolean, + isRss: boolean ): boolean { - return Boolean(!isKickedFromGroup) && Boolean(isGroup) && !isPublic && !isRss; + return !isKickedFromGroup && isGroup && !isPublic && !isRss; } -function showInviteContact( - isGroup: boolean | undefined, - isPublic: boolean | undefined -): boolean { - return Boolean(isGroup) && Boolean(isPublic); +function showInviteContact(isGroup: boolean, isPublic: boolean): boolean { + return isGroup && isPublic; } /** Menu items standardized */ @@ -124,7 +115,7 @@ export function getInviteContactMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showInviteContact(isGroup, isPublic)) { + if (showInviteContact(Boolean(isGroup), Boolean(isPublic))) { return {i18n('inviteContacts')}; } return null; @@ -139,11 +130,19 @@ export function getDeleteContactMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showDeleteContact(isMe, isClosable, isGroup, isPublic, isRss)) { + if ( + showDeleteContact( + Boolean(isMe), + Boolean(isClosable), + Boolean(isGroup), + Boolean(isPublic), + Boolean(isRss) + ) + ) { if (isPublic) { - return {i18n('leaveOpenGroup')}; + return {i18n('leaveGroup')}; } - return {i18n('deleteContact')}; + return {i18n('delete')}; } return null; } @@ -156,8 +155,15 @@ export function getLeaveGroupMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showLeaveGroup(isKickedFromGroup, isGroup, isPublic, isRss)) { - return {i18n('leaveClosedGroup')}; + if ( + showLeaveGroup( + Boolean(isKickedFromGroup), + Boolean(isGroup), + Boolean(isPublic), + Boolean(isRss) + ) + ) { + return {i18n('leaveGroup')}; } return null; } @@ -168,10 +174,8 @@ export function getUpdateGroupNameMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showUpdateGroupName(amMod, isKickedFromGroup)) { - return ( - {i18n('editGroupNameOrPicture')} - ); + if (showUpdateGroupName(Boolean(amMod), Boolean(isKickedFromGroup))) { + return {i18n('editGroup')}; } return null; } @@ -182,7 +186,7 @@ export function getRemoveModeratorsMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showRemoveModerators(amMod, isKickedFromGroup)) { + if (showRemoveModerators(Boolean(amMod), Boolean(isKickedFromGroup))) { return {i18n('removeModerators')}; } return null; @@ -194,21 +198,21 @@ export function getAddModeratorsMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showAddModerators(amMod, isKickedFromGroup)) { + if (showAddModerators(Boolean(amMod), Boolean(isKickedFromGroup))) { return {i18n('addModerators')}; } return null; } -export function getCopyIdMenuItem( +export function getCopyMenuItem( isPublic: boolean | undefined, isRss: boolean | undefined, isGroup: boolean | undefined, action: any, i18n: LocalizerType ): JSX.Element | null { - if (showCopyId(isPublic, isRss)) { - const copyIdLabel = isGroup ? i18n('copyChatId') : i18n('copyPublicKey'); + if (showCopyId(Boolean(isPublic), Boolean(isRss), Boolean(isGroup))) { + const copyIdLabel = i18n('copySessionID'); return {copyIdLabel}; } return null; @@ -231,8 +235,13 @@ export function getDisappearingMenuItem( Boolean(isBlocked) ) ) { + const isRtlMode = isRtlBody(); return ( - + // Remove the && false to make context menu work with RTL support + {(timerOptions || []).map(item => ( {i18n('showMembers')}; + return {i18n('groupMembers')}; } return null; } @@ -287,10 +300,18 @@ export function getResetSessionMenuItem( isPublic: boolean | undefined, isRss: boolean | undefined, isGroup: boolean | undefined, + isBlocked: boolean | undefined, action: any, i18n: LocalizerType ): JSX.Element | null { - if (showResetSession(Boolean(isPublic), Boolean(isRss), Boolean(isGroup))) { + if ( + showResetSession( + Boolean(isPublic), + Boolean(isRss), + Boolean(isGroup), + Boolean(isBlocked) + ) + ) { return {i18n('resetSession')}; } return null; @@ -332,3 +353,14 @@ export function getClearNicknameMenuItem( } return null; } + +export function getDeleteMessagesMenuItem( + isPublic: boolean | undefined, + action: any, + i18n: LocalizerType +): JSX.Element | null { + if (showDeleteMessages(Boolean(isPublic))) { + return {i18n('deleteMessages')}; + } + return null; +} diff --git a/ts/session/utils/Messages.ts b/ts/session/utils/Messages.ts index 5169afdd7..3d84b0c59 100644 --- a/ts/session/utils/Messages.ts +++ b/ts/session/utils/Messages.ts @@ -6,6 +6,7 @@ import { } from '../messages/outgoing'; import { EncryptionType, PubKey } from '../types'; import { SessionProtocol } from '../protocols'; +import { MediumGroupUpdateMessage } from '../messages/outgoing/content/data/mediumgroup/MediumGroupUpdateMessage'; export async function toRawMessage( device: PubKey, @@ -16,7 +17,10 @@ export async function toRawMessage( const plainTextBuffer = message.plainTextBuffer(); let encryption: EncryptionType; - if (message instanceof MediumGroupChatMessage) { + if ( + message instanceof MediumGroupChatMessage || + message instanceof MediumGroupUpdateMessage + ) { encryption = EncryptionType.MediumGroup; } else if (message instanceof SessionRequestMessage) { encryption = EncryptionType.Fallback; diff --git a/ts/session/utils/Number.ts b/ts/session/utils/Number.ts index 0948dcd67..d62d37a95 100644 --- a/ts/session/utils/Number.ts +++ b/ts/session/utils/Number.ts @@ -1,33 +1,4 @@ -type TimeUnit = - | 'second' - | 'seconds' - | 'minute' - | 'minutes' - | 'hour' - | 'hours' - | 'day' - | 'days'; - export const MINUTES = 60 * 1000; // in ms // tslint:disable: binary-expression-operand-order export const HOURS = 60 * MINUTES; // in ms export const DAYS = 24 * HOURS; // in ms - -export const msAsUnit = (value: number, unit: TimeUnit) => { - // Converts milliseconds to your preferred unit - // Valid units: second(s), minute(s), hour(s), day(s) - const unitAsSingular = unit.replace(new RegExp('s?$'), ''); - - switch (unitAsSingular) { - case 'second': - return value / 1000; - case 'minute': - return value / 60 / 1000; - case 'hour': - return value / 60 / 60 / 1000; - case 'day': - return value / 24 / 60 / 60 / 1000; - default: - return value; - } -}; diff --git a/ts/session/utils/Promise.ts b/ts/session/utils/Promise.ts index 9019ff282..237938e77 100644 --- a/ts/session/utils/Promise.ts +++ b/ts/session/utils/Promise.ts @@ -14,13 +14,13 @@ async function toPromise(value: Return): Promise { */ export async function waitForTask( task: (done: SimpleFunction) => Return, - timeout: number = 2000 + timeoutMs: number = 2000 ): Promise { const timeoutPromise = new Promise((_, rej) => { const wait = setTimeout(() => { clearTimeout(wait); rej(new Error('Task timed out.')); - }, timeout); + }, timeoutMs); }); const taskPromise = new Promise(async (res, rej) => { @@ -35,7 +35,7 @@ export async function waitForTask( } export interface PollOptions { - timeout: number; + timeoutMs: number; interval: number; } @@ -51,16 +51,16 @@ export async function poll( options: Partial = {} ): Promise { const defaults: PollOptions = { - timeout: 2000, + timeoutMs: 2000, interval: 100, }; - const { timeout, interval } = { + const { timeoutMs, interval } = { ...defaults, ...options, }; - const endTime = Date.now() + timeout; + const endTime = Date.now() + timeoutMs; let stop = false; const finish = () => { stop = true; @@ -101,7 +101,7 @@ export async function poll( */ export async function waitUntil( check: () => Return, - timeout: number = 2000 + timeoutMs: number = 2000 ) { // This is causing unhandled promise rejection somewhere in MessageQueue tests return poll( @@ -112,8 +112,22 @@ export async function waitUntil( } }, { - timeout, - interval: timeout / 20, + timeoutMs, + interval: timeoutMs / 20, } ); } + +export async function timeout( + promise: Promise, + timeoutMs: number = 2000 +): Promise { + const timeoutPromise = new Promise((_, rej) => { + const wait = setTimeout(() => { + clearTimeout(wait); + rej(new Error('Task timed out.')); + }, timeoutMs); + }); + + return Promise.race([timeoutPromise, promise]); +} diff --git a/ts/session/utils/Toast.ts b/ts/session/utils/Toast.ts new file mode 100644 index 000000000..bf2edb945 --- /dev/null +++ b/ts/session/utils/Toast.ts @@ -0,0 +1,10 @@ +export function push(options: { + title: string; + id?: string; + description?: string; + type?: 'success' | 'info' | 'warning' | 'error'; + icon?: string; + shouldFade?: boolean; +}) { + window.pushToast(options); +} diff --git a/ts/session/utils/index.ts b/ts/session/utils/index.ts index b38705d0e..bf9e1f969 100644 --- a/ts/session/utils/index.ts +++ b/ts/session/utils/index.ts @@ -6,6 +6,7 @@ import * as NumberUtils from './Number'; import * as PromiseUtils from './Promise'; import * as ProtobufUtils from './Protobuf'; import * as MenuUtils from './Menu'; +import * as ToastUtils from './Toast'; export * from './Attachments'; export * from './TypedEmitter'; @@ -20,4 +21,5 @@ export { PromiseUtils, ProtobufUtils, MenuUtils, + ToastUtils, }; diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts index 2b99adff6..6af8c779f 100644 --- a/ts/state/selectors/conversations.ts +++ b/ts/state/selectors/conversations.ts @@ -48,7 +48,7 @@ function getConversationTitle( if (conversation.type === 'group') { const { i18n } = options; - return i18n('unknownGroup'); + return i18n('unknown'); } return format(conversation.phoneNumber, options); @@ -108,12 +108,8 @@ export const _getLeftPaneLists = ( const archivedConversations: Array = []; const allContacts: Array = []; - const max = sorted.length; let unreadCount = 0; - - for (let i = 0; i < max; i += 1) { - let conversation = sorted[i]; - + for (let conversation of sorted) { if (selectedConversation === conversation.id) { conversation = { ...conversation, @@ -197,7 +193,6 @@ export const _getLeftPaneLists = ( }; const contacts: Array = filterToPrimary(allContacts); - return { conversations, archivedConversations, diff --git a/integration_test/add_friends_test.js b/ts/test/session/integration/add_contacts_itest.ts similarity index 54% rename from integration_test/add_friends_test.js rename to ts/test/session/integration/add_contacts_itest.ts index 400da84ee..9c1b8429d 100644 --- a/integration_test/add_friends_test.js +++ b/ts/test/session/integration/add_contacts_itest.ts @@ -1,64 +1,69 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const common = require('./common'); -const ConversationPage = require('./page-objects/conversation.page'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; -describe('Add friends', function() { - let app; - let app2; +import ConversationPage from './page-objects/conversation.page'; + +describe('Add contact', function() { this.timeout(60000); - this.slow(15000); + this.slow(20000); + let app: Application; + let app2: Application; beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); const app1Props = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, + displayName: Common.TEST_DISPLAY_NAME1, }; const app2Props = { - mnemonic: common.TEST_MNEMONIC2, - displayName: common.TEST_DISPLAY_NAME2, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_2, + displayName: Common.TEST_DISPLAY_NAME2, }; [app, app2] = await Promise.all([ - common.startAndStub(app1Props), - common.startAndStubN(app2Props, 2), + Common.startAndStub(app1Props), + Common.startAndStubN(app2Props, 2), ]); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.stopApp(app); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); - it('addFriends: can add a friend by sessionID', async () => { - const textMessage = common.generateSendMessageText(); + it('addContacts: can add a contact by sessionID', async () => { + const textMessage = Common.generateSendMessageText(); await app.client.element(ConversationPage.contactsButtonSection).click(); await app.client.element(ConversationPage.addContactButton).click(); await app.client.isExisting(ConversationPage.leftPaneOverlay).should .eventually.be.true; - await common.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.sessionIDInput, - common.TEST_PUBKEY2 + Common.TEST_PUBKEY2 ); await app.client .element(ConversationPage.sessionIDInput) .getValue() - .should.eventually.equal(common.TEST_PUBKEY2); + .should.eventually.equal(Common.TEST_PUBKEY2); await app.client.element(ConversationPage.nextButton).click(); await app.client.waitForExist(ConversationPage.sendMessageTextarea, 1000); - // send a text message to that user (will be a friend request) + // send a text message to that user await app.client .element(ConversationPage.sendMessageTextarea) .setValue(textMessage); @@ -68,8 +73,8 @@ describe('Add friends', function() { 1000 ); - // assure friend request message has been sent - await common.timeout(3000); + // assure session request message has been sent + await Common.timeout(3000); await app.client.isExisting(ConversationPage.retrySendButton).should .eventually.be.false; diff --git a/integration_test/closed_group_test.js b/ts/test/session/integration/closed_group_itest.ts similarity index 61% rename from integration_test/closed_group_test.js rename to ts/test/session/integration/closed_group_itest.ts index 49aabf0f1..c6023c713 100644 --- a/integration_test/closed_group_test.js +++ b/ts/test/session/integration/closed_group_itest.ts @@ -1,37 +1,42 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); -const common = require('./common'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const ConversationPage = require('./page-objects/conversation.page'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +import ConversationPage from './page-objects/conversation.page'; describe('Closed groups', function() { - let app; - let app2; this.timeout(60000); - this.slow(15000); + this.slow(20000); + let app: Application; + let app2: Application; beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); - [app, app2] = await common.startAppsAsFriends(); + [app, app2] = await Common.startAppsAsFriends(); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.stopApp(app); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); it('closedGroup: can create a closed group with a friend and send/receive a message', async () => { const useSenderKeys = false; // create group and add new friend - await common.addFriendToNewClosedGroup([app, app2], useSenderKeys); + await Common.addFriendToNewClosedGroup([app, app2], useSenderKeys); // send a message from app and validate it is received on app2 - const textMessage = common.generateSendMessageText(); + const textMessage = Common.generateSendMessageText(); await app.client .element(ConversationPage.sendMessageTextarea) .setValue(textMessage); diff --git a/integration_test/common.js b/ts/test/session/integration/common.ts similarity index 63% rename from integration_test/common.js rename to ts/test/session/integration/common.ts index 43bf55897..c642b4d31 100644 --- a/integration_test/common.js +++ b/ts/test/session/integration/common.ts @@ -1,76 +1,87 @@ -/* eslint-disable no-console */ -/* eslint-disable import/no-extraneous-dependencies */ -/* eslint-disable prefer-destructuring */ +// tslint:disable: no-implicit-dependencies -const { Application } = require('spectron'); -const path = require('path'); -const url = require('url'); -const http = require('http'); -const fse = require('fs-extra'); -const { exec } = require('child_process'); +import { Application, SpectronClient } from 'spectron'; +import path from 'path'; +import url from 'url'; +import http from 'http'; +import fse from 'fs-extra'; +import { exec } from 'child_process'; -const chai = require('chai'); -const chaiAsPromised = require('chai-as-promised'); -const CommonPage = require('./page-objects/common.page'); -const RegistrationPage = require('./page-objects/registration.page'); -const ConversationPage = require('./page-objects/conversation.page'); -const SettingsPage = require('./page-objects/settings.page'); +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import CommonPage from './page-objects/common.page'; +import RegistrationPage from './page-objects/registration.page'; +import ConversationPage from './page-objects/conversation.page'; +import SettingsPage from './page-objects/settings.page'; chai.should(); -chai.use(chaiAsPromised); +chai.use(chaiAsPromised as any); chai.config.includeStack = true; +// FIXME audric // From https://github.com/chaijs/chai/issues/200 chai.use((_chai, _) => { - _chai.Assertion.addMethod('withMessage', msg => { - _.flag(this, 'message', msg); + _chai.Assertion.addMethod('withMessage', (msg: string) => { + _.flag(Common, 'message', msg); }); }); const STUB_SNODE_SERVER_PORT = 3000; const ENABLE_LOG = false; -module.exports = { +// tslint:disable-next-line: no-unnecessary-class +export class Common { /* ************** USERS ****************** */ - TEST_MNEMONIC1: - 'faxed mechanic mocked agony unrest loincloth pencil eccentric boyfriend oasis speedy ribbon faxed', - TEST_PUBKEY1: - '0552b85a43fb992f6bdb122a5a379505a0b99a16f0628ab8840249e2a60e12a413', - TEST_DISPLAY_NAME1: 'tester_Alice', + public static readonly TEST_RECOVERY_PHRASE_1 = + 'faxed mechanic mocked agony unrest loincloth pencil eccentric boyfriend oasis speedy ribbon faxed'; + public static readonly TEST_PUBKEY1 = + '0552b85a43fb992f6bdb122a5a379505a0b99a16f0628ab8840249e2a60e12a413'; + public static readonly TEST_DISPLAY_NAME1 = 'tester_Alice'; - TEST_MNEMONIC2: - 'guide inbound jerseys bays nouns basin sulking awkward stockpile ostrich ascend pylons ascend', - TEST_PUBKEY2: - '054e1ca8681082dbd9aad1cf6fc89a32254e15cba50c75b5a73ac10a0b96bcbd2a', - TEST_DISPLAY_NAME2: 'tester_Bob', + public static readonly TEST_RECOVERY_PHRASE_2 = + 'guide inbound jerseys bays nouns basin sulking awkward stockpile ostrich ascend pylons ascend'; + public static readonly TEST_PUBKEY2 = + '054e1ca8681082dbd9aad1cf6fc89a32254e15cba50c75b5a73ac10a0b96bcbd2a'; + public static readonly TEST_DISPLAY_NAME2 = 'tester_Bob'; - TEST_MNEMONIC3: - 'alpine lukewarm oncoming blender kiwi fuel lobster upkeep vogue simplest gasp fully simplest', - TEST_PUBKEY3: - '05f8662b6e83da5a31007cc3ded44c601f191e07999acb6db2314a896048d9036c', - TEST_DISPLAY_NAME3: 'tester_Charlie', + public static readonly TEST_RECOVERY_PHRASE_3 = + 'alpine lukewarm oncoming blender kiwi fuel lobster upkeep vogue simplest gasp fully simplest'; + public static readonly TEST_PUBKEY3 = + '05f8662b6e83da5a31007cc3ded44c601f191e07999acb6db2314a896048d9036c'; + public static readonly TEST_DISPLAY_NAME3 = 'tester_Charlie'; /* ************** OPEN GROUPS ****************** */ - VALID_GROUP_URL: 'https://chat.getsession.org', - VALID_GROUP_URL2: 'https://chat-dev.lokinet.org', - VALID_GROUP_NAME: 'Session Public Chat', - VALID_GROUP_NAME2: 'Loki Dev Chat', + public static readonly VALID_GROUP_URL = 'https://chat.getsession.org'; + public static readonly VALID_GROUP_URL2 = 'https://chat-dev.lokinet.org'; + public static readonly VALID_GROUP_NAME = 'Session Public Chat'; + public static readonly VALID_GROUP_NAME2 = 'Loki Dev Chat'; /* ************** CLOSED GROUPS ****************** */ - VALID_CLOSED_GROUP_NAME1: 'Closed Group 1', + public static readonly VALID_CLOSED_GROUP_NAME1 = 'Closed Group 1'; - USER_DATA_ROOT_FOLDER: '', + public static USER_DATA_ROOT_FOLDER = ''; + private static stubSnode: any; + private static messages: any; + private static fileServer: any; - async timeout(ms) { + // tslint:disable: await-promise + // tslint:disable: no-console + + public static async timeout(ms: number) { + // tslint:disable-next-line: no-string-based-set-timeout return new Promise(resolve => setTimeout(resolve, ms)); - }, + } - async closeToast(app) { + public static async closeToast(app: Application) { app.client.element(CommonPage.toastCloseButton).click(); - }, + } // a wrapper to work around electron/spectron bug - async setValueWrapper(app, selector, value) { + public static async setValueWrapper( + app: Application, + selector: any, + value: string + ) { // keys, setValue and addValue hang on certain platforms if (process.platform === 'darwin') { @@ -79,14 +90,12 @@ module.exports = { // eslint-disable-next-line no-undef const iter = document.evaluate( slctr, - // eslint-disable-next-line no-undef document, null, - // eslint-disable-next-line no-undef XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null ); - const elem = iter.iterateNext(); + const elem = iter.iterateNext() as any; if (elem) { elem.value = val; } else { @@ -102,16 +111,25 @@ module.exports = { // Linux & Windows don't require wrapper await app.client.element(selector).setValue(value); } - }, + } - async startApp(environment = 'test-integration-session') { + public static async startApp(environment = 'test-integration-session') { const env = environment.startsWith('test-integration') ? 'test-integration' : environment; const instance = environment.replace('test-integration-', ''); const app1 = new Application({ - path: path.join(__dirname, '..', 'node_modules', '.bin', 'electron'), + path: path.join( + __dirname, + '..', + '..', + '..', + '..', + 'node_modules', + '.bin', + 'electron' + ), args: ['.'], env: { NODE_ENV: env, @@ -125,31 +143,32 @@ module.exports = { // chromeDriverLogPath: '../chromedriverlog.txt', chromeDriverArgs: [ `remote-debugging-port=${Math.floor( + // tslint:disable-next-line: insecure-random Math.random() * (9999 - 9000) + 9000 )}`, ], }); - - chaiAsPromised.transferPromiseness = app1.transferPromiseness; + // FIXME audric + // chaiAsPromised.transferPromiseness = app1.transferPromiseness; await app1.start(); await app1.client.waitUntilWindowLoaded(); return app1; - }, + } - async startApp2() { - const app2 = await this.startApp('test-integration-session-2'); + public static async startApp2() { + const app2 = await Common.startApp('test-integration-session-2'); return app2; - }, + } - async stopApp(app1) { + public static async stopApp(app1: Application) { if (app1 && app1.isRunning()) { await app1.stop(); } - }, + } - async killallElectron() { + public static async killallElectron() { // rtharp - my 2nd client on MacOs needs: pkill -f "node_modules/.bin/electron" // node_modules/electron/dist/electron is node_modules/electron/dist/Electron.app on MacOS const killStr = @@ -161,71 +180,80 @@ module.exports = { resolve({ stdout, stderr }); }); }); - }, + } - async rmFolder(folder) { + public static async rmFolder(folder: string) { await fse.remove(folder); - }, + } - async startAndAssureCleanedApp2() { - const app2 = await this.startAndAssureCleanedApp( + public static async startAndAssureCleanedApp2() { + const app2 = await Common.startAndAssureCleanedApp( 'test-integration-session-2' ); return app2; - }, + } - async startAndAssureCleanedApp(env = 'test-integration-session') { - const userData = path.join(this.USER_DATA_ROOT_FOLDER, `Session-${env}`); + public static async startAndAssureCleanedApp( + env = 'test-integration-session' + ) { + const userData = path.join(Common.USER_DATA_ROOT_FOLDER, `Session-${env}`); - await this.rmFolder(userData); + await Common.rmFolder(userData); - const app1 = await this.startApp(env); + const app1 = await Common.startApp(env); await app1.client.waitForExist( RegistrationPage.registrationTabSignIn, 4000 ); return app1; - }, + } - async startAndStub({ - mnemonic, + public static async startAndStub({ + recoveryPhrase, displayName, env = 'test-integration-session', + }: { + recoveryPhrase: string; + displayName: string; + env?: string; }) { - const app = await this.startAndAssureCleanedApp(env); + const app = await Common.startAndAssureCleanedApp(env); + await Common.startStubSnodeServer(); - await this.startStubSnodeServer(); - - if (mnemonic && displayName) { - await this.restoreFromMnemonic(app, mnemonic, displayName); - // not sure we need this - rtharp. - await this.timeout(2000); + if (recoveryPhrase && displayName) { + await Common.restoreFromRecoveryPhrase(app, recoveryPhrase, displayName); + // not sure we need Common - rtharp. + await Common.timeout(2000); } return app; - }, + } - async startAndStubN(props, n) { + public static async startAndStubN(props: any, n: number) { // Make app with stub as number n - const appN = await this.startAndStub({ + const appN = await Common.startAndStub({ env: `test-integration-session-${n}`, ...props, }); return appN; - }, + } - async restoreFromMnemonic(app, mnemonic, displayName) { + public static async restoreFromRecoveryPhrase( + app: Application, + recoveryPhrase: string, + displayName: string + ) { await app.client.element(RegistrationPage.registrationTabSignIn).click(); await app.client.element(RegistrationPage.restoreFromSeedMode).click(); - await this.setValueWrapper( + await Common.setValueWrapper( app, RegistrationPage.recoveryPhraseInput, - mnemonic + recoveryPhrase ); - await this.setValueWrapper( + await Common.setValueWrapper( app, RegistrationPage.displayNameInput, displayName @@ -238,90 +266,70 @@ module.exports = { RegistrationPage.conversationListContainer, 4000 ); - }, + } - async makeFriends(app1, client2) { - const [app2, pubkey2] = client2; + public static async makeFriends( + app1: Application, + client2: [Application, string] + ) { + const [_, pubkey2] = client2; /** add each other as friends */ - const textMessage = this.generateSendMessageText(); - + const textMessage = Common.generateSendMessageText(); await app1.client.element(ConversationPage.contactsButtonSection).click(); await app1.client.element(ConversationPage.addContactButton).click(); - await this.setValueWrapper(app1, ConversationPage.sessionIDInput, pubkey2); + await Common.setValueWrapper( + app1, + ConversationPage.sessionIDInput, + pubkey2 + ); await app1.client.element(ConversationPage.nextButton).click(); await app1.client.waitForExist( - ConversationPage.sendFriendRequestTextarea, + ConversationPage.sendMessageTextareaAndMessage, 1000 ); // send a text message to that user (will be a friend request) - await this.setValueWrapper( + await Common.setValueWrapper( app1, - ConversationPage.sendFriendRequestTextarea, + ConversationPage.sendMessageTextareaAndMessage, textMessage ); await app1.client.keys('Enter'); await app1.client.waitForExist( - ConversationPage.existingFriendRequestText(textMessage), + ConversationPage.existingSendMessageText(textMessage), 1000 ); + } - // wait for left notification Friend Request count to go to 1 and click it - await app2.client.waitForExist( - ConversationPage.oneNotificationFriendRequestLeft, - 5000 - ); - await app2.client - .element(ConversationPage.oneNotificationFriendRequestLeft) - .click(); - // open the dropdown from the top friend request count - await app2.client.isExisting( - ConversationPage.oneNotificationFriendRequestTop - ).should.eventually.be.true; - await app2.client - .element(ConversationPage.oneNotificationFriendRequestTop) - .click(); - - // accept the friend request and validate that on both side the "accepted FR" message is shown - await app2.client - .element(ConversationPage.acceptFriendRequestButton) - .click(); - await app2.client.waitForExist( - ConversationPage.acceptedFriendRequestMessage, - 1000 - ); - await app1.client.waitForExist( - ConversationPage.acceptedFriendRequestMessage, - 5000 - ); - }, - - async startAppsAsFriends() { + public static async startAppsAsFriends() { const app1Props = { - mnemonic: this.TEST_MNEMONIC1, - displayName: this.TEST_DISPLAY_NAME1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, + displayName: Common.TEST_DISPLAY_NAME1, stubSnode: true, }; const app2Props = { - mnemonic: this.TEST_MNEMONIC2, - displayName: this.TEST_DISPLAY_NAME2, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_2, + displayName: Common.TEST_DISPLAY_NAME2, stubSnode: true, }; const [app1, app2] = await Promise.all([ - this.startAndStub(app1Props), - this.startAndStubN(app2Props, 2), + Common.startAndStub(app1Props), + Common.startAndStubN(app2Props, 2), ]); - await this.makeFriends(app1, [app2, this.TEST_PUBKEY2]); + await Common.makeFriends(app1, [app2, Common.TEST_PUBKEY2]); return [app1, app2]; - }, + } - async addFriendToNewClosedGroup(members, useSenderKeys) { + public static async addFriendToNewClosedGroup( + members: Array, + useSenderKeys?: boolean + ) { const [app, ...others] = members; await app.client @@ -329,18 +337,18 @@ module.exports = { .click(); await app.client.element(ConversationPage.createClosedGroupButton).click(); - await this.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.closedGroupNameTextarea, - this.VALID_CLOSED_GROUP_NAME1 + Common.VALID_CLOSED_GROUP_NAME1 ); await app.client .element(ConversationPage.closedGroupNameTextarea) .getValue() - .should.eventually.equal(this.VALID_CLOSED_GROUP_NAME1); + .should.eventually.equal(Common.VALID_CLOSED_GROUP_NAME1); - // This assumes that app does not have any other friends + // Common assumes that app does not have any other friends for (let i = 0; i < others.length; i += 1) { // eslint-disable-next-line no-await-in-loop @@ -375,7 +383,7 @@ module.exports = { 1000 ); await app.client.isExisting( - ConversationPage.headerTitleGroupName(this.VALID_CLOSED_GROUP_NAME1) + ConversationPage.headerTitleGroupName(Common.VALID_CLOSED_GROUP_NAME1) ).should.eventually.be.true; await app.client .element(ConversationPage.headerTitleMembers(members.length)) @@ -394,7 +402,7 @@ module.exports = { // validate open chat has been added await app.client.isExisting( ConversationPage.rowOpenGroupConversationName( - this.VALID_CLOSED_GROUP_NAME1 + Common.VALID_CLOSED_GROUP_NAME1 ) ).should.eventually.be.true; @@ -403,7 +411,7 @@ module.exports = { // next check that other members have been invited and have the group in their conversations await otherApp.client.waitForExist( ConversationPage.rowOpenGroupConversationName( - this.VALID_CLOSED_GROUP_NAME1 + Common.VALID_CLOSED_GROUP_NAME1 ), 6000 ); @@ -411,19 +419,23 @@ module.exports = { await otherApp.client .element(ConversationPage.conversationButtonSection) .click(); - await this.timeout(500); + await Common.timeout(500); await otherApp.client .element( ConversationPage.rowOpenGroupConversationName( - this.VALID_CLOSED_GROUP_NAME1 + Common.VALID_CLOSED_GROUP_NAME1 ) ) .click(); }) ); - }, + } - async linkApp2ToApp(app1, app2, app1Pubkey) { + public static async linkApp2ToApp( + app1: Application, + app2: Application, + app1Pubkey: string + ) { // app needs to be logged in as user1 and app2 needs to be logged out // start the pairing dialog for the first app await app1.client.element(SettingsPage.settingsButtonSection).click(); @@ -445,7 +457,7 @@ module.exports = { await app2.client.element(RegistrationPage.registrationTabSignIn).click(); await app2.client.element(RegistrationPage.linkDeviceMode).click(); - await this.setValueWrapper( + await Common.setValueWrapper( app2, RegistrationPage.textareaLinkDevicePubkey, app1Pubkey @@ -455,9 +467,10 @@ module.exports = { const secretWordsapp1 = await app1.client .element(SettingsPage.secretWordsTextInDialog) .getText(); - await app2.client.waitForExist(RegistrationPage.toastWrapper, 6000); + await app1.client.waitForExist(RegistrationPage.linkWithThisDevice, 10000); + await app2.client - .element(RegistrationPage.secretToastDescription) + .element(RegistrationPage.secretWordsText) .getText() .should.eventually.be.equal(secretWordsapp1); @@ -484,9 +497,12 @@ module.exports = { await app2.webContents .executeJavaScript("window.storage.get('primaryDevicePubKey')") .should.eventually.be.equal(app1Pubkey); - }, + } - async triggerUnlinkApp2FromApp(app1, app2) { + public static async triggerUnlinkApp2FromApp( + app1: Application, + app2: Application + ) { // check app2 is loggedin await app2.client.isExisting(RegistrationPage.conversationListContainer) .should.eventually.be.true; @@ -509,7 +525,7 @@ module.exports = { .should.eventually.be.true; // let time to app2 to catch the event and restart dropping its data - await this.timeout(5000); + await Common.timeout(5000); // check that the app restarted // (did not find a better way than checking the app no longer being accessible) @@ -519,7 +535,7 @@ module.exports = { .should.eventually.be.true; } catch (err) { // if we get an error here, it means Spectron is lost. - // this is a good thing because it means app2 restarted + // Common is a good thing because it means app2 restarted isApp2Joinable = false; } @@ -528,10 +544,14 @@ module.exports = { 'app2 is still joinable so it did not restart, so it did not unlink correctly' ); } - }, + } - async sendMessage(app, messageText, fileLocation = undefined) { - await this.setValueWrapper( + public static async sendMessage( + app: Application, + messageText: string, + fileLocation?: string + ) { + await Common.setValueWrapper( app, ConversationPage.sendMessageTextarea, messageText @@ -543,7 +563,7 @@ module.exports = { // attach a file if (fileLocation) { - await this.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.attachmentInput, fileLocation @@ -553,15 +573,16 @@ module.exports = { // send message await app.client.element(ConversationPage.sendMessageTextarea).click(); await app.client.keys('Enter'); - }, + } - generateSendMessageText: () => - `Test message from integration tests ${Date.now()}`, + public static generateSendMessageText(): string { + return `Test message from integration tests ${Date.now()}`; + } - async startStubSnodeServer() { - if (!this.stubSnode) { - this.messages = {}; - this.stubSnode = http.createServer((request, response) => { + public static async startStubSnodeServer() { + if (!Common.stubSnode) { + Common.messages = {}; + Common.stubSnode = http.createServer((request: any, response: any) => { const { query } = url.parse(request.url, true); const { pubkey, data, timestamp } = query; @@ -571,6 +592,19 @@ module.exports = { response.end(); return; } + if (Array.isArray(pubkey)) { + console.error('pubkey cannot be an array'); + response.writeHead(400, { 'Content-Type': 'text/html' }); + response.end(); + return; + } + + if (Array.isArray(data)) { + console.error('data cannot be an array'); + response.writeHead(400, { 'Content-Type': 'text/html' }); + response.end(); + return; + } if (request.method === 'POST') { if (ENABLE_LOG) { @@ -582,21 +616,21 @@ module.exports = { ); } - let ori = this.messages[pubkey]; + let ori = Common.messages[pubkey]; - if (!this.messages[pubkey]) { + if (!Common.messages[pubkey]) { ori = []; } - this.messages[pubkey] = [...ori, { data, timestamp }]; + Common.messages[pubkey] = [...ori, { data, timestamp }]; response.writeHead(200, { 'Content-Type': 'text/html' }); response.end(); } else { - const retrievedMessages = { messages: this.messages[pubkey] || [] }; + const retrievedMessages = { messages: Common.messages[pubkey] || [] }; if (ENABLE_LOG) { - const messages = retrievedMessages.messages.map(m => + const messages = retrievedMessages.messages.map((m: any) => m.data.substr(4, 10) ); console.warn('GET', pubkey.substr(2, 3), messages); @@ -606,28 +640,33 @@ module.exports = { response.end(); } }); - this.startLocalFileServer(); - this.stubSnode.listen(STUB_SNODE_SERVER_PORT); + Common.startLocalFileServer(); + Common.stubSnode.listen(STUB_SNODE_SERVER_PORT); } else { - this.messages = {}; + Common.messages = {}; } - }, + } - async startLocalFileServer() { - if (!this.fileServer) { + public static startLocalFileServer() { + if (!Common.fileServer) { // be sure to run `git submodule update --init && cd session-file-server && yarn install; cd -` // eslint-disable-next-line global-require - this.fileServer = require('../session-file-server/app'); + // tslint:disable-next-line: no-require-imports + Common.fileServer = require('../../../../session-file-server/app'); } - }, + } - async joinOpenGroup(app, openGroupUrl, name) { + public static async joinOpenGroup( + app: Application, + openGroupUrl: string, + name: string + ) { await app.client .element(ConversationPage.conversationButtonSection) .click(); await app.client.element(ConversationPage.joinOpenGroupButton).click(); - await this.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.openGroupInputUrl, openGroupUrl @@ -638,13 +677,15 @@ module.exports = { .should.eventually.equal(openGroupUrl); await app.client.element(ConversationPage.joinOpenGroupButton).click(); - // validate session loader is shown - await app.client.isExisting(ConversationPage.sessionLoader).should - .eventually.be.true; + await app.client.waitForExist( + ConversationPage.sessionToastJoinOpenGroup, + 2 * 1000 + ); + // account for slow home internet connection delays... await app.client.waitForExist( ConversationPage.sessionToastJoinOpenGroupSuccess, - 60 * 1000 + 20 * 1000 ); // validate overlay is closed @@ -652,35 +693,39 @@ module.exports = { .eventually.be.false; // validate open chat has been added - await app.client.isExisting( - ConversationPage.rowOpenGroupConversationName(name) - ).should.eventually.be.true; - }, + await app.client.waitForExist( + ConversationPage.rowOpenGroupConversationName(name), + 20 * 1000 + ); + } - async stopStubSnodeServer() { - if (this.stubSnode) { - this.stubSnode.close(); - this.stubSnode = null; + public static async stopStubSnodeServer() { + if (Common.stubSnode) { + Common.stubSnode.close(); + Common.stubSnode = null; } - }, + } /** * Search for a string in logs - * @param {*} app the render logs to search in - * @param {*} str the string to search (not regex) + * @param app the render logs to search in + * @param str the string to search (not regex) * Note: getRenderProcessLogs() clears the app logs each calls. */ - async logsContains(renderLogs, str, count = undefined) { + public static async logsContains( + renderLogs: Array<{ message: string }>, + str: string, + count?: number + ) { const foundLines = renderLogs.filter(log => log.message.includes(str)); - // eslint-disable-next-line no-unused-expressions + // tslint:disable-next-line: no-unused-expression chai.expect( foundLines.length > 0, `'${str}' not found in logs but was expected` ).to.be.true; if (count) { - // eslint-disable-next-line no-unused-expressions chai .expect( foundLines.length, @@ -688,20 +733,5 @@ module.exports = { ) .to.be.equal(count); } - }, - - // async killStubSnodeServer() { - // return new Promise(resolve => { - // exec( - // `lsof -ti:${STUB_SNODE_SERVER_PORT} |xargs kill -9`, - // (err, stdout, stderr) => { - // if (err) { - // resolve({ stdout, stderr }); - // } else { - // resolve({ stdout, stderr }); - // } - // } - // ); - // }); - // }, -}; + } +} diff --git a/ts/test/session/integration/integration_itest.ts b/ts/test/session/integration/integration_itest.ts new file mode 100644 index 000000000..a12415ff8 --- /dev/null +++ b/ts/test/session/integration/integration_itest.ts @@ -0,0 +1,25 @@ +import { Common } from './common'; + +// tslint:disable: no-import-side-effect no-invalid-this await-promise + +import './registration_itest'; +import './open_group_itest'; +import './add_contacts_itest'; +import './link_device_itest'; +import './closed_group_itest'; +import './message_functions_itest'; +import './settings_itest'; +import './message_sync_itest'; +import './sender_keys_itest'; + +before(async function() { + // start the app once before all tests to get the platform-dependent + // path of user data and store it to common.USER_DATA_ROOT_FOLDER + this.timeout(60000); + this.slow(20000); + const app1 = await Common.startApp(); + const ret = await app1.electron.remote.app.getPath('appData'); + Common.USER_DATA_ROOT_FOLDER = ret; + + await Common.stopApp(app1); +}); diff --git a/ts/test/session/integration/link_device_itest.ts b/ts/test/session/integration/link_device_itest.ts new file mode 100644 index 000000000..f1dbb13c1 --- /dev/null +++ b/ts/test/session/integration/link_device_itest.ts @@ -0,0 +1,81 @@ +/* eslint-disable prefer-destructuring */ +/* eslint-disable more/no-then */ +/* eslint-disable func-names */ +/* eslint-disable import/no-extraneous-dependencies */ +// tslint:disable: no-implicit-dependencies +// tslint:disable: await-promise +// tslint:disable: no-invalid-this + +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; +import * as TestUtils from '../../test-utils/utils/stubbing'; +import { expect } from 'chai'; + +describe('Link Device', function() { + this.timeout(60000); + this.slow(20000); + let app: Application; + let app2: Application; + beforeEach(async () => { + await Common.killallElectron(); + + const app1Props = { + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, + displayName: Common.TEST_DISPLAY_NAME1, + }; + + const app2Props = {}; + + [app, app2] = await Promise.all([ + Common.startAndStub(app1Props), + Common.startAndStubN(app2Props, 2), + ]); + }); + + afterEach(async () => { + await Common.killallElectron(); + }); + + xit('linkDevice: link two desktop devices', async () => { + await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); + }); + + xit('linkDevice: unlink two devices', async () => { + await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); + await Common.timeout(1000); + await Common.triggerUnlinkApp2FromApp(app, app2); + }); + + xit('linkDevice:sync no groups, closed group, nor open groups', async () => { + await TestUtils.spyMessageQueueSend(app); + await TestUtils.spyMessageQueueSend(app2); + + await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); + await Common.timeout(10000); + const allMessagesSentApp = await TestUtils.getAllMessagesSent(app); + const allMessagesSentApp2 = await TestUtils.getAllMessagesSent(app2); + + expect(allMessagesSentApp2[0][1]).to.have.property('requestSignature'); + expect(allMessagesSentApp2[0][1]).to.have.property( + 'primaryDevicePubKey', + Common.TEST_PUBKEY1 + ); + expect(allMessagesSentApp2[0][1]).to.have.property('secondaryDevicePubKey'); + + expect(allMessagesSentApp[1][1]).to.have.property('requestSignature'); + expect(allMessagesSentApp[1][1]).to.have.property('grantSignature'); + expect(allMessagesSentApp[1][1]).to.have.property( + 'displayName', + Common.TEST_DISPLAY_NAME1 + ); + expect(allMessagesSentApp[1][1]).to.have.property( + 'primaryDevicePubKey', + Common.TEST_PUBKEY1 + ); + expect(allMessagesSentApp[1][1]).to.have.property('secondaryDevicePubKey'); + + // one message for session establishment, one for grant authorization. No group or anything to sync + expect(allMessagesSentApp.length).to.be.equal(2); + }); +}); diff --git a/integration_test/message_functions_test.js b/ts/test/session/integration/message_functions_itest.ts similarity index 61% rename from integration_test/message_functions_test.js rename to ts/test/session/integration/message_functions_itest.ts index 245664ff1..59b354e64 100644 --- a/integration_test/message_functions_test.js +++ b/ts/test/session/integration/message_functions_itest.ts @@ -1,41 +1,45 @@ -/* eslint-disable prefer-destructuring */ -/* eslint-disable more/no-then */ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const path = require('path'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const { afterEach, beforeEach, describe, it } = require('mocha'); -const common = require('./common'); -const ConversationPage = require('./page-objects/conversation.page'); +import path from 'path'; +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +import ConversationPage from './page-objects/conversation.page'; describe('Message Functions', function() { - let app; - let app2; this.timeout(60000); - this.slow(15000); + this.slow(20000); + let app: Application; + let app2: Application; beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); - [app, app2] = await common.startAppsAsFriends(); + [app, app2] = await Common.startAppsAsFriends(); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.stopApp(app); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); - it('can send attachment', async () => { + it('messageFunction: can send attachment', async () => { // create group and add new friend - await common.addFriendToNewClosedGroup([app, app2], false); + await Common.addFriendToNewClosedGroup([app, app2], false); // send attachment from app1 to closed group const fileLocation = path.join(__dirname, 'test_attachment'); const messageText = 'test_attachment'; + await Common.closeToast(app); - await common.sendMessage(app, messageText, fileLocation); + await Common.sendMessage(app, messageText, fileLocation); // validate attachment sent await app.client.waitForExist( @@ -49,11 +53,11 @@ describe('Message Functions', function() { ); }); - it('can delete message', async () => { + it('messageFunction: can delete message', async () => { // create group and add new friend - await common.addFriendToNewClosedGroup([app, app2], false); + await Common.addFriendToNewClosedGroup([app, app2], false); const messageText = 'delete_me'; - await common.sendMessage(app, messageText); + await Common.sendMessage(app, messageText); await app.client.waitForExist( ConversationPage.existingSendMessageText(messageText), diff --git a/integration_test/message_sync_test.js b/ts/test/session/integration/message_sync_itest.ts similarity index 65% rename from integration_test/message_sync_test.js rename to ts/test/session/integration/message_sync_itest.ts index 3aa078e23..ba5fd29a1 100644 --- a/integration_test/message_sync_test.js +++ b/ts/test/session/integration/message_sync_itest.ts @@ -1,42 +1,46 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { after, before, describe, it } = require('mocha'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const common = require('./common'); +import { after, before, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; describe('Message Syncing', function() { - let Alice1; - let Bob1; - let Alice2; this.timeout(60000); - this.slow(15000); + this.slow(20000); + let Alice1: Application; + let Bob1: Application; + let Alice2: Application; // this test suite builds a complex usecase over several tests, // so you need to run all of those tests together (running only one might fail) before(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); const alice2Props = {}; - [Alice1, Bob1] = await common.startAppsAsFriends(); // Alice and Bob are friends + [Alice1, Bob1] = await Common.startAppsAsFriends(); // Alice and Bob are friends - await common.addFriendToNewClosedGroup([Alice1, Bob1], false); - await common.joinOpenGroup( + await Common.addFriendToNewClosedGroup([Alice1, Bob1], false); + await Common.joinOpenGroup( Alice1, - common.VALID_GROUP_URL, - common.VALID_GROUP_NAME + Common.VALID_GROUP_URL, + Common.VALID_GROUP_NAME ); - Alice2 = await common.startAndStubN(alice2Props, 4); // Alice secondary, just start the app for now. no linking + Alice2 = await Common.startAndStubN(alice2Props, 4); // Alice secondary, just start the app for now. no linking }); after(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); - it('message syncing with 1 friend, 1 closed group, 1 open group', async () => { + xit('message syncing with 1 friend, 1 closed group, 1 open group', async () => { // Alice1 has: // * no linked device // * Bob is a friend @@ -51,8 +55,8 @@ describe('Message Syncing', function() { // Linking Alice2 to Alice1 // alice2 should trigger auto FR with bob1 as it's one of her friend // and alice2 should trigger a FALLBACK_MESSAGE with bob1 as he is in a closed group with her - await common.linkApp2ToApp(Alice1, Alice2, common.TEST_PUBKEY1); - await common.timeout(25000); + await Common.linkApp2ToApp(Alice1, Alice2, Common.TEST_PUBKEY1); + await Common.timeout(25000); // validate pubkey of app2 is the set const alice2Pubkey = await Alice2.webContents.executeJavaScript( @@ -65,17 +69,17 @@ describe('Message Syncing', function() { const alice2Logs = await Alice2.client.getRenderProcessLogs(); // validate primary alice - await common.logsContains( + await Common.logsContains( alice1Logs, 'Sending closed-group-sync-send:outgoing message to OUR SECONDARY PUBKEY', 1 ); - await common.logsContains( + await Common.logsContains( alice1Logs, 'Sending open-group-sync-send:outgoing message to OUR SECONDARY PUBKEY', 1 ); - await common.logsContains( + await Common.logsContains( alice1Logs, 'Sending contact-sync-send:outgoing message to OUR SECONDARY PUBKEY', 1 @@ -86,29 +90,29 @@ describe('Message Syncing', function() { // alice2 receives group sync, contact sync and open group sync // alice2 triggers session request with closed group members and autoFR with contact sync received // once autoFR is auto-accepted, alice2 trigger contact sync - await common.logsContains( + await Common.logsContains( alice2Logs, 'Got sync group message with group id', 1 ); - await common.logsContains( + await Common.logsContains( alice2Logs, 'Received GROUP_SYNC with open groups: [chat.getsession.org]', 1 ); - await common.logsContains( + await Common.logsContains( alice2Logs, - `Sending auto-friend-request:friend-request message to ${common.TEST_PUBKEY2}`, + `Sending auto-friend-request:friend-request message to ${Common.TEST_PUBKEY2}`, 1 ); - await common.logsContains( + await Common.logsContains( alice2Logs, - `Sending session-request:friend-request message to ${common.TEST_PUBKEY2}`, + `Sending session-request:friend-request message to ${Common.TEST_PUBKEY2}`, 1 ); - await common.logsContains( + await Common.logsContains( alice2Logs, - `Sending contact-sync-send:outgoing message to OUR_PRIMARY_PUBKEY`, + 'Sending contact-sync-send:outgoing message to OUR_PRIMARY_PUBKEY', 1 ); @@ -117,25 +121,25 @@ describe('Message Syncing', function() { // bob1 receives session request from alice2 // bob1 accept auto fr by sending a bg message // once autoFR is auto-accepted, alice2 trigger contact sync - await common.logsContains( + await Common.logsContains( bob1Logs, `Received FALLBACK_MESSAGE from source: ${alice2Pubkey}`, 1 ); - await common.logsContains( + await Common.logsContains( bob1Logs, `Received AUTO_FRIEND_REQUEST from source: ${alice2Pubkey}`, 1 ); - await common.logsContains( + await Common.logsContains( bob1Logs, `Sending auto-friend-accept:onlineBroadcast message to ${alice2Pubkey}`, 1 ); // be sure only one autoFR accept was sent (even if multi device, we need to reply to that specific device only) - await common.logsContains( + await Common.logsContains( bob1Logs, - `Sending auto-friend-accept:onlineBroadcast message to`, + 'Sending auto-friend-accept:onlineBroadcast message to', 1 ); }); diff --git a/integration_test/open_group_test.js b/ts/test/session/integration/open_group_itest.ts similarity index 66% rename from integration_test/open_group_test.js rename to ts/test/session/integration/open_group_itest.ts index 08a22d785..588bdd160 100644 --- a/integration_test/open_group_test.js +++ b/ts/test/session/integration/open_group_itest.ts @@ -1,41 +1,46 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const common = require('./common'); -const ConversationPage = require('./page-objects/conversation.page'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +import ConversationPage from './page-objects/conversation.page'; describe('Open groups', function() { - let app; - this.timeout(40000); - this.slow(15000); + this.timeout(60000); + this.slow(20000); + let app: Application; beforeEach(async () => { - await common.killallElectron(); + await Common.killallElectron(); const login = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, + displayName: Common.TEST_DISPLAY_NAME1, }; - app = await common.startAndStub(login); + app = await Common.startAndStub(login); }); afterEach(async () => { - await common.killallElectron(); + await Common.killallElectron(); }); it('openGroup: works with valid open group url', async () => { - await common.joinOpenGroup( + await Common.joinOpenGroup( app, - common.VALID_GROUP_URL, - common.VALID_GROUP_NAME + Common.VALID_GROUP_URL, + Common.VALID_GROUP_NAME ); }); it('openGroup: cannot join two times the same open group', async () => { - await common.joinOpenGroup( + await Common.joinOpenGroup( app, - common.VALID_GROUP_URL2, - common.VALID_GROUP_NAME2 + Common.VALID_GROUP_URL2, + Common.VALID_GROUP_NAME2 ); // adding a second time the same open group @@ -44,10 +49,10 @@ describe('Open groups', function() { .click(); await app.client.element(ConversationPage.joinOpenGroupButton).click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.openGroupInputUrl, - common.VALID_GROUP_URL2 + Common.VALID_GROUP_URL2 ); await app.client.element(ConversationPage.joinOpenGroupButton).click(); // validate session loader is not shown @@ -59,7 +64,7 @@ describe('Open groups', function() { 1 * 1000 ); - // validate overlay is still opened + // validate overlay is still opened as connection failed await app.client.isExisting(ConversationPage.leftPaneOverlay).should .eventually.be.true; }); @@ -71,10 +76,10 @@ describe('Open groups', function() { .click(); await app.client.element(ConversationPage.joinOpenGroupButton).click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.openGroupInputUrl, - common.VALID_GROUP_URL2 + Common.VALID_GROUP_URL2 ); await app.client.element(ConversationPage.joinOpenGroupButton).click(); @@ -83,29 +88,29 @@ describe('Open groups', function() { ConversationPage.sessionToastJoinOpenGroupSuccess, 30 * 1000 ); - await common.timeout(5 * 1000); // wait for toast to clear + await Common.timeout(5 * 1000); // wait for toast to clear await app.client.waitForExist( - ConversationPage.rowOpenGroupConversationName(common.VALID_GROUP_NAME2), + ConversationPage.rowOpenGroupConversationName(Common.VALID_GROUP_NAME2), 10 * 1000 ); // generate a message containing the current timestamp so we can find it in the list of messages - const textMessage = common.generateSendMessageText(); + const textMessage = Common.generateSendMessageText(); await app.client .element(ConversationPage.conversationButtonSection) .click(); await app.client.isExisting( - ConversationPage.rowOpenGroupConversationName(common.VALID_GROUP_NAME2) + ConversationPage.rowOpenGroupConversationName(Common.VALID_GROUP_NAME2) ); await app.client .element( - ConversationPage.rowOpenGroupConversationName(common.VALID_GROUP_NAME2) + ConversationPage.rowOpenGroupConversationName(Common.VALID_GROUP_NAME2) ) .click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.sendMessageTextarea, textMessage @@ -115,11 +120,11 @@ describe('Open groups', function() { .getValue() .should.eventually.equal(textMessage); // allow some time to fetch some messages - await common.timeout(3000); + await Common.timeout(3000); // send the message await app.client.keys('Enter'); - await common.timeout(5000); + await Common.timeout(5000); // validate that the message has been added to the message list view await app.client.waitForExist( ConversationPage.existingSendMessageText(textMessage), diff --git a/integration_test/page-objects/common.page.js b/ts/test/session/integration/page-objects/common.page.ts similarity index 53% rename from integration_test/page-objects/common.page.js rename to ts/test/session/integration/page-objects/common.page.ts index 0ef3205e6..5295598f7 100644 --- a/integration_test/page-objects/common.page.js +++ b/ts/test/session/integration/page-objects/common.page.ts @@ -1,28 +1,29 @@ -module.exports = { +export = { // generics - objWithClassAndText: (obj, classname, text) => + objWithClassAndText: (obj: string, classname: string, text: string) => `//${obj}[contains(string(), "${text}")][contains(@class, "${classname}")]`, - divRoleButtonWithText: text => + divRoleButtonWithText: (text: string) => `//div[contains(string(), "${text}")][contains(@role, "button")]`, - divRoleButtonWithTextDisabled: text => + divRoleButtonWithTextDisabled: (text: string) => `//div[contains(string(), "${text}")][contains(@role, "button")][contains(@class, "disabled")]`, - divRoleButtonDangerWithText: text => + divRoleButtonDangerWithText: (text: string) => `${module.exports.divRoleButtonWithText(text)}[contains(@class, "danger")]`, - inputWithPlaceholder: placeholder => + inputWithPlaceholder: (placeholder: string) => `//input[contains(@placeholder, "${placeholder}")]`, - inputWithId: id => `//input[contains(@id, '${id}')]`, - textAreaWithPlaceholder: placeholder => + inputWithId: (id: string) => `//input[contains(@id, '${id}')]`, + textAreaWithPlaceholder: (placeholder: string) => `//textarea[contains(@placeholder, "${placeholder}")]`, - textAreaWithClass: classname => + textAreaWithClass: (classname: string) => `//textarea[contains(@class, "${classname}")]`, - byId: id => `//*[@id="${id}"]`, - divWithClass: classname => `//div[contains(@class, "${classname}")]`, - divWithClassAndText: (classname, text) => + byId: (id: string) => `//*[@id="${id}"]`, + divWithClass: (classname: string) => + `//div[contains(@class, "${classname}")]`, + divWithClassAndText: (classname: string, text: string) => module.exports.objWithClassAndText('div', classname, text), - spanWithClassAndText: (classname, text) => + spanWithClassAndText: (classname: string, text: string) => module.exports.objWithClassAndText('span', classname, text), - toastWithText: text => + toastWithText: (text: string) => module.exports.divWithClassAndText('session-toast-wrapper', text), toastCloseButton: '//div[contains(@class, "session-toast-wrapper")]//div[contains(@class, "toast-close")]/div', diff --git a/integration_test/page-objects/conversation.page.js b/ts/test/session/integration/page-objects/conversation.page.ts similarity index 68% rename from integration_test/page-objects/conversation.page.js rename to ts/test/session/integration/page-objects/conversation.page.ts index 4110edd05..9e6b96347 100644 --- a/integration_test/page-objects/conversation.page.js +++ b/ts/test/session/integration/page-objects/conversation.page.ts @@ -1,18 +1,16 @@ -const commonPage = require('./common.page'); +import commonPage from './common.page'; -module.exports = { +export = { // conversation view sessionLoader: commonPage.divWithClass('session-loader'), leftPaneOverlay: commonPage.divWithClass('module-left-pane-overlay'), sendMessageTextarea: commonPage.textAreaWithClass('send-message'), - sendFriendRequestTextarea: commonPage.textAreaWithPlaceholder( - 'Send your first message' + sendMessageTextareaAndMessage: commonPage.textAreaWithPlaceholder( + 'Type your message' ), - existingSendMessageText: textMessage => + existingSendMessageText: (textMessage: string) => `//*[contains(@class, "module-message__text--outgoing") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, - existingFriendRequestText: textMessage => - `//*[contains(@class, "module-message-friend-request__container") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, - existingReceivedMessageText: textMessage => + existingReceivedMessageText: (textMessage: string) => `//*[contains(@class, "module-message__text--incoming") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, // conversations @@ -22,18 +20,18 @@ module.exports = { 'module-friend-request__buttonContainer--outgoing', 'Retry Send' ), - headerTitleMembers: number => + headerTitleMembers: (num: number) => commonPage.spanWithClassAndText( 'module-conversation-header__title-text', - `${number} members` + `${num} members` ), - conversationItem: commonPage.divWithClass('module-conversation-list-item'), + conversationItem: "//*[contains(@class, 'module-conversation-list-item')]", attachmentInput: '//*[contains(@class, "choose-file")]/input[@type="file"]', attachmentButton: '//*[contains(@class, "choose-file")]/button', - messageCtxMenu: message => + messageCtxMenu: (message: string) => `//div[contains(@class, 'message-wrapper')]//span[contains(string(), '${message}')]/parent::div/parent::div/parent::div/parent::div//div[contains(@class, 'module-message__buttons__menu')]`, deleteMessageCtxButton: @@ -44,13 +42,16 @@ module.exports = { // channels joinOpenGroupButton: commonPage.divRoleButtonWithText('Join Open Group'), openGroupInputUrl: commonPage.textAreaWithPlaceholder('chat.getsession.org'), + sessionToastJoinOpenGroup: commonPage.toastWithText( + 'Connecting to server...' + ), sessionToastJoinOpenGroupSuccess: commonPage.toastWithText( - 'Successfully connected to new open group server' + 'Successfully connected to open group' ), sessionToastJoinOpenGroupAlreadyExist: commonPage.toastWithText( - 'You are already connected to this public channel' + 'You are already connected to this open group' ), - rowOpenGroupConversationName: groupName => + rowOpenGroupConversationName: (groupName: string) => commonPage.spanWithClassAndText( 'module-conversation__user__profile-number', groupName @@ -63,7 +64,7 @@ module.exports = { closedGroupNameTextarea: commonPage.textAreaWithPlaceholder( 'Enter a group name' ), - createClosedGroupMemberItem: idx => + createClosedGroupMemberItem: (idx: number) => commonPage.divWithClass(`session-member-item-${idx}`), createClosedGroupSealedSenderToggle: commonPage.divWithClass( 'session-toggle' @@ -77,7 +78,7 @@ module.exports = { sessionToastGroupCreatedSuccess: commonPage.toastWithText( 'Group created successfully' ), - headerTitleGroupName: groupname => + headerTitleGroupName: (groupname: string) => commonPage.spanWithClassAndText( 'module-contact-name__profile-name', groupname @@ -87,20 +88,8 @@ module.exports = { contactsButtonSection: '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "users")]]', addContactButton: commonPage.divRoleButtonWithText('Add Contact'), - sessionIDInput: commonPage.textAreaWithPlaceholder('Enter a Session ID'), + sessionIDInput: commonPage.textAreaWithPlaceholder('Enter Session ID'), nextButton: commonPage.divRoleButtonWithText('Next'), - oneNotificationFriendRequestLeft: - '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "users")] and .//*[contains(@class, "notification-count") and contains(string(), "1")] ]', - oneNotificationFriendRequestTop: - '//*[contains(@class,"notification-count hover") and contains(string(), "1")]', - friendRequestFromUser: (displayName, pubkey) => - `//*[contains(@class,"module-left-pane__list-popup") and .//*[contains(@class, "module-conversation__user") and .//*[contains(string(), "${displayName}")] and .//*[contains(string(), "(...${pubkey.substring( - 60 - )})")]]]`, - acceptFriendRequestButton: - '//*[contains(@role, "button")][contains(@class, "session-button")][contains(string(), "Accept")]', - acceptedFriendRequestMessage: - '//*[contains(@class, "module-friend-request__title")][contains(string(), "Friend request accepted")]', descriptionDeleteAccount: commonPage.spanWithClassAndText( 'session-confirm-main-message', @@ -119,7 +108,7 @@ module.exports = { qrImageDiv: commonPage.divWithClass('qr-image'), allowPairingButton: commonPage.divRoleButtonWithText('Allow Linking'), okButton: commonPage.divRoleButtonWithText('OK'), - devicePairedDescription: secretWords => + devicePairedDescription: (secretWords: string) => commonPage.divWithClassAndText( 'session-settings-item__description', secretWords diff --git a/integration_test/page-objects/registration.page.js b/ts/test/session/integration/page-objects/registration.page.ts similarity index 79% rename from integration_test/page-objects/registration.page.js rename to ts/test/session/integration/page-objects/registration.page.ts index 0ab617d84..2d7e7ae7b 100644 --- a/integration_test/page-objects/registration.page.js +++ b/ts/test/session/integration/page-objects/registration.page.ts @@ -1,6 +1,6 @@ -const commonPage = require('./common.page'); +import commonPage from './common.page'; -module.exports = { +export = { registrationTabSignIn: '//div[contains(string(), "Sign In")][contains(@class, "session-registration__tab")][contains(@role, "tab")]', @@ -31,10 +31,15 @@ module.exports = { 'Link Device to Existing Session ID' ), textareaLinkDevicePubkey: commonPage.textAreaWithPlaceholder( - 'Enter other device’s Session ID here' + 'Enter your Session ID' ), linkDeviceTriggerButton: commonPage.divRoleButtonWithText('Link Device'), toastWrapper: '//*[contains(@class,"session-toast-wrapper")]', - - secretToastDescription: '//p[contains(@class, "description")]', + secretWordsText: + '//div[contains(@class,"session-registration__content__secret-words")]/div[contains(@class,"subtle")]', + linkWithThisDevice: commonPage.objWithClassAndText( + 'h4', + 'device-pairing-dialog__desc', + 'Allow linking with this device?' + ), }; diff --git a/integration_test/page-objects/settings.page.js b/ts/test/session/integration/page-objects/settings.page.ts similarity index 70% rename from integration_test/page-objects/settings.page.js rename to ts/test/session/integration/page-objects/settings.page.ts index b7d532d4d..b5f98d4e8 100644 --- a/integration_test/page-objects/settings.page.js +++ b/ts/test/session/integration/page-objects/settings.page.ts @@ -1,21 +1,22 @@ -module.exports = { +export = { // settings view settingsButtonSection: '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "gear")]]', - settingsRowWithText: text => + settingsRowWithText: (text: string) => `//*[contains(@class, "left-pane-setting-category-list-item")][contains(string(), '${text}')]`, - leftPaneSettingsButton: `//*[contains(@class,"session-icon-button") and .//*[contains(@class, "gear")]]`, + leftPaneSettingsButton: + '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "gear")]]', - settingToggleWithText: text => + settingToggleWithText: (text: string) => `//div[contains(@class, 'session-settings-item') and contains(string(), '${text}')]//*[contains(@class, 'session-toggle')]`, - settingButtonWithText: text => + settingButtonWithText: (text: string) => `//div[contains(@class, 'session-settings-item')]//*[contains(@class, 'session-button') and contains(string(), '${text}')]`, - settingCategoryWithText: text => + settingCategoryWithText: (text: string) => `//div[contains(@class, 'left-pane-setting-category-list-item') and contains(string(), '${text}')]`, // Confirm is a boolean. Selects confirmation input - passwordSetModalInput: _confirm => + passwordSetModalInput: (_confirm: boolean | undefined) => `//input[@id = 'password-modal-input${_confirm ? '-confirm' : ''}']`, secretWordsTextInDialog: diff --git a/integration_test/registration_test.js b/ts/test/session/integration/registration_itest.ts similarity index 72% rename from integration_test/registration_test.js rename to ts/test/session/integration/registration_itest.ts index f9ba07704..6f23d2ea0 100644 --- a/integration_test/registration_test.js +++ b/ts/test/session/integration/registration_itest.ts @@ -1,35 +1,39 @@ /* eslint-disable prefer-arrow-callback */ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ +// tslint:disable: no-implicit-dependencies +// tslint:disable: await-promise +// tslint:disable: no-invalid-this -const { afterEach, beforeEach, describe, it } = require('mocha'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; -const common = require('./common'); -const SettingsPage = require('./page-objects/settings.page'); -const RegistrationPage = require('./page-objects/registration.page'); -const ConversationPage = require('./page-objects/conversation.page'); +import SettingsPage from './page-objects/settings.page'; +import RegistrationPage from './page-objects/registration.page'; +import ConversationPage from './page-objects/conversation.page'; describe('Window Test and Login', function() { - let app; - this.timeout(20000); - this.slow(15000); + this.timeout(60000); + this.slow(20000); + let app: Application; beforeEach(async () => { - await common.killallElectron(); + await Common.killallElectron(); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); + await Common.stopApp(app); + await Common.killallElectron(); }); it('registration: opens one window', async () => { - app = await common.startAndAssureCleanedApp(); + app = await Common.startAndAssureCleanedApp(); app.client.getWindowCount().should.eventually.be.equal(1); }); it('registration: window title is correct', async () => { - app = await common.startAndAssureCleanedApp(); + app = await Common.startAndAssureCleanedApp(); app.client .getTitle() @@ -37,26 +41,26 @@ describe('Window Test and Login', function() { }); it('registration: can restore from seed', async () => { - app = await common.startAndAssureCleanedApp(); + app = await Common.startAndAssureCleanedApp(); await app.client.element(RegistrationPage.registrationTabSignIn).click(); await app.client.element(RegistrationPage.restoreFromSeedMode).click(); await app.client .element(RegistrationPage.recoveryPhraseInput) - .setValue(common.TEST_MNEMONIC1); + .setValue(Common.TEST_RECOVERY_PHRASE_1); await app.client .element(RegistrationPage.displayNameInput) - .setValue(common.TEST_DISPLAY_NAME1); + .setValue(Common.TEST_DISPLAY_NAME1); // validate fields are filled await app.client .element(RegistrationPage.recoveryPhraseInput) .getValue() - .should.eventually.equal(common.TEST_MNEMONIC1); + .should.eventually.equal(Common.TEST_RECOVERY_PHRASE_1); await app.client .element(RegistrationPage.displayNameInput) .getValue() - .should.eventually.equal(common.TEST_DISPLAY_NAME1); + .should.eventually.equal(Common.TEST_DISPLAY_NAME1); // trigger login await app.client.element(RegistrationPage.continueSessionButton).click(); @@ -65,18 +69,18 @@ describe('Window Test and Login', function() { 4000 ); - await common.timeout(2000); + await Common.timeout(2000); await app.webContents .executeJavaScript("window.storage.get('primaryDevicePubKey')") - .should.eventually.be.equal(common.TEST_PUBKEY1); + .should.eventually.be.equal(Common.TEST_PUBKEY1); }); it('registration: can create new account', async () => { - app = await common.startAndAssureCleanedApp(); + app = await Common.startAndAssureCleanedApp(); await app.client.element(RegistrationPage.createSessionIDButton).click(); // wait for the animation of generated pubkey to finish - await common.timeout(2000); + await Common.timeout(2000); const pubkeyGenerated = await app.client .element(RegistrationPage.textareaGeneratedPubkey) .getValue(); @@ -88,7 +92,7 @@ describe('Window Test and Login', function() { .eventually.be.true; await app.client .element(RegistrationPage.displayNameInput) - .setValue(common.TEST_DISPLAY_NAME1); + .setValue(Common.TEST_DISPLAY_NAME1); await app.client.element(RegistrationPage.getStartedButton).click(); await app.client.waitForExist( ConversationPage.conversationButtonSection, @@ -103,10 +107,10 @@ describe('Window Test and Login', function() { it('registration: can delete account when logged in', async () => { // login as user1 const login = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, + displayName: Common.TEST_DISPLAY_NAME1, }; - app = await common.startAndStub(login); + app = await Common.startAndStub(login); await app.client.waitForExist( RegistrationPage.conversationListContainer, @@ -115,7 +119,7 @@ describe('Window Test and Login', function() { await app.webContents .executeJavaScript("window.storage.get('primaryDevicePubKey')") - .should.eventually.be.equal(common.TEST_PUBKEY1); + .should.eventually.be.equal(Common.TEST_PUBKEY1); // delete account await app.client.element(SettingsPage.settingsButtonSection).click(); await app.client.element(ConversationPage.deleteAccountButton).click(); @@ -124,12 +128,12 @@ describe('Window Test and Login', function() { // click on the modal OK button to delete the account await app.client.element(ConversationPage.validateDeleteAccount).click(); // wait for the app restart - await common.timeout(2000); + await Common.timeout(2000); // Spectron will loose the connection with the app during the app restart. // We have to restart the app without altering the logged in user or anything here, just to get a valid new ref to the app. - await common.stopApp(app); - app = await common.startApp(); + await Common.stopApp(app); + app = await Common.startApp(); // validate that on app start, the registration sign in is shown await app.client.waitForExist(RegistrationPage.registrationTabSignIn, 3000); diff --git a/integration_test/sender_keys_test.js b/ts/test/session/integration/sender_keys_itest.ts similarity index 63% rename from integration_test/sender_keys_test.js rename to ts/test/session/integration/sender_keys_itest.ts index 836af43c2..d20e6492a 100644 --- a/integration_test/sender_keys_test.js +++ b/ts/test/session/integration/sender_keys_itest.ts @@ -1,13 +1,17 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); -const common = require('./common'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const ConversationPage = require('./page-objects/conversation.page'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; +import ConversationPage from './page-objects/conversation.page'; -async function generateAndSendMessage(app) { +async function generateAndSendMessage(app: Application) { // send a message from app and validate it is received on app2 - const textMessage = common.generateSendMessageText(); + const textMessage = Common.generateSendMessageText(); await app.client .element(ConversationPage.sendMessageTextarea) .setValue(textMessage); @@ -28,11 +32,17 @@ async function generateAndSendMessage(app) { return textMessage; } -async function makeFriendsPlusMessage(app, [app2, pubkey]) { - await common.makeFriends(app, [app2, pubkey]); +async function makeFriendsPlusMessage( + app: Application, + [app2, pubkey]: [Application, string] +) { + await Common.makeFriends(app, [app2, pubkey]); // Send something back so that `app` can see our name + await app2.client.waitForExist(ConversationPage.conversationItem, 5000); + await app2.client.element(ConversationPage.conversationItem).click(); const text = await generateAndSendMessage(app2); + await app.client.waitForExist( ConversationPage.existingReceivedMessageText(text), 8000 @@ -43,12 +53,12 @@ async function makeFriendsPlusMessage(app, [app2, pubkey]) { } async function testTwoMembers() { - const [app, app2] = await common.startAppsAsFriends(); + const [app, app2] = await Common.startAppsAsFriends(); const useSenderKeys = true; // create group and add new friend - await common.addFriendToNewClosedGroup([app, app2], useSenderKeys); + await Common.addFriendToNewClosedGroup([app, app2], useSenderKeys); const text1 = await generateAndSendMessage(app); @@ -73,53 +83,50 @@ async function testThreeMembers() { // 1. Make three clients A, B, C const app1Props = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, + displayName: Common.TEST_DISPLAY_NAME1, stubSnode: true, }; const app2Props = { - mnemonic: common.TEST_MNEMONIC2, - displayName: common.TEST_DISPLAY_NAME2, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_2, + displayName: Common.TEST_DISPLAY_NAME2, stubSnode: true, }; const app3Props = { - mnemonic: common.TEST_MNEMONIC3, - displayName: common.TEST_DISPLAY_NAME3, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_3, + displayName: Common.TEST_DISPLAY_NAME3, stubSnode: true, }; const [app1, app2, app3] = await Promise.all([ - common.startAndStub(app1Props), - common.startAndStubN(app2Props, 2), - common.startAndStubN(app3Props, 3), + Common.startAndStub(app1Props), + Common.startAndStubN(app2Props, 2), + Common.startAndStubN(app3Props, 3), ]); // 2. Make A friends with B and C (B and C are not friends) + await makeFriendsPlusMessage(app1, [app2, Common.TEST_PUBKEY2]); - await makeFriendsPlusMessage(app1, [app2, common.TEST_PUBKEY2]); - await makeFriendsPlusMessage(app1, [app3, common.TEST_PUBKEY3]); + await makeFriendsPlusMessage(app1, [app3, Common.TEST_PUBKEY3]); const useSenderKeys = true; // 3. Add all three to the group - await common.addFriendToNewClosedGroup([app1, app2, app3], useSenderKeys); + await Common.addFriendToNewClosedGroup([app1, app2, app3], useSenderKeys); // 4. Test that all members can see the message from app1 const text1 = await generateAndSendMessage(app1); - await app2.client.waitForExist( ConversationPage.existingReceivedMessageText(text1), 5000 ); - await app3.client.waitForExist( ConversationPage.existingReceivedMessageText(text1), 5000 ); - // TODO: test that B and C can send messages to the group // const text2 = await generateAndSendMessage(app3); @@ -131,20 +138,16 @@ async function testThreeMembers() { } describe('senderkeys', function() { - let app; - - this.timeout(600000); - this.slow(40000); - + this.timeout(60000); + this.slow(20000); beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); it('Two member group', testTwoMembers); diff --git a/integration_test/settings_test.js b/ts/test/session/integration/settings_itest.ts similarity index 65% rename from integration_test/settings_test.js rename to ts/test/session/integration/settings_itest.ts index cf463a411..eabdb6a0b 100644 --- a/integration_test/settings_test.js +++ b/ts/test/session/integration/settings_itest.ts @@ -1,44 +1,46 @@ -/* eslint-disable prefer-destructuring */ -/* eslint-disable more/no-then */ -/* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const { after, before, describe, it } = require('mocha'); -const common = require('./common'); +import { after, before, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; -const SettingsPage = require('./page-objects/settings.page'); -const CommonPage = require('./page-objects/common.page'); +import SettingsPage from './page-objects/settings.page'; +import CommonPage from './page-objects/common.page'; // Generate random password +// tslint:disable-next-line: insecure-random const password = Math.random() .toString(36) .substr(2, 8); const passwordInputID = 'password-modal-input'; describe('Settings', function() { - let app; this.timeout(60000); - this.slow(15000); + this.slow(20000); + let app: Application; before(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); const appProps = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, + displayName: Common.TEST_DISPLAY_NAME1, }; - app = await common.startAndStub(appProps); + app = await Common.startAndStub(appProps); }); after(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.stopApp(app); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); - it('can toggle menubar', async () => { + it('settings: can toggle menubar', async () => { const menuBarVisible = await app.browserWindow.isMenuBarVisible(); await app.client.element(SettingsPage.settingsButtonSection).click(); @@ -51,7 +53,7 @@ describe('Settings', function() { menuBarToggled.should.equal(!menuBarVisible); }); - it('can set password', async () => { + it('settings: can set password', async () => { await app.client .element(SettingsPage.settingsRowWithText('Privacy')) .click(); @@ -60,12 +62,12 @@ describe('Settings', function() { .element(SettingsPage.settingButtonWithText('Set Password')) .click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, CommonPage.inputWithId(passwordInputID), password ); - await common.setValueWrapper( + await Common.setValueWrapper( app, CommonPage.inputWithId(`${passwordInputID}-confirm`), password @@ -79,12 +81,12 @@ describe('Settings', function() { 2000 ); - await common.closeToast(app); + await Common.closeToast(app); }); - it('can remove password', async () => { + it('settings: can remove password', async () => { // Enter password to unlock settings - await common.setValueWrapper( + await Common.setValueWrapper( app, CommonPage.inputWithId('password-lock-input'), password @@ -97,7 +99,7 @@ describe('Settings', function() { .element(SettingsPage.settingButtonWithText('Remove Password')) .click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, CommonPage.inputWithId(passwordInputID), password diff --git a/integration_test/stubs/stub_app_dot_net_api.js b/ts/test/session/integration/stubs/stub_app_dot_net_api.ts similarity index 89% rename from integration_test/stubs/stub_app_dot_net_api.js rename to ts/test/session/integration/stubs/stub_app_dot_net_api.ts index 48414c6de..8fef6005d 100644 --- a/integration_test/stubs/stub_app_dot_net_api.js +++ b/ts/test/session/integration/stubs/stub_app_dot_net_api.ts @@ -1,6 +1,6 @@ /* global clearTimeout, Buffer, TextDecoder, process */ -const OriginalAppDotNetApi = require('../../js/modules/loki_app_dot_net_api.js'); +import LokiAppDotNetServerAPI from '../../../../../js/modules/loki_app_dot_net_api'; const sampleFeed = ' FeedForAll Sample Feed'; @@ -69,9 +69,12 @@ const samplesGetMessages = { ], }; -class StubAppDotNetAPI extends OriginalAppDotNetApi { +class StubAppDotNetAPI extends LokiAppDotNetServerAPI { // make a request to the server - async serverRequest(endpoint, options = {}) { + public async serverRequest( + endpoint: string, + options: { method?: string } = {} + ) { const { method } = options; // console.warn('STUBBED ', method, ':', endpoint); @@ -119,6 +122,17 @@ class StubAppDotNetAPI extends OriginalAppDotNetApi { }, }; } + if (endpoint === 'files') { + return { + statusCode: 200, + response: { + data: { + url: 'fakeurl', + id: 12345, + }, + }, + }; + } if (endpoint === 'channels/1') { let name = 'Unknown group'; diff --git a/integration_test/stubs/stub_message_api.js b/ts/test/session/integration/stubs/stub_message_api.ts similarity index 54% rename from integration_test/stubs/stub_message_api.js rename to ts/test/session/integration/stubs/stub_message_api.ts index 869fd00fc..3265709a6 100644 --- a/integration_test/stubs/stub_message_api.js +++ b/ts/test/session/integration/stubs/stub_message_api.ts @@ -1,22 +1,30 @@ -/* global clearTimeout, dcodeIO, Buffer, TextDecoder, process */ -const nodeFetch = require('node-fetch'); +import { StringUtils } from '../../../../session/utils'; + +import fetch from 'node-fetch'; class StubMessageAPI { - constructor(ourKey) { + public ourKey: string; + public baseUrl: string; + constructor(ourKey: string) { this.ourKey = ourKey; this.baseUrl = 'http://localhost:3000'; } // eslint-disable-next-line no-unused-vars - async sendMessage(pubKey, data, messageTimeStamp, ttl, options = {}) { + public async sendMessage( + pubKey: string, + data: any, + messageTimeStamp: number, + ttl: number, + options = {} + ) { // console.warn('STUBBED message api ', pubKey, ttl); const post = { method: 'POST', }; - const data64 = dcodeIO.ByteBuffer.wrap(data).toString('base64'); - - await nodeFetch( + const data64 = StringUtils.decode(data, 'base64'); + await fetch( `${ this.baseUrl }/messages?pubkey=${pubKey}×tamp=${messageTimeStamp}&data=${encodeURIComponent( diff --git a/integration_test/test_attachment b/ts/test/session/integration/test_attachment similarity index 100% rename from integration_test/test_attachment rename to ts/test/session/integration/test_attachment diff --git a/ts/test/session/crypto/MessageEncrypter_test.ts b/ts/test/session/unit/crypto/MessageEncrypter_test.ts similarity index 93% rename from ts/test/session/crypto/MessageEncrypter_test.ts rename to ts/test/session/unit/crypto/MessageEncrypter_test.ts index 6fcb3119e..fc130eab7 100644 --- a/ts/test/session/crypto/MessageEncrypter_test.ts +++ b/ts/test/session/unit/crypto/MessageEncrypter_test.ts @@ -1,18 +1,18 @@ import { expect } from 'chai'; import * as crypto from 'crypto'; import * as sinon from 'sinon'; -import { MessageEncrypter } from '../../../session/crypto'; -import { EncryptionType } from '../../../session/types/EncryptionType'; -import { Stubs, TestUtils } from '../../test-utils'; -import { UserUtil } from '../../../util'; -import { SignalService } from '../../../protobuf'; +import { MessageEncrypter } from '../../../../session/crypto'; +import { EncryptionType } from '../../../../session/types/EncryptionType'; +import { Stubs, TestUtils } from '../../../test-utils'; +import { UserUtil } from '../../../../util'; +import { SignalService } from '../../../../protobuf'; -import * as Ratchet from '../../../session/medium_group/ratchet'; +import * as Ratchet from '../../../../session/medium_group/ratchet'; // tslint:disable-next-line: max-func-body-length describe('MessageEncrypter', () => { const sandbox = sinon.createSandbox(); - const ourNumber = 'ourNumber'; + const ourNumber = '0123456789abcdef'; beforeEach(() => { TestUtils.stubWindow('libsignal', { diff --git a/ts/test/session/messages/ChatMessage_test.ts b/ts/test/session/unit/messages/ChatMessage_test.ts similarity index 96% rename from ts/test/session/messages/ChatMessage_test.ts rename to ts/test/session/unit/messages/ChatMessage_test.ts index 8e807f7b8..a4a365ac9 100644 --- a/ts/test/session/messages/ChatMessage_test.ts +++ b/ts/test/session/unit/messages/ChatMessage_test.ts @@ -5,11 +5,11 @@ import { ChatMessage, Preview, Quote, -} from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +} from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { TextEncoder } from 'util'; import { toNumber } from 'lodash'; -import { Constants } from '../../../session'; +import { Constants } from '../../../../session'; describe('ChatMessage', () => { it('can create empty message with just a timestamp', () => { diff --git a/ts/test/session/messages/ClosedGroupChatMessage_test.ts b/ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts similarity index 85% rename from ts/test/session/messages/ClosedGroupChatMessage_test.ts rename to ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts index 4b6408aae..beac186eb 100644 --- a/ts/test/session/messages/ClosedGroupChatMessage_test.ts +++ b/ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts @@ -3,13 +3,13 @@ import { expect } from 'chai'; import { ChatMessage, ClosedGroupChatMessage, -} from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +} from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { TextEncoder } from 'util'; -import { TestUtils } from '../../test-utils'; -import { StringUtils } from '../../../session/utils'; -import { PubKey } from '../../../session/types'; -import { Constants } from '../../../session'; +import { TestUtils } from '../../../test-utils'; +import { StringUtils } from '../../../../session/utils'; +import { PubKey } from '../../../../session/types'; +import { Constants } from '../../../../session'; describe('ClosedGroupChatMessage', () => { let groupId: PubKey; @@ -31,7 +31,12 @@ describe('ClosedGroupChatMessage', () => { .to.have.property('group') .to.have.deep.property( 'id', - new Uint8Array(StringUtils.encode(groupId.key, 'utf8')) + new Uint8Array( + StringUtils.encode( + PubKey.PREFIX_GROUP_TEXTSECURE + groupId.key, + 'utf8' + ) + ) ); expect(decoded.dataMessage) .to.have.property('group') diff --git a/ts/test/session/messages/DeviceLinkMessage_test.ts b/ts/test/session/unit/messages/DeviceLinkMessage_test.ts similarity index 95% rename from ts/test/session/messages/DeviceLinkMessage_test.ts rename to ts/test/session/unit/messages/DeviceLinkMessage_test.ts index 785bfa018..420d7f82f 100644 --- a/ts/test/session/messages/DeviceLinkMessage_test.ts +++ b/ts/test/session/unit/messages/DeviceLinkMessage_test.ts @@ -4,10 +4,10 @@ import { beforeEach } from 'mocha'; import { DeviceLinkGrantMessage, DeviceLinkRequestMessage, -} from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { LokiProfile } from '../../../types/Message'; -import { Constants } from '../../../session'; +} from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; +import { LokiProfile } from '../../../../types/Message'; +import { Constants } from '../../../../session'; describe('DeviceLinkMessage', () => { let linkRequestMessage: DeviceLinkRequestMessage; diff --git a/ts/test/session/messages/DeviceUnlinkMessage_test.ts b/ts/test/session/unit/messages/DeviceUnlinkMessage_test.ts similarity index 83% rename from ts/test/session/messages/DeviceUnlinkMessage_test.ts rename to ts/test/session/unit/messages/DeviceUnlinkMessage_test.ts index a26e1ba53..af8c66f34 100644 --- a/ts/test/session/messages/DeviceUnlinkMessage_test.ts +++ b/ts/test/session/unit/messages/DeviceUnlinkMessage_test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { DeviceUnlinkMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { Constants } from '../../../session'; +import { DeviceUnlinkMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; +import { Constants } from '../../../../session'; describe('DeviceUnlinkMessage', () => { let message: DeviceUnlinkMessage; diff --git a/ts/test/session/messages/EndSessionMessage_test.ts b/ts/test/session/unit/messages/EndSessionMessage_test.ts similarity index 92% rename from ts/test/session/messages/EndSessionMessage_test.ts rename to ts/test/session/unit/messages/EndSessionMessage_test.ts index 53e49f8df..fed88af24 100644 --- a/ts/test/session/messages/EndSessionMessage_test.ts +++ b/ts/test/session/unit/messages/EndSessionMessage_test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { EndSessionMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +import { EndSessionMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { TextEncoder } from 'util'; -import { Constants } from '../../../session'; +import { Constants } from '../../../../session'; describe('EndSessionMessage', () => { let message: EndSessionMessage; diff --git a/ts/test/session/messages/GroupInvitationMessage_test.ts b/ts/test/session/unit/messages/GroupInvitationMessage_test.ts similarity index 87% rename from ts/test/session/messages/GroupInvitationMessage_test.ts rename to ts/test/session/unit/messages/GroupInvitationMessage_test.ts index 5dddd2ecb..72bda5fb7 100644 --- a/ts/test/session/messages/GroupInvitationMessage_test.ts +++ b/ts/test/session/unit/messages/GroupInvitationMessage_test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { GroupInvitationMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { Constants } from '../../../session'; +import { GroupInvitationMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; +import { Constants } from '../../../../session'; describe('GroupInvitationMessage', () => { let message: GroupInvitationMessage; diff --git a/ts/test/session/messages/OpenGroupMessage_test.ts b/ts/test/session/unit/messages/OpenGroupMessage_test.ts similarity index 93% rename from ts/test/session/messages/OpenGroupMessage_test.ts rename to ts/test/session/unit/messages/OpenGroupMessage_test.ts index c3244ca75..48b6a4197 100644 --- a/ts/test/session/messages/OpenGroupMessage_test.ts +++ b/ts/test/session/unit/messages/OpenGroupMessage_test.ts @@ -3,9 +3,9 @@ import { expect } from 'chai'; import { AttachmentPointer, OpenGroupMessage, -} from '../../../session/messages/outgoing'; -import * as MIME from '../../../../ts/types/MIME'; -import { OpenGroup } from '../../../session/types'; +} from '../../../../session/messages/outgoing'; +import * as MIME from '../../../../../ts/types/MIME'; +import { OpenGroup } from '../../../../session/types'; describe('OpenGroupMessage', () => { const group = new OpenGroup({ diff --git a/ts/test/session/messages/ReceiptMessage_test.ts b/ts/test/session/unit/messages/ReceiptMessage_test.ts similarity index 92% rename from ts/test/session/messages/ReceiptMessage_test.ts rename to ts/test/session/unit/messages/ReceiptMessage_test.ts index 9643f92a9..bcc0f25ac 100644 --- a/ts/test/session/messages/ReceiptMessage_test.ts +++ b/ts/test/session/unit/messages/ReceiptMessage_test.ts @@ -4,10 +4,10 @@ import { beforeEach } from 'mocha'; import { DeliveryReceiptMessage, ReadReceiptMessage, -} from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +} from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { toNumber } from 'lodash'; -import { Constants } from '../../../session'; +import { Constants } from '../../../../session'; describe('ReceiptMessage', () => { let readMessage: ReadReceiptMessage; diff --git a/ts/test/session/messages/SessionEstablishedMessage_test.ts b/ts/test/session/unit/messages/SessionEstablishedMessage_test.ts similarity index 83% rename from ts/test/session/messages/SessionEstablishedMessage_test.ts rename to ts/test/session/unit/messages/SessionEstablishedMessage_test.ts index 270c4364d..e84693204 100644 --- a/ts/test/session/messages/SessionEstablishedMessage_test.ts +++ b/ts/test/session/unit/messages/SessionEstablishedMessage_test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { SessionEstablishedMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { Constants } from '../../../session'; +import { SessionEstablishedMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; +import { Constants } from '../../../../session'; describe('SessionEstablishedMessage', () => { let message: SessionEstablishedMessage; diff --git a/ts/test/session/messages/SessionResetMessage_test.ts b/ts/test/session/unit/messages/SessionResetMessage_test.ts similarity index 92% rename from ts/test/session/messages/SessionResetMessage_test.ts rename to ts/test/session/unit/messages/SessionResetMessage_test.ts index 2013e380b..9857be5db 100644 --- a/ts/test/session/messages/SessionResetMessage_test.ts +++ b/ts/test/session/unit/messages/SessionResetMessage_test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { SessionRequestMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +import { SessionRequestMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { TextDecoder, TextEncoder } from 'util'; -import { Constants } from '../../../session'; +import { Constants } from '../../../../session'; describe('SessionRequestMessage', () => { let message: SessionRequestMessage; diff --git a/ts/test/session/messages/TypingMessage_test.ts b/ts/test/session/unit/messages/TypingMessage_test.ts similarity index 90% rename from ts/test/session/messages/TypingMessage_test.ts rename to ts/test/session/unit/messages/TypingMessage_test.ts index f89a19abc..2d3c981a6 100644 --- a/ts/test/session/messages/TypingMessage_test.ts +++ b/ts/test/session/unit/messages/TypingMessage_test.ts @@ -1,13 +1,12 @@ import { expect } from 'chai'; -import { TypingMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { TextEncoder } from 'util'; +import { TypingMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import Long from 'long'; import { toNumber } from 'lodash'; -import { StringUtils } from '../../../session/utils'; -import { TestUtils } from '../../test-utils'; -import { Constants } from '../../../session'; +import { StringUtils } from '../../../../session/utils'; +import { TestUtils } from '../../../test-utils'; +import { Constants } from '../../../../session'; describe('TypingMessage', () => { it('has Action.STARTED if isTyping = true', () => { diff --git a/ts/test/session/protocols/MultiDeviceProtocol_test.ts b/ts/test/session/unit/protocols/MultiDeviceProtocol_test.ts similarity index 97% rename from ts/test/session/protocols/MultiDeviceProtocol_test.ts rename to ts/test/session/unit/protocols/MultiDeviceProtocol_test.ts index 1a5dd8220..aed18607f 100644 --- a/ts/test/session/protocols/MultiDeviceProtocol_test.ts +++ b/ts/test/session/unit/protocols/MultiDeviceProtocol_test.ts @@ -1,11 +1,11 @@ import { expect } from 'chai'; import * as sinon from 'sinon'; -import { TestUtils } from '../../test-utils'; -import { PairingAuthorisation } from '../../../../js/modules/data'; -import { MultiDeviceProtocol } from '../../../session/protocols'; -import { PubKey } from '../../../session/types'; -import { UserUtil } from '../../../util'; -import { StringUtils } from '../../../session/utils'; +import { TestUtils } from '../../../test-utils'; +import { PairingAuthorisation } from '../../../../../js/modules/data'; +import { MultiDeviceProtocol } from '../../../../session/protocols'; +import { PubKey } from '../../../../session/types'; +import { UserUtil } from '../../../../util'; +import { StringUtils } from '../../../../session/utils'; function generateFakeAuthorisations( primary: PubKey, diff --git a/ts/test/session/protocols/SessionProtocol_test.ts b/ts/test/session/unit/protocols/SessionProtocol_test.ts similarity index 97% rename from ts/test/session/protocols/SessionProtocol_test.ts rename to ts/test/session/unit/protocols/SessionProtocol_test.ts index 9ae9adec3..851f2866c 100644 --- a/ts/test/session/protocols/SessionProtocol_test.ts +++ b/ts/test/session/unit/protocols/SessionProtocol_test.ts @@ -1,13 +1,13 @@ import { expect } from 'chai'; -import { SessionProtocol } from '../../../session/protocols'; import * as sinon from 'sinon'; -import { Stubs, TestUtils } from '../../test-utils'; -import { UserUtil } from '../../../util'; -import { SessionRequestMessage } from '../../../session/messages/outgoing'; +import { SessionProtocol } from '../../../../session/protocols'; +import { Stubs, TestUtils } from '../../../test-utils'; +import { UserUtil } from '../../../../util'; +import { SessionRequestMessage } from '../../../../session/messages/outgoing'; import { TextEncoder } from 'util'; -import { MessageSender } from '../../../session/sending'; -import { PubKey } from '../../../session/types'; -import { Constants } from '../../../session'; +import { MessageSender } from '../../../../session/sending'; +import { PubKey } from '../../../../session/types'; +import { Constants } from '../../../../session'; // tslint:disable-next-line: max-func-body-length describe('SessionProtocol', () => { diff --git a/ts/test/session/sending/MessageQueue_test.ts b/ts/test/session/unit/sending/MessageQueue_test.ts similarity index 92% rename from ts/test/session/sending/MessageQueue_test.ts rename to ts/test/session/unit/sending/MessageQueue_test.ts index f0d94ac4a..41d65d9e8 100644 --- a/ts/test/session/sending/MessageQueue_test.ts +++ b/ts/test/session/unit/sending/MessageQueue_test.ts @@ -1,28 +1,25 @@ import chai from 'chai'; import * as sinon from 'sinon'; import _ from 'lodash'; -import { - GroupUtils, - PromiseUtils, - SyncMessageUtils, -} from '../../../session/utils'; -import { Stubs, TestUtils } from '../../../test/test-utils'; -import { MessageQueue } from '../../../session/sending/MessageQueue'; +import { describe } from 'mocha'; + +import { GroupUtils, PromiseUtils } from '../../../../session/utils'; +import { Stubs, TestUtils } from '../../../../test/test-utils'; +import { MessageQueue } from '../../../../session/sending/MessageQueue'; import { ClosedGroupMessage, ContentMessage, OpenGroupMessage, -} from '../../../session/messages/outgoing'; -import { PrimaryPubKey, PubKey, RawMessage } from '../../../session/types'; -import { UserUtil } from '../../../util'; -import { MessageSender } from '../../../session/sending'; +} from '../../../../session/messages/outgoing'; +import { PrimaryPubKey, PubKey, RawMessage } from '../../../../session/types'; +import { UserUtil } from '../../../../util'; +import { MessageSender } from '../../../../session/sending'; import { MultiDeviceProtocol, SessionProtocol, -} from '../../../session/protocols'; -import { PendingMessageCacheStub } from '../../test-utils/stubs'; -import { describe } from 'mocha'; -import { TestSyncMessage } from '../../test-utils/stubs/messages/TestSyncMessage'; +} from '../../../../session/protocols'; +import { PendingMessageCacheStub } from '../../../test-utils/stubs'; +import { TestSyncMessage } from '../../../test-utils/stubs/messages/TestSyncMessage'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); @@ -30,6 +27,7 @@ chai.use(chaiAsPromised); const { expect } = chai; +// tslint:disable-next-line: max-func-body-length describe('MessageQueue', () => { // Initialize new stubbed cache const sandbox = sinon.createSandbox(); @@ -324,12 +322,12 @@ describe('MessageQueue', () => { describe('open groups', async () => { let sendToOpenGroupStub: sinon.SinonStub< [OpenGroupMessage], - Promise + Promise<{ serverId: number; serverTimestamp: number }> >; beforeEach(() => { sendToOpenGroupStub = sandbox .stub(MessageSender, 'sendToOpenGroup') - .resolves(-1); + .resolves({ serverId: -1, serverTimestamp: -1 }); }); it('can send to open group', async () => { @@ -339,7 +337,7 @@ describe('MessageQueue', () => { }); it('should emit a success event when send was successful', async () => { - sendToOpenGroupStub.resolves(123456); + sendToOpenGroupStub.resolves({ serverId: 5125, serverTimestamp: 5125 }); const message = TestUtils.generateOpenGroupMessage(); const eventPromise = PromiseUtils.waitForTask(complete => { @@ -351,7 +349,7 @@ describe('MessageQueue', () => { }); it('should emit a fail event if something went wrong', async () => { - sendToOpenGroupStub.resolves(-1); + sendToOpenGroupStub.resolves({ serverId: -1, serverTimestamp: -1 }); const message = TestUtils.generateOpenGroupMessage(); const eventPromise = PromiseUtils.waitForTask(complete => { messageQueueStub.events.once('fail', complete); diff --git a/ts/test/session/sending/MessageSender_test.ts b/ts/test/session/unit/sending/MessageSender_test.ts similarity index 93% rename from ts/test/session/sending/MessageSender_test.ts rename to ts/test/session/unit/sending/MessageSender_test.ts index 1a6e33ee0..66ea30d39 100644 --- a/ts/test/session/sending/MessageSender_test.ts +++ b/ts/test/session/unit/sending/MessageSender_test.ts @@ -2,15 +2,15 @@ import { expect } from 'chai'; import * as crypto from 'crypto'; import * as sinon from 'sinon'; import { toNumber } from 'lodash'; -import { MessageSender } from '../../../session/sending'; -import LokiMessageAPI from '../../../../js/modules/loki_message_api'; -import { TestUtils } from '../../test-utils'; -import { UserUtil } from '../../../util'; -import { MessageEncrypter } from '../../../session/crypto'; -import { SignalService } from '../../../protobuf'; -import { OpenGroupMessage } from '../../../session/messages/outgoing'; -import { EncryptionType } from '../../../session/types/EncryptionType'; -import { PubKey } from '../../../session/types'; +import { MessageSender } from '../../../../session/sending'; +import LokiMessageAPI from '../../../../../js/modules/loki_message_api'; +import { TestUtils } from '../../../test-utils'; +import { UserUtil } from '../../../../util'; +import { MessageEncrypter } from '../../../../session/crypto'; +import { SignalService } from '../../../../protobuf'; +import { OpenGroupMessage } from '../../../../session/messages/outgoing'; +import { EncryptionType } from '../../../../session/types/EncryptionType'; +import { PubKey } from '../../../../session/types'; describe('MessageSender', () => { const sandbox = sinon.createSandbox(); @@ -36,7 +36,7 @@ describe('MessageSender', () => { }); describe('send', () => { - const ourNumber = 'ourNumber'; + const ourNumber = '0123456789abcdef'; let lokiMessageAPISendStub: sinon.SinonStub< [string, Uint8Array, number, number], Promise diff --git a/ts/test/session/sending/PendingMessageCache_test.ts b/ts/test/session/unit/sending/PendingMessageCache_test.ts similarity index 97% rename from ts/test/session/sending/PendingMessageCache_test.ts rename to ts/test/session/unit/sending/PendingMessageCache_test.ts index 995d424e3..63177c380 100644 --- a/ts/test/session/sending/PendingMessageCache_test.ts +++ b/ts/test/session/unit/sending/PendingMessageCache_test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import * as sinon from 'sinon'; import * as _ from 'lodash'; -import { MessageUtils } from '../../../session/utils'; -import { TestUtils } from '../../../test/test-utils'; -import { PendingMessageCache } from '../../../session/sending/PendingMessageCache'; -import { SessionProtocol } from '../../../session/protocols'; +import { MessageUtils } from '../../../../session/utils'; +import { TestUtils } from '../../../../test/test-utils'; +import { PendingMessageCache } from '../../../../session/sending/PendingMessageCache'; +import { SessionProtocol } from '../../../../session/protocols'; // Equivalent to Data.StorageItem interface StorageItem { diff --git a/ts/test/session/utils/JobQueue_test.ts b/ts/test/session/unit/utils/JobQueue_test.ts similarity index 96% rename from ts/test/session/utils/JobQueue_test.ts rename to ts/test/session/unit/utils/JobQueue_test.ts index 379641ae4..1abb38b87 100644 --- a/ts/test/session/utils/JobQueue_test.ts +++ b/ts/test/session/unit/utils/JobQueue_test.ts @@ -1,7 +1,7 @@ import chai from 'chai'; import { v4 as uuid } from 'uuid'; -import { JobQueue } from '../../../session/utils/JobQueue'; -import { TestUtils } from '../../test-utils'; +import { JobQueue } from '../../../../session/utils/JobQueue'; +import { TestUtils } from '../../../test-utils'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/session/utils/Messages_test.ts b/ts/test/session/unit/utils/Messages_test.ts similarity index 94% rename from ts/test/session/utils/Messages_test.ts rename to ts/test/session/unit/utils/Messages_test.ts index cd8b052b9..596bbfe88 100644 --- a/ts/test/session/utils/Messages_test.ts +++ b/ts/test/session/unit/utils/Messages_test.ts @@ -1,14 +1,14 @@ import chai from 'chai'; import * as sinon from 'sinon'; import crypto from 'crypto'; -import { TestUtils } from '../../test-utils/'; -import { MessageUtils } from '../../../session/utils/'; -import { EncryptionType, PubKey } from '../../../session/types/'; -import { SessionProtocol } from '../../../session/protocols'; +import { TestUtils } from '../../../test-utils'; +import { MessageUtils } from '../../../../session/utils'; +import { EncryptionType, PubKey } from '../../../../session/types'; +import { SessionProtocol } from '../../../../session/protocols'; import { MediumGroupChatMessage, SessionRequestMessage, -} from '../../../session/messages/outgoing'; +} from '../../../../session/messages/outgoing'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/session/utils/Promise_test.ts b/ts/test/session/unit/utils/Promise_test.ts similarity index 95% rename from ts/test/session/utils/Promise_test.ts rename to ts/test/session/unit/utils/Promise_test.ts index 476a2ff6a..28ec57532 100644 --- a/ts/test/session/utils/Promise_test.ts +++ b/ts/test/session/unit/utils/Promise_test.ts @@ -1,7 +1,7 @@ import chai from 'chai'; import * as sinon from 'sinon'; -import { PromiseUtils } from '../../../session/utils/'; +import { PromiseUtils } from '../../../../session/utils'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); @@ -60,7 +60,7 @@ describe('Promise Utils', () => { const completionSpy = sandbox.spy(); const task = (_done: any) => undefined; - const promise = PromiseUtils.poll(task, { timeout: 1 }); + const promise = PromiseUtils.poll(task, { timeoutMs: 1 }); await expect(promise).to.be.rejectedWith('Periodic check timeout'); expect(pollSpy.callCount).to.equal(1); @@ -82,7 +82,7 @@ describe('Promise Utils', () => { } }; - const promise = PromiseUtils.poll(task, { timeout, interval }); + const promise = PromiseUtils.poll(task, { timeoutMs: timeout, interval }); await expect(promise).to.be.fulfilled; expect(pollSpy.callCount).to.equal(1); diff --git a/ts/test/session/utils/String_test.ts b/ts/test/session/unit/utils/String_test.ts similarity index 98% rename from ts/test/session/utils/String_test.ts rename to ts/test/session/unit/utils/String_test.ts index f9b3be86d..5e42bf731 100644 --- a/ts/test/session/utils/String_test.ts +++ b/ts/test/session/unit/utils/String_test.ts @@ -2,8 +2,8 @@ import chai from 'chai'; import ByteBuffer from 'bytebuffer'; // Can't import type as StringUtils.Encoding -import { Encoding } from '../../../session/utils/String'; -import { StringUtils } from '../../../session/utils/'; +import { Encoding } from '../../../../session/utils/String'; +import { StringUtils } from '../../../../session/utils'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/session/utils/SyncMessage_test.ts b/ts/test/session/unit/utils/SyncMessage_test.ts similarity index 92% rename from ts/test/session/utils/SyncMessage_test.ts rename to ts/test/session/unit/utils/SyncMessage_test.ts index ff6f168d9..39178028e 100644 --- a/ts/test/session/utils/SyncMessage_test.ts +++ b/ts/test/session/unit/utils/SyncMessage_test.ts @@ -1,11 +1,11 @@ import chai from 'chai'; import * as sinon from 'sinon'; -import { SyncMessageUtils } from '../../../session/utils/'; -import { TestUtils } from '../../test-utils'; -import { UserUtil } from '../../../util'; -import { MultiDeviceProtocol } from '../../../session/protocols'; -import { SyncMessage } from '../../../session/messages/outgoing'; +import { SyncMessageUtils } from '../../../../session/utils'; +import { TestUtils } from '../../../test-utils'; +import { UserUtil } from '../../../../util'; +import { MultiDeviceProtocol } from '../../../../session/protocols'; +import { SyncMessage } from '../../../../session/messages/outgoing'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/test-utils/utils/stubbing.ts b/ts/test/test-utils/utils/stubbing.ts index 9391204d9..ce004f8a2 100644 --- a/ts/test/test-utils/utils/stubbing.ts +++ b/ts/test/test-utils/utils/stubbing.ts @@ -1,6 +1,6 @@ import * as sinon from 'sinon'; -import * as crypto from 'crypto'; import * as DataShape from '../../../../js/modules/data'; +import { Application } from 'spectron'; const globalAny: any = global; const sandbox = sinon.createSandbox(); @@ -54,6 +54,27 @@ export function stubWindow( }; } +export async function spyMessageQueueSend(app: Application) { + await app.webContents.executeJavaScript( + "var messageQueueSpy = sinon.spy(window.libsession.getMessageQueue(), 'send'); " + ); +} + +export async function getAllMessagesSent(app: Application) { + const messageQueueSpy = await app.webContents.executeJavaScript( + 'messageQueueSpy.args;' + ); + if (!messageQueueSpy) { + throw new Error( + 'Be sure to call spyMessageQueueSend() on the correct app first.' + ); + } + const messages = await app.webContents.executeJavaScript( + 'messageQueueSpy.args' + ); + return messages; +} + export function restoreStubs() { globalAny.window = undefined; sandbox.restore(); diff --git a/ts/types/PhoneNumber.ts b/ts/types/PhoneNumber.ts index 9c40992c8..54238ef68 100644 --- a/ts/types/PhoneNumber.ts +++ b/ts/types/PhoneNumber.ts @@ -37,7 +37,7 @@ function validate(number: string) { // Check if it's hex const isHex = number.replace(/[\s]*/g, '').match(/^[0-9a-fA-F]+$/); if (!isHex) { - return 'invalidHexId'; + return 'invalidSessionId'; } // Check if the pubkey length is 33 and leading with 05 or of length 32 diff --git a/ts/util/getInitials.ts b/ts/util/getInitials.ts index 1b38c0984..dd0d62464 100644 --- a/ts/util/getInitials.ts +++ b/ts/util/getInitials.ts @@ -1,21 +1,11 @@ -const BAD_CHARACTERS = /[^A-Za-z\s]+/g; -const WHITESPACE = /\s+/g; - -function removeNonInitials(name: string) { - return name.replace(BAD_CHARACTERS, '').replace(WHITESPACE, ' '); -} - export function getInitials(name?: string): string | undefined { - if (!name) { + if (!name || !name.length) { return; } - const cleaned = removeNonInitials(name); - const parts = cleaned.split(' '); - const initials = parts.map(part => part.trim()[0]); - if (!initials.length) { - return; + if (name.length > 2 && name.startsWith('05')) { + return name[2]; } - return initials.slice(0, 2).join(''); + return name[0]; } diff --git a/ts/util/lint/exceptions.json b/ts/util/lint/exceptions.json index 82cf37a0b..bac2f1298 100644 --- a/ts/util/lint/exceptions.json +++ b/ts/util/lint/exceptions.json @@ -372,15 +372,7 @@ "updated": "2018-09-19T18:13:29.628Z", "reasonDetail": "Interacting with already-existing DOM nodes" }, - { - "rule": "jQuery-$(", - "path": "js/views/confirmation_dialog_view.js", - "line": " this.$('.cancel').focus();", - "lineNumber": 55, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, + { "rule": "jQuery-$(", "path": "js/views/debug_log_view.js", @@ -634,99 +626,17 @@ }, { "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr img').remove();", - "lineNumber": 133, + "reasonCategory": "usageTrusted", + "updated": "2018-09-19T21:59:32.770Z", + "reasonDetail": "Protected from arbitrary input" + }, + { "reasonCategory": "usageTrusted", "updated": "2018-09-19T21:59:32.770Z", "reasonDetail": "Protected from arbitrary input" }, { "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr .container').show();", - "lineNumber": 135, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " if ($('#qr').length === 0) {", - "lineNumber": 139, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr .container').hide();", - "lineNumber": 144, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.qr = new QRCode(this.$('#qr')[0]).makeCode(url);", - "lineNumber": 145, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr').addClass('ready');", - "lineNumber": 147, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$(DEVICE_NAME_SELECTOR).val(deviceName || window.getHostName());", - "lineNumber": 152, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#link-phone').submit();", - "lineNumber": 157, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#link-phone').submit(e => {", - "lineNumber": 167, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " let name = this.$(DEVICE_NAME_SELECTOR).val();", - "lineNumber": 171, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$(DEVICE_NAME_SELECTOR).focus();", - "lineNumber": 174, "reasonCategory": "usageTrusted", "updated": "2018-09-19T21:59:32.770Z", "reasonDetail": "Protected from arbitrary input" diff --git a/ts/window.d.ts b/ts/window.d.ts index 1e8994abc..3feda5534 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -10,6 +10,8 @@ import { SwarmPolling } from './session/snode_api/swarmPolling'; import { LibTextsecure } from '../libtextsecure'; import { ConversationType } from '../js/modules/data'; +import { RecoveryPhraseUtil } from '../libloki/modules/mnemonic'; +import { ConfirmationDialogParams } from '../background'; /* We declare window stuff here instead of global.d.ts because we are importing other declarations. @@ -37,7 +39,7 @@ declare global { attemptConnection: ConversationType; clearLocalData: any; clipboard: any; - confirmationDialog: any; + confirmationDialog: (params: ConfirmationDialogParams) => any; dcodeIO: any; deleteAccount: any; displayNameRegex: any; @@ -67,7 +69,7 @@ declare global { lokiPublicChatAPI: LokiPublicChatFactoryInterface; lokiSnodeAPI: LokiSnodeAPI; lokiPublicChatAPI: LokiPublicChatFactoryAPI; - mnemonic: any; + mnemonic: RecoveryPhraseUtil; onLogin: any; passwordUtil: any; pushToast: any; @@ -78,8 +80,8 @@ declare global { setSettingValue: any; shortenPubkey: any; showEditProfileDialog: any; + getOurDisplayName: () => string | undefined; showPasswordDialog: any; - showQRDialog: any; showSeedDialog: any; storage: any; textsecure: LibTextsecure;