From 19360e6ee5c544ae82bf9b9914c66f2f544007a1 Mon Sep 17 00:00:00 2001 From: Gleidson Daniel Silva Date: Tue, 18 Apr 2023 09:46:53 -0300 Subject: [PATCH 1/2] Revert "fix: scroll the pages New Message, Search for Rooms, Messages and Threads (#4952)" (#5038) * Revert "fix: scroll the pages New Message, Search for Rooms, Messages and Threads (#4952)" This reverts commit cf14ebea78ac5c1d52b31dca9c2585c599811e98. * bump version to 4.37.1 --- android/app/build.gradle | 2 +- app/containers/KeyboardView.tsx | 2 +- app/views/NewMessageView/index.tsx | 47 ++++++++++------------ app/views/RoomsListView/index.tsx | 23 +++++------ app/views/SearchMessagesView/index.tsx | 27 ++++++------- app/views/ThreadMessagesView/index.tsx | 23 +++++------ ios/RocketChatRN.xcodeproj/project.pbxproj | 4 +- ios/RocketChatRN/Info.plist | 2 +- ios/ShareRocketChatRN/Info.plist | 2 +- package.json | 2 +- 10 files changed, 61 insertions(+), 73 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index c4244912c..28962cfff 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -147,7 +147,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode VERSIONCODE as Integer - versionName "4.38.0" + versionName "4.37.1" vectorDrawables.useSupportLibrary = true if (!isFoss) { manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] diff --git a/app/containers/KeyboardView.tsx b/app/containers/KeyboardView.tsx index 8bfd8ce93..99df6f923 100644 --- a/app/containers/KeyboardView.tsx +++ b/app/containers/KeyboardView.tsx @@ -6,7 +6,7 @@ import scrollPersistTaps from '../lib/methods/helpers/scrollPersistTaps'; interface IKeyboardViewProps extends KeyboardAwareScrollViewProps { keyboardVerticalOffset?: number; scrollEnabled?: boolean; - children: React.ReactElement[] | React.ReactElement | null | (React.ReactElement | null)[]; + children: React.ReactElement[] | React.ReactElement; } const KeyboardView = ({ style, contentContainerStyle, scrollEnabled, keyboardVerticalOffset, children }: IKeyboardViewProps) => ( diff --git a/app/views/NewMessageView/index.tsx b/app/views/NewMessageView/index.tsx index 6e91d3ae2..f393a9f91 100644 --- a/app/views/NewMessageView/index.tsx +++ b/app/views/NewMessageView/index.tsx @@ -5,7 +5,6 @@ import { FlatList } from 'react-native'; import { shallowEqual } from 'react-redux'; import { useNavigation } from '@react-navigation/native'; -import KeyboardView from '../../containers/KeyboardView'; import * as HeaderButton from '../../containers/HeaderButton'; import * as List from '../../containers/List'; import SafeAreaView from '../../containers/SafeAreaView'; @@ -83,31 +82,29 @@ const NewMessageView = () => { return ( - - - 0 ? search : chats} - keyExtractor={item => item._id || item.rid} - ListHeaderComponent={} - renderItem={({ item }) => { - const itemSearch = item as ISearch; - const itemModel = item as TSubscriptionModel; + + 0 ? search : chats} + keyExtractor={item => item._id || item.rid} + ListHeaderComponent={} + renderItem={({ item }) => { + const itemSearch = item as ISearch; + const itemModel = item as TSubscriptionModel; - return ( - goRoom(itemModel)} - testID={`new-message-view-item-${item.name}`} - /> - ); - }} - ItemSeparatorComponent={List.Separator} - ListFooterComponent={List.Separator} - contentContainerStyle={{ backgroundColor: colors.backgroundColor }} - keyboardShouldPersistTaps='always' - /> - + return ( + goRoom(itemModel)} + testID={`new-message-view-item-${item.name}`} + /> + ); + }} + ItemSeparatorComponent={List.Separator} + ListFooterComponent={List.Separator} + contentContainerStyle={{ backgroundColor: colors.backgroundColor }} + keyboardShouldPersistTaps='always' + /> ); }; diff --git a/app/views/RoomsListView/index.tsx b/app/views/RoomsListView/index.tsx index a40aaadcb..a204364b3 100644 --- a/app/views/RoomsListView/index.tsx +++ b/app/views/RoomsListView/index.tsx @@ -11,7 +11,6 @@ import { Header } from '@react-navigation/elements'; import { CompositeNavigationProp, RouteProp } from '@react-navigation/native'; import { Dispatch } from 'redux'; -import KeyboardView from '../../containers/KeyboardView'; import database from '../../lib/database'; import RoomItem, { ROW_HEIGHT, ROW_HEIGHT_CONDENSED } from '../../containers/RoomItem'; import log, { logEvent, events } from '../../lib/methods/helpers/log'; @@ -63,8 +62,8 @@ import { E2E_BANNER_TYPE, DisplayMode, SortBy, MAX_SIDEBAR_WIDTH, themes } from import { Services } from '../../lib/services'; type TNavigation = CompositeNavigationProp< -StackNavigationProp, -CompositeNavigationProp, StackNavigationProp> + StackNavigationProp, + CompositeNavigationProp, StackNavigationProp> >; interface IRoomsListViewProps { @@ -480,11 +479,11 @@ class RoomsListView extends React.Component, - props: Readonly + | (( + prevState: Readonly, + props: Readonly ) => Pick | IRoomsListViewState | null) - | (Pick | IRoomsListViewState | null), + | (Pick | IRoomsListViewState | null), callback?: () => void ) => { if (this.animated) { @@ -908,7 +907,7 @@ class RoomsListView extends React.Component this.scroll = ref; + getScrollRef = (ref: FlatList) => (this.scroll = ref); renderListHeader = () => { const { searching } = this.state; @@ -1026,11 +1025,9 @@ class RoomsListView extends React.Component - - - {this.renderHeader()} - {this.renderScroll()} - + + {this.renderHeader()} + {this.renderScroll()} {/* TODO - this ts-ignore is here because the route props, on IBaseScreen*/} {/* @ts-ignore*/} {showServerDropdown ? : null} diff --git a/app/views/SearchMessagesView/index.tsx b/app/views/SearchMessagesView/index.tsx index 3bb5a97af..b83d07779 100644 --- a/app/views/SearchMessagesView/index.tsx +++ b/app/views/SearchMessagesView/index.tsx @@ -39,7 +39,6 @@ import { ICustomEmoji } from '../../definitions'; import { Services } from '../../lib/services'; -import KeyboardView from '../../containers/KeyboardView'; const QUERY_SIZE = 50; @@ -328,20 +327,18 @@ class SearchMessagesView extends React.Component - - - - - - - {this.renderList()} - + + + + + + {this.renderList()} ); } diff --git a/app/views/ThreadMessagesView/index.tsx b/app/views/ThreadMessagesView/index.tsx index 8cfbecb6a..2769b3302 100644 --- a/app/views/ThreadMessagesView/index.tsx +++ b/app/views/ThreadMessagesView/index.tsx @@ -35,7 +35,6 @@ import styles from './styles'; import { IApplicationState, IBaseScreen, IMessage, SubscriptionType, TSubscriptionModel, TThreadModel } from '../../definitions'; import { getUidDirectMessage, debounce, isIOS } from '../../lib/methods/helpers'; import { Services } from '../../lib/services'; -import KeyboardView from '../../containers/KeyboardView'; const API_FETCH_COUNT = 50; @@ -517,18 +516,16 @@ class ThreadMessagesView extends React.Component - - - {this.renderContent()} - {showFilterDropdown ? ( - - ) : null} - + + {this.renderContent()} + {showFilterDropdown ? ( + + ) : null} ); } diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index ac7593cb8..1a3d604ee 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -1770,7 +1770,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.38.0; + MARKETING_VERSION = 4.37.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -1809,7 +1809,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.38.0; + MARKETING_VERSION = 4.37.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; diff --git a/ios/RocketChatRN/Info.plist b/ios/RocketChatRN/Info.plist index dc7b8abc8..5428b1074 100644 --- a/ios/RocketChatRN/Info.plist +++ b/ios/RocketChatRN/Info.plist @@ -26,7 +26,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.38.0 + 4.37.1 CFBundleSignature ???? CFBundleURLTypes diff --git a/ios/ShareRocketChatRN/Info.plist b/ios/ShareRocketChatRN/Info.plist index 47dfa6e18..d8420c5bf 100644 --- a/ios/ShareRocketChatRN/Info.plist +++ b/ios/ShareRocketChatRN/Info.plist @@ -26,7 +26,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.38.0 + 4.37.1 CFBundleVersion 1 KeychainGroup diff --git a/package.json b/package.json index 344ec0d4d..0454bad70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket-chat-reactnative", - "version": "4.38.0", + "version": "4.37.1", "private": true, "scripts": { "start": "react-native start", From 1f0af9ca07611fda65e0ac3b114b7f506e32f2d7 Mon Sep 17 00:00:00 2001 From: Gleidson Daniel Silva Date: Tue, 18 Apr 2023 13:54:01 -0300 Subject: [PATCH 2/2] chore: Create and_N_more translation (#5023) * add and_N_more translations * fix translation --- app/containers/ReactionsList/AllTab.tsx | 2 +- app/i18n/locales/ar.json | 3 ++- app/i18n/locales/de.json | 3 ++- app/i18n/locales/en.json | 3 ++- app/i18n/locales/es-ES.json | 3 ++- app/i18n/locales/fi.json | 3 ++- app/i18n/locales/fr.json | 3 ++- app/i18n/locales/it.json | 3 ++- app/i18n/locales/ja.json | 3 ++- app/i18n/locales/nl.json | 3 ++- app/i18n/locales/pt-BR.json | 3 ++- app/i18n/locales/pt-PT.json | 3 ++- app/i18n/locales/ru.json | 3 ++- app/i18n/locales/sl-SI.json | 3 ++- app/i18n/locales/sv.json | 3 ++- app/i18n/locales/tr.json | 3 ++- app/i18n/locales/zh-CN.json | 3 ++- app/i18n/locales/zh-TW.json | 3 ++- 18 files changed, 35 insertions(+), 18 deletions(-) diff --git a/app/containers/ReactionsList/AllTab.tsx b/app/containers/ReactionsList/AllTab.tsx index 1696bc30b..4bfa6be9b 100644 --- a/app/containers/ReactionsList/AllTab.tsx +++ b/app/containers/ReactionsList/AllTab.tsx @@ -39,7 +39,7 @@ const AllReactionsListItem = ({ item, getCustomEmoji }: IAllReactionsListItemPro .join(', '); } if (count > 3) { - displayNames = `${displayNames} ${I18n.t('and_more')} ${count - 3}`; + displayNames = `${displayNames} ${I18n.t('and_N_more', { count: count - 3 })}`; } else { displayNames = displayNames.replace(/,(?=[^,]*$)/, ` ${I18n.t('and')}`); } diff --git a/app/i18n/locales/ar.json b/app/i18n/locales/ar.json index eed97c85d..5667b6511 100644 --- a/app/i18n/locales/ar.json +++ b/app/i18n/locales/ar.json @@ -634,5 +634,6 @@ "Logout_failed": "فشل تسجيل الخروج!", "Log_analytics_events": "تحليلات سجل الأحداث", "invalid-room": "غرفة غير صالحة", - "Broadcast_hint": "يمكن فقط للمستخدمين المصرح لهم كتابة رسائل جديدة، ولكن سيتمكن المستخدمون الآخرون من الرد" + "Broadcast_hint": "يمكن فقط للمستخدمين المصرح لهم كتابة رسائل جديدة، ولكن سيتمكن المستخدمون الآخرون من الرد", + "and_N_more": "و{{count}} آخرين" } \ No newline at end of file diff --git a/app/i18n/locales/de.json b/app/i18n/locales/de.json index 3d24589ad..05ea1de2c 100644 --- a/app/i18n/locales/de.json +++ b/app/i18n/locales/de.json @@ -858,5 +858,6 @@ "Channel_hint_not_read_only": "Alle Nutzer im Kanal können neue Nachrichten schreiben", "Channel_hint_encrypted_not_available": "Nicht verfügbar in öffentlichen Kanälen", "Read_only_hint": "Nur autorisierte Benutzer können neue Nachrichten schreiben", - "Discussion": "Diskussion" + "Discussion": "Diskussion", + "and_N_more": "und {{count}} weitere" } \ No newline at end of file diff --git a/app/i18n/locales/en.json b/app/i18n/locales/en.json index 7aad5b43c..b9509eee9 100644 --- a/app/i18n/locales/en.json +++ b/app/i18n/locales/en.json @@ -899,5 +899,6 @@ "admin-video-conf-provider-not-configured-body": "Configure conference calls in order to make it available on this workspace.", "Presence_Cap_Warning_Title": "User status temporarily disabled", "Presence_Cap_Warning_Description": "Active connections have reached the limit for the workspace, thus the service that handles user status is disabled. It can be re-enabled manually in workspace settings.", - "Learn_more": "Learn more" + "Learn_more": "Learn more", + "and_N_more": "and {{count}} more" } \ No newline at end of file diff --git a/app/i18n/locales/es-ES.json b/app/i18n/locales/es-ES.json index 5f5507e32..0c246fdfe 100644 --- a/app/i18n/locales/es-ES.json +++ b/app/i18n/locales/es-ES.json @@ -425,5 +425,6 @@ "Server_selection_numbers": "Seleccionar servidor 1...9", "Add_server": "Añadir servidor", "New_line": "Nueva línea", - "Broadcast_hint": "Sólo los usuarios autorizados pueden escribir nuevos mensajes, el resto podrán responder sobre los mismos." + "Broadcast_hint": "Sólo los usuarios autorizados pueden escribir nuevos mensajes, el resto podrán responder sobre los mismos.", + "and_N_more": "y {{count}} más" } \ No newline at end of file diff --git a/app/i18n/locales/fi.json b/app/i18n/locales/fi.json index f5cc00392..705705d4a 100644 --- a/app/i18n/locales/fi.json +++ b/app/i18n/locales/fi.json @@ -876,5 +876,6 @@ "Call": "Soita", "Reply_in_direct_message": "Vastaa suoralla viestillä", "room_archived": "arkistoi huoneen", - "room_unarchived": "palautti huoneen arkistosta" + "room_unarchived": "palautti huoneen arkistosta", + "and_N_more": "ja {{count}} lisää" } \ No newline at end of file diff --git a/app/i18n/locales/fr.json b/app/i18n/locales/fr.json index b9660b9d7..b2397601a 100644 --- a/app/i18n/locales/fr.json +++ b/app/i18n/locales/fr.json @@ -791,5 +791,6 @@ "Omnichannel_on_hold_chat_resumed": "Le chat en attente a repris : {{comment}}", "Omnichannel_queue": "File d'attente omnicanale", "Empty": "Vide", - "Broadcast_hint": "Seuls les utilisateurs autorisés peuvent écrire de nouveaux messages, mais les autres utilisateurs pourront répondre." + "Broadcast_hint": "Seuls les utilisateurs autorisés peuvent écrire de nouveaux messages, mais les autres utilisateurs pourront répondre.", + "and_N_more": "et {{count}} de plus" } \ No newline at end of file diff --git a/app/i18n/locales/it.json b/app/i18n/locales/it.json index 23758d12e..cc80667c0 100644 --- a/app/i18n/locales/it.json +++ b/app/i18n/locales/it.json @@ -690,5 +690,6 @@ "Workspace_URL_Example": "Es. tua-azienda.rocket.chat", "invalid-room": "Canale non valido", "Open_Livechats": "Chat in corso", - "Broadcast_hint": "Solo gli utenti autorizzati possono scrivere messaggi, ma gli altri utenti saranno in grado di rispondere" + "Broadcast_hint": "Solo gli utenti autorizzati possono scrivere messaggi, ma gli altri utenti saranno in grado di rispondere", + "and_N_more": "e altri {{count}}" } \ No newline at end of file diff --git a/app/i18n/locales/ja.json b/app/i18n/locales/ja.json index 2e08ab32f..529feb0a8 100644 --- a/app/i18n/locales/ja.json +++ b/app/i18n/locales/ja.json @@ -547,5 +547,6 @@ "Clear": "クリア", "This_will_clear_all_your_offline_data": "オフラインデータをすべて削除します。", "invalid-room": "無効なルーム", - "Broadcast_hint": "許可されたユーザーのみが新しいメッセージを書き込めます。他のユーザーは返信することができます" + "Broadcast_hint": "許可されたユーザーのみが新しいメッセージを書き込めます。他のユーザーは返信することができます", + "and_N_more": "さらに{{count}}つ" } \ No newline at end of file diff --git a/app/i18n/locales/nl.json b/app/i18n/locales/nl.json index 7d4b0d081..b32771c1e 100644 --- a/app/i18n/locales/nl.json +++ b/app/i18n/locales/nl.json @@ -791,5 +791,6 @@ "Omnichannel_on_hold_chat_resumed": "Chat in de wacht hervat: {{comment}}", "Omnichannel_queue": "Omnichannel-wachtrij", "Empty": "Leeg", - "Broadcast_hint": "Alleen geautoriseerde gebruikers kunnen nieuwe berichten schrijven, maar de andere gebruikers zullen kunnen antwoorden" + "Broadcast_hint": "Alleen geautoriseerde gebruikers kunnen nieuwe berichten schrijven, maar de andere gebruikers zullen kunnen antwoorden", + "and_N_more": "en nog {{count}}" } \ No newline at end of file diff --git a/app/i18n/locales/pt-BR.json b/app/i18n/locales/pt-BR.json index 998ad9d61..3dc8b90cb 100644 --- a/app/i18n/locales/pt-BR.json +++ b/app/i18n/locales/pt-BR.json @@ -885,5 +885,6 @@ "Discard":"Descartar", "Discard_changes_description":"Todas as alterações serão perdidas, se você sair sem salvar.", "Presence_Cap_Warning_Title": "Status do usuário desabilitado temporariamente", - "Presence_Cap_Warning_Description": "O limite de conexões ativas para a workspace foi atingido, por isso o serviço responsável pela presença dos usuários está temporariamente desabilitado. Ele pode ser reabilitado manualmente nas configurações da workspace." + "Presence_Cap_Warning_Description": "O limite de conexões ativas para a workspace foi atingido, por isso o serviço responsável pela presença dos usuários está temporariamente desabilitado. Ele pode ser reabilitado manualmente nas configurações da workspace.", + "and_N_more": "e mais {{count}}" } \ No newline at end of file diff --git a/app/i18n/locales/pt-PT.json b/app/i18n/locales/pt-PT.json index a4466d49f..7f1ac0e59 100644 --- a/app/i18n/locales/pt-PT.json +++ b/app/i18n/locales/pt-PT.json @@ -494,5 +494,6 @@ "You": "Você", "You_will_not_be_able_to_recover_this_message": "Você será incapaz de recuperar esta mensagem!", "Open_Livechats": "Chats em andamento", - "Broadcast_hint": "Apenas utilizadores autorizados podem escrever novas mensagens, mas os outros utilizadores poderão responder" + "Broadcast_hint": "Apenas utilizadores autorizados podem escrever novas mensagens, mas os outros utilizadores poderão responder", + "and_N_more": "e mais {{count}}" } \ No newline at end of file diff --git a/app/i18n/locales/ru.json b/app/i18n/locales/ru.json index cd0c9e1dd..31f825380 100644 --- a/app/i18n/locales/ru.json +++ b/app/i18n/locales/ru.json @@ -844,5 +844,6 @@ "Calling": "Идет вызов", "Start_a_call": "Начать звонок", "Call": "Звонок", - "Reply_in_direct_message": "Ответить в личном сообщении" + "Reply_in_direct_message": "Ответить в личном сообщении", + "and_N_more": "и еще {{count}}" } \ No newline at end of file diff --git a/app/i18n/locales/sl-SI.json b/app/i18n/locales/sl-SI.json index 97c950e33..85c078c31 100644 --- a/app/i18n/locales/sl-SI.json +++ b/app/i18n/locales/sl-SI.json @@ -809,5 +809,6 @@ "error-init-video-conf": "Napaka Zagon video klica", "totp-invalid": "Koda ali geslo neveljavno", "Close_Chat": "Zaprite klepet", - "Select_tags": "Izberite oznake" + "Select_tags": "Izberite oznake", + "and_N_more": "in še {{count}}" } \ No newline at end of file diff --git a/app/i18n/locales/sv.json b/app/i18n/locales/sv.json index 090ab78df..7f889cc85 100644 --- a/app/i18n/locales/sv.json +++ b/app/i18n/locales/sv.json @@ -874,5 +874,6 @@ "Call": "Ring", "Reply_in_direct_message": "Svara med direktmeddelande", "room_archived": "arkiverade rum", - "room_unarchived": "avarkiverade rum" + "room_unarchived": "avarkiverade rum", + "and_N_more": "och ytterligare {{count}}" } \ No newline at end of file diff --git a/app/i18n/locales/tr.json b/app/i18n/locales/tr.json index 2cca72e0c..d4a89af5f 100644 --- a/app/i18n/locales/tr.json +++ b/app/i18n/locales/tr.json @@ -670,5 +670,6 @@ "Workspace_URL_Example": "Örn. sirketiniz.rocket.chat", "invalid-room": "Geçersiz oda", "Open_Livechats": "Devam Eden Sohbetler", - "Broadcast_hint": "Yalnızca yetkili kullanıcılar yeni ileti yazabilir, ancak diğer kullanıcılar yanıt verebilir" + "Broadcast_hint": "Yalnızca yetkili kullanıcılar yeni ileti yazabilir, ancak diğer kullanıcılar yanıt verebilir", + "and_N_more": "ve {{count}} daha" } \ No newline at end of file diff --git a/app/i18n/locales/zh-CN.json b/app/i18n/locales/zh-CN.json index d92e61be3..1106f10d4 100644 --- a/app/i18n/locales/zh-CN.json +++ b/app/i18n/locales/zh-CN.json @@ -645,5 +645,6 @@ "No_threads_following": "当前没有正在追踪的讨论", "No_threads_unread": "当前没有未读的讨论", "Messagebox_Send_to_channel": "发送至频道", - "Broadcast_hint": "只有经过授权的用户才能写新信息,但其他用户可以回复" + "Broadcast_hint": "只有经过授权的用户才能写新信息,但其他用户可以回复", + "and_N_more": "另外{{count}}个" } \ No newline at end of file diff --git a/app/i18n/locales/zh-TW.json b/app/i18n/locales/zh-TW.json index ba850b671..ca45f9942 100644 --- a/app/i18n/locales/zh-TW.json +++ b/app/i18n/locales/zh-TW.json @@ -655,5 +655,6 @@ "Confirmation": "確認", "invalid-room": "無效的房間", "Open_Livechats": "打開即時聊天", - "Broadcast_hint": "只有經過授權的使用者才能發送新訊息,但其他使用者可以回覆" + "Broadcast_hint": "只有經過授權的使用者才能發送新訊息,但其他使用者可以回覆", + "and_N_more": "另外{{count}}個" } \ No newline at end of file