diff --git a/awx/ui_next/src/components/Lookup/Lookup.jsx b/awx/ui_next/src/components/Lookup/Lookup.jsx index b398c007ce..a0ee8e649f 100644 --- a/awx/ui_next/src/components/Lookup/Lookup.jsx +++ b/awx/ui_next/src/components/Lookup/Lookup.jsx @@ -269,7 +269,6 @@ class Lookup extends React.Component { items={results} itemCount={count} itemName={lookupHeader} - itemNamePlural={lookupHeader} qsConfig={this.qsConfig} toolbarColumns={columns} renderItem={item => ( diff --git a/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx b/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx index d238595212..b8f882dea9 100644 --- a/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx +++ b/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx @@ -17,7 +17,7 @@ import { parseQueryString, addParams, } from '@util/qs'; -import { pluralize, ucFirst } from '@util/strings'; +import { ucFirst } from '@util/strings'; import { QSConfig } from '@types'; @@ -64,7 +64,6 @@ class PaginatedDataList extends React.Component { renderItem, toolbarColumns, itemName, - itemNamePlural, showPageSizeOptions, location, i18n, @@ -82,10 +81,8 @@ class PaginatedDataList extends React.Component { ]; const queryParams = parseQueryString(qsConfig, location.search); - const itemDisplayName = ucFirst(pluralize(itemName)); - const itemDisplayNamePlural = ucFirst( - itemNamePlural || pluralize(itemName) - ); + const itemDisplayName = ucFirst(itemName); + const itemDisplayNamePlural = ucFirst(itemName); const dataListLabel = i18n._(t`${itemDisplayName} List`); const emptyContentMessage = i18n._( @@ -164,7 +161,6 @@ PaginatedDataList.propTypes = { items: PropTypes.arrayOf(Item).isRequired, itemCount: PropTypes.number.isRequired, itemName: PropTypes.string, - itemNamePlural: PropTypes.string, qsConfig: QSConfig.isRequired, renderItem: PropTypes.func, toolbarColumns: arrayOf( @@ -185,7 +181,6 @@ PaginatedDataList.defaultProps = { contentError: null, toolbarColumns: [], itemName: 'item', - itemNamePlural: '', showPageSizeOptions: true, renderItem: item => , renderToolbar: props => , diff --git a/awx/ui_next/src/components/PaginatedDataList/ToolbarDeleteButton.jsx b/awx/ui_next/src/components/PaginatedDataList/ToolbarDeleteButton.jsx index c324faf016..22d0064847 100644 --- a/awx/ui_next/src/components/PaginatedDataList/ToolbarDeleteButton.jsx +++ b/awx/ui_next/src/components/PaginatedDataList/ToolbarDeleteButton.jsx @@ -85,9 +85,7 @@ class ToolbarDeleteButton extends React.Component { return (
{i18n._( - t`You do not have permission to delete the following ${pluralize( - itemName - )}: ${itemsUnableToDelete}` + t`You do not have permission to delete the following ${itemName}: ${itemsUnableToDelete}` )}
); @@ -125,11 +123,7 @@ class ToolbarDeleteButton extends React.Component { {isModalOpen && ( @@ -160,7 +160,7 @@ class JobList extends Component { hasContentLoading={hasContentLoading} items={jobs} itemCount={itemCount} - itemName={itemName} + itemName={itemCount === 1 ? i18n._(t`Job`): i18n._(t`Jobs`)} qsConfig={QS_CONFIG} toolbarColumns={[ { @@ -189,7 +189,7 @@ class JobList extends Component { key="delete" onDelete={this.handleJobDelete} itemsToDelete={selected} - itemName={itemName} + itemName={selected.length === 1 ? i18n._(t`Job`): i18n._(t`Jobs`)} />, ]} /> diff --git a/awx/ui_next/src/screens/Organization/OrganizationAccess/OrganizationAccess.jsx b/awx/ui_next/src/screens/Organization/OrganizationAccess/OrganizationAccess.jsx index 4c3c20d2ec..e5ec016a72 100644 --- a/awx/ui_next/src/screens/Organization/OrganizationAccess/OrganizationAccess.jsx +++ b/awx/ui_next/src/screens/Organization/OrganizationAccess/OrganizationAccess.jsx @@ -165,7 +165,7 @@ class OrganizationAccess extends React.Component { hasContentLoading={hasContentLoading} items={accessRecords} itemCount={itemCount} - itemName="role" + itemName={itemCount.length === 1 ? i18n._(t`Role`): i18n._(t`Roles`)} qsConfig={QS_CONFIG} toolbarColumns={[ { diff --git a/awx/ui_next/src/screens/Organization/OrganizationAccess/__snapshots__/OrganizationAccess.test.jsx.snap b/awx/ui_next/src/screens/Organization/OrganizationAccess/__snapshots__/OrganizationAccess.test.jsx.snap index 78cf3807ad..c5440db492 100644 --- a/awx/ui_next/src/screens/Organization/OrganizationAccess/__snapshots__/OrganizationAccess.test.jsx.snap +++ b/awx/ui_next/src/screens/Organization/OrganizationAccess/__snapshots__/OrganizationAccess.test.jsx.snap @@ -37,7 +37,7 @@ exports[` initially renders succesfully 1`] = ` error={null} hasContentLoading={true} itemCount={0} - itemName="role" + itemName="Roles" items={Array []} qsConfig={ Object { @@ -91,7 +91,7 @@ exports[` initially renders succesfully 1`] = ` hasContentLoading={true} i18n={"/i18n/"} itemCount={0} - itemName="role" + itemName="Roles" items={Array []} qsConfig={ Object { @@ -144,8 +144,7 @@ exports[` initially renders succesfully 1`] = ` history={"/history/"} i18n={"/i18n/"} itemCount={0} - itemName="role" - itemNamePlural="" + itemName="Roles" items={Array []} location={ Object { diff --git a/awx/ui_next/src/screens/Organization/OrganizationList/OrganizationList.jsx b/awx/ui_next/src/screens/Organization/OrganizationList/OrganizationList.jsx index 3bcd6ff9a5..51684e93e3 100644 --- a/awx/ui_next/src/screens/Organization/OrganizationList/OrganizationList.jsx +++ b/awx/ui_next/src/screens/Organization/OrganizationList/OrganizationList.jsx @@ -153,7 +153,7 @@ class OrganizationsList extends Component { hasContentLoading={hasContentLoading} items={organizations} itemCount={itemCount} - itemName="organization" + itemName={itemCount === 1 ? i18n._(t`Organization`): i18n._(t`Organizations`)} qsConfig={QS_CONFIG} toolbarColumns={[ { diff --git a/awx/ui_next/src/screens/Organization/OrganizationNotifications/OrganizationNotifications.jsx b/awx/ui_next/src/screens/Organization/OrganizationNotifications/OrganizationNotifications.jsx index 4699c43aa2..6c34267121 100644 --- a/awx/ui_next/src/screens/Organization/OrganizationNotifications/OrganizationNotifications.jsx +++ b/awx/ui_next/src/screens/Organization/OrganizationNotifications/OrganizationNotifications.jsx @@ -204,7 +204,7 @@ class OrganizationNotifications extends Component { hasContentLoading={hasContentLoading} items={notifications} itemCount={itemCount} - itemName="notification" + itemName={itemCount.length === 1 ? i18n._(t`Notification`): i18n._(t`Notifications`)} qsConfig={QS_CONFIG} toolbarColumns={COLUMNS} renderItem={notification => ( diff --git a/awx/ui_next/src/screens/Organization/OrganizationNotifications/__snapshots__/OrganizationNotifications.test.jsx.snap b/awx/ui_next/src/screens/Organization/OrganizationNotifications/__snapshots__/OrganizationNotifications.test.jsx.snap index 8116327545..ef7859326c 100644 --- a/awx/ui_next/src/screens/Organization/OrganizationNotifications/__snapshots__/OrganizationNotifications.test.jsx.snap +++ b/awx/ui_next/src/screens/Organization/OrganizationNotifications/__snapshots__/OrganizationNotifications.test.jsx.snap @@ -42,7 +42,7 @@ exports[` initially renders succesfully 1`] = ` contentError={null} hasContentLoading={false} itemCount={2} - itemName="notification" + itemName="Notifications" items={ Array [ Object { @@ -116,7 +116,7 @@ exports[` initially renders succesfully 1`] = ` hasContentLoading={false} i18n={"/i18n/"} itemCount={2} - itemName="notification" + itemName="Notifications" items={ Array [ Object { @@ -188,8 +188,7 @@ exports[` initially renders succesfully 1`] = ` history={"/history/"} i18n={"/i18n/"} itemCount={2} - itemName="notification" - itemNamePlural="" + itemName="Notifications" items={ Array [ Object { diff --git a/awx/ui_next/src/screens/Organization/OrganizationTeams/OrganizationTeams.jsx b/awx/ui_next/src/screens/Organization/OrganizationTeams/OrganizationTeams.jsx index faa9d4b359..636f826cc7 100644 --- a/awx/ui_next/src/screens/Organization/OrganizationTeams/OrganizationTeams.jsx +++ b/awx/ui_next/src/screens/Organization/OrganizationTeams/OrganizationTeams.jsx @@ -1,6 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import { withRouter } from 'react-router-dom'; +import { t } from '@lingui/macro'; +import { withI18n } from '@lingui/react'; import { OrganizationsAPI } from '@api'; import PaginatedDataList from '@components/PaginatedDataList'; @@ -59,13 +61,14 @@ class OrganizationTeams extends React.Component { render() { const { contentError, hasContentLoading, teams, itemCount } = this.state; + const { i18n } = this.props; return ( ); @@ -77,4 +80,4 @@ OrganizationTeams.propTypes = { }; export { OrganizationTeams as _OrganizationTeams }; -export default withRouter(OrganizationTeams); +export default withI18n()(withRouter(OrganizationTeams)); diff --git a/awx/ui_next/src/screens/Template/TemplateList/TemplateList.jsx b/awx/ui_next/src/screens/Template/TemplateList/TemplateList.jsx index 90c4482936..1c4542ffae 100644 --- a/awx/ui_next/src/screens/Template/TemplateList/TemplateList.jsx +++ b/awx/ui_next/src/screens/Template/TemplateList/TemplateList.jsx @@ -178,7 +178,7 @@ class TemplatesList extends Component { hasContentLoading={hasContentLoading} items={templates} itemCount={itemCount} - itemName={i18n._(t`Template`)} + itemName={itemCount === 1 ? i18n._(t`Template`): i18n._(t`Templates`)} qsConfig={QS_CONFIG} toolbarColumns={[ { @@ -213,7 +213,7 @@ class TemplatesList extends Component { key="delete" onDelete={this.handleTemplateDelete} itemsToDelete={selected} - itemName={i18n._(t`Template`)} + itemName={selected.length === 1 ? i18n._(t`Template`): i18n._(t`Templates`)} />, canAdd && ( { - describe('pluralize', () => { - test('should add an "s"', () => { - expect(pluralize('team')).toEqual('teams'); - }); - - test('should add an "es"', () => { - expect(pluralize('class')).toEqual('classes'); - }); - - test('should handle word ending in y', () => { - expect(pluralize('inventory')).toEqual('inventories'); - }); - }); - describe('getArticle', () => { test('should return "a"', () => { expect(getArticle('team')).toEqual('a');