From b94eb1d4d83bcc7a5e06b4caa3611e616d63300a Mon Sep 17 00:00:00 2001 From: Harshal sanghvi Date: Fri, 21 Jul 2023 13:39:26 +0530 Subject: [PATCH 001/126] added Remember last viewed channel or thread on cold start feature (#7434) * added last viewed feature * added constants * storing data in global table and added server col * fixed stack screen" * fixed values for crt * fixed threadid store logic --- app/actions/app/global.ts | 27 +++++++++++++++++++++++++++ app/constants/database.ts | 2 ++ app/init/launch.ts | 13 ++++++++++++- app/queries/app/global.ts | 10 ++++++++++ app/screens/channel/channel.tsx | 4 ++++ app/screens/thread/thread.tsx | 12 ++++++++++++ 6 files changed, 67 insertions(+), 1 deletion(-) diff --git a/app/actions/app/global.ts b/app/actions/app/global.ts index 370231841..bb98cd5db 100644 --- a/app/actions/app/global.ts +++ b/app/actions/app/global.ts @@ -1,6 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. +import {getActiveServerUrl} from '@app/init/credentials'; import {Tutorial} from '@constants'; import {GLOBAL_IDENTIFIERS} from '@constants/database'; import DatabaseManager from '@database/manager'; @@ -50,3 +51,29 @@ export const storeLastAskForReview = async (prepareRecordsOnly = false) => { export const storeFirstLaunch = async (prepareRecordsOnly = false) => { return storeGlobal(GLOBAL_IDENTIFIERS.FIRST_LAUNCH, Date.now(), prepareRecordsOnly); }; + +export const storeLastViewedChannelIdAndServer = async (channelId: string) => { + const currentServerUrl = await getActiveServerUrl(); + + return storeGlobal(GLOBAL_IDENTIFIERS.LAST_VIEWED_CHANNEL, { + server_url: currentServerUrl, + channel_id: channelId, + }, false); +}; + +export const storeLastViewedThreadIdAndServer = async (threadId: string) => { + const currentServerUrl = await getActiveServerUrl(); + + return storeGlobal(GLOBAL_IDENTIFIERS.LAST_VIEWED_THREAD, { + server_url: currentServerUrl, + thread_id: threadId, + }, false); +}; + +export const removeLastViewedChannelIdAndServer = async () => { + return storeGlobal(GLOBAL_IDENTIFIERS.LAST_VIEWED_CHANNEL, null, false); +}; + +export const removeLastViewedThreadIdAndServer = async () => { + return storeGlobal(GLOBAL_IDENTIFIERS.LAST_VIEWED_THREAD, null, false); +}; diff --git a/app/constants/database.ts b/app/constants/database.ts index a40ea0209..f14d22a62 100644 --- a/app/constants/database.ts +++ b/app/constants/database.ts @@ -80,6 +80,8 @@ export const GLOBAL_IDENTIFIERS = { FIRST_LAUNCH: 'firstLaunch', LAST_ASK_FOR_REVIEW: 'lastAskForReview', ONBOARDING: 'onboarding', + LAST_VIEWED_CHANNEL: 'lastViewedChannel', + LAST_VIEWED_THREAD: 'lastViewedThread', }; export enum OperationType { diff --git a/app/init/launch.ts b/app/init/launch.ts index 081c6aeea..ca46ede8b 100644 --- a/app/init/launch.ts +++ b/app/init/launch.ts @@ -5,12 +5,14 @@ import Emm from '@mattermost/react-native-emm'; import {Alert, AppState, DeviceEventEmitter, Linking, Platform} from 'react-native'; import {Notifications} from 'react-native-notifications'; +import {switchToChannelById} from '@actions/remote/channel'; import {appEntry, pushNotificationEntry, upgradeEntry} from '@actions/remote/entry'; +import {fetchAndSwitchToThread} from '@actions/remote/thread'; import LocalConfig from '@assets/config.json'; import {DeepLink, Events, Launch, PushNotification} from '@constants'; import DatabaseManager from '@database/manager'; import {getActiveServerUrl, getServerCredentials, removeServerCredentials} from '@init/credentials'; -import {getOnboardingViewed} from '@queries/app/global'; +import {getLastViewedChannelIdAndServer, getOnboardingViewed, getLastViewedThreadIdAndServer} from '@queries/app/global'; import {getThemeForCurrentTeam} from '@queries/servers/preference'; import {getCurrentUserId} from '@queries/servers/system'; import {queryMyTeams} from '@queries/servers/team'; @@ -172,6 +174,15 @@ const launchToHome = async (props: LaunchProps) => { } case Launch.Normal: if (props.coldStart) { + const lastViewedChannel = await getLastViewedChannelIdAndServer(); + const lastViewedThread = await getLastViewedThreadIdAndServer(); + + if (lastViewedThread && lastViewedThread.server_url === props.serverUrl && lastViewedThread.thread_id) { + fetchAndSwitchToThread(props.serverUrl!, lastViewedThread.thread_id); + } else if (lastViewedChannel && lastViewedChannel.server_url === props.serverUrl && lastViewedChannel.channel_id) { + switchToChannelById(props.serverUrl!, lastViewedChannel.channel_id); + } + appEntry(props.serverUrl!); } break; diff --git a/app/queries/app/global.ts b/app/queries/app/global.ts index 311d9b320..9784c6124 100644 --- a/app/queries/app/global.ts +++ b/app/queries/app/global.ts @@ -64,6 +64,16 @@ export const getFirstLaunch = async () => { return records[0].value; }; +export const getLastViewedChannelIdAndServer = async () => { + const records = await queryGlobalValue(GLOBAL_IDENTIFIERS.LAST_VIEWED_CHANNEL)?.fetch(); + return records?.[0]?.value; +}; + +export const getLastViewedThreadIdAndServer = async () => { + const records = await queryGlobalValue(GLOBAL_IDENTIFIERS.LAST_VIEWED_THREAD)?.fetch(); + return records?.[0]?.value; +}; + export const observeTutorialWatched = (tutorial: string) => { const query = queryGlobalValue(tutorial); if (!query) { diff --git a/app/screens/channel/channel.tsx b/app/screens/channel/channel.tsx index 69140bafc..d65f31a55 100644 --- a/app/screens/channel/channel.tsx +++ b/app/screens/channel/channel.tsx @@ -5,6 +5,7 @@ import React, {useCallback, useEffect, useRef, useState} from 'react'; import {type LayoutChangeEvent, StyleSheet, View} from 'react-native'; import {type Edge, SafeAreaView, useSafeAreaInsets} from 'react-native-safe-area-context'; +import {storeLastViewedChannelIdAndServer, removeLastViewedChannelIdAndServer} from '@actions/app/global'; import FloatingCallContainer from '@calls/components/floating_call_container'; import {RoundedHeaderCalls} from '@calls/components/join_call_banner/rounded_header_calls'; import FreezeScreen from '@components/freeze_screen'; @@ -83,9 +84,12 @@ const Channel = ({ EphemeralStore.removeSwitchingToChannel(channelId); }, 500); + storeLastViewedChannelIdAndServer(channelId); + return () => { cancelAnimationFrame(raf); clearTimeout(t); + removeLastViewedChannelIdAndServer(); EphemeralStore.removeSwitchingToChannel(channelId); }; }, [channelId]); diff --git a/app/screens/thread/thread.tsx b/app/screens/thread/thread.tsx index 4bf847f96..542be3612 100644 --- a/app/screens/thread/thread.tsx +++ b/app/screens/thread/thread.tsx @@ -6,6 +6,7 @@ import React, {useCallback, useEffect, useRef, useState} from 'react'; import {type LayoutChangeEvent, StyleSheet, View} from 'react-native'; import {type Edge, SafeAreaView} from 'react-native-safe-area-context'; +import {storeLastViewedThreadIdAndServer, removeLastViewedThreadIdAndServer} from '@actions/app/global'; import FloatingCallContainer from '@calls/components/floating_call_container'; import {RoundedHeaderCalls} from '@calls/components/join_call_banner/rounded_header_calls'; import FreezeScreen from '@components/freeze_screen'; @@ -18,6 +19,7 @@ import useDidUpdate from '@hooks/did_update'; import {useKeyboardTrackingPaused} from '@hooks/keyboard_tracking'; import {popTopScreen, setButtons} from '@screens/navigation'; import EphemeralStore from '@store/ephemeral_store'; +import NavigationStore from '@store/navigation_store'; import ThreadPostList from './thread_post_list'; @@ -80,7 +82,17 @@ const Thread = ({ }, [componentId, rootId, isCRTEnabled]); useEffect(() => { + // when opened from notification, first screen in stack is HOME + // if last screen was global thread or thread opened from notification, store the last viewed thread id + const isFromGlobalOrNotification = NavigationStore.getScreensInStack()[1] === Screens.GLOBAL_THREADS || NavigationStore.getScreensInStack()[1] === Screens.HOME; + if (isCRTEnabled && isFromGlobalOrNotification) { + storeLastViewedThreadIdAndServer(rootId); + } + return () => { + if (isCRTEnabled) { + removeLastViewedThreadIdAndServer(); + } if (rootId === EphemeralStore.getCurrentThreadId()) { EphemeralStore.setCurrentThreadId(''); } From 2b523e052f766a898cf254d05c31e14f4e4f84bf Mon Sep 17 00:00:00 2001 From: Tom De Moor Date: Tue, 18 Jul 2023 15:47:48 +0000 Subject: [PATCH 002/126] Added translation using Weblate (Vietnamese) --- assets/base/i18n/vi.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 assets/base/i18n/vi.json diff --git a/assets/base/i18n/vi.json b/assets/base/i18n/vi.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/assets/base/i18n/vi.json @@ -0,0 +1 @@ +{} From b985777f33e7f6adadb21d271365c1f2830d5839 Mon Sep 17 00:00:00 2001 From: linkvn Date: Tue, 18 Jul 2023 15:50:23 +0000 Subject: [PATCH 003/126] Translated using Weblate (Vietnamese) Currently translated at 38.8% (413 of 1062 strings) Translation: mattermost-languages-shipped/mattermost-mobile-v2 Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/vi/ --- assets/base/i18n/vi.json | 416 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 415 insertions(+), 1 deletion(-) diff --git a/assets/base/i18n/vi.json b/assets/base/i18n/vi.json index 0967ef424..5331c9af4 100644 --- a/assets/base/i18n/vi.json +++ b/assets/base/i18n/vi.json @@ -1 +1,415 @@ -{} +{ + "about.date": "Ngày Xây Dựng:", + "about.enterpriseEditione1": "Phiên bản doanh nghiệp", + "about.enterpriseEditionLearn": "Tìm hiểu thêm về phiên bản Doanh Nghiệp ở ", + "about.enterpriseEditionSt": "Hệ thống giao tiếp hiện đại được bảo vệ dưới tường lửa của bạn.", + "about.hash": "Mã băm của bản dựng:", + "about.teamEditiont0": "Phiên bản Nhóm", + "apps.error.parser.missing_field_value": "Giá trị của trường bị thiếu.", + "apps.error.parser.missing_list_end": "Cần mã đóng danh sách.", + "apps.error.parser.missing_quote": "Đối sánh báo giá kép dự kiến trước khi kết thúc đầu vào.", + "apps.error.parser.no_argument_pos_x": "Không thể xác định đối số.", + "apps.error.parser.unexpected_character": "Ký tự không phù hợp.", + "apps.error.parser.unexpected_comma": "Không được dùng dấu phảy.", + "apps.error.parser.unexpected_error": "Lỗi không mong đợi.", + "apps.error.parser.unexpected_flag": "Lệnh không chấp nhận cờ `{flagName}`.", + "apps.error.parser.unexpected_squared_bracket": "Không được dùng dấu ngoặc vuông.", + "apps.error.parser.unexpected_state": "Không thể truy cập: Trạng thái không mong đợi trong matchBinding: `{state}`.", + "camera_type.photo.option": "Chụp ảnh", + "camera_type.video.option": "Quay video", + "center_panel.archived.closeChannel": "Đóng kênh", + "channel_header.directchannel.you": "{displayname} (you)", + "channel_info.header": "Tiêu đề:", + "channel_modal.nameEx": "Ví dụ: \"Bugs\", \"Marketing\", \"客户支持\"", + "channel_modal.optional": "(không bắt buộc)", + "channel_modal.purpose": "Mục đích", + "channel_modal.purposeEx": "Ví dụ: \"Một kênh để sắp xếp lỗi và cải tiến\"", + "combined_system_message.left_channel.one": "{firstUser} **rời nhóm**.", + "combined_system_message.left_channel.one_you": "Bạn **left the channel**.", + "combined_system_message.left_team.two": "{firstUser} and {secondUser} **rời nhóm**.", + "combined_system_message.removed_from_channel.many_expanded": "{users} và {lastUser} đã bị xóa khỏi kênh.", + "combined_system_message.removed_from_channel.one": "{fistUser} đã bị xóa khỏi kênh.", + "combined_system_message.removed_from_channel.one_you": "Bạn đã **removed from the channel**.", + "combined_system_message.removed_from_channel.two": "{firstUser} và {secondUser} đã **bị xoá khỏi kênh**.", + "custom_status.expiry.until": "Cho đến", + "custom_status.suggestions.in_a_meeting": "Trong một cuộc họp", + "custom_status.suggestions.on_a_vacation": "Trong một kỳ nghỉ", + "custom_status.suggestions.out_for_lunch": "Ra ngoài ăn trưa", + "custom_status.failure_message": "Không cập nhật được trạng thái. Thử lại", + "custom_status.set_status": "Đặt trạng thái", + "emoji_picker.activities": "Các hoạt động", + "emoji_picker.animals-nature": "Động vật & Thiên nhiên", + "emoji_picker.custom": "Tuỳ chỉnh", + "emoji_picker.flags": "Cờ", + "emoji_picker.food-drink": "Đồ ăn thức uống", + "edit_post.editPost": "Chỉnh sửa bài ...", + "friendly_date.yesterday": "Hôm qua", + "gallery.footer.channel_name": "Chia sẻ trong {channelName}", + "gallery.open_file": "Mở file", + "global_threads.emptyUnreads.message": "Có vẻ như bạn đã kiểm tra tất cả các trò chuyện.", + "global_threads.emptyUnreads.title": "Không có chủ đề chưa đọc", + "global_threads.markAllRead.cancel": "Huỷ", + "global_threads.markAllRead.markRead": "Đánh dấu đã đọc", + "interactive_dialog.submit": "Xác Nhận", + "global_threads.unreads": "Chưa đọc", + "mobile.files_paste.error_dismiss": "Bỏ qua", + "mobile.join_channel.error": "Chúng tôi không thể mở một tin nhắn trực tiếp với {displayName}. Vui lòng kiểm tra kết nối của bạn và thử lại.", + "mobile.link.error.text": "Không thể mở liên kết.", + "mobile.link.error.title": "Lỗi", + "mobile.managed.blocked_by": "Bị chặn bởi {vendor}", + "mobile.oauth.try_again": "Thử lại", + "mobile.open_dm.error": "Chúng tôi không thể mở một tin nhắn trực tiếp với {displayName}. Vui lòng kiểm tra kết nối của bạn và thử lại.", + "mobile.open_gm.error": "Chúng tôi không thể mở một tin nhắn nhóm với những người dùng đó. Vui lòng kiểm tra kết nối của bạn và thử lại.", + "mobile.participants.header": "NGƯỜI THAM GIA CHỦ ĐỀ", + "mobile.permission_denied_dismiss": "Không cho phép", + "mobile.permission_denied_retry": "Cài đặt", + "mobile.post_info.pin": "Ghim vào kênh", + "mobile.post_info.reply": "Trả lời", + "mobile.post_info.unpin": "Bỏ ghim khỏi Kênh", + "mobile.post_pre_header.pinned": "Đã ghim", + "mobile.post_textbox.entire_channel_here.message": "Bằng cách sử dụng @here, bạn sắp gửi thông báo tới tối đa {totalMembers, number} {totalMembers,plural, one {người} other {người}}. Bạn có chắc chắn muốn làm điều này?", + "mobile.post_textbox.entire_channel_here.message.with_timezones": "Bằng cách sử dụng @here, bạn sắp gửi thông báo tới {totalMembers, number} {totalMembers,plult, one {người} other {người}} trong {timezones, number} {timezones,plural, one {múi giờ} other {múi giờ} }. Bạn có chắc chắn muốn làm điều này?", + "mobile.post_textbox.entire_channel.cancel": "Hủy", + "mobile.post_textbox.entire_channel.confirm": "Xác nhận", + "mobile.push_notification_reply.placeholder": "Viết câu trả lời...", + "mobile.push_notification_reply.title": "Trả lời", + "mobile.rename_channel.display_name_maxLength": "Tên kênh phải ít hơn {maxLength, number} ký tự", + "mobile.search.jump": "Chuyển đến Biểu tượng tin nhắn gần đây", + "mobile.set_status.dnd": "Đừng làm phiền", + "msg_typing.areTyping": "{users} và {last} đang gõ...", + "permalink.show_dialog_warn.join": "Tham gia", + "permalink.show_dialog_warn.title": "Tham gia kênh riêng tư", + "permalink.show_dialog_warn.cancel": "Huỷ", + "post_info.del": "Xoá", + "post_info.edit": "Sửa", + "post_info.system": "Hệ thống", + "post_body.check_for_out_of_channel_mentions.message.multiple": "đã được đề cập nhưng họ không có trong kênh. Bạn có muốn ", + "post_body.check_for_out_of_channel_mentions.message.one": "đã được đề cập nhưng không có trong kênh. Bạn có muốn ", + "post_body.commentedOn": "Đã nhận xét về tin nhắn {name}{apostrophe}: ", + "post_body.deleted": "(tin nhắn đã xóa)", + "post_info.auto_responder": "TRẢ LỜI TỰ ĐỘNG", + "post_info.bot": "BOT", + "post_info.guest": "KHÁCH", + "post_message_view.edited": "(đã chỉnh sửa)", + "post_priority.button.acknowledge": "Nhìn nhận", + "post_priority.picker.apply": "Áp dụng", + "post_priority.picker.cancel": "Huỷ", + "suggestion.search.public": "Kênh Công Khai", + "user.settings.general.email": "Mail", + "api.channel.add_guest.added": "{addedUsername} đã thêm vào kênh với tư cách khách mời bởi {username}.", + "api.channel.add_member.added": "{addedUsername} được thêm vào kênh trò chuyện bởi {username}.", + "api.channel.guest_join_channel.post_and_forget": "{username} đã tham gia kênh với tư cách là khách.", + "apps.error.command.field_missing": "Thiếu trường thông tin cần thiết: `{fieldName}`.", + "apps.error": "Lỗi: {error}", + "apps.error.command.same_channel": "Kênh được lặp lại cho trường `{fieldName}`: `{option}`.", + "apps.error.command.same_option": "Tùy chọn lặp lại cho trường `{fieldName}`: `{option}`.", + "apps.error.command.same_user": "Người dùng lặp lại cho trường `{fieldName}`: `{option}`.", + "apps.error.command.unknown_channel": "Kênh không xác định cho trường `{fieldName}`: `{option}`.", + "apps.error.command.unknown_option": "Tùy chọn không xác định cho trường `{fieldName}`: `{option}`.", + "apps.error.command.unknown_user": "Người dùng không xác định cho trường `{fieldName}`: `{option}`.", + "apps.error.form.no_form": "`form` không xác định.", + "apps.error.form.no_lookup": "`lookup` không được định nghĩa.", + "apps.error.form.no_source": "`source` không được định nghĩa.", + "apps.error.form.refresh_no_refresh": "Đã gọi là làm mới trên trường không làm mới.", + "apps.error.form.submit.pretext": "Đã xảy ra lỗi khi gửi phương thức. Liên hệ với nhà phát triển ứng dụng. Chi tiết: {details}", + "apps.error.lookup.error_preparing_request": "Lỗi khi chuẩn bị yêu cầu tra cứu: {errorMessage}", + "apps.error.malformed_binding": "Liên kết này không được hình thành đúng cách. Liên hệ với nhà phát triển ứng dụng.", + "apps.error.parser": "Lỗi phân tích cú pháp: {error}", + "apps.error.parser.execute_non_leaf": "Bạn phải chọn một lệnh con.", + "apps.error.parser.missing_binding": "Thiếu ràng buộc lệnh.", + "apps.error.parser.missing_source": "Biểu mẫu không có nơi gửi cũng như nguồn.", + "apps.error.parser.missing_submit": "Không gửi cuộc gọi trong ràng buộc hoặc hình thức.", + "apps.error.parser.missing_tick": "Khớp báo giá đánh dấu dự kiến trước khi kết thúc đầu vào.", + "apps.error.parser.multiple_equal": "Nhiều dấu `=` không được phép.", + "apps.error.parser.no_bindings": "Không có ràng buộc lệnh.", + "apps.error.parser.no_form": "Không tìm thấy biểu mẫu nào.", + "apps.error.parser.no_match": "`{command}`: Không tìm thấy lệnh phù hợp trong workspace này.", + "apps.error.parser.no_slash_start": "Dòng lệnh phải được bắt đầu bằng ký tự `/`.", + "apps.error.parser.unexpected_whitespace": "Không thể truy cập: Khoảng trắng không mong muốn.", + "apps.error.responses.navigate.no_url": "Loại phản hồi là `navigate`, nhưng không có url nào được đưa vào phản hồi.", + "apps.error.responses.unexpected_error": "Đã nhận được một lỗi không mong muốn.", + "apps.error.responses.unknown_type": "Loại phản hồi ứng dụng không được hỗ trợ. Loại phản hồi: {type}.", + "apps.error.unknown": "Xảy ra lỗi không xác định được.", + "apps.suggestion.dynamic.error": "Dynamic select error", + "apps.suggestion.errors.parser_error": "Lỗi phân tích cú pháp", + "apps.suggestion.no_dynamic": "Không có dữ liệu nào được trả lại cho đề xuất động", + "apps.suggestion.no_suggestion": "Không có gợi ý phù hợp.", + "apps.suggestion.no_static": "Không có lựa chọn phù hợp.", + "archivedChannelMessage": "Bạn đang xem một **kênh đã lưu trữ**. Tin nhắn mới không thể được đăng.", + "combined_system_message.added_to_channel.many_expanded": "{users} và {lastUser} đã được ** thêm vào kênh ** bởi {actor}.", + "combined_system_message.added_to_channel.one": "{firstUser} **đã được thêm vào kênh** bởi {actor}.", + "combined_system_message.added_to_channel.one_you": "Bạn đã được **thêm vào kênh** bởi {actor} .", + "combined_system_message.added_to_channel.two": "{firstUser} và {secondUser} **được thêm vào kênh** bởi {actor}.", + "combined_system_message.added_to_team.many_expanded": "{users} và {lastUser} đã được **thêm vào nhóm** bởi {actor}.", + "combined_system_message.added_to_team.one": "{firstUser} **được thêm vào nhóm** bởi {actor}.", + "combined_system_message.added_to_team.one_you": "Bạn đã được **thêm vào nhóm** bởi {actor}.", + "combined_system_message.joined_channel.one": "{firstUser} **rời nhóm**.", + "combined_system_message.joined_channel.one_you": "Bạn **joined the channel**.", + "combined_system_message.joined_channel.two": "{firstUser} and {secondUser} **rời nhóm**.", + "combined_system_message.added_to_team.two": "{firstUser} và {secondUser} **được thêm vào nhóm** bởi {actor}.", + "combined_system_message.joined_channel.many_expanded": "{users} and {lastUser} **rời nhóm**.", + "combined_system_message.joined_team.many_expanded": "{users} and {lastUser} **rời nhóm**.", + "combined_system_message.left_team.many_expanded": "{users} and {lastUser} **rời đội**.", + "combined_system_message.left_team.one": "{firstUser} **rời nhóm**.", + "combined_system_message.joined_team.one": "{firstUser} **rời nhóm**.", + "combined_system_message.joined_team.one_you": "Bạn **joined the channel**.", + "combined_system_message.joined_team.two": "{firstUser} and {secondUser} **rời nhóm**.", + "combined_system_message.left_channel.many_expanded": "{users} and {lastUser} **rời kênh**.", + "combined_system_message.left_channel.two": "{firstUser} and {secondUser} **rời nhóm**.", + "combined_system_message.left_team.one_you": "Bạn **left the channel**.", + "combined_system_message.removed_from_team.one": "{firstUser} đã bị **xóa khỏi nhóm**.", + "combined_system_message.removed_from_team.one_you": "Bạn đã **removed from the channel**.", + "combined_system_message.removed_from_team.two": "{firstUser} và {secondUser} đã **bị xoá khỏi kênh**.", + "combined_system_message.removed_from_team.many_expanded": "{users} và {lastUser} đã bị xóa khỏi kênh.", + "combined_system_message.you": "Bạn", + "create_post.write": "Viết cho {channelDisplayName}", + "custom_status.expiry_dropdown.dont_clear": "Không rõ ràng", + "custom_status.expiry_dropdown.four_hours": "4 giờ", + "custom_status.expiry_dropdown.one_hour": "1 giờ", + "custom_status.expiry_dropdown.thirty_minutes": "30 phút", + "custom_status.expiry_dropdown.this_week": "Tuần này", + "custom_status.expiry_dropdown.today": "Hôm nay", + "custom_status.suggestions.out_sick": "Khỏi ốm", + "custom_status.suggestions.working_from_home": "Làm việc từ nhà", + "date_separator.today": "Hôm nay", + "date_separator.yesterday": "Ngày hôm qua", + "emoji_picker.objects": "Các đối tượng", + "emoji_picker.people-body": "Con người & Cơ thể", + "emoji_picker.searchResults": "Kết quả tìm kiếm", + "emoji_picker.smileys-emotion": "Biểu tượng mặt cười và cảm xúc", + "emoji_picker.symbols": "Ký hiệu", + "last_users_message.added_to_channel.type": "đã được {actor} **thêm vào kênh**.", + "last_users_message.added_to_team.type": "đã được {actor} **thêm vào nhóm**.", + "last_users_message.first": "{firstUser} và ", + "last_users_message.others": "{numOthers} khác ", + "last_users_message.joined_channel.type": "Bạn **joined the channel**.", + "last_users_message.joined_team.type": "Bạn **joined the channel**.", + "login.email": "Email", + "login.ldapUsername": "AD/LDAP Tên tài khoản", + "login.username": "Tên tài khoản", + "msg_typing.isTyping": "{user} đang gõ...", + "password_send.link": "Nếu tài khoản tồn tại, một email đặt lại mật khẩu sẽ được gửi đến:", + "password_send.description": "Để đặt lại mật khẩu của bạn, hãy nhập địa chỉ email bạn đã sử dụng để đăng ký", + "password_send.error": "Vui lòng nhập một địa chỉ email hợp lệ.", + "post_body.check_for_out_of_channel_mentions.link.and": " và ", + "post_body.check_for_out_of_channel_mentions.message_last": "? Họ sẽ có quyền truy cập vào tất cả lịch sử tin nhắn.", + "posts_view.newMsg": "Tin nhắn mới", + "search_bar.search": "Tìm kiếm", + "status_dropdown.set_away": "Không có mặt", + "status_dropdown.set_offline": "Ngoại tuyến", + "status_dropdown.set_online": "Trực tuyến", + "suggestion.mention.all": "Thông báo cho mọi người trong kênh này", + "suggestion.mention.channel": "Thông báo cho mọi người trong kênh này", + "suggestion.mention.channels": "Kênh tắt tiếng", + "suggestion.mention.groups": "Để Cập Nhóm", + "suggestion.mention.here": "Thông báo cho mọi người trong kênh này", + "suggestion.mention.members": "Thành viên kênh", + "suggestion.mention.morechannels": "Các kênh khác", + "suggestion.mention.nonmembers": "Không có trong kênh", + "suggestion.mention.special": "Đề Cập Đặc Biệt", + "suggestion.search.direct": "Tin nhắn trực tiếp", + "suggestion.search.private": "Kênh riêng", + "terms_of_service.api_error": "Không thể hoàn thành yêu cầu. Nếu sự cố này vẫn tiếp diễn, hãy liên hệ với Quản trị viên hệ thống của bạn.", + "user.settings.general.lastName": "Họ", + "user.settings.general.position": "Vị trí", + "user.settings.general.nickname": "Biệt danh", + "about.hashee": "Mã băm của bản dựng EE :", + "about.teamEditionLearn": "Tham gia Mattermost cộng đồng", + "about.teamEditionSt": "Tất cả các đội liên lạc ở một nơi, ngay lập tức tìm kiếm và có thể truy cập bất cứ nơi nào.", + "about.teamEditiont1": "Phiên bản doanh nghiệp", + "apps.error.form.no_submit": "`submit` không được định nghĩa", + "apps.error.form.refresh": "Đã xảy ra lỗi khi tìm nạp các trường đã chọn. Liên hệ với nhà phát triển ứng dụng. Thông tin chi tiết: {details}", + "apps.error.parser.empty_value": "giá trị không được rỗng", + "apps.error.responses.form.no_form": "Loại phản hồi là `form`, nhưng không có form nào được đưa vào phản hồi.", + "apps.error.responses.unexpected_type": "Loại phản hồi của ứng dụng không được mong đợi. Loại phản hồi: {type}.", + "apps.error.responses.unknown_field_error": "Đã nhận được lỗi cho một trường không xác định. Tên trường: `{field}`. Lỗi: `{error}`.", + "channel_loader.someone": "Người nào", + "channel_modal.descriptionHelp": "Mô tả cách sử dụng kênh này.", + "channel_modal.header": "Tiêu đề", + "channel_modal.headerEx": "Ví dụ: \"[Link Title](http://example.com)\"", + "channel_modal.headerHelp": "Đặt văn bản sẽ xuất hiện trong tiêu đề của kênh bên cạnh tên kênh. Ví dụ: bao gồm các liên kết được sử dụng thường xuyên bằng cách nhập [Link Title](http://example.com).", + "channel_modal.name": "Tên", + "create_post.deactivated": "Bạn đang xem một kênh lưu trữ với người dùng bị vô hiệu hóa.", + "custom_status.expiry_dropdown.custom": "Tuỳ chọn", + "custom_status.expiry_dropdown.date_and_time": "Ngày và thời gian", + "custom_status.expiry_time.today": "Hôm nay", + "custom_status.expiry_time.tomorrow": "Ngày mai", + "custom_status.expiry.at": "lúc", + "custom_status.suggestions.recent_title": "GẦN ĐÂY", + "custom_status.suggestions.title": "ĐỀ XUẤT", + "edit_post.save": "Lưu", + "emoji_picker.recent": "Gần đây", + "emoji_picker.travel-places": "Du lịch & Địa điểm", + "emoji_skin.dark_skin_tone": "màu da tối", + "emoji_skin.default": "tông màu da mặc định", + "emoji_skin.light_skin_tone": "light skin tone", + "emoji_skin.medium_dark_skin_tone": "tông màu da trung bình tối", + "emoji_skin.medium_light_skin_tone": "tông màu da sáng trung bình", + "emoji_skin.medium_skin_tone": "màu da trung bình", + "file_upload.fileAbove": "Tệp phải nhỏ hơn {max}", + "friendly_date.daysAgo": "{count} {count, plural, one {ngày} other {ngày}} trước", + "friendly_date.hoursAgo": "{count} {count, plural, one {ngày} other {ngày}} trước", + "friendly_date.minsAgo": "{count} {count, plural, one {phút} other {phút}} trước", + "friendly_date.monthsAgo": "{count} {count, plural, one {tháng} other {tháng}} trước", + "friendly_date.now": "Bây giờ", + "friendly_date.yearsAgo": "{count} {count, plural, one {năm} other {năm}} trước", + "get_post_link_modal.title": "Sao chép đường dẫn", + "global_threads.allThreads": "Tất cả chủ đề của bạn", + "global_threads.emptyThreads.message": "Bất kỳ chủ đề nào bạn được đề cập hoặc đã tham gia sẽ hiển thị ở đây cùng với bất kỳ chủ đề nào bạn đã theo dõi.", + "global_threads.emptyThreads.title": "Không có chủ đề nào", + "global_threads.markAllRead.message": "Điều này sẽ xóa mọi trạng thái chưa đọc cho tất cả các chủ đề của bạn được hiển thị ở đây", + "global_threads.markAllRead.title": "Bạn có chắc chắn muốn đánh dấu tất cả các chủ đề là đã đọc?", + "global_threads.options.mark_as_read": "Đánh đấu đã đọc", + "global_threads.options.open_in_channel": "Mở trong kênh", + "global_threads.options.title": "Thao tác trên chủ đề", + "last_users_message.left_channel.type": "Bạn **left the channel**.", + "last_users_message.left_team.type": "**left the team**.", + "last_users_message.removed_from_channel.type": "Bạn đã **removed from the channel**.", + "last_users_message.removed_from_team.type": "Bạn đã **removed from the channel**.", + "login_mfa.enterToken": "Để hoàn tất quá trình đăng nhập, vui lòng nhập token xác nhận từ điện thoại của bạn", + "login_mfa.token": "MFA Token", + "login_mfa.tokenReq": "Vui lòng nhập mã thông báo MFA", + "login.forgot": "Tôi quên mật khẩu của tôi", + "login.or": "hoặc", + "login.password": "Mật khẩu", + "login.signIn": "Đăng nhập", + "mobile.about.appVersion": "Phiên bản: {version} (Build {number})", + "mobile.account.settings.save": "Lưu", + "mobile.action_menu.select": "Chọn một tuỳ chọn", + "mobile.android.back_handler_exit": "Nhấn quay lại một lần nữa để thoát", + "mobile.android.photos_permission_denied_description": "Tải ảnh lên phiên bản Mattermost của bạn hoặc lưu chúng vào thiết bị của bạn. Mở Cài đặt để cấp quyền truy cập Đọc và ghi vào thư viện ảnh của bạn.", + "mobile.android.photos_permission_denied_title": "{applicationName} muốn truy cập ảnh của bạn", + "mobile.announcement_banner.title": "Thông báo", + "mobile.camera_photo_permission_denied_description": "Chụp ảnh và tải chúng lên phiên bản Mattermost của bạn hoặc lưu chúng vào thiết bị của bạn. Mở Cài đặt để cấp quyền truy cập Đọc và ghi máy ảnh của bạn cho Mattermost.", + "mobile.camera_photo_permission_denied_title": "{applicationName} muốn truy cập vào máy ảnh của bạn", + "mobile.channel_info.alertNo": "Không", + "mobile.channel_info.alertYes": "Có", + "mobile.channel_list.unreads": "Chưa đọc", + "mobile.commands.error_title": "Lỗi thực thi lệnh", + "mobile.components.select_server_view.connect": "Đã kết nối", + "mobile.components.select_server_view.connecting": "Đang kết nối...", + "mobile.components.select_server_view.enterServerUrl": "Nhập URL máy chủ", + "mobile.components.select_server_view.proceed": "Tiếp tục", + "mobile.create_channel": "Tạo", + "mobile.create_post.read_only": "Kênh này chỉ có thể đọc", + "mobile.custom_list.no_results": "Không có kết quả", + "mobile.custom_status.choose_emoji": "Chọn một biểu tượng cảm xúc", + "mobile.custom_status.clear_after": "Xoá sau", + "mobile.custom_status.modal_confirm": "Xong", + "mobile.display_settings.theme": "Chủ đề", + "mobile.document_preview.failed_description": "Đã xảy ra lỗi khi mở tài liệu. Vui lòng đảm bảo rằng bạn đã cài đặt trình xem {fileType} và thử lại.\n", + "mobile.document_preview.failed_title": "Mở tài liệu thất bại", + "mobile.downloader.disabled_description": "Tải tập tin bị vô hiệu hóa trên máy chủ này. Vui lòng liên hệ với Quản trị viên hệ thống của bạn để biết thêm chi tiết.\n", + "mobile.downloader.disabled_title": "Tải xuống thất bại", + "mobile.downloader.failed_description": "Đã xảy ra lỗi trong khi tải xuống tệp. Vui lòng kiểm tra kết nối internet của bạn và thử lại.\n", + "mobile.downloader.failed_title": "Tải lỗi", + "mobile.edit_channel": "Lưu", + "mobile.edit_post.title": "Chỉnh sửa tin nhắn", + "mobile.error_handler.button": "Khởi chạy lại", + "mobile.error_handler.description": "\nNhấn khởi chạy lại để mở lại ứng dụng. Sau khi khởi động lại, bạn có thể báo cáo sự cố từ menu cài đặt.\n", + "mobile.error_handler.title": "Đã xảy ra lỗi không mong muốn", + "mobile.file_upload.disabled2": "Tệp tải lên từ điện thoại di động bị vô hiệu hóa.", + "mobile.file_upload.max_warning": "Tải lên giới hạn tối đa {count} tệp.", + "mobile.files_paste.error_description": "Đã xảy ra lỗi khi dán (các) tệp. Vui lòng thử lại.", + "mobile.files_paste.error_title": "Dán không thành công", + "mobile.gallery.title": "{index} / {total}", + "mobile.ios.photos_permission_denied_description": "Tải ảnh và video lên phiên bản Mattermost của bạn hoặc lưu chúng vào thiết bị của bạn. Mở Cài đặt để cấp quyền truy cập Đọc và ghi vào thư viện ảnh và video của bạn cho Mattermost.", + "mobile.ios.photos_permission_denied_title": "{applicationName} muốn truy cập ảnh của bạn", + "mobile.managed.exit": "Chỉnh sửa", + "mobile.managed.jailbreak": "Các thiết bị bẻ khóa không được {vendor} tin cậy, vui lòng thoát khỏi ứng dụng.", + "mobile.managed.not_secured.android": "Thiết bị này phải được bảo mật bằng khóa màn hình để sử dụng Mattermost.", + "mobile.managed.not_secured.ios": "Thiết bị này phải được bảo mật bằng mật mã để sử dụng Mattermost.\n\nChuyển đến Cài đặt > Face ID & Mật mã.", + "mobile.managed.not_secured.ios.touchId": "Thiết bị này phải được bảo mật bằng mật mã để sử dụng Mattermost.\n\nChuyển đến Cài đặt > Face ID & Mật mã.", + "mobile.managed.secured_by": "Được bảo đảm bởi {vendor}", + "mobile.managed.settings": "Đi đến cài đặt", + "mobile.markdown.code.copy_code": "Sao chép mã", + "mobile.markdown.code.plusMoreLines": "+{count, number} thêm {count, plural, one {line} other {lines}}", + "mobile.markdown.image.too_large": "Hình ảnh vượt quá kích thước tối đa của {maxWidth} và {maxHeight}:", + "mobile.markdown.link.copy_url": "Sao chép URL", + "mobile.mention.copy_mention": "Sao chép Mention", + "mobile.message_length.message": "Tin nhắn hiện tại của bạn quá dài. Số ký tự hiện tại: {max} / {count}", + "mobile.message_length.message_split_left": "Tin nhắn vượt quá giới hạn ký tự", + "mobile.message_length.title": "Độ dài tin nhắn", + "mobile.oauth.failed_to_login": "Nỗ lực đăng nhập của bạn không thành công. Vui lòng thử lại.", + "mobile.oauth.failed_to_open_link": "Liên kết không mở được. Vui lòng thử lại.", + "mobile.oauth.failed_to_open_link_no_browser": "Liên kết không mở được. Vui lòng xác minh xem trình duyệt có được cài đặt trong không gian hiện tại hay không.", + "mobile.oauth.something_wrong": "Đã xảy ra sự cố", + "mobile.oauth.switch_to_browser": "Vui lòng sử dụng trình duyệt của bạn để hoàn tất quá trình đăng nhập.", + "mobile.post_info.add_reaction": "Thêm phản ứng", + "mobile.post_info.copy_text": "Sao chép văn bản", + "mobile.post_info.mark_unread": "Đánh dấu chưa đọc", + "mobile.post_textbox.entire_channel.message": "Bằng cách sử dụng @all hoặc @channel, bạn sắp gửi thông báo tới {totalMembers, number} {totalMembers,plural, one {người} other {người}}. Bạn có chắc chắn muốn làm điều này?", + "mobile.post_textbox.entire_channel.message.with_timezones": "Bằng cách sử dụng @all hoặc @channel, bạn sắp gửi thông báo tới {totalMembers, number} {totalMembers,plural, one {người} other {người}} trong {timezones, number} {timezones,plult, one {múi giờ} other {múi giờ}}. Bạn có chắc chắn muốn làm điều này?", + "mobile.post_textbox.entire_channel.title": "Xác nhận gửi thông báo tới toàn bộ kênh", + "mobile.post_textbox.groups.title": "Xác nhận gửi thông báo cho các nhóm", + "mobile.post_textbox.uploadFailedDesc": "Một số tệp đính kèm không thể tải lên máy chủ. Bạn có chắc chắn muốn gửi tin nhắn?", + "mobile.post_textbox.uploadFailedTitle": "Đính kèm thất bại", + "mobile.post.cancel": "Hủy", + "mobile.post.delete_question": "Bạn có chắc chắn muốn xóa mã thông báo?", + "mobile.post.delete_title": "Xóa bài viết", + "mobile.post.failed_delete": "Xóa tin nhắn", + "mobile.post.failed_retry": "Thử lại", + "mobile.privacy_link": "Chính sách bảo mật", + "mobile.push_notification_reply.button": "Gửi", + "mobile.rename_channel.display_name_minLength": "Tên kênh phải dài từ {minLength, number} ký tự trở lên", + "mobile.rename_channel.display_name_required": "Tên kênh là bắt buộc", + "mobile.request.invalid_response": "Nhận được phản hồi không hợp lệ từ máy chủ.", + "mobile.reset_status.alert_cancel": "Hủy", + "mobile.reset_status.alert_ok": "Ok", + "mobile.reset_status.title_ooo": "Vô hiệu hóa \"Vắng mặt\"?", + "mobile.routes.code": "Mã {language}", + "mobile.routes.code.noLanguage": "Mã", + "mobile.routes.custom_status": "Đặt trạng thái", + "mobile.routes.table": "Bảng", + "mobile.routes.user_profile": "Hồ sơ", + "mobile.server_link.error.text": "Không thể tìm thấy liên kết trên máy chủ này.", + "mobile.server_link.error.title": "Liên kết bị lỗi", + "mobile.server_link.unreachable_channel.error": "Permalink thuộc về một tin nhắn đã bị xóa hoặc một kênh mà bạn không có quyền truy cập.", + "mobile.server_link.unreachable_team.error": "Permalink thuộc về một tin nhắn đã bị xóa hoặc một kênh mà bạn không có quyền truy cập.", + "mobile.server_link.unreachable_user.error": "Liên kết này thuộc về một người dùng đã bị xóa.", + "mobile.server_upgrade.button": "Đồng ý", + "mobile.server_upgrade.title": "Yêu cầu nâng cấp máy chủ", + "mobile.server_url.empty": "Vui lòng nhập URL máy chủ hợp lệ", + "mobile.server_url.invalid_format": "Phải bắt đầu bằng http: // hoặc https: //", + "mobile.session_expired": "Session Expired: Vui lòng đăng nhập để tiếp tục nhận thông báo. Các phiên cho {siteName} được định cấu hình để hết hạn sau mỗi {daysCount, number} {daysCount,plural, one {ngày} other {ngày}}.", + "mobile.storage_permission_denied_description": "Tải tệp lên phiên bản Mattermost của bạn. Mở Cài đặt để cấp quyền truy cập Đọc và ghi tệp trên thiết bị này cho Mattermost.", + "mobile.storage_permission_denied_title": "{applicationName} muốn truy cập tệp của bạn", + "mobile.suggestion.members": "Các thành viên", + "mobile.system_message.channel_archived_message": "{username} đã lưu trữ kênh", + "mobile.system_message.channel_unarchived_message": "{username} đã hủy lưu trữ kênh", + "mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} đã cập nhật tên hiển thị của kênh từ: {oldDisplayName} thành: {newDisplayName}", + "mobile.system_message.update_channel_header_message_and_forget.removed": "{username} đã xóa tiêu đề kênh (là: {oldHeader})", + "mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} đã cập nhật tiêu đề kênh từ: {oldHeader} thành: {newHeader}", + "mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} đã cập nhật tiêu đề kênh thành: {newHeader}", + "mobile.system_message.update_channel_purpose_message.removed": "{username} đã xóa mục đích của kênh (là: {oldPurpose})", + "mobile.system_message.update_channel_purpose_message.updated_from": "{username} đã cập nhật mục đích của kênh từ: {oldPurpose} thành: {newPurpose}", + "mobile.system_message.update_channel_purpose_message.updated_to": "{username} đã cập nhật mục đích của kênh thành: {newPurpose}", + "mobile.tos_link": "Điều khoản dịch vụ", + "mobile.user_list.deactivated": "Vô hiệu hóa", + "modal.manual_status.auto_responder.message_": "Bạn có muốn chuyển trạng thái của mình thành \"{status}\" và tắt Trả lời tự động không?", + "modal.manual_status.auto_responder.message_away": "Bạn có muốn chuyển trạng thái của mình thành \"Trực tuyến\" và tắt Trả lời tự động không?", + "modal.manual_status.auto_responder.message_dnd": "Bạn có muốn chuyển trạng thái của mình thành \"Không làm phiền\" và tắt Trả lời tự động không?", + "modal.manual_status.auto_responder.message_offline": "Bạn có muốn chuyển trạng thái của mình thành \"Ngoại tuyến\" và tắt Trả lời tự động không?", + "modal.manual_status.auto_responder.message_online": "Bạn có muốn chuyển trạng thái của mình thành \"Trực tuyến\" và tắt Trả lời tự động không?", + "password_send.reset": "Cài lại Mật khẩu", + "permalink.show_dialog_warn.description": "Bạn sắp tham gia \"{channel}\" mà không được quản trị viên kênh thêm vào một cách rõ ràng. Bạn có chắc chắn muốn tham gia kênh riêng tư này không?", + "post_body.check_for_out_of_channel_groups_mentions.message": "đã không nhận được thông báo bởi đề cập này bởi vì họ không có trong kênh. Họ cũng không phải là thành viên của các nhóm được liên kết với kênh này.", + "post_body.check_for_out_of_channel_mentions.link.private": "Mời những người khác vào kênh riêng này", + "post_body.check_for_out_of_channel_mentions.link.public": "thêm chúng vào kênh", + "status_dropdown.set_dnd": "Đừng làm phiền", + "status_dropdown.set_ooo": "Ra khỏi văn phòng", + "threads": "Chủ đề", + "threads.deleted": "Tin nhắn gốc đã bị xóa", + "threads.follow": "Theo dõi", + "threads.following": "Đang theo dõi", + "threads.followMessage": "Theo dõi tin nhắn", + "threads.followThread": "Theo dõi chủ đề", + "threads.newReplies": "{count} {count, plural, one {trả lời} other {trả lời}} mới", + "threads.replies": "{count} {count, plural, one {trả lời} other {trả lời}}", + "threads.unfollowMessage": "Huỷ theo dõi tin nhắn", + "threads.unfollowThread": "Huỷ theo dõi chủ đề", + "user.settings.general.field_handled_externally": "Trường này được xử lý thông qua nhà cung cấp đăng nhập của bạn. Nếu bạn muốn thay đổi nó, bạn cần phải làm như vậy thông qua nhà cung cấp đăng nhập của bạn.", + "user.settings.general.firstName": "Tên đầu tiên", + "user.settings.general.username": "Tên tài khoản", + "user.settings.notifications.email_threads.description": "Thông báo cho tôi về tất cả các câu trả lời cho chủ đề tôi đang theo dõi." +} From 1a3a0d7261f0f055f0ddd36f31e992503d7f654f Mon Sep 17 00:00:00 2001 From: Valentyn Smagin <6murdoc6@gmail.com> Date: Tue, 18 Jul 2023 09:21:22 +0000 Subject: [PATCH 004/126] Translated using Weblate (Ukrainian) Currently translated at 82.6% (878 of 1062 strings) Translation: mattermost-languages-shipped/mattermost-mobile-v2 Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/ --- assets/base/i18n/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/base/i18n/uk.json b/assets/base/i18n/uk.json index 01dc9d108..9cc3949be 100644 --- a/assets/base/i18n/uk.json +++ b/assets/base/i18n/uk.json @@ -1,7 +1,7 @@ { "about.date": "Дата створення:", "about.enterpriseEditione1": "Enterprise Edition", - "about.enterpriseEditionLearn": "Детальніше про редакцію Enterprise читайте на ", + "about.enterpriseEditionLearn": "Детальніше про Edition Enterprise читайте на ", "about.enterpriseEditionSt": "Сучасне спілкування в вашій локальній мережі.", "about.hash": "Хеш збірки:", "about.hashee": "Хеш збірки EE:", From cdac754952bb349cedcf6b5a4d5896f0296c7a7a Mon Sep 17 00:00:00 2001 From: linkvn Date: Thu, 20 Jul 2023 10:29:42 +0000 Subject: [PATCH 005/126] Translated using Weblate (Vietnamese) Currently translated at 54.7% (581 of 1062 strings) Translation: mattermost-languages-shipped/mattermost-mobile-v2 Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/vi/ --- assets/base/i18n/vi.json | 170 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 169 insertions(+), 1 deletion(-) diff --git a/assets/base/i18n/vi.json b/assets/base/i18n/vi.json index 5331c9af4..f4202168d 100644 --- a/assets/base/i18n/vi.json +++ b/assets/base/i18n/vi.json @@ -411,5 +411,173 @@ "user.settings.general.field_handled_externally": "Trường này được xử lý thông qua nhà cung cấp đăng nhập của bạn. Nếu bạn muốn thay đổi nó, bạn cần phải làm như vậy thông qua nhà cung cấp đăng nhập của bạn.", "user.settings.general.firstName": "Tên đầu tiên", "user.settings.general.username": "Tên tài khoản", - "user.settings.notifications.email_threads.description": "Thông báo cho tôi về tất cả các câu trả lời cho chủ đề tôi đang theo dõi." + "user.settings.notifications.email_threads.description": "Thông báo cho tôi về tất cả các câu trả lời cho chủ đề tôi đang theo dõi.", + "account.logout_from": "Đăng xuất khỏi {serverName}", + "account.settings": "Thiết lập", + "account.your_profile": "Hồ sơ của bạn", + "alert.channel_deleted.title": "Kênh lưu trữ", + "alert.push_proxy_error.title": "Không thể nhận thông báo từ máy chủ này", + "alert.push_proxy_unknown.description": "Máy chủ này không thể nhận thông báo đẩy vì lý do không xác định. Điều này sẽ được thử lại vào lần tới khi bạn kết nối.", + "alert.push_proxy_unknown.title": "Không thể nhận thông báo từ máy chủ này", + "alert.push_proxy.button": "Đồng ý", + "alert.removed_from_channel.description": "Bạn đã bị xóa khỏi kênh {displayName}.", + "alert.removed_from_channel.title": "Đã xóa khỏi kênh", + "alert.removed_from_team.description": "Bạn đã bị xóa khỏi nhóm {displayName}.", + "alert.removed_from_team.title": "Bị loại khỏi đội", + "announcment_banner.dismiss": "Bỏ qua thông báo", + "announcment_banner.okay": "Đồng ý", + "autocomplete_selector.unknown_channel": "Kênh không xác định", + "browse_channels.archivedChannels": "Kênh đã lưu trữ", + "browse_channels.dropdownTitle": "Xem", + "browse_channels.noMore": "Không còn kênh nào để tham gia", + "browse_channels.publicChannels": "Kênh công khai", + "browse_channels.sharedChannels": "Kênh được chia sẻ", + "browse_channels.showArchivedChannels": "Hiển thị: Kênh đã lưu trữ", + "browse_channels.showPublicChannels": "Hiển thị: Kênh công khai", + "browse_channels.showSharedChannels": "Hiển thị: Kênh được chia sẻ", + "browse_channels.title": "Duyệt kênh", + "channel_add_members.add_members.button": "Thêm thành viên", + "channel_files.empty.paragraph": "Các tệp được đăng trong kênh này sẽ hiển thị ở đây.", + "channel_files.empty.title": "Chưa có tệp nào", + "channel_files.noFiles.paragraph": "Kênh này không chứa bất kỳ tệp nào có bộ lọc được áp dụng", + "channel_files.noFiles.title": "Không tìm thấy tệp nào", + "channel_header.info": "Xem thông tin", + "channel_info.add_members": "Thêm thành viên", + "channel_info.alert_retry": "Thử lại", + "channel_info.alertNo": "Không", + "channel_info.alertYes": "Có", + "channel_info.archive": "Lưu trữ kênh", + "channel_info.archive_description.can_view_archived": "Thao tác này sẽ lưu trữ kênh từ nhóm. Các thành viên của kênh vẫn có thể truy cập nội dung kênh.\n\nBạn có chắc chắn muốn lưu trữ {term} {name} không?", + "channel_info.archive_description.cannot_view_archived": "Thao tác này sẽ lưu trữ kênh từ nhóm và xóa kênh đó khỏi giao diện người dùng.\n\nCác kênh đã lưu trữ có thể được hủy lưu trữ nếu cần lại. Bạn có chắc chắn muốn lưu trữ {term} {name} không?", + "channel_info.archive_failed": "Đã xảy ra lỗi khi lưu trữ kênh {displayName}", + "channel_info.archive_title": "Lưu trữ {term}", + "channel_info.channel_files": "Tệp", + "channel_info.close": "Đóng", + "channel_info.close_dm": "Đóng tin nhắn trực tiếp", + "channel_info.close_dm_channel": "Bạn có chắc chắn muốn đóng tin nhắn trực tiếp này không? Thao tác này sẽ xóa ứng dụng khỏi màn hình chính nhưng bạn luôn có thể mở lại ứng dụng.", + "channel_info.close_gm": "Đóng tin nhắn nhóm", + "channel_info.close_gm_channel": "Bạn có chắc chắn muốn đóng tin nhắn nhóm này không? Thao tác này sẽ xóa ứng dụng khỏi màn hình chính nhưng bạn luôn có thể mở lại ứng dụng.", + "channel_info.convert_failed": "Chúng tôi không thể chuyển đổi {displayName} thành một kênh riêng tư.", + "channel_info.convert_private": "Chuyển sang kênh riêng tư", + "channel_info.convert_private_success": "{displayName} hiện là kênh riêng tư.", + "channel_info.convert_private_title": "Chuyển đổi {displayName} thành một kênh riêng tư?", + "channel_info.copied": "Đã sao chép", + "channel_info.copy_link": "Sao chép liên kết", + "channel_info.custom_status": "Trạng thái tùy chỉnh:", + "channel_info.edit_header": "Chỉnh sửa tiêu đề", + "channel_info.error_close": "Đóng", + "channel_info.favorite": "Yêu thích", + "channel_info.favorited": "Đã yêu thích", + "channel_info.ignore_mentions": "Bỏ qua @channel, @here, @all", + "channel_info.leave": "Rời khỏi", + "channel_info.leave_channel": "Rời kênh", + "channel_info.leave_private_channel": "Bạn có chắc chắn muốn thoát khỏi kênh riêng tư {displayName} không? Bạn không thể tham gia lại kênh trừ khi bạn được mời lại.", + "channel_info.leave_public_channel": "Bạn có chắc chắn muốn rời khỏi kênh công khai {displayName} không? Bạn luôn có thể tham gia lại.", + "channel_info.local_time": "Giờ địa phương", + "channel_info.members": "Thành viên", + "channel_info.mention": "Nhắc đến", + "channel_info.mobile_notifications": "Thông báo di động", + "channel_info.muted": "Tắt thông báo", + "channel_info.notification.all": "Tất cả", + "channel_info.notification.default": "Mặc định", + "channel_info.notification.mention": "Nhắc đến", + "channel_info.pinned_messages": "Tin nhắn được ghim", + "channel_info.position": "Vị trí", + "channel_info.private_channel": "Kênh riêng tư", + "channel_info.public_channel": "Kênh công khai", + "channel_info.send_a_mesasge": "Gửi tin nhắn", + "channel_info.send_mesasge": "Gửi tin nhắn", + "channel_info.set_header": "Đặt tiêu đề", + "channel_info.unarchive": "Hủy lưu trữ kênh", + "channel_info.unarchive_description": "Bạn có chắc chắn muốn hủy lưu trữ {term} {name} không?", + "channel_info.unarchive_failed": "Đã xảy ra lỗi khi cố hủy lưu trữ kênh {displayName}", + "channel_info.unarchive_title": "Hủy lưu trữ {term}", + "channel_intro.createdBy": "Được tạo bởi {user} vào {date}", + "channel_intro.createdOn": "Được tạo vào {date}", + "channel_list.channels_category": "Kênh truyền hình", + "channel_list.dms_category": "Tin nhắn trực tiếp", + "channel_list.favorites_category": "Yêu thích", + "channel_list.find_channels": "Tìm kênh...", + "channel_modal.makePrivate.description": "Khi một kênh được đặt thành riêng tư, chỉ các thành viên nhóm được mời mới có thể truy cập và tham gia vào kênh đó", + "channel_modal.makePrivate.label": "Đặt ở chế độ riêng tư", + "channel_notification_preferences.default": "(mặc định)", + "channel_notification_preferences.muted_title": "Kênh này bị tắt tiếng", + "channel_notification_preferences.notification.all": "Tất cả tin nhắn mới", + "channel_notification_preferences.notification.mention": "Chỉ đề cập, tin nhắn trực tiếp", + "channel_notification_preferences.notification.none": "Không có gì", + "channel_notification_preferences.notify_about": "Thông báo cho tôi về...", + "channel_notification_preferences.reset_default": "Đặt lại về mặc định", + "channel_notification_preferences.thread_replies": "Trả lời trong chủ đề", + "channel_notification_preferences.unmute_content": "Bật tiếng kênh", + "connection_banner.connected": "Đã khôi phục kết nối", + "connection_banner.connecting": "Đang kết nối...", + "connection_banner.not_connected": "Không có kết nối Internet", + "connection_banner.not_reachable": "Máy chủ không thể truy cập được", + "create_direct_message.title": "Tạo tin nhắn trực tiếp", + "create_post.thread_reply": "Trả lời chủ đề này...", + "default_skin_tone": "Màu da mặc định", + "display_settings.clock.military": "24 giờ", + "display_settings.clock.standard": "12 giờ", + "display_settings.clockDisplay": "Hiển thị đồng hồ", + "display_settings.crt": "Chủ đề trả lời được thu gọn", + "display_settings.crt.off": "Tắt", + "display_settings.crt.on": "Bật", + "display_settings.theme": "Giao diện", + "display_settings.timezone": "Múi giờ", + "display_settings.tz.auto": "Tự động", + "display_settings.tz.manual": "Thủ công", + "download.error": "Không thể tải xuống tệp. Thử lại sau", + "edit_server.description": "Chỉ định tên hiển thị cho máy chủ này", + "edit_server.display_help": "Máy chủ: {url}", + "edit_server.save": "Lưu", + "edit_server.saving": "Đang lưu", + "edit_server.title": "Sửa tên máy chủ", + "extension.no_memberships.description": "Để chia sẻ nội dung, bạn cần phải là thành viên của một nhóm trên máy chủ Mattermost.", + "extension.no_memberships.title": "Chưa là thành viên của đội nào", + "extension.no_servers.description": "Để chia sẻ nội dung, bạn cần đăng nhập vào máy chủ Mattermost.", + "extension.no_servers.title": "Không được kết nối với bất kỳ máy chủ nào", + "find_channels.directory": "Danh mục", + "find_channels.new_channel": "Kênh mới", + "find_channels.open_dm": "Mở tin nhắn trực tiếp", + "find_channels.title": "Tìm kênh", + "gallery.copy_link.failed": "Không thể sao chép liên kết vào khay nhớ tạm", + "gallery.downloading": "Đang tải xuống...", + "gallery.image_saved": "Đã lưu hình ảnh", + "gallery.opening": "Đang mở...", + "gallery.preparing": "Đang chuẩn bị...", + "gallery.save_failed": "Không thể lưu tệp", + "gallery.unsupported": "Bản xem trước không được hỗ trợ cho loại tệp này. Hãy thử tải xuống hoặc chia sẻ để mở nó trong một ứng dụng khác.", + "gallery.video_saved": "Đã lưu video", + "general_settings.about": "Giới thiệu về {appTitle}", + "general_settings.advanced_settings": "Cài đặt nâng cao", + "general_settings.display": "Hiển thị", + "general_settings.help": "Trợ giúp", + "general_settings.notifications": "Thông báo", + "general_settings.report_problem": "Báo lỗi", + "home.header.plus_menu": "Tuỳ chọn", + "integration_selector.multiselect.submit": "Đã xong", + "intro.add_members": "Thêm thành viên", + "intro.channel_info": "Thông tin", + "intro.created_by": "được tạo bởi {creator} vào {date}.", + "intro.direct_message": "Đây là phần đầu cuộc trò chuyện của bạn với {teammate}. Tin nhắn và tệp được chia sẻ ở đây không được hiển thị cho bất kỳ ai khác.", + "intro.group_message": "Đây là phần bắt đầu cuộc trò chuyện của bạn với nhóm này. Các tin nhắn và tệp được chia sẻ ở đây không được hiển thị cho bất kỳ ai khác bên ngoài nhóm.", + "intro.private_channel": "Kênh riêng tư", + "intro.public_channel": "Kênh công khai", + "intro.townsquare": "Chào mừng bạn đến với {name}. Mọi người tự động trở thành thành viên của kênh này khi họ tham gia nhóm.", + "intro.welcome": "Chào mừng bạn đến với kênh {displayName}.", + "invite_people_to_team.message": "Đây là một liên kết để cộng tác và giao tiếp với chúng tôi trên Mattermost.", + "invite_people_to_team.title": "Tham gia nhóm {team}", + "invite.members.already_member": "Người này đã là một thành viên trong nhóm", + "channel_notification_preferences.notification.thread_replies": "Thông báo cho tôi về các câu trả lời cho chủ đề tôi đang theo dõi trong kênh này", + "intro.welcome.private": "Chỉ những thành viên được mời mới có thể xem các tin nhắn được đăng trong kênh riêng tư này.", + "account.logout": "Đăng xuất", + "alert.channel_deleted.description": "Kênh {displayName} đã được lưu trữ.", + "channel_info.nickname": "Biệt danh", + "channel_notification_preferences.muted_content": "Bạn có thể thay đổi cài đặt thông báo nhưng bạn sẽ không nhận được thông báo cho đến khi kênh được bật tiếng.", + "channel_info.notification.none": "Không bao giờ", + "intro.welcome.public": "Thêm một số thành viên nhóm khác vào kênh hoặc bắt đầu cuộc trò chuyện bên dưới.", + "alert.push_proxy_error.description": "Do cấu hình cho máy chủ này, không thể nhận thông báo trong ứng dụng dành cho thiết bị di động. Liên hệ với quản trị viên hệ thống của bạn để biết thêm thông tin.", + "invite.members.user_is_guest": "Liên hệ với quản trị viên của bạn để biến khách này thành thành viên chính thức", + "channel_header.member_count": "{count, plural, one {# thành viên} other {# thành viên}}", + "channel_info.convert_private_description": "Khi bạn chuyển đổi {displayName} thành kênh riêng tư, lịch sử và tư cách thành viên sẽ được giữ nguyên. Các tệp được chia sẻ công khai vẫn có thể truy cập được đối với bất kỳ ai có liên kết. Tư cách thành viên trong một kênh riêng tư chỉ bằng lời mời.\n\nThay đổi là vĩnh viễn và không thể hoàn tác.\n\nBạn có chắc chắn muốn chuyển đổi {displayName} thành một kênh riêng tư không?" } From c9d091239577a57f62208581be12d0ec9b4f5dce Mon Sep 17 00:00:00 2001 From: linkvn Date: Fri, 21 Jul 2023 08:03:07 +0000 Subject: [PATCH 006/126] Translated using Weblate (Vietnamese) Currently translated at 73.8% (784 of 1062 strings) Translation: mattermost-languages-shipped/mattermost-mobile-v2 Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/vi/ --- assets/base/i18n/vi.json | 205 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 204 insertions(+), 1 deletion(-) diff --git a/assets/base/i18n/vi.json b/assets/base/i18n/vi.json index f4202168d..6ad7ac287 100644 --- a/assets/base/i18n/vi.json +++ b/assets/base/i18n/vi.json @@ -579,5 +579,208 @@ "alert.push_proxy_error.description": "Do cấu hình cho máy chủ này, không thể nhận thông báo trong ứng dụng dành cho thiết bị di động. Liên hệ với quản trị viên hệ thống của bạn để biết thêm thông tin.", "invite.members.user_is_guest": "Liên hệ với quản trị viên của bạn để biến khách này thành thành viên chính thức", "channel_header.member_count": "{count, plural, one {# thành viên} other {# thành viên}}", - "channel_info.convert_private_description": "Khi bạn chuyển đổi {displayName} thành kênh riêng tư, lịch sử và tư cách thành viên sẽ được giữ nguyên. Các tệp được chia sẻ công khai vẫn có thể truy cập được đối với bất kỳ ai có liên kết. Tư cách thành viên trong một kênh riêng tư chỉ bằng lời mời.\n\nThay đổi là vĩnh viễn và không thể hoàn tác.\n\nBạn có chắc chắn muốn chuyển đổi {displayName} thành một kênh riêng tư không?" + "channel_info.convert_private_description": "Khi bạn chuyển đổi {displayName} thành kênh riêng tư, lịch sử và tư cách thành viên sẽ được giữ nguyên. Các tệp được chia sẻ công khai vẫn có thể truy cập được đối với bất kỳ ai có liên kết. Tư cách thành viên trong một kênh riêng tư chỉ bằng lời mời.\n\nThay đổi là vĩnh viễn và không thể hoàn tác.\n\nBạn có chắc chắn muốn chuyển đổi {displayName} thành một kênh riêng tư không?", + "invite.search.email_invite": "mời", + "invite.search.no_results": "Không tìm thấy ai phù hợp", + "invite.send_invite": "Gửi", + "invite.sendInvitationsTo": "Gửi lời mời tới…", + "invite.shareLink": "Chia sẻ liên kết", + "invite.summary.back": "Quay lại", + "invite.summary.done": "Đã xong", + "invite.summary.email_invite": "Một email mời đã được gửi", + "invite.summary.error": "{invitationsCount, plural, one {lời mời} other {lời mời}} không thể gửi thành công", + "invite.summary.member_invite": "Được mời làm thành viên của {teamDisplayName}", + "invite.summary.not_sent": "{notSentCount, plural, one {lời mời} other {lời mời}} đã không được gửi", + "invite.summary.report.notSent": "{count} {count, plural, one {lời mời} other {lời mời}} đã không được gửi", + "invite.summary.report.sent": "{count} {count, plural, one {lời mời} other {lời mời}} thành công", + "invite.summary.sent": "{sentCount, plural, one {lời mời} other {lời mời}} của bạn đã được gửi đi", + "invite.summary.smtp_failure": "SMTP không được định cấu hình trong Bảng điều khiển hệ thống", + "invite.summary.try_again": "Thử lại", + "invite.title": "Mời", + "invite.title.summary": "Tóm tắt lời mời", + "join_team.error.group_error": "Bạn cần phải là thành viên của một nhóm được liên kết để tham gia nhóm này.", + "join_team.error.message": "Đã xảy ra lỗi khi tham gia nhóm", + "mobile.manage_members.remove": "Xoá bỏ", + "mobile.manage_members.remove_member": "Xóa khỏi Kênh", + "mobile.manage_members.section_title_admins": "QUẢN TRỊ KÊNH", + "mobile.manage_members.section_title_members": "THÀNH VIÊN", + "mobile.managed.jailbreak_no_debug_info": "Không có sẵn", + "mobile.managed.jailbreak_no_reason": "Không có sẵn", + "mobile.no_results_with_term": "Không có kết quả cho “{term}”", + "mobile.no_results_with_term.files": "Không có tệp nào phù hợp với “{term}”", + "mobile.no_results_with_term.messages": "Không tìm thấy kết quả phù hợp cho “{term}”", + "mobile.no_results.spelling": "Kiểm tra chính tả hoặc thử tìm kiếm khác.", + "mobile.oauth.something_wrong.okButton": "Đồng ý", + "mobile.oauth.switch_to_browser.error_title": "Lỗi đăng nhập", + "mobile.oauth.switch_to_browser.title": "Đang chuyển hướng...", + "mobile.onboarding.next": "Kế tiếp", + "mobile.onboarding.sign_in": "Đăng nhập", + "mobile.onboarding.sign_in_to_get_started": "Đăng nhập để bắt đầu", + "mobile.post_info.save": "Lưu", + "mobile.post_info.unsave": "Không lưu", + "mobile.post_pre_header.pinned_saved": "Ghim và lưu", + "mobile.request.invalid_request_method": "Phương thức yêu cầu không hợp lệ", + "mobile.screen.settings": "Cài đặt", + "mobile.screen.your_profile": "Hồ sơ của bạn", + "mobile.search.modifier.exclude": "loại trừ cụm từ tìm kiếm", + "mobile.search.modifier.from": "một người dùng cụ thể", + "mobile.search.modifier.in": "một kênh cụ thể", + "mobile.search.modifier.phrases": "tin nhắn với cụm từ", + "mobile.search.show_less": "Hiện ít hơn", + "mobile.search.show_more": "Hiển thị thêm", + "mobile.search.team.select": "Chọn một nhóm để tìm kiếm", + "mobile.server_identifier.exists": "Bạn đã được kết nối với máy chủ này.", + "mobile.server_name.exists": "Bạn đang sử dụng tên này cho một máy chủ khác.", + "mobile.server_ping_failed": "Không thể kết nối đến máy chủ.", + "mobile.server_requires_client_certificate": "Máy chủ yêu cầu chứng chỉ ứng dụng khách để xác thực.", + "mobile.server_upgrade.description": "\nCần nâng cấp máy chủ để sử dụng ứng dụng Mattermost. Vui lòng hỏi Quản trị viên hệ thống của bạn để biết chi tiết.\n", + "mobile.server_url.deeplink.emm.denied": "Ứng dụng này được kiểm soát bởi EMM và url máy chủ DeepLink không khớp với máy chủ cho phép EMM", + "mobile.session_expired.title": "Phiên hết hạn", + "mobile.write_storage_permission_denied_description": "Lưu tập tin vào thiết bị của bạn. Mở Cài đặt để cấp cho {applicationName} quyền ghi vào các tệp trên thiết bị này.", + "more_messages.text": "{count} new {count, plural, one {tin nhắn} other {tin nhắn}}", + "notification_settings.auto_responder": "Trả lời tự động", + "notification_settings.auto_responder.footer.message": "Đặt một tin nhắn tùy chỉnh được gửi tự động để trả lời các tin nhắn trực tiếp, chẳng hạn như trả lời khi vắng mặt hoặc trong kỳ nghỉ. Bật cài đặt này sẽ thay đổi trạng thái của bạn thành Vắng mặt và tắt thông báo.", + "notification_settings.auto_responder.message": "Tin nhắn", + "notification_settings.auto_responder.to.enable": "Bật trả lời tự động", + "notification_settings.email": "Thông báo thư điện tử", + "notification_settings.email.crt.emailInfo": "Khi được bật, bất kỳ câu trả lời nào cho chuỗi bạn đang theo dõi sẽ gửi thông báo qua email", + "notification_settings.email.crt.send": "Thông báo trả lời chủ đề", + "notification_settings.email.emailInfo": "Thông báo qua email được gửi cho các đề cập và tin nhắn trực tiếp khi bạn ngoại tuyến hoặc đi xa hơn 5 phút.", + "notification_settings.email.everyHour": "Mỗi tiếng", + "notification_settings.email.fifteenMinutes": "Mỗi 15 phút", + "notification_settings.email.immediately": "Ngay lập tức", + "notification_settings.email.never": "Không bao giờ", + "notification_settings.email.send": "Gửi thông báo qua email", + "notification_settings.mention.reply": "Gửi thông báo trả lời cho", + "notification_settings.mentions": "Được nhắc đến", + "notification_settings.mentions_replies": "Nhắc đến và trả lời", + "notification_settings.mentions..keywordsDescription": "Các từ khác kích hoạt một đề cập", + "notification_settings.mentions.channelWide": "Lượt đề cập trên toàn kênh", + "notification_settings.mentions.keywords": "Từ khoá", + "notification_settings.mentions.keywords_mention": "Từ khóa kích hoạt đề cập", + "notification_settings.mentions.sensitiveUsername": "Tên người dùng không phân biệt chữ hoa chữ thường của bạn", + "notification_settings.mobile": "Thông báo đẩy", + "notification_settings.mobile.away": "Đi vắng hoặc ngoại tuyến", + "notification_settings.mobile.offline": "Ngoại tuyến", + "notification_settings.mobile.online": "Trực tuyến, đi xa hoặc ngoại tuyến", + "notification_settings.ooo_auto_responder": "Trả lời tự động", + "notification_settings.push_notification": "Thông báo đẩy", + "notification_settings.push_threads.following": "Thông báo cho tôi về các câu trả lời cho các chủ đề tôi đang theo dõi trong kênh này", + "notification_settings.push_threads.replies": "Trả lời trong chủ đề", + "notification_settings.pushNotification.all_new_messages": "Tất cả tin nhắn mới", + "notification_settings.pushNotification.nothing": "Không có gì", + "notification_settings.threads_mentions": "Đề cập trong chủ đề", + "notification_settings.threads_start": "Chủ đề mà tôi bắt đầu", + "notification_settings.threads_start_participate": "Chủ đề mà tôi bắt đầu hoặc tham gia", + "notification.message_not_found": "Không tìm thấy tin nhắn", + "notification.no_post": "Tin nhắn đã không được tìm thấy.", + "notification.not_channel_member": "Tin nhắn này thuộc về một kênh mà bạn không phải là thành viên.", + "notification.not_team_member": "Thư này thuộc về một nhóm mà bạn không phải là thành viên.", + "onboarding.calls": "Bắt đầu cuộc gọi âm thanh an toàn ngay lập tức", + "onboarding.integrations": "Tích hợp với các công cụ bạn yêu thích", + "onboarding.realtime_collaboration": "Cộng tác trong thời gian thực", + "onboarding.realtime_collaboration_description": "Các kênh liên tục, nhắn tin trực tiếp và chia sẻ tệp hoạt động liền mạch để bạn có thể duy trì kết nối mọi lúc mọi nơi.", + "onboarding.welcome": "Chào mừng", + "onboaring.welcome_description": "Mattermost là một nền tảng mã nguồn mở dành cho sự hợp tác của các nhà phát triển. An toàn, linh hoạt và tích hợp với các công cụ của bạn.", + "password_send.generic_error": "Chúng tôi không thể gửi cho bạn liên kết đặt lại mật khẩu. Vui lòng liên hệ với Quản trị viên hệ thống của bạn để được hỗ trợ.", + "password_send.link.title": "Đặt lại liên kết đã gửi", + "password_send.return": "Trở về trang đăng nhập", + "permalink.error.access.text": "Tin nhắn bạn đang cố xem nằm trong một kênh mà bạn không có quyền truy cập hoặc đã bị xóa.", + "permalink.error.access.title": "Tin nhắn không xem được", + "servers.login": "Đăng nhập", + "servers.logout": "Đăng xuất", + "servers.remove": "Xoá bỏ", + "settings_display.clock.mz.desc": "Ví dụ: 16:00", + "settings_display.clock.normal.desc": "Ví dụ: 3:00 PM", + "settings_display.clock.standard": "đồng hồ 12 giờ", + "settings_display.crt.label": "Chủ đề trả lời được thu gọn", + "settings_display.custom_theme": "Tùy chỉnh giao diện", + "settings_display.timezone.automatically": "Đặt tự động", + "settings_display.timezone.manual": "Đổi múi giờ", + "settings_display.timezone.off": "Tắt", + "settings_display.timezone.select": "Chọn múi giờ", + "settings.about": "Về {appTitle}", + "settings.about.build": "{version} (Bản {number})", + "settings.about.database": "Database:", + "settings.about.database.schema": "Database Schema Version:", + "settings.about.licensed": "Giấy phép được cấp: {company}", + "settings.about.powered_by": "{site} được cung cấp bởi Mattermost", + "settings.about.server.version.desc": "Phiên bản máy chủ:", + "settings.about.server.version.value": "{version} (Bản {number})", + "settings.about.serverVersionNoBuild": "{version}", + "settings.about.version": "Phiên bản ứng dụng:", + "settings.advanced_settings": "Cài đặt nâng cao", + "settings.advanced.cancel": "Huỷ", + "settings.advanced.delete": "Xoá", + "settings.advanced.delete_data": "Xoá tệp trên máy", + "settings.advanced.delete_message.confirmation": "\nĐiều này sẽ xóa tất cả các tệp được tải xuống thông qua ứng dụng dành cho máy chủ này. Vui lòng xác nhận để tiếp tục.\n", + "settings.display": "Hiển thị", + "settings.link.error.text": "Không thể mở liên kết.", + "snack.bar.mute.channel": "Kênh này đã bị tắt tiếng", + "snack.bar.remove.user": "1 thành viên đã bị xóa khỏi kênh", + "snack.bar.undo": "Hoàn tác", + "snack.bar.unfavorite.channel": "Kênh này không được yêu thích", + "snack.bar.unfollow.thread": "Đã hủy theo dõi chủ đề", + "snack.bar.unmute.channel": "Kênh này đã được bật tiếng", + "team_list.no_other_teams.description": "Để tham gia một nhóm khác, hãy yêu cầu Quản trị viên nhóm nhận lời mời hoặc tạo nhóm của riêng bạn.", + "team_list.no_other_teams.title": "Không có đội bổ sung để tham gia", + "terms_of_service.acceptButton": "Đồng ý", + "terms_of_service.alert_cancel": "Huỷ bỏ", + "terms_of_service.alert_retry": "Thử lại", + "terms_of_service.decline": "Từ chối", + "terms_of_service.error.logout": "Đăng xuất", + "terms_of_service.error.retry": "Thử lại", + "terms_of_service.error.title": "Không lấy được Điều khoản dịch vụ.", + "terms_of_service.terms_declined.ok": "Đồng ý", + "terms_of_service.terms_declined.title": "Bạn phải chấp nhận điều khoản dịch vụ", + "terms_of_service.title": "Điều khoản dịch vụ", + "thread.header.thread": "Chủ đề", + "thread.header.thread_in": "trong {channelName}", + "thread.loadingReplies": "Đang tải câu trả lời...", + "thread.noReplies": "Chưa có câu trả lời nào", + "thread.options.title": "Thao tác với chủ đề", + "thread.repliesCount": "{repliesCount, number} {repliesCount, plural, one {trả lời} other {trả lời}}", + "threads.end_of_list.subtitle": "Nếu bạn đang tìm kiếm các cuộc trò chuyện cũ hơn, hãy thử tìm kiếm thay thế", + "threads.end_of_list.title": "Đó là phần cuối của danh sách!", + "unreads.empty.show_all": "Hiển thị tất cả", + "unreads.empty.paragraph": "Tắt bộ lọc chưa đọc để hiển thị tất cả các kênh của bạn.", + "unreads.empty.title": "Đã đọc hết", + "unsupported_server.message": "Máy chủ của bạn, {serverDisplayName}, đang chạy phiên bản máy chủ không được hỗ trợ. Bạn có thể gặp sự cố tương thích gây ra sự cố hoặc lỗi nghiêm trọng phá vỡ chức năng cốt lõi của ứng dụng. Vui lòng liên hệ với Quản trị viên Hệ thống của bạn để nâng cấp máy chủ Mattermost của bạn.", + "unsupported_server.title": "Phiên bản máy chủ không được hỗ trợ", + "user_profile.custom_status": "Trạng thái tùy chỉnh", + "user_status.away": "Vắng mặt", + "user_status.dnd": "Đừng làm phiền", + "user_status.offline": "Ngoại tuyến", + "user_status.online": "Trực tuyến", + "user_status.title": "Trạng thái", + "user.edit_profile.email.web_client": "Email phải được cập nhật bằng ứng dụng web hoặc ứng dụng dành cho máy tính để bàn.", + "user.edit_profile.profile_photo.change_photo": "Thay đổi ảnh hồ sơ", + "user.tutorial.long_press": "Nhấn và giữ một mục để xem hồ sơ của người dùng", + "video.download": "Tải video", + "video.download_description": "Video này phải được tải xuống để phát nó.", + "video.failed_description": "Đã xảy ra lỗi khi cố gắng phát video.", + "your.servers": "Máy chủ của bạn", + "mobile.post_pre_header.saved": "Đã lưu", + "servers.default": "Máy chủ mặc định", + "terms_of_service.error.description": "Không thể lấy Điều khoản dịch vụ từ Máy chủ.", + "invite.searchPlaceholder": "Nhập tên hoặc địa chỉ email…", + "notification_settings.auto_responder.default_message": "Xin chào, tôi không có mặt ở văn phòng và không thể trả lời tin nhắn.", + "servers.edit": "Sửa", + "settings_display.clock.mz": "Đồng hồ 24 giờ", + "notification_settings.email.emailHelp2": "Email đã bị vô hiệu hóa bởi Quản trị viên Hệ thống của bạn. Sẽ không có email thông báo nào được gửi cho đến khi nó được bật.", + "settings_display.crt.desc": "Khi được bật, các tin nhắn trả lời sẽ không hiển thị trong kênh và bạn sẽ được thông báo về các chủ đề bạn đang theo dõi trong chế độ xem \"Chủ đề\".", + "invite.send_error": "Đã xảy ra lỗi khi cố gắng gửi lời mời. Vui lòng kiểm tra kết nối mạng của bạn và thử lại.", + "notification_settings.mentions.keywordsLabel": "Từ khóa không phân biệt chữ hoa chữ thường. Tách các từ khóa bằng dấu phẩy.", + "settings.about.copyright": "Copyright 2015-{currentYear} Mattermost, Inc. All rights reserved", + "notification_settings.mentions.sensitiveName": "Tên phân biệt chữ hoa chữ thường của bạn", + "invite.summary.some_not_sent": "{notSentCount, plural, one {lời mời} other {lời mời}} đã không được gửi", + "notification_settings.mobile.trigger_push": "Kích hoạt thông báo đẩy khi...", + "terms_of_service.terms_declined.text": "Bạn phải chấp nhận các điều khoản dịch vụ để truy cập máy chủ này. Vui lòng liên hệ với quản trị viên hệ thống của bạn để biết thêm chi tiết. Bây giờ bạn sẽ được đăng xuất. Đăng nhập lại để chấp nhận các điều khoản dịch vụ.", + "notification_settings.pushNotification.disabled_long": "Thông báo đẩy cho thiết bị di động đã bị Quản trị viên Hệ thống của bạn tắt.", + "user.edit_profile.email.auth_service": "Đăng nhập xảy ra thông qua {service}. Không thể cập nhật email. Địa chỉ email được sử dụng để nhận thông báo là {email}.", + "notification_settings.pushNotification.mentions_only": "Chỉ đề cập, tin nhắn trực tiếp (mặc định)", + "notification_settings.send_notification.about": "Thông báo cho tôi về...", + "notification.no_connection": "Không thể truy cập máy chủ và không thể truy xuất tin nhắn cụ thể cho thông báo.", + "onboarding.calls_description": "Khi gõ không đủ nhanh, hãy chuyển từ trò chuyện dựa trên kênh sang cuộc gọi âm thanh bảo mật chỉ bằng một lần nhấn.", + "onboarding.integrations_description": "Vượt ra ngoài cuộc trò chuyện với các giải pháp sản phẩm được tích hợp chặt chẽ phù hợp với các quy trình phát triển chung." } From 2629fcde3138ca4603aae42ac1ee122828d431c5 Mon Sep 17 00:00:00 2001 From: linkvn Date: Fri, 21 Jul 2023 08:14:47 +0000 Subject: [PATCH 007/126] Translated using Weblate (Vietnamese) Currently translated at 78.2% (831 of 1062 strings) Translation: mattermost-languages-shipped/mattermost-mobile-v2 Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/vi/ --- assets/base/i18n/vi.json | 49 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/assets/base/i18n/vi.json b/assets/base/i18n/vi.json index 6ad7ac287..442448a22 100644 --- a/assets/base/i18n/vi.json +++ b/assets/base/i18n/vi.json @@ -782,5 +782,52 @@ "notification_settings.send_notification.about": "Thông báo cho tôi về...", "notification.no_connection": "Không thể truy cập máy chủ và không thể truy xuất tin nhắn cụ thể cho thông báo.", "onboarding.calls_description": "Khi gõ không đủ nhanh, hãy chuyển từ trò chuyện dựa trên kênh sang cuộc gọi âm thanh bảo mật chỉ bằng một lần nhấn.", - "onboarding.integrations_description": "Vượt ra ngoài cuộc trò chuyện với các giải pháp sản phẩm được tích hợp chặt chẽ phù hợp với các quy trình phát triển chung." + "onboarding.integrations_description": "Vượt ra ngoài cuộc trò chuyện với các giải pháp sản phẩm được tích hợp chặt chẽ phù hợp với các quy trình phát triển chung.", + "join_team.error.title": "Lỗi khi tham gia một nhóm", + "load_categories_error.message": "Đã xảy ra sự cố khi tải nội dung cho máy chủ này.", + "load_categories_error.title": "Không thể tải danh mục cho {serverName}", + "load_channels_error.message": "Đã xảy ra sự cố khi tải nội dung cho nhóm này.", + "load_channels_error.title": "Không thể tải {teamDisplayName}", + "load_teams_error.message": "Đã xảy ra sự cố khi tải nội dung cho máy chủ này.", + "load_teams_error.title": "Không thể tải {serverName}", + "login.invalid_credentials": "Kết hợp email và mật khẩu không chính xác", + "login.signingIn": "Đang đăng nhập", + "markdown.latex.error": "Lỗi kết xuất latex", + "mentions.empty.paragraph": "Bạn sẽ thấy các thông báo ở đây khi ai đó đề cập đến bạn hoặc sử dụng các cụm từ mà bạn đang theo dõi.", + "mentions.empty.title": "Chưa có đề cập nào", + "mobile.acknowledgements.header": "Báo nhận", + "mobile.add_team.create_team": "Tạo một nhóm mới", + "mobile.add_team.join_team": "Tham gia nhóm khác", + "mobile.calls_audio_device": "Chọn thiết bị âm thanh", + "mobile.calls_bluetooth": "Bluetooth", + "mobile.calls_call_ended": "Cuộc gọi kết thúc", + "mobile.calls_call_screen": "Gọi", + "mobile.calls_call_thread": "Chủ đề cuộc gọi", + "mobile.calls_current_call": "Cuộc gọi hiện tại", + "mobile.calls_disable": "Tắt chức năng cuộc gọi", + "mobile.calls_dismiss": "Bỏ qua", + "mobile.calls_enable": "Bật cuộc gọi", + "mobile.calls_end_call_title": "Kết thúc cuộc gọi", + "mobile.calls_end_msg_channel_default": "Bạn có chắc chắn muốn kết thúc cuộc gọi?", + "mobile.calls_end_msg_dm": "Bạn có chắc chắn muốn kết thúc cuộc gọi bằng {displayName} không?", + "mobile.calls_end_permission_title": "Lỗi", + "mobile.calls_ended_at": "Kết thúc lúc", + "mobile.calls_error_message": "Lỗi : {error}", + "mobile.calls_error_title": "Lỗi", + "mobile.calls_host": "host", + "mobile.calls_host_rec": "Bạn đang ghi lại cuộc họp này. Cân nhắc cho mọi người biết rằng cuộc họp này đang được ghi lại.", + "mobile.calls_host_rec_error": "Hãy thử ghi lại. Bạn cũng có thể liên hệ với quản trị viên hệ thống của mình để được trợ giúp khắc phục sự cố.", + "mobile.calls_host_rec_error_title": "Đã xảy ra sự cố với bản ghi", + "mobile.calls_host_rec_stopped": "Bạn có thể tìm thấy bản ghi trong chuỗi trò chuyện của cuộc gọi này sau khi quá trình xử lý hoàn tất.", + "mobile.calls_host_rec_stopped_title": "Quá trình ghi đã dừng. Xử lý...", + "mobile.calls_host_rec_title": "Bạn đang ghi âm", + "mobile.calls_join_call": "Tham gia cuộc gọi", + "mobile.calls_lasted": "Kéo dài {duration}", + "mobile.calls_leave": "Rời", + "mobile.calls_leave_call": "Rời khỏi cuộc gọi", + "mobile.calls_limit_msg": "Số người tham gia tối đa cho mỗi cuộc gọi là {maxParticipants}. Liên hệ với Quản trị viên hệ thống của bạn để tăng giới hạn.", + "mobile.calls_limit_msg_GA": "Nâng cấp lên Cloud Professional hoặc Cloud Enterprise để kích hoạt cuộc gọi nhóm với hơn {maxParticipants} người tham gia.", + "mobile.calls_limit_reached": "Đã đạt đến giới hạn người tham gia", + "mobile.calls_end_msg_channel": "Bạn có chắc chắn muốn kết thúc cuộc gọi với {numParticipants} người tham gia trong {displayName} không?", + "mobile.calls_end_permission_msg": "Bạn không có quyền kết thúc cuộc gọi. Vui lòng yêu cầu người tạo cuộc gọi kết thúc cuộc gọi." } From ec97ccf19b0b22282ab19ab0532800b16baec170 Mon Sep 17 00:00:00 2001 From: kaakaa Date: Sun, 23 Jul 2023 02:44:49 +0000 Subject: [PATCH 008/126] Translated using Weblate (Japanese) Currently translated at 100.0% (1062 of 1062 strings) Translation: mattermost-languages-shipped/mattermost-mobile-v2 Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/ --- assets/base/i18n/ja.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/base/i18n/ja.json b/assets/base/i18n/ja.json index 15ed4e7c1..626574e6a 100644 --- a/assets/base/i18n/ja.json +++ b/assets/base/i18n/ja.json @@ -1053,9 +1053,9 @@ "persistent_notifications.error.max_recipients.title": "受信者が多すぎです", "persistent_notifications.error.no_mentions.description": "メッセージ内でメンションされている受信者がいません。永続的な通知を送信するためには、メンションを追加する必要があります。", "post_priority.picker.label.persistent_notifications": "永続的な通知を送信する", - "post_priority.picker.label.persistent_notifications.description": "受信者が確認処理または返信するまで、5分ごとに通知されます。", + "post_priority.picker.label.persistent_notifications.description": "受信者が確認処理または返信するまで、{interval, plural, one {1分} other {{interval} 分}}ごとに通知されます。", "post_priority.picker.label.request_ack": "確認を要求する", - "post_priority.picker.label.request_ack.description": "受信者が確認処理または返信するまで、5分ごとに通知されます。", + "post_priority.picker.label.request_ack.description": "メッセージに確認ボタンが表示されます", "mobile.calls_phone": "Phone", "share_extension.channels_screen.title": "チャンネルを選択", "share_extension.error_screen.description": "{applicationName} にコンテンツを共有する際にエラーが発生しました。", From 612e6b0fe4a7df8681dfb76278d4ecff5706b7fe Mon Sep 17 00:00:00 2001 From: Tom De Moor Date: Sun, 23 Jul 2023 19:15:28 +0000 Subject: [PATCH 009/126] Translated using Weblate (Dutch) Currently translated at 100.0% (1062 of 1062 strings) Translation: mattermost-languages-shipped/mattermost-mobile-v2 Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/ --- assets/base/i18n/nl.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/base/i18n/nl.json b/assets/base/i18n/nl.json index 776ac1197..dd69ff966 100644 --- a/assets/base/i18n/nl.json +++ b/assets/base/i18n/nl.json @@ -1057,5 +1057,8 @@ "mobile.calls_raised_hand": "{name} {num, plural, =0 {stak} other {+# meer staken }} een handje op", "mobile.calls_quality_warning": "De gesprekskwaliteit kan slechter zijn door onstabiele netwerkomstandigheden.", "mobile.calls_name_is_talking_postfix": "spreekt…", - "share_extension.channels_screen.title": "Kanaal selecteren" + "share_extension.channels_screen.title": "Kanaal selecteren", + "share_extension.error_screen.label": "Er is een fout opgetreden", + "share_extension.error_screen.reason": "Reden: {reason}", + "share_extension.error_screen.description": "Er is een fout opgetreden toen werd geprobeerd de inhoud te delen naar {applicationName}." } From aeba5ed6d27e84f16eb963fc9b88f3bdbc3c7bfd Mon Sep 17 00:00:00 2001 From: linkvn Date: Mon, 24 Jul 2023 07:56:27 +0000 Subject: [PATCH 010/126] Translated using Weblate (Vietnamese) Currently translated at 88.6% (941 of 1062 strings) Translation: mattermost-languages-shipped/mattermost-mobile-v2 Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/vi/ --- assets/base/i18n/vi.json | 112 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/assets/base/i18n/vi.json b/assets/base/i18n/vi.json index 442448a22..2063ea613 100644 --- a/assets/base/i18n/vi.json +++ b/assets/base/i18n/vi.json @@ -829,5 +829,115 @@ "mobile.calls_limit_msg_GA": "Nâng cấp lên Cloud Professional hoặc Cloud Enterprise để kích hoạt cuộc gọi nhóm với hơn {maxParticipants} người tham gia.", "mobile.calls_limit_reached": "Đã đạt đến giới hạn người tham gia", "mobile.calls_end_msg_channel": "Bạn có chắc chắn muốn kết thúc cuộc gọi với {numParticipants} người tham gia trong {displayName} không?", - "mobile.calls_end_permission_msg": "Bạn không có quyền kết thúc cuộc gọi. Vui lòng yêu cầu người tạo cuộc gọi kết thúc cuộc gọi." + "mobile.calls_end_permission_msg": "Bạn không có quyền kết thúc cuộc gọi. Vui lòng yêu cầu người tạo cuộc gọi kết thúc cuộc gọi.", + "mobile.ios.plist.NSMicrophoneUsageDescription": "Cho phép truy cập vào micrô của thiết bị có nghĩa là bạn có thể ghi lại âm thanh cho cuộc gọi hoặc video để chia sẻ trong {applicationName}.", + "mobile.ios.plist.NSPhotoLibraryAddUsageDescription": "Bật quyền truy cập ghi vào thư viện ảnh của bạn nghĩa là bạn có thể lưu ảnh và video đã tải xuống từ {applicationName} vào thiết bị của mình.", + "mobile.ios.plist.NSPhotoLibraryUsageDescription": "Cho phép quyền truy cập đọc vào thư viện ảnh của bạn có nghĩa là bạn có thể tải ảnh và video từ thiết bị của mình lên {applicationName}.", + "mobile.ios.plist.NSSpeechRecognitionUsageDescription": "Cho phép thiết bị của bạn gửi dữ liệu người dùng tới Apple nghĩa là bạn có thể gửi tin nhắn thoại tới {applicationName}.", + "mobile.leave_and_join_confirmation": "Rời khỏi & Tham gia", + "mobile.leave_and_join_message": "Bạn đã tham gia cuộc gọi kênh trong ~{leaveChannelName}. Bạn có muốn rời khỏi cuộc gọi hiện tại của mình và tham gia cuộc gọi trong ~{joinChannelName} không?", + "mobile.leave_and_join_title": "Bạn có chắc chắn muốn chuyển sang cuộc gọi khác không?", + "mobile.login_options.cant_heading": "Không thể đăng nhập", + "mobile.login_options.enter_credentials": "Nhập thông tin đăng nhập của bạn dưới đây.", + "mobile.login_options.gitlab": "GitLab", + "mobile.login_options.google": "Google", + "mobile.login_options.heading": "Đăng nhập vào tài khoản của bạn", + "mobile.login_options.none": "Bạn chưa thể đăng nhập vào tài khoản của mình. Ít nhất một tùy chọn đăng nhập phải được cấu hình. Liên hệ với Quản trị viên hệ thống của bạn để được hỗ trợ.", + "mobile.login_options.office365": "Office 365", + "mobile.login_options.openid": "Open ID", + "mobile.login_options.saml": "SAML", + "mobile.login_options.select_option": "Chọn một tùy chọn đăng nhập bên dưới.", + "mobile.login_options.separator_text": "hoặc đăng nhập bằng", + "mobile.manage_members.admin": "Quản trị viên", + "mobile.manage_members.cancel": "Huỷ bỏ", + "mobile.manage_members.change_role.error": "Đã xảy ra lỗi khi cố cập nhật vai trò. Vui lòng kiểm tra kết nối của bạn và thử lại.", + "mobile.manage_members.done": "Hoàn tất", + "mobile.manage_members.make_channel_admin": "Làm Quản Trị Kênh", + "mobile.manage_members.make_channel_member": "Làm thành viên kênh", + "mobile.manage_members.manage": "Quản lý", + "mobile.manage_members.manage_member": "Quản lý thành viên", + "mobile.manage_members.member": "Thành viên", + "mobile.manage_members.message": "Bạn có chắc chắn muốn xóa thành viên đã chọn khỏi kênh không?", + "permalink.error.cancel": "Huỷ bỏ", + "permalink.error.okay": "Đồng ý", + "permalink.error.private_channel_and_team.button": "Tham gia kênh và nhóm", + "permalink.error.private_channel_and_team.text": "Thư bạn đang cố xem nằm trong một kênh riêng tư trong nhóm mà bạn không phải là thành viên. Bạn có quyền truy cập với tư cách quản trị viên. Bạn có muốn tham gia **{channelName}** và nhóm **{teamName}** để xem không?", + "permalink.error.private_channel_and_team.title": "Tham gia kênh và nhóm riêng", + "permalink.error.private_channel.button": "Tham gia kênh", + "permalink.error.private_channel.text": "Thư bạn đang cố xem nằm trong một kênh riêng tư mà bạn chưa được mời nhưng bạn có quyền truy cập với tư cách quản trị viên. Bạn vẫn muốn tham gia **{channelName}** chứ?", + "permalink.error.private_channel.title": "Tham gia kênh riêng", + "permalink.error.public_channel_and_team.button": "Tham gia kênh và nhóm", + "permalink.error.public_channel_and_team.title": "Tham gia kênh và nhóm", + "permalink.error.public_channel.button": "Tham gia kênh", + "permalink.error.public_channel.text": "Tin nhắn bạn đang cố xem nằm trong một kênh mà bạn không thuộc về. Bạn có muốn tham gia **{channelName}** để xem không?", + "permalink.error.public_channel.title": "Tham gia kênh", + "persistent_notifications.confirm.cancel": "Hủy bỏ", + "persistent_notifications.confirm.description": "Những người nhận được @đề cập sẽ được thông báo mỗi {interval, plural, one {phút} other {{interval} phút}} cho đến khi họ xác nhận hoặc trả lời thư.", + "persistent_notifications.confirm.send": "Gửi", + "persistent_notifications.confirm.title": "Gửi thông báo liên tục", + "persistent_notifications.error.max_recipients.description": "Bạn có thể gửi thông báo liên tục tới tối đa {max} người nhận. Có {count} người nhận được đề cập trong tin nhắn của bạn. Bạn sẽ cần thay đổi người mà bạn đã đề cập trước khi có thể gửi.", + "persistent_notifications.error.max_recipients.title": "Quá nhiều người nhận", + "persistent_notifications.error.no_mentions.description": "Không có người nhận nào được đề cập trong tin nhắn của bạn. Bạn sẽ cần thêm đề cập để có thể gửi thông báo liên tục.", + "persistent_notifications.error.no_mentions.title": "Người nhận phải được @mentioned", + "persistent_notifications.error.okay": "Đồng ý", + "persistent_notifications.error.special_mentions": "Không thể sử dụng @channel, @all hoặc @here để đề cập đến người nhận thông báo liên tục.", + "pinned_messages.empty.paragraph": "Để ghim các tin nhắn quan trọng, hãy nhấn và giữ một tin nhắn và chọn Ghim vào kênh. Tin nhắn được ghim sẽ hiển thị với mọi người trong kênh này.", + "pinned_messages.empty.title": "Chưa có tin nhắn nào được ghim", + "plus_menu.browse_channels.title": "Duyệt kênh", + "plus_menu.create_new_channel.title": "Tạo Kênh Mới", + "plus_menu.invite_people_to_team.title": "Mời mọi người vào đội", + "plus_menu.open_direct_message.title": "Mở một tin nhắn trực tiếp", + "post_priority.label.important": "QUAN TRỌNG", + "post_priority.label.urgent": "CẤP BÁCH", + "post_priority.picker.beta": "THỬ NGHIỆM", + "post_priority.picker.label.important": "Quan trọng", + "post_priority.picker.label.persistent_notifications": "Gửi thông báo liên tục", + "post_priority.picker.label.persistent_notifications.description": "Người nhận được thông báo mỗi {interval, plural, one {phút} other {{interval} phút}} cho đến khi họ xác nhận hoặc trả lời.", + "post_priority.picker.label.request_ack": "Xác nhận yêu cầu", + "post_priority.picker.label.request_ack.description": "Một nút xác nhận sẽ xuất hiện với tin nhắn của bạn", + "post_priority.picker.label.standard": "Tiêu chuẩn", + "post_priority.picker.label.urgent": "Cấp bách", + "post_priority.picker.title": "Tin nhắn ưu tiên", + "post.options.title": "Lựa chọn", + "post.reactions.title": "Phản ứng", + "public_link_copied": "Liên kết được sao chép vào khay nhớ tạm", + "rate.button.needs_work": "Cần việc", + "rate.button.yes": "Yêu nó!", + "rate.dont_ask_again": "Đừng hỏi tôi nữa", + "rate.error.text": "Đã xảy ra lỗi khi mở phương thức đánh giá.", + "rate.error.title": "Lỗi", + "rate.title": "Bạn thích Mattermost chứ?", + "requested_ack.title": "Yêu cầu xác nhận", + "saved_messages.empty.title": "Chưa có tin nhắn nào được lưu", + "screen.channel_files.header.recent_files": "Tệp gần đây", + "screen.channel_files.results.filter.title": "Lọc theo loại tệp", + "screen.mentions.subtitle": "Tin nhắn bạn đã được đề cập trong", + "screen.mentions.title": "Đề cập gần đây", + "screen.saved_messages.subtitle": "Tất cả tin nhắn bạn đã lưu để theo dõi", + "screen.saved_messages.title": "Tin nhắn đã lưu", + "screen.search.header.files": "Tệp", + "screen.search.header.messages": "Tin nhắn", + "screen.search.modifier.header": "Tuỳ chọn tìm kiếm", + "screen.search.placeholder": "Tìm kiếm tin nhắn và tệp", + "screen.search.results.file_options.copy_link": "Sao chép liên kết", + "screen.search.results.file_options.download": "Tải xuống", + "screen.search.results.file_options.open_in_channel": "Mở trong kênh", + "screen.search.results.filter.all_file_types": "Tất cả các loại tệp", + "screen.search.results.filter.audio": "Âm thanh", + "screen.search.results.filter.code": "Mã", + "screen.search.results.filter.documents": "Tài liệu", + "screen.search.results.filter.images": "Ảnh", + "screen.search.results.filter.presentations": "Trình chiếu", + "screen.search.results.filter.spreadsheets": "Bảng biểu", + "screen.search.results.filter.title": "Lọc theo loại tệp", + "screen.search.results.filter.videos": "Video", + "screen.search.title": "Tìm kiếm", + "screens.channel_edit": "Sửa kênh", + "screens.channel_edit_header": "Sửa tiêu đề kênh", + "screens.channel_info": "Thông tin kênh", + "screens.channel_info.dm": "Thông tin chat trực tiếp", + "screens.channel_info.gm": "Thông tin tin nhắn nhóm", + "rate.subtitle": "Cho chúng tôi biết bạn nghĩ gì.", + "permalink.error.public_channel_and_team.text": "Thông báo bạn đang cố xem nằm trong một kênh mà bạn không thuộc về và một nhóm mà bạn không phải là thành viên. Bạn có muốn tham gia **{channelName}** và nhóm **{teamName}** để xem không?", + "saved_messages.empty.paragraph": "Để lưu nội dung nào đó để sử dụng sau này, hãy nhấn và giữ một tin nhắn và chọn Lưu từ menu. Tin nhắn đã lưu chỉ hiển thị với bạn." } From 722871d165de9fe1e8208a9a42fadd109fd5eefc Mon Sep 17 00:00:00 2001 From: Lucas Reis Date: Tue, 25 Jul 2023 05:11:37 -0300 Subject: [PATCH 011/126] [MM-48225] Reduce Padding/Margins from Files Tab and moving the Search Results to the FlatList (#7430) * feat: reducing the padding/margins of tabs and filter icons on the Search Page * feat: adds the results text inside the post_results and file_results * feat: changes search results to use translation * feat: updates text on search results to use FormattedText * feat: removing text wrapper * feat: removing margins and using an ItemSeparator to separate the rows of the file results * feat: refactor spacing on post results and unnecessary top * review: externalizing Separator on the file_results * feat: add marginTop in all File components used inside the component --- app/components/files/file.tsx | 1 - app/components/files/files.tsx | 5 +- app/components/files_search/file_results.tsx | 28 ++++++++- app/screens/home/search/results/header.tsx | 62 +++++++++---------- .../home/search/results/header_button.tsx | 2 +- .../home/search/results/post_results.tsx | 27 +++++++- app/screens/home/search/results/results.tsx | 4 +- app/screens/home/search/search.tsx | 2 - app/screens/home/search/team_picker_icon.tsx | 2 +- assets/base/i18n/en.json | 3 +- 10 files changed, 90 insertions(+), 46 deletions(-) diff --git a/app/components/files/file.tsx b/app/components/files/file.tsx index 426228602..1041439fa 100644 --- a/app/components/files/file.tsx +++ b/app/components/files/file.tsx @@ -44,7 +44,6 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => { flex: 1, flexDirection: 'row', alignItems: 'center', - marginTop: 10, borderWidth: 1, borderColor: changeOpacity(theme.centerChannelColor, 0.24), borderRadius: 4, diff --git a/app/components/files/files.tsx b/app/components/files/files.tsx index 683f1cf81..3747fea43 100644 --- a/app/components/files/files.tsx +++ b/app/components/files/files.tsx @@ -43,6 +43,9 @@ const styles = StyleSheet.create({ failed: { opacity: 0.5, }, + marginTop: { + marginTop: 10, + }, }); const Files = ({canDownloadFiles, failed, filesInfo, isReplyPost, layoutWidth, location, postId, publicLinkEnabled}: FilesProps) => { @@ -86,7 +89,7 @@ const Files = ({canDownloadFiles, failed, filesInfo, isReplyPost, layoutWidth, l } return ( ({ + resultsNumber: { + ...typography('Heading', 300), + padding: 20, + color: theme.centerChannelColor, + }, +})); + type Props = { canDownloadFiles: boolean; fileChannels: ChannelModel[]; @@ -41,6 +52,9 @@ type Props = { const galleryIdentifier = 'search-files-location'; +const separatorStyle = {height: 10}; +const Separator = () => ; + const FileResults = ({ canDownloadFiles, fileChannels, @@ -52,13 +66,14 @@ const FileResults = ({ isFilterEnabled, }: Props) => { const theme = useTheme(); + const styles = getStyles(theme); const insets = useSafeAreaInsets(); const isTablet = useIsTablet(); const [action, setAction] = useState('none'); const [lastViewedFileInfo, setLastViewedFileInfo] = useState(undefined); - const containerStyle = useMemo(() => ([paddingTop, {top: fileInfos.length ? 8 : 0, flexGrow: 1}]), [fileInfos, paddingTop]); + const containerStyle = useMemo(() => ([paddingTop, {flexGrow: 1}]), [paddingTop]); const numOptions = getNumberFileMenuOptions(canDownloadFiles, publicLinkEnabled); const {images: imageAttachments, nonImages: nonImageAttachments} = useImageAttachments(fileInfos, publicLinkEnabled); @@ -141,6 +156,15 @@ const FileResults = ({ return ( <> + } + ItemSeparatorComponent={Separator} ListEmptyComponent={noResults} contentContainerStyle={containerStyle} data={orderedFileInfos} diff --git a/app/screens/home/search/results/header.tsx b/app/screens/home/search/results/header.tsx index 7ffc5ea0e..35f1fad35 100644 --- a/app/screens/home/search/results/header.tsx +++ b/app/screens/home/search/results/header.tsx @@ -27,8 +27,6 @@ type Props = { onFilterChanged: (filter: FileFilter) => void; selectedTab: TabType; selectedFilter: FileFilter; - numberMessages: number; - numberFiles: number; setTeamId: (id: string) => void; teamId: string; teams: TeamModel[]; @@ -65,8 +63,6 @@ const Header = ({ setTeamId, onTabSelect, onFilterChanged, - numberMessages, - numberFiles, selectedTab, selectedFilter, teams, @@ -122,7 +118,7 @@ const Header = ({ }); }, [onFilterChanged, selectedFilter]); - const filterStyle = useMemo(() => ({marginRight: teams.length > 1 ? 0 : 10}), [teams.length > 1]); + const filterStyle = useMemo(() => ({marginRight: teams.length > 1 ? 0 : 8}), [teams.length > 1]); return ( @@ -130,39 +126,42 @@ const Header = ({ - {showFilterIcon && - - + + + + )} + {teams.length > 1 && ( + - - - } - {teams.length > 1 && - - } + )} @@ -170,4 +169,3 @@ const Header = ({ }; export default Header; - diff --git a/app/screens/home/search/results/header_button.tsx b/app/screens/home/search/results/header_button.tsx index 3a0d7704b..e4632bb9c 100644 --- a/app/screens/home/search/results/header_button.tsx +++ b/app/screens/home/search/results/header_button.tsx @@ -16,7 +16,7 @@ const getStyleFromTheme = makeStyleSheetFromTheme((theme) => { borderRadius: 4, }, text: { - paddingHorizontal: 16, + paddingHorizontal: 12, paddingVertical: 8, ...typography('Body', 200, 'SemiBold'), }, diff --git a/app/screens/home/search/results/post_results.tsx b/app/screens/home/search/results/post_results.tsx index 5e63894cf..a98125878 100644 --- a/app/screens/home/search/results/post_results.tsx +++ b/app/screens/home/search/results/post_results.tsx @@ -4,18 +4,30 @@ import React, {useCallback, useMemo} from 'react'; import {FlatList, type ListRenderItemInfo, type StyleProp, type ViewStyle} from 'react-native'; +import FormattedText from '@components/formatted_text'; import NoResultsWithTerm from '@components/no_results_with_term'; import DateSeparator from '@components/post_list/date_separator'; import PostWithChannelInfo from '@components/post_with_channel_info'; import {Screens} from '@constants'; +import {useTheme} from '@context/theme'; import {convertSearchTermToRegex, parseSearchTerms} from '@utils/markdown'; import {getDateForDateLine, selectOrderedPosts} from '@utils/post_list'; import {TabTypes} from '@utils/search'; +import {makeStyleSheetFromTheme} from '@utils/theme'; +import {typography} from '@utils/typography'; import type {PostListItem, PostListOtherItem} from '@typings/components/post_list'; import type PostModel from '@typings/database/models/servers/post'; import type {SearchPattern} from '@typings/global/markdown'; +const getStyles = makeStyleSheetFromTheme((theme: Theme) => ({ + resultsNumber: { + ...typography('Heading', 300), + padding: 20, + color: theme.centerChannelColor, + }, +})); + type Props = { appsEnabled: boolean; customEmojiNames: string[]; @@ -37,8 +49,10 @@ const PostResults = ({ paddingTop, searchValue, }: Props) => { + const theme = useTheme(); + const styles = getStyles(theme); const orderedPosts = useMemo(() => selectOrderedPosts(posts, 0, false, '', '', false, isTimezoneEnabled, currentTimezone, false).reverse(), [posts]); - const containerStyle = useMemo(() => ({top: posts.length ? 4 : 8, flexGrow: 1}), [posts]); + const containerStyle = useMemo(() => ([paddingTop, {flexGrow: 1}]), [paddingTop]); const renderItem = useCallback(({item}: ListRenderItemInfo) => { switch (item.type) { @@ -88,8 +102,16 @@ const PostResults = ({ return ( + } ListEmptyComponent={noResults} - contentContainerStyle={[paddingTop, containerStyle]} + contentContainerStyle={containerStyle} data={orderedPosts} indicatorStyle='black' initialNumToRender={5} @@ -104,7 +126,6 @@ const PostResults = ({ scrollEventThrottle={16} scrollToOverflowEnabled={true} showsVerticalScrollIndicator={true} - style={containerStyle} testID='search_results.post_list.flat_list' /> ); diff --git a/app/screens/home/search/results/results.tsx b/app/screens/home/search/results/results.tsx index a54343beb..4fca6b035 100644 --- a/app/screens/home/search/results/results.tsx +++ b/app/screens/home/search/results/results.tsx @@ -100,7 +100,7 @@ const Results = ({ } {!loading && - + - + { setTeamId={handleResultsTeamChange} onTabSelect={setSelectedTab} onFilterChanged={handleFilterChange} - numberMessages={posts.length} selectedTab={selectedTab} - numberFiles={fileInfos.length} selectedFilter={filter} teams={teams} /> diff --git a/app/screens/home/search/team_picker_icon.tsx b/app/screens/home/search/team_picker_icon.tsx index 9a9fa52e9..6b49790e0 100644 --- a/app/screens/home/search/team_picker_icon.tsx +++ b/app/screens/home/search/team_picker_icon.tsx @@ -28,7 +28,7 @@ const NO_TEAMS_HEIGHT = 392; const getStyleFromTheme = makeStyleSheetFromTheme((theme) => { return { teamContainer: { - paddingLeft: 12, + paddingLeft: 8, flexDirection: 'row', alignItems: 'center', }, diff --git a/assets/base/i18n/en.json b/assets/base/i18n/en.json index 2d9176aee..720e55081 100644 --- a/assets/base/i18n/en.json +++ b/assets/base/i18n/en.json @@ -681,6 +681,7 @@ "mobile.search.show_less": "Show less", "mobile.search.show_more": "Show more", "mobile.search.team.select": "Select a team to search", + "mobile.search.results": "{count} search {count, plural, one {result} other {results}}", "mobile.server_identifier.exists": "You are already connected to this server.", "mobile.server_link.error.text": "The link could not be found on this server.", "mobile.server_link.error.title": "Link Error", @@ -1061,4 +1062,4 @@ "video.download_description": "This video must be downloaded to play it.", "video.failed_description": "An error occurred while trying to play the video.", "your.servers": "Your servers" -} +} \ No newline at end of file From 871e3964eadb7c7cfc2c68d1167a52988b623666 Mon Sep 17 00:00:00 2001 From: Harshal sanghvi Date: Tue, 25 Jul 2023 13:54:55 +0530 Subject: [PATCH 012/126] Added status on profile picture in bottom tab (#7464) * added last viewed feature * added constants * storing data in global table and added server col * fixed stack screen" * fixed values for crt * fixed threadid store logic * added status on profile in bottom tabs --- app/screens/home/tab_bar/account.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/screens/home/tab_bar/account.tsx b/app/screens/home/tab_bar/account.tsx index ba4595297..1b27852fc 100644 --- a/app/screens/home/tab_bar/account.tsx +++ b/app/screens/home/tab_bar/account.tsx @@ -34,7 +34,7 @@ const Account = ({currentUser, isFocused, theme}: Props) => { From 37b245d461958ced261210506a5301fa697ee205 Mon Sep 17 00:00:00 2001 From: Sudhanva-Nadiger <93595710+Sudhanva-Nadiger@users.noreply.github.com> Date: Wed, 26 Jul 2023 18:30:06 +0530 Subject: [PATCH 013/126] Feat: add copy to clipboard button in "about" mattermost page (#7134) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add copy to clip board button in about page * add intl format text * make suggested changes. - fix: wrap copyToClipBoard function in useCallBack - remove annonymous function onPress, provide function pointer - make code readable in copyToClipBoard function * formatting * small fix * change copy to clipboard position - created a custom button eith icon and text - usd button theme color * button styling * divider color * use predefined btn element * Add e2e test for copy info button * feat: refactor the styles for thin lines - fix: change touchable opacity to view - add margin top to footer text * change icon size to 15 * remove unnecessary view * add config to dependency of callback * suggeste changes on onClick func * modified en.json file after running i18-extract * Improve translations * Address feedback * Fix non updated default messages --------- Co-authored-by: Daniel Espino García --- app/screens/settings/about/about.tsx | 89 ++++++++++++++++++---------- assets/base/i18n/en.json | 17 ++++-- detox/e2e/support/ui/screen/about.ts | 2 + detox/e2e/test/account/about.e2e.ts | 2 + 4 files changed, 73 insertions(+), 37 deletions(-) diff --git a/app/screens/settings/about/about.tsx b/app/screens/settings/about/about.tsx index 6eb9d8579..964067e52 100644 --- a/app/screens/settings/about/about.tsx +++ b/app/screens/settings/about/about.tsx @@ -1,21 +1,23 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. +import Clipboard from '@react-native-clipboard/clipboard'; import React, {useCallback, useMemo} from 'react'; import {useIntl} from 'react-intl'; import {Alert, Text, View} from 'react-native'; import DeviceInfo from 'react-native-device-info'; import Config from '@assets/config.json'; +import Button from '@components/button'; import CompassIcon from '@components/compass_icon'; import FormattedText from '@components/formatted_text'; import SettingContainer from '@components/settings/container'; -import SettingSeparator from '@components/settings/separator'; import AboutLinks from '@constants/about_links'; import {useTheme} from '@context/theme'; import useAndroidHardwareBackHandler from '@hooks/android_back_handler'; import {t} from '@i18n'; import {popTopScreen} from '@screens/navigation'; +import {buttonBackgroundStyle, buttonTextStyle} from '@utils/buttonStyles'; import {preventDoubleTap} from '@utils/tap'; import {changeOpacity, makeStyleSheetFromTheme} from '@utils/theme'; import {typography} from '@utils/typography'; @@ -80,7 +82,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => { footerText: { color: changeOpacity(theme.centerChannelColor, 0.64), ...typography('Body', 50), - marginBottom: 10, + marginVertical: 10, }, copyrightText: { marginBottom: 0, @@ -92,6 +94,17 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => { group: { flexDirection: 'row', }, + copyInfoButtonContainer: { + width: 120, + marginTop: 10, + position: 'relative', + }, + thinLine: { + height: 0.2, + backgroundColor: changeOpacity(theme.centerChannelColor, 0.2), + alignSelf: 'stretch', + marginVertical: 20, + }, }; }); @@ -146,31 +159,31 @@ const About = ({componentId, config, license}: AboutProps) => { const buildNumber = config.BuildNumber; const version = config.Version; - let id = t('settings.about.server.version.value'); - let defaultMessage = '{version} (Build {number})'; - let values: {version: string; number?: string} = { - version, - number: buildNumber, - }; - if (buildNumber === version) { - id = t('settings.about.serverVersionNoBuild'); - defaultMessage = '{version}'; - values = { - version, - number: undefined, - }; + return version; } - return { - id, defaultMessage, values, - }; - }, [config]); + return intl.formatMessage({id: 'settings.about.server.version.value', defaultMessage: '{version} (Build {buildNumber})'}, {version, buildNumber}); + }, [config, intl]); useAndroidHardwareBackHandler(componentId, () => { popTopScreen(componentId); }); + const copyToClipboard = useCallback( + () => { + const appVersion = intl.formatMessage({id: 'settings.about.app.version', defaultMessage: 'App Version: {version} (Build {number})'}, {version: DeviceInfo.getVersion(), number: DeviceInfo.getBuildNumber()}); + const buildNumber = config.BuildNumber; + const version = config.Version; + const server = buildNumber === version ? intl.formatMessage({id: 'settings.about.server.version.noBuild', defaultMessage: 'Server Version: {version}'}, {version}) : intl.formatMessage({id: 'settings.about.server.version', defaultMessage: 'Server Version: {version} (Build {buildNumber})'}, {version, buildNumber}); + const database = intl.formatMessage({id: 'settings.about.database', defaultMessage: 'Database: {driverName}'}, {driverName: config.SQLDriverName}); + const databaseSchemaVersion = intl.formatMessage({id: 'settings.about.database.schema', defaultMessage: 'Database Schema Version: {version}'}, {version: config.SchemaVersion}); + const copiedString = `${appVersion}\n${server}\n${database}\n${databaseSchemaVersion}`; + Clipboard.setString(copiedString); + }, + [intl, config], + ); + return ( @@ -185,21 +198,24 @@ const About = ({componentId, config, license}: AboutProps) => { license={license} /> - + + - {intl.formatMessage({id: 'settings.about.version', defaultMessage: 'App Version:'})} + {intl.formatMessage({id: 'settings.about.app.version.title', defaultMessage: 'App Version:'})} - {intl.formatMessage({id: 'settings.about.build', defaultMessage: '{version} (Build {number})'}, + {intl.formatMessage({id: 'settings.about.app.version.value', defaultMessage: '{version} (Build {number})'}, {version: DeviceInfo.getVersion(), number: DeviceInfo.getBuildNumber()})} @@ -208,13 +224,13 @@ const About = ({componentId, config, license}: AboutProps) => { style={styles.leftHeading} testID='about.server_version.title' > - {intl.formatMessage({id: 'settings.about.server.version.desc', defaultMessage: 'Server Version:'})} + {intl.formatMessage({id: 'settings.about.server.version.title', defaultMessage: 'Server Version:'})} - {intl.formatMessage({id: serverVersion.id, defaultMessage: serverVersion.defaultMessage}, serverVersion.values)} + {serverVersion} @@ -222,13 +238,13 @@ const About = ({componentId, config, license}: AboutProps) => { style={styles.leftHeading} testID='about.database.title' > - {intl.formatMessage({id: 'settings.about.database', defaultMessage: 'Database:'})} + {intl.formatMessage({id: 'settings.about.database.title', defaultMessage: 'Database:'})} - {intl.formatMessage({id: 'settings.about.database.value', defaultMessage: `${config.SQLDriverName}`})} + {config.SQLDriverName} @@ -236,18 +252,26 @@ const About = ({componentId, config, license}: AboutProps) => { style={styles.leftHeading} testID='about.database_schema_version.title' > - {intl.formatMessage({id: 'settings.about.database.schema', defaultMessage: 'Database Schema Version:'})} + {intl.formatMessage({id: 'settings.about.database.schema.title', defaultMessage: 'Database Schema Version:'})} - {intl.formatMessage({ - id: 'settings.about.database.schema.value', - defaultMessage: `${config.SchemaVersion}`, - })} + {config.SchemaVersion} +