diff --git a/features/search/FilterDialog.test.tsx b/features/search/FilterDialog.test.tsx
index a6d65a40c9..99c823873d 100644
--- a/features/search/FilterDialog.test.tsx
+++ b/features/search/FilterDialog.test.tsx
@@ -1,16 +1,6 @@
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { hostingStatusLabels } from "features/profile/constants";
-import {
- APPLY_FILTER,
- HOSTING_STATUS,
- LAST_ACTIVE,
- LAST_WEEK,
- LOCATION,
- MUST_HAVE_LOCATION,
- NUM_GUESTS,
- PROFILE_KEYWORDS,
-} from "features/search/constants";
import useRouteWithSearchFilters from "features/search/useRouteWithSearchFilters";
import mockRouter from "next-router-mock";
import { HostingStatus } from "proto/api_pb";
@@ -48,19 +38,29 @@ describe("FilterDialog", () => {
wrapper,
});
- const locationInput = screen.getByLabelText(LOCATION);
+ const locationInput = screen.getByLabelText(
+ t("search:form.location_field_label")
+ );
userEvent.type(locationInput, "tes{enter}");
const locationItem = await screen.findByText("test city, test country");
userEvent.click(locationItem);
- const keywordsInput = screen.getByLabelText(PROFILE_KEYWORDS);
+ const keywordsInput = screen.getByLabelText(
+ t("search:form.keywords.field_label")
+ );
userEvent.type(keywordsInput, "keyword1");
- const lastActiveInput = screen.getByLabelText(LAST_ACTIVE);
+ const lastActiveInput = screen.getByLabelText(
+ t("search:form.host_filters.last_active_field_label")
+ );
userEvent.click(lastActiveInput);
- userEvent.click(screen.getByText(LAST_WEEK));
+ userEvent.click(
+ screen.getByText(t("search:last_active_options.last_week"))
+ );
- const hostStatusInput = screen.getByLabelText(HOSTING_STATUS);
+ const hostStatusInput = screen.getByLabelText(
+ t("search:form.host_filters.hosting_status_field_label")
+ );
userEvent.click(hostStatusInput);
userEvent.click(
screen.getByText(
@@ -74,7 +74,9 @@ describe("FilterDialog", () => {
)
);
- const numGuestsInput = screen.getByLabelText(NUM_GUESTS);
+ const numGuestsInput = screen.getByLabelText(
+ t("search:form.accommodation_filters.guests_field_label")
+ );
userEvent.type(numGuestsInput, "3");
const expectedFilters = {
@@ -87,7 +89,11 @@ describe("FilterDialog", () => {
numGuests: 3,
};
- userEvent.click(screen.getByRole("button", { name: APPLY_FILTER }));
+ userEvent.click(
+ screen.getByRole("button", {
+ name: t("search:form.submit_button_label"),
+ })
+ );
await waitFor(() => {
expect(parsedQueryToSearchFilters(mockRouter.query)).toMatchObject(
@@ -106,23 +112,27 @@ describe("FilterDialog", () => {
wrapper,
});
- const locationInput = screen.getByLabelText(LOCATION) as HTMLInputElement;
+ const locationInput = screen.getByLabelText(
+ t("search:form.location_field_label")
+ ) as HTMLInputElement;
const keywordInput = screen.getByLabelText(
- PROFILE_KEYWORDS
+ t("search:form.keywords.field_label")
) as HTMLInputElement;
const lastActiveInput = screen.getByLabelText(
- LAST_ACTIVE
+ t("search:form.host_filters.last_active_field_label")
) as HTMLInputElement;
const hostStatusInput = screen.getByLabelText(
- HOSTING_STATUS
+ t("search:form.host_filters.hosting_status_field_label")
) as HTMLInputElement;
const numGuestsInput = screen.getByLabelText(
- NUM_GUESTS
+ t("search:form.accommodation_filters.guests_field_label")
) as HTMLInputElement;
expect(locationInput).toHaveValue("test location");
expect(keywordInput).toHaveValue("keyword1");
- expect(lastActiveInput).toHaveValue(LAST_WEEK);
+ expect(lastActiveInput).toHaveValue(
+ t("search:last_active_options.last_week")
+ );
expect(
screen.getByRole("button", {
name: hostingStatusLabels(t)[HostingStatus.HOSTING_STATUS_CAN_HOST],
@@ -164,11 +174,17 @@ describe("FilterDialog", () => {
render(, {
wrapper,
});
- const lastActiveInput = screen.getByLabelText(LAST_ACTIVE);
+ const lastActiveInput = screen.getByLabelText(
+ t("search:form.host_filters.last_active_field_label")
+ );
userEvent.click(lastActiveInput);
- userEvent.click(screen.getByText(LAST_WEEK));
+ userEvent.click(
+ screen.getByText(t("search:last_active_options.last_week"))
+ );
- const hostStatusInput = screen.getByLabelText(HOSTING_STATUS);
+ const hostStatusInput = screen.getByLabelText(
+ t("search:form.host_filters.hosting_status_field_label")
+ );
userEvent.click(hostStatusInput);
userEvent.click(
screen.getByText(
@@ -182,12 +198,20 @@ describe("FilterDialog", () => {
)
);
- const numGuestsInput = screen.getByLabelText(NUM_GUESTS);
+ const numGuestsInput = screen.getByLabelText(
+ t("search:form.accommodation_filters.guests_field_label")
+ );
userEvent.type(numGuestsInput, "3");
- userEvent.click(screen.getByRole("button", { name: APPLY_FILTER }));
+ userEvent.click(
+ screen.getByRole("button", {
+ name: t("search:form.submit_button_label"),
+ })
+ );
await waitFor(() => {
- const errors = screen.getAllByText(MUST_HAVE_LOCATION);
+ const errors = screen.getAllByText(
+ t("search:form.missing_location_validation_error")
+ );
expect(errors).toHaveLength(3);
expect(parsedQueryToSearchFilters(mockRouter.query)).toMatchObject({});
});
diff --git a/features/search/FilterDialog.tsx b/features/search/FilterDialog.tsx
index 1c92643c3f..539b9d5233 100644
--- a/features/search/FilterDialog.tsx
+++ b/features/search/FilterDialog.tsx
@@ -31,21 +31,7 @@ import { useQueryClient } from "react-query";
import { GeocodeResult } from "utils/hooks";
import SearchFilters from "utils/searchFilters";
-import {
- ACCOMODATION_FILTERS,
- APPLY_FILTER,
- CLEAR_SEARCH,
- FILTER_DIALOG_TITLE_DESKTOP,
- FILTER_DIALOG_TITLE_MOBILE,
- HOST_FILTERS,
- HOSTING_STATUS,
- LAST_ACTIVE,
- lastActiveOptions,
- LOCATION,
- MUST_HAVE_LOCATION,
- NUM_GUESTS,
- PROFILE_KEYWORDS,
-} from "./constants";
+import { getLastActiveOptions } from "./constants";
const hostingStatusOptions = [
HostingStatus.HOSTING_STATUS_CAN_HOST,
@@ -64,7 +50,7 @@ const useStyles = makeStyles((theme) => ({
interface FilterDialogFormData
extends Omit {
location: GeocodeResult | "";
- lastActive: typeof lastActiveOptions[number];
+ lastActive: ReturnType[number];
}
export default function FilterDialog({
@@ -135,7 +121,7 @@ export default function FilterDialog({
)
return true;
return getValues("location") === "" || !getValues("location")
- ? MUST_HAVE_LOCATION
+ ? t("search:form.missing_location_validation_error")
: true;
};
@@ -143,6 +129,8 @@ export default function FilterDialog({
theme.breakpoints.down("sm")
);
+ const lastActiveOptions = getLastActiveOptions(t);
+
return (
diff --git a/features/search/SearchBox.test.tsx b/features/search/SearchBox.test.tsx
index 9bffa6651e..93a6ec40e3 100644
--- a/features/search/SearchBox.test.tsx
+++ b/features/search/SearchBox.test.tsx
@@ -1,19 +1,11 @@
import { render, screen, waitFor, within } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
-import {
- APPLY_FILTER,
- CLEAR_SEARCH,
- FILTER_DIALOG_TITLE_DESKTOP,
- LOCATION,
- PROFILE_KEYWORDS,
- SEARCH_BY_KEYWORD,
- SEARCH_BY_LOCATION,
-} from "features/search/constants";
import useRouteWithSearchFilters from "features/search/useRouteWithSearchFilters";
import mockRouter from "next-router-mock";
import { useEffect } from "react";
import wrapper from "test/hookWrapper";
import { server } from "test/restMock";
+import { t } from "test/utils";
import SearchFilters from "utils/searchFilters";
import SearchBox from "./SearchBox";
@@ -38,8 +30,10 @@ describe("SearchBox", () => {
it("performs a keyword search", async () => {
const setActive = jest.fn();
render(, { wrapper });
- userEvent.click(screen.getByLabelText(SEARCH_BY_KEYWORD));
- const input = screen.getByLabelText(PROFILE_KEYWORDS);
+ userEvent.click(
+ screen.getByLabelText(t("search:form.by_keyword_filter_label"))
+ );
+ const input = screen.getByLabelText(t("search:form.keywords.field_label"));
userEvent.type(input, "test search");
await waitFor(() => {
expect(setActive).toBeCalledWith({ query: "test search" });
@@ -56,7 +50,9 @@ describe("SearchBox", () => {
it("performs a location search", async () => {
const setActive = jest.fn();
render(, { wrapper });
- const input = screen.getByLabelText(LOCATION);
+ const input = screen.getByLabelText(
+ t("search:form.location_field_label")
+ );
userEvent.type(input, "tes{enter}");
userEvent.click(await screen.findByText("test city, test country"));
await waitFor(() => {
@@ -74,8 +70,10 @@ describe("SearchBox", () => {
render(, {
wrapper,
});
- expect(screen.getByLabelText(SEARCH_BY_KEYWORD)).toBeChecked();
- const input = screen.getByLabelText(PROFILE_KEYWORDS);
+ expect(
+ screen.getByLabelText(t("search:form.by_keyword_filter_label"))
+ ).toBeChecked();
+ const input = screen.getByLabelText(t("search:form.keywords.field_label"));
expect(input).toHaveValue("default value");
});
@@ -85,8 +83,10 @@ describe("SearchBox", () => {
wrapper,
});
//not easy to also test lat/lng, just test location text
- expect(screen.getByLabelText(SEARCH_BY_LOCATION)).toBeChecked();
- const input = screen.getByLabelText(LOCATION);
+ expect(
+ screen.getByLabelText(t("search:form.by_location_filter_label"))
+ ).toBeChecked();
+ const input = screen.getByLabelText(t("search:form.location_field_label"));
expect(input).toHaveValue("default value");
});
@@ -96,9 +96,13 @@ describe("SearchBox", () => {
render(, {
wrapper,
});
- const input = screen.getByLabelText(PROFILE_KEYWORDS);
+ const input = screen.getByLabelText(t("search:form.keywords.field_label"));
expect(input).toHaveValue("default value");
- userEvent.click(screen.getByRole("button", { name: CLEAR_SEARCH }));
+ userEvent.click(
+ screen.getByRole("button", {
+ name: t("search:form.keywords.clear_field_action_a11y_label"),
+ })
+ );
await waitFor(() => {
expect(input).toHaveValue("");
expect(setActive).toBeCalledWith({});
@@ -113,7 +117,7 @@ describe("SearchBox", () => {
render(, {
wrapper,
});
- const input = screen.getByLabelText(LOCATION);
+ const input = screen.getByLabelText(t("search:form.location_field_label"));
expect(input).toHaveValue("default location");
//button role doesn't seem to work, despite it being there
userEvent.click(await screen.findByTitle("Clear"));
@@ -126,25 +130,33 @@ describe("SearchBox", () => {
it("opens and closes the filter dialog, with changes applied to search box", async () => {
const setActive = jest.fn();
render(, { wrapper });
- userEvent.click(screen.getByLabelText(SEARCH_BY_KEYWORD));
- const input = screen.getByLabelText(PROFILE_KEYWORDS);
+ userEvent.click(
+ screen.getByLabelText(t("search:form.by_keyword_filter_label"))
+ );
+ const input = screen.getByLabelText(t("search:form.keywords.field_label"));
userEvent.type(input, "test search");
await waitFor(() => {
expect(setActive).toBeCalledWith({ query: "test search" });
});
userEvent.click(
- screen.getByRole("button", { name: FILTER_DIALOG_TITLE_DESKTOP })
+ screen.getByRole("button", {
+ name: t("search:filter_dialog.desktop_title"),
+ })
);
const dialog = screen.getByRole("dialog", {
- name: FILTER_DIALOG_TITLE_DESKTOP,
+ name: t("search:filter_dialog.desktop_title"),
});
expect(dialog).toBeVisible();
- const dialogKeywordsField = within(dialog).getByLabelText(PROFILE_KEYWORDS);
+ const dialogKeywordsField = within(dialog).getByLabelText(
+ t("search:form.keywords.field_label")
+ );
expect(dialogKeywordsField).toHaveValue("test search");
userEvent.clear(dialogKeywordsField);
userEvent.type(dialogKeywordsField, "new search");
- userEvent.click(screen.getByRole("button", { name: APPLY_FILTER }));
+ userEvent.click(
+ screen.getByRole("button", { name: t("search:form.submit_button_label") })
+ );
await waitFor(
() => {
expect(dialog).not.toBeVisible();
diff --git a/features/search/SearchBox.tsx b/features/search/SearchBox.tsx
index da204fbf5f..0c13552d78 100644
--- a/features/search/SearchBox.tsx
+++ b/features/search/SearchBox.tsx
@@ -18,6 +18,8 @@ import TextField from "components/TextField";
import { searchQueryKey } from "features/queryKeys";
import FilterDialog from "features/search/FilterDialog";
import useRouteWithSearchFilters from "features/search/useRouteWithSearchFilters";
+import { useTranslation } from "i18n";
+import { GLOBAL, SEARCH } from "i18n/namespaces";
import { LngLat } from "maplibre-gl";
import { ChangeEvent, useEffect, useState } from "react";
import { Controller, useForm } from "react-hook-form";
@@ -25,16 +27,6 @@ import { useQueryClient } from "react-query";
import { GeocodeResult } from "utils/hooks";
import makeStyles from "utils/makeStyles";
-import {
- CLEAR_SEARCH,
- FILTER_DIALOG_TITLE_DESKTOP,
- FILTER_DIALOG_TITLE_MOBILE,
- LOCATION,
- PROFILE_KEYWORDS,
- SEARCH_BY_KEYWORD,
- SEARCH_BY_LOCATION,
-} from "./constants";
-
const useStyles = makeStyles((theme) => ({
filterDialogButtonDesktop: {
marginInlineStart: "auto",
@@ -57,6 +49,7 @@ export default function SearchBox({
className?: string;
searchFilters: ReturnType;
}) {
+ const { t } = useTranslation([GLOBAL, SEARCH]);
const classes = useStyles();
const [isFiltersOpen, setIsFiltersOpen] = useState(false);
const [searchType, setSearchType] = useState<"location" | "keyword">(() =>
@@ -136,7 +129,7 @@ export default function SearchBox({
variant="contained"
size="medium"
>
- {FILTER_DIALOG_TITLE_MOBILE}
+ {t("search:filter_dialog.mobile_title")}
{filterDialog}
@@ -162,7 +155,7 @@ export default function SearchBox({
}
: ""
}
- label={LOCATION}
+ label={t("search:form.location_field_label")}
onChange={handleNewLocation}
fieldError={errors.location?.message}
disableRegions
@@ -177,7 +170,7 @@ export default function SearchBox({
fullWidth
id="query"
value={value}
- label={PROFILE_KEYWORDS}
+ label={t("search:form.keywords.field_label")}
variant="standard"
helperText=" "
onChange={(event) => {
@@ -188,7 +181,9 @@ export default function SearchBox({
endAdornment: (
{
setValue("query", "");
handleKeywordsChange("");
@@ -217,14 +212,18 @@ export default function SearchBox({
value="location"
control={}
label={
- {SEARCH_BY_LOCATION}
+
+ {t("search:form.by_location_filter_label")}
+
}
/>
}
label={
- {SEARCH_BY_KEYWORD}
+
+ {t("search:form.by_keyword_filter_label")}
+
}
/>
@@ -236,7 +235,7 @@ export default function SearchBox({
variant="outlined"
size="small"
>
- {FILTER_DIALOG_TITLE_DESKTOP}
+ {t("search:filter_dialog.desktop_title")}
{filterDialog}
diff --git a/features/search/SearchResult.tsx b/features/search/SearchResult.tsx
index 2fa10b0dfe..d5ce2b47c1 100644
--- a/features/search/SearchResult.tsx
+++ b/features/search/SearchResult.tsx
@@ -11,7 +11,7 @@ import {
AgeGenderLanguagesLabels,
ReferencesLastActiveLabels,
} from "features/profile/view/userLabels";
-import { aboutText, getShowUserOnMap } from "features/search/constants";
+import { aboutText } from "features/search/constants";
import { useTranslation } from "i18n";
import { GLOBAL, SEARCH } from "i18n/namespaces";
import { User } from "proto/api_pb";
@@ -135,7 +135,7 @@ export default function SearchResult({
- {stripMarkdown(aboutText(user))}
+ {stripMarkdown(aboutText(user, t))}
@@ -154,7 +154,9 @@ export default function SearchResult({
className={classes.mapButton}
size="small"
>
- {getShowUserOnMap(firstName(user.name))}
+ {t("search:search_result.show_user_button_label", {
+ name: firstName(user.name),
+ })}
diff --git a/features/search/SearchResultsList.test.tsx b/features/search/SearchResultsList.test.tsx
index 63c6a37920..2312b17d01 100644
--- a/features/search/SearchResultsList.test.tsx
+++ b/features/search/SearchResultsList.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
-import { getShowUserOnMap } from "features/search/constants";
import { Map } from "maplibre-gl";
import { UserSearchRes } from "proto/search_pb";
import { service } from "service";
@@ -11,6 +10,7 @@ import {
assertErrorAlert,
mockConsoleError,
MockedService,
+ t,
wait,
} from "test/utils";
import { firstName } from "utils/names";
@@ -134,7 +134,9 @@ describe("SearchResultsList", () => {
it("calls the handler when a result is clicked", async () => {
const card = await screen.findByRole("button", {
- name: getShowUserOnMap(firstName(users[0].name)),
+ name: t("search:search_result.show_user_button_label", {
+ name: firstName(users[0].name),
+ }),
});
userEvent.click(card);
await waitFor(() => {
diff --git a/features/search/SearchResultsList.tsx b/features/search/SearchResultsList.tsx
index 5fce1c9fd8..4f4c23bd93 100644
--- a/features/search/SearchResultsList.tsx
+++ b/features/search/SearchResultsList.tsx
@@ -4,12 +4,14 @@ import CircularProgress from "components/CircularProgress";
import HorizontalScroller from "components/HorizontalScroller";
import TextBody from "components/TextBody";
import { searchQueryKey } from "features/queryKeys";
-import { NO_USER_RESULTS, selectedUserZoom } from "features/search/constants";
+import { selectedUserZoom } from "features/search/constants";
import SearchBox from "features/search/SearchBox";
import SearchResult from "features/search/SearchResult";
import useRouteWithSearchFilters from "features/search/useRouteWithSearchFilters";
import { filterUsers } from "features/search/users";
import { useUser } from "features/userQueries/useUsers";
+import { useTranslation } from "i18n";
+import { SEARCH } from "i18n/namespaces";
import maplibregl, { LngLatBounds, Map as MaplibreMap } from "maplibre-gl";
import { User } from "proto/api_pb";
import { UserSearchRes } from "proto/search_pb";
@@ -98,6 +100,7 @@ export default function SearchResultsList({
selectedResult,
searchFilters,
}: SearchResultsListProps) {
+ const { t } = useTranslation(SEARCH);
const classes = useStyles();
const selectedUser = useUser(selectedResult);
@@ -230,7 +233,9 @@ export default function SearchResultsList({
)}
) : (
- {NO_USER_RESULTS}
+
+ {t("search_result.no_user_result_message")}
+
)
) : (
selectedResult && (
diff --git a/features/search/constants.ts b/features/search/constants.ts
index 713bc74a61..516e243ed7 100644
--- a/features/search/constants.ts
+++ b/features/search/constants.ts
@@ -1,52 +1,29 @@
+import { TFunction } from "i18n";
import maplibregl from "maplibre-gl";
import { User } from "proto/api_pb";
import { UserSearchFilters } from "service/search";
import { firstName } from "utils/names";
-export const aboutText = (user: User.AsObject) => {
+export const aboutText = (user: User.AsObject, t: TFunction) => {
const missingAbout = user.aboutMe.length === 0;
return missingAbout
- ? `${firstName(user?.name)} hasn't said anything about themselves yet`
+ ? t("search:search_result.missing_about_description", {
+ name: firstName(user?.name),
+ })
: user.aboutMe.length < 300
? user.aboutMe
: user.aboutMe.substring(0, 300) + "...";
};
-export const ACCOMODATION_FILTERS = "Accomodation filters";
-export const APPLY_FILTER = "Apply";
-export const CLEAR_SEARCH = "Clear search";
-export const FILTER_DIALOG_TITLE_DESKTOP = "Filters";
-export const FILTER_DIALOG_TITLE_MOBILE = "Search";
-export const HOST_FILTERS = "Host filters";
-export const HOSTING_STATUS = "Hosting status";
-export const LAST_2_WEEKS = "Last 2 weeks";
-export const LAST_3_MONTHS = "Last 3 months";
-export const LAST_ACTIVE = "Last active";
-export const LAST_DAY = "Last day";
-export const LAST_MONTH = "Last month";
-export const LAST_WEEK = "Last week";
-export const LOCATION = "Near location";
-export const MAP_PAGE = "Map page";
-export const MUST_HAVE_LOCATION = "Specify a location to use this filter";
-export const NUM_GUESTS = "Number of guests";
-export const NO_USER_RESULTS = "No users found.";
-export const PROFILE_KEYWORDS = "Profile keywords";
-export const SEARCH = "Search";
-export const SEARCH_BY_LOCATION = "By location";
-export const SEARCH_BY_KEYWORD = "By keyword";
-export const SHOWING_ALL = "Showing all users";
-
-export const lastActiveOptions = [
- { label: "Any", value: null },
- { label: LAST_DAY, value: 1 },
- { label: LAST_WEEK, value: 7 },
- { label: LAST_2_WEEKS, value: 14 },
- { label: LAST_MONTH, value: 31 },
- { label: LAST_3_MONTHS, value: 93 },
+export const getLastActiveOptions = (t: TFunction) => [
+ { label: t("search:last_active_options.any"), value: null },
+ { label: t("search:last_active_options.last_day"), value: 1 },
+ { label: t("search:last_active_options.last_week"), value: 7 },
+ { label: t("search:last_active_options.last_2_weeks"), value: 14 },
+ { label: t("search:last_active_options.last_month"), value: 31 },
+ { label: t("search:last_active_options.last_3_months"), value: 93 },
];
-export const getShowUserOnMap = (name: string) => `Show ${name} on the map`;
-
export const selectedUserZoom = 12;
export type MapClickedCallback = (
diff --git a/features/search/locales/de.json b/features/search/locales/de.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/de.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/en.json b/features/search/locales/en.json
index ae9d40b346..e36b58701c 100644
--- a/features/search/locales/en.json
+++ b/features/search/locales/en.json
@@ -1,24 +1,39 @@
{
- "accomodation_filters": "Accomodation filters",
- "apply_filter": "Apply",
- "clear_search": "Clear search",
- "filter_dialog_title_desktop": "Filters",
- "filter_dialog_title_mobile": "Search",
- "host_filters": "Host filters",
- "last_2_weeks": "Last 2 weeks",
- "last_3_months": "Last 3 months",
- "last_active": "Last active",
- "last_day": "Last day",
- "last_month": "Last month",
- "last_week": "Last week",
- "location": "Near location",
- "map_page": "Map page",
- "num_guests": "Number of guests",
- "no_user_results": "No users found.",
- "open_filter_dialog": "Open filter dialog",
- "search": "Search",
- "search_location_hint": "Press enter to choose a location",
- "search_location_button": "Search location",
- "select_location": "Select a location from the list",
- "user_search": "Search for a user..."
+ "filter_dialog": {
+ "desktop_title": "Filters",
+ "mobile_title": "Search"
+ },
+ "last_active_options": {
+ "any": "Any",
+ "last_day": "Last day",
+ "last_week": "Last week",
+ "last_2_weeks": "Last 2 weeks",
+ "last_month": "Last month",
+ "last_3_months": "Last 3 months"
+ },
+ "form": {
+ "location_field_label": "Near location",
+ "missing_location_validation_error": "Specify a location to use this filter",
+ "keywords": {
+ "field_label": "Profile keywords",
+ "clear_field_action_a11y_label": "Clear search"
+ },
+ "by_location_filter_label": "By location",
+ "by_keyword_filter_label": "By keyword",
+ "host_filters": {
+ "title": "Host filters",
+ "last_active_field_label": "Last active",
+ "hosting_status_field_label": "Hosting status"
+ },
+ "accommodation_filters": {
+ "title": "Accommodation filters",
+ "guests_field_label": "Number of guests"
+ },
+ "submit_button_label": "Apply"
+ },
+ "search_result": {
+ "no_user_result_message": "No users found.",
+ "show_user_button_label": "Show {{name}} on the map",
+ "missing_about_description": "{{name}} hasn't said anything about themselves yet"
+ }
}
diff --git a/features/search/locales/es.json b/features/search/locales/es.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/es.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/es_419.json b/features/search/locales/es_419.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/es_419.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/fr.json b/features/search/locales/fr.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/fr.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/fr_CA.json b/features/search/locales/fr_CA.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/fr_CA.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/hi.json b/features/search/locales/hi.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/hi.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/ja.json b/features/search/locales/ja.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/ja.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/nb_NO.json b/features/search/locales/nb_NO.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/nb_NO.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/nl.json b/features/search/locales/nl.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/nl.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/pt.json b/features/search/locales/pt.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/pt.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/pt_PT.json b/features/search/locales/pt_PT.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/pt_PT.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/ru.json b/features/search/locales/ru.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/ru.json
@@ -0,0 +1 @@
+{}
diff --git a/features/search/locales/zh_Hans.json b/features/search/locales/zh_Hans.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/features/search/locales/zh_Hans.json
@@ -0,0 +1 @@
+{}