Merge branch 'devel' into next

This commit is contained in:
or-else
2021-01-28 17:18:40 -08:00
34 changed files with 2095 additions and 1868 deletions
+1 -1
View File
@@ -37,7 +37,7 @@ As of the time of this writing the following translations exist:
* Russian
* Spanish
More translations are welcome. Send a pull request with a json file with translated strings. Take a look at [English](/src/i18n/en.json), [Russian](/src/i18n/ru.json), or [Simplified Chinese](/src/i18n/zh.json) translations for guidance.
More translations are welcome. The source file with the original English strings and context explanations is located at [/src/i18n/ex/base-en.json](/src/i18n/ex/base-en.json). Only `defaultMessage` needs to be translated. Send a pull request with a json file with translated strings. Take a look at [Spanish](/src/i18n/es.json), [Russian](/src/i18n/ru.json), or [Simplified Chinese](/src/i18n/zh.json) translations for guidance.
## Not done yet
+16 -4
View File
@@ -7,12 +7,14 @@
"url": "https://github.com/tinode/example-react-js.git"
},
"scripts": {
"build": "npm run vers && npm run build:prod && npm run build:dev && npm run build:css && npm run build:i18n",
"build": "npm run vers && npm run build:css && npm run extract && npm run build:i18n && npm run build:prod && npm run build:dev",
"build:css": "postcss css/base.css > css/base.min.css",
"build:dev": "webpack --mode development",
"build:prod": "webpack --mode production",
"build:i18n": "node scripts/flatten-messages.js",
"vers": "node scripts/gen-version.js"
"build:i18n": "node scripts/pack-messages.js",
"vers": "node scripts/gen-version.js",
"extract": "formatjs extract 'src/**/*.jsx' --out-file src/i18n/ex/base-en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]'",
"compile": "formatjs compile"
},
"browserslist": "> 0.5%, not IE 11",
"files": [
@@ -48,6 +50,15 @@
"react",
"web"
],
"locales": [
"de",
"en",
"es",
"ko",
"ro",
"ru",
"zh"
],
"main": "umd/index.prod.js",
"bugs": {
"url": "https://github.com/tinode/example-react-js/issues"
@@ -67,8 +78,9 @@
"@babel/core": "^7.12.10",
"@babel/preset-env": "^7.12.11",
"@babel/preset-react": "^7.12.10",
"@formatjs/cli": "^3.0.5",
"babel-loader": "^8.2.2",
"babel-plugin-formatjs": "^9.0.2",
"babel-plugin-formatjs": "^9.0.4",
"browserslist": "^4.16.1",
"copy-webpack-plugin": "^6.4.1",
"cssnano": "^4.1.10",
@@ -1,46 +1,37 @@
// 1.Flattens messages extracted via the React Intl Babel plugin. An error will be
// thrown if there are messages with the same `id`. The result is a file containing
// 1. Takes file with messages extracted via the React Intl Babel plugin and converts it into a file containing
// `id: message` pairs in "en" locale.
//
// 2. Takes all translations and groups them into a single file.
var fs = require('fs');
var path = require('path');
var globSync = require('glob').sync;
var mkdirpSync = require('mkdirp').sync;
const fs = require('fs');
const path = require('path');
const globSync = require('glob').sync;
const mkdirpSync = require('mkdirp').sync;
const EXTRACTED_STRINGS = './src/i18n/ex/base-en.json';
const DEFAULT_TRANSLATION = 'en.json';
const MESSAGES_PATTERN = './src/i18n/src/**/*.json';
const LANG_DIR = './src/i18n/';
const LANG_PATTERN = './src/i18n/*.json';
const FINAL_FILE = './src/messages.json';
const TRANSLATIONS = './src/translations.js'
const MISSING_MARKER = ':!![MISSING]!!:';
const OBSOLETE_MARKER = ':!![OBSOLETE]!!:';
// The react-intl-babel-plugin saves extracted messages
// into files, one fine per component. Rewrite them into
// a single file en.json.
let messages = globSync(MESSAGES_PATTERN)
.map((filename) => fs.readFileSync(filename, 'utf8'))
.map((file) => JSON.parse(file))
.reduce((collection, descriptors) => {
descriptors.forEach(({id, defaultMessage}) => {
if (!defaultMessage) {
return;
}
if (collection.hasOwnProperty(id)) {
// Message is already defined.
throw new Error(`Duplicate message id: ${id}`);
}
collection[id] = defaultMessage;
});
// The formatjs/cli saves extracted messages into a file {'message_id': {defaultMessage: 'default message text', description: '...'}, ...}.
// Rewrite them into a single file en.json {'message_id': 'default message text', }.
return collection;
}, {});
// Read master-set of messages in default language.
const baseMessages = JSON.parse(fs.readFileSync(EXTRACTED_STRINGS, 'utf8'));
// Convert.
const en = {};
for (const [id, msg] of Object.entries(baseMessages)) {
en[id] = msg.defaultMessage;
}
// Write extracted strings into default language file.
let filename = path.join(LANG_DIR, DEFAULT_TRANSLATION);
mkdirpSync(path.dirname(filename));
fs.writeFileSync(filename, JSON.stringify(messages, null, 2)+"\n");
fs.writeFileSync(filename, JSON.stringify(en, null, 2)+"\n");
// Find messages present in en.json but missing in translations and vice versa.
// Mark missing or obsolete messages as such in translation files.
@@ -50,19 +41,24 @@ globSync(LANG_PATTERN)
if (parts[parts.length-1] != DEFAULT_TRANSLATION) {
const translated = JSON.parse(fs.readFileSync(filename, 'utf8'));
// Find missing messages.
Object.entries(messages).forEach((ent) => {
Object.entries(baseMessages).forEach((ent) => {
if (!translated.hasOwnProperty(ent[0])) {
// Missing translation.
translated[ent[0]] = MISSING_MARKER + ent[1];
} else if (translated[ent[0]].indexOf(OBSOLETE_MARKER) === 0) {
// No longer obsolete. Remove obsolete marker.
translated[ent[0]] = translated[ent[0]].substring(0, OBSOLETE_MARKER.length);
}
});
// Find no longer needed messages.
Object.entries(translated).forEach((ent) => {
if (!messages.hasOwnProperty(ent[0])) {
if (!baseMessages.hasOwnProperty(ent[0]) && translated.hasOwnProperty(ent[0])) {
let val = translated[ent[0]];
if (val.indexOf(MISSING_MARKER) == 0) {
if (val.indexOf(MISSING_MARKER) === 0) {
// No longer missing.
val = val.substring(0, MISSING_MARKER.length);
}
if (val.indexOf(OBSOLETE_MARKER) != 0) {
if (val.indexOf(OBSOLETE_MARKER) !== 0) {
val = OBSOLETE_MARKER + val;
}
translated[ent[0]] = val;
@@ -72,18 +68,21 @@ globSync(LANG_PATTERN)
}
});
// List of all available translations.
const languageList = {};
// Combine all translations into a single json {"lang_1": {...}, "lang_2: {...}"}
// while removing messages marked as missing or obsolete.
// Read all translations.
messages = globSync(LANG_PATTERN)
const messages = globSync(LANG_PATTERN)
.map((filename) => {
const parts = filename.split('/');
const locale = parts[parts.length - 1].split('.json')[0];
const translated = JSON.parse(fs.readFileSync(filename, 'utf8'));
languageList[locale] = locale;
// Strip messages prefixed with MISSING or OBSOLETE markers.
for (let id in translated) {
// process.stdout.write("-- handling translation " + id + "; "+ String(translated[id]) + "; in " + String(filename) + "; --\n");
if (translated[id].indexOf(OBSOLETE_MARKER) == 0 ||
translated[id].indexOf(MISSING_MARKER) == 0) {
delete translated[id];
+1 -1
View File
@@ -23,7 +23,7 @@
"archived_contacts": "Archivierte Kontakte ({count})",
"contacts_not_found": "Sie haben keine Unterhaltungen<br />¯∖_(ツ)_/¯",
"full_name_prompt": "Vollständiger Name, z.B. Lisa Musterfrau",
"email_prompt": "E-Mail, z.B. jdoe@beispiel.de",
"email_prompt": "E-Mail, z.B. lisam@beispiel.de",
"button_sign_up": "Anmelden",
"label_your_name": "Ihr Name",
"label_user_id": "ID:",
+154 -154
View File
@@ -1,176 +1,176 @@
{
"validate_credential_action": "confirm",
"title_tag_manager": "Tags (user discovery)",
"label_user_contacts": "Contacts:",
"button_add_another": "Add another",
"label_message_sound": "Message sound:",
"label_push_notifications": "Notification alerts:",
"label_push_notifications_disabled": "Notification alerts (requires HTTPS):",
"label_incognito_mode": "Incognito mode:",
"delete_account": "Delete account",
"delete_account_arning": "Are you sure you want to delete your account? It cannot be undone.",
"label_password": "Password",
"password_unchanged_prompt": "Unchanged",
"button_logout": "Logout",
"button_delete_account": "Delete account",
"label_default_access_mode": "Default access mode:",
"blocked_contacts_link": "Blocked contacts ({count})",
"link_contact_us": "Contact Us",
"link_terms_of_service": "Terms of Service",
"link_privacy_policy": "Privacy Policy",
"label_sdk": "SDK:",
"label_server_address": "Server address:",
"archived_contacts": "Archived contacts ({count})",
"contacts_not_found": "You have no chats<br />¯∖_(ツ)_/¯",
"full_name_prompt": "Full name, e.g. John Doe",
"email_prompt": "Email, e.g. jdoe@example.com",
"button_sign_up": "Sign up",
"label_your_name": "Your name",
"label_user_id": "ID:",
"button_edit": "Edit",
"requested_permissions": "Requested",
"granted_permissions": "Granted",
"menu_item_edit_permissions": "Edit permissions",
"label_other_user": "Other",
"action_clear_messages": "Clear Messages",
"clear_messages_warning": "Are you sure you want to clear all messages? It cannot be undone.",
"action_delete_messages": "Clear Messages for All",
"delete_messages_warning": "Are you sure you want to delete all messages for everyone? It cannot be undone.",
"action_leave_chat": "Leave Conversation",
"leave_chat_warning": "Are you sure you want to leave this conversation?",
"action_block_contact": "Block Contact",
"block_contact_warning": "Are you sure you want to block this contact?",
"action_report_chat": "Report Conversation",
"report_chat_warning": "Are you sure you want to block and report this conversation?",
"title_info": "Info",
"label_topic_name": "Name",
"label_private": "Private comment",
"private_editing_placeholder": "Visible to you only",
"label_muting_topic": "Muted:",
"action_cancel": "cancel",
"action_clear_messages": "Clear Messages",
"action_delete_messages": "Clear Messages for All",
"action_leave_chat": "Leave Conversation",
"action_more": "More",
"label_your_permissions": "Your permissions:",
"label_permissions": "Permissions:",
"label_you": "You:",
"label_default_access": "Default access mode:",
"label_group_members": "Group members:",
"action_report_chat": "Report Conversation",
"archived_contacts": "Archived contacts ({count})",
"badge_owner": "owner",
"badge_you": "you",
"block_contact_warning": "Are you sure you want to block this contact?",
"blocked_contacts_link": "Blocked contacts ({count})",
"button_add_another": "Add another",
"button_add_members": "Add members",
"group_has_no_members": "No members",
"login_prompt": "Login",
"password_prompt": "Password",
"stay_logged_in": "Stay logged in",
"forgot_password_link": "Forgot password?",
"button_sign_in": "Sign in",
"label_client": "Client:",
"label_server": "Server:",
"online_now": "online now",
"last_seen_timestamp": "Last seen",
"title_not_found": "Not found",
"channel": "channel",
"unnamed_topic": "Unnamed",
"messages_not_readable": "no access to messages",
"peers_messaging_disabled": "Peer's messaging is disabled.",
"enable_peers_messaging": "Enable",
"search_for_contacts": "Use search to find contacts",
"search_no_results": "Search returned no results",
"tabtitle_find_user": "find",
"tabtitle_new_group": "new group",
"tabtitle_group_by_id": "by id",
"new_password_placeholder": "Enter new password",
"label_reset_password": "Send a password reset email:",
"credential_email_prompt": "Your registration email",
"button_cancel": "Cancel",
"button_confirm": "Confirm",
"button_create": "Create",
"button_delete_account": "Delete account",
"button_edit": "Edit",
"button_logout": "Logout",
"button_ok": "OK",
"button_reset": "Reset",
"button_send_request": "Send request",
"label_server_to_use": "Server to use:",
"label_wire_transport": "Wire transport:",
"button_sign_in": "Sign in",
"button_sign_up": "Sign up",
"button_subscribe": "Subscribe",
"button_update": "Update",
"sidepanel_title_login": "Sign In",
"sidepanel_title_register": "Create Account",
"sidepanel_title_settings": "Settings",
"sidepanel_title_account_settings": "Account Settings",
"sidepanel_title_acc_general": "General",
"sidepanel_title_acc_security": "Security",
"sidepanel_title_acc_notifications": "Notifications",
"sidepanel_title_acc_support": "Support",
"sidepanel_title_newtpk": "Start New Chat",
"sidepanel_title_cred": "Confirm Credentials",
"sidepanel_title_reset": "Reset Password",
"sidepanel_title_archive": "Archived Chats",
"sidepanel_title_blocked": "Blocked Chats",
"reconnect_countdown": "Disconnected. Reconnecting in {seconds}…",
"reconnect_now": "Try now",
"push_init_failed": "Failed to initialize push notifications",
"invalid_security_token": "Invalid security token",
"no_connection": "No connection",
"cannot_initiate_file_upload": "Cannot initiate file upload.",
"channel": "channel",
"channel_prompt": "This is a channel",
"chat_invitation": "You are invited to start a new chat. What would you like to do?",
"chat_invitation_accept": "Accept",
"chat_invitation_block": "Block",
"chat_invitation_ignore": "Ignore",
"clear_messages_warning": "Are you sure you want to clear all messages? It cannot be undone.",
"code_doesnot_match": "Code does not match",
"update_available": "Update available.",
"reload_update": "Reload",
"phone_dative": "phone",
"email_dative": "email",
"enter_confirmation_code_prompt": "Enter confirmation code sent to you by {method}:",
"numeric_confirmation_code_prompt": "Numbers only",
"button_confirm": "Confirm",
"save_attachment": "save",
"contacts_not_found": "You have no chats<br />¯∖_(ツ)_/¯",
"contacts_not_found_short": "No contacts match ''{query}''",
"credential_email_prompt": "Your registration email",
"delete_account": "Delete account",
"delete_account_arning": "Are you sure you want to delete your account? It cannot be undone.",
"delete_messages_warning": "Are you sure you want to delete all messages for everyone? It cannot be undone.",
"deleted_content": "content deleted",
"download_action": "download",
"email_dative": "email",
"email_prompt": "Email, e.g. jdoe@example.com",
"enable_peers_messaging": "Enable",
"enter_confirmation_code_prompt": "Enter confirmation code sent to you by {method}:",
"error_invalid_id": "Invalid ID",
"file_attachment_too_large": "The file size {size} exceeds the {limit} limit.",
"forgot_password_link": "Forgot password?",
"full_name_prompt": "Full name, e.g. John Doe",
"granted_permissions": "Granted",
"group_has_no_members": "No members",
"group_user_id_prompt": "Group or User ID",
"image_caption_prompt": "Image caption",
"invalid_content": "invalid content",
"user_not_found": "Not found",
"badge_you": "you",
"badge_owner": "owner",
"menu_item_info": "Info",
"invalid_security_token": "Invalid security token",
"label_client": "Client:",
"label_content_type": "Content type:",
"label_default_access": "Default access mode:",
"label_default_access_mode": "Default access mode:",
"label_file_name": "File name:",
"label_group_members": "Group members:",
"label_incognito_mode": "Incognito mode:",
"label_message_sound": "Message sound:",
"label_muting_topic": "Muted:",
"label_other_user": "Other",
"label_password": "Password",
"label_permissions": "Permissions:",
"label_private": "Private comment",
"label_push_notifications": "Notification alerts:",
"label_push_notifications_disabled": "Notification alerts (requires HTTPS):",
"label_reset_password": "Send a password reset email:",
"label_sdk": "SDK:",
"label_server": "Server:",
"label_server_address": "Server address:",
"label_server_to_use": "Server to use:",
"label_size": "Size:",
"label_topic_name": "Name",
"label_user_contacts": "Contacts:",
"label_user_id": "ID:",
"label_wire_transport": "Wire transport:",
"label_you": "You:",
"label_your_name": "Your name",
"label_your_permissions": "Your permissions:",
"last_seen_timestamp": "Last seen",
"leave_chat_warning": "Are you sure you want to leave this conversation?",
"link_contact_us": "Contact Us",
"link_privacy_policy": "Privacy Policy",
"link_terms_of_service": "Terms of Service",
"login_prompt": "Login",
"menu_item_archive_topic": "Archive",
"menu_item_block": "Block",
"menu_item_clear_messages": "Clear messages",
"menu_item_clear_messages_for_all": "Clear for All",
"menu_item_delete": "Delete",
"menu_item_delete_for_all": "Delete for All",
"menu_item_send_retry": "Retry",
"menu_item_mute": "Mute",
"menu_item_unmute": "Unmute",
"menu_item_delete_topic": "Delete",
"topic_delete_warning": "Are you sure you want to delete this conversation?",
"menu_item_unblock": "Unblock",
"menu_item_block": "Block",
"topic_block_warning": "Are you sure you want to block this conversation?",
"menu_item_edit_permissions": "Edit permissions",
"menu_item_info": "Info",
"menu_item_member_delete": "Remove",
"menu_item_archive_topic": "Archive",
"action_cancel": "cancel",
"upload_finishing": "finishing...",
"no_contacts": "You have no contacts :-(",
"contacts_not_found_short": "No contacts match ''{query}''",
"title_group_members": "Group Members",
"title_all_contacts": "All Contacts",
"button_ok": "OK",
"button_cancel": "Cancel",
"more_online_members": "+{overflow} more",
"download_action": "download",
"label_file_name": "File name:",
"label_content_type": "Content type:",
"label_size": "Size:",
"chat_invitation": "You are invited to start a new chat. What would you like to do?",
"chat_invitation_accept": "Accept",
"chat_invitation_ignore": "Ignore",
"chat_invitation_block": "Block",
"error_invalid_id": "Invalid ID",
"group_user_id_prompt": "Group or User ID",
"button_subscribe": "Subscribe",
"topic_name_editing_placeholder": "Freeform name of the group",
"channel_prompt": "This is a channel",
"button_create": "Create",
"permission_join": "Join ({val})",
"permission_read": "Read ({val})",
"permission_write": "Write ({val})",
"permission_pres": "Get notified ({val})",
"permission_admin": "Approve ({val})",
"permission_share": "Share ({val})",
"permission_delete": "Delete ({val})",
"permission_owner": "Owner ({val})",
"title_permissions": "Permissions",
"menu_item_mute": "Mute",
"menu_item_send_retry": "Retry",
"menu_item_unblock": "Unblock",
"menu_item_unmute": "Unmute",
"message_sending": "sending...",
"message_sending_failed": "failed",
"search_placeholder": "List like email:alice@example.com, tel:17025550003...",
"messages_not_readable": "no access to messages",
"messaging_disabled_prompt": "Messaging disabled",
"more_online_members": "+{overflow} more",
"new_message_prompt": "New message",
"image_caption_prompt": "Image caption",
"file_attachment_too_large": "The file size {size} exceeds the {limit} limit.",
"cannot_initiate_file_upload": "Cannot initiate file upload.",
"tags_not_found": "No tags defined. Add some.",
"new_password_placeholder": "Enter new password",
"no_connection": "No connection",
"no_contacts": "You have no contacts :-(",
"numeric_confirmation_code_prompt": "Numbers only",
"online_now": "online now",
"password_prompt": "Password",
"password_unchanged_prompt": "Unchanged",
"peers_messaging_disabled": "Peer's messaging is disabled.",
"permission_admin": "Approve ({val})",
"permission_delete": "Delete ({val})",
"permission_join": "Join ({val})",
"permission_owner": "Owner ({val})",
"permission_pres": "Get notified ({val})",
"permission_read": "Read ({val})",
"permission_share": "Share ({val})",
"permission_write": "Write ({val})",
"phone_dative": "phone",
"private_editing_placeholder": "Visible to you only",
"push_init_failed": "Failed to initialize push notifications",
"reconnect_countdown": "Disconnected. Reconnecting in {seconds}…",
"reconnect_now": "Try now",
"reload_update": "Reload",
"report_chat_warning": "Are you sure you want to block and report this conversation?",
"requested_permissions": "Requested",
"save_attachment": "save",
"search_for_contacts": "Use search to find contacts",
"search_no_results": "Search returned no results",
"search_placeholder": "List like email:alice@example.com, tel:17025550003...",
"sidepanel_title_acc_general": "General",
"sidepanel_title_acc_notifications": "Notifications",
"sidepanel_title_acc_security": "Security",
"sidepanel_title_acc_support": "Support",
"sidepanel_title_account_settings": "Account Settings",
"sidepanel_title_archive": "Archived Chats",
"sidepanel_title_blocked": "Blocked Chats",
"sidepanel_title_cred": "Confirm Credentials",
"sidepanel_title_login": "Sign In",
"sidepanel_title_newtpk": "Start New Chat",
"sidepanel_title_register": "Create Account",
"sidepanel_title_reset": "Reset Password",
"sidepanel_title_settings": "Settings",
"stay_logged_in": "Stay logged in",
"tabtitle_find_user": "find",
"tabtitle_group_by_id": "by id",
"tabtitle_new_group": "new group",
"tags_editor_no_tags": "Add some tags",
"title_manage_tags": "Manage"
"tags_not_found": "No tags defined. Add some.",
"title_all_contacts": "All Contacts",
"title_group_members": "Group Members",
"title_info": "Info",
"title_manage_tags": "Manage",
"title_not_found": "Not found",
"title_permissions": "Permissions",
"title_tag_manager": "Tags (user discovery)",
"topic_block_warning": "Are you sure you want to block this conversation?",
"topic_delete_warning": "Are you sure you want to delete this conversation?",
"topic_name_editing_placeholder": "Freeform name of the group",
"unnamed_topic": "Unnamed",
"update_available": "Update available.",
"upload_finishing": "finishing...",
"user_not_found": "Not found",
"validate_credential_action": "confirm"
}
+696
View File
@@ -0,0 +1,696 @@
{
"action_block_contact": {
"defaultMessage": "Block Contact",
"description": "Flat button [Block Contact]"
},
"action_cancel": {
"defaultMessage": "cancel",
"description": "Call to action [cancel]"
},
"action_clear_messages": {
"defaultMessage": "Clear Messages",
"description": "Flat button [Clear Messages] (soft-delete messages)"
},
"action_delete_messages": {
"defaultMessage": "Clear Messages for All",
"description": "Flat button [Clear for All] (hard-delete all messages)"
},
"action_leave_chat": {
"defaultMessage": "Leave Conversation",
"description": "Flat button [Leave Conversation]"
},
"action_more": {
"defaultMessage": "More",
"description": "Action for showing more content"
},
"action_report_chat": {
"defaultMessage": "Report Conversation",
"description": "Flat button [Report Group]"
},
"archived_contacts": {
"defaultMessage": "Archived contacts ({count})",
"description": "Label for archived chats"
},
"badge_owner": {
"defaultMessage": "owner",
"description": "Badge for indicating the owner"
},
"badge_you": {
"defaultMessage": "you",
"description": "Badge for indicating the current user"
},
"block_contact_warning": {
"defaultMessage": "Are you sure you want to block this contact?",
"description": "Alert dialog warning when blocking a contact."
},
"blocked_contacts_link": {
"defaultMessage": "Blocked contacts ({count})",
"description": "Blocked contacts link"
},
"button_add_another": {
"defaultMessage": "Add another",
"description": "Call to action [+ add another]"
},
"button_add_members": {
"defaultMessage": "Add members",
"description": "Flat button [Add members] (to topic)"
},
"button_cancel": {
"defaultMessage": "Cancel",
"description": "Button [Cancel]"
},
"button_confirm": {
"defaultMessage": "Confirm",
"description": "Button [Confirm]"
},
"button_create": {
"defaultMessage": "Create",
"description": "Button [Create]"
},
"button_delete_account": {
"defaultMessage": "Delete account",
"description": "Button [Delete account]"
},
"button_edit": {
"defaultMessage": "Edit",
"description": "Call to action [Edit]"
},
"button_logout": {
"defaultMessage": "Logout",
"description": "Button [Logout]"
},
"button_ok": {
"defaultMessage": "OK",
"description": "Button [OK]"
},
"button_reset": {
"defaultMessage": "Reset",
"description": "Button [Reset]"
},
"button_send_request": {
"defaultMessage": "Send request",
"description": "Button [Send request]"
},
"button_sign_in": {
"defaultMessage": "Sign in",
"description": "Button [Sign In]"
},
"button_sign_up": {
"defaultMessage": "Sign up",
"description": "Create account button [Sign Up]"
},
"button_subscribe": {
"defaultMessage": "Subscribe",
"description": "Button [Subscribe]"
},
"button_update": {
"defaultMessage": "Update",
"description": "Button [Update]"
},
"cannot_initiate_file_upload": {
"defaultMessage": "Cannot initiate file upload.",
"description": "Generic error messagewhen attachment fails"
},
"channel": {
"defaultMessage": "channel",
"description": "Subtitle shown for channels in MessagesView instead of last seen"
},
"channel_prompt": {
"defaultMessage": "This is a channel",
"description": "Checkbox label when creating a channel"
},
"chat_invitation": {
"defaultMessage": "You are invited to start a new chat. What would you like to do?",
"description": "New chat invitation message: [Accept] [Ignore] [Block]."
},
"chat_invitation_accept": {
"defaultMessage": "Accept",
"description": "Action [Accept] for chat invitation."
},
"chat_invitation_block": {
"defaultMessage": "Block",
"description": "Action [Block] for chat invitation."
},
"chat_invitation_ignore": {
"defaultMessage": "Ignore",
"description": "Action [Ignore] for chat invitation."
},
"clear_messages_warning": {
"defaultMessage": "Are you sure you want to clear all messages? It cannot be undone.",
"description": "Alert dialog warning when deleting all messages."
},
"code_doesnot_match": {
"defaultMessage": "Code does not match",
"description": "Error message when the credential validation code is incorrect."
},
"contacts_not_found": {
"defaultMessage": "You have no chats<br />¯∖_(ツ)_/¯",
"description": "HTML message shown in ContactList when no contacts are found"
},
"contacts_not_found_short": {
"defaultMessage": "No contacts match ''{query}''",
"description": "Shown in ContactsView when search returned no results"
},
"credential_email_prompt": {
"defaultMessage": "Your registration email",
"description": "Placeholder for entering email"
},
"delete_account": {
"defaultMessage": "Delete account",
"description": "Title for delete account warning"
},
"delete_account_arning": {
"defaultMessage": "Are you sure you want to delete your account? It cannot be undone.",
"description": "Warning message when deleting an account"
},
"delete_messages_warning": {
"defaultMessage": "Are you sure you want to delete all messages for everyone? It cannot be undone.",
"description": "Alert dialog warning when hard-deleting all messages."
},
"deleted_content": {
"defaultMessage": "content deleted",
"description": "Shown when messages are deleted"
},
"download_action": {
"defaultMessage": "download",
"description": "Call to action [download]"
},
"email_dative": {
"defaultMessage": "email",
"description": "Dative case of 'email', i.e. 'email' in 'by email'"
},
"email_prompt": {
"defaultMessage": "Email, e.g. jdoe@example.com",
"description": "Input placeholder for email entry"
},
"enable_peers_messaging": {
"defaultMessage": "Enable",
"description": "Call to action to enable peer's messaging"
},
"enter_confirmation_code_prompt": {
"defaultMessage": "Enter confirmation code sent to you by {method}:",
"description": "Request to enter confirmation code"
},
"error_invalid_id": {
"defaultMessage": "Invalid ID",
"description": "Error message"
},
"file_attachment_too_large": {
"defaultMessage": "The file size {size} exceeds the {limit} limit.",
"description": "Error message when attachment is too large"
},
"forgot_password_link": {
"defaultMessage": "Forgot password?",
"description": "Link to Reset password form"
},
"full_name_prompt": {
"defaultMessage": "Full name, e.g. John Doe",
"description": "Input placeholder for person's full name"
},
"granted_permissions": {
"defaultMessage": "Granted",
"description": "Title for permissions"
},
"group_has_no_members": {
"defaultMessage": "No members",
"description": "Shown in place of group members"
},
"group_user_id_prompt": {
"defaultMessage": "Group or User ID",
"description": "Prompt for entering user or group ID"
},
"image_caption_prompt": {
"defaultMessage": "Image caption",
"description": "Prompt in SendMessage for attached image"
},
"invalid_content": {
"defaultMessage": "invalid content",
"description": "Shown when message is unreadable"
},
"invalid_security_token": {
"defaultMessage": "Invalid security token",
"description": "Error message when resetting password."
},
"label_client": {
"defaultMessage": "Client:",
"description": "Label for a client version"
},
"label_content_type": {
"defaultMessage": "Content type:",
"description": "Label for file content type (mime)"
},
"label_default_access": {
"defaultMessage": "Default access mode:",
"description": "Section title"
},
"label_default_access_mode": {
"defaultMessage": "Default access mode:",
"description": "Label for default access mode"
},
"label_file_name": {
"defaultMessage": "File name:",
"description": "Label for a file name"
},
"label_group_members": {
"defaultMessage": "Group members:",
"description": "Section title or label"
},
"label_incognito_mode": {
"defaultMessage": "Incognito mode:",
"description": "Label for incognito mode toggle"
},
"label_message_sound": {
"defaultMessage": "Message sound:",
"description": "Label for message sounds toggle"
},
"label_muting_topic": {
"defaultMessage": "Muted:",
"description": "Label for Muting/unmuting the topic"
},
"label_other_user": {
"defaultMessage": "Other",
"description": "Label for the other user when the user is unnamed"
},
"label_password": {
"defaultMessage": "Password",
"description": "Label for password editing"
},
"label_permissions": {
"defaultMessage": "Permissions:",
"description": "Section title"
},
"label_private": {
"defaultMessage": "Private comment",
"description": "Label for editing 'private'"
},
"label_push_notifications": {
"defaultMessage": "Notification alerts:",
"description": "Label for push notifications switch"
},
"label_push_notifications_disabled": {
"defaultMessage": "Notification alerts (requires HTTPS):",
"description": "Label for push notifications switch"
},
"label_reset_password": {
"defaultMessage": "Send a password reset email:",
"description": "Label for password reset field"
},
"label_sdk": {
"defaultMessage": "SDK:"
},
"label_server": {
"defaultMessage": "Server:",
"description": "Label for a server version"
},
"label_server_address": {
"defaultMessage": "Server address:"
},
"label_server_to_use": {
"defaultMessage": "Server to use:",
"description": "Label for server selector in SettingsView"
},
"label_size": {
"defaultMessage": "Size:",
"description": "Label for file size"
},
"label_topic_name": {
"defaultMessage": "Name",
"description": "Label for editing topic name"
},
"label_user_contacts": {
"defaultMessage": "Contacts:",
"description": "Label for user contacts"
},
"label_user_id": {
"defaultMessage": "ID:",
"description": "Label for user address (ID)"
},
"label_wire_transport": {
"defaultMessage": "Wire transport:",
"description": "Label for wire transport selection in SettingsView"
},
"label_you": {
"defaultMessage": "You:",
"description": "Label for the current user"
},
"label_your_name": {
"defaultMessage": "Your name",
"description": "Label for full name editing"
},
"label_your_permissions": {
"defaultMessage": "Your permissions:",
"description": "Label for current user permissions"
},
"last_seen_timestamp": {
"defaultMessage": "Last seen",
"description": "Label for the timestamp of when the user or topic was last online"
},
"leave_chat_warning": {
"defaultMessage": "Are you sure you want to leave this conversation?",
"description": "Alert dialog warning when unsubscribing from a chat."
},
"link_contact_us": {
"defaultMessage": "Contact Us",
"description": "Ancor text for contacting us by email"
},
"link_privacy_policy": {
"defaultMessage": "Privacy Policy",
"description": "Ancor text for privacy policy link"
},
"link_terms_of_service": {
"defaultMessage": "Terms of Service",
"description": "Ancor text for terms of service link"
},
"login_prompt": {
"defaultMessage": "Login",
"description": "Placeholer for username/login"
},
"menu_item_archive_topic": {
"defaultMessage": "Archive",
"description": "Move topic from the list of active chats to archive"
},
"menu_item_block": {
"defaultMessage": "Block",
"description": "Block topic or user"
},
"menu_item_clear_messages": {
"defaultMessage": "Clear messages",
"description": "Delete all messages"
},
"menu_item_clear_messages_for_all": {
"defaultMessage": "Clear for All",
"description": "Delete all message(s) for all members"
},
"menu_item_delete": {
"defaultMessage": "Delete",
"description": "Delete selected messages"
},
"menu_item_delete_for_all": {
"defaultMessage": "Delete for All",
"description": "Delete selected message(s) for all members"
},
"menu_item_delete_topic": {
"defaultMessage": "Delete",
"description": "Delete entire topic"
},
"menu_item_edit_permissions": {
"defaultMessage": "Edit permissions",
"description": "Menu item [Edit permissions]"
},
"menu_item_info": {
"defaultMessage": "Info",
"description": "Show extended topic information"
},
"menu_item_member_delete": {
"defaultMessage": "Remove",
"description": "Remove user from topic"
},
"menu_item_mute": {
"defaultMessage": "Mute",
"description": "Turn off notifications"
},
"menu_item_send_retry": {
"defaultMessage": "Retry",
"description": "Retry sending message"
},
"menu_item_unblock": {
"defaultMessage": "Unblock",
"description": "Unblock topic or user"
},
"menu_item_unmute": {
"defaultMessage": "Unmute",
"description": "Turn notifications on"
},
"message_sending": {
"defaultMessage": "sending...",
"description": "Message being sent, in place of time stamp"
},
"message_sending_failed": {
"defaultMessage": "failed",
"description": "Failed to send message, in place of time stamp"
},
"messages_not_readable": {
"defaultMessage": "no access to messages",
"description": "Message shown in topic without the read access"
},
"messaging_disabled_prompt": {
"defaultMessage": "Messaging disabled",
"description": "Prompt in SendMessage in read-only topic"
},
"more_online_members": {
"defaultMessage": "+{overflow} more",
"description": "Shown in MessagesView title bar when the number of online subscribers exceeds MAX_ONLINE_IN_TOPIC"
},
"new_message_prompt": {
"defaultMessage": "New message",
"description": "Prompt in send message field"
},
"new_password_placeholder": {
"defaultMessage": "Enter new password",
"description": "Placeholder for entering new password"
},
"no_connection": {
"defaultMessage": "No connection",
"description": "Warning that the user is offline."
},
"no_contacts": {
"defaultMessage": "You have no contacts :-(",
"description": "Shown in ContactsView when the user has no contacts"
},
"numeric_confirmation_code_prompt": {
"defaultMessage": "Numbers only",
"description": "Prompt for numeric conformation code"
},
"online_now": {
"defaultMessage": "online now",
"description": "Indicator that the user or topic is currently online"
},
"password_prompt": {
"defaultMessage": "Password",
"description": "Placeholder/prompt for entering password"
},
"password_unchanged_prompt": {
"defaultMessage": "Unchanged",
"description": "Message in editor while password is unchanged"
},
"peers_messaging_disabled": {
"defaultMessage": "Peer's messaging is disabled.",
"description": "Shown when the p2p peer's messaging is disabled"
},
"permission_admin": {
"defaultMessage": "Approve ({val})",
"description": "Name of A permission"
},
"permission_delete": {
"defaultMessage": "Delete ({val})",
"description": "Name of D permission"
},
"permission_join": {
"defaultMessage": "Join ({val})",
"description": "Name of J permission"
},
"permission_owner": {
"defaultMessage": "Owner ({val})",
"description": "Name of O permission"
},
"permission_pres": {
"defaultMessage": "Get notified ({val})",
"description": "Name of P permission"
},
"permission_read": {
"defaultMessage": "Read ({val})",
"description": "Name of R permission"
},
"permission_share": {
"defaultMessage": "Share ({val})",
"description": "Name of S permission"
},
"permission_write": {
"defaultMessage": "Write ({val})",
"description": "Name of W permission"
},
"phone_dative": {
"defaultMessage": "phone",
"description": "Dative case of 'phone', i.e. 'phone' in 'by phone'"
},
"private_editing_placeholder": {
"defaultMessage": "Visible to you only",
"description": "Placeholder for editing 'private'"
},
"push_init_failed": {
"defaultMessage": "Failed to initialize push notifications",
"description": "Error message when push notifications have failed to initialize."
},
"reconnect_countdown": {
"defaultMessage": "Disconnected. Reconnecting in {seconds}…",
"description": "Message shown when an app update is available."
},
"reconnect_now": {
"defaultMessage": "Try now",
"description": "Prompt for reconnecting now"
},
"reload_update": {
"defaultMessage": "Reload",
"description": "Call to action to reload application when update is available."
},
"report_chat_warning": {
"defaultMessage": "Are you sure you want to block and report this conversation?",
"description": "Alert dialog warning when reporting a conversation for abuse"
},
"requested_permissions": {
"defaultMessage": "Requested",
"description": "Title for permissions"
},
"save_attachment": {
"defaultMessage": "save",
"description": "Call to save an attachment"
},
"search_for_contacts": {
"defaultMessage": "Use search to find contacts",
"description": "Text shown in contacts view when user entered no search query."
},
"search_no_results": {
"defaultMessage": "Search returned no results",
"description": "Text shown in contacts view when query returned no results."
},
"search_placeholder": {
"defaultMessage": "List like email:alice@example.com, tel:17025550003...",
"description": "Placeholder in contacts search field"
},
"sidepanel_title_acc_general": {
"defaultMessage": "General",
"description": "Sidepanel title for AccGeneralView."
},
"sidepanel_title_acc_notifications": {
"defaultMessage": "Notifications",
"description": "Sidepanel title for AccNotificationsView."
},
"sidepanel_title_acc_security": {
"defaultMessage": "Security",
"description": "Sidepanel title for AccSecurityView."
},
"sidepanel_title_acc_support": {
"defaultMessage": "Support",
"description": "Sidepanel title for AccSupportView."
},
"sidepanel_title_account_settings": {
"defaultMessage": "Account Settings",
"description": "Sidepanel title for EditAccountView."
},
"sidepanel_title_archive": {
"defaultMessage": "Archived Chats",
"description": "Sidepanel title for ContactsView-Archive."
},
"sidepanel_title_blocked": {
"defaultMessage": "Blocked Chats",
"description": "Sidepanel title for ContactsView-Blocked."
},
"sidepanel_title_cred": {
"defaultMessage": "Confirm Credentials",
"description": "Sidepanel title for ValidationView."
},
"sidepanel_title_login": {
"defaultMessage": "Sign In",
"description": "Sidepanel title for LoginView."
},
"sidepanel_title_newtpk": {
"defaultMessage": "Start New Chat",
"description": "Sidepanel title for NewTopicView."
},
"sidepanel_title_register": {
"defaultMessage": "Create Account",
"description": "Sidepanel title for CreateAccountView."
},
"sidepanel_title_reset": {
"defaultMessage": "Reset Password",
"description": "Sidepanel title for PasswordResetView."
},
"sidepanel_title_settings": {
"defaultMessage": "Settings",
"description": "Sidepanel title for SettingsView."
},
"stay_logged_in": {
"defaultMessage": "Stay logged in",
"description": "Label for a checkbox"
},
"tabtitle_find_user": {
"defaultMessage": "find",
"description": "Tab title Find"
},
"tabtitle_group_by_id": {
"defaultMessage": "by id",
"description": "Tab title Find topic by ID"
},
"tabtitle_new_group": {
"defaultMessage": "new group",
"description": "Tab title New Group"
},
"tags_editor_no_tags": {
"defaultMessage": "Add some tags",
"description": "Tag editor prompt when no tags are found."
},
"tags_not_found": {
"defaultMessage": "No tags defined. Add some.",
"description": ""
},
"title_all_contacts": {
"defaultMessage": "All Contacts",
"description": "Section title [All Contacts]"
},
"title_group_members": {
"defaultMessage": "Group Members",
"description": "Section title"
},
"title_info": {
"defaultMessage": "Info",
"description": "Title for InfoView"
},
"title_manage_tags": {
"defaultMessage": "Manage",
"description": "Section title for the list of tags"
},
"title_not_found": {
"defaultMessage": "Not found",
"description": "Title shown when topic is not found"
},
"title_permissions": {
"defaultMessage": "Permissions",
"description": "Section title"
},
"title_tag_manager": {
"defaultMessage": "Tags (user discovery)",
"description": "Section title for TagManager"
},
"topic_block_warning": {
"defaultMessage": "Are you sure you want to block this conversation?",
"description": "Alert warning when blocking a topic."
},
"topic_delete_warning": {
"defaultMessage": "Are you sure you want to delete this conversation?",
"description": "Alert warning when deleting entire topic"
},
"topic_name_editing_placeholder": {
"defaultMessage": "Freeform name of the group",
"description": "Prompt for entering topic name"
},
"unnamed_topic": {
"defaultMessage": "Unnamed",
"description": "Title shown when the topic has no name"
},
"update_available": {
"defaultMessage": "Update available.",
"description": "Message shown when an app update is available."
},
"upload_finishing": {
"defaultMessage": "finishing...",
"description": "Notification that upload is finishing"
},
"user_not_found": {
"defaultMessage": "Not found",
"description": "In place of a user's full name when the user is not found."
},
"validate_credential_action": {
"defaultMessage": "confirm",
"description": "Validate credentail call to action"
}
}
+155 -155
View File
@@ -24,7 +24,7 @@
"archived_contacts": "Archivierte Kontakte ({count})",
"contacts_not_found": "Sie haben keine Unterhaltungen<br />¯∖_(ツ)_/¯",
"full_name_prompt": "Vollständiger Name, z.B. Lisa Musterfrau",
"email_prompt": "E-Mail, z.B. jdoe@beispiel.de",
"email_prompt": "E-Mail, z.B. lisam@beispiel.de",
"button_sign_up": "Anmelden",
"label_your_name": "Ihr Name",
"label_user_id": "ID:",
@@ -176,180 +176,180 @@
"channel": "Sender"
},
"en": {
"validate_credential_action": "confirm",
"title_tag_manager": "Tags (user discovery)",
"label_user_contacts": "Contacts:",
"button_add_another": "Add another",
"label_message_sound": "Message sound:",
"label_push_notifications": "Notification alerts:",
"label_push_notifications_disabled": "Notification alerts (requires HTTPS):",
"label_incognito_mode": "Incognito mode:",
"delete_account": "Delete account",
"delete_account_arning": "Are you sure you want to delete your account? It cannot be undone.",
"label_password": "Password",
"password_unchanged_prompt": "Unchanged",
"button_logout": "Logout",
"button_delete_account": "Delete account",
"label_default_access_mode": "Default access mode:",
"blocked_contacts_link": "Blocked contacts ({count})",
"link_contact_us": "Contact Us",
"link_terms_of_service": "Terms of Service",
"link_privacy_policy": "Privacy Policy",
"label_sdk": "SDK:",
"label_server_address": "Server address:",
"archived_contacts": "Archived contacts ({count})",
"contacts_not_found": "You have no chats<br />¯∖_(ツ)_/¯",
"full_name_prompt": "Full name, e.g. John Doe",
"email_prompt": "Email, e.g. jdoe@example.com",
"button_sign_up": "Sign up",
"label_your_name": "Your name",
"label_user_id": "ID:",
"button_edit": "Edit",
"requested_permissions": "Requested",
"granted_permissions": "Granted",
"menu_item_edit_permissions": "Edit permissions",
"label_other_user": "Other",
"action_clear_messages": "Clear Messages",
"clear_messages_warning": "Are you sure you want to clear all messages? It cannot be undone.",
"action_delete_messages": "Clear Messages for All",
"delete_messages_warning": "Are you sure you want to delete all messages for everyone? It cannot be undone.",
"action_leave_chat": "Leave Conversation",
"leave_chat_warning": "Are you sure you want to leave this conversation?",
"action_block_contact": "Block Contact",
"block_contact_warning": "Are you sure you want to block this contact?",
"action_report_chat": "Report Conversation",
"report_chat_warning": "Are you sure you want to block and report this conversation?",
"title_info": "Info",
"label_topic_name": "Name",
"label_private": "Private comment",
"private_editing_placeholder": "Visible to you only",
"label_muting_topic": "Muted:",
"action_cancel": "cancel",
"action_clear_messages": "Clear Messages",
"action_delete_messages": "Clear Messages for All",
"action_leave_chat": "Leave Conversation",
"action_more": "More",
"label_your_permissions": "Your permissions:",
"label_permissions": "Permissions:",
"label_you": "You:",
"label_default_access": "Default access mode:",
"label_group_members": "Group members:",
"action_report_chat": "Report Conversation",
"archived_contacts": "Archived contacts ({count})",
"badge_owner": "owner",
"badge_you": "you",
"block_contact_warning": "Are you sure you want to block this contact?",
"blocked_contacts_link": "Blocked contacts ({count})",
"button_add_another": "Add another",
"button_add_members": "Add members",
"group_has_no_members": "No members",
"login_prompt": "Login",
"password_prompt": "Password",
"stay_logged_in": "Stay logged in",
"forgot_password_link": "Forgot password?",
"button_sign_in": "Sign in",
"label_client": "Client:",
"label_server": "Server:",
"online_now": "online now",
"last_seen_timestamp": "Last seen",
"title_not_found": "Not found",
"channel": "channel",
"unnamed_topic": "Unnamed",
"messages_not_readable": "no access to messages",
"peers_messaging_disabled": "Peer's messaging is disabled.",
"enable_peers_messaging": "Enable",
"search_for_contacts": "Use search to find contacts",
"search_no_results": "Search returned no results",
"tabtitle_find_user": "find",
"tabtitle_new_group": "new group",
"tabtitle_group_by_id": "by id",
"new_password_placeholder": "Enter new password",
"label_reset_password": "Send a password reset email:",
"credential_email_prompt": "Your registration email",
"button_cancel": "Cancel",
"button_confirm": "Confirm",
"button_create": "Create",
"button_delete_account": "Delete account",
"button_edit": "Edit",
"button_logout": "Logout",
"button_ok": "OK",
"button_reset": "Reset",
"button_send_request": "Send request",
"label_server_to_use": "Server to use:",
"label_wire_transport": "Wire transport:",
"button_sign_in": "Sign in",
"button_sign_up": "Sign up",
"button_subscribe": "Subscribe",
"button_update": "Update",
"sidepanel_title_login": "Sign In",
"sidepanel_title_register": "Create Account",
"sidepanel_title_settings": "Settings",
"sidepanel_title_account_settings": "Account Settings",
"sidepanel_title_acc_general": "General",
"sidepanel_title_acc_security": "Security",
"sidepanel_title_acc_notifications": "Notifications",
"sidepanel_title_acc_support": "Support",
"sidepanel_title_newtpk": "Start New Chat",
"sidepanel_title_cred": "Confirm Credentials",
"sidepanel_title_reset": "Reset Password",
"sidepanel_title_archive": "Archived Chats",
"sidepanel_title_blocked": "Blocked Chats",
"reconnect_countdown": "Disconnected. Reconnecting in {seconds}…",
"reconnect_now": "Try now",
"push_init_failed": "Failed to initialize push notifications",
"invalid_security_token": "Invalid security token",
"no_connection": "No connection",
"cannot_initiate_file_upload": "Cannot initiate file upload.",
"channel": "channel",
"channel_prompt": "This is a channel",
"chat_invitation": "You are invited to start a new chat. What would you like to do?",
"chat_invitation_accept": "Accept",
"chat_invitation_block": "Block",
"chat_invitation_ignore": "Ignore",
"clear_messages_warning": "Are you sure you want to clear all messages? It cannot be undone.",
"code_doesnot_match": "Code does not match",
"update_available": "Update available.",
"reload_update": "Reload",
"phone_dative": "phone",
"email_dative": "email",
"enter_confirmation_code_prompt": "Enter confirmation code sent to you by {method}:",
"numeric_confirmation_code_prompt": "Numbers only",
"button_confirm": "Confirm",
"save_attachment": "save",
"contacts_not_found": "You have no chats<br />¯∖_(ツ)_/¯",
"contacts_not_found_short": "No contacts match ''{query}''",
"credential_email_prompt": "Your registration email",
"delete_account": "Delete account",
"delete_account_arning": "Are you sure you want to delete your account? It cannot be undone.",
"delete_messages_warning": "Are you sure you want to delete all messages for everyone? It cannot be undone.",
"deleted_content": "content deleted",
"download_action": "download",
"email_dative": "email",
"email_prompt": "Email, e.g. jdoe@example.com",
"enable_peers_messaging": "Enable",
"enter_confirmation_code_prompt": "Enter confirmation code sent to you by {method}:",
"error_invalid_id": "Invalid ID",
"file_attachment_too_large": "The file size {size} exceeds the {limit} limit.",
"forgot_password_link": "Forgot password?",
"full_name_prompt": "Full name, e.g. John Doe",
"granted_permissions": "Granted",
"group_has_no_members": "No members",
"group_user_id_prompt": "Group or User ID",
"image_caption_prompt": "Image caption",
"invalid_content": "invalid content",
"user_not_found": "Not found",
"badge_you": "you",
"badge_owner": "owner",
"menu_item_info": "Info",
"invalid_security_token": "Invalid security token",
"label_client": "Client:",
"label_content_type": "Content type:",
"label_default_access": "Default access mode:",
"label_default_access_mode": "Default access mode:",
"label_file_name": "File name:",
"label_group_members": "Group members:",
"label_incognito_mode": "Incognito mode:",
"label_message_sound": "Message sound:",
"label_muting_topic": "Muted:",
"label_other_user": "Other",
"label_password": "Password",
"label_permissions": "Permissions:",
"label_private": "Private comment",
"label_push_notifications": "Notification alerts:",
"label_push_notifications_disabled": "Notification alerts (requires HTTPS):",
"label_reset_password": "Send a password reset email:",
"label_sdk": "SDK:",
"label_server": "Server:",
"label_server_address": "Server address:",
"label_server_to_use": "Server to use:",
"label_size": "Size:",
"label_topic_name": "Name",
"label_user_contacts": "Contacts:",
"label_user_id": "ID:",
"label_wire_transport": "Wire transport:",
"label_you": "You:",
"label_your_name": "Your name",
"label_your_permissions": "Your permissions:",
"last_seen_timestamp": "Last seen",
"leave_chat_warning": "Are you sure you want to leave this conversation?",
"link_contact_us": "Contact Us",
"link_privacy_policy": "Privacy Policy",
"link_terms_of_service": "Terms of Service",
"login_prompt": "Login",
"menu_item_archive_topic": "Archive",
"menu_item_block": "Block",
"menu_item_clear_messages": "Clear messages",
"menu_item_clear_messages_for_all": "Clear for All",
"menu_item_delete": "Delete",
"menu_item_delete_for_all": "Delete for All",
"menu_item_send_retry": "Retry",
"menu_item_mute": "Mute",
"menu_item_unmute": "Unmute",
"menu_item_delete_topic": "Delete",
"topic_delete_warning": "Are you sure you want to delete this conversation?",
"menu_item_unblock": "Unblock",
"menu_item_block": "Block",
"topic_block_warning": "Are you sure you want to block this conversation?",
"menu_item_edit_permissions": "Edit permissions",
"menu_item_info": "Info",
"menu_item_member_delete": "Remove",
"menu_item_archive_topic": "Archive",
"action_cancel": "cancel",
"upload_finishing": "finishing...",
"no_contacts": "You have no contacts :-(",
"contacts_not_found_short": "No contacts match ''{query}''",
"title_group_members": "Group Members",
"title_all_contacts": "All Contacts",
"button_ok": "OK",
"button_cancel": "Cancel",
"more_online_members": "+{overflow} more",
"download_action": "download",
"label_file_name": "File name:",
"label_content_type": "Content type:",
"label_size": "Size:",
"chat_invitation": "You are invited to start a new chat. What would you like to do?",
"chat_invitation_accept": "Accept",
"chat_invitation_ignore": "Ignore",
"chat_invitation_block": "Block",
"error_invalid_id": "Invalid ID",
"group_user_id_prompt": "Group or User ID",
"button_subscribe": "Subscribe",
"topic_name_editing_placeholder": "Freeform name of the group",
"channel_prompt": "This is a channel",
"button_create": "Create",
"permission_join": "Join ({val})",
"permission_read": "Read ({val})",
"permission_write": "Write ({val})",
"permission_pres": "Get notified ({val})",
"permission_admin": "Approve ({val})",
"permission_share": "Share ({val})",
"permission_delete": "Delete ({val})",
"permission_owner": "Owner ({val})",
"title_permissions": "Permissions",
"menu_item_mute": "Mute",
"menu_item_send_retry": "Retry",
"menu_item_unblock": "Unblock",
"menu_item_unmute": "Unmute",
"message_sending": "sending...",
"message_sending_failed": "failed",
"search_placeholder": "List like email:alice@example.com, tel:17025550003...",
"messages_not_readable": "no access to messages",
"messaging_disabled_prompt": "Messaging disabled",
"more_online_members": "+{overflow} more",
"new_message_prompt": "New message",
"image_caption_prompt": "Image caption",
"file_attachment_too_large": "The file size {size} exceeds the {limit} limit.",
"cannot_initiate_file_upload": "Cannot initiate file upload.",
"tags_not_found": "No tags defined. Add some.",
"new_password_placeholder": "Enter new password",
"no_connection": "No connection",
"no_contacts": "You have no contacts :-(",
"numeric_confirmation_code_prompt": "Numbers only",
"online_now": "online now",
"password_prompt": "Password",
"password_unchanged_prompt": "Unchanged",
"peers_messaging_disabled": "Peer's messaging is disabled.",
"permission_admin": "Approve ({val})",
"permission_delete": "Delete ({val})",
"permission_join": "Join ({val})",
"permission_owner": "Owner ({val})",
"permission_pres": "Get notified ({val})",
"permission_read": "Read ({val})",
"permission_share": "Share ({val})",
"permission_write": "Write ({val})",
"phone_dative": "phone",
"private_editing_placeholder": "Visible to you only",
"push_init_failed": "Failed to initialize push notifications",
"reconnect_countdown": "Disconnected. Reconnecting in {seconds}…",
"reconnect_now": "Try now",
"reload_update": "Reload",
"report_chat_warning": "Are you sure you want to block and report this conversation?",
"requested_permissions": "Requested",
"save_attachment": "save",
"search_for_contacts": "Use search to find contacts",
"search_no_results": "Search returned no results",
"search_placeholder": "List like email:alice@example.com, tel:17025550003...",
"sidepanel_title_acc_general": "General",
"sidepanel_title_acc_notifications": "Notifications",
"sidepanel_title_acc_security": "Security",
"sidepanel_title_acc_support": "Support",
"sidepanel_title_account_settings": "Account Settings",
"sidepanel_title_archive": "Archived Chats",
"sidepanel_title_blocked": "Blocked Chats",
"sidepanel_title_cred": "Confirm Credentials",
"sidepanel_title_login": "Sign In",
"sidepanel_title_newtpk": "Start New Chat",
"sidepanel_title_register": "Create Account",
"sidepanel_title_reset": "Reset Password",
"sidepanel_title_settings": "Settings",
"stay_logged_in": "Stay logged in",
"tabtitle_find_user": "find",
"tabtitle_group_by_id": "by id",
"tabtitle_new_group": "new group",
"tags_editor_no_tags": "Add some tags",
"title_manage_tags": "Manage"
"tags_not_found": "No tags defined. Add some.",
"title_all_contacts": "All Contacts",
"title_group_members": "Group Members",
"title_info": "Info",
"title_manage_tags": "Manage",
"title_not_found": "Not found",
"title_permissions": "Permissions",
"title_tag_manager": "Tags (user discovery)",
"topic_block_warning": "Are you sure you want to block this conversation?",
"topic_delete_warning": "Are you sure you want to delete this conversation?",
"topic_name_editing_placeholder": "Freeform name of the group",
"unnamed_topic": "Unnamed",
"update_available": "Update available.",
"upload_finishing": "finishing...",
"user_not_found": "Not found",
"validate_credential_action": "confirm"
},
"es": {
"validate_credential_action": "confirmar",
+4 -2
View File
@@ -135,8 +135,10 @@ export default class AccGeneralView extends React.Component {
<div className="scrollable-panel">
<div className="panel-form-row">
<div className="panel-form-column">
<label className="small"><FormattedMessage id="label_your_name" /></label>
<div><FormattedMessage id="full_name_prompt">{
<label className="small"><FormattedMessage id="label_your_name" defaultMessage="Your name"
description="Label for full name editing" /></label>
<div><FormattedMessage id="full_name_prompt" defaultMessage="Full name, e.g. John Doe"
description="Input placeholder for person's full name">{
(full_name_placeholder) => <InPlaceEdit
placeholder={full_name_placeholder}
value={this.state.fullName}
+4 -2
View File
@@ -27,7 +27,8 @@ export default class AccSupportView extends React.PureComponent {
<div className="hr" />
<div className="panel-form-column">
<div className="panel-form-row">
<label className="small"><FormattedMessage id="label_client" /></label>
<label className="small"><FormattedMessage id="label_client" defaultMessage="Client:"
description="Label for a client version" /></label>
{APP_NAME}
</div>
<div className="panel-form-row">
@@ -35,7 +36,8 @@ export default class AccSupportView extends React.PureComponent {
{Tinode.getLibrary()}
</div>
<div className="panel-form-row">
<label className="small"><FormattedMessage id="label_server" /></label>
<label className="small"><FormattedMessage id="label_server" defaultMessage="Server:"
description="Label for a server version" /></label>
{this.props.serverVersion}
</div>
<div className="panel-form-row">
+6 -3
View File
@@ -79,11 +79,13 @@ export default class CreateAccountView extends React.PureComponent {
<form className="panel-form-column" onSubmit={this.handleSubmit}>
<div className="panel-form-row">
<div className="panel-form-column">
<FormattedMessage id="login_prompt">{
<FormattedMessage id="login_prompt" defaultMessage="Login"
description="Placeholer for username/login">{
(login_prompt) => <input type="text" placeholder={login_prompt} autoComplete="user-name"
value={this.state.login} onChange={this.handleLoginChange} required autoFocus />
}</FormattedMessage>
<FormattedMessage id="password_prompt">{
<FormattedMessage id="password_prompt" defaultMessage="Password"
description="Placeholder/prompt for entering password">{
(password_prompt) => <VisiblePassword placeholder={password_prompt} autoComplete="new-password"
value={this.state.password} onFinished={this.handlePasswordChange}
required={true} />
@@ -110,7 +112,8 @@ export default class CreateAccountView extends React.PureComponent {
<div className="panel-form-row">
<CheckBox id="save-token" name="save-token" checked={this.state.saveToken}
onChange={this.handleToggleSaveToken} />
<FormattedMessage id="stay_logged_in">{
<FormattedMessage id="stay_logged_in" defaultMessage="Stay logged in"
description="Label for a checkbox">{
(stay_logged_in) => <label htmlFor="save-token">&nbsp;{stay_logged_in}</label>
}</FormattedMessage>
</div>
+6 -3
View File
@@ -48,13 +48,16 @@ export default class EditAccountView extends React.Component {
<div className="hr" />
<div className="panel-form-column">
<a href="#" className="flat-button" onClick={(e) => {e.preventDefault(); this.props.onBasicNavigate('notif');}}>
<i className="material-icons">notifications</i>&nbsp;<FormattedMessage id="sidepanel_title_acc_notifications" />
<i className="material-icons">notifications</i>&nbsp;<FormattedMessage id="sidepanel_title_acc_notifications"
defaultMessage="Notifications" description="Sidepanel title for AccNotificationsView." />
</a>
<a href="#" className="flat-button" onClick={(e) => {e.preventDefault(); this.props.onBasicNavigate('security');}}>
<i className="material-icons">security</i>&nbsp;<FormattedMessage id="sidepanel_title_acc_security" />
<i className="material-icons">security</i>&nbsp;<FormattedMessage id="sidepanel_title_acc_security"
defaultMessage="Security" description="Sidepanel title for AccSecurityView." />
</a>
<a href="#" className="flat-button" onClick={(e) => {e.preventDefault(); this.props.onBasicNavigate('support');}}>
<i className="material-icons">contact_support</i>&nbsp;<FormattedMessage id="sidepanel_title_acc_support" />
<i className="material-icons">contact_support</i>&nbsp;<FormattedMessage id="sidepanel_title_acc_support"
defaultMessage="Support" description="Sidepanel title for AccSupportView." />
</a>
</div>
</div>
+4 -2
View File
@@ -615,7 +615,8 @@ class InfoView extends React.Component {
{this.state.moreInfoExpanded ?
<div className="panel-form-column">
<div className="panel-form-row">
<label><FormattedMessage id="label_user_id" /></label>
<label><FormattedMessage id="label_user_id" defaultMessage="ID:"
description="Label for user address (ID)" /></label>
<tt>{this.state.address}</tt>
</div>
{this.state.groupTopic ?
@@ -692,7 +693,8 @@ class InfoView extends React.Component {
<div className="hr" />
{this.state.owner ?
<>
<FormattedMessage id="title_tag_manager">{
<FormattedMessage id="title_tag_manager" defaultMessage="Tags (user discovery)"
description="Section title for TagManager">{
(tags) => <TagManager
title={tags}
tags={this.state.tags}
+2 -2
View File
@@ -50,7 +50,7 @@ export default class LoginView extends React.Component {
return (
<form id="login-form" onSubmit={this.handleSubmit}>
<FormattedMessage id="login_prompt" defaultMessage="Login"
description="Login placeholder in LoginView">
description="Placeholer for username/login">
{
(login_prompt) => <input type="text" id="inputLogin"
placeholder={login_prompt}
@@ -63,7 +63,7 @@ export default class LoginView extends React.Component {
}
</FormattedMessage>
<FormattedMessage id="password_prompt" defaultMessage="Password"
description="Password placeholder in LoginView">
description="Placeholder/prompt for entering password">
{
(password_prompt) => <VisiblePassword type="password" id="inputPassword"
placeholder={password_prompt}
+4 -2
View File
@@ -16,8 +16,10 @@ export default class LogoView extends React.PureComponent {
<img id="logo" alt="logo" src="img/logo.svg" />
<h2>Tinode Web</h2>
</a>
<p><FormattedMessage id="label_client" defaultMessage="Client:" /> {version}</p>
<p><FormattedMessage id="label_server" defaultMessage="Server:" /> {this.props.serverVersion} ({this.props.serverAddress})</p>
<p><FormattedMessage id="label_client" defaultMessage="Client:"
description="Label for a client version" /> {version}</p>
<p><FormattedMessage id="label_server" defaultMessage="Server:"
description="Label for a server version" /> {this.props.serverVersion} ({this.props.serverAddress})</p>
</div>
</div>
);
+11 -6
View File
@@ -26,25 +26,30 @@ import { bytesToHumanSize, shortDateFormat } from '../lib/strformat.js';
const NOTIFICATION_EXEC_INTERVAL = 300;
const messages = defineMessages({
'online_now': {
online_now: {
id: 'online_now',
defaultMessage: 'online now',
description: 'Indicator that the user or topic is currently online',
},
'last_seen': {
last_seen: {
id: 'last_seen_timestamp',
defaultMessage: 'Last seen',
description: 'Label for the timestamp of when the user or topic was last online'
},
'not_found': {
not_found: {
id: 'title_not_found',
defaultMessage: 'Not found',
description: 'Title shown when topic is not found'
},
'channel': {
channel: {
id: 'channel',
defaultMessage: 'channel',
description: 'Subtitle shown for channels in MessagesView instead of last seen'
},
file_attachment_too_large: {
id: 'file_attachment_too_large',
defaultMessage: 'The file size {size} exceeds the {limit} limit.',
description: 'Error message when attachment is too large'
}
});
@@ -665,8 +670,8 @@ class MessagesView extends React.Component {
if (file.size > maxExternAttachmentSize) {
// Too large.
this.props.onError(this.props.intl.formatMessage({id: 'file_attachment_too_large'},
{size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');
this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,
{size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');
} else {
this.setState({ docPreview: {
file: file,
+13 -13
View File
@@ -20,67 +20,67 @@ import ValidationView from './validation-view.jsx';
// Panel titles for translation.
const messages = defineMessages({
'login': {
login: {
id: 'sidepanel_title_login',
description: 'Sidepanel title for LoginView.',
defaultMessage: 'Sign In'
},
'register': {
register: {
id: 'sidepanel_title_register',
description: 'Sidepanel title for CreateAccountView.',
defaultMessage: 'Create Account'
},
'settings': {
settings: {
id: 'sidepanel_title_settings',
description: 'Sidepanel title for SettingsView.',
defaultMessage: 'Settings'
},
'edit': {
edit: {
id: 'sidepanel_title_account_settings',
description: 'Sidepanel title for EditAccountView.',
defaultMessage: 'Account Settings'
},
'general': {
general: {
id: 'sidepanel_title_acc_general',
description: 'Sidepanel title for AccGeneralView.',
defaultMessage: 'General'
},
'security': {
security: {
id: 'sidepanel_title_acc_security',
description: 'Sidepanel title for AccSecurityView.',
defaultMessage: 'Security'
},
'notif': {
notif: {
id: 'sidepanel_title_acc_notifications',
description: 'Sidepanel title for AccNotificationsView.',
defaultMessage: 'Notifications'
},
'support': {
support: {
id: 'sidepanel_title_acc_support',
description: 'Sidepanel title for AccSupportView.',
defaultMessage: 'Support'
},
'newtpk': {
newtpk: {
id: 'sidepanel_title_newtpk',
description: 'Sidepanel title for NewTopicView.',
defaultMessage: 'Start New Chat'
},
'cred': {
cred: {
id: 'sidepanel_title_cred',
description: 'Sidepanel title for ValidationView.',
defaultMessage: 'Confirm Credentials'
},
'reset': {
reset: {
id: 'sidepanel_title_reset',
description: 'Sidepanel title for PasswordResetView.',
defaultMessage: 'Reset Password'
},
'archive': {
archive: {
id: 'sidepanel_title_archive',
description: 'Sidepanel title for ContactsView-Archive.',
defaultMessage: 'Archived Chats'
},
'blocked': {
blocked: {
id: 'sidepanel_title_blocked',
description: 'Sidepanel title for ContactsView-Blocked.',
defaultMessage: 'Blocked Chats'
+6 -1
View File
@@ -57,6 +57,11 @@ const messages = defineMessages({
id: 'code_doesnot_match',
defaultMessage: 'Code does not match',
description: 'Error message when the credential validation code is incorrect.'
},
menu_item_info: {
id: 'menu_item_info',
defaultMessage: 'Info',
description: 'Show extended topic information'
}
});
@@ -1271,7 +1276,7 @@ class TinodeWeb extends React.Component {
return [
subscribed ? {
title: this.props.intl.formatMessage({id: 'menu_item_info'}),
title: this.props.intl.formatMessage(messages.menu_item_info),
handler: this.handleShowInfoView
} : null,
subscribed ? 'messages_clear' : null,
+1 -1
View File
@@ -82,7 +82,7 @@ class ValidationView extends React.PureComponent {
<FormattedMessage id="button_confirm" defaultMessage="Confirm" description="Button [Confirm]" />
</button>
<button className="white" onClick={this.handleCancel}>
<FormattedMessage id="button_cancel" />
<FormattedMessage id="button_cancel" defaultMessage="Cancel" description="Button [Cancel]" />
</button>
</div>
</div>
+2 -2
View File
@@ -11,13 +11,13 @@ export default class Alert extends React.PureComponent {
<div className="dialog-buttons">
{this.props.onReject ?
<button className="outline" onClick={this.props.onReject}>
{this.props.reject || <FormattedMessage id="button_cancel" />}
{this.props.reject || <FormattedMessage id="button_cancel" defaultMessage="Cancel" description="Button [Cancel]" />}
</button>
:
null
}
<button className="blue" onClick={this.props.onConfirm}>
{this.props.confirm || <FormattedMessage id="button_ok" />}
{this.props.confirm || <FormattedMessage id="button_ok" defaultMessage="OK" description="Button [OK]" />}
</button>
</div>
</div>
+2 -1
View File
@@ -37,7 +37,8 @@ export default class Contact extends React.Component {
render() {
let title = this.props.title;
if (!title) {
title = <i><FormattedMessage id="unnamed_topic" /></i>;
title = <i><FormattedMessage id="unnamed_topic" defaultMessage="Unnamed"
description="Title shown when the topic has no name" /></i>;
} else if (title.length > 30) {
// FIXME: this is probably wrong for RTL languages.
title = title.substring(0, 28) + '…';
+20 -5
View File
@@ -22,7 +22,7 @@ const messages = defineMessages({
defaultMessage: 'Clear for All',
description: 'Delete all message(s) for all members'
},
'delete': {
delete: {
id: 'menu_item_delete',
defaultMessage: 'Delete',
description: 'Delete selected messages'
@@ -57,6 +57,11 @@ const messages = defineMessages({
defaultMessage: 'Are you sure you want to delete this conversation?',
description: 'Alert warning when deleting entire topic'
},
delete_messages_warning: {
id: 'delete_messages_warning',
defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',
description: 'Alert dialog warning when hard-deleting all messages.'
},
unblock: {
id: 'menu_item_unblock',
defaultMessage: 'Unblock',
@@ -82,7 +87,17 @@ const messages = defineMessages({
id: 'menu_item_archive_topic',
defaultMessage: 'Archive',
description: 'Move topic from the list of active chats to archive'
}
},
edit_permissions: {
id: 'menu_item_edit_permissions',
defaultMessage: 'Edit permissions',
description: 'Menu item [Edit permissions]'
},
clear_messages_warning: {
id: 'clear_messages_warning',
defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',
description: 'Alert dialog warning when deleting all messages.'
},
});
class ContextMenu extends React.Component {
@@ -108,7 +123,7 @@ class ContextMenu extends React.Component {
handler: (params, errorHandler) => {
return props.onShowAlert(
formatMessage(messages.menu_item_clear_messages), // title
formatMessage({id: 'clear_messages_warning'}), // content
formatMessage(messages.clear_messages_warning), // content
(() => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm
null, // "OK"
true, // Show Reject button
@@ -122,7 +137,7 @@ class ContextMenu extends React.Component {
handler: (params, errorHandler) => {
return props.onShowAlert(
formatMessage(messages.menu_item_clear_messages_for_all), // title
formatMessage({id: 'delete_messages_warning'}), // content
formatMessage(message.delete_messages_warning), // content
(() => { return this.deleteMessages(true, true, params, errorHandler); }),
null, // "OK"
true, // Show Reject button
@@ -229,7 +244,7 @@ class ContextMenu extends React.Component {
// menu_item_edit_permissions is defined elsewhere.
'permissions': {
id: 'permissions',
title: formatMessage({id: 'menu_item_edit_permissions'}),
title: formatMessage(messages.menu_item_edit_permissions),
handler: null
},
'member_delete': {
+4 -2
View File
@@ -37,8 +37,10 @@ export default class DocPreview extends React.PureComponent {
<div id="image-preview-container">
<div className="flex-column narrow">
<i className="material-icons gray">{iconFromMime(this.props.content.type)}</i>
<div><b><FormattedMessage id="label_content_type" /></b> {this.props.content.type || 'application/octet-stream'}</div>
<div><b><FormattedMessage id="label_size" /></b> {bytesToHumanSize(this.props.content.size)}</div>
<div><b><FormattedMessage id="label_content_type" defaultMessage="Content type:"
description="Label for file content type (mime)" /></b> {this.props.content.type || 'application/octet-stream'}</div>
<div><b><FormattedMessage id="label_size" defaultMessage="Size:"
description="Label for file size" /></b> {bytesToHumanSize(this.props.content.size)}</div>
</div>
</div>
<SendMessage
+8 -4
View File
@@ -67,7 +67,8 @@ export default class NewTopicGroup extends React.PureComponent {
<div className="panel-form-row">
<div className="panel-form-column">
<label className="small" htmlFor="new-topic-fn">
<FormattedMessage id="label_topic_name" />
<FormattedMessage id="label_topic_name" defaultMessage="Name"
description="Label for editing topic name" />
</label>
<FormattedMessage id="topic_name_editing_placeholder" defaultMessage="Freeform name of the group"
description="Prompt for entering topic name">{
@@ -76,9 +77,11 @@ export default class NewTopicGroup extends React.PureComponent {
}</FormattedMessage>
<br />
<label className="small" htmlFor="new-topic-priv">
<FormattedMessage id="label_private" />
<FormattedMessage id="label_private" defaultMessage="Private comment"
description="Label for editing 'private'" />
</label>
<FormattedMessage id="private_editing_placeholder">{
<FormattedMessage id="private_editing_placeholder" defaultMessage="Visible to you only"
description="Placeholder for editing 'private'">{
(placeholder) => <input type="text" id="new-topic-priv" placeholder={placeholder}
value={this.state.private} onChange={this.handlePrivateChange} />
}</FormattedMessage>
@@ -93,7 +96,8 @@ export default class NewTopicGroup extends React.PureComponent {
defaultMessage="This is a channel"
description="Checkbox label when creating a channel" /></label>
</div>
<FormattedMessage id="title_tag_manager">{
<FormattedMessage id="title_tag_manager" defaultMessage="Tags (user discovery)"
description="Section title for TagManager">{
(title) => <TagManager
tags={this.state.tags}
activated={true}
+10 -10
View File
@@ -10,42 +10,42 @@ import { makeImageUrl } from '../lib/blob-helpers.js';
// Translatable permission names.
const messages = defineMessages({
'joiner': {
joiner: {
id: 'permission_join',
defaultMessage: "Join ({val})",
description: 'Name of J permission'
},
'reader': {
reader: {
id: 'permission_read',
defaultMessage: "Read ({val})",
description: 'Name of R permission'
},
'writer': {
writer: {
id: 'permission_write',
defaultMessage: "Write ({val})",
description: 'Name of W permission'
},
'preser': {
preser: {
id: 'permission_pres',
defaultMessage: "Get notified ({val})",
description: 'Name of P permission'
},
'approver': {
approver: {
id: 'permission_admin',
defaultMessage: "Approve ({val})",
description: 'Name of A permission'
},
'sharer': {
sharer: {
id: 'permission_share',
defaultMessage: "Share ({val})",
description: 'Name of S permission'
},
'deleter': {
deleter: {
id: 'permission_delete',
defaultMessage: "Delete ({val})",
description: 'Name of D permission'
},
'owner': {
owner: {
id: 'permission_owner',
defaultMessage: "Owner ({val})",
description: 'Name of O permission'
@@ -151,10 +151,10 @@ class PermissionsEditor extends React.Component {
<br />
<div className="dialog-buttons">
<button className="outline" onClick={this.handleCancel}>
<FormattedMessage id="button_cancel" />
<FormattedMessage id="button_cancel" defaultMessage="Cancel" description="Button [Cancel]" />
</button>
<button className="blue" onClick={this.handleSubmit}>
<FormattedMessage id="button_ok" />
<FormattedMessage id="button_ok" defaultMessage="OK" description="Button [OK]" />
</button>
</div>
</div>
+10 -10
View File
@@ -8,15 +8,15 @@ import { shortDateFormat } from '../lib/strformat.js';
import { deliveryMarker } from '../lib/utils.js';
const messages = defineMessages({
'sending': {
'id': 'message_sending',
'defaultMessage': 'sending...',
'description': 'Message being sent, in place of time stamp'
message_sending: {
id: 'message_sending',
defaultMessage: 'sending...',
description: 'Message being sent, in place of time stamp'
},
'failed': {
'id': 'message_sending_failed',
'defaultMessage': 'failed',
'description': 'Failed to send message, in place of time stamp'
message_sending_failed: {
id: 'message_sending_failed',
defaultMessage: 'failed',
description: 'Failed to send message, in place of time stamp'
}
});
@@ -25,9 +25,9 @@ class ReceivedMarker extends React.PureComponent {
const {formatMessage} = this.props.intl;
let timestamp;
if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {
timestamp = formatMessage(messages.sending);
timestamp = formatMessage(messages.message_sending);
} else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {
timestamp = formatMessage(messages.failed);
timestamp = formatMessage(messages.message_sending_failed);
} else {
timestamp = shortDateFormat(this.props.timestamp, this.props.intl.locale);
}
+5 -5
View File
@@ -7,27 +7,27 @@ import { KEYPRESS_DELAY } from '../config.js';
import { filePasted } from '../lib/blob-helpers.js';
const messages = defineMessages({
'messaging_disabled': {
messaging_disabled: {
id: 'messaging_disabled_prompt',
defaultMessage: 'Messaging disabled',
description: 'Prompt in SendMessage in read-only topic'
},
'type_new_message': {
type_new_message: {
id: 'new_message_prompt',
defaultMessage: 'New message',
description: 'Prompt in send message field'
},
'add_image_caption': {
add_image_caption: {
id: 'image_caption_prompt',
defaultMessage: 'Image caption',
description: 'Prompt in SendMessage for attached image'
},
'file_attachment_too_large': {
file_attachment_too_large: {
id: 'file_attachment_too_large',
defaultMessage: 'The file size {size} exceeds the {limit} limit.',
description: 'Error message when attachment is too large'
},
'cannot_initiate_upload': {
cannot_initiate_upload: {
id: 'cannot_initiate_file_upload',
defaultMessage: 'Cannot initiate file upload.',
description: 'Generic error messagewhen attachment fails'
+2 -2
View File
@@ -128,10 +128,10 @@ export default class TagManager extends React.Component {
{this.props.onSubmit || this.props.onCancel ?
<div id="tag-manager-buttons" className="dialog-buttons panel-form-row">
<button className="outline" onClick={this.handleCancel}>
<FormattedMessage id="button_cancel" defautMessage="Cancel" description="Rejection button [Cancel]" />
<FormattedMessage id="button_cancel" defaultMessage="Cancel" description="Button [Cancel]" />
</button>
<button className="blue" onClick={this.handleSubmit}>
<FormattedMessage id="button_ok" defautMessage="OK" description="Confirmation button [OK]" />
<FormattedMessage id="button_ok" defaultMessage="OK" description="Button [OK]" />
</button>
</div>
: null}
+216 -77
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+695 -1360
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -26,7 +26,7 @@ module.exports = (env, argv) => {
publicPath: '/umd/'
},
optimization: {
minimize: (argv.mode === 'production'),
minimize: (mode === 'prod'),
minimizer: [
new TerserPlugin({
terserOptions: {