diff --git a/webapp/channels/package.json b/webapp/channels/package.json index 72822ee446..c4b2901748 100644 --- a/webapp/channels/package.json +++ b/webapp/channels/package.json @@ -105,6 +105,7 @@ "@hot-loader/react-dom": "17.0.2", "@mattermost/calls-common": "0.27.0", "@mattermost/eslint-plugin": "*", + "@mattermost/mmjstool": "github:mattermost/mattermost-utilities#7b63833d208d482ba4a1c12230bb3e68dd9c5e5e", "@redux-devtools/extension": "3.2.3", "@stylistic/stylelint-plugin": "2.1.0", "@testing-library/jest-dom": "5.16.4", @@ -162,7 +163,6 @@ "jest-environment-jsdom": "29.7.0", "jest-junit": "16.0.0", "jest-watch-typeahead": "2.2.2", - "mmjstool": "github:mattermost/mattermost-utilities#73e61d2ede0ebf802492df4cfbac481d35efed54", "nock": "13.2.8", "prettier": "2.3.2", "react-router-enzyme-context": "1.2.0", diff --git a/webapp/channels/src/actions/command.ts b/webapp/channels/src/actions/command.ts index d56fb4e0b2..a29195a482 100644 --- a/webapp/channels/src/actions/command.ts +++ b/webapp/channels/src/actions/command.ts @@ -78,7 +78,7 @@ export function executeCommand(message: string, args: CommandArgs): ActionFuncAs return {data: {frontendHandled: true}}; case '/shortcuts': if (UserAgent.isMobile()) { - const error = {message: localizeMessage('create_post.shortcutsNotSupported', 'Keyboard shortcuts are not supported on your device')}; + const error = {message: localizeMessage({id: 'create_post.shortcutsNotSupported', defaultMessage: 'Keyboard shortcuts are not supported on your device'})}; return {error}; } @@ -132,12 +132,12 @@ export function executeCommand(message: string, args: CommandArgs): ActionFuncAs case '/marketplace': // check if user has permissions to access the read plugins if (!haveICurrentTeamPermission(state, Permissions.SYSCONSOLE_WRITE_PLUGINS)) { - return {error: {message: localizeMessage('marketplace_command.no_permission', 'You do not have the appropriate permissions to access the marketplace.')}}; + return {error: {message: localizeMessage({id: 'marketplace_command.no_permission', defaultMessage: 'You do not have the appropriate permissions to access the marketplace.'})}}; } // check config to see if marketplace is enabled if (!isMarketplaceEnabled(state)) { - return {error: {message: localizeMessage('marketplace_command.disabled', 'The marketplace is disabled. Please contact your System Administrator for details.')}}; + return {error: {message: localizeMessage({id: 'marketplace_command.disabled', defaultMessage: 'The marketplace is disabled. Please contact your System Administrator for details.'})}}; } dispatch(openModal({modalId: ModalIdentifiers.PLUGIN_MARKETPLACE, dialogType: MarketplaceModal, dialogProps: {openedFrom: 'command'}})); diff --git a/webapp/channels/src/actions/file_actions.ts b/webapp/channels/src/actions/file_actions.ts index 30b16ff79b..d87a9646f9 100644 --- a/webapp/channels/src/actions/file_actions.ts +++ b/webapp/channels/src/actions/file_actions.ts @@ -98,9 +98,9 @@ export function uploadFile({file, name, type, rootId, channelId, clientId, onPro try { const errorResponse = JSON.parse(xhr.response); errorMessage = - (errorResponse?.id && errorResponse?.message) ? localizeMessage(errorResponse.id, errorResponse.message) : localizeMessage('file_upload.generic_error', 'There was a problem uploading your files.'); + (errorResponse?.id && errorResponse?.message) ? localizeMessage({id: errorResponse.id, defaultMessage: errorResponse.message}) : localizeMessage({id: 'file_upload.generic_error', defaultMessage: 'There was a problem uploading your files.'}); } catch (e) { - errorMessage = localizeMessage('file_upload.generic_error', 'There was a problem uploading your files.'); + errorMessage = localizeMessage({id: 'file_upload.generic_error', defaultMessage: 'There was a problem uploading your files.'}); } dispatch({ @@ -133,7 +133,7 @@ export function uploadFile({file, name, type, rootId, channelId, clientId, onPro dispatch(batchActions([uploadFailureAction, getLogErrorAction(errorResponse)])); onError(errorResponse, clientId, channelId, rootId); } else { - const errorMessage = xhr.status === 0 || !xhr.status ? localizeMessage('file_upload.generic_error', 'There was a problem uploading your files.') : localizeMessage('channel_loader.unknown_error', 'We received an unexpected status code from the server.') + ' (' + xhr.status + ')'; + const errorMessage = xhr.status === 0 || !xhr.status ? localizeMessage({id: 'file_upload.generic_error', defaultMessage: 'There was a problem uploading your files.'}) : localizeMessage({id: 'channel_loader.unknown_error', defaultMessage: 'We received an unexpected status code from the server.'}) + ' (' + xhr.status + ')'; dispatch({ type: FileTypes.UPLOAD_FILES_FAILURE, diff --git a/webapp/channels/src/actions/notification_actions.jsx b/webapp/channels/src/actions/notification_actions.jsx index 88eed240a2..2559aa9427 100644 --- a/webapp/channels/src/actions/notification_actions.jsx +++ b/webapp/channels/src/actions/notification_actions.jsx @@ -20,7 +20,6 @@ import {isThreadOpen} from 'selectors/views/threads'; import {getHistory} from 'utils/browser_history'; import Constants, {NotificationLevels, UserStatuses, IgnoreChannelMentions} from 'utils/constants'; import DesktopApp from 'utils/desktop_api'; -import {t} from 'utils/i18n'; import {stripMarkdown, formatWithRenderer} from 'utils/markdown'; import MentionableRenderer from 'utils/markdown/mentionable_renderer'; import * as NotificationSounds from 'utils/notification_sounds'; @@ -200,10 +199,10 @@ export function sendDesktopNotification(post, msgProps) { } else if (msgProps.sender_name) { username = msgProps.sender_name; } else { - username = Utils.localizeMessage('channel_loader.someone', 'Someone'); + username = Utils.localizeMessage({id: 'channel_loader.someone', defaultMessage: 'Someone'}); } - let title = Utils.localizeMessage('channel_loader.posted', 'Posted'); + let title = Utils.localizeMessage({id: 'channel_loader.posted', defaultMessage: 'Posted'}); if (!channel) { title = msgProps.channel_display_name; channel = { @@ -211,21 +210,21 @@ export function sendDesktopNotification(post, msgProps) { type: msgProps.channel_type, }; } else if (channel.type === Constants.DM_CHANNEL) { - title = Utils.localizeMessage('notification.dm', 'Direct Message'); + title = Utils.localizeMessage({id: 'notification.dm', defaultMessage: 'Direct Message'}); } else { title = channel.display_name; } if (title === '') { if (msgProps.channel_type === Constants.DM_CHANNEL) { - title = Utils.localizeMessage('notification.dm', 'Direct Message'); + title = Utils.localizeMessage({id: 'notification.dm', defaultMessage: 'Direct Message'}); } else { title = msgProps.channel_display_name; } } if (isCrtReply) { - title = Utils.localizeAndFormatMessage(t('notification.crt'), 'Reply in {title}', {title}); + title = Utils.localizeAndFormatMessage({id: 'notification.crt', defaultMessage: 'Reply in {title}'}, {title}); } let notifyText = post.message; @@ -247,13 +246,13 @@ export function sendDesktopNotification(post, msgProps) { let body = `@${username}`; if (strippedMarkdownNotifyText.length === 0) { if (msgProps.image) { - body += Utils.localizeMessage('channel_loader.uploadedImage', ' uploaded an image'); + body += Utils.localizeMessage({id: 'channel_loader.uploadedImage', defaultMessage: ' uploaded an image'}); } else if (msgProps.otherFile) { - body += Utils.localizeMessage('channel_loader.uploadedFile', ' uploaded a file'); + body += Utils.localizeMessage({id: 'channel_loader.uploadedFile', defaultMessage: ' uploaded a file'}); } else if (image) { - body += Utils.localizeMessage('channel_loader.postedImage', ' posted an image'); + body += Utils.localizeMessage({id: 'channel_loader.postedImage', defaultMessage: ' posted an image'}); } else { - body += Utils.localizeMessage('channel_loader.something', ' did something new'); + body += Utils.localizeMessage({id: 'channel_loader.something', defaultMessage: ' did something new'}); } } else { body += `: ${strippedMarkdownNotifyText}`; diff --git a/webapp/channels/src/actions/views/create_comment.tsx b/webapp/channels/src/actions/views/create_comment.tsx index e7bce9091a..50e12bf16d 100644 --- a/webapp/channels/src/actions/views/create_comment.tsx +++ b/webapp/channels/src/actions/views/create_comment.tsx @@ -267,7 +267,7 @@ export function makeOnEditLatestPost(rootId: string): () => ActionFunc return dispatch(PostActions.setEditingPost( lastPost.id, 'reply_textbox', - Utils.localizeMessage('create_comment.commentTitle', 'Comment'), + Utils.localizeMessage({id: 'create_comment.commentTitle', defaultMessage: 'Comment'}), true, )); }; diff --git a/webapp/channels/src/components/actions_menu/actions_menu.tsx b/webapp/channels/src/components/actions_menu/actions_menu.tsx index fd76879434..9264c8affd 100644 --- a/webapp/channels/src/components/actions_menu/actions_menu.tsx +++ b/webapp/channels/src/components/actions_menu/actions_menu.tsx @@ -388,7 +388,7 @@ export class ActionMenuClass extends React.PureComponent { key='more-actions-button' ref={this.buttonRef} id={`${this.props.location}_actions_button_${this.props.post.id}`} - aria-label={Utils.localizeMessage('post_info.actions.tooltip.actions', 'Actions').toLowerCase()} + aria-label={Utils.localizeMessage({id: 'post_info.actions.tooltip.actions', defaultMessage: 'Actions'}).toLowerCase()} className={classNames('post-menu__item', { 'post-menu__item--active': this.props.isMenuOpen, })} @@ -402,7 +402,7 @@ export class ActionMenuClass extends React.PureComponent { id={`${this.props.location}_actions_dropdown_${this.props.post.id}`} openLeft={true} openUp={this.state.openUp} - ariaLabel={Utils.localizeMessage('post_info.menuAriaLabel', 'Post extra options')} + ariaLabel={Utils.localizeMessage({id: 'post_info.menuAriaLabel', defaultMessage: 'Post extra options'})} key={`${this.props.location}_actions_dropdown_${this.props.post.id}`} > {menuItems} diff --git a/webapp/channels/src/components/add_groups_to_channel_modal/add_groups_to_channel_modal.tsx b/webapp/channels/src/components/add_groups_to_channel_modal/add_groups_to_channel_modal.tsx index a6bfce7679..fe14721ff8 100644 --- a/webapp/channels/src/components/add_groups_to_channel_modal/add_groups_to_channel_modal.tsx +++ b/webapp/channels/src/components/add_groups_to_channel_modal/add_groups_to_channel_modal.tsx @@ -242,8 +242,8 @@ export class AddGroupsToChannelModal extends React.PureComponent { ); - const buttonSubmitText = localizeMessage('multiselect.add', 'Add'); - const buttonSubmitLoadingText = localizeMessage('multiselect.adding', 'Adding...'); + const buttonSubmitText = localizeMessage({id: 'multiselect.add', defaultMessage: 'Add'}); + const buttonSubmitLoadingText = localizeMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'}); let addError = null; if (this.state.addError) { @@ -305,7 +305,7 @@ export class AddGroupsToChannelModal extends React.PureComponent { buttonSubmitLoadingText={buttonSubmitLoadingText} saving={this.state.saving} loading={this.state.loadingGroups} - placeholderText={localizeMessage('multiselect.addGroupsPlaceholder', 'Search and add groups')} + placeholderText={localizeMessage({id: 'multiselect.addGroupsPlaceholder', defaultMessage: 'Search and add groups'})} /> diff --git a/webapp/channels/src/components/add_groups_to_team_modal/add_groups_to_team_modal.tsx b/webapp/channels/src/components/add_groups_to_team_modal/add_groups_to_team_modal.tsx index 75d59db9ea..fd24981777 100644 --- a/webapp/channels/src/components/add_groups_to_team_modal/add_groups_to_team_modal.tsx +++ b/webapp/channels/src/components/add_groups_to_team_modal/add_groups_to_team_modal.tsx @@ -248,8 +248,8 @@ export class AddGroupsToTeamModal extends React.PureComponent { ); - const buttonSubmitText = localizeMessage('multiselect.add', 'Add'); - const buttonSubmitLoadingText = localizeMessage('multiselect.adding', 'Adding...'); + const buttonSubmitText = localizeMessage({id: 'multiselect.add', defaultMessage: 'Add'}); + const buttonSubmitLoadingText = localizeMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'}); let addError = null; if (this.state.addError) { @@ -319,7 +319,7 @@ export class AddGroupsToTeamModal extends React.PureComponent { buttonSubmitLoadingText={buttonSubmitLoadingText} saving={this.state.saving} loading={this.state.loadingGroups} - placeholderText={localizeMessage('multiselect.addGroupsPlaceholder', 'Search and add groups')} + placeholderText={localizeMessage({id: 'multiselect.addGroupsPlaceholder', defaultMessage: 'Search and add groups'})} /> diff --git a/webapp/channels/src/components/add_user_to_group_multiselect/add_user_to_group_multiselect.tsx b/webapp/channels/src/components/add_user_to_group_multiselect/add_user_to_group_multiselect.tsx index e198834977..1b33911cc3 100644 --- a/webapp/channels/src/components/add_user_to_group_multiselect/add_user_to_group_multiselect.tsx +++ b/webapp/channels/src/components/add_user_to_group_multiselect/add_user_to_group_multiselect.tsx @@ -196,8 +196,8 @@ export class AddUserToGroupMultiSelect extends React.PureComponent }; public render = (): JSX.Element => { - const buttonSubmitText = this.props.buttonSubmitText || localizeMessage('multiselect.createGroup', 'Create Group'); - const buttonSubmitLoadingText = this.props.buttonSubmitLoadingText || localizeMessage('multiselect.creating', 'Creating...'); + const buttonSubmitText = this.props.buttonSubmitText || localizeMessage({id: 'multiselect.createGroup', defaultMessage: 'Create Group'}); + const buttonSubmitLoadingText = this.props.buttonSubmitLoadingText || localizeMessage({id: 'multiselect.creating', defaultMessage: 'Creating...'}); let users = filterProfilesStartingWithTerm(this.props.profiles, this.state.term).filter((user) => { return user.delete_at === 0 && @@ -214,7 +214,7 @@ export class AddUserToGroupMultiSelect extends React.PureComponent if (this.state.values.length >= MAX_SELECTABLE_VALUES) { maxValues = MAX_SELECTABLE_VALUES; - numRemainingText = localizeMessage('multiselect.maxGroupMembers', 'No more than 256 members can be added to a group at once.'); + numRemainingText = localizeMessage({id: 'multiselect.maxGroupMembers', defaultMessage: 'No more than 256 members can be added to a group at once.'}); } return ( @@ -237,7 +237,7 @@ export class AddUserToGroupMultiSelect extends React.PureComponent buttonSubmitLoadingText={buttonSubmitLoadingText} saving={this.props.saving} loading={this.state.loadingUsers} - placeholderText={localizeMessage('multiselect.placeholder', 'Search for people')} + placeholderText={localizeMessage({id: 'multiselect.placeholder', defaultMessage: 'Search for people'})} valueWithImage={true} focusOnLoad={this.props.focusOnLoad} savingEnabled={this.props.savingEnabled} diff --git a/webapp/channels/src/components/add_users_to_group_modal/add_users_to_group_modal.tsx b/webapp/channels/src/components/add_users_to_group_modal/add_users_to_group_modal.tsx index 306928a482..d4c2ecff4c 100644 --- a/webapp/channels/src/components/add_users_to_group_modal/add_users_to_group_modal.tsx +++ b/webapp/channels/src/components/add_users_to_group_modal/add_users_to_group_modal.tsx @@ -136,8 +136,8 @@ const AddUsersToGroupModal = (props: Props) => { deleteUserCallback={deleteUserCallback} groupId={props.groupId} searchOptions={searchOptions} - buttonSubmitText={localizeMessage('multiselect.addPeopleToGroup', 'Add People')} - buttonSubmitLoadingText={localizeMessage('multiselect.adding', 'Adding...')} + buttonSubmitText={localizeMessage({id: 'multiselect.addPeopleToGroup', defaultMessage: 'Add People'})} + buttonSubmitLoadingText={localizeMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'})} backButtonClick={goBack} backButtonClass={'multiselect-back'} saving={saving} diff --git a/webapp/channels/src/components/add_users_to_team_modal/add_users_to_team_modal.tsx b/webapp/channels/src/components/add_users_to_team_modal/add_users_to_team_modal.tsx index 8677577028..b90be5ad74 100644 --- a/webapp/channels/src/components/add_users_to_team_modal/add_users_to_team_modal.tsx +++ b/webapp/channels/src/components/add_users_to_team_modal/add_users_to_team_modal.tsx @@ -192,8 +192,8 @@ export class AddUsersToTeamModal extends React.PureComponent { ); - const buttonSubmitText = localizeMessage('multiselect.add', 'Add'); - const buttonSubmitLoadingText = localizeMessage('multiselect.adding', 'Adding...'); + const buttonSubmitText = localizeMessage({id: 'multiselect.add', defaultMessage: 'Add'}); + const buttonSubmitLoadingText = localizeMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'}); let addError = null; if (this.state.addError) { @@ -259,7 +259,7 @@ export class AddUsersToTeamModal extends React.PureComponent { buttonSubmitLoadingText={buttonSubmitLoadingText} saving={this.state.saving} loading={this.state.loading} - placeholderText={localizeMessage('multiselect.placeholder', 'Search and add members')} + placeholderText={localizeMessage({id: 'multiselect.placeholder', defaultMessage: 'Search and add members'})} /> diff --git a/webapp/channels/src/components/admin_console/billing/company_info_edit.tsx b/webapp/channels/src/components/admin_console/billing/company_info_edit.tsx index a71e1e828d..b5041a428d 100644 --- a/webapp/channels/src/components/admin_console/billing/company_info_edit.tsx +++ b/webapp/channels/src/components/admin_console/billing/company_info_edit.tsx @@ -150,7 +150,7 @@ const CompanyInfoEdit: React.FC = () => { type='text' value={address} onChange={updateState(setAddress)} - placeholder={Utils.localizeMessage('admin.billing.company_info.address', 'Address')} + placeholder={Utils.localizeMessage({id: 'admin.billing.company_info.address', defaultMessage: 'Address'})} required={true} /> @@ -160,7 +160,7 @@ const CompanyInfoEdit: React.FC = () => { type='text' value={address2} onChange={updateState(setAddress2)} - placeholder={Utils.localizeMessage('admin.billing.company_info.address_2', 'Address 2')} + placeholder={Utils.localizeMessage({id: 'admin.billing.company_info.address_2', defaultMessage: 'Address 2'})} />
@@ -169,7 +169,7 @@ const CompanyInfoEdit: React.FC = () => { type='text' value={city} onChange={updateState(setCity)} - placeholder={Utils.localizeMessage('admin.billing.company_info.city', 'City')} + placeholder={Utils.localizeMessage({id: 'admin.billing.company_info.city', defaultMessage: 'City'})} required={true} />
@@ -190,7 +190,7 @@ const CompanyInfoEdit: React.FC = () => { type='text' value={postalCode} onChange={updateState(setPostalCode)} - placeholder={Utils.localizeMessage('admin.billing.company_info.zipcode', 'Zip/Postal Code')} + placeholder={Utils.localizeMessage({id: 'admin.billing.company_info.zipcode', defaultMessage: 'Zip/Postal Code'})} required={true} /> @@ -228,7 +228,7 @@ const CompanyInfoEdit: React.FC = () => { type='text' value={companyName} onChange={updateState(setCompanyName)} - placeholder={Utils.localizeMessage('admin.billing.company_info.companyName', 'Company name')} + placeholder={Utils.localizeMessage({id: 'admin.billing.company_info.companyName', defaultMessage: 'Company name'})} required={true} /> @@ -238,7 +238,7 @@ const CompanyInfoEdit: React.FC = () => { type='number' value={numEmployees} onChange={updateNumEmployees} - placeholder={Utils.localizeMessage('admin.billing.company_info.numEmployees', 'Number of employees (optional)')} + placeholder={Utils.localizeMessage({id: 'admin.billing.company_info.numEmployees', defaultMessage: 'Number of employees (optional)'})} />
diff --git a/webapp/channels/src/components/admin_console/cluster_table.tsx b/webapp/channels/src/components/admin_console/cluster_table.tsx index 1c624c1de0..107a5b28cf 100644 --- a/webapp/channels/src/components/admin_console/cluster_table.tsx +++ b/webapp/channels/src/components/admin_console/cluster_table.tsx @@ -98,15 +98,15 @@ export default class ClusterTable extends PureComponent { let status = null; if (clusterInfo.hostname === '') { - clusterInfo.hostname = Utils.localizeMessage('admin.cluster.unknown', 'unknown'); + clusterInfo.hostname = Utils.localizeMessage({id: 'admin.cluster.unknown', defaultMessage: 'unknown'}); } if (clusterInfo.version === '') { - clusterInfo.version = Utils.localizeMessage('admin.cluster.unknown', 'unknown'); + clusterInfo.version = Utils.localizeMessage({id: 'admin.cluster.unknown', defaultMessage: 'unknown'}); } if (clusterInfo.config_hash === '') { - clusterInfo.config_hash = Utils.localizeMessage('admin.cluster.unknown', 'unknown'); + clusterInfo.config_hash = Utils.localizeMessage({id: 'admin.cluster.unknown', defaultMessage: 'unknown'}); } if (singleItem) { diff --git a/webapp/channels/src/components/admin_console/data_grid/data_grid_search.tsx b/webapp/channels/src/components/admin_console/data_grid/data_grid_search.tsx index d2378a4ad9..1f78d40f37 100644 --- a/webapp/channels/src/components/admin_console/data_grid/data_grid_search.tsx +++ b/webapp/channels/src/components/admin_console/data_grid/data_grid_search.tsx @@ -61,7 +61,7 @@ class DataGridSearch extends React.PureComponent { let {placeholder} = this.props; if (!placeholder) { - placeholder = Utils.localizeMessage('search_bar.search', 'Search'); + placeholder = Utils.localizeMessage({id: 'search_bar.search', defaultMessage: 'Search'}); } let filter; @@ -81,7 +81,7 @@ class DataGridSearch extends React.PureComponent { let postDuration = parseInt(messageRetentionInputValue, 10); if (postDuration <= 0) { - this.setState({formErrorText: Utils.localizeMessage('admin.data_retention.custom_policy.form.durationInput.error', 'Error parsing message retention.'), saving: false}); + this.setState({formErrorText: Utils.localizeMessage({id: 'admin.data_retention.custom_policy.form.durationInput.error', defaultMessage: 'Error parsing message retention.'}), saving: false}); return; } if (messageRetentionDropdownValue.value === FOREVER) { @@ -245,7 +245,7 @@ export default class CustomPolicyForm extends React.PureComponent } if (!policyName?.trim()) { - this.setState({inputErrorText: Utils.localizeMessage('admin.data_retention.custom_policy.form.input.error', 'Policy name can\'t be blank.'), saving: false}); + this.setState({inputErrorText: Utils.localizeMessage({id: 'admin.data_retention.custom_policy.form.input.error', defaultMessage: 'Policy name can\'t be blank.'}), saving: false}); return; } @@ -256,7 +256,7 @@ export default class CustomPolicyForm extends React.PureComponent }; if (((policy?.team_count + teamsToAdd.length) - teamsToRemove.length) === 0 && ((policy?.channel_count + channelsToAdd.length) - channelsToRemove.length) === 0) { - this.setState({formErrorText: Utils.localizeMessage('admin.data_retention.custom_policy.form.teamsError', 'You must add a team or a channel to the policy.'), saving: false}); + this.setState({formErrorText: Utils.localizeMessage({id: 'admin.data_retention.custom_policy.form.teamsError', defaultMessage: 'You must add a team or a channel to the policy.'}), saving: false}); return; } @@ -282,7 +282,7 @@ export default class CustomPolicyForm extends React.PureComponent } } else { if (teamsToAdd.length < 1 && channelsToAdd.length < 1) { - this.setState({formErrorText: Utils.localizeMessage('admin.data_retention.custom_policy.form.teamsError', 'You must add a team or a channel to the policy.'), saving: false}); + this.setState({formErrorText: Utils.localizeMessage({id: 'admin.data_retention.custom_policy.form.teamsError', defaultMessage: 'You must add a team or a channel to the policy.'}), saving: false}); return; } const newPolicy = { @@ -359,7 +359,7 @@ export default class CustomPolicyForm extends React.PureComponent this.setState({policyName: e.target.value, saveNeeded: true}); this.props.actions.setNavigationBlocked(true); }} - placeholder={Utils.localizeMessage('admin.data_retention.custom_policy.form.input', 'Policy name')} + placeholder={Utils.localizeMessage({id: 'admin.data_retention.custom_policy.form.input', defaultMessage: 'Policy name'})} customMessage={{type: ItemStatus.ERROR, value: this.state.inputErrorText}} /> exceptionToInput={[FOREVER]} defaultValue={keepForeverOption()} options={[daysOption(), yearsOption(), keepForeverOption()]} - legend={Utils.localizeMessage('admin.data_retention.form.channelAndDirectMessageRetention', 'Channel & direct message retention')} - placeholder={Utils.localizeMessage('admin.data_retention.form.channelAndDirectMessageRetention', 'Channel & direct message retention')} + legend={Utils.localizeMessage({id: 'admin.data_retention.form.channelAndDirectMessageRetention', defaultMessage: 'Channel & direct message retention'})} + placeholder={Utils.localizeMessage({id: 'admin.data_retention.form.channelAndDirectMessageRetention', defaultMessage: 'Channel & direct message retention'})} inputType={'number'} name={'message_retention'} dropdownClassNamePrefix={'message_retention'} diff --git a/webapp/channels/src/components/admin_console/data_retention_settings/dropdown_options/dropdown_options.tsx b/webapp/channels/src/components/admin_console/data_retention_settings/dropdown_options/dropdown_options.tsx index c0178dd03b..6504471dfd 100644 --- a/webapp/channels/src/components/admin_console/data_retention_settings/dropdown_options/dropdown_options.tsx +++ b/webapp/channels/src/components/admin_console/data_retention_settings/dropdown_options/dropdown_options.tsx @@ -9,7 +9,7 @@ export const FOREVER = 'FOREVER'; export const YEARS = 'YEARS'; export const DAYS = 'DAYS'; export const HOURS = 'HOURS'; -export const keepForeverOption = () => ({value: FOREVER, label:
{Utils.localizeMessage('admin.data_retention.form.keepForever', 'Keep forever')}
}); -export const yearsOption = () => ({value: YEARS, label: {Utils.localizeMessage('admin.data_retention.form.years', 'Years')}}); -export const daysOption = () => ({value: DAYS, label: {Utils.localizeMessage('admin.data_retention.form.days', 'Days')}}); -export const hoursOption = () => ({value: HOURS, label: {Utils.localizeMessage('admin.data_retention.form.hours', 'Hours')}}); +export const keepForeverOption = () => ({value: FOREVER, label:
{Utils.localizeMessage({id: 'admin.data_retention.form.keepForever', defaultMessage: 'Keep forever'})}
}); +export const yearsOption = () => ({value: YEARS, label: {Utils.localizeMessage({id: 'admin.data_retention.form.years', defaultMessage: 'Years'})}}); +export const daysOption = () => ({value: DAYS, label: {Utils.localizeMessage({id: 'admin.data_retention.form.days', defaultMessage: 'Days'})}}); +export const hoursOption = () => ({value: HOURS, label: {Utils.localizeMessage({id: 'admin.data_retention.form.hours', defaultMessage: 'Hours'})}}); diff --git a/webapp/channels/src/components/admin_console/data_retention_settings/global_policy_form/global_policy_form.tsx b/webapp/channels/src/components/admin_console/data_retention_settings/global_policy_form/global_policy_form.tsx index afe8e1b7ed..ec412c971b 100644 --- a/webapp/channels/src/components/admin_console/data_retention_settings/global_policy_form/global_policy_form.tsx +++ b/webapp/channels/src/components/admin_console/data_retention_settings/global_policy_form/global_policy_form.tsx @@ -103,7 +103,7 @@ export default class GlobalPolicyForm extends React.PureComponent this.setState({saving: true}); if ((messageRetentionDropdownValue.value !== FOREVER && parseInt(messageRetentionInputValue, 10) < 1) || (fileRetentionDropdownValue.value !== FOREVER && parseInt(fileRetentionInputValue, 10) < 1)) { - this.setState({formErrorText: Utils.localizeMessage('admin.data_retention.global_policy.form.numberError', 'You must add a number greater than or equal to 1.'), saving: false}); + this.setState({formErrorText: Utils.localizeMessage({id: 'admin.data_retention.global_policy.form.numberError', defaultMessage: 'You must add a number greater than or equal to 1.'}), saving: false}); return; } @@ -185,7 +185,7 @@ export default class GlobalPolicyForm extends React.PureComponent
-

{Utils.localizeMessage('admin.data_retention.form.text', 'Applies to all teams and channels, but does not apply to custom retention policies.')}

+

{Utils.localizeMessage({id: 'admin.data_retention.form.text', defaultMessage: 'Applies to all teams and channels, but does not apply to custom retention policies.'})}

{ @@ -205,8 +205,8 @@ export default class GlobalPolicyForm extends React.PureComponent disabled={this.isMessageRetentionSetByEnv()} defaultValue={keepForeverOption()} options={[hoursOption(), daysOption(), yearsOption(), keepForeverOption()]} - legend={Utils.localizeMessage('admin.data_retention.form.channelAndDirectMessageRetention', 'Channel & direct message retention')} - placeholder={Utils.localizeMessage('admin.data_retention.form.channelAndDirectMessageRetention', 'Channel & direct message retention')} + legend={Utils.localizeMessage({id: 'admin.data_retention.form.channelAndDirectMessageRetention', defaultMessage: 'Channel & direct message retention'})} + placeholder={Utils.localizeMessage({id: 'admin.data_retention.form.channelAndDirectMessageRetention', defaultMessage: 'Channel & direct message retention'})} name={'channel_message_retention'} inputType={'number'} dropdownClassNamePrefix={'channel_message_retention_dropdown'} @@ -233,8 +233,8 @@ export default class GlobalPolicyForm extends React.PureComponent disabled={this.isFileRetentionSetByEnv()} defaultValue={keepForeverOption()} options={[hoursOption(), daysOption(), yearsOption(), keepForeverOption()]} - legend={Utils.localizeMessage('admin.data_retention.form.fileRetention', 'File retention')} - placeholder={Utils.localizeMessage('admin.data_retention.form.fileRetention', 'File retention')} + legend={Utils.localizeMessage({id: 'admin.data_retention.form.fileRetention', defaultMessage: 'File retention'})} + placeholder={Utils.localizeMessage({id: 'admin.data_retention.form.fileRetention', defaultMessage: 'File retention'})} name={'file_retention'} inputType={'number'} dropdownClassNamePrefix={'file_retention_dropdown'} diff --git a/webapp/channels/src/components/admin_console/data_retention_settings/team_list/team_list.tsx b/webapp/channels/src/components/admin_console/data_retention_settings/team_list/team_list.tsx index c374709bf4..5b4793d7f1 100644 --- a/webapp/channels/src/components/admin_console/data_retention_settings/team_list/team_list.tsx +++ b/webapp/channels/src/components/admin_console/data_retention_settings/team_list/team_list.tsx @@ -199,7 +199,7 @@ export default class TeamList extends React.PureComponent { }} href='#' > - {Utils.localizeMessage('admin.data_retention.custom_policy.teams.remove', 'Remove')} + {Utils.localizeMessage({id: 'admin.data_retention.custom_policy.teams.remove', defaultMessage: 'Remove'})} ), }, diff --git a/webapp/channels/src/components/admin_console/feature_discovery/feature_discovery.tsx b/webapp/channels/src/components/admin_console/feature_discovery/feature_discovery.tsx index 35f8dc0f8b..810d8b340b 100644 --- a/webapp/channels/src/components/admin_console/feature_discovery/feature_discovery.tsx +++ b/webapp/channels/src/components/admin_console/feature_discovery/feature_discovery.tsx @@ -147,10 +147,10 @@ export default class FeatureDiscovery extends React.PureComponent // by default we assume is not cloud, so the cta button is Start Trial (which will request a trial license) let ctaPrimaryButton = ( {
this.handleGroupSearchKeyUp(e)} onChange={(e) => this.setState({searchString: e.target.value})} value={this.state.searchString} diff --git a/webapp/channels/src/components/admin_console/license_settings/modals/upload_license_modal.tsx b/webapp/channels/src/components/admin_console/license_settings/modals/upload_license_modal.tsx index 5a126facf0..9697d060fc 100644 --- a/webapp/channels/src/components/admin_console/license_settings/modals/upload_license_modal.tsx +++ b/webapp/channels/src/components/admin_console/license_settings/modals/upload_license_modal.tsx @@ -205,7 +205,7 @@ const UploadLicenseModal = (props: Props): JSX.Element | null => { > = ({ > { const {team} = props; let title; if (isSysAdmin) { - title = localizeMessage('admin.user_item.sysAdmin', 'System Admin'); + title = localizeMessage({id: 'admin.user_item.sysAdmin', defaultMessage: 'System Admin'}); } else if (isTeamAdmin) { - title = localizeMessage('admin.user_item.teamAdmin', 'Team Admin'); + title = localizeMessage({id: 'admin.user_item.teamAdmin', defaultMessage: 'Team Admin'}); } else if (isGuestUser) { - title = localizeMessage('admin.user_item.guest', 'Guest'); + title = localizeMessage({id: 'admin.user_item.guest', defaultMessage: 'Guest'}); } else { - title = localizeMessage('admin.user_item.teamMember', 'Team Member'); + title = localizeMessage({id: 'admin.user_item.teamMember', defaultMessage: 'Team Member'}); } return ( @@ -79,22 +79,22 @@ const ManageTeamsDropdown = (props: Props) => { diff --git a/webapp/channels/src/components/admin_console/permission_schemes_settings/permissions_scheme_summary/permissions_scheme_summary.tsx b/webapp/channels/src/components/admin_console/permission_schemes_settings/permissions_scheme_summary/permissions_scheme_summary.tsx index 72b28781f5..18c18dc0d9 100644 --- a/webapp/channels/src/components/admin_console/permission_schemes_settings/permissions_scheme_summary/permissions_scheme_summary.tsx +++ b/webapp/channels/src/components/admin_console/permission_schemes_settings/permissions_scheme_summary/permissions_scheme_summary.tsx @@ -78,7 +78,7 @@ export default class PermissionsSchemeSummary extends React.PureComponent {
); - const buttonSubmitText = localizeMessage('multiselect.add', 'Add'); - const buttonSubmitLoadingText = localizeMessage('multiselect.adding', 'Adding...'); + const buttonSubmitText = localizeMessage({id: 'multiselect.add', defaultMessage: 'Add'}); + const buttonSubmitLoadingText = localizeMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'}); let addError = null; if (this.state.addError) { @@ -268,7 +268,7 @@ export class AddUsersToRoleModal extends React.PureComponent { buttonSubmitLoadingText={buttonSubmitLoadingText} saving={this.state.saving} loading={this.state.loading} - placeholderText={localizeMessage('multiselect.placeholder', 'Search and add members')} + placeholderText={localizeMessage({id: 'multiselect.placeholder', defaultMessage: 'Search and add members'})} /> diff --git a/webapp/channels/src/components/admin_console/system_roles/system_role/system_role_permission_dropdown.tsx b/webapp/channels/src/components/admin_console/system_roles/system_role/system_role_permission_dropdown.tsx index 9247d4e020..b57e3bb9eb 100644 --- a/webapp/channels/src/components/admin_console/system_roles/system_role/system_role_permission_dropdown.tsx +++ b/webapp/channels/src/components/admin_console/system_roles/system_role/system_role_permission_dropdown.tsx @@ -118,7 +118,7 @@ export default class SystemRolePermissionDropdown extends React.PureComponent { displayRoleToBe = () => { const {group, type} = this.props; if (!group.scheme_admin && type === 'channel') { - return localizeMessage('admin.team_channel_settings.group_row.channelAdmin', 'Channel Admin'); + return localizeMessage({id: 'admin.team_channel_settings.group_row.channelAdmin', defaultMessage: 'Channel Admin'}); } else if (!group.scheme_admin && type === 'team') { - return localizeMessage('admin.team_channel_settings.group_row.teamAdmin', 'Team Admin'); + return localizeMessage({id: 'admin.team_channel_settings.group_row.teamAdmin', defaultMessage: 'Team Admin'}); } - return localizeMessage('admin.team_channel_settings.group_row.member', 'Member'); + return localizeMessage({id: 'admin.team_channel_settings.group_row.member', defaultMessage: 'Member'}); }; render = () => { @@ -119,7 +119,7 @@ export default class GroupRow extends React.PureComponent { id='role-to-be-menu' openLeft={true} openUp={false} - ariaLabel={localizeMessage('admin.team_channel_settings.group_row.memberRole', 'Member Role')} + ariaLabel={localizeMessage({id: 'admin.team_channel_settings.group_row.memberRole', defaultMessage: 'Member Role'})} > { private getDropDownOptions = () => { if (this.props.scope === 'team') { return { - makeAdmin: Utils.localizeMessage('team_members_dropdown.makeAdmin', 'Make Team Admin'), - makeMember: Utils.localizeMessage('team_members_dropdown.makeMember', 'Make Team Member'), + makeAdmin: Utils.localizeMessage({id: 'team_members_dropdown.makeAdmin', defaultMessage: 'Make Team Admin'}), + makeMember: Utils.localizeMessage({id: 'team_members_dropdown.makeMember', defaultMessage: 'Make Team Member'}), }; } return { - makeAdmin: Utils.localizeMessage('channel_members_dropdown.make_channel_admin', 'Make Channel Admin'), - makeMember: Utils.localizeMessage('channel_members_dropdown.make_channel_member', 'Make Channel Member'), + makeAdmin: Utils.localizeMessage({id: 'channel_members_dropdown.make_channel_admin', defaultMessage: 'Make Channel Admin'}), + makeMember: Utils.localizeMessage({id: 'channel_members_dropdown.make_channel_member', defaultMessage: 'Make Channel Member'}), }; }; @@ -79,18 +79,18 @@ export default class UserGridRoleDropdown extends React.PureComponent { private getLocalizedRole = (role: Role) => { switch (role) { case 'system_admin': - return Utils.localizeMessage('admin.user_grid.system_admin', 'System Admin'); + return Utils.localizeMessage({id: 'admin.user_grid.system_admin', defaultMessage: 'System Admin'}); case 'team_admin': - return Utils.localizeMessage('admin.user_grid.team_admin', 'Team Admin'); + return Utils.localizeMessage({id: 'admin.user_grid.team_admin', defaultMessage: 'Team Admin'}); case 'channel_admin': - return Utils.localizeMessage('admin.user_grid.channel_admin', 'Channel Admin'); + return Utils.localizeMessage({id: 'admin.user_grid.channel_admin', defaultMessage: 'Channel Admin'}); case 'shared_member': - return Utils.localizeMessage('admin.user_grid.shared_member', 'Shared Member'); + return Utils.localizeMessage({id: 'admin.user_grid.shared_member', defaultMessage: 'Shared Member'}); case 'team_user': case 'channel_user': - return Utils.localizeMessage('admin.group_teams_and_channels_row.member', 'Member'); + return Utils.localizeMessage({id: 'admin.group_teams_and_channels_row.member', defaultMessage: 'Member'}); default: - return Utils.localizeMessage('admin.user_grid.guest', 'Guest'); + return Utils.localizeMessage({id: 'admin.user_grid.guest', defaultMessage: 'Guest'}); } }; @@ -113,9 +113,9 @@ export default class UserGridRoleDropdown extends React.PureComponent { private getAriaLabel = () => { const {scope} = this.props; if (scope === 'team') { - return Utils.localizeMessage('team_members_dropdown.menuAriaLabel', 'Change the role of a team member'); + return Utils.localizeMessage({id: 'team_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of a team member'}); } - return Utils.localizeMessage('channel_members_dropdown.menuAriaLabel', 'Change the role of channel member'); + return Utils.localizeMessage({id: 'channel_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of channel member'}); }; public render = (): React.ReactNode => { diff --git a/webapp/channels/src/components/analytics/format.tsx b/webapp/channels/src/components/analytics/format.tsx index 1e9af83e9a..7d8167f5bf 100644 --- a/webapp/channels/src/components/analytics/format.tsx +++ b/webapp/channels/src/components/analytics/format.tsx @@ -6,8 +6,8 @@ import * as Utils from 'utils/utils'; export function formatChannelDoughtnutData(totalPublic: any, totalPrivate: any) { const channelTypeData = { labels: [ - Utils.localizeMessage('analytics.system.publicChannels', 'Public Channels'), - Utils.localizeMessage('analytics.system.privateGroups', 'Private Channels'), + Utils.localizeMessage({id: 'analytics.system.publicChannels', defaultMessage: 'Public Channels'}), + Utils.localizeMessage({id: 'analytics.system.privateGroups', defaultMessage: 'Private Channels'}), ], datasets: [{ data: [totalPublic, totalPrivate], @@ -22,9 +22,9 @@ export function formatChannelDoughtnutData(totalPublic: any, totalPrivate: any) export function formatPostDoughtnutData(filePosts: any, hashtagPosts: any, totalPosts: any) { const postTypeData = { labels: [ - Utils.localizeMessage('analytics.system.totalFilePosts', 'Posts with Files'), - Utils.localizeMessage('analytics.system.totalHashtagPosts', 'Posts with Hashtags'), - Utils.localizeMessage('analytics.system.textPosts', 'Posts with Text-only'), + Utils.localizeMessage({id: 'analytics.system.totalFilePosts', defaultMessage: 'Posts with Files'}), + Utils.localizeMessage({id: 'analytics.system.totalHashtagPosts', defaultMessage: 'Posts with Hashtags'}), + Utils.localizeMessage({id: 'analytics.system.textPosts', defaultMessage: 'Posts with Text-only'}), ], datasets: [{ data: [filePosts, hashtagPosts, (totalPosts - filePosts - hashtagPosts)], diff --git a/webapp/channels/src/components/apps_form/apps_form_component.tsx b/webapp/channels/src/components/apps_form/apps_form_component.tsx index 0e27dfe941..20d5ecd80b 100644 --- a/webapp/channels/src/components/apps_form/apps_form_component.tsx +++ b/webapp/channels/src/components/apps_form/apps_form_component.tsx @@ -518,10 +518,10 @@ export class AppsForm extends React.PureComponent { autoFocus={!fields || fields.length === 0} className='btn btn-primary save-button' spinning={Boolean(this.state.submitting)} - spinningText={localizeMessage( - 'interactive_dialog.submitting', - 'Submitting...', - )} + spinningText={localizeMessage({ + id: 'interactive_dialog.submitting', + defaultMessage: 'Submitting...', + })} > {submitText} diff --git a/webapp/channels/src/components/backstage/components/backstage_list.tsx b/webapp/channels/src/components/backstage/components/backstage_list.tsx index b0d1b55ab8..018eae5869 100644 --- a/webapp/channels/src/components/backstage/components/backstage_list.tsx +++ b/webapp/channels/src/components/backstage/components/backstage_list.tsx @@ -51,7 +51,7 @@ const getPaging = (remainingProps: Props, childCount: number, hasFilter: boolean return {startCount, endCount, total, isFirstPage, isLastPage}; }; -const BackstageList = ({searchPlaceholder = localizeMessage('backstage_list.search', 'Search'), ...remainingProps}: Props) => { +const BackstageList = ({searchPlaceholder = localizeMessage({id: 'backstage_list.search', defaultMessage: 'Search'}), ...remainingProps}: Props) => { const {formatMessage} = useIntl(); const [filter, setFilter] = useState(''); diff --git a/webapp/channels/src/components/browse_channels/browse_channels.tsx b/webapp/channels/src/components/browse_channels/browse_channels.tsx index 43441cff83..b24b9d7e78 100644 --- a/webapp/channels/src/components/browse_channels/browse_channels.tsx +++ b/webapp/channels/src/components/browse_channels/browse_channels.tsx @@ -314,7 +314,7 @@ export default class BrowseChannels extends React.PureComponent { id='createNewChannelButton' className={buttonClassName} onClick={this.handleNewChannel} - aria-label={localizeMessage('more_channels.create', 'Create New Channel')} + aria-label={localizeMessage({id: 'more_channels.create', defaultMessage: 'Create New Channel'})} > {icon} { public renderRow = (item: Group, listModal: any) => { let title; if (item.scheme_admin) { - title = Utils.localizeMessage('channel_members_dropdown.channel_admins', 'Channel Admins'); + title = Utils.localizeMessage({id: 'channel_members_dropdown.channel_admins', defaultMessage: 'Channel Admins'}); } else { - title = Utils.localizeMessage('channel_members_dropdown.channel_members', 'Channel Members'); + title = Utils.localizeMessage({id: 'channel_members_dropdown.channel_members', defaultMessage: 'Channel Members'}); } return ( @@ -116,21 +116,21 @@ class ChannelGroupsManageModal extends React.PureComponent { this.setChannelMemberStatus(item, listModal, true)} - text={Utils.localizeMessage('channel_members_dropdown.make_channel_admins', 'Make Channel Admins')} + text={Utils.localizeMessage({id: 'channel_members_dropdown.make_channel_admins', defaultMessage: 'Make Channel Admins'})} /> this.setChannelMemberStatus(item, listModal, false)} - text={Utils.localizeMessage('channel_members_dropdown.make_channel_members', 'Make Channel Members')} + text={Utils.localizeMessage({id: 'channel_members_dropdown.make_channel_members', defaultMessage: 'Make Channel Members'})} /> this.onClickRemoveGroup(item, listModal)} - text={Utils.localizeMessage('group_list_modal.removeGroupButton', 'Remove Group')} + text={Utils.localizeMessage({id: 'group_list_modal.removeGroupButton', defaultMessage: 'Remove Group'})} /> diff --git a/webapp/channels/src/components/channel_header_dropdown/channel_header_dropdown.tsx b/webapp/channels/src/components/channel_header_dropdown/channel_header_dropdown.tsx index 6e80d6bc30..0eecd7a25a 100644 --- a/webapp/channels/src/components/channel_header_dropdown/channel_header_dropdown.tsx +++ b/webapp/channels/src/components/channel_header_dropdown/channel_header_dropdown.tsx @@ -11,7 +11,7 @@ import {localizeMessage} from 'utils/utils'; const ChannelHeaderDropdown = () => ( diff --git a/webapp/channels/src/components/channel_header_dropdown/channel_header_dropdown_items.tsx b/webapp/channels/src/components/channel_header_dropdown/channel_header_dropdown_items.tsx index a7f736785a..3e3ed0b292 100644 --- a/webapp/channels/src/components/channel_header_dropdown/channel_header_dropdown_items.tsx +++ b/webapp/channels/src/components/channel_header_dropdown/channel_header_dropdown_items.tsx @@ -135,7 +135,7 @@ export default class ChannelHeaderDropdown extends React.PureComponent { channel, currentUser: user, }} - text={localizeMessage('navbar.preferences', 'Notification Preferences')} + text={localizeMessage({id: 'navbar.preferences', defaultMessage: 'Notification Preferences'})} /> { modalId={ModalIdentifiers.CHANNEL_INVITE} dialogType={ChannelInviteModal} dialogProps={{channel}} - text={localizeMessage('navbar.addMembers', 'Add Members')} + text={localizeMessage({id: 'navbar.addMembers', defaultMessage: 'Add Members'})} /> { modalId={ModalIdentifiers.CREATE_DM_CHANNEL} dialogType={MoreDirectChannels} dialogProps={{isExistingChannel: true}} - text={localizeMessage('navbar.addMembers', 'Add Members')} + text={localizeMessage({id: 'navbar.addMembers', defaultMessage: 'Add Members'})} /> { show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && !isArchived && !isDefault && isGroupConstrained && isLicensedForLDAPGroups} modalId={ModalIdentifiers.ADD_GROUPS_TO_CHANNEL} dialogType={AddGroupsToChannelModal} - text={localizeMessage('navbar.addGroups', 'Add Groups')} + text={localizeMessage({id: 'navbar.addGroups', defaultMessage: 'Add Groups'})} /> { modalId={ModalIdentifiers.MANAGE_CHANNEL_GROUPS} dialogType={ChannelGroupsManageModal} dialogProps={{channelID: channel.id}} - text={localizeMessage('navbar_dropdown.manageGroups', 'Manage Groups')} + text={localizeMessage({id: 'navbar_dropdown.manageGroups', defaultMessage: 'Manage Groups'})} /> @@ -212,7 +212,7 @@ export default class ChannelHeaderDropdown extends React.PureComponent { id='channelViewMembers' channel={channel} show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && !isArchived && !isDefault} - text={localizeMessage('channel_header.viewMembers', 'View Members')} + text={localizeMessage({id: 'channel_header.viewMembers', defaultMessage: 'View Members'})} /> @@ -224,7 +224,7 @@ export default class ChannelHeaderDropdown extends React.PureComponent { modalId={ModalIdentifiers.EDIT_CHANNEL_HEADER} dialogType={EditChannelHeaderModal} dialogProps={{channel}} - text={localizeMessage('channel_header.setConversationHeader', 'Edit Conversation Header')} + text={localizeMessage({id: 'channel_header.setConversationHeader', defaultMessage: 'Edit Conversation Header'})} /> { modalId={ModalIdentifiers.CONVERT_GM_TO_CHANNEL} dialogType={ConvertGmToChannelModal} dialogProps={{channel}} - text={localizeMessage('sidebar_left.sidebar_channel_menu_convert_to_channel', 'Convert to Private Channel')} + text={localizeMessage({id: 'sidebar_left.sidebar_channel_menu_convert_to_channel', defaultMessage: 'Convert to Private Channel'})} /> @@ -249,7 +249,7 @@ export default class ChannelHeaderDropdown extends React.PureComponent { modalId={ModalIdentifiers.EDIT_CHANNEL_HEADER} dialogType={EditChannelHeaderModal} dialogProps={{channel}} - text={localizeMessage('channel_header.setHeader', 'Edit Channel Header')} + text={localizeMessage({id: 'channel_header.setHeader', defaultMessage: 'Edit Channel Header'})} /> { modalId={ModalIdentifiers.EDIT_CHANNEL_PURPOSE} dialogType={EditChannelPurposeModal} dialogProps={{channel}} - text={localizeMessage('channel_header.setPurpose', 'Edit Channel Purpose')} + text={localizeMessage({id: 'channel_header.setPurpose', defaultMessage: 'Edit Channel Purpose'})} /> { modalId={ModalIdentifiers.RENAME_CHANNEL} dialogType={RenameChannelModal} dialogProps={{channel}} - text={localizeMessage('channel_header.rename', 'Rename Channel')} + text={localizeMessage({id: 'channel_header.rename', defaultMessage: 'Rename Channel'})} /> { channelId: channel.id, channelDisplayName: channel.display_name, }} - text={localizeMessage('channel_header.convert', 'Convert to Private Channel')} + text={localizeMessage({id: 'channel_header.convert', defaultMessage: 'Convert to Private Channel'})} /> { channel, penultimateViewedChannelName, }} - text={localizeMessage('channel_header.delete', 'Archive Channel')} + text={localizeMessage({id: 'channel_header.delete', defaultMessage: 'Archive Channel'})} /> {isMobile && @@ -340,7 +340,7 @@ export default class ChannelHeaderDropdown extends React.PureComponent { dialogProps={{ channel, }} - text={localizeMessage('channel_header.unarchive', 'Unarchive Channel')} + text={localizeMessage({id: 'channel_header.unarchive', defaultMessage: 'Unarchive Channel'})} /> diff --git a/webapp/channels/src/components/channel_header_dropdown/menu_items/close_message/close_message.tsx b/webapp/channels/src/components/channel_header_dropdown/menu_items/close_message/close_message.tsx index 970d78b267..f4fa815c50 100644 --- a/webapp/channels/src/components/channel_header_dropdown/menu_items/close_message/close_message.tsx +++ b/webapp/channels/src/components/channel_header_dropdown/menu_items/close_message/close_message.tsx @@ -96,9 +96,9 @@ export default class CloseMessage extends React.PureComponent { let text; if (channel.type === Constants.DM_CHANNEL) { - text = localizeMessage('center_panel.direct.closeDirectMessage', 'Close Direct Message'); + text = localizeMessage({id: 'center_panel.direct.closeDirectMessage', defaultMessage: 'Close Direct Message'}); } else if (channel.type === Constants.GM_CHANNEL) { - text = localizeMessage('center_panel.direct.closeGroupMessage', 'Close Group Message'); + text = localizeMessage({id: 'center_panel.direct.closeGroupMessage', defaultMessage: 'Close Group Message'}); } return ( diff --git a/webapp/channels/src/components/channel_header_dropdown/menu_items/toggle_info/toggle_info.tsx b/webapp/channels/src/components/channel_header_dropdown/menu_items/toggle_info/toggle_info.tsx index 34bbb7f149..c9606a8cb2 100644 --- a/webapp/channels/src/components/channel_header_dropdown/menu_items/toggle_info/toggle_info.tsx +++ b/webapp/channels/src/components/channel_header_dropdown/menu_items/toggle_info/toggle_info.tsx @@ -30,7 +30,7 @@ const ToggleInfo = ({show, channel, rhsOpen, actions}: Props) => { actions.showChannelInfo(channel.id); }; - const text = rhsOpen ? localizeMessage('channelHeader.hideInfo', 'Close Info') : localizeMessage('channelHeader.viewInfo', 'View Info'); + const text = rhsOpen ? localizeMessage({id: 'channelHeader.hideInfo', defaultMessage: 'Close Info'}) : localizeMessage({id: 'channelHeader.viewInfo', defaultMessage: 'View Info'}); return ( = ({channel, actions}: Props): JSX.Element => ( } {actionButton} diff --git a/webapp/channels/src/components/plugin_marketplace/marketplace_item/marketplace_item_plugin/marketplace_item_plugin.tsx b/webapp/channels/src/components/plugin_marketplace/marketplace_item/marketplace_item_plugin/marketplace_item_plugin.tsx index 18ce2d05be..54cfdd7810 100644 --- a/webapp/channels/src/components/plugin_marketplace/marketplace_item/marketplace_item_plugin/marketplace_item_plugin.tsx +++ b/webapp/channels/src/components/plugin_marketplace/marketplace_item/marketplace_item_plugin/marketplace_item_plugin.tsx @@ -328,7 +328,7 @@ export default class MarketplaceItemPlugin extends React.PureComponent {actionButton} diff --git a/webapp/channels/src/components/post_view/channel_intro_message/channel_intro_message.tsx b/webapp/channels/src/components/post_view/channel_intro_message/channel_intro_message.tsx index 705d87665a..6fde6e8f83 100644 --- a/webapp/channels/src/components/post_view/channel_intro_message/channel_intro_message.tsx +++ b/webapp/channels/src/components/post_view/channel_intro_message/channel_intro_message.tsx @@ -707,7 +707,7 @@ function createSetHeaderButton(channel: Channel) { return ( { data-a11y-focus-child={true} data-a11y-order-reversed={true} data-a11y-loop-navigation={false} - aria-label={Utils.localizeMessage('accessibility.sections.centerContent', 'message list main region')} + aria-label={Utils.localizeMessage({id: 'accessibility.sections.centerContent', defaultMessage: 'message list main region'})} > {this.props.isMobileView && ( diff --git a/webapp/channels/src/components/post_view/post_message_view/post_message_view.tsx b/webapp/channels/src/components/post_view/post_message_view/post_message_view.tsx index 8934f783cc..03d1537180 100644 --- a/webapp/channels/src/components/post_view/post_message_view/post_message_view.tsx +++ b/webapp/channels/src/components/post_view/post_message_view/post_message_view.tsx @@ -132,7 +132,7 @@ export default class PostMessageView extends React.PureComponent { let message = post.message; const isEphemeral = isPostEphemeral(post); if (compactDisplay && isEphemeral) { - const visibleMessage = Utils.localizeMessage('post_info.message.visible.compact', ' (Only visible to you)'); + const visibleMessage = Utils.localizeMessage({id: 'post_info.message.visible.compact', defaultMessage: ' (Only visible to you)'}); message = message.concat(visibleMessage); } diff --git a/webapp/channels/src/components/post_view/post_reaction/post_reaction.tsx b/webapp/channels/src/components/post_view/post_reaction/post_reaction.tsx index 303a5b34d6..2984cc1d71 100644 --- a/webapp/channels/src/components/post_view/post_reaction/post_reaction.tsx +++ b/webapp/channels/src/components/post_view/post_reaction/post_reaction.tsx @@ -98,7 +98,7 @@ export default class PostReaction extends React.PureComponent {
); @@ -446,7 +445,7 @@ export class SearchableChannelList extends React.PureComponent { /> } trailingElements={this.props.filter === Filter.All ? checkIcon : null} - aria-label={localizeMessage('suggestion.all', 'All channel types')} + aria-label={localizeMessage({id: 'suggestion.all', defaultMessage: 'All channel types'})} />, { /> } trailingElements={this.props.filter === Filter.Public ? checkIcon : null} - aria-label={localizeMessage('suggestion.public', 'Public channels')} + aria-label={localizeMessage({id: 'suggestion.public', defaultMessage: 'Public channels'})} />, { /> } trailingElements={this.props.filter === Filter.Private ? checkIcon : null} - aria-label={localizeMessage('suggestion.private', 'Private channels')} + aria-label={localizeMessage({id: 'suggestion.private', defaultMessage: 'Private channels'})} />, ]; @@ -493,7 +492,7 @@ export class SearchableChannelList extends React.PureComponent { /> } trailingElements={this.props.filter === Filter.Archived ? checkIcon : null} - aria-label={localizeMessage('suggestion.archive', 'Archived channels')} + aria-label={localizeMessage({id: 'suggestion.archive', defaultMessage: 'Archived channels'})} />, ); } @@ -514,7 +513,7 @@ export class SearchableChannelList extends React.PureComponent { }} menu={{ id: 'browseChannelsDropdown', - 'aria-label': localizeMessage('more_channels.title', 'Browse channels'), + 'aria-label': localizeMessage({id: 'more_channels.title', defaultMessage: 'Browse channels'}), }} > {channelDropdownItems.map((item) => item)} @@ -529,7 +528,7 @@ export class SearchableChannelList extends React.PureComponent { > @@ -542,13 +541,13 @@ export class SearchableChannelList extends React.PureComponent { let channelCountLabel; if (channels.length === 0) { - channelCountLabel = localizeMessage('more_channels.count_zero', '0 Results'); + channelCountLabel = localizeMessage({id: 'more_channels.count_zero', defaultMessage: '0 Results'}); } else if (channels.length === 1) { - channelCountLabel = localizeMessage('more_channels.count_one', '1 Result'); + channelCountLabel = localizeMessage({id: 'more_channels.count_one', defaultMessage: '1 Result'}); } else if (channels.length > 1) { - channelCountLabel = localizeAndFormatMessage(messages.channelCount.id, messages.channelCount.defaultMessage, {count: channels.length}); + channelCountLabel = localizeAndFormatMessage(messages.channelCount, {count: channels.length}); } else { - channelCountLabel = localizeMessage('more_channels.count_zero', '0 Results'); + channelCountLabel = localizeMessage({id: 'more_channels.count_zero', defaultMessage: '0 Results'}); } const dropDownContainer = ( diff --git a/webapp/channels/src/components/setting_picture.tsx b/webapp/channels/src/components/setting_picture.tsx index 946cd80cb3..239f2e5066 100644 --- a/webapp/channels/src/components/setting_picture.tsx +++ b/webapp/channels/src/components/setting_picture.tsx @@ -296,7 +296,7 @@ export default class SettingPicture extends Component { className='btn btn-primary btn-file' disabled={this.props.loadingPicture} onClick={this.handleInputFile} - aria-label={localizeMessage('setting_picture.select', 'Select')} + aria-label={localizeMessage({id: 'setting_picture.select', defaultMessage: 'Select'})} > { ref={this.confirmButton} className={confirmButtonClass} onClick={this.handleSave} - aria-label={this.props.loadingPicture ? localizeMessage('setting_picture.uploading', 'Uploading...') : localizeMessage('setting_picture.save', 'Save')} + aria-label={this.props.loadingPicture ? localizeMessage({id: 'setting_picture.uploading', defaultMessage: 'Uploading...'}) : localizeMessage({id: 'setting_picture.save', defaultMessage: 'Save'})} > { data-testid='cancelSettingPicture' className='btn btn-tertiary theme ml-2' onClick={this.handleCancel} - aria-label={localizeMessage('setting_picture.cancel', 'Cancel')} + aria-label={localizeMessage({id: 'setting_picture.cancel', defaultMessage: 'Cancel'})} > { this.setTeamMemberStatus(item, listModal, true)} - text={Utils.localizeMessage('team_members_dropdown.makeTeamAdmins', 'Make Team Admins')} + text={Utils.localizeMessage({id: 'team_members_dropdown.makeTeamAdmins', defaultMessage: 'Make Team Admins'})} /> this.setTeamMemberStatus(item, listModal, false)} - text={Utils.localizeMessage('team_members_dropdown.makeTeamMembers', 'Make Team Members')} + text={Utils.localizeMessage({id: 'team_members_dropdown.makeTeamMembers', defaultMessage: 'Make Team Members'})} /> this.onClickRemoveGroup(item, listModal)} - text={Utils.localizeMessage('group_list_modal.removeGroupButton', 'Remove Group')} + text={Utils.localizeMessage({id: 'group_list_modal.removeGroupButton', defaultMessage: 'Remove Group'})} /> diff --git a/webapp/channels/src/components/team_members_dropdown/team_members_dropdown.tsx b/webapp/channels/src/components/team_members_dropdown/team_members_dropdown.tsx index 0d0d089ebc..207793be52 100644 --- a/webapp/channels/src/components/team_members_dropdown/team_members_dropdown.tsx +++ b/webapp/channels/src/components/team_members_dropdown/team_members_dropdown.tsx @@ -253,19 +253,19 @@ export default class TeamMembersDropdown extends React.PureComponent ); const menuMakeAdmin = ( ); const menuMakeMember = ( ); return ( @@ -283,7 +283,7 @@ export default class TeamMembersDropdown extends React.PureComponent {canRemoveFromTeam ? menuRemove : null} {showMakeAdmin ? menuMakeAdmin : null} diff --git a/webapp/channels/src/components/team_selector_modal/team_selector_modal.tsx b/webapp/channels/src/components/team_selector_modal/team_selector_modal.tsx index 6a358ddaa8..2cb3452f96 100644 --- a/webapp/channels/src/components/team_selector_modal/team_selector_modal.tsx +++ b/webapp/channels/src/components/team_selector_modal/team_selector_modal.tsx @@ -243,7 +243,7 @@ export class TeamSelectorModal extends React.PureComponent { /> ); - const buttonSubmitText = localizeMessage('multiselect.add', 'Add'); + const buttonSubmitText = localizeMessage({id: 'multiselect.add', defaultMessage: 'Add'}); let teams = [] as Team[]; if (this.props.teams) { @@ -313,7 +313,7 @@ export class TeamSelectorModal extends React.PureComponent { buttonSubmitText={buttonSubmitText} saving={false} loading={this.state.loadingTeams} - placeholderText={localizeMessage('multiselect.addTeamsPlaceholder', 'Search and add teams')} + placeholderText={localizeMessage({id: 'multiselect.addTeamsPlaceholder', defaultMessage: 'Search and add teams'})} /> diff --git a/webapp/channels/src/components/team_sidebar/team_sidebar.tsx b/webapp/channels/src/components/team_sidebar/team_sidebar.tsx index d18eee013a..4994763470 100644 --- a/webapp/channels/src/components/team_sidebar/team_sidebar.tsx +++ b/webapp/channels/src/components/team_sidebar/team_sidebar.tsx @@ -246,7 +246,7 @@ export default class TeamSidebar extends React.PureComponent { ); diff --git a/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx b/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx index e9d3dddaca..d0b554e972 100644 --- a/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx +++ b/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx @@ -424,7 +424,7 @@ class ThreadViewerVirtualized extends PureComponent { )}
{ width, onDismiss: this.hideArchiveToast, onClick: this.scrollToLatestMessages, - onClickMessage: localizeMessage('postlist.toast.scrollToBottom', 'Jump to recents'), + onClickMessage: localizeMessage({id: 'postlist.toast.scrollToBottom', defaultMessage: 'Jump to recents'}), showActions: true, extraClasses: 'toast__history', }; diff --git a/webapp/channels/src/components/update_user_group_modal/update_user_group_modal.tsx b/webapp/channels/src/components/update_user_group_modal/update_user_group_modal.tsx index f1bf4bc806..e70c8708ab 100644 --- a/webapp/channels/src/components/update_user_group_modal/update_user_group_modal.tsx +++ b/webapp/channels/src/components/update_user_group_modal/update_user_group_modal.tsx @@ -96,7 +96,7 @@ const UpdateUserGroupModal = (props: Props) => { const displayName = name; if (!displayName || !displayName.trim()) { - setNameInputErrorText(Utils.localizeMessage('user_groups_modal.nameIsEmpty', 'Name is a required field.')); + setNameInputErrorText(Utils.localizeMessage({id: 'user_groups_modal.nameIsEmpty', defaultMessage: 'Name is a required field.'})); setSaving(false); return; } @@ -106,20 +106,20 @@ const UpdateUserGroupModal = (props: Props) => { } if (newMention.length < 1) { - setMentionInputErrorText(Utils.localizeMessage('user_groups_modal.mentionIsEmpty', 'Mention is a required field.')); + setMentionInputErrorText(Utils.localizeMessage({id: 'user_groups_modal.mentionIsEmpty', defaultMessage: 'Mention is a required field.'})); setSaving(false); return; } if (Constants.SPECIAL_MENTIONS.includes(newMention.toLowerCase())) { - setMentionInputErrorText(Utils.localizeMessage('user_groups_modal.mentionReservedWord', 'Mention contains a reserved word.')); + setMentionInputErrorText(Utils.localizeMessage({id: 'user_groups_modal.mentionReservedWord', defaultMessage: 'Mention contains a reserved word.'})); setSaving(false); return; } const mentionRegEx = new RegExp(/^[a-z0-9.\-_]+$/); if (!mentionRegEx.test(newMention)) { - setMentionInputErrorText(Utils.localizeMessage('user_groups_modal.mentionInvalidError', 'Invalid character in mention.')); + setMentionInputErrorText(Utils.localizeMessage({id: 'user_groups_modal.mentionInvalidError', defaultMessage: 'Invalid character in mention.'})); setSaving(false); return; } @@ -131,10 +131,10 @@ const UpdateUserGroupModal = (props: Props) => { const data = await props.actions.patchGroup(props.groupId, group); if (data?.error) { if (data.error?.server_error_id === 'app.custom_group.unique_name') { - setMentionInputErrorText(Utils.localizeMessage('user_groups_modal.mentionNotUnique', 'Mention needs to be unique.')); + setMentionInputErrorText(Utils.localizeMessage({id: 'user_groups_modal.mentionNotUnique', defaultMessage: 'Mention needs to be unique.'})); setSaving(false); } else if (data.error?.server_error_id === 'app.group.username_conflict') { - setMentionInputErrorText(Utils.localizeMessage('user_groups_modal.mentionUsernameConflict', 'A username already exists with this name. Mention must be unique.')); + setMentionInputErrorText(Utils.localizeMessage({id: 'user_groups_modal.mentionUsernameConflict', defaultMessage: 'A username already exists with this name. Mention must be unique.'})); setSaving(false); } else { setShowUnknownError(true); @@ -181,7 +181,7 @@ const UpdateUserGroupModal = (props: Props) => {
{
{ }} className='btn btn-tertiary' > - {Utils.localizeMessage('multiselect.backButton', 'Back')} + {Utils.localizeMessage({id: 'multiselect.backButton', defaultMessage: 'Back'})} { e.preventDefault(); patchGroup(); }} - defaultMessage={Utils.localizeMessage('multiselect.saveDetailsButton', 'Save Details')} - savingMessage={Utils.localizeMessage('multiselect.savingDetailsButton', 'Saving...')} + defaultMessage={Utils.localizeMessage({id: 'multiselect.saveDetailsButton', defaultMessage: 'Save Details'})} + savingMessage={Utils.localizeMessage({id: 'multiselect.savingDetailsButton', defaultMessage: 'Saving...'})} />
diff --git a/webapp/channels/src/components/user_group_popover/group_member_list/group_member_list.tsx b/webapp/channels/src/components/user_group_popover/group_member_list/group_member_list.tsx index 19df2ec9a3..83f5b3125a 100644 --- a/webapp/channels/src/components/user_group_popover/group_member_list/group_member_list.tsx +++ b/webapp/channels/src/components/user_group_popover/group_member_list/group_member_list.tsx @@ -239,7 +239,7 @@ const GroupMemberList = (props: Props) => { } else if (searchState === Load.FAILED) { return ( - {Utils.localizeMessage('group_member_list.searchError', 'There was a problem getting results. Clear your search term and try again.')} + {Utils.localizeMessage({id: 'group_member_list.searchError', defaultMessage: 'There was a problem getting results. Clear your search term and try again.'})} ); } else if (isSearching && members.length === 0) { @@ -255,12 +255,12 @@ const GroupMemberList = (props: Props) => { return ( - {Utils.localizeMessage('group_member_list.loadError', 'Oops! Something went wrong while loading this group.')} + {Utils.localizeMessage({id: 'group_member_list.loadError', defaultMessage: 'Oops! Something went wrong while loading this group.'})} {' '} - {Utils.localizeMessage('group_member_list.retryLoadButton', 'Retry')} + {Utils.localizeMessage({id: 'group_member_list.retryLoadButton', defaultMessage: 'Retry'})} diff --git a/webapp/channels/src/components/user_groups_modal/user_groups_list/user_groups_list.tsx b/webapp/channels/src/components/user_groups_modal/user_groups_list/user_groups_list.tsx index 0f79f7f4ac..72264d408a 100644 --- a/webapp/channels/src/components/user_groups_modal/user_groups_list/user_groups_list.tsx +++ b/webapp/channels/src/components/user_groups_modal/user_groups_list/user_groups_list.tsx @@ -171,7 +171,7 @@ const UserGroupsList = (props: Props) => { openLeft={true} openUp={groupListOpenUp(index)} className={'group-actions-menu'} - ariaLabel={Utils.localizeMessage('admin.user_item.menuAriaLabel', 'User Actions Menu')} + ariaLabel={Utils.localizeMessage({id: 'admin.user_item.menuAriaLabel', defaultMessage: 'User Actions Menu'})} > { goToViewGroupModal(group); }} icon={} - text={Utils.localizeMessage('user_groups_modal.viewGroup', 'View Group')} + text={Utils.localizeMessage({id: 'user_groups_modal.viewGroup', defaultMessage: 'View Group'})} disabled={false} /> @@ -190,7 +190,7 @@ const UserGroupsList = (props: Props) => { archiveGroup(group.id); }} icon={} - text={Utils.localizeMessage('user_groups_modal.archiveGroup', 'Archive Group')} + text={Utils.localizeMessage({id: 'user_groups_modal.archiveGroup', defaultMessage: 'Archive Group'})} disabled={false} isDangerous={true} /> @@ -200,7 +200,7 @@ const UserGroupsList = (props: Props) => { restoreGroup(group.id); }} icon={} - text={Utils.localizeMessage('user_groups_modal.restoreGroup', 'Restore Group')} + text={Utils.localizeMessage({id: 'user_groups_modal.restoreGroup', defaultMessage: 'Restore Group'})} disabled={false} /> diff --git a/webapp/channels/src/components/user_groups_modal/user_groups_modal.tsx b/webapp/channels/src/components/user_groups_modal/user_groups_modal.tsx index 66b2e5957f..387f3adf96 100644 --- a/webapp/channels/src/components/user_groups_modal/user_groups_modal.tsx +++ b/webapp/channels/src/components/user_groups_modal/user_groups_modal.tsx @@ -198,7 +198,7 @@ const UserGroupsModal = (props: Props) => {
{ { diff --git a/webapp/channels/src/components/user_settings/notifications/manage_auto_responder/manage_auto_responder.tsx b/webapp/channels/src/components/user_settings/notifications/manage_auto_responder/manage_auto_responder.tsx index 619962abd1..2602737887 100644 --- a/webapp/channels/src/components/user_settings/notifications/manage_auto_responder/manage_auto_responder.tsx +++ b/webapp/channels/src/components/user_settings/notifications/manage_auto_responder/manage_auto_responder.tsx @@ -75,7 +75,7 @@ export default class ManageAutoResponder extends React.PureComponent { id='autoResponderMessageInput' className='form-control' rows={5} - placeholder={localizeMessage('user.settings.notifications.autoResponderPlaceholder', 'Message')} + placeholder={localizeMessage({id: 'user.settings.notifications.autoResponderPlaceholder', defaultMessage: 'Message'})} value={autoResponderMessage} maxLength={MESSAGE_MAX_LENGTH} onChange={this.onMessageChanged} diff --git a/webapp/channels/src/components/user_settings/security/user_access_token_section/user_access_token_section.tsx b/webapp/channels/src/components/user_settings/security/user_access_token_section/user_access_token_section.tsx index b03a4fa0a1..27db2cf738 100644 --- a/webapp/channels/src/components/user_settings/security/user_access_token_section/user_access_token_section.tsx +++ b/webapp/channels/src/components/user_settings/security/user_access_token_section/user_access_token_section.tsx @@ -127,7 +127,7 @@ export default class UserAccessTokenSection extends React.PureComponent { diff --git a/webapp/channels/src/components/view_user_group_modal/view_user_group_modal.tsx b/webapp/channels/src/components/view_user_group_modal/view_user_group_modal.tsx index 68d3e0c38b..fe7264ab2e 100644 --- a/webapp/channels/src/components/view_user_group_modal/view_user_group_modal.tsx +++ b/webapp/channels/src/components/view_user_group_modal/view_user_group_modal.tsx @@ -221,7 +221,7 @@ export default class ViewUserGroupModal extends React.PureComponent { const hasDivider = s.id === 'ChannelMenu-moveToDivider'; let aria = ariaLabel; if (s.action) { - aria = s.text === selectedValueText ? s.text + ' ' + Utils.localizeMessage('sidebar.menu.item.selected', 'selected') : s.text + ' ' + Utils.localizeMessage('sidebar.menu.item.notSelected', 'not selected'); + aria = s.text === selectedValueText ? s.text + ' ' + Utils.localizeMessage({id: 'sidebar.menu.item.selected', defaultMessage: 'selected'}) : s.text + ' ' + Utils.localizeMessage({id: 'sidebar.menu.item.notSelected', defaultMessage: 'not selected'}); } return ( { }
diff --git a/webapp/channels/src/packages/mattermost-redux/src/utils/i18n_utils.test.ts b/webapp/channels/src/packages/mattermost-redux/src/utils/i18n_utils.test.ts index ceef1a10f2..cec622ed18 100644 --- a/webapp/channels/src/packages/mattermost-redux/src/utils/i18n_utils.test.ts +++ b/webapp/channels/src/packages/mattermost-redux/src/utils/i18n_utils.test.ts @@ -9,7 +9,7 @@ describe('i18n utils', () => { }); it('should return default message', () => { - expect(localizeMessage('someting.string', 'defaultString')).toBe('defaultString'); + expect(localizeMessage({id: 'someting.string', defaultMessage: 'defaultString'})).toBe('defaultString'); }); it('should return previously set Localized function return value', () => { @@ -18,6 +18,6 @@ describe('i18n utils', () => { } setLocalizeFunction(mockFunc); - expect(localizeMessage('someting.string', 'defaultString')).toBe('test'); + expect(localizeMessage({id: 'someting.string', defaultMessage: 'defaultString'})).toBe('test'); }); }); diff --git a/webapp/channels/src/packages/mattermost-redux/src/utils/i18n_utils.ts b/webapp/channels/src/packages/mattermost-redux/src/utils/i18n_utils.ts index 9dcf187308..37e0698aa2 100644 --- a/webapp/channels/src/packages/mattermost-redux/src/utils/i18n_utils.ts +++ b/webapp/channels/src/packages/mattermost-redux/src/utils/i18n_utils.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -type LocalizeFunc = (id: string, defaultMessage: string) => string; +type LocalizeFunc = (descriptor: {id: string; defaultMessage?: string}) => string; let localizeFunction: LocalizeFunc; @@ -9,10 +9,10 @@ export function setLocalizeFunction(func: LocalizeFunc) { localizeFunction = func; } -export function localizeMessage(id: string, defaultMessage: string): string { +export function localizeMessage(descriptor: {id: string; defaultMessage?: string}): string { if (!localizeFunction) { - return defaultMessage; + return descriptor.defaultMessage ?? ''; } - return localizeFunction(id, defaultMessage); + return localizeFunction(descriptor); } diff --git a/webapp/channels/src/packages/mattermost-redux/src/utils/user_utils.ts b/webapp/channels/src/packages/mattermost-redux/src/utils/user_utils.ts index 0a54aa6052..8a113e3358 100644 --- a/webapp/channels/src/packages/mattermost-redux/src/utils/user_utils.ts +++ b/webapp/channels/src/packages/mattermost-redux/src/utils/user_utils.ts @@ -27,7 +27,7 @@ export function displayUsername( teammateNameDisplay: string, useFallbackUsername = true, ): string { - let name = useFallbackUsername ? localizeMessage('channel_loader.someone', 'Someone') : ''; + let name = useFallbackUsername ? localizeMessage({id: 'channel_loader.someone', defaultMessage: 'Someone'}) : ''; if (user) { if (teammateNameDisplay === Preferences.DISPLAY_PREFER_NICKNAME) { name = user.nickname || getFullName(user); diff --git a/webapp/channels/src/selectors/rhs.ts b/webapp/channels/src/selectors/rhs.ts index ab3d54ac53..66aa540ea9 100644 --- a/webapp/channels/src/selectors/rhs.ts +++ b/webapp/channels/src/selectors/rhs.ts @@ -91,7 +91,7 @@ export const getSelectedPost = createSelector( id: selectedPostId, exists: false, type: PostTypes.FAKE_PARENT_DELETED as PostType, - message: localizeMessage('rhs_thread.rootPostDeletedMessage.body', 'Part of this thread has been deleted due to a data retention policy. You can no longer reply to this thread.'), + message: localizeMessage({id: 'rhs_thread.rootPostDeletedMessage.body', defaultMessage: 'Part of this thread has been deleted due to a data retention policy. You can no longer reply to this thread.'}), channel_id: selectedPostChannelId, user_id: currentUserId, reply_count: 0, diff --git a/webapp/channels/src/utils/utils.test.tsx b/webapp/channels/src/utils/utils.test.tsx index 207cdab002..e26f15b002 100644 --- a/webapp/channels/src/utils/utils.test.tsx +++ b/webapp/channels/src/utils/utils.test.tsx @@ -176,15 +176,18 @@ describe('Utils.localizeMessage', () => { }); test('with translations', () => { - expect(Utils.localizeMessage('test.hello_world', 'Hello, World!')).toEqual('Bonjour tout le monde!'); + const messageId = 'test.hello_world'; + expect(Utils.localizeMessage({id: messageId, defaultMessage: 'Hello, World!'})).toEqual('Bonjour tout le monde!'); }); test('with missing string in translations', () => { - expect(Utils.localizeMessage('test.hello_world2', 'Hello, World 2!')).toEqual('Hello, World 2!'); + const messageId = 'test.hello_world2'; + expect(Utils.localizeMessage({id: messageId, defaultMessage: 'Hello, World 2!'})).toEqual('Hello, World 2!'); }); test('with missing string in translations and no default', () => { - expect(Utils.localizeMessage('test.hello_world2')).toEqual('test.hello_world2'); + const messageId = 'test.hello_world2'; + expect(Utils.localizeMessage({id: messageId})).toEqual('test.hello_world2'); }); }); @@ -201,11 +204,13 @@ describe('Utils.localizeMessage', () => { }); test('without translations', () => { - expect(Utils.localizeMessage('test.hello_world', 'Hello, World!')).toEqual('Hello, World!'); + const messageId = 'test.hello_world'; + expect(Utils.localizeMessage({id: messageId, defaultMessage: 'Hello, World!'})).toEqual('Hello, World!'); }); test('without translations and no default', () => { - expect(Utils.localizeMessage('test.hello_world')).toEqual('test.hello_world'); + const messageId = 'test.hello_world'; + expect(Utils.localizeMessage({id: messageId})).toEqual('test.hello_world'); }); }); }); diff --git a/webapp/channels/src/utils/utils.tsx b/webapp/channels/src/utils/utils.tsx index 059b322dd0..eda0a3db0e 100644 --- a/webapp/channels/src/utils/utils.tsx +++ b/webapp/channels/src/utils/utils.tsx @@ -1181,7 +1181,7 @@ export function clearFileInput(elm: HTMLInputElement) { /** * @deprecated Use react-intl instead, only place its usage can be justified is in the redux actions */ -export function localizeMessage(id: string, defaultMessage?: string) { +export function localizeMessage({id, defaultMessage}: {id: string; defaultMessage?: string}) { const state = store.getState(); const locale = getCurrentLocale(state); @@ -1197,8 +1197,8 @@ export function localizeMessage(id: string, defaultMessage?: string) { /** * @deprecated If possible, use intl.formatMessage instead. If you have to use this, remember to mark the id using `t` */ -export function localizeAndFormatMessage(id: string, defaultMessage: string, template: { [name: string]: any } | undefined) { - const base = localizeMessage(id, defaultMessage); +export function localizeAndFormatMessage(descriptor: {id: string; defaultMessage?: string}, template: { [name: string]: any } | undefined) { + const base = localizeMessage(descriptor); if (!template) { return base; diff --git a/webapp/package-lock.json b/webapp/package-lock.json index c26f81173a..8de88b2907 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -154,6 +154,7 @@ "@hot-loader/react-dom": "17.0.2", "@mattermost/calls-common": "0.27.0", "@mattermost/eslint-plugin": "*", + "@mattermost/mmjstool": "github:mattermost/mattermost-utilities#7b63833d208d482ba4a1c12230bb3e68dd9c5e5e", "@redux-devtools/extension": "3.2.3", "@stylistic/stylelint-plugin": "2.1.0", "@testing-library/jest-dom": "5.16.4", @@ -211,7 +212,6 @@ "jest-environment-jsdom": "29.7.0", "jest-junit": "16.0.0", "jest-watch-typeahead": "2.2.2", - "mmjstool": "github:mattermost/mattermost-utilities#73e61d2ede0ebf802492df4cfbac481d35efed54", "nock": "13.2.8", "prettier": "2.3.2", "react-router-enzyme-context": "1.2.0", @@ -4327,6 +4327,177 @@ "resolved": "platform/eslint-plugin", "link": true }, + "node_modules/@mattermost/mmjstool": { + "name": "mmjstool", + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/mattermost/mattermost-utilities.git#abf31bebf7d678321b8b19d875beeebcc3c126f1", + "integrity": "sha512-rO/erucxfGQLYeDulzTmbVAk89tA29eBsrXblZDKfot9/kBeevum4DXelQQPZbwziEo6ykmOAByNalmZglF8Hw==", + "dev": true, + "dependencies": { + "estree-walk": "^2.2.0", + "filehound": "^1.17.5", + "sort-json": "^2.0.0", + "webpack-cli": "^4.9.1", + "yargs": "^17.3.1" + }, + "bin": { + "mmjstool": "bin/mmjstool" + } + }, + "node_modules/@mattermost/mmjstool/node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@mattermost/mmjstool/node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@mattermost/mmjstool/node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@mattermost/mmjstool/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mattermost/mmjstool/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mattermost/mmjstool/node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@mattermost/mmjstool/node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@mattermost/mmjstool/node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@mattermost/mmjstool/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mattermost/mmjstool/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@mattermost/types": { "resolved": "platform/types", "link": true @@ -17030,166 +17201,6 @@ "node": ">=10" } }, - "node_modules/mmjstool": { - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/mattermost/mattermost-utilities.git#73e61d2ede0ebf802492df4cfbac481d35efed54", - "integrity": "sha512-FnyR3NE3UWkEwmhomKmArHxL3BIjZ2MCCiPX8L/hkDcCTsO5YCgrGzT9OBvJeQnB1RrIIu2Rm9DsK8k4NkCCQA==", - "dev": true, - "dependencies": { - "estree-walk": "^2.2.0", - "filehound": "^1.17.5", - "sort-json": "^2.0.0", - "webpack-cli": "^4.9.1", - "yargs": "^17.3.1" - }, - "bin": { - "mmjstool": "bin/mmjstool" - } - }, - "node_modules/mmjstool/node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/mmjstool/node_modules/@webpack-cli/info": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/mmjstool/node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/mmjstool/node_modules/cliui": { - "version": "8.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mmjstool/node_modules/commander": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/mmjstool/node_modules/interpret": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/mmjstool/node_modules/rechoir": { - "version": "0.7.1", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/mmjstool/node_modules/webpack-cli": { - "version": "4.10.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/mmjstool/node_modules/yargs": { - "version": "17.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mmjstool/node_modules/yargs-parser": { - "version": "21.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/moment": { "version": "2.29.4", "license": "MIT",