diff --git a/app/i18n/index.js b/app/i18n/index.js index b130a36b..30ce0ffc 100644 --- a/app/i18n/index.js +++ b/app/i18n/index.js @@ -1,10 +1,11 @@ import I18n from 'react-native-i18n'; import en from './locales/en'; +import ru from './locales/ru'; I18n.fallbacks = true; I18n.translations = { - en + en, ru }; export default I18n; diff --git a/app/i18n/locales/ru.js b/app/i18n/locales/ru.js new file mode 100644 index 00000000..52183f0f --- /dev/null +++ b/app/i18n/locales/ru.js @@ -0,0 +1,320 @@ +export default { + '1_online_member': '1 участник онлайн', + '1_person_reacted': '1 человек отреагировал', + 'error-action-not-allowed': '{{action}} не допускается', + 'error-application-not-found': 'Приложение не найдено', + 'error-archived-duplicate-name': 'Есть архивный канал с именем {{room_name}}', + 'error-avatar-invalid-url': 'Недопустимый URL-адрес аватара: {{url}}', + 'error-avatar-url-handling': 'Ошибка при обработке настроек аватара с URL-адреса ({{url}}) для {{username}}', + 'error-cant-invite-for-direct-room': 'Невозможно пригласить пользователя в личную переписку', + 'error-could-not-change-email': 'Не удалось изменить адрес электронной почты', + 'error-could-not-change-name': 'Не удалось изменить имя', + 'error-could-not-change-username': 'Не удалось изменить имя пользователя', + 'error-delete-protected-role': 'Не удается удалить защищенную роль', + 'error-department-not-found': 'Отдел не найден', + 'error-direct-message-file-upload-not-allowed': 'Общий доступ к файлам не разрешен в личных сообщениях', + 'error-duplicate-channel-name': 'Канал с именем {{channel_name}} существует', + 'error-email-domain-blacklisted': 'Домен электронной почты включен в черный список', + 'error-email-send-failed': 'Ошибка при попытке отправить электронное письмо: {{message}}', + 'error-field-unavailable': '{{field}} уже используется :(', + 'error-file-too-large': 'Файл слишком большой', + 'error-importer-not-defined': 'Импортер не был определен правильно, ему не хватает класса Import.', + 'error-input-is-not-a-valid-field': '{{input}} недействительно {{field}}', + 'error-invalid-actionlink': 'Недействительная ссылка действия', + 'error-invalid-arguments': 'Недопустимые аргументы', + 'error-invalid-asset': 'Недопустимый актив', + 'error-invalid-channel': 'Недействительный канал.', + 'error-invalid-channel-start-with-chars': 'Недействительный канал. Начните с @ или #', + 'error-invalid-custom-field': 'Неверное настраиваемое поле', + 'error-invalid-custom-field-name': 'Неверное имя настраиваемого поля. Используйте только буквы, цифры, дефисы и символы подчеркивания.', + 'error-invalid-date': 'Указана недопустимая дата.', + 'error-invalid-description': 'Недопустимое описание', + 'error-invalid-domain': 'Недопустимый домен', + 'error-invalid-email': 'Неверный адрес электронной почты {{emai}}', + 'error-invalid-email-address': 'Неверный адрес электронной почты', + 'error-invalid-file-height': 'Недопустимая высота файла', + 'error-invalid-file-type': 'Неверный тип файла', + 'error-invalid-file-width': 'Недопустимая ширина файла', + 'error-invalid-from-address': 'Вы указали неверный адрес FROM.', + 'error-invalid-integration': 'Недопустимая интеграция', + 'error-invalid-message': 'Недопустимое сообщение', + 'error-invalid-method': 'Недопустимый метод', + 'error-invalid-name': 'Недопустимое имя', + 'error-invalid-password': 'Неверный пароль', + 'error-invalid-redirectUri': 'Недопустимый redirectUri', + 'error-invalid-role': 'Недопустимая роль', + 'error-invalid-room': 'Недопустимый канал', + 'error-invalid-room-name': '{{room_name}} не является допустимым именем канала', + 'error-invalid-room-type': '{{type}} не является допустимым типом канала.', + 'error-invalid-settings': 'Недопустимые параметры', + 'error-invalid-subscription': 'Недействительная подписка', + 'error-invalid-token': 'Недопустимый токен', + 'error-invalid-triggerWords': 'Недопустимые triggerWords', + 'error-invalid-urls': 'Недопустимые URL-адреса', + 'error-invalid-user': 'Недопустимый пользователь', + 'error-invalid-username': 'Неверное имя пользователя', + 'error-invalid-webhook-response': 'URL-адрес ответил статусом, отличным от 200', + 'error-message-deleting-blocked': 'Удаление сообщений заблокировано', + 'error-message-editing-blocked': 'Редактирование сообщений заблокировано', + 'error-message-size-exceeded': 'Размер сообщения превышает Message_MaxAllowedSize', + 'error-missing-unsubscribe-link': 'Вы должны указать ссылку [отписаться].', + 'error-no-tokens-for-this-user': 'Для этого пользователя нет токенов', + 'error-not-allowed': 'Не допускается', + 'error-not-authorized': 'Не разрешено', + 'error-push-disabled': 'Push отключен', + 'error-remove-last-owner': 'Это последний владелец. Прежде чем удалить его, установите нового владельца.', + 'error-role-in-use': 'Невозможно удалить роль, потому что она используется', + 'error-role-name-required': 'Требуется имя роли', + 'error-the-field-is-required': 'Требуется поле {{field}}.', + 'error-too-many-requests': 'Ошибка, слишком много запросов. Пожалуйста, помедленнее. Вы должны подождать {{seconds}} секунд, прежде чем повторять попытку.', + 'error-user-is-not-activated': 'Пользователь не активирован', + 'error-user-has-no-roles': 'Пользователь не имеет ролей', + 'error-user-limit-exceeded': 'Количество пользователей, которых вы пытаетесь пригласить на #channel_name, превышает лимит, установленный администратором', + 'error-user-not-in-room': 'Пользователя нет на этом канале', + 'error-user-registration-custom-field': 'error-user-registration-custom-field', + 'error-user-registration-disabled': 'Регистрация пользователей отключена', + 'error-user-registration-secret': 'Регистрация пользователей разрешена только через секретный URL', + 'error-you-are-last-owner': 'Вы последний владелец. Пожалуйста, установите нового владельца, прежде чем покинуть комнату.', + Actions: 'Действия', + Add_Reaction: 'Добавить реакцию', + Add_Server: 'Добавить сервер', + Add_user: 'Добавить пользователя', + Alert: 'Оповещение', + alert: 'оповещение', + alerts: 'оповещения', + All_users_in_the_channel_can_write_new_messages: 'Все пользователи канала могут писать новые сообщения', + All: 'Все', + Allow_Reactions: 'Разрешить реакции', + and_more: 'и более', + and: 'и', + announcement: 'объявление', + Announcement: 'Объявление', + ARCHIVE: 'АРХИВ', + archive: 'архив', + are_typing: 'печатают', + Are_you_sure_question_mark: 'Вы уверены?', + Are_you_sure_you_want_to_leave_the_room: 'Вы действительно хотите покинуть канал {{room}}?', + Authenticating: 'Аутентификация', + Avatar_changed_successfully: 'Аватар успешно изменен!', + Avatar_Url: 'URL аватара', + Away: 'Отошел', + Block_user: 'Блокировать пользователя', + Broadcast_channel_Description: 'Только авторизованные пользователи могут писать новые сообщения, но другие пользователи смогут ответить', + Broadcast_Channel: 'Широковещательный канал', + Busy: 'Занят', + By_proceeding_you_are_agreeing: 'Продолжая, вы соглашаетесь с нашими', + Cancel_editing: 'Отменить редактирование', + Cancel_recording: 'Отменить запись', + Cancel: 'Отмена', + changing_avatar: 'изменение аватара', + Channel_Name: 'Название канала', + Chats: 'Чаты', + Close: 'Закрыть', + Close_emoji_selector: 'Закрыть селектор emoji', + Choose: 'Выбрать', + Choose_from_library: 'Выбрать из библиотеки', + Code: 'Код', + Colaborative: 'Совместный', + Connect: 'Соединение', + Connected_to: 'Подключен к', + Connecting: 'Соединение', + Copied_to_clipboard: 'Скопировано в буфер обмена!', + Copy_Message: 'Копировать сообщение', + Copy_Permalink: 'Копировать постоянную ссылку', + Create_account: 'Создать аккаунт', + Create_Channel: 'Создать канал', + Create: 'Создать', + Delete_Room_Warning: 'Удаление канала приведет к удалению всех сообщений, размещенных в нем. Это не может быть отменено.', + delete: 'удалить', + Delete: 'Удалить', + DELETE: 'УДАЛИТЬ', + description: 'описание', + Description: 'Описание', + Disable_notifications: 'Отключить уведомления', + Do_you_really_want_to_key_this_room_question_mark: 'Вы действительно хотите {{key}} этот канал?', + edit: 'редактировать', + Edit: 'Редактировать', + Email_or_password_field_is_empty: 'Поле электронной почты или пароля пусты', + Email: 'Электронная почта', + Enable_notifications: 'Включить уведомления', + Everyone_can_access_this_channel: 'Каждый может получить доступ к этому каналу', + Error_uploading: 'Ошибка при загрузке', + Files: 'Файлы', + Finish_recording: 'Завершить запись', + For_your_security_you_must_enter_your_current_password_to_continue: 'В целях вашей безопасности вы должны ввести свой текущий пароль для продолжения', + Forgot_my_password: 'Забыл свой пароль', + Forgot_password_If_this_email_is_registered: 'Если эта электронная почта зарегистрирована, мы отправим инструкции о том, как сбросить пароль. Если вы не получите письмо в ближайшее время, вернитесь и повторите попытку.', + Forgot_password: 'Забыли пароль', + Forgot_Password: 'Забыли Пароль', + Has_joined_the_channel: 'Присоединился к каналу', + Has_left_the_channel: 'Покинул канал', + I_have_an_account: 'У меня есть аккаунт', + Invisible: 'Невидимый', + is_a_valid_RocketChat_instance: 'является действительным сервером Rocket.Chat', + is_not_a_valid_RocketChat_instance: 'не является действительным сервером Rocket.Chat', + is_typing: 'печатает', + Just_invited_people_can_access_this_channel: 'Только приглашенные люди могут получить доступ к этому каналу', + Language: 'Язык', + last_message: 'последнее сообщение', + Leave_channel: 'Покинуть канал', + leave: 'покинуть', + Loading_messages_ellipsis: 'Загрузка сообщений ...', + Login: 'Вход', + Logout: 'Выйти', + Members: 'Пользователи', + Mentioned_Messages: 'Упомянутые сообщения', + mentioned: 'упомянутые', + Mentions: 'Упоминания', + Message_accessibility: 'Сообщение от {{user}} в {{time}}: {{message}}', + Message_actions: 'Действия с сообщением', + Message_pinned: 'Сообщение прикреплено', + Message_removed: 'Сообщение удалено', + Messages: 'Сообщения', + Microphone_Permission_Message: 'Rocket Chat нуждается в доступе к вашему микрофону, чтобы вы могли отправлять аудиосообщения.', + Microphone_Permission: 'Разрешение на использование микрофона', + Mute: 'Заглушить', + muted: 'Заглушен', + My_servers: 'Мои серверы', + N_online_members: '{{n}} пользователей онлайн', + N_person_reacted: '{{n}} людей отреагировало', + Name: 'Имя', + New_in_RocketChat_question_mark: 'Новичок в Rocket.Chat?', + New_Message: 'Новое Сообщение', + New_Password: 'Новый Пароль', + New_Server: 'Новый Сервер', + No_files: 'Нет файлов', + No_mentioned_messages: 'Нет упоминаний', + No_pinned_messages: 'Нет прикрепленных сообщений', + No_snippeted_messages: 'Нет сообщений со сниппетом', + No_starred_messages: 'Нет отмеченных сообщений', + No_announcement_provided: 'Нет объявлений.', + No_description_provided: 'Нет описания.', + No_topic_provided: 'Нет темы.', + No_Message: 'Нет сообщения', + No_Reactions: 'Нет реакций', + Not_logged: 'Не зарегистрирован', + Nothing_to_save: 'Нечего сохранять!', + Notify_active_in_this_room: 'Уведомить всех активных пользователей в этом чате', + Notify_all_in_this_room: 'Уведомить всех в этом чате', + Offline: 'Офлайн', + Online: 'Онлайн', + Only_authorized_users_can_write_new_messages: 'Только авторизованные пользователи могут писать новые сообщения', + Open_emoji_selector: 'Открыть селектор emoji', + Or_continue_using_social_accounts: 'Или продолжить, используя социальные учетные записи', + Password: 'Пароль', + Permalink_copied_to_clipboard: 'Постоянная ссылка скопирована в буфер обмена!', + Pin: 'Прикрепить сообщение', + Pinned_Messages: 'Прикрепленные сообщения', + pinned: 'прикреплено', + Pinned: 'Прикреплено', + Please_enter_your_password: 'Пожалуйста введите ваш пароль', + Preferences_saved: 'Настройки сохранены!', + Privacy_Policy: ' Политика Конфиденциальности', + Private_Channel: 'Приватный канал', + Private: 'Приватный', + Profile_saved_successfully: 'Профиль успешно сохранен!', + Profile: 'Профиль', + Public_Channel: 'Публичный канал', + Public: 'Публичный', + Quote: 'Цитата', + Reactions_are_disabled: 'Реакции отключены', + Reactions_are_enabled: 'Реакции активированы', + Reactions: 'Реакции', + Read_Only_Channel: 'Канал только для чтения', + Read_Only: 'Только для чтения', + Register: 'Зарегистрировать', + Repeat_Password: 'Повторите пароль', + Reply: 'Ответить', + Resend: 'Отправить повторно', + Reset_password: 'Сброс пароля', + RESET: 'СБРОС', + Roles: 'Роли', + Room_actions: 'Действия с каналом', + Room_changed_announcement: 'Объявление канала было изменено на: {{объявление}} пользователем {{userBy}}', + Room_changed_description: 'Описание комнаты было изменено на: {{объявление}} пользователем {{userBy}}', + Room_changed_privacy: 'Тип канала был изменен на: {{type}} пользователем {{userBy}}', + Room_changed_topic: 'Топик канала был изменен на: {{topic}} пользователем {{userBy}}', + Room_Files: 'Файлы', + Room_Info_Edit: 'Редактировать информацию о канале', + Room_Info: 'Информация о канале', + Room_Members: 'Пользователи', + Room_name_changed: 'Название канала было изменено на: {{name}} пользователем {{userBy}}', + SAVE: 'СОХРАНИТЬ', + Save_Changes: 'Сохранить изменения', + Save: 'Сохранить', + saving_preferences: 'сохранение персональных настроек', + saving_profile: 'сохранение профиля', + saving_settings: 'сохранение настроек', + Search_Messages: 'Поиск сообщений', + Search: 'Поиск', + Select_Avatar: 'Выбор аватара', + Select_Users: 'Выбор пользователей', + Send: 'Отправить', + Send_audio_message: 'Отправить аудиосообщение', + Send_message: 'Отправить сообщение', + Servers: 'Серверы', + Settings: 'Настройки', + Settings_succesfully_changed: 'Настройки успешно изменены!', + Share_Message: 'Поделиться сообщением', + Share: 'Поделиться', + Sign_in_your_server: 'Войдите на ваш сервер', + Sign_Up: 'Регистрация', + Snippet_Messages: 'Сообщения со сниппетом', + snippeted: 'сниппет добавлен', + Snippets: 'Сниппеты', + Some_field_is_invalid_or_empty: 'Некоторые поля недопустимы или пусты', + Star_room: 'Star room', + Star: 'Звезда', + Starred_Messages: 'Помеченные сообщения', + starred: 'отмечено', + Starred: 'Отмечено', + Start_of_conversation: 'Начало разговора', + Submit: 'Отправить', + Take_a_photo: 'Сфотографировать', + tap_to_change_status: 'нажмите для изменения статуса', + Tap_to_view_servers_list: 'Нажмите, чтобы просмотреть список серверов', + Terms_of_Service: ' Условия использования ', + There_was_an_error_while_action: 'Произошла ошибка в процессе {{action}}!', + This_room_is_blocked: 'Этот канал заблокирован', + This_room_is_read_only: 'Этот канал доступен только для чтения', + Timezone: 'Часовой пояс', + Toggle_Drawer: 'Toggle_Drawer', + topic: 'топик', + Topic: 'Топик', + Try_again: 'Попробуйте еще раз', + Type_the_channel_name_here: 'Введите название канала здесь', + unarchive: 'разархивировать', + UNARCHIVE: 'РАЗАРХИВИРОВАТЬ', + Unblock_user: 'Разблокировать пользователя', + Unmute: 'Отменить заглушивание', + unmuted: 'Заглушивание отменено', + Unpin: 'Открепить', + unread_messages: 'непрочитанные сообщения', + Unstar: 'Снять отметку', + Uploading: 'Выгрузка', + User_added_by: 'Пользователь {{userAdded}} добавлен по решению {{userBy}}', + User_has_been_key: 'Пользователь был {{key}}!', + User_is_no_longer_role_by_: '{{user}} больше не {{role}} по решению {{userBy}}', + User_muted_by: 'Пользователь {{userMuted}} заглушен по решению {{userBy}}', + User_removed_by: 'Пользователь {{userRemoved}} удален по решению {{userBy}}', + User_unmuted_by: 'Пользователь {{userUnmuted}} перестал быть заглушенным по решению {{userBy}}', + User_was_set_role_by_: '{{user}} был назначен {{role}} пользователем {{userBy}}', + Username_is_empty: 'Имя пользователя пусто', + Username: 'Имя пользователя', + Validating: 'Проверка', + Video_call: 'Видеозвонок', + Voice_call: 'Голосовой вызов', + Welcome: 'Добро пожаловать', + Welcome_title_pt_1: 'Приготовьтесь к взлету с', + Welcome_title_pt_2: 'передовой чат-платформой', + Yes_action_it: 'Да, {{action}} это!', + Yesterday: 'Вчера', + You_are_in_preview_mode: 'Вы находитесь в режиме предварительного просмотра', + You_are_offline: 'Вы не в сети', + You_can_search_using_RegExp_eg: 'Вы можете выполнить поиск с помощью регулярных выражений, например `/^text$/i`', + You_colon: 'Вы: ', + you_were_mentioned: 'вы были упомянуты', + You_will_not_be_able_to_recover_this_message: 'Вы не сможете восстановить это сообщение!', + you: 'вы', + Your_server: 'Ваш сервер' +}; diff --git a/app/views/SettingsView/index.js b/app/views/SettingsView/index.js index 200506e4..f647c036 100644 --- a/app/views/SettingsView/index.js +++ b/app/views/SettingsView/index.js @@ -19,7 +19,7 @@ import { setUser } from '../../actions/login'; import { iconsMap } from '../../Icons'; @connect(state => ({ - language: state.login.user.language + userLanguage: state.login.user && state.login.user.language }), dispatch => ({ setUser: params => dispatch(setUser(params)) })) @@ -27,7 +27,7 @@ import { iconsMap } from '../../Icons'; export default class SettingsView extends LoggedView { static propTypes = { navigator: PropTypes.object, - language: PropTypes.string, + userLanguage: PropTypes.string, setUser: PropTypes.func } @@ -35,10 +35,13 @@ export default class SettingsView extends LoggedView { super('SettingsView', props); this.state = { placeholder: {}, - language: props.language ? props.language : 'en', + language: props.userLanguage ? props.userLanguage : 'en', languages: [{ label: 'English', value: 'en' + }, { + label: 'Russian', + value: 'ru' }], saving: false }; @@ -75,7 +78,7 @@ export default class SettingsView extends LoggedView { formIsChanged = () => { const { language } = this.state; - return !(this.props.language === language); + return !(this.props.userLanguage === language); } submit = async() => { @@ -84,7 +87,7 @@ export default class SettingsView extends LoggedView { const { language } = this.state; - const { user } = this.props; + const { userLanguage } = this.props; if (!this.formIsChanged()) { return; @@ -93,7 +96,7 @@ export default class SettingsView extends LoggedView { const params = {}; // language - if (user.language !== language) { + if (userLanguage !== language) { params.language = language; } @@ -142,7 +145,7 @@ export default class SettingsView extends LoggedView { inputRef={(e) => { this.name = e; }} label={I18n.t('Language')} placeholder={I18n.t('Language')} - value={language} + value={languages.find(i => i.value === language).label} testID='settings-view-language' />