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');