i18n strings audit (#1350)

* Tried to get accessibilityHints to conform to Apple guidelines
* Tried to make some more helpful `accessibilityLabel`s
* Used fork of fluent_conv to support function results as selectors in Fluent
* Custom VOWORCON function for Fluent

Note that there are still many accessibility problems for screen readers. This
just tries to make sure the strings up for translation are somewhat less
confusing in that context.

Part of #1223
This commit is contained in:
Ken-ichi
2024-04-10 15:27:38 -07:00
committed by GitHub
parent 33d7ef6c5b
commit e17c65d5d1
54 changed files with 3280 additions and 1315 deletions

View File

@@ -145,7 +145,7 @@ describe( "Signed in user", () => {
await element( by.id( `ObsDetails.${uuid}` ) ).scrollTo( "bottom" );
const comment = element( by.text( "This is a comment" ) );
await waitFor( comment ).toBeVisible().withTimeout( 10000 );
await element( by.label( "Navigate back" ) ).tap( );
await element( by.label( "Go back" ) ).tap( );
await waitFor( username ).toBeVisible( ).withTimeout( 10000 );
/*

View File

@@ -12,6 +12,10 @@ const {
resolver: { sourceExts, assetExts }
} = getDefaultConfig();
const localPackagePaths = [
// If you reference any local paths in package.json, you'll need to list them here
];
/**
* Metro configuration
* https://facebook.github.io/metro/docs/configuration
@@ -27,8 +31,10 @@ const config = {
sourceExts:
process.env.MOCK_MODE === "e2e"
? ["e2e-mock", ...sourceExts, "svg"]
: [...sourceExts, "svg"]
}
: [...sourceExts, "svg"],
nodeModulesPaths: [...localPackagePaths]
},
watchFolders: [...localPackagePaths]
};
module.exports = mergeConfig( getDefaultConfig( __dirname ), config );

View File

@@ -159,7 +159,7 @@ const AddObsModal = ( { closeModal }: Props ): React.Node => {
className="h-[69px] w-[69px] bg-inatGreen rounded-full"
onPress={( ) => closeModal( )}
accessibilityLabel={t( "Close" )}
accessibilityHint={t( "Close-add-observation-modal" )}
accessibilityHint={t( "Closes-new-observation-options" )}
/>
<INatIconButton
testID="record-sound-button"

View File

@@ -146,6 +146,7 @@ const ARCamera = ( {
{showPrediction && result
? (
<TaxonResult
accessibilityLabel={t( "View-suggestions" )}
taxon={result?.taxon}
handleCheckmarkPress={handlePress}
testID={`ARCamera.taxa.${result?.taxon?.id}`}

View File

@@ -20,7 +20,7 @@ const CameraFlip = ( {
<TransparentCircleButton
optionalClasses={cameraFlipClasses}
onPress={flipCamera}
accessibilityLabel={t( "Camera-flip" )}
accessibilityLabel={t( "Flip-camera" )}
accessibilityHint={t( "Use-the-devices-other-camera" )}
icon="rotate"
/>

View File

@@ -20,8 +20,8 @@ const GreenCheckmark = ( {
return (
<INatIconButton
onPress={handleCheckmarkPress}
accessibilityLabel={t( "Checkmark" )}
accessibilityHint={t( "Navigates-to-suggestions" )}
accessibilityLabel={t( "View-suggestions" )}
accessibilityHint={t( "Shows-identification-suggestions" )}
disabled={false}
icon="checkmark-circle"
color={colors.inatGreen}

View File

@@ -23,7 +23,7 @@ const DiscardChangesSheet = ( {
return (
<WarningSheet
handleClose={( ) => setShowDiscardSheet( false )}
headerText={t( "DISCARD-PHOTOS" )}
headerText={t( "DISCARD-PHOTOS--question" )}
text={t( "By-exiting-your-photos-will-not-be-saved" )}
secondButtonText={t( "CANCEL" )}
handleSecondButtonPress={( ) => setShowDiscardSheet( false )}

View File

@@ -68,6 +68,7 @@ const Header = ( {
{taxon
? (
<TaxonResult
accessibilityLabel={t( "Change-taxon-filter" )}
asListItem={false}
taxon={taxon}
showInfoButton={false}

View File

@@ -137,7 +137,7 @@ const MediaViewer = ( {
<WarningSheet
handleClose={( ) => setMediaToDelete( null )}
confirm={confirmDelete}
headerText={t( "DISCARD-MEDIA" )}
headerText={t( "DISCARD-MEDIA--question" )}
buttonText={t( "DISCARD" )}
secondButtonText={t( "CANCEL" )}
handleSecondButtonPress={( ) => setMediaToDelete( null )}

View File

@@ -163,7 +163,7 @@ const ActivityHeader = ( {
{( currentUser && showDeleteCommentSheet ) && (
<WarningSheet
handleClose={( ) => setShowDeleteCommentSheet( false )}
headerText={t( "DELETE-COMMENT-QUESTION" )}
headerText={t( "DELETE-COMMENT--question" )}
confirm={deleteComment}
buttonText={t( "DELETE" )}
handleSecondButtonPress={( ) => setShowDeleteCommentSheet( false )}

View File

@@ -51,7 +51,7 @@ const FloatingButtons = ( {
className="w-1/2 mx-6"
testID="ObsDetail.cvSuggestionsButton"
accessibilityRole="link"
accessibilityHint={t( "Navigates-to-suggest-identification" )}
accessibilityHint={t( "Shows-identification-suggestions" )}
/>
</View>
);

View File

@@ -28,7 +28,7 @@ const CoordinatesCopiedNotification = ( ): React.Node => {
style={getShadowForColor( theme.colors.primary )}
>
<Body2 className="mr-3">
{t( "Coordinates-copied-to-keyboard" )}
{t( "Coordinates-copied-to-clipboard" )}
</Body2>
<INatIcon
name="checkmark-circle"

View File

@@ -76,7 +76,8 @@ const DQAVoteButtons = ( {
size={33}
color={theme.colors.secondary}
onPress={() => removeVote( { metric, vote: true } )}
accessibilityLabel={t( "Arrow-up-selected" )}
accessibilityLabel={t( "Add-agreement" )}
accessibilityHint={t( "Adds-your-vote-of-agreement" )}
/>
);
}
@@ -86,7 +87,8 @@ const DQAVoteButtons = ( {
icon="arrow-up-bold-circle-outline"
size={33}
onPress={() => setVote( { metric, vote: true } )}
accessibilityLabel={t( "Arrow-up-unselected" )}
accessibilityLabel={t( "Remove-agreement" )}
accessibilityHint={t( "Removes-your-vote-of-agreement" )}
/>
);
};
@@ -104,7 +106,8 @@ const DQAVoteButtons = ( {
size={33}
color={theme.colors.error}
onPress={() => removeVote( { metric, vote: false } )}
accessibilityLabel={t( "Arrow-down-selected" )}
accessibilityLabel={t( "Remove-disagreement" )}
accessibilityHint={t( "Removes-your-vote-of-disagreement" )}
/>
);
}
@@ -114,7 +117,8 @@ const DQAVoteButtons = ( {
icon="arrow-down-bold-circle-outline"
size={33}
onPress={() => setVote( { metric, vote: false } )}
accessibilityLabel={t( "Arrow-down-unselected" )}
accessibilityLabel={t( "Add-disagreement" )}
accessibilityHint={t( "Adds-your-vote-of-disagreement" )}
/>
);
};

View File

@@ -198,7 +198,7 @@ const DetailsTab = ( { observation }: Props ): Node => {
<Heading4 className={headingClass}>{t( "DATE" )}</Heading4>
<DateDisplay
classNameMargin="mb-[12px]"
label={t( "Date_observed_header_short" )}
label={t( "Date-observed-header-short" )}
dateString={checkCamelAndSnakeCase( observation, "timeObservedAt" )}
/>
<DateDisplay

View File

@@ -124,14 +124,14 @@ const IdentificationSection = ( {
<DisplayTaxon
taxon={identification}
handlePress={navToSuggestions}
accessibilityLabel={t( "Navigates-to-add-identification" )}
accessibilityLabel={t( "Edits-this-observations-taxon" )}
/>
<INatIconButton
icon="edit"
size={20}
onPress={navToSuggestions}
accessibilityLabel={t( "Edit" )}
accessibilityHint={t( "Navigates-to-add-identification" )}
accessibilityHint={t( "Edits-this-observations-taxon" )}
/>
</View>
)}

View File

@@ -58,7 +58,7 @@ const DeleteObservationSheet = ( {
return (
<WarningSheet
handleClose={handleClose}
headerText={t( "DELETE-OBSERVATION" )}
headerText={t( "DELETE-OBSERVATION--question" )}
handleSecondButtonPress={handleClose}
secondButtonText={t( "CANCEL" )}
confirm={addObservationToDeletionQueue}

View File

@@ -1,40 +0,0 @@
// @flow
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import {
Image,
Pressable,
Text,
View
} from "react-native";
import { viewStyles } from "styles/settings/settings";
type Props = {
unblockUser: Function,
user: Object
}
const BlockedUser = ( { user, unblockUser }:Props ): Node => (
<View style={[viewStyles.row, viewStyles.relationshipRow]}>
<Image
style={viewStyles.relationshipImage}
source={{ uri: user.icon }}
accessibilityIgnoresInvertColors
/>
<View style={viewStyles.column}>
<Text>{user.login}</Text>
<Text>{user.name}</Text>
</View>
<Pressable
accessibilityRole="button"
style={viewStyles.removeRelationship}
onPress={unblockUser}
>
<Text>{t( "Unblock" )}</Text>
</Pressable>
</View>
);
export default BlockedUser;

View File

@@ -1,40 +0,0 @@
// @flow
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import {
Image,
Pressable,
Text,
View
} from "react-native";
import { viewStyles } from "styles/settings/settings";
type Props = {
unmuteUser: Function,
user: Object
}
const MutedUser = ( { user, unmuteUser }: Props ): Node => (
<View style={[viewStyles.row, viewStyles.relationshipRow]}>
<Image
style={viewStyles.relationshipImage}
source={{ uri: user.icon }}
accessibilityIgnoresInvertColors
/>
<View style={viewStyles.column}>
<Text>{user.login}</Text>
<Text>{user.name}</Text>
</View>
<Pressable
accessibilityRole="button"
style={viewStyles.removeRelationship}
onPress={unmuteUser}
>
<Text>{t( "Unmute" )}</Text>
</Pressable>
</View>
);
export default MutedUser;

View File

@@ -1,98 +0,0 @@
// import { useQueryClient } from "@tanstack/react-query";
// import fetchPlace from "api/places";
// import fetchSearchResults from "api/search";
// import inatPlaceTypes from "dictionaries/places";
// import React, { useEffect } from "react";
// import {
// Image, Text, TextInput, View
// } from "react-native";
// import Pressable from "react-native/Libraries/Components/Pressable/Pressable";
// import useAuthenticatedQuery from "sharedHooks/useAuthenticatedQuery";
// import { textStyles, viewStyles } from "styles/settings/settings";
// import { useDebounce } from "use-debounce";
// const PlaceSearchInput = ( { placeId, onPlaceChanged } ): React.Node => {
// const [hideResults, setHideResults] = React.useState( true );
// const [placeSearch, setPlaceSearch] = React.useState( "" );
// // So we'll start searching only once the user finished typing
// const [finalPlaceSearch] = useDebounce( placeSearch, 500 );
// const queryClient = useQueryClient( );
// // this seems necessary for clearing the cache between searches
// queryClient.invalidateQueries( { queryKey: ["fetchSearchResults"] } );
// const {
// data: placeResults
// } = useAuthenticatedQuery(
// ["fetchSearchResults", finalPlaceSearch],
// optsWithAuth => fetchSearchResults( {
// q: finalPlaceSearch,
// sources: "places",
// fields: "place,place.display_name,place.place_type"
// }, optsWithAuth )
// );
// const {
// data: placeDetails
// } = useAuthenticatedQuery(
// ["fetchPlace", placeId],
// optsWithAuth => fetchPlace( placeId, optsWithAuth )
// );
// useEffect( () => {
// if ( placeDetails ) {
// setPlaceSearch( placeDetails.display_name );
// } else {
// setPlaceSearch( "" );
// }
// }, [placeDetails] );
// return (
// <View style={viewStyles.column}>
// <View style={viewStyles.row}>
// <TextInput
// accessibilityLabel="Text input field"
// style={viewStyles.textInput}
// onChangeText={v => {
// setHideResults( false );
// setPlaceSearch( v );
// }}
// value={placeSearch}
// />
// <Pressable
// accessibilityRole="button"
// style={viewStyles.clearSearch}
// onPress={() => {
// setHideResults( true );
// setPlaceSearch( "" );
// onPlaceChanged( 0 );
// }}
// >
// <Image
// style={viewStyles.clearSearch}
// resizeMode="contain"
// source={require( "images/clear.png" )}
// accessibilityIgnoresInvertColors
// />
// </Pressable>
// </View>
// {!hideResults && finalPlaceSearch.length > 0 && placeResults?.map( place => (
// <Pressable
// accessibilityRole="button"
// key={place.id}
// style={[viewStyles.row, viewStyles.placeResultContainer]}
// onPress={() => {
// setHideResults( true );
// onPlaceChanged( place.id );
// }}
// >
// <Text style={textStyles.resultPlaceName}>{place.display_name}</Text>
// <Text style={textStyles.resultPlaceType}>{inatPlaceTypes[place.place_type]}</Text>
// </Pressable>
// ) )}
// </View>
// );
// };
// export default PlaceSearchInput;

View File

@@ -1,65 +0,0 @@
// @flow
import { Checkbox } from "components/SharedComponents";
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import {
Image,
Pressable,
Text,
View
} from "react-native";
import { viewStyles } from "styles/settings/settings";
type Props = {
relationship: Object,
updateRelationship: Function,
askToRemoveRelationship: Function
}
const Relationship = ( {
askToRemoveRelationship,
relationship,
updateRelationship
}: Props ): Node => (
<View style={[viewStyles.column, viewStyles.relationshipRow]}>
<View style={viewStyles.row}>
<Image
style={viewStyles.relationshipImage}
source={{ uri: relationship.friendUser.icon_url }}
accessibilityIgnoresInvertColors
/>
<View style={viewStyles.column}>
<Text>{relationship.friendUser.login}</Text>
<Text>{relationship.friendUser.name}</Text>
</View>
<View style={viewStyles.column}>
<Checkbox
isChecked={relationship.following}
onPress={
( ) => { updateRelationship( relationship, { following: !relationship.following } ); }
}
text={t( "Following" )}
/>
<Checkbox
isChecked={relationship.trust}
onPress={
( ) => { updateRelationship( relationship, { trust: !relationship.trust } ); }
}
text={t( "Trust-with-hidden-coordinates" )}
/>
</View>
</View>
<Text>{t( "Added-on-date", { date: relationship.created_at } )}</Text>
<Pressable
accessibilityRole="button"
style={viewStyles.removeRelationship}
onPress={() => askToRemoveRelationship( relationship )}
>
<Text>{t( "Remove-Relationship" )}</Text>
</Pressable>
</View>
);
export default Relationship;

View File

@@ -1,79 +0,0 @@
// @flow
import { Picker } from "@react-native-picker/picker";
import { Checkbox } from "components/SharedComponents";
import inatLanguages from "dictionaries/languages";
import inatNetworks from "dictionaries/networks";
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import { Text, View } from "react-native";
import { textStyles, viewStyles } from "styles/settings/settings";
import colors from "styles/tailwindColors";
import PlaceSearchInput from "./PlaceSearchInput";
import type { SettingsProps } from "./types";
const SettingsAccount = ( { settings, onSettingsModified }: SettingsProps ): Node => (
<>
<Text style={textStyles.title}>{t( "Account" )}</Text>
<Text style={[textStyles.subTitle]}>{t( "Language-Locale" )}</Text>
<Text>{t( "This-sets-your-language-and-date-formatting-preferences-across-iNaturalist" )}</Text>
<View style={viewStyles.selectorContainer}>
<Picker
style={viewStyles.selector}
dropdownIconColor={colors.inatGreen}
selectedValue={settings.locale}
onValueChange={
( itemValue, _itemIndex ) => onSettingsModified( { ...settings, locale: itemValue } )
}
>
{Object.keys( inatLanguages ).map( k => (
<Picker.Item
key={k}
label={inatLanguages[k]}
value={k}
/>
) )}
</Picker>
</View>
<Text style={[textStyles.subTitle]}>{t( "Default-Search-Place" )}</Text>
<Text>{t( "This-will-be-your-default-place-for-all-searches-in-Explore-and-Identify" )}</Text>
<PlaceSearchInput
placeId={settings.search_place_id}
onPlaceChanged={p => onSettingsModified( { ...settings, search_place_id: p } )}
/>
<Text style={[textStyles.subTitle]}>{t( "Privacy" )}</Text>
<Checkbox
isChecked={settings.prefers_no_tracking}
onPress={v => onSettingsModified( { ...settings, prefers_no_tracking: v } )}
text={t( "Do-not-collect-stability-and-usage-data-using-third-party-services" )}
/>
<Text style={[textStyles.subTitle]}>{t( "iNaturalist-Network-Affiliation" )}</Text>
<View style={viewStyles.selectorContainer}>
<Picker
style={viewStyles.selector}
dropdownIconColor={colors.inatGreen}
selectedValue={settings.site_id}
onValueChange={
( itemValue, _itemIndex ) => onSettingsModified( { ...settings, site_id: itemValue } )
}
>
{Object.keys( inatNetworks ).map( k => (
<Picker.Item
key={k}
label={inatNetworks[k].name}
value={k}
/>
) )}
</Picker>
</View>
<Text>{t( "The-iNaturalist-Network-is-a-collection-of-localized-websites" )}</Text>
</>
);
export default SettingsAccount;

View File

@@ -1,116 +0,0 @@
// @flow
import { useQueryClient } from "@tanstack/react-query";
import {
fetchAuthorizedApplications, revokeAuthorizedApplications
} from "api/authorizedApplications";
import fetchProviderAuthorizations from "api/providerAuthorizations";
import inatProviders from "dictionaries/providers";
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import { Alert, Text, View } from "react-native";
import Pressable from "react-native/Libraries/Components/Pressable/Pressable";
import useAuthenticatedMutation from "sharedHooks/useAuthenticatedMutation";
import useAuthenticatedQuery from "sharedHooks/useAuthenticatedQuery";
import { textStyles, viewStyles } from "styles/settings/settings";
const SettingsApplications = ( ): Node => {
const {
data: authorizedApps,
refetch
} = useAuthenticatedQuery(
["fetchAuthorizedApplications"],
optsWithAuth => fetchAuthorizedApplications( { }, optsWithAuth )
);
const {
data: providerAuthorizations
} = useAuthenticatedQuery(
["fetchProviderAuthorizations"],
optsWithAuth => fetchProviderAuthorizations( { }, optsWithAuth )
);
const queryClient = useQueryClient( );
const revokeAppMutation = useAuthenticatedMutation(
( params, optsWithAuth ) => revokeAuthorizedApplications( params, optsWithAuth ),
{
onSuccess: ( ) => {
queryClient.invalidateQueries( { queryKey: ["fetchAuthorizedApplications"] } );
refetch( );
}
}
);
const revokeApp = async appId => {
revokeAppMutation.mutate( { id: appId } );
};
const askToRevokeApp = app => {
Alert.alert(
`Revoke ${app.application.name}?`,
"This will sign you out of your current session on this application.",
[
{ text: "Revoke", onPress: () => revokeApp( app.application.id ) }
],
{
cancelable: true
}
);
};
return (
<View>
<Text style={textStyles.title}>{t( "iNaturalist-Applications" )}</Text>
{authorizedApps?.filter( app => app.application.official ).map( app => (
<View key={app.application.id}>
<Text>
{app.application.name}
</Text>
<Pressable
accessibilityRole="button"
style={viewStyles.revokeAccess}
onPress={() => askToRevokeApp( app )}
>
<Text>{t( "Revoke" )}</Text>
</Pressable>
</View>
) )}
<Text style={[textStyles.title, textStyles.marginTop]}>{t( "Connected-Accounts" )}</Text>
{Object.keys( inatProviders ).map( providerKey => {
const connectedProvider = providerAuthorizations?.find(
x => x.provider_name === providerKey
);
return (
<Text
key={providerKey}
>
{inatProviders[providerKey]}
{" "}
{connectedProvider && `(authorized on: ${connectedProvider.created_at})`}
</Text>
);
} )}
<Text style={[textStyles.title, textStyles.marginTop]}>{t( "External-Applications" )}</Text>
{authorizedApps?.filter( app => !app.application.official ).map( app => (
<View key={app.application.id} style={[viewStyles.row, viewStyles.applicationRow]}>
<Text style={textStyles.applicationName}>
{t( "app-authorized-on-date", { appName: app.application.name, date: app.created_at } )}
</Text>
<Pressable
accessibilityRole="button"
style={viewStyles.revokeAccess}
onPress={() => askToRevokeApp( app )}
>
<Text>{t( "Revoke" )}</Text>
</Pressable>
</View>
) )}
</View>
);
};
export default SettingsApplications;

View File

@@ -1,223 +0,0 @@
// @flow
import { Picker } from "@react-native-picker/picker";
import { Checkbox } from "components/SharedComponents";
import inatLicenses from "dictionaries/licenses";
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import { Text, View } from "react-native";
import { textStyles, viewStyles } from "styles/settings/settings";
import colors from "styles/tailwindColors";
import PlaceSearchInput from "./PlaceSearchInput";
import type { SettingsProps } from "./types";
const PROJECT_SETTINGS = {
any: "Any",
joined: "Projects you've joined",
none: "None, only you can add your observations to projects"
};
const TAXON_DISPLAY = {
prefers_common_names: "Common Name (Scientific Name)",
prefers_scientific_name_first: "Scientific Name (Common Name)",
prefers_scientific_names: "Scientific Name"
};
const ADD_OBSERVATION_FIELDS = {
anyone: "Anyone",
curators: "Curators",
observer: "Only you"
};
const LicenseSelector = ( {
value,
onValueChanged,
title,
updateExistingTitle,
onUpdateExisting,
updateExisting
} ): Node => (
<>
<Text style={textStyles.subTitle}>{title}</Text>
<View style={viewStyles.selectorContainer}>
<Picker
style={viewStyles.selector}
dropdownIconColor={colors.inatGreen}
selectedValue={value}
onValueChange={onValueChanged}
>
{inatLicenses.map( l => (
<Picker.Item
key={l.value}
label={l.title}
value={l.value}
/>
) )}
</Picker>
</View>
<Checkbox
isChecked={updateExisting}
onPress={onUpdateExisting}
text={updateExistingTitle}
/>
</>
);
const SettingsContentDisplay = ( { settings, onSettingsModified }: SettingsProps ): Node => {
let taxonNamePreference = "prefers_common_names";
if ( settings.prefers_scientific_name_first ) {
taxonNamePreference = "prefers_scientific_name_first";
} else if ( settings.prefers_scientific_names ) {
taxonNamePreference = "prefers_scientific_names";
}
return (
<>
<Text style={textStyles.title}>{t( "Project-Settings" )}</Text>
<Text style={textStyles.subTitle}>
{t( "Which-traditional-projects-can-add-your-observations" )}
</Text>
<View style={viewStyles.selectorContainer}>
<Picker
style={viewStyles.selector}
dropdownIconColor={colors.inatGreen}
selectedValue={settings.preferred_project_addition_by}
onValueChange={( itemValue, _itemIndex ) => onSettingsModified( {
...settings,
preferred_project_addition_by: itemValue
} )}
>
{Object.keys( PROJECT_SETTINGS ).map( k => (
<Picker.Item
key={k}
label={PROJECT_SETTINGS[k]}
value={k}
/>
) )}
</Picker>
</View>
<Text style={[textStyles.title, textStyles.marginTop]}>{t( "Taxonomy-Settings" )}</Text>
<Checkbox
isChecked={settings.prefers_automatic_taxonomic_changes}
onPress={v => {
onSettingsModified( { ...settings, prefers_automatic_taxonomic_changes: v } );
}}
text={t( "Automatically-update-my-content-for-taxon-changes" )}
/>
<Text style={[textStyles.title, textStyles.marginTop]}>{t( "Names" )}</Text>
<Text style={textStyles.subTitle}>{t( "Display" )}</Text>
<Text>{t( "This-is-how-all-taxon-names-will-be-displayed-to-you-across-iNaturalist" )}</Text>
<View style={viewStyles.selectorContainer}>
<Picker
style={viewStyles.selector}
dropdownIconColor={colors.inatGreen}
selectedValue={taxonNamePreference}
onValueChange={( value, _itemIndex ) => {
if ( value === "prefers_common_names" ) {
onSettingsModified( {
...settings,
prefers_common_names: true,
prefers_scientific_name_first: false
} );
} else if ( value === "prefers_scientific_name_first" ) {
onSettingsModified( {
...settings,
prefers_common_names: true,
prefers_scientific_name_first: true
} );
} else if ( value === "prefers_scientific_names" ) {
onSettingsModified( {
...settings,
prefers_common_names: false,
prefers_scientific_name_first: false
} );
}
}}
>
{Object.keys( TAXON_DISPLAY ).map( k => (
<Picker.Item
key={k}
label={TAXON_DISPLAY[k]}
value={k}
/>
) )}
</Picker>
</View>
<Text style={textStyles.subTitle}>{t( "Prioritize-common-names-used-in-this-place" )}</Text>
<PlaceSearchInput
placeId={settings.place_id}
onPlaceChanged={p => onSettingsModified( { ...settings, place_id: p } )}
/>
<Text style={[textStyles.title, textStyles.marginTop]}>
{t( "Community-Moderation-Settings" )}
</Text>
<Checkbox
isChecked={settings.prefers_community_taxa}
onPress={v => {
onSettingsModified( { ...settings, prefers_community_taxa: v } );
}}
text={t( "Accept-community-identifications" )}
/>
<Text style={textStyles.subTitle}>
{t( "Who-can-add-observation-fields-to-my-observations" )}
</Text>
<View style={viewStyles.selectorContainer}>
<Picker
style={viewStyles.selector}
dropdownIconColor={colors.inatGreen}
selectedValue={settings.preferred_observation_fields_by}
onValueChange={( itemValue, _itemIndex ) => onSettingsModified( {
...settings,
preferred_observation_fields_by: itemValue
} )}
>
{Object.keys( ADD_OBSERVATION_FIELDS ).map( k => (
<Picker.Item
key={k}
label={ADD_OBSERVATION_FIELDS[k]}
value={k}
/>
) )}
</Picker>
</View>
<Text style={[textStyles.title, textStyles.marginTop]}>{t( "Licensing" )}</Text>
<LicenseSelector
title="Default observation license"
value={settings.preferred_observation_license}
onValueChanged={v => onSettingsModified( {
...settings,
preferred_observation_license: v
} )}
updateExistingTitle="Update existing observations with new license choices"
updateExisting={settings.make_observation_licenses_same}
onUpdateExisting={v => onSettingsModified( {
...settings,
make_observation_licenses_same: v
} )}
/>
<LicenseSelector
title="Default photo license"
value={settings.preferred_photo_license}
onValueChanged={v => onSettingsModified( { ...settings, preferred_photo_license: v } )}
updateExistingTitle="Update existing photos with new license choices"
updateExisting={settings.make_photo_licenses_same}
onUpdateExisting={v => onSettingsModified( { ...settings, make_photo_licenses_same: v } )}
/>
<LicenseSelector
title="Default sound license"
value={settings.preferred_sound_license}
onValueChanged={v => onSettingsModified( { ...settings, preferred_sound_license: v } )}
updateExistingTitle="Update existing sounds with new license choices"
updateExisting={settings.make_sound_licenses_same}
onUpdateExisting={v => onSettingsModified( { ...settings, make_sound_licenses_same: v } )}
/>
</>
);
};
export default SettingsContentDisplay;

View File

@@ -1,98 +0,0 @@
// @flow
import { Checkbox } from "components/SharedComponents";
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import { Text, View } from "react-native";
import Switch from "react-native/Libraries/Components/Switch/Switch";
import { textStyles, viewStyles } from "styles/settings/settings";
import type { SettingsProps } from "./types";
const EMAIL_NOTIFICATIONS = {
Comments: "prefers_comment_email_notification",
Identifications: "prefers_identification_email_notification",
Mentions: "prefers_mention_email_notification",
Messages: "prefers_message_email_notification",
"Project journal posts": "prefers_project_journal_post_email_notification",
// eslint-disable-next-line max-len
"When a project adds your observations": "prefers_project_added_your_observation_email_notification",
"Project curator changes": "prefers_project_curator_change_email_notification",
"Taxonomy changes": "prefers_taxon_change_email_notification",
"Observations by people I follow": "prefers_user_observation_email_notification",
// eslint-disable-next-line max-len
"Observations of taxa or from places that I subscribe to": "prefers_taxon_or_place_observation_email_notification"
};
const EmailNotification = ( { title, value, onValueChange } ): Node => (
<Checkbox
isChecked={value}
onPress={onValueChange}
text={title}
/>
);
const Notification = ( {
title, description, value, onValueChange
} ): Node => (
<View style={[viewStyles.row, viewStyles.notificationContainer]}>
<View style={[viewStyles.column, viewStyles.notificationLeftSide]}>
<Text style={textStyles.notificationTitle}>{title}</Text>
<Text>{description}</Text>
</View>
<View style={[viewStyles.column, viewStyles.switch]}>
<Switch value={value} onValueChange={onValueChange} />
</View>
</View>
);
const SettingsNotifications = ( { settings, onSettingsModified }: SettingsProps ): Node => (
<>
<Text style={textStyles.title}>{t( "iNaturalist-Activity-Notifications" )}</Text>
<Notification
title="Notify me of mentions (e.g. @username)"
// eslint-disable-next-line max-len
description="If you turn this off, you will not get any notifications when someone mentions you on iNaturalist."
value={settings.prefers_receive_mentions}
onValueChange={v => onSettingsModified( { ...settings, prefers_receive_mentions: v } )}
/>
<Notification
title="Confirming ID's"
// eslint-disable-next-line max-len
description="If you turn this off, you will no longer be notified about IDs that agree with yours."
value={settings.prefers_redundant_identification_notifications}
onValueChange={v => onSettingsModified( {
...settings,
prefers_redundant_identification_notifications: v
} )}
/>
<Text style={textStyles.title}>{t( "Email-Notifications" )}</Text>
<Notification
title="Receive Email Notifications"
// eslint-disable-next-line max-len
description="If you turn this off, you will no longer receive any emails from iNaturalist regarding notifications."
value={!settings.prefers_no_email}
onValueChange={v => onSettingsModified( { ...settings, prefers_no_email: !v } )}
/>
{!settings.prefers_no_email
&& (
<>
{Object.keys( EMAIL_NOTIFICATIONS ).map( k => (
<EmailNotification
key={k}
title={k}
value={settings[EMAIL_NOTIFICATIONS[k]]}
onValueChange={
// $FlowIgnore
v => onSettingsModified( { ...settings, [EMAIL_NOTIFICATIONS[k]]: v } )
}
/>
) )}
</>
)}
</>
);
export { EMAIL_NOTIFICATIONS, SettingsNotifications };

View File

@@ -1,97 +0,0 @@
// @flow
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import {
Button, Image, Text, TextInput, View
} from "react-native";
// $FlowIgnore
import { launchImageLibrary } from "react-native-image-picker";
import { viewStyles } from "styles/settings/settings";
import type { SettingsProps } from "./types";
const SettingsProfile = ( { settings, onSettingsModified }: SettingsProps ): Node => {
let profileSource;
if ( settings.newProfilePhoto && !settings.removeProfilePhoto ) {
profileSource = { uri: settings.newProfilePhoto.uri };
} else if (
settings.icon && !settings.removeProfilePhoto ) {
profileSource = { uri: settings.icon };
} else {
profileSource = require( "images/profile.png" );
}
const onImageSelected = response => {
if ( response.didCancel ) { return; }
onSettingsModified( {
...settings,
newProfilePhoto: response.assets[0],
removeProfilePhoto: false
} );
};
return (
<>
<Text>{t( "Profile-Picture" )}</Text>
<View style={viewStyles.row}>
<Image
style={viewStyles.profileImage}
source={profileSource}
accessibilityIgnoresInvertColors
/>
<View style={viewStyles.column}>
<Button
title="Upload New Photo"
onPress={() => launchImageLibrary( {}, onImageSelected )}
/>
<Button
title="Remove Photo"
onPress={() => onSettingsModified( { ...settings, removeProfilePhoto: true } )}
/>
</View>
</View>
<View style={viewStyles.column}>
<Text>{t( "Username" )}</Text>
<TextInput
accessibilityLabel="Text input field"
style={viewStyles.textInput}
onChangeText={x => onSettingsModified( { ...settings, login: x } )}
value={settings.login}
/>
</View>
<View style={viewStyles.column}>
<Text>{t( "Email" )}</Text>
<TextInput
accessibilityLabel="Text input field"
style={viewStyles.textInput}
onChangeText={x => onSettingsModified( { ...settings, email: x } )}
value={settings.email}
/>
</View>
<View style={viewStyles.column}>
<Text>{t( "Display-Name" )}</Text>
<TextInput
accessibilityLabel="Text input field"
style={viewStyles.textInput}
onChangeText={x => onSettingsModified( { ...settings, name: x } )}
value={settings.name}
/>
</View>
<View style={viewStyles.column}>
<Text>{t( "Bio" )}</Text>
<TextInput
accessibilityLabel="Text input field"
style={viewStyles.textInput}
multiline
numberOfLines={4}
onChangeText={x => onSettingsModified( { ...settings, description: x } )}
value={settings.description}
/>
</View>
</>
);
};
export default SettingsProfile;

View File

@@ -1,87 +0,0 @@
// import fetchSearchResults from "api/search";
// import React, { useEffect } from "react";
// import {
// Image, Text, TextInput, View
// } from "react-native";
// import Pressable from "react-native/Libraries/Components/Pressable/Pressable";
// import useAuthenticatedQuery from "sharedHooks/useAuthenticatedQuery";
// import { textStyles, viewStyles } from "styles/settings/settings";
// import { useDebounce } from "use-debounce";
// const UserSearchInput = ( { onUserChanged } ): React.Node => {
// const [hideResults, setHideResults] = React.useState( true );
// const [userSearch, setUserSearch] = React.useState( "" );
// // So we'll start searching only once the user finished typing
// const [finalUserSearch] = useDebounce( userSearch, 500 );
// const {
// data: userResults
// } = useAuthenticatedQuery(
// ["fetchSearchResults", finalUserSearch],
// optsWithAuth => fetchSearchResults( {
// q: finalUserSearch,
// sources: "users",
// fields: "user.login,user.name,user.icon"
// }, optsWithAuth )
// );
// useEffect( () => {
// if ( finalUserSearch.length === 0 ) {
// setHideResults( true );
// }
// }, [finalUserSearch] );
// return (
// <View style={viewStyles.column}>
// <View style={viewStyles.row}>
// <TextInput
// accessibilityLabel="Text input field"
// style={viewStyles.textInput}
// onChangeText={v => {
// setHideResults( false );
// setUserSearch( v );
// }}
// value={userSearch}
// />
// <Pressable
// accessibilityRole="button"
// style={viewStyles.clearSearch}
// onPress={() => {
// setHideResults( true );
// onUserChanged( null );
// setUserSearch( "" );
// }}
// >
// <Image
// style={viewStyles.clearSearch}
// resizeMode="contain"
// source={require( "images/clear.png" )}
// accessibilityIgnoresInvertColors
// />
// </Pressable>
// </View>
// {!hideResults && finalUserSearch.length > 0 && userResults?.map( result => (
// <Pressable
// accessibilityRole="button"
// key={result.id}
// style={[viewStyles.row, viewStyles.placeResultContainer]}
// onPress={() => {
// setHideResults( true );
// onUserChanged( result );
// setUserSearch( result.login );
// }}
// >
// <Image
// style={viewStyles.userPic}
// resizeMode="contain"
// source={{ uri: result.icon }}
// accessibilityIgnoresInvertColors
// />
// <Text style={textStyles.resultPlaceName}>{result.login}</Text>
// <Text style={textStyles.resultPlaceType}>{result.name}</Text>
// </Pressable>
// ) )}
// </View>
// );
// };
// export default UserSearchInput;

View File

@@ -1,6 +0,0 @@
// @flow
export type SettingsProps = {
settings: Object,
onSettingsModified: Function
}

View File

@@ -6,21 +6,21 @@ import React, { useMemo } from "react";
// eslint-disable-next-line import/no-extraneous-dependencies
import BouncyCheckbox from "react-native-bouncy-checkbox";
import { useTheme } from "react-native-paper";
import { useTranslation } from "sharedHooks";
type Props = {
accessibilityLabel: string,
isChecked: boolean,
onPress: Function,
text: string
}
const Checkbox = ( {
accessibilityLabel,
isChecked = false,
onPress,
text
}: Props ): Node => {
const theme = useTheme( );
const { t } = useTranslation( );
const renderCheckboxText = useMemo( ( ) => {
if ( !text ) { return null; }
@@ -57,8 +57,8 @@ const Checkbox = ( {
textComponent={renderCheckboxText}
iconStyle={iconStyle}
innerIconStyle={innerIconStyle}
accessibilityLabel={accessibilityLabel}
accessibilityRole="radio"
accessibilityLabel={t( "Checkmark" )}
accessibilityState={{
checked: isChecked
}}

View File

@@ -138,7 +138,7 @@ const DetailsMap = ( {
<FloatingActionButton
icon="copy"
onPress={( ) => copyCoordinates( )}
accessibilityLabel={t( "Copy-map-coordinates" )}
accessibilityLabel={t( "Copy-coordinates" )}
buttonClassName="top-0 left-0"
theme={theme}
/>

View File

@@ -18,6 +18,7 @@ import { useCurrentUser, useTaxon, useTranslation } from "sharedHooks";
import ConfidenceInterval from "./ConfidenceInterval";
type Props = {
accessibilityLabel: string,
activeColor?: string,
asListItem?: boolean,
clearBackground?: boolean,
@@ -36,6 +37,7 @@ type Props = {
};
const TaxonResult = ( {
accessibilityLabel,
activeColor,
asListItem = true,
clearBackground,
@@ -160,8 +162,7 @@ const TaxonResult = ( {
: theme.colors.secondary
}
onPress={() => handleCheckmarkPress( usableTaxon )}
accessibilityLabel={t( "Checkmark" )}
accessibilityHint={t( "Add-this-ID" )}
accessibilityLabel={accessibilityLabel}
testID={`${testID}.checkmark`}
/>
)}

View File

@@ -304,7 +304,7 @@ const SoundRecorder = (): Node => {
</BottomSheet>
<WarningSheet
hidden={!exitWarningShown}
headerText={t( "DISCARD-SOUND-header" )}
headerText={t( "DISCARD-SOUND--question" )}
text={t( "By-exiting-your-recorded-sound-will-not-be-saved" )}
confirm={onBack}
handleClose={( ) => setExitWarningShown( false )}

View File

@@ -11,12 +11,18 @@ import {
} from "sharedHelpers/convertScores";
type Props = {
accessibilityLabel: string,
onTaxonChosen: Function,
suggestion: Object,
};
const Suggestion = ( { suggestion, onTaxonChosen }: Props ): Node => (
const Suggestion = ( {
accessibilityLabel,
suggestion,
onTaxonChosen
}: Props ): Node => (
<TaxonResult
accessibilityLabel={accessibilityLabel}
taxon={suggestion.taxon}
handleCheckmarkPress={onTaxonChosen}
testID={`SuggestionsList.taxa.${suggestion?.taxon?.id}`}

View File

@@ -79,10 +79,11 @@ const Suggestions = ( {
const renderItem = useCallback( ( { item: suggestion } ) => (
<Suggestion
accessibilityLabel={t( "Choose-taxon" )}
suggestion={suggestion}
onTaxonChosen={onTaxonChosen}
/>
), [onTaxonChosen] );
), [onTaxonChosen, t] );
const renderEmptyList = useCallback( ( ) => (
<SuggestionsEmpty loading={loading} />
@@ -138,6 +139,7 @@ const Suggestions = ( {
<Heading4 className="mt-6 mb-4 ml-4">{t( "TOP-ID-SUGGESTION" )}</Heading4>
<View className="bg-inatGreen/[.13]">
<Suggestion
accessibilityLabel={t( "Choose-taxon" )}
suggestion={topSuggestion}
onTaxonChosen={onTaxonChosen}
/>

View File

@@ -13,7 +13,7 @@ import React, {
} from "react";
import { FlatList } from "react-native";
import { useTheme } from "react-native-paper";
import useTaxonSearch from "sharedHooks/useTaxonSearch";
import { useTaxonSearch, useTranslation } from "sharedHooks";
import { getShadowStyle } from "styles/global";
import AddCommentPrompt from "./AddCommentPrompt";
@@ -34,6 +34,7 @@ const TaxonSearch = ( ): Node => {
const [taxonQuery, setTaxonQuery] = useState( "" );
const [selectedTaxon, setSelectedTaxon] = useState( null );
const taxonList = useTaxonSearch( taxonQuery );
const { t } = useTranslation( );
useNavigateWithTaxonSelected( selectedTaxon, { vision: false } );
@@ -41,13 +42,14 @@ const TaxonSearch = ( ): Node => {
const renderTaxonResult = useCallback( ( { item: taxon, index } ) => (
<TaxonResult
accessibilityLabel={t( "Choose-taxon" )}
taxon={taxon}
handleCheckmarkPress={() => setSelectedTaxon( taxon )}
testID={`Search.taxa.${taxon.id}`}
first={index === 0}
fetchRemote={false}
/>
), [setSelectedTaxon] );
), [setSelectedTaxon, t] );
return (
<ViewWrapper>

View File

@@ -209,7 +209,7 @@ async function untranslatable( ) {
console.log( "✅ No keys missing in strings.ftl" );
} else {
console.error(
`${untranslatableKeys.length} keys found missing in strings.ftl: ${untranslatableKeys}`
`${untranslatableKeys.length} keys in use missing from strings.ftl: ${untranslatableKeys}`
);
process.exit( 1 );
}

View File

@@ -34,6 +34,20 @@ export const I18NEXT_CONFIG = {
// Added since otherwise Android would crash - see here: https://stackoverflow.com/a/70521614 and https://www.i18next.com/misc/migration-guide
useSuspense: false,
defaultTransParent: Text
},
// For some reason this is how you pass options to i18next-fluent, per
// https://github.com/i18next/i18next-fluent?tab=readme-ov-file#options
i18nFormat: {
fluentBundleOptions: {
useIsolating: false,
functions: {
VOWORCON: ( [txt] ) => (
"aeiou".indexOf( txt[0].toLowerCase( ) ) >= 0
? "vow"
: "con"
)
}
}
}
};

View File

@@ -17,7 +17,7 @@
### result of performing an action on the accessibility element." We write
### them in third person singular ending with a period.
# Header above user biography / user description on user profile
# Header for a general description, e.g. of a user, or of iNaturalist itself
ABOUT = ABOUT
ABOUT-COLLECTION-PROJECTS = ABOUT COLLECTION PROJECTS
ABOUT-INATURALIST = ABOUT INATURALIST
@@ -26,17 +26,19 @@ ABOUT-THE-DQA = ABOUT THE DQA
About-the-DQA-description = The Quality Grade summarizes the accuracy, precision, completeness, relevance, and appropriateness of an iNaturalist observation as biodiversity data. Some attributes are automatically determined, while others are subject to a vote by iNat users. iNaturalist shares licensed "Research Grade" observations with a number of data partners for use in science and conservation.
ABOUT-TRADITIONAL-PROJECTS = ABOUT TRADITIONAL PROJECTS
ABOUT-UMBRELLA-PROJECTS = ABOUT UMBRELLA PROJECTS
Accept-community-identifications = Accept community identifications
# Label for a taxon when a user prefers to see or hear the common name first
accessible-comname-sciname = { $commonName } ({ $scientificName })
# Label for a taxon when a user prefers to see or hear the scientific name first
accessible-sciname-comname = { $scientificName } ({ $commonName })
Account = Account
ACTIVITY = ACTIVITY
# Label for a button that adds a vote of agreement
Add-agreement = Add agreement
ADD-AN-ID = ADD AN ID
ADD-COMMENT = ADD COMMENT
Add-comment = Add comment
Add-Date-Time = Add Date/Time
# Label for a button that adds a vote of disagreement
Add-disagreement = Add disagreement
ADD-EVIDENCE = ADD EVIDENCE
Add-favorite = Add favorite
Add-Location = Add Location
@@ -45,12 +47,17 @@ Add-Location = Add Location
Add-observations = Add observations
ADD-OPTIONAL-COMMENT = ADD OPTIONAL COMMENT
Add-optional-notes = Add optional notes
Add-this-ID = Add this identification
# Date relationship created, shown on settings relationships screen
Added-on-date = Added on { $date }
# Hint for a button that adds a vote of agreement
Adds-your-vote-of-agreement = Adds your vote of agreement
# Hint for a button that adds a vote of disagreement
Adds-your-vote-of-disagreement = Adds your vote of disagreement
Affiliation = Affiliation: { $site }
# Label for button that adds an identification of the same taxon as another identification
Agree = Agree
# Label for button that adds an identification of the same taxon as another identification
AGREE = AGREE
# Checkbox label that checks all of the consent agreements a user must make
# before signing up
Agree-to-all-of-the-above = Agree to all of the above
AGREE-WITH-ID = AGREE WITH ID?
Agree-with-ID-description = Would you like to agree with the ID and suggest the following identification?
@@ -58,26 +65,27 @@ ALL = ALL
All = All
All-observations = All observations
All-organisms = All organisms
# license code
# As in intellectual property rights over a photo or other creative work
all-rights-reserved = all rights reserved
# As in automated identification suggestions
ALL-SUGGESTIONS = ALL SUGGESTIONS
Almost-done = Almost done!
Already-have-an-account = Already have an account? Log in
An-Internet-connection-is-required = An Internet connection is required to load more observations.
# Generic option in a menu of choices that indicates that any of the choices
# would be acceptable
Any = Any
# Geoprivacy sheet descriptions
Anyone-using-iNaturalist-can-see = Anyone using iNaturalist can see where this species was observed, and scientists can most easily use it for research.
app-authorized-on-date = { $appName } (authorized on: { $date })
APPLY-FILTERS = APPLY FILTERS
Apply-filters = Apply filters
# Month of April
April = April
# Short for Augmented Reality Camera. This is what we call the camera that
# overlays identification suggestions in real time
AR-Camera = AR Camera
Are-you-a-teacher = Are you a teacher wanting to use iNaturalist with your students?
Are-you-sure-you-want-to-sign-out = Are you sure you want to sign out? This will delete all your observations on this device. It will not affect any observations you've uploaded to iNaturalist.
Arrow-down-selected = Arrow down selected
Arrow-down-unselected = Arrow down unselected
Arrow-up-selected = Arrow up selected
Arrow-up-unselected = Arrow up unselected
# Onboarding text on MyObservations: 0-10 observations
As-you-upload-more-observations = As you upload more observations, others in our community may be able to help you identify them!
attribution-cc-by = some rights reserved (CC BY)
@@ -86,12 +94,10 @@ attribution-cc-by-nc-nd = some rights reserved (CC BY-NC-ND)
attribution-cc-by-nc-sa = some rights reserved (CC BY-NC-SA)
attribution-cc-by-nd = some rights reserved (CC BY-ND)
attribution-cc-by-sa = some rights reserved (CC BY-SA)
# Month of August
August = August
Automatically-update-my-content-for-taxon-changes = Automatically update my content for taxon changes
# Returns user to login screen
BACK-TO-LOGIN = BACK TO LOGIN
# Header for inserting user description in settings profile tab
Bio = Bio
BLOG = BLOG
# Accessibility label for bulk import / photo import button
# These are used by screen readers to label actionable elements iOS: https://developer.apple.com/documentation/uikit/uiaccessibilityelement/1619577-accessibilitylabel
@@ -103,67 +109,92 @@ By-exiting-your-observations-not-saved = By exiting, your observations will not
By-exiting-your-photos-will-not-be-saved = By exiting, your photos will not be saved.
By-exiting-your-recorded-sound-will-not-be-saved = By exiting, your recorded sound will not be saved.
Camera = Camera
Camera-flip = Camera-flip
CANCEL = CANCEL
Cancel = Cancel
Captive-Cultivated = Captive/Cultivated
# "Casual" Data quality grade
Casual = Casual
# Short label for the Creative Commons Attribution license
CC-BY = CC BY
# Short label for the Creative Commons Attribution-NonCommercial license
CC-BY-NC = CC BY-NC
# Short label for the Creative Commons Attribution-NonCommercial-NoDerivatives license
CC-BY-NC-ND = CC BY-NC-ND
# Short label for the Creative Commons Attribution-NonCommercial-ShareAlike license
CC-BY-NC-SA = CC BY-NC-SA
# Short label for the Creative Commons Attribution-NoDerivatives license
CC-BY-ND = CC BY-ND
# Short label for the Creative Commons Attribution-ShareAlike license
CC-BY-SA = CC BY-SA
# Short label for the Creative Commons Zero declaration
CC0 = CC0
# Label for a button that changes a selected date
CHANGE-DATE = CHANGE DATE
# Label for a button that changes a selected date
Change-date = Change date
# Label for a button that changes a selected end date
CHANGE-END-DATE = CHANGE END DATE
# Label for a button that changes a selected end date
Change-end-date = Change end date
Change-project = Change project
# Label for a button that changes a selected start date
CHANGE-START-DATE = CHANGE START DATE
# Label for a button that changes a selected start date
Change-start-date = Change start date
Change-taxon = Change taxon
# Button that changes the taxon filter on Explore
Change-taxon-filter = Change taxon filter
Change-user = Change user
# Label for a button that cycles through zoom levels for the camera
Change-zoom = Change zoom
Check-this-box-if-you-want-to-apply-a-Creative-Commons = Check this box if you want to apply a Creative Commons
# After pressing the reset password button
# Notification that appears after pressing the reset password button
CHECK-YOUR-EMAIL = CHECK YOUR EMAIL!
Checkmark = Checkmark
# Text for a button prompting the user to grant access to the gallery
CHOOSE-PHOTOS = CHOOSE PHOTOS
# Label for button that chooses a taxon
Choose-taxon = Choose taxon
# Label for a button that clears content, like the text entered in a text
# field
Clear = Clear
# Label for a button that closes a window or popup
Close = Close
Close-add-observation-modal = Close add observation modal.
# Accessibility label for a button that closes the permission request screen
Close-permission-request-screen = Close permission request screen
# Label for a button that closes a search interface
Close-search = Close search
Closes-new-observation-options = Closes new observation options.
Closes-withdraw-id-sheet = Closes "Withdraw ID" sheet
# Heading for a section that describes people and organizations that
# collaborate with iNaturalist
COLLABORATORS = COLLABORATORS
Collection-Project = Collection Project
# Button that combines multiple photos into a single observation
Combine-Photos = Combine Photos
# Title for a form that let's you enter a comment
COMMENT = COMMENT
# Accessibility label for a button that shows options for a comment
# Label for a button that shows options for a comment
Comment-options = Comment options
# Label for a setting that shows the common name first
Common-Name-Scientific-Name = Common Name (Scientific Name)
Community-Guidelines = Community Guidelines
Community-Moderation-Settings = Community Moderation Settings
# Button that confirms a choice the user has made
CONFIRM = CONFIRM
Connect-with-other-naturalists = Connect with other naturalists and engage in conversations.
Connected-Accounts = Connected Accounts
Connection-problem-Please-try-again-later = Connection problem. Please try again later.
CONTACT-SUPPORT = CONTACT SUPPORT
CONTINUE = CONTINUE
Coordinates-copied-to-keyboard = Coordinates copied to keyboard
# Notification when coordinates have been copied
Coordinates-copied-to-clipboard = Coordinates copied to clipboard
# Button that copies coordinates to the clipboard
Copy-coordinates = Copy Coordinates
Copy-map-coordinates = Copy map coordinates
# Right to control copies of a creative work; this string may be used as a
# heading to describe general information about rights, attribution, and
# licensing
Copyright = Copyright
Couldnt-create-comment = Couldn't create comment
Couldnt-create-identification-error = Couldn't create identification { $error }
Couldnt-create-identification-unknown-error = Couldn't create identification, Unknown Error.
Couldnt-create-identification-unknown-error = Couldn't create identification, unknown error.
CREATE-AN-ACCOUNT = CREATE AN ACCOUNT
Create-an-observation-evidence = Create an observation with no evidence
CREATE-YOUR-FIRST-OBSERVATION = CREATE YOUR FIRST OBSERVATION
@@ -171,12 +202,13 @@ DATA-QUALITY = DATA QUALITY
DATA-QUALITY-ASSESSMENT = DATA QUALITY ASSESSMENT
Data-quality-assessment-can-taxon-still-be-confirmed-improved-based-on-the-evidence = Based on the evidence, can the Community Taxon still be improved?
Data-quality-assessment-community-taxon-species-level-or-lower = Community taxon at species level or lower
# Data Quality Assessment section label: whether or not the observation date is accurate
Data-quality-assessment-date-is-accurate = Date is accurate
# checklist test for Data Quality Assessment of Observation Details
# Data Quality Assessment section label: whether or not the observation date was specified
Data-quality-assessment-date-specified = Date specified
Data-quality-assessment-description-casual = This observation has not met the conditions for Research Grade status.
Data-quality-assessment-description-needs-id = This observation has not yet met the conditions for Research Grade status:
# description for different quality grades in the DQA
# Data Quality Assessment explanation when quality is Research Grade
Data-quality-assessment-description-research = It can now be used for research and featured on other websites.
Data-quality-assessment-evidence-of-organism = Evidence of organism
Data-quality-assessment-has-photos-or-sounds = Has Photos or Sounds
@@ -187,7 +219,7 @@ Data-quality-assessment-organism-is-wild = Organism is wild
Data-quality-assessment-recent-evidence-of-organism = Recent evidence of an organism
Data-quality-assessment-title-casual = This observation is Casual Grade
Data-quality-assessment-title-needs-id = This observation Needs ID
# declares the current data quality status of the observation
# declares the current data quality status of the observation when quality is Research Grade
Data-quality-assessment-title-research = This observation is Research Grade!
Data-quality-casual-description = This observation needs more information verified to be considered verifiable
Data-quality-needs-id-description = This observation needs more identifications to reach research grade
@@ -207,9 +239,12 @@ Date-hours = { $count }h
Date-minutes = { $count }m
DATE-OBSERVED = DATE OBSERVED
Date-observed = Date observed
Date-observed-header-short = Observed
DATE-OBSERVED-NEWEST = DATE OBSERVED - NEWEST TO OLDEST
DATE-OBSERVED-OLDEST = DATE OBSERVED - OLDEST TO NEWEST
# Label for controls over a range of dates
Date-Range = Date Range
# Label for controls over a range of dates
DATE-RANGE = DATE RANGE
# Used when displaying a relative time - in this case, shows an absolute date (e.g. 12/31/22)
Date-short-format = MM/dd/yy
@@ -222,18 +257,17 @@ DATE-UPLOADED-NEWEST = DATE UPLOADED - NEWEST TO OLDEST
DATE-UPLOADED-OLDEST = DATE UPLOADED - OLDEST TO NEWEST
# Used when displaying a relative time - in this case, X weeks ago (e.g. 3w = 3 weeks ago)
Date-weeks = { $count }w
Date_observed_header_short = Observed
# Date formatting using date-fns
# See complete list of formatting styles: https://date-fns.org/v2.29.3/docs/format
datetime-format-short = M/d/yy h:mm a
# Month of December
December = December
Default-Search-Place = Default Search Place
DELETE = DELETE
Delete-all-observations = Delete all observations
Delete-comment = Delete comment
DELETE-COMMENT-QUESTION = DELETE COMMENT?
DELETE-OBSERVATION = DELETE OBSERVATION?
DELETE-COMMENT--question = DELETE COMMENT?
Delete-observation = Delete observation
DELETE-OBSERVATION--question = DELETE OBSERVATION?
# Button label or accessibility label for an element that deletes a photo
Delete-photo = Delete photo
Delete-sound = Delete sound
@@ -248,28 +282,29 @@ Deleting-x-of-y-observations =
# Tab label or section title for content that describes further details, e.g.
# the details of an observation
DETAILS = DETAILS
# Button that disables the camera's flash
Disable-flash = Disable flash
# Button that discards changes or an item, e.g. a photo
DISCARD = DISCARD
# Button that discards all items, e.g. imported photos
DISCARD-ALL = DISCARD ALL
# Button that discards changes
DISCARD-CHANGES = DISCARD CHANGES
DISCARD-FILTER-CHANGES = DISCARD FILTER CHANGES
DISCARD-MEDIA = DISCARD MEDIA?
DISCARD-MEDIA--question = DISCARD MEDIA?
DISCARD-OBSERVATION = DISCARD OBSERVATION
DISCARD-PHOTOS = DISCARD PHOTOS?
DISCARD-PHOTOS--question = DISCARD PHOTOS?
# Label for a button that discards a sound recording
DISCARD-RECORDING = DISCARD RECORDING
# Header of a popup confirming that the user wants to discard a sound
# recording
DISCARD-SOUND-header = DISCARD SOUND?
DISCARD-SOUND--question = DISCARD SOUND?
DISCARD-X-OBSERVATIONS =
{ $count ->
[one] DISCARD OBSERVATION
*[other] DISCARD { $count } OBSERVATIONS
}
DISMISS = DISMISS
Display = Display
Display-Name = Display Name
Do-not-collect-stability-and-usage-data-using-third-party-services = Do not collect stability and usage data using third-party services
DONATE = DONATE
DONATE-TO-INATURALIST = DONATE TO INATURALIST
Donate-to-iNaturalist = Donate to iNaturalist
@@ -277,6 +312,7 @@ Donate-to-iNaturalist = Donate to iNaturalist
DONE = DONE
Dont-have-an-account = Don't have an account? Sign up
During-app-start-no-model-found = During app start there was no computer vision model found. There will be no AR camera.
# Button for editing something
Edit = Edit
EDIT-COMMENT = EDIT COMMENT
Edit-comment = Edit comment
@@ -284,12 +320,13 @@ EDIT-LOCATION = EDIT LOCATION
# Label for interactive element that takes you to a location choosing screen
Edit-location = Edit location
Edit-Observation = Edit Observation
# Label for button that edits an observation's taxon
Edits-this-observations-taxon = Edits this observation's taxon
EMAIL = EMAIL
# Appears above the email text field
Email = email
EMAIL-DEBUG-LOGS = EMAIL DEBUG LOGS
Email-Notifications = Email Notifications
# Button that enables the camera's flash
Enable-flash = Enable flash
# Indicates a species only occurs in a specific place
Endemic = Endemic
# TODO this and many other uses of placeables are not currently translatable
# without knowing the vowel/consonant state of the first letter of the
@@ -316,12 +353,12 @@ EXPLORE-IDENTIFIERS = EXPLORE IDENTIFIERS
EXPLORE-OBSERVATIONS = EXPLORE OBSERVATIONS
EXPLORE-OBSERVERS = EXPLORE OBSERVERS
EXPLORE-SPECIES = EXPLORE SPECIES
External-Applications = External Applications
Failed-to-delete-sound = Failed to delete sound
# Error message with log in fails
Failed-to-log-in = Failed to log in
# Header for featured projects
FEATURED = FEATURED
# Month of February
February = February
Fetching-location = Fetching location...
Filter = Filter
@@ -341,8 +378,9 @@ Flag-Item-Other-Input-Hint = Specify the reason you're flagging this item
# Status when an item has been flagged
Flagged = Flagged
Flash = flash
# Label for a button that toggles between the front and back cameras
Flip-camera = Flip camera
FOLLOW = FOLLOW
Following = Following
# Forgot password link
Forgot-Password = Forgot Password
GEOPRIVACY = GEOPRIVACY
@@ -391,8 +429,6 @@ IMPORT-X-OBSERVATIONS =
# Identification category
improving--identification = Improving
INATURALIST-ACCOUNT-SETTINGS = INATURALIST ACCOUNT SETTINGS
iNaturalist-Activity-Notifications = iNaturalist Activity Notifications
iNaturalist-Applications = iNaturalist Applications
iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-gallery = iNaturalist can save photos you take in the app to your devices gallery.
INATURALIST-COMMUNITY = INATURALIST COMMUNITY
INATURALIST-FORUM = INATURALIST FORUM
@@ -408,7 +444,6 @@ iNaturalist-is-supported-by-community = iNaturalist is supported by our amazing
iNaturalist-mission-is-to-connect = iNaturalist's mission is to connect people to nature and advance biodiversity science and conservation.
INATURALIST-MISSION-VISION = INATURALIST'S MISSION & VISION
INATURALIST-NETWORK = INATURALIST NETWORK
iNaturalist-Network-Affiliation = iNaturalist Network Affiliation
INATURALIST-SETTINGS = INATURALIST SETTINGS
# Label for the role a user plays on iNaturalist, e.g. "INATURALIST STAFF"
# or "INATURALIST CURATOR". Since the name "INATURALIST" should not be
@@ -429,6 +464,7 @@ Internet-Connection-Required = Internet Connection Required
Intl-number = { $val }
Introduced = Introduced
Introduced-to-place = Introduced to { $place }
# Month of January
January = January
JOIN = JOIN
JOIN-PROJECT = JOIN PROJECT
@@ -442,9 +478,10 @@ JOURNAL-POSTS-WITHOUT-NUMBER =
[one] JOURNAL POST
*[other] JOURNAL POSTS
}
# Month of July
July = July
# Month of June
June = June
Language-Locale = Language/Locale
# Shows date user last active on iNaturalist on user profile
Last-Active-date = Last Active: { $date }
# Latitude, longitude on a single line on a single line
@@ -458,7 +495,6 @@ LEAVE = LEAVE
LEAVE-PROJECT = LEAVE PROJECT
LEAVE-US-A-REVIEW = LEAVE US A REVIEW!
LICENSES = LICENSES
Licensing = Licensing
List-view = List view
Loading-iNaturalists-AR-Camera = Loading iNaturalist's AR Camera
LOCATION = LOCATION
@@ -482,9 +518,11 @@ Lowest = Lowest
LOWEST-RANK = LOWEST RANK
MAP = MAP
Map-Area = Map Area
# Month of March
March = March
# Identification category
maverick--identification = Maverick
# Month of May
May = May
MEDIA = MEDIA
MEMBERS-WITHOUT-NUMBER =
@@ -502,36 +540,37 @@ MONTHS = MONTHS
More-info = More info
MOST-FAVED = MOST FAVED
Most-faved = Most faved
Names = Names
Native = Native
Native-to-place = Native to { $place }
Navigates-to-add-identification = Navigates to add identification.
Navigates-to-AR-camera = Navigates to AR camera.
Navigates-to-bulk-importer = Navigates to bulk importer.
Navigates-to-camera = Navigates to camera.
Navigates-to-explore = Navigates to explore.
Navigates-to-AR-camera = Navigates to AR camera
Navigates-to-bulk-importer = Navigates to bulk importer
Navigates-to-camera = Navigates to camera
Navigates-to-explore = Navigates to explore
Navigates-to-notifications = Navigates to notifications
Navigates-to-observation-details = Navigates to observation details screen.
Navigates-to-observation-edit-screen = Navigate to observation edit screen.
Navigates-to-observations = Navigates to observations.
Navigates-to-photo-importer = Navigate to photo importer.
Navigates-to-previous-screen = Navigate to previous screen
Navigates-to-project-details = Navigate to project details
Navigates-to-sound-recorder = Navigates to sound recorder.
Navigates-to-suggest-identification = Navigates to suggest identification.
Navigates-to-suggestions = Navigates to suggestions
Navigates-to-observation-details = Navigates to observation details screen
Navigates-to-observation-edit-screen = Navigate to observation edit screen
Navigates-to-photo-importer = Navigates to photo importer
Navigates-to-previous-screen = Navigates to previous screen
Navigates-to-project-details = Navigates to project details
Navigates-to-sound-recorder = Navigates to sound recorder
Navigates-to-suggest-identification = Navigates to suggest identification
Navigates-to-taxon-details = Navigates to taxon details
Navigates-to-user-profile = Navigates to user profile.
Navigates-to-user-profile = Navigates to user profile
# Label for button that takes you to your observations
Navigates-to-your-observations = Navigates to your observations
# Header for nearby projects
NEARBY = NEARBY
Nearby = Nearby
NEARBY-SUGGESTIONS = NEARBY SUGGESTIONS
Needs-ID = Needs ID
# Heading when creating a new observation
New-Observation = New Observation
# Sort order, refers to newest or oldest date
Newest-to-oldest = Newest to oldest
Next-observation = Next observation
No-Location = No Location
No-Media = No Media
# As in a machine learning model that powers automated suggestions
No-model-found = No model found
No-Notifications-Found = You have no notifications! Get started by creating your own observations.
No-projects-match-that-search = No projects match that search
@@ -549,6 +588,7 @@ Notifications = Notifications
notifications-user-added-comment-to-observation-by-you = <0>{ $userName }</0> added a comment to an observation by you
# notification when someone adds an identification to your observation
notifications-user-added-identification-to-observation-by-you = <0>{ $userName }</0> added an identification to an observation by you
# Month of November
November = November
Obervations-must-be-manually-added = Observations must be manually added to a traditional project, either during the upload stage or after the observation has been shared to iNaturalist. A user must also join a traditional project in order to add their observations to it.
Obscured = Obscured
@@ -566,6 +606,8 @@ Observation-with-no-evidence = Observation with no evidence
Observations = Observations
Observations-created-on-iNaturalist = Observations created on iNaturalist are used by scientists around the world.
Observations-View = Observations View
# Might be used when the number is represented using an image or other
# element, not text
OBSERVATIONS-WITHOUT-NUMBER =
{ $count ->
[one] OBSERVATION
@@ -573,6 +615,7 @@ OBSERVATIONS-WITHOUT-NUMBER =
}
# Onboarding text on MyObservations: Onboarding text on MyObservations: 11-50 observations
Observations-you-upload-to-iNaturalist = Observations you upload to iNaturalist can be used by scientists and researchers worldwide.
# Button that starts a new observation
Observe = Observe
# Title of screen asking for permission to access the gallery
Observe-and-identify-organisms-from-your-gallery = Observe and identify organisms from your gallery
@@ -581,7 +624,9 @@ Observe-and-identify-organisms-in-real-time-with-your-camera = Observe and ident
# Text for a button prompting the user to grant access to the camera
OBSERVE-ORGANISMS = OBSERVE ORGANISMS
Observers = Observers
# Section in Explore that shows people who added observations given a set of search filters
Observers-View = Observers View
# Month of October
October = October
Offensive-Inappropriate = Offensive/Inappropriate
Offensive-Inappropriate-Examples = Misleading or illegal content, racial or ethnic slurs, etc. For more on our defintion of "appropriate," see the FAQ.
@@ -589,8 +634,10 @@ Offline-DQA-description = The DQA may not be accurate. Check your internet conne
Offline-No-Notifications = Cannot fetch notifications at this time.
# Generic confirmation, e.g. button on a warning alert
OK = OK
# Sort order, refers to newest or oldest date
Oldest-to-newest = Oldest to newest
One-last-step = One last step!
# Adjective, as in geoprivacy
Open = Open
Open-drawer = Open drawer
OPEN-EMAIL = OPEN EMAIL
@@ -631,15 +678,14 @@ Please-try-again-when-you-are-connected-to-the-internet = Please try again when
# Help text for beginning a sound recording
Press-record-to-start = Press record to start
Previous-observation = Previous observation
Prioritize-common-names-used-in-this-place = Prioritize common names used in this place.
Privacy = Privacy
Privacy-Policy = Privacy Policy
Private = Private
Profile-Picture = Profile Picture
# As in an iNat project, a collection of observations or observation search filters
PROJECT = PROJECT
PROJECT-REQUIREMENTS = PROJECT REQUIREMENTS
Project-Settings = Project Settings
# As in iNat project, collections of observations or observation search filters
PROJECTS = PROJECTS
# As in iNat projects, collections of observations or observation search filters
Projects = Projects
QUALITY-GRADE = QUALITY GRADE
# Shortened display of an observation's quality grade (used when displayed in a badge) - in this case, Casual
@@ -689,6 +735,7 @@ Ranks-VARIETY = VARIETY
Ranks-ZOOSECTION = ZOOSECTION
Ranks-ZOOSUBSECTION = ZOOSUBSECTION
Read-more-on-Wikipedia = Read more on Wikipedia
# Heading for the sound recorder
RECORD-NEW-SOUND = RECORD NEW SOUND
# Title of screen asking for permission to access the microphone
Record-organism-sounds-with-the-microphone = Record organism sounds with the microphone
@@ -697,12 +744,20 @@ RECORD-SOUND = RECORD SOUND
Record-sounds = Record sounds with your microphone
# Imperative verb for recording a sound
Record-verb = Record
# Status while recording a sound
Recording-sound = Recording sound
Recording-stopped-Tap-play-the-current-recording = Recording stopped. Tap play the current recording.
REDO-SEARCH-IN-MAP-AREA = REDO SEARCH IN MAP AREA
# Label for a button that removes a vote of agreement
Remove-agreement = Remove agreement
# Label for a button that removes a vote of disagreement
Remove-disagreement = Remove disagreement
Remove-favorite = Remove favorite
Remove-Photos = Remove Photos
Remove-Relationship = Remove Relationship
# Hint for a button that removes a vote of agreement
Removes-your-vote-of-agreement = Removes your vote of agreement
# Hint for a button that removes a vote of disagreement
Removes-your-vote-of-disagreement = Removes your vote of disagreement
# Quality grade option
Research-Grade = Research Grade
Reset = Reset
@@ -725,7 +780,6 @@ REVIEW-INATURALIST = REVIEW INATURALIST
# reviewed the observations or not
REVIEWED = REVIEWED
Reviewed-observations-only = Reviewed observations only
Revoke = Revoke
# Label for the satellite map type
Satellite--map-type = Satellite
# Label for a button that persists something
@@ -741,7 +795,9 @@ Saved-Observation = Saved observation, in queue to upload
Scan-the-area-around-you-for-organisms = Scan the area around you for organisms.
Scientific-Name = Scientific Name
Scientific-Name-Common-Name = Scientific Name (Common Name)
# Title for a search interface
SEARCH = SEARCH
# Title for a search interface
Search = Search
SEARCH-FOR-A-LOCATION = SEARCH FOR A LOCATION
Search-for-a-project = Search for a project
@@ -770,6 +826,7 @@ Select-the-identification-you-want-to-add = Select the identification you want t
Select-user = Select user
Selects-iconic-taxon-X-for-identification = Selects iconic taxon { $iconicTaxon } for identification.
Separate-Photos = Separate Photos
# Month of September
September = September
SETTINGS = SETTINGS
Settings = Settings
@@ -780,6 +837,8 @@ Share-map = Share map
SHOP-INATURALIST-MERCH = SHOP INATURALIST MERCH
Shop-iNaturalist-Merch = Shop iNaturalist Merch
Show-observation-options = Show observation options.
# Label for button that shows identification suggestions
Shows-identification-suggestions = Shows identification suggestions
Shows-iNaturalist-bird-logo = Shows iNaturalist bird logo.
Sign-out = Sign out
Some-data-privacy-laws = Some data privacy laws, like the European Union's General Data Protection Regulation (GDPR), require explicit consent to transfer personal information from their jurisdictions to other jurisdictions where the legal protection of this information is not considered adequate. As of 2020, the European Union no longer considers the United States to be a jurisdiction that provides adequate legal protection of personal information, specifically because of the possibility of the US government surveilling data entering the US. It is possible other jurisdictions may have the same opinion.
@@ -840,7 +899,6 @@ TAXON-NAMES-DISPLAY = TAXON NAMES DISPLAY
TAXONOMIC-RANKS = TAXONOMIC RANKS
# Header for a block of text describing a taxon's taxonomy
TAXONOMY-header = TAXONOMY
Taxonomy-Settings = Taxonomy Settings
TEACHERS = TEACHERS
Teachers-Guide = Teachers' Guide
TEAM = TEAM
@@ -848,27 +906,21 @@ Terms-of-Use = Terms of Use
Text-Box-to-Describe-Reason-for-Flag = Text box to describe reason for flag.
The-exact-location-will-be-hidden = The exact location will be hidden publicly, and instead generalized to a larger area. (Threatened and endangered species are automatically obscured).
The-iNaturalist-Network = The iNaturalist network is a collection of localized websites that are fully connected to the global iNaturalist community. Network sites are supported by local institutions that promote local use and facilitate the use of data from iNaturalist to benefit local biodiversity.
The-iNaturalist-Network-is-a-collection-of-localized-websites = The iNaturalist Network is a collection of localized websites that are fully connected to the global iNaturalist community. Network sites are supported by local institutions that have signed an agreement with iNaturalist to promote local use and benefit local biodiversity. They have access to true coordinates from their countries that are automatically obscured from public view in order to protect threatened species. Your username and password works on all sites that are part of the iNaturalist Network. If you choose to affiliate with a Network site, the local institutions that operate each site will also have access to your email address (only to communicate with you about site activities) and access to the true coordinates for observations that are publicly obscured or private. Note: Please do not experimentally change your affiliation if you have more than 1000 observations.
The-iNaturalist-team-has-collaborated = The iNaturalist team has collaborated with...
The-location-will-not-be-visible = The location will not be visible to others, which means it may be difficult to identify.
There-is-no-way = There is no way to have an iNaturalist account without storing personal information, so the only way to revoke this consent is to delete your account.
# Wild status sheet descriptions
This-is-a-wild-organism = This is a wild organism and wasn't placed in this location by humans.
This-is-how-all-taxon-names-will-be-displayed-to-you-across-iNaturalist = This is how all taxon names will be displayed to you across iNaturalist
This-is-how-taxon-names-will-be-displayed = This is how all taxon names will be displayed to you across iNaturalist:
This-observer-has-opted-out-of-the-Community-Taxon = This observer has opted out of the Community Taxon
This-organism-was-placed-by-humans = This organism was placed in this location by humans. This applies to things like garden plants, pets, and zoo animals.
This-sets-your-language-and-date-formatting-preferences-across-iNaturalist = This sets your language and date formatting preferences across iNaturalist based on your locale.
This-will-be-your-default-place-for-all-searches-in-Explore-and-Identify = This will be your default place for all searches in Explore and Identify.
To-access-all-other-settings = To access all other account settings, click here:
To-learn-more-about-what-information = To learn more about what information we collect and how we use it, please see our Privacy Policy and our Terms of Use.
To-sync-your-observations-to-iNaturalist = To sync your observations to iNaturalist, please log in.
Toggle-map-type = Toggle map type
TOP-ID-SUGGESTION = TOP ID SUGGESTION
Traditional-Project = Traditional Project
Trust-with-hidden-coordinates = Trust with hidden coordinates
Umbrella-Project = Umbrella Project
Unblock = Unblock
UNFOLLOW = UNFOLLOW
UNFOLLOW-USER = UNFOLLOW USER?
# Text to show when a taxon or identification is unknown or missing
@@ -878,7 +930,6 @@ Unknown--user = Unknown
# Generic error message
Unknown-error = Unknown error
Unknown-organism = Unknown organism
Unmute = Unmute
Unreviewed-observations-only = Unreviewed observations only
Upload-Complete = Upload Complete
Upload-in-progress = Upload in progress
@@ -911,7 +962,6 @@ Use-your-devices-microphone-to-record = Use your devices microphone to record
USER = USER
User = User { $userHandle }
USERNAME = USERNAME
Username = Username
# Appears above the text fields
USERNAME-OR-EMAIL = USERNAME OR EMAIL
Using-iNaturalist-requires-the-storage = Using iNaturalist requires the storage of personal information like your email address, all iNaturalist data is stored in the United States, and we cannot be sure what legal jurisdiction you are in when you are using iNaturalist, so in order to comply with privacy laws like the GDPR, you must acknowledge that you understand and accept this risk and consent to transferring your personal information to iNaturalist's servers in the US.
@@ -926,6 +976,8 @@ View-photo = View photo
View-photo-licensing-info = View photo licensing info
VIEW-PROJECT-REQUIREMENTS = VIEW PROJECT REQUIREMENTS
VIEW-PROJECTS = VIEW PROJECTS
# Label for a button that shows identification suggestions for an observation
# or photo
View-suggestions = View suggestions
VIEW-TEACHERS-GUIDE = VIEW TEACHERS' GUIDE
# Title for a notice informing the user that they are viewing offline
@@ -939,8 +991,6 @@ Welcome-to-iNaturalist = Welcome to iNaturalist!
Welcome-user = <0>Welcome back,</0><1>{ $userHandle }</1>
WHAT-IS-INATURALIST = WHAT IS INATURALIST?
Whats-more-by-recording = What's more, by recording and sharing your observations, you'll create research-quality data for scientists working to better understand and protect nature. So if you like recording your findings from the outdoors, or if you just like learning about life, join us!
Which-traditional-projects-can-add-your-observations = Which traditional projects can add your observations?
Who-can-add-observation-fields-to-my-observations = Who can add observation fields to my observations?
WIKIPEDIA = WIKIPEDIA
Wild = Wild
WILD-STATUS = WILD STATUS

View File

@@ -1,6 +1,6 @@
{
"ABOUT": {
"comment": "Header above user biography / user description on user profile",
"comment": "Header for a general description, e.g. of a user, or of iNaturalist itself",
"val": "ABOUT"
},
"ABOUT-COLLECTION-PROJECTS": "ABOUT COLLECTION PROJECTS",
@@ -12,7 +12,6 @@
"About-the-DQA-description": "The Quality Grade summarizes the accuracy, precision, completeness, relevance, and appropriateness of an iNaturalist observation as biodiversity data. Some attributes are automatically determined, while others are subject to a vote by iNat users. iNaturalist shares licensed \"Research Grade\" observations with a number of data partners for use in science and conservation.",
"ABOUT-TRADITIONAL-PROJECTS": "ABOUT TRADITIONAL PROJECTS",
"ABOUT-UMBRELLA-PROJECTS": "ABOUT UMBRELLA PROJECTS",
"Accept-community-identifications": "Accept community identifications",
"accessible-comname-sciname": {
"comment": "Label for a taxon when a user prefers to see or hear the common name first",
"val": "{ $commonName } ({ $scientificName })"
@@ -21,12 +20,19 @@
"comment": "Label for a taxon when a user prefers to see or hear the scientific name first",
"val": "{ $scientificName } ({ $commonName })"
},
"Account": "Account",
"ACTIVITY": "ACTIVITY",
"Add-agreement": {
"comment": "Label for a button that adds a vote of agreement",
"val": "Add agreement"
},
"ADD-AN-ID": "ADD AN ID",
"ADD-COMMENT": "ADD COMMENT",
"Add-comment": "Add comment",
"Add-Date-Time": "Add Date/Time",
"Add-disagreement": {
"comment": "Label for a button that adds a vote of disagreement",
"val": "Add disagreement"
},
"ADD-EVIDENCE": "ADD EVIDENCE",
"Add-favorite": "Add favorite",
"Add-Location": "Add Location",
@@ -36,15 +42,27 @@
},
"ADD-OPTIONAL-COMMENT": "ADD OPTIONAL COMMENT",
"Add-optional-notes": "Add optional notes",
"Add-this-ID": "Add this identification",
"Added-on-date": {
"comment": "Date relationship created, shown on settings relationships screen",
"val": "Added on { $date }"
"Adds-your-vote-of-agreement": {
"comment": "Hint for a button that adds a vote of agreement",
"val": "Adds your vote of agreement"
},
"Adds-your-vote-of-disagreement": {
"comment": "Hint for a button that adds a vote of disagreement",
"val": "Adds your vote of disagreement"
},
"Affiliation": "Affiliation: { $site }",
"Agree": "Agree",
"AGREE": "AGREE",
"Agree-to-all-of-the-above": "Agree to all of the above",
"Agree": {
"comment": "Label for button that adds an identification of the same taxon as another identification",
"val": "Agree"
},
"AGREE": {
"comment": "Label for button that adds an identification of the same taxon as another identification",
"val": "AGREE"
},
"Agree-to-all-of-the-above": {
"comment": "Checkbox label that checks all of the consent agreements a user must make\nbefore signing up",
"val": "Agree to all of the above"
},
"AGREE-WITH-ID": "AGREE WITH ID?",
"Agree-with-ID-description": "Would you like to agree with the ID and suggest the following identification?",
"ALL": "ALL",
@@ -52,29 +70,36 @@
"All-observations": "All observations",
"All-organisms": "All organisms",
"all-rights-reserved": {
"comment": "license code",
"comment": "As in intellectual property rights over a photo or other creative work",
"val": "all rights reserved"
},
"ALL-SUGGESTIONS": "ALL SUGGESTIONS",
"ALL-SUGGESTIONS": {
"comment": "As in automated identification suggestions",
"val": "ALL SUGGESTIONS"
},
"Almost-done": "Almost done!",
"Already-have-an-account": "Already have an account? Log in",
"An-Internet-connection-is-required": "An Internet connection is required to load more observations.",
"Any": "Any",
"Any": {
"comment": "Generic option in a menu of choices that indicates that any of the choices\nwould be acceptable",
"val": "Any"
},
"Anyone-using-iNaturalist-can-see": {
"comment": " Geoprivacy sheet descriptions",
"val": "Anyone using iNaturalist can see where this species was observed, and scientists can most easily use it for research."
},
"app-authorized-on-date": "{ $appName } (authorized on: { $date })",
"APPLY-FILTERS": "APPLY FILTERS",
"Apply-filters": "Apply filters",
"April": "April",
"AR-Camera": "AR Camera",
"April": {
"comment": "Month of April",
"val": "April"
},
"AR-Camera": {
"comment": "Short for Augmented Reality Camera. This is what we call the camera that\noverlays identification suggestions in real time",
"val": "AR Camera"
},
"Are-you-a-teacher": "Are you a teacher wanting to use iNaturalist with your students?",
"Are-you-sure-you-want-to-sign-out": "Are you sure you want to sign out? This will delete all your observations on this device. It will not affect any observations you've uploaded to iNaturalist.",
"Arrow-down-selected": "Arrow down selected",
"Arrow-down-unselected": "Arrow down unselected",
"Arrow-up-selected": "Arrow up selected",
"Arrow-up-unselected": "Arrow up unselected",
"As-you-upload-more-observations": {
"comment": "Onboarding text on MyObservations: 0-10 observations",
"val": "As you upload more observations, others in our community may be able to help you identify them!"
@@ -85,16 +110,14 @@
"attribution-cc-by-nc-sa": "some rights reserved (CC BY-NC-SA)",
"attribution-cc-by-nd": "some rights reserved (CC BY-ND)",
"attribution-cc-by-sa": "some rights reserved (CC BY-SA)",
"August": "August",
"Automatically-update-my-content-for-taxon-changes": "Automatically update my content for taxon changes",
"August": {
"comment": "Month of August",
"val": "August"
},
"BACK-TO-LOGIN": {
"comment": "Returns user to login screen",
"val": "BACK TO LOGIN"
},
"Bio": {
"comment": "Header for inserting user description in settings profile tab",
"val": "Bio"
},
"BLOG": "BLOG",
"Bulk-importer": {
"comment": "Accessibility label for bulk import / photo import button\nThese are used by screen readers to label actionable elements iOS: https://developer.apple.com/documentation/uikit/uiaccessibilityelement/1619577-accessibilitylabel\niOS Guidelines \"A string that succinctly identifies the accessibility element.\" Starts with capital letter, no ending punctuation.",
@@ -106,26 +129,71 @@
"By-exiting-your-photos-will-not-be-saved": "By exiting, your photos will not be saved.",
"By-exiting-your-recorded-sound-will-not-be-saved": "By exiting, your recorded sound will not be saved.",
"Camera": "Camera",
"Camera-flip": "Camera-flip",
"CANCEL": "CANCEL",
"Cancel": "Cancel",
"Captive-Cultivated": "Captive/Cultivated",
"Casual": "Casual",
"CC-BY": "CC BY",
"CC-BY-NC": "CC BY-NC",
"CC-BY-NC-ND": "CC BY-NC-ND",
"CC-BY-NC-SA": "CC BY-NC-SA",
"CC-BY-ND": "CC BY-ND",
"CC-BY-SA": "CC BY-SA",
"CC0": "CC0",
"CHANGE-DATE": "CHANGE DATE",
"Change-date": "Change date",
"CHANGE-END-DATE": "CHANGE END DATE",
"Change-end-date": "Change end date",
"Casual": {
"comment": "\"Casual\" Data quality grade",
"val": "Casual"
},
"CC-BY": {
"comment": "Short label for the Creative Commons Attribution license",
"val": "CC BY"
},
"CC-BY-NC": {
"comment": "Short label for the Creative Commons Attribution-NonCommercial license",
"val": "CC BY-NC"
},
"CC-BY-NC-ND": {
"comment": "Short label for the Creative Commons Attribution-NonCommercial-NoDerivatives license",
"val": "CC BY-NC-ND"
},
"CC-BY-NC-SA": {
"comment": "Short label for the Creative Commons Attribution-NonCommercial-ShareAlike license",
"val": "CC BY-NC-SA"
},
"CC-BY-ND": {
"comment": "Short label for the Creative Commons Attribution-NoDerivatives license",
"val": "CC BY-ND"
},
"CC-BY-SA": {
"comment": "Short label for the Creative Commons Attribution-ShareAlike license",
"val": "CC BY-SA"
},
"CC0": {
"comment": "Short label for the Creative Commons Zero declaration",
"val": "CC0"
},
"CHANGE-DATE": {
"comment": "Label for a button that changes a selected date",
"val": "CHANGE DATE"
},
"Change-date": {
"comment": "Label for a button that changes a selected date",
"val": "Change date"
},
"CHANGE-END-DATE": {
"comment": "Label for a button that changes a selected end date",
"val": "CHANGE END DATE"
},
"Change-end-date": {
"comment": "Label for a button that changes a selected end date",
"val": "Change end date"
},
"Change-project": "Change project",
"CHANGE-START-DATE": "CHANGE START DATE",
"Change-start-date": "Change start date",
"CHANGE-START-DATE": {
"comment": "Label for a button that changes a selected start date",
"val": "CHANGE START DATE"
},
"Change-start-date": {
"comment": "Label for a button that changes a selected start date",
"val": "Change start date"
},
"Change-taxon": "Change taxon",
"Change-taxon-filter": {
"comment": "Button that changes the taxon filter on Explore",
"val": "Change taxon filter"
},
"Change-user": "Change user",
"Change-zoom": {
"comment": "Label for a button that cycles through zoom levels for the camera",
@@ -133,50 +201,80 @@
},
"Check-this-box-if-you-want-to-apply-a-Creative-Commons": "Check this box if you want to apply a Creative Commons",
"CHECK-YOUR-EMAIL": {
"comment": "After pressing the reset password button",
"comment": "Notification that appears after pressing the reset password button",
"val": "CHECK YOUR EMAIL!"
},
"Checkmark": "Checkmark",
"CHOOSE-PHOTOS": {
"comment": "Text for a button prompting the user to grant access to the gallery",
"val": "CHOOSE PHOTOS"
},
"Clear": "Clear",
"Close": "Close",
"Close-add-observation-modal": "Close add observation modal.",
"Choose-taxon": {
"comment": "Label for button that chooses a taxon",
"val": "Choose taxon"
},
"Clear": {
"comment": "Label for a button that clears content, like the text entered in a text\nfield",
"val": "Clear"
},
"Close": {
"comment": "Label for a button that closes a window or popup",
"val": "Close"
},
"Close-permission-request-screen": {
"comment": "Accessibility label for a button that closes the permission request screen",
"val": "Close permission request screen"
},
"Close-search": "Close search",
"Close-search": {
"comment": "Label for a button that closes a search interface",
"val": "Close search"
},
"Closes-new-observation-options": "Closes new observation options.",
"Closes-withdraw-id-sheet": "Closes \"Withdraw ID\" sheet",
"COLLABORATORS": "COLLABORATORS",
"COLLABORATORS": {
"comment": "Heading for a section that describes people and organizations that\ncollaborate with iNaturalist",
"val": "COLLABORATORS"
},
"Collection-Project": "Collection Project",
"Combine-Photos": "Combine Photos",
"COMMENT": "COMMENT",
"Combine-Photos": {
"comment": "Button that combines multiple photos into a single observation",
"val": "Combine Photos"
},
"COMMENT": {
"comment": "Title for a form that let's you enter a comment",
"val": "COMMENT"
},
"Comment-options": {
"comment": "Accessibility label for a button that shows options for a comment",
"comment": "Label for a button that shows options for a comment",
"val": "Comment options"
},
"Common-Name-Scientific-Name": "Common Name (Scientific Name)",
"Common-Name-Scientific-Name": {
"comment": "Label for a setting that shows the common name first",
"val": "Common Name (Scientific Name)"
},
"Community-Guidelines": "Community Guidelines",
"Community-Moderation-Settings": "Community Moderation Settings",
"CONFIRM": "CONFIRM",
"CONFIRM": {
"comment": "Button that confirms a choice the user has made",
"val": "CONFIRM"
},
"Connect-with-other-naturalists": "Connect with other naturalists and engage in conversations.",
"Connected-Accounts": "Connected Accounts",
"Connection-problem-Please-try-again-later": "Connection problem. Please try again later.",
"CONTACT-SUPPORT": "CONTACT SUPPORT",
"CONTINUE": "CONTINUE",
"Coordinates-copied-to-keyboard": "Coordinates copied to keyboard",
"Copy-coordinates": "Copy Coordinates",
"Copy-map-coordinates": "Copy map coordinates",
"Coordinates-copied-to-clipboard": {
"comment": "Notification when coordinates have been copied",
"val": "Coordinates copied to clipboard"
},
"Copy-coordinates": {
"comment": "Button that copies coordinates to the clipboard",
"val": "Copy Coordinates"
},
"Copyright": {
"comment": "Right to control copies of a creative work; this string may be used as a\nheading to describe general information about rights, attribution, and\nlicensing",
"val": "Copyright"
},
"Couldnt-create-comment": "Couldn't create comment",
"Couldnt-create-identification-error": "Couldn't create identification { $error }",
"Couldnt-create-identification-unknown-error": "Couldn't create identification, Unknown Error.",
"Couldnt-create-identification-unknown-error": "Couldn't create identification, unknown error.",
"CREATE-AN-ACCOUNT": "CREATE AN ACCOUNT",
"Create-an-observation-evidence": "Create an observation with no evidence",
"CREATE-YOUR-FIRST-OBSERVATION": "CREATE YOUR FIRST OBSERVATION",
@@ -184,15 +282,18 @@
"DATA-QUALITY-ASSESSMENT": "DATA QUALITY ASSESSMENT",
"Data-quality-assessment-can-taxon-still-be-confirmed-improved-based-on-the-evidence": "Based on the evidence, can the Community Taxon still be improved?",
"Data-quality-assessment-community-taxon-species-level-or-lower": "Community taxon at species level or lower",
"Data-quality-assessment-date-is-accurate": "Date is accurate",
"Data-quality-assessment-date-is-accurate": {
"comment": "Data Quality Assessment section label: whether or not the observation date is accurate",
"val": "Date is accurate"
},
"Data-quality-assessment-date-specified": {
"comment": "checklist test for Data Quality Assessment of Observation Details",
"comment": "Data Quality Assessment section label: whether or not the observation date was specified",
"val": "Date specified"
},
"Data-quality-assessment-description-casual": "This observation has not met the conditions for Research Grade status.",
"Data-quality-assessment-description-needs-id": "This observation has not yet met the conditions for Research Grade status:",
"Data-quality-assessment-description-research": {
"comment": "description for different quality grades in the DQA",
"comment": "Data Quality Assessment explanation when quality is Research Grade",
"val": "It can now be used for research and featured on other websites."
},
"Data-quality-assessment-evidence-of-organism": "Evidence of organism",
@@ -205,7 +306,7 @@
"Data-quality-assessment-title-casual": "This observation is Casual Grade",
"Data-quality-assessment-title-needs-id": "This observation Needs ID",
"Data-quality-assessment-title-research": {
"comment": "declares the current data quality status of the observation",
"comment": "declares the current data quality status of the observation when quality is Research Grade",
"val": "This observation is Research Grade!"
},
"Data-quality-casual-description": "This observation needs more information verified to be considered verifiable",
@@ -234,10 +335,17 @@
},
"DATE-OBSERVED": "DATE OBSERVED",
"Date-observed": "Date observed",
"Date-observed-header-short": "Observed",
"DATE-OBSERVED-NEWEST": "DATE OBSERVED - NEWEST TO OLDEST",
"DATE-OBSERVED-OLDEST": "DATE OBSERVED - OLDEST TO NEWEST",
"Date-Range": "Date Range",
"DATE-RANGE": "DATE RANGE",
"Date-Range": {
"comment": "Label for controls over a range of dates",
"val": "Date Range"
},
"DATE-RANGE": {
"comment": "Label for controls over a range of dates",
"val": "DATE RANGE"
},
"Date-short-format": {
"comment": "Used when displaying a relative time - in this case, shows an absolute date (e.g. 12/31/22)",
"val": "MM/dd/yy"
@@ -255,19 +363,20 @@
"comment": "Used when displaying a relative time - in this case, X weeks ago (e.g. 3w = 3 weeks ago)",
"val": "{ $count }w"
},
"Date_observed_header_short": "Observed",
"datetime-format-short": {
"comment": "Date formatting using date-fns\nSee complete list of formatting styles: https://date-fns.org/v2.29.3/docs/format",
"val": "M/d/yy h:mm a"
},
"December": "December",
"Default-Search-Place": "Default Search Place",
"December": {
"comment": "Month of December",
"val": "December"
},
"DELETE": "DELETE",
"Delete-all-observations": "Delete all observations",
"Delete-comment": "Delete comment",
"DELETE-COMMENT-QUESTION": "DELETE COMMENT?",
"DELETE-OBSERVATION": "DELETE OBSERVATION?",
"DELETE-COMMENT--question": "DELETE COMMENT?",
"Delete-observation": "Delete observation",
"DELETE-OBSERVATION--question": "DELETE OBSERVATION?",
"Delete-photo": {
"comment": "Button label or accessibility label for an element that deletes a photo",
"val": "Delete photo"
@@ -285,27 +394,36 @@
"comment": "Tab label or section title for content that describes further details, e.g.\nthe details of an observation",
"val": "DETAILS"
},
"Disable-flash": "Disable flash",
"DISCARD": "DISCARD",
"DISCARD-ALL": "DISCARD ALL",
"DISCARD-CHANGES": "DISCARD CHANGES",
"Disable-flash": {
"comment": "Button that disables the camera's flash",
"val": "Disable flash"
},
"DISCARD": {
"comment": "Button that discards changes or an item, e.g. a photo",
"val": "DISCARD"
},
"DISCARD-ALL": {
"comment": "Button that discards all items, e.g. imported photos",
"val": "DISCARD ALL"
},
"DISCARD-CHANGES": {
"comment": "Button that discards changes",
"val": "DISCARD CHANGES"
},
"DISCARD-FILTER-CHANGES": "DISCARD FILTER CHANGES",
"DISCARD-MEDIA": "DISCARD MEDIA?",
"DISCARD-MEDIA--question": "DISCARD MEDIA?",
"DISCARD-OBSERVATION": "DISCARD OBSERVATION",
"DISCARD-PHOTOS": "DISCARD PHOTOS?",
"DISCARD-PHOTOS--question": "DISCARD PHOTOS?",
"DISCARD-RECORDING": {
"comment": "Label for a button that discards a sound recording",
"val": "DISCARD RECORDING"
},
"DISCARD-SOUND-header": {
"DISCARD-SOUND--question": {
"comment": "Header of a popup confirming that the user wants to discard a sound\nrecording",
"val": "DISCARD SOUND?"
},
"DISCARD-X-OBSERVATIONS": "{ $count ->\n [one] DISCARD OBSERVATION\n *[other] DISCARD { $count } OBSERVATIONS\n}",
"DISMISS": "DISMISS",
"Display": "Display",
"Display-Name": "Display Name",
"Do-not-collect-stability-and-usage-data-using-third-party-services": "Do not collect stability and usage data using third-party services",
"DONATE": "DONATE",
"DONATE-TO-INATURALIST": "DONATE TO INATURALIST",
"Donate-to-iNaturalist": "Donate to iNaturalist",
@@ -315,7 +433,10 @@
},
"Dont-have-an-account": "Don't have an account? Sign up",
"During-app-start-no-model-found": "During app start there was no computer vision model found. There will be no AR camera.",
"Edit": "Edit",
"Edit": {
"comment": "Button for editing something",
"val": "Edit"
},
"EDIT-COMMENT": "EDIT COMMENT",
"Edit-comment": "Edit comment",
"EDIT-LOCATION": "EDIT LOCATION",
@@ -324,15 +445,20 @@
"val": "Edit location"
},
"Edit-Observation": "Edit Observation",
"EMAIL": "EMAIL",
"Email": {
"comment": "Appears above the email text field",
"val": "email"
"Edits-this-observations-taxon": {
"comment": "Label for button that edits an observation's taxon",
"val": "Edits this observation's taxon"
},
"EMAIL": "EMAIL",
"EMAIL-DEBUG-LOGS": "EMAIL DEBUG LOGS",
"Email-Notifications": "Email Notifications",
"Enable-flash": "Enable flash",
"Endemic": "Endemic",
"Enable-flash": {
"comment": "Button that enables the camera's flash",
"val": "Enable flash"
},
"Endemic": {
"comment": "Indicates a species only occurs in a specific place",
"val": "Endemic"
},
"Endemic-to-place": {
"comment": "TODO this and many other uses of placeables are not currently translatable\nwithout knowing the vowel/consonant state of the first letter of the\nplaceable",
"val": "Endemic to { $place }"
@@ -362,7 +488,6 @@
"EXPLORE-OBSERVATIONS": "EXPLORE OBSERVATIONS",
"EXPLORE-OBSERVERS": "EXPLORE OBSERVERS",
"EXPLORE-SPECIES": "EXPLORE SPECIES",
"External-Applications": "External Applications",
"Failed-to-delete-sound": "Failed to delete sound",
"Failed-to-log-in": {
"comment": "Error message with log in fails",
@@ -372,7 +497,10 @@
"comment": "Header for featured projects",
"val": "FEATURED"
},
"February": "February",
"February": {
"comment": "Month of February",
"val": "February"
},
"Fetching-location": "Fetching location...",
"Filter": "Filter",
"FILTER-BY-A-PROJECT": "FILTER BY A PROJECT",
@@ -393,8 +521,11 @@
"val": "Flagged"
},
"Flash": "flash",
"Flip-camera": {
"comment": "Label for a button that toggles between the front and back cameras",
"val": "Flip camera"
},
"FOLLOW": "FOLLOW",
"Following": "Following",
"Forgot-Password": {
"comment": "Forgot password link",
"val": "Forgot Password"
@@ -455,8 +586,6 @@
"val": "Improving"
},
"INATURALIST-ACCOUNT-SETTINGS": "INATURALIST ACCOUNT SETTINGS",
"iNaturalist-Activity-Notifications": "iNaturalist Activity Notifications",
"iNaturalist-Applications": "iNaturalist Applications",
"iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-gallery": "iNaturalist can save photos you take in the app to your devices gallery.",
"INATURALIST-COMMUNITY": "INATURALIST COMMUNITY",
"INATURALIST-FORUM": "INATURALIST FORUM",
@@ -472,7 +601,6 @@
"iNaturalist-mission-is-to-connect": "iNaturalist's mission is to connect people to nature and advance biodiversity science and conservation.",
"INATURALIST-MISSION-VISION": "INATURALIST'S MISSION & VISION",
"INATURALIST-NETWORK": "INATURALIST NETWORK",
"iNaturalist-Network-Affiliation": "iNaturalist Network Affiliation",
"INATURALIST-SETTINGS": "INATURALIST SETTINGS",
"INATURALIST-STAFF": {
"comment": "Label for the role a user plays on iNaturalist, e.g. \"INATURALIST STAFF\"\nor \"INATURALIST CURATOR\". Since the name \"INATURALIST\" should not be\ntranslated or locally it is inserted as a variable here, but it will always\nbe \"INATURALIST\"",
@@ -494,7 +622,10 @@
"Intl-number": "{ $val }",
"Introduced": "Introduced",
"Introduced-to-place": "Introduced to { $place }",
"January": "January",
"January": {
"comment": "Month of January",
"val": "January"
},
"JOIN": "JOIN",
"JOIN-PROJECT": "JOIN PROJECT",
"Join-the-largest-community-of-naturalists": "Join the largest community of naturalists in the world!",
@@ -507,9 +638,14 @@
"val": "Joined: { $date }"
},
"JOURNAL-POSTS-WITHOUT-NUMBER": "{ $count ->\n [one] JOURNAL POST\n *[other] JOURNAL POSTS\n}",
"July": "July",
"June": "June",
"Language-Locale": "Language/Locale",
"July": {
"comment": "Month of July",
"val": "July"
},
"June": {
"comment": "Month of June",
"val": "June"
},
"Last-Active-date": {
"comment": "Shows date user last active on iNaturalist on user profile",
"val": "Last Active: { $date }"
@@ -531,7 +667,6 @@
"LEAVE-PROJECT": "LEAVE PROJECT",
"LEAVE-US-A-REVIEW": "LEAVE US A REVIEW!",
"LICENSES": "LICENSES",
"Licensing": "Licensing",
"List-view": "List view",
"Loading-iNaturalists-AR-Camera": "Loading iNaturalist's AR Camera",
"LOCATION": "LOCATION",
@@ -561,12 +696,18 @@
"LOWEST-RANK": "LOWEST RANK",
"MAP": "MAP",
"Map-Area": "Map Area",
"March": "March",
"March": {
"comment": "Month of March",
"val": "March"
},
"maverick--identification": {
"comment": "Identification category",
"val": "Maverick"
},
"May": "May",
"May": {
"comment": "Month of May",
"val": "May"
},
"MEDIA": "MEDIA",
"MEMBERS-WITHOUT-NUMBER": "{ $count ->\n [one] MEMBER\n *[other] MEMBERS\n}",
"Menu": {
@@ -581,26 +722,26 @@
"More-info": "More info",
"MOST-FAVED": "MOST FAVED",
"Most-faved": "Most faved",
"Names": "Names",
"Native": "Native",
"Native-to-place": "Native to { $place }",
"Navigates-to-add-identification": "Navigates to add identification.",
"Navigates-to-AR-camera": "Navigates to AR camera.",
"Navigates-to-bulk-importer": "Navigates to bulk importer.",
"Navigates-to-camera": "Navigates to camera.",
"Navigates-to-explore": "Navigates to explore.",
"Navigates-to-AR-camera": "Navigates to AR camera",
"Navigates-to-bulk-importer": "Navigates to bulk importer",
"Navigates-to-camera": "Navigates to camera",
"Navigates-to-explore": "Navigates to explore",
"Navigates-to-notifications": "Navigates to notifications",
"Navigates-to-observation-details": "Navigates to observation details screen.",
"Navigates-to-observation-edit-screen": "Navigate to observation edit screen.",
"Navigates-to-observations": "Navigates to observations.",
"Navigates-to-photo-importer": "Navigate to photo importer.",
"Navigates-to-previous-screen": "Navigate to previous screen",
"Navigates-to-project-details": "Navigate to project details",
"Navigates-to-sound-recorder": "Navigates to sound recorder.",
"Navigates-to-suggest-identification": "Navigates to suggest identification.",
"Navigates-to-suggestions": "Navigates to suggestions",
"Navigates-to-observation-details": "Navigates to observation details screen",
"Navigates-to-observation-edit-screen": "Navigate to observation edit screen",
"Navigates-to-photo-importer": "Navigates to photo importer",
"Navigates-to-previous-screen": "Navigates to previous screen",
"Navigates-to-project-details": "Navigates to project details",
"Navigates-to-sound-recorder": "Navigates to sound recorder",
"Navigates-to-suggest-identification": "Navigates to suggest identification",
"Navigates-to-taxon-details": "Navigates to taxon details",
"Navigates-to-user-profile": "Navigates to user profile.",
"Navigates-to-user-profile": "Navigates to user profile",
"Navigates-to-your-observations": {
"comment": "Label for button that takes you to your observations",
"val": "Navigates to your observations"
},
"NEARBY": {
"comment": "Header for nearby projects",
"val": "NEARBY"
@@ -608,12 +749,21 @@
"Nearby": "Nearby",
"NEARBY-SUGGESTIONS": "NEARBY SUGGESTIONS",
"Needs-ID": "Needs ID",
"New-Observation": "New Observation",
"Newest-to-oldest": "Newest to oldest",
"New-Observation": {
"comment": "Heading when creating a new observation",
"val": "New Observation"
},
"Newest-to-oldest": {
"comment": "Sort order, refers to newest or oldest date",
"val": "Newest to oldest"
},
"Next-observation": "Next observation",
"No-Location": "No Location",
"No-Media": "No Media",
"No-model-found": "No model found",
"No-model-found": {
"comment": "As in a machine learning model that powers automated suggestions",
"val": "No model found"
},
"No-Notifications-Found": "You have no notifications! Get started by creating your own observations.",
"No-projects-match-that-search": "No projects match that search",
"No-results-found": {
@@ -640,7 +790,10 @@
"comment": "notification when someone adds an identification to your observation",
"val": "<0>{ $userName }</0> added an identification to an observation by you"
},
"November": "November",
"November": {
"comment": "Month of November",
"val": "November"
},
"Obervations-must-be-manually-added": "Observations must be manually added to a traditional project, either during the upload stage or after the observation has been shared to iNaturalist. A user must also join a traditional project in order to add their observations to it.",
"Obscured": "Obscured",
"Obscured-observation-location-map-description": {
@@ -661,12 +814,18 @@
"Observations": "Observations",
"Observations-created-on-iNaturalist": "Observations created on iNaturalist are used by scientists around the world.",
"Observations-View": "Observations View",
"OBSERVATIONS-WITHOUT-NUMBER": "{ $count ->\n [one] OBSERVATION\n *[other] OBSERVATIONS\n}",
"OBSERVATIONS-WITHOUT-NUMBER": {
"comment": "Might be used when the number is represented using an image or other\nelement, not text",
"val": "{ $count ->\n [one] OBSERVATION\n *[other] OBSERVATIONS\n}"
},
"Observations-you-upload-to-iNaturalist": {
"comment": "Onboarding text on MyObservations: Onboarding text on MyObservations: 11-50 observations",
"val": "Observations you upload to iNaturalist can be used by scientists and researchers worldwide."
},
"Observe": "Observe",
"Observe": {
"comment": "Button that starts a new observation",
"val": "Observe"
},
"Observe-and-identify-organisms-from-your-gallery": {
"comment": "Title of screen asking for permission to access the gallery",
"val": "Observe and identify organisms from your gallery"
@@ -680,8 +839,14 @@
"val": "OBSERVE ORGANISMS"
},
"Observers": "Observers",
"Observers-View": "Observers View",
"October": "October",
"Observers-View": {
"comment": "Section in Explore that shows people who added observations given a set of search filters",
"val": "Observers View"
},
"October": {
"comment": "Month of October",
"val": "October"
},
"Offensive-Inappropriate": "Offensive/Inappropriate",
"Offensive-Inappropriate-Examples": "Misleading or illegal content, racial or ethnic slurs, etc. For more on our defintion of \"appropriate,\" see the FAQ.",
"Offline-DQA-description": "The DQA may not be accurate. Check your internet connection and try again.",
@@ -690,9 +855,15 @@
"comment": "Generic confirmation, e.g. button on a warning alert",
"val": "OK"
},
"Oldest-to-newest": "Oldest to newest",
"Oldest-to-newest": {
"comment": "Sort order, refers to newest or oldest date",
"val": "Oldest to newest"
},
"One-last-step": "One last step!",
"Open": "Open",
"Open": {
"comment": "Adjective, as in geoprivacy",
"val": "Open"
},
"Open-drawer": "Open drawer",
"OPEN-EMAIL": "OPEN EMAIL",
"Open-menu": "Open menu.",
@@ -748,16 +919,21 @@
"val": "Press record to start"
},
"Previous-observation": "Previous observation",
"Prioritize-common-names-used-in-this-place": "Prioritize common names used in this place.",
"Privacy": "Privacy",
"Privacy-Policy": "Privacy Policy",
"Private": "Private",
"Profile-Picture": "Profile Picture",
"PROJECT": "PROJECT",
"PROJECT": {
"comment": "As in an iNat project, a collection of observations or observation search filters",
"val": "PROJECT"
},
"PROJECT-REQUIREMENTS": "PROJECT REQUIREMENTS",
"Project-Settings": "Project Settings",
"PROJECTS": "PROJECTS",
"Projects": "Projects",
"PROJECTS": {
"comment": "As in iNat project, collections of observations or observation search filters",
"val": "PROJECTS"
},
"Projects": {
"comment": "As in iNat projects, collections of observations or observation search filters",
"val": "Projects"
},
"QUALITY-GRADE": "QUALITY GRADE",
"Quality-Grade-casual": {
"comment": "Shortened display of an observation's quality grade (used when displayed in a badge) - in this case, Casual",
@@ -814,7 +990,10 @@
"Ranks-ZOOSECTION": "ZOOSECTION",
"Ranks-ZOOSUBSECTION": "ZOOSUBSECTION",
"Read-more-on-Wikipedia": "Read more on Wikipedia",
"RECORD-NEW-SOUND": "RECORD NEW SOUND",
"RECORD-NEW-SOUND": {
"comment": "Heading for the sound recorder",
"val": "RECORD NEW SOUND"
},
"Record-organism-sounds-with-the-microphone": {
"comment": "Title of screen asking for permission to access the microphone",
"val": "Record organism sounds with the microphone"
@@ -828,12 +1007,30 @@
"comment": "Imperative verb for recording a sound",
"val": "Record"
},
"Recording-sound": "Recording sound",
"Recording-sound": {
"comment": "Status while recording a sound",
"val": "Recording sound"
},
"Recording-stopped-Tap-play-the-current-recording": "Recording stopped. Tap play the current recording.",
"REDO-SEARCH-IN-MAP-AREA": "REDO SEARCH IN MAP AREA",
"Remove-agreement": {
"comment": "Label for a button that removes a vote of agreement",
"val": "Remove agreement"
},
"Remove-disagreement": {
"comment": "Label for a button that removes a vote of disagreement",
"val": "Remove disagreement"
},
"Remove-favorite": "Remove favorite",
"Remove-Photos": "Remove Photos",
"Remove-Relationship": "Remove Relationship",
"Removes-your-vote-of-agreement": {
"comment": "Hint for a button that removes a vote of agreement",
"val": "Removes your vote of agreement"
},
"Removes-your-vote-of-disagreement": {
"comment": "Hint for a button that removes a vote of disagreement",
"val": "Removes your vote of disagreement"
},
"Research-Grade": {
"comment": "Quality grade option",
"val": "Research Grade"
@@ -867,7 +1064,6 @@
"val": "REVIEWED"
},
"Reviewed-observations-only": "Reviewed observations only",
"Revoke": "Revoke",
"Satellite--map-type": {
"comment": "Label for the satellite map type",
"val": "Satellite"
@@ -889,8 +1085,14 @@
"Scan-the-area-around-you-for-organisms": "Scan the area around you for organisms.",
"Scientific-Name": "Scientific Name",
"Scientific-Name-Common-Name": "Scientific Name (Common Name)",
"SEARCH": "SEARCH",
"Search": "Search",
"SEARCH": {
"comment": "Title for a search interface",
"val": "SEARCH"
},
"Search": {
"comment": "Title for a search interface",
"val": "Search"
},
"SEARCH-FOR-A-LOCATION": "SEARCH FOR A LOCATION",
"Search-for-a-project": "Search for a project",
"SEARCH-FOR-A-TAXON": "SEARCH FOR A TAXON",
@@ -930,7 +1132,10 @@
},
"Selects-iconic-taxon-X-for-identification": "Selects iconic taxon { $iconicTaxon } for identification.",
"Separate-Photos": "Separate Photos",
"September": "September",
"September": {
"comment": "Month of September",
"val": "September"
},
"SETTINGS": "SETTINGS",
"Settings": "Settings",
"Share": "Share",
@@ -940,6 +1145,10 @@
"SHOP-INATURALIST-MERCH": "SHOP INATURALIST MERCH",
"Shop-iNaturalist-Merch": "Shop iNaturalist Merch",
"Show-observation-options": "Show observation options.",
"Shows-identification-suggestions": {
"comment": "Label for button that shows identification suggestions",
"val": "Shows identification suggestions"
},
"Shows-iNaturalist-bird-logo": "Shows iNaturalist bird logo.",
"Sign-out": "Sign out",
"Some-data-privacy-laws": "Some data privacy laws, like the European Union's General Data Protection Regulation (GDPR), require explicit consent to transfer personal information from their jurisdictions to other jurisdictions where the legal protection of this information is not considered adequate. As of 2020, the European Union no longer considers the United States to be a jurisdiction that provides adequate legal protection of personal information, specifically because of the possibility of the US government surveilling data entering the US. It is possible other jurisdictions may have the same opinion.",
@@ -1014,7 +1223,6 @@
"comment": "Header for a block of text describing a taxon's taxonomy",
"val": "TAXONOMY"
},
"Taxonomy-Settings": "Taxonomy Settings",
"TEACHERS": "TEACHERS",
"Teachers-Guide": "Teachers' Guide",
"TEAM": "TEAM",
@@ -1022,7 +1230,6 @@
"Text-Box-to-Describe-Reason-for-Flag": "Text box to describe reason for flag.",
"The-exact-location-will-be-hidden": "The exact location will be hidden publicly, and instead generalized to a larger area. (Threatened and endangered species are automatically obscured).",
"The-iNaturalist-Network": "The iNaturalist network is a collection of localized websites that are fully connected to the global iNaturalist community. Network sites are supported by local institutions that promote local use and facilitate the use of data from iNaturalist to benefit local biodiversity.",
"The-iNaturalist-Network-is-a-collection-of-localized-websites": "The iNaturalist Network is a collection of localized websites that are fully connected to the global iNaturalist community. Network sites are supported by local institutions that have signed an agreement with iNaturalist to promote local use and benefit local biodiversity. They have access to true coordinates from their countries that are automatically obscured from public view in order to protect threatened species. Your username and password works on all sites that are part of the iNaturalist Network. If you choose to affiliate with a Network site, the local institutions that operate each site will also have access to your email address (only to communicate with you about site activities) and access to the true coordinates for observations that are publicly obscured or private. Note: Please do not experimentally change your affiliation if you have more than 1000 observations.",
"The-iNaturalist-team-has-collaborated": "The iNaturalist team has collaborated with...",
"The-location-will-not-be-visible": "The location will not be visible to others, which means it may be difficult to identify.",
"There-is-no-way": "There is no way to have an iNaturalist account without storing personal information, so the only way to revoke this consent is to delete your account.",
@@ -1030,21 +1237,16 @@
"comment": " Wild status sheet descriptions",
"val": "This is a wild organism and wasn't placed in this location by humans."
},
"This-is-how-all-taxon-names-will-be-displayed-to-you-across-iNaturalist": "This is how all taxon names will be displayed to you across iNaturalist",
"This-is-how-taxon-names-will-be-displayed": "This is how all taxon names will be displayed to you across iNaturalist:",
"This-observer-has-opted-out-of-the-Community-Taxon": "This observer has opted out of the Community Taxon",
"This-organism-was-placed-by-humans": "This organism was placed in this location by humans. This applies to things like garden plants, pets, and zoo animals.",
"This-sets-your-language-and-date-formatting-preferences-across-iNaturalist": "This sets your language and date formatting preferences across iNaturalist based on your locale.",
"This-will-be-your-default-place-for-all-searches-in-Explore-and-Identify": "This will be your default place for all searches in Explore and Identify.",
"To-access-all-other-settings": "To access all other account settings, click here:",
"To-learn-more-about-what-information": "To learn more about what information we collect and how we use it, please see our Privacy Policy and our Terms of Use.",
"To-sync-your-observations-to-iNaturalist": "To sync your observations to iNaturalist, please log in.",
"Toggle-map-type": "Toggle map type",
"TOP-ID-SUGGESTION": "TOP ID SUGGESTION",
"Traditional-Project": "Traditional Project",
"Trust-with-hidden-coordinates": "Trust with hidden coordinates",
"Umbrella-Project": "Umbrella Project",
"Unblock": "Unblock",
"UNFOLLOW": "UNFOLLOW",
"UNFOLLOW-USER": "UNFOLLOW USER?",
"Unknown--taxon": {
@@ -1060,7 +1262,6 @@
"val": "Unknown error"
},
"Unknown-organism": "Unknown organism",
"Unmute": "Unmute",
"Unreviewed-observations-only": "Unreviewed observations only",
"Upload-Complete": "Upload Complete",
"Upload-in-progress": "Upload in progress",
@@ -1095,7 +1296,6 @@
"USER": "USER",
"User": "User { $userHandle }",
"USERNAME": "USERNAME",
"Username": "Username",
"USERNAME-OR-EMAIL": {
"comment": "Appears above the text fields",
"val": "USERNAME OR EMAIL"
@@ -1113,7 +1313,10 @@
"View-photo-licensing-info": "View photo licensing info",
"VIEW-PROJECT-REQUIREMENTS": "VIEW PROJECT REQUIREMENTS",
"VIEW-PROJECTS": "VIEW PROJECTS",
"View-suggestions": "View suggestions",
"View-suggestions": {
"comment": "Label for a button that shows identification suggestions for an observation\nor photo",
"val": "View suggestions"
},
"VIEW-TEACHERS-GUIDE": "VIEW TEACHERS' GUIDE",
"Viewing-Offline-Suggestions": {
"comment": "Title for a notice informing the user that they are viewing offline\nidentification suggestions",
@@ -1129,8 +1332,6 @@
},
"WHAT-IS-INATURALIST": "WHAT IS INATURALIST?",
"Whats-more-by-recording": "What's more, by recording and sharing your observations, you'll create research-quality data for scientists working to better understand and protect nature. So if you like recording your findings from the outdoors, or if you just like learning about life, join us!",
"Which-traditional-projects-can-add-your-observations": "Which traditional projects can add your observations?",
"Who-can-add-observation-fields-to-my-observations": "Who can add observation fields to my observations?",
"WIKIPEDIA": "WIKIPEDIA",
"Wild": "Wild",
"WILD-STATUS": "WILD STATUS",

View File

File diff suppressed because it is too large Load Diff

1136
src/i18n/l10n/en.ftl.orig Normal file
View File

File diff suppressed because it is too large Load Diff

4
src/i18n/l10n/fr.ftl Normal file
View File

@@ -0,0 +1,4 @@
Native-to-place = Originaire { VOWORCON($place) ->
[vow] d'{ $place }
*[con] de { $place }
}

View File

@@ -0,0 +1,3 @@
{
"Native-to-place": "Originaire { VOWORCON($place) ->\n [vow] d'{ $place }\n *[con] de { $place }\n}"
}

View File

@@ -1,6 +1,7 @@
// AUTO-GENERATED. See i18ncli.js
export default locale => {
if ( locale === "ru" ) { return require( "./l10n/ru.ftl.json" ); }
if ( locale === "fr" ) { return require( "./l10n/fr.ftl.json" ); }
if ( locale === "es" ) { return require( "./l10n/es.ftl.json" ); }
if ( locale === "es-MX" ) { return require( "./l10n/es-MX.ftl.json" ); }
if ( locale === "en" ) { return require( "./l10n/en.ftl.json" ); }

View File

@@ -17,7 +17,7 @@
### result of performing an action on the accessibility element." We write
### them in third person singular ending with a period.
# Header above user biography / user description on user profile
# Header for a general description, e.g. of a user, or of iNaturalist itself
ABOUT = ABOUT
ABOUT-COLLECTION-PROJECTS = ABOUT COLLECTION PROJECTS
ABOUT-INATURALIST = ABOUT INATURALIST
@@ -26,17 +26,19 @@ ABOUT-THE-DQA = ABOUT THE DQA
About-the-DQA-description = The Quality Grade summarizes the accuracy, precision, completeness, relevance, and appropriateness of an iNaturalist observation as biodiversity data. Some attributes are automatically determined, while others are subject to a vote by iNat users. iNaturalist shares licensed "Research Grade" observations with a number of data partners for use in science and conservation.
ABOUT-TRADITIONAL-PROJECTS = ABOUT TRADITIONAL PROJECTS
ABOUT-UMBRELLA-PROJECTS = ABOUT UMBRELLA PROJECTS
Accept-community-identifications = Accept community identifications
# Label for a taxon when a user prefers to see or hear the common name first
accessible-comname-sciname = { $commonName } ({ $scientificName })
# Label for a taxon when a user prefers to see or hear the scientific name first
accessible-sciname-comname = { $scientificName } ({ $commonName })
Account = Account
ACTIVITY = ACTIVITY
# Label for a button that adds a vote of agreement
Add-agreement = Add agreement
ADD-AN-ID = ADD AN ID
ADD-COMMENT = ADD COMMENT
Add-comment = Add comment
Add-Date-Time = Add Date/Time
# Label for a button that adds a vote of disagreement
Add-disagreement = Add disagreement
ADD-EVIDENCE = ADD EVIDENCE
Add-favorite = Add favorite
Add-Location = Add Location
@@ -45,12 +47,17 @@ Add-Location = Add Location
Add-observations = Add observations
ADD-OPTIONAL-COMMENT = ADD OPTIONAL COMMENT
Add-optional-notes = Add optional notes
Add-this-ID = Add this identification
# Date relationship created, shown on settings relationships screen
Added-on-date = Added on { $date }
# Hint for a button that adds a vote of agreement
Adds-your-vote-of-agreement = Adds your vote of agreement
# Hint for a button that adds a vote of disagreement
Adds-your-vote-of-disagreement = Adds your vote of disagreement
Affiliation = Affiliation: { $site }
# Label for button that adds an identification of the same taxon as another identification
Agree = Agree
# Label for button that adds an identification of the same taxon as another identification
AGREE = AGREE
# Checkbox label that checks all of the consent agreements a user must make
# before signing up
Agree-to-all-of-the-above = Agree to all of the above
AGREE-WITH-ID = AGREE WITH ID?
Agree-with-ID-description = Would you like to agree with the ID and suggest the following identification?
@@ -58,26 +65,27 @@ ALL = ALL
All = All
All-observations = All observations
All-organisms = All organisms
# license code
# As in intellectual property rights over a photo or other creative work
all-rights-reserved = all rights reserved
# As in automated identification suggestions
ALL-SUGGESTIONS = ALL SUGGESTIONS
Almost-done = Almost done!
Already-have-an-account = Already have an account? Log in
An-Internet-connection-is-required = An Internet connection is required to load more observations.
# Generic option in a menu of choices that indicates that any of the choices
# would be acceptable
Any = Any
# Geoprivacy sheet descriptions
Anyone-using-iNaturalist-can-see = Anyone using iNaturalist can see where this species was observed, and scientists can most easily use it for research.
app-authorized-on-date = { $appName } (authorized on: { $date })
APPLY-FILTERS = APPLY FILTERS
Apply-filters = Apply filters
# Month of April
April = April
# Short for Augmented Reality Camera. This is what we call the camera that
# overlays identification suggestions in real time
AR-Camera = AR Camera
Are-you-a-teacher = Are you a teacher wanting to use iNaturalist with your students?
Are-you-sure-you-want-to-sign-out = Are you sure you want to sign out? This will delete all your observations on this device. It will not affect any observations you've uploaded to iNaturalist.
Arrow-down-selected = Arrow down selected
Arrow-down-unselected = Arrow down unselected
Arrow-up-selected = Arrow up selected
Arrow-up-unselected = Arrow up unselected
# Onboarding text on MyObservations: 0-10 observations
As-you-upload-more-observations = As you upload more observations, others in our community may be able to help you identify them!
attribution-cc-by = some rights reserved (CC BY)
@@ -86,12 +94,10 @@ attribution-cc-by-nc-nd = some rights reserved (CC BY-NC-ND)
attribution-cc-by-nc-sa = some rights reserved (CC BY-NC-SA)
attribution-cc-by-nd = some rights reserved (CC BY-ND)
attribution-cc-by-sa = some rights reserved (CC BY-SA)
# Month of August
August = August
Automatically-update-my-content-for-taxon-changes = Automatically update my content for taxon changes
# Returns user to login screen
BACK-TO-LOGIN = BACK TO LOGIN
# Header for inserting user description in settings profile tab
Bio = Bio
BLOG = BLOG
# Accessibility label for bulk import / photo import button
# These are used by screen readers to label actionable elements iOS: https://developer.apple.com/documentation/uikit/uiaccessibilityelement/1619577-accessibilitylabel
@@ -103,67 +109,92 @@ By-exiting-your-observations-not-saved = By exiting, your observations will not
By-exiting-your-photos-will-not-be-saved = By exiting, your photos will not be saved.
By-exiting-your-recorded-sound-will-not-be-saved = By exiting, your recorded sound will not be saved.
Camera = Camera
Camera-flip = Camera-flip
CANCEL = CANCEL
Cancel = Cancel
Captive-Cultivated = Captive/Cultivated
# "Casual" Data quality grade
Casual = Casual
# Short label for the Creative Commons Attribution license
CC-BY = CC BY
# Short label for the Creative Commons Attribution-NonCommercial license
CC-BY-NC = CC BY-NC
# Short label for the Creative Commons Attribution-NonCommercial-NoDerivatives license
CC-BY-NC-ND = CC BY-NC-ND
# Short label for the Creative Commons Attribution-NonCommercial-ShareAlike license
CC-BY-NC-SA = CC BY-NC-SA
# Short label for the Creative Commons Attribution-NoDerivatives license
CC-BY-ND = CC BY-ND
# Short label for the Creative Commons Attribution-ShareAlike license
CC-BY-SA = CC BY-SA
# Short label for the Creative Commons Zero declaration
CC0 = CC0
# Label for a button that changes a selected date
CHANGE-DATE = CHANGE DATE
# Label for a button that changes a selected date
Change-date = Change date
# Label for a button that changes a selected end date
CHANGE-END-DATE = CHANGE END DATE
# Label for a button that changes a selected end date
Change-end-date = Change end date
Change-project = Change project
# Label for a button that changes a selected start date
CHANGE-START-DATE = CHANGE START DATE
# Label for a button that changes a selected start date
Change-start-date = Change start date
Change-taxon = Change taxon
# Button that changes the taxon filter on Explore
Change-taxon-filter = Change taxon filter
Change-user = Change user
# Label for a button that cycles through zoom levels for the camera
Change-zoom = Change zoom
Check-this-box-if-you-want-to-apply-a-Creative-Commons = Check this box if you want to apply a Creative Commons
# After pressing the reset password button
# Notification that appears after pressing the reset password button
CHECK-YOUR-EMAIL = CHECK YOUR EMAIL!
Checkmark = Checkmark
# Text for a button prompting the user to grant access to the gallery
CHOOSE-PHOTOS = CHOOSE PHOTOS
# Label for button that chooses a taxon
Choose-taxon = Choose taxon
# Label for a button that clears content, like the text entered in a text
# field
Clear = Clear
# Label for a button that closes a window or popup
Close = Close
Close-add-observation-modal = Close add observation modal.
# Accessibility label for a button that closes the permission request screen
Close-permission-request-screen = Close permission request screen
# Label for a button that closes a search interface
Close-search = Close search
Closes-new-observation-options = Closes new observation options.
Closes-withdraw-id-sheet = Closes "Withdraw ID" sheet
# Heading for a section that describes people and organizations that
# collaborate with iNaturalist
COLLABORATORS = COLLABORATORS
Collection-Project = Collection Project
# Button that combines multiple photos into a single observation
Combine-Photos = Combine Photos
# Title for a form that let's you enter a comment
COMMENT = COMMENT
# Accessibility label for a button that shows options for a comment
# Label for a button that shows options for a comment
Comment-options = Comment options
# Label for a setting that shows the common name first
Common-Name-Scientific-Name = Common Name (Scientific Name)
Community-Guidelines = Community Guidelines
Community-Moderation-Settings = Community Moderation Settings
# Button that confirms a choice the user has made
CONFIRM = CONFIRM
Connect-with-other-naturalists = Connect with other naturalists and engage in conversations.
Connected-Accounts = Connected Accounts
Connection-problem-Please-try-again-later = Connection problem. Please try again later.
CONTACT-SUPPORT = CONTACT SUPPORT
CONTINUE = CONTINUE
Coordinates-copied-to-keyboard = Coordinates copied to keyboard
# Notification when coordinates have been copied
Coordinates-copied-to-clipboard = Coordinates copied to clipboard
# Button that copies coordinates to the clipboard
Copy-coordinates = Copy Coordinates
Copy-map-coordinates = Copy map coordinates
# Right to control copies of a creative work; this string may be used as a
# heading to describe general information about rights, attribution, and
# licensing
Copyright = Copyright
Couldnt-create-comment = Couldn't create comment
Couldnt-create-identification-error = Couldn't create identification { $error }
Couldnt-create-identification-unknown-error = Couldn't create identification, Unknown Error.
Couldnt-create-identification-unknown-error = Couldn't create identification, unknown error.
CREATE-AN-ACCOUNT = CREATE AN ACCOUNT
Create-an-observation-evidence = Create an observation with no evidence
CREATE-YOUR-FIRST-OBSERVATION = CREATE YOUR FIRST OBSERVATION
@@ -171,12 +202,13 @@ DATA-QUALITY = DATA QUALITY
DATA-QUALITY-ASSESSMENT = DATA QUALITY ASSESSMENT
Data-quality-assessment-can-taxon-still-be-confirmed-improved-based-on-the-evidence = Based on the evidence, can the Community Taxon still be improved?
Data-quality-assessment-community-taxon-species-level-or-lower = Community taxon at species level or lower
# Data Quality Assessment section label: whether or not the observation date is accurate
Data-quality-assessment-date-is-accurate = Date is accurate
# checklist test for Data Quality Assessment of Observation Details
# Data Quality Assessment section label: whether or not the observation date was specified
Data-quality-assessment-date-specified = Date specified
Data-quality-assessment-description-casual = This observation has not met the conditions for Research Grade status.
Data-quality-assessment-description-needs-id = This observation has not yet met the conditions for Research Grade status:
# description for different quality grades in the DQA
# Data Quality Assessment explanation when quality is Research Grade
Data-quality-assessment-description-research = It can now be used for research and featured on other websites.
Data-quality-assessment-evidence-of-organism = Evidence of organism
Data-quality-assessment-has-photos-or-sounds = Has Photos or Sounds
@@ -187,7 +219,7 @@ Data-quality-assessment-organism-is-wild = Organism is wild
Data-quality-assessment-recent-evidence-of-organism = Recent evidence of an organism
Data-quality-assessment-title-casual = This observation is Casual Grade
Data-quality-assessment-title-needs-id = This observation Needs ID
# declares the current data quality status of the observation
# declares the current data quality status of the observation when quality is Research Grade
Data-quality-assessment-title-research = This observation is Research Grade!
Data-quality-casual-description = This observation needs more information verified to be considered verifiable
Data-quality-needs-id-description = This observation needs more identifications to reach research grade
@@ -207,9 +239,12 @@ Date-hours = { $count }h
Date-minutes = { $count }m
DATE-OBSERVED = DATE OBSERVED
Date-observed = Date observed
Date-observed-header-short = Observed
DATE-OBSERVED-NEWEST = DATE OBSERVED - NEWEST TO OLDEST
DATE-OBSERVED-OLDEST = DATE OBSERVED - OLDEST TO NEWEST
# Label for controls over a range of dates
Date-Range = Date Range
# Label for controls over a range of dates
DATE-RANGE = DATE RANGE
# Used when displaying a relative time - in this case, shows an absolute date (e.g. 12/31/22)
Date-short-format = MM/dd/yy
@@ -222,18 +257,17 @@ DATE-UPLOADED-NEWEST = DATE UPLOADED - NEWEST TO OLDEST
DATE-UPLOADED-OLDEST = DATE UPLOADED - OLDEST TO NEWEST
# Used when displaying a relative time - in this case, X weeks ago (e.g. 3w = 3 weeks ago)
Date-weeks = { $count }w
Date_observed_header_short = Observed
# Date formatting using date-fns
# See complete list of formatting styles: https://date-fns.org/v2.29.3/docs/format
datetime-format-short = M/d/yy h:mm a
# Month of December
December = December
Default-Search-Place = Default Search Place
DELETE = DELETE
Delete-all-observations = Delete all observations
Delete-comment = Delete comment
DELETE-COMMENT-QUESTION = DELETE COMMENT?
DELETE-OBSERVATION = DELETE OBSERVATION?
DELETE-COMMENT--question = DELETE COMMENT?
Delete-observation = Delete observation
DELETE-OBSERVATION--question = DELETE OBSERVATION?
# Button label or accessibility label for an element that deletes a photo
Delete-photo = Delete photo
Delete-sound = Delete sound
@@ -248,28 +282,29 @@ Deleting-x-of-y-observations =
# Tab label or section title for content that describes further details, e.g.
# the details of an observation
DETAILS = DETAILS
# Button that disables the camera's flash
Disable-flash = Disable flash
# Button that discards changes or an item, e.g. a photo
DISCARD = DISCARD
# Button that discards all items, e.g. imported photos
DISCARD-ALL = DISCARD ALL
# Button that discards changes
DISCARD-CHANGES = DISCARD CHANGES
DISCARD-FILTER-CHANGES = DISCARD FILTER CHANGES
DISCARD-MEDIA = DISCARD MEDIA?
DISCARD-MEDIA--question = DISCARD MEDIA?
DISCARD-OBSERVATION = DISCARD OBSERVATION
DISCARD-PHOTOS = DISCARD PHOTOS?
DISCARD-PHOTOS--question = DISCARD PHOTOS?
# Label for a button that discards a sound recording
DISCARD-RECORDING = DISCARD RECORDING
# Header of a popup confirming that the user wants to discard a sound
# recording
DISCARD-SOUND-header = DISCARD SOUND?
DISCARD-SOUND--question = DISCARD SOUND?
DISCARD-X-OBSERVATIONS =
{ $count ->
[one] DISCARD OBSERVATION
*[other] DISCARD { $count } OBSERVATIONS
}
DISMISS = DISMISS
Display = Display
Display-Name = Display Name
Do-not-collect-stability-and-usage-data-using-third-party-services = Do not collect stability and usage data using third-party services
DONATE = DONATE
DONATE-TO-INATURALIST = DONATE TO INATURALIST
Donate-to-iNaturalist = Donate to iNaturalist
@@ -277,6 +312,7 @@ Donate-to-iNaturalist = Donate to iNaturalist
DONE = DONE
Dont-have-an-account = Don't have an account? Sign up
During-app-start-no-model-found = During app start there was no computer vision model found. There will be no AR camera.
# Button for editing something
Edit = Edit
EDIT-COMMENT = EDIT COMMENT
Edit-comment = Edit comment
@@ -284,12 +320,13 @@ EDIT-LOCATION = EDIT LOCATION
# Label for interactive element that takes you to a location choosing screen
Edit-location = Edit location
Edit-Observation = Edit Observation
# Label for button that edits an observation's taxon
Edits-this-observations-taxon = Edits this observation's taxon
EMAIL = EMAIL
# Appears above the email text field
Email = email
EMAIL-DEBUG-LOGS = EMAIL DEBUG LOGS
Email-Notifications = Email Notifications
# Button that enables the camera's flash
Enable-flash = Enable flash
# Indicates a species only occurs in a specific place
Endemic = Endemic
# TODO this and many other uses of placeables are not currently translatable
# without knowing the vowel/consonant state of the first letter of the
@@ -316,12 +353,12 @@ EXPLORE-IDENTIFIERS = EXPLORE IDENTIFIERS
EXPLORE-OBSERVATIONS = EXPLORE OBSERVATIONS
EXPLORE-OBSERVERS = EXPLORE OBSERVERS
EXPLORE-SPECIES = EXPLORE SPECIES
External-Applications = External Applications
Failed-to-delete-sound = Failed to delete sound
# Error message with log in fails
Failed-to-log-in = Failed to log in
# Header for featured projects
FEATURED = FEATURED
# Month of February
February = February
Fetching-location = Fetching location...
Filter = Filter
@@ -341,8 +378,9 @@ Flag-Item-Other-Input-Hint = Specify the reason you're flagging this item
# Status when an item has been flagged
Flagged = Flagged
Flash = flash
# Label for a button that toggles between the front and back cameras
Flip-camera = Flip camera
FOLLOW = FOLLOW
Following = Following
# Forgot password link
Forgot-Password = Forgot Password
GEOPRIVACY = GEOPRIVACY
@@ -391,8 +429,6 @@ IMPORT-X-OBSERVATIONS =
# Identification category
improving--identification = Improving
INATURALIST-ACCOUNT-SETTINGS = INATURALIST ACCOUNT SETTINGS
iNaturalist-Activity-Notifications = iNaturalist Activity Notifications
iNaturalist-Applications = iNaturalist Applications
iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-gallery = iNaturalist can save photos you take in the app to your devices gallery.
INATURALIST-COMMUNITY = INATURALIST COMMUNITY
INATURALIST-FORUM = INATURALIST FORUM
@@ -408,7 +444,6 @@ iNaturalist-is-supported-by-community = iNaturalist is supported by our amazing
iNaturalist-mission-is-to-connect = iNaturalist's mission is to connect people to nature and advance biodiversity science and conservation.
INATURALIST-MISSION-VISION = INATURALIST'S MISSION & VISION
INATURALIST-NETWORK = INATURALIST NETWORK
iNaturalist-Network-Affiliation = iNaturalist Network Affiliation
INATURALIST-SETTINGS = INATURALIST SETTINGS
# Label for the role a user plays on iNaturalist, e.g. "INATURALIST STAFF"
# or "INATURALIST CURATOR". Since the name "INATURALIST" should not be
@@ -429,6 +464,7 @@ Internet-Connection-Required = Internet Connection Required
Intl-number = { $val }
Introduced = Introduced
Introduced-to-place = Introduced to { $place }
# Month of January
January = January
JOIN = JOIN
JOIN-PROJECT = JOIN PROJECT
@@ -442,9 +478,10 @@ JOURNAL-POSTS-WITHOUT-NUMBER =
[one] JOURNAL POST
*[other] JOURNAL POSTS
}
# Month of July
July = July
# Month of June
June = June
Language-Locale = Language/Locale
# Shows date user last active on iNaturalist on user profile
Last-Active-date = Last Active: { $date }
# Latitude, longitude on a single line on a single line
@@ -458,7 +495,6 @@ LEAVE = LEAVE
LEAVE-PROJECT = LEAVE PROJECT
LEAVE-US-A-REVIEW = LEAVE US A REVIEW!
LICENSES = LICENSES
Licensing = Licensing
List-view = List view
Loading-iNaturalists-AR-Camera = Loading iNaturalist's AR Camera
LOCATION = LOCATION
@@ -482,9 +518,11 @@ Lowest = Lowest
LOWEST-RANK = LOWEST RANK
MAP = MAP
Map-Area = Map Area
# Month of March
March = March
# Identification category
maverick--identification = Maverick
# Month of May
May = May
MEDIA = MEDIA
MEMBERS-WITHOUT-NUMBER =
@@ -502,36 +540,37 @@ MONTHS = MONTHS
More-info = More info
MOST-FAVED = MOST FAVED
Most-faved = Most faved
Names = Names
Native = Native
Native-to-place = Native to { $place }
Navigates-to-add-identification = Navigates to add identification.
Navigates-to-AR-camera = Navigates to AR camera.
Navigates-to-bulk-importer = Navigates to bulk importer.
Navigates-to-camera = Navigates to camera.
Navigates-to-explore = Navigates to explore.
Navigates-to-AR-camera = Navigates to AR camera
Navigates-to-bulk-importer = Navigates to bulk importer
Navigates-to-camera = Navigates to camera
Navigates-to-explore = Navigates to explore
Navigates-to-notifications = Navigates to notifications
Navigates-to-observation-details = Navigates to observation details screen.
Navigates-to-observation-edit-screen = Navigate to observation edit screen.
Navigates-to-observations = Navigates to observations.
Navigates-to-photo-importer = Navigate to photo importer.
Navigates-to-previous-screen = Navigate to previous screen
Navigates-to-project-details = Navigate to project details
Navigates-to-sound-recorder = Navigates to sound recorder.
Navigates-to-suggest-identification = Navigates to suggest identification.
Navigates-to-suggestions = Navigates to suggestions
Navigates-to-observation-details = Navigates to observation details screen
Navigates-to-observation-edit-screen = Navigate to observation edit screen
Navigates-to-photo-importer = Navigates to photo importer
Navigates-to-previous-screen = Navigates to previous screen
Navigates-to-project-details = Navigates to project details
Navigates-to-sound-recorder = Navigates to sound recorder
Navigates-to-suggest-identification = Navigates to suggest identification
Navigates-to-taxon-details = Navigates to taxon details
Navigates-to-user-profile = Navigates to user profile.
Navigates-to-user-profile = Navigates to user profile
# Label for button that takes you to your observations
Navigates-to-your-observations = Navigates to your observations
# Header for nearby projects
NEARBY = NEARBY
Nearby = Nearby
NEARBY-SUGGESTIONS = NEARBY SUGGESTIONS
Needs-ID = Needs ID
# Heading when creating a new observation
New-Observation = New Observation
# Sort order, refers to newest or oldest date
Newest-to-oldest = Newest to oldest
Next-observation = Next observation
No-Location = No Location
No-Media = No Media
# As in a machine learning model that powers automated suggestions
No-model-found = No model found
No-Notifications-Found = You have no notifications! Get started by creating your own observations.
No-projects-match-that-search = No projects match that search
@@ -549,6 +588,7 @@ Notifications = Notifications
notifications-user-added-comment-to-observation-by-you = <0>{ $userName }</0> added a comment to an observation by you
# notification when someone adds an identification to your observation
notifications-user-added-identification-to-observation-by-you = <0>{ $userName }</0> added an identification to an observation by you
# Month of November
November = November
Obervations-must-be-manually-added = Observations must be manually added to a traditional project, either during the upload stage or after the observation has been shared to iNaturalist. A user must also join a traditional project in order to add their observations to it.
Obscured = Obscured
@@ -566,6 +606,8 @@ Observation-with-no-evidence = Observation with no evidence
Observations = Observations
Observations-created-on-iNaturalist = Observations created on iNaturalist are used by scientists around the world.
Observations-View = Observations View
# Might be used when the number is represented using an image or other
# element, not text
OBSERVATIONS-WITHOUT-NUMBER =
{ $count ->
[one] OBSERVATION
@@ -573,6 +615,7 @@ OBSERVATIONS-WITHOUT-NUMBER =
}
# Onboarding text on MyObservations: Onboarding text on MyObservations: 11-50 observations
Observations-you-upload-to-iNaturalist = Observations you upload to iNaturalist can be used by scientists and researchers worldwide.
# Button that starts a new observation
Observe = Observe
# Title of screen asking for permission to access the gallery
Observe-and-identify-organisms-from-your-gallery = Observe and identify organisms from your gallery
@@ -581,7 +624,9 @@ Observe-and-identify-organisms-in-real-time-with-your-camera = Observe and ident
# Text for a button prompting the user to grant access to the camera
OBSERVE-ORGANISMS = OBSERVE ORGANISMS
Observers = Observers
# Section in Explore that shows people who added observations given a set of search filters
Observers-View = Observers View
# Month of October
October = October
Offensive-Inappropriate = Offensive/Inappropriate
Offensive-Inappropriate-Examples = Misleading or illegal content, racial or ethnic slurs, etc. For more on our defintion of "appropriate," see the FAQ.
@@ -589,8 +634,10 @@ Offline-DQA-description = The DQA may not be accurate. Check your internet conne
Offline-No-Notifications = Cannot fetch notifications at this time.
# Generic confirmation, e.g. button on a warning alert
OK = OK
# Sort order, refers to newest or oldest date
Oldest-to-newest = Oldest to newest
One-last-step = One last step!
# Adjective, as in geoprivacy
Open = Open
Open-drawer = Open drawer
OPEN-EMAIL = OPEN EMAIL
@@ -631,15 +678,14 @@ Please-try-again-when-you-are-connected-to-the-internet = Please try again when
# Help text for beginning a sound recording
Press-record-to-start = Press record to start
Previous-observation = Previous observation
Prioritize-common-names-used-in-this-place = Prioritize common names used in this place.
Privacy = Privacy
Privacy-Policy = Privacy Policy
Private = Private
Profile-Picture = Profile Picture
# As in an iNat project, a collection of observations or observation search filters
PROJECT = PROJECT
PROJECT-REQUIREMENTS = PROJECT REQUIREMENTS
Project-Settings = Project Settings
# As in iNat project, collections of observations or observation search filters
PROJECTS = PROJECTS
# As in iNat projects, collections of observations or observation search filters
Projects = Projects
QUALITY-GRADE = QUALITY GRADE
# Shortened display of an observation's quality grade (used when displayed in a badge) - in this case, Casual
@@ -689,6 +735,7 @@ Ranks-VARIETY = VARIETY
Ranks-ZOOSECTION = ZOOSECTION
Ranks-ZOOSUBSECTION = ZOOSUBSECTION
Read-more-on-Wikipedia = Read more on Wikipedia
# Heading for the sound recorder
RECORD-NEW-SOUND = RECORD NEW SOUND
# Title of screen asking for permission to access the microphone
Record-organism-sounds-with-the-microphone = Record organism sounds with the microphone
@@ -697,12 +744,20 @@ RECORD-SOUND = RECORD SOUND
Record-sounds = Record sounds with your microphone
# Imperative verb for recording a sound
Record-verb = Record
# Status while recording a sound
Recording-sound = Recording sound
Recording-stopped-Tap-play-the-current-recording = Recording stopped. Tap play the current recording.
REDO-SEARCH-IN-MAP-AREA = REDO SEARCH IN MAP AREA
# Label for a button that removes a vote of agreement
Remove-agreement = Remove agreement
# Label for a button that removes a vote of disagreement
Remove-disagreement = Remove disagreement
Remove-favorite = Remove favorite
Remove-Photos = Remove Photos
Remove-Relationship = Remove Relationship
# Hint for a button that removes a vote of agreement
Removes-your-vote-of-agreement = Removes your vote of agreement
# Hint for a button that removes a vote of disagreement
Removes-your-vote-of-disagreement = Removes your vote of disagreement
# Quality grade option
Research-Grade = Research Grade
Reset = Reset
@@ -725,7 +780,6 @@ REVIEW-INATURALIST = REVIEW INATURALIST
# reviewed the observations or not
REVIEWED = REVIEWED
Reviewed-observations-only = Reviewed observations only
Revoke = Revoke
# Label for the satellite map type
Satellite--map-type = Satellite
# Label for a button that persists something
@@ -741,7 +795,9 @@ Saved-Observation = Saved observation, in queue to upload
Scan-the-area-around-you-for-organisms = Scan the area around you for organisms.
Scientific-Name = Scientific Name
Scientific-Name-Common-Name = Scientific Name (Common Name)
# Title for a search interface
SEARCH = SEARCH
# Title for a search interface
Search = Search
SEARCH-FOR-A-LOCATION = SEARCH FOR A LOCATION
Search-for-a-project = Search for a project
@@ -770,6 +826,7 @@ Select-the-identification-you-want-to-add = Select the identification you want t
Select-user = Select user
Selects-iconic-taxon-X-for-identification = Selects iconic taxon { $iconicTaxon } for identification.
Separate-Photos = Separate Photos
# Month of September
September = September
SETTINGS = SETTINGS
Settings = Settings
@@ -780,6 +837,8 @@ Share-map = Share map
SHOP-INATURALIST-MERCH = SHOP INATURALIST MERCH
Shop-iNaturalist-Merch = Shop iNaturalist Merch
Show-observation-options = Show observation options.
# Label for button that shows identification suggestions
Shows-identification-suggestions = Shows identification suggestions
Shows-iNaturalist-bird-logo = Shows iNaturalist bird logo.
Sign-out = Sign out
Some-data-privacy-laws = Some data privacy laws, like the European Union's General Data Protection Regulation (GDPR), require explicit consent to transfer personal information from their jurisdictions to other jurisdictions where the legal protection of this information is not considered adequate. As of 2020, the European Union no longer considers the United States to be a jurisdiction that provides adequate legal protection of personal information, specifically because of the possibility of the US government surveilling data entering the US. It is possible other jurisdictions may have the same opinion.
@@ -840,7 +899,6 @@ TAXON-NAMES-DISPLAY = TAXON NAMES DISPLAY
TAXONOMIC-RANKS = TAXONOMIC RANKS
# Header for a block of text describing a taxon's taxonomy
TAXONOMY-header = TAXONOMY
Taxonomy-Settings = Taxonomy Settings
TEACHERS = TEACHERS
Teachers-Guide = Teachers' Guide
TEAM = TEAM
@@ -848,27 +906,21 @@ Terms-of-Use = Terms of Use
Text-Box-to-Describe-Reason-for-Flag = Text box to describe reason for flag.
The-exact-location-will-be-hidden = The exact location will be hidden publicly, and instead generalized to a larger area. (Threatened and endangered species are automatically obscured).
The-iNaturalist-Network = The iNaturalist network is a collection of localized websites that are fully connected to the global iNaturalist community. Network sites are supported by local institutions that promote local use and facilitate the use of data from iNaturalist to benefit local biodiversity.
The-iNaturalist-Network-is-a-collection-of-localized-websites = The iNaturalist Network is a collection of localized websites that are fully connected to the global iNaturalist community. Network sites are supported by local institutions that have signed an agreement with iNaturalist to promote local use and benefit local biodiversity. They have access to true coordinates from their countries that are automatically obscured from public view in order to protect threatened species. Your username and password works on all sites that are part of the iNaturalist Network. If you choose to affiliate with a Network site, the local institutions that operate each site will also have access to your email address (only to communicate with you about site activities) and access to the true coordinates for observations that are publicly obscured or private. Note: Please do not experimentally change your affiliation if you have more than 1000 observations.
The-iNaturalist-team-has-collaborated = The iNaturalist team has collaborated with...
The-location-will-not-be-visible = The location will not be visible to others, which means it may be difficult to identify.
There-is-no-way = There is no way to have an iNaturalist account without storing personal information, so the only way to revoke this consent is to delete your account.
# Wild status sheet descriptions
This-is-a-wild-organism = This is a wild organism and wasn't placed in this location by humans.
This-is-how-all-taxon-names-will-be-displayed-to-you-across-iNaturalist = This is how all taxon names will be displayed to you across iNaturalist
This-is-how-taxon-names-will-be-displayed = This is how all taxon names will be displayed to you across iNaturalist:
This-observer-has-opted-out-of-the-Community-Taxon = This observer has opted out of the Community Taxon
This-organism-was-placed-by-humans = This organism was placed in this location by humans. This applies to things like garden plants, pets, and zoo animals.
This-sets-your-language-and-date-formatting-preferences-across-iNaturalist = This sets your language and date formatting preferences across iNaturalist based on your locale.
This-will-be-your-default-place-for-all-searches-in-Explore-and-Identify = This will be your default place for all searches in Explore and Identify.
To-access-all-other-settings = To access all other account settings, click here:
To-learn-more-about-what-information = To learn more about what information we collect and how we use it, please see our Privacy Policy and our Terms of Use.
To-sync-your-observations-to-iNaturalist = To sync your observations to iNaturalist, please log in.
Toggle-map-type = Toggle map type
TOP-ID-SUGGESTION = TOP ID SUGGESTION
Traditional-Project = Traditional Project
Trust-with-hidden-coordinates = Trust with hidden coordinates
Umbrella-Project = Umbrella Project
Unblock = Unblock
UNFOLLOW = UNFOLLOW
UNFOLLOW-USER = UNFOLLOW USER?
# Text to show when a taxon or identification is unknown or missing
@@ -878,7 +930,6 @@ Unknown--user = Unknown
# Generic error message
Unknown-error = Unknown error
Unknown-organism = Unknown organism
Unmute = Unmute
Unreviewed-observations-only = Unreviewed observations only
Upload-Complete = Upload Complete
Upload-in-progress = Upload in progress
@@ -911,7 +962,6 @@ Use-your-devices-microphone-to-record = Use your devices microphone to record
USER = USER
User = User { $userHandle }
USERNAME = USERNAME
Username = Username
# Appears above the text fields
USERNAME-OR-EMAIL = USERNAME OR EMAIL
Using-iNaturalist-requires-the-storage = Using iNaturalist requires the storage of personal information like your email address, all iNaturalist data is stored in the United States, and we cannot be sure what legal jurisdiction you are in when you are using iNaturalist, so in order to comply with privacy laws like the GDPR, you must acknowledge that you understand and accept this risk and consent to transferring your personal information to iNaturalist's servers in the US.
@@ -926,6 +976,8 @@ View-photo = View photo
View-photo-licensing-info = View photo licensing info
VIEW-PROJECT-REQUIREMENTS = VIEW PROJECT REQUIREMENTS
VIEW-PROJECTS = VIEW PROJECTS
# Label for a button that shows identification suggestions for an observation
# or photo
View-suggestions = View suggestions
VIEW-TEACHERS-GUIDE = VIEW TEACHERS' GUIDE
# Title for a notice informing the user that they are viewing offline
@@ -939,8 +991,6 @@ Welcome-to-iNaturalist = Welcome to iNaturalist!
Welcome-user = <0>Welcome back,</0><1>{ $userHandle }</1>
WHAT-IS-INATURALIST = WHAT IS INATURALIST?
Whats-more-by-recording = What's more, by recording and sharing your observations, you'll create research-quality data for scientists working to better understand and protect nature. So if you like recording your findings from the outdoors, or if you just like learning about life, join us!
Which-traditional-projects-can-add-your-observations = Which traditional projects can add your observations?
Who-can-add-observation-fields-to-my-observations = Who can add observation fields to my observations?
WIKIPEDIA = WIKIPEDIA
Wild = Wild
WILD-STATUS = WILD STATUS

View File

@@ -52,7 +52,7 @@ const CustomTabBarContainer = ( { navigation }: Props ): Node => {
userIconUri: User.uri( currentUser ),
testID: "NavButton.personIcon",
accessibilityLabel: t( "Observations" ),
accessibilityHint: t( "Navigates-to-observations" ),
accessibilityHint: t( "Navigates-to-your-observations" ),
size: 40,
onPress: ( ) => {
navigation.navigate( "ObservationsStackNavigator", {

View File

@@ -19,6 +19,7 @@ export { default as useRemoteObservation } from "./useRemoteObservation";
export { default as useShare } from "./useShare";
export { default as useStoredLayout } from "./useStoredLayout";
export { default as useTaxon } from "./useTaxon";
export { default as useTaxonSearch } from "./useTaxonSearch";
export { default as useTranslation } from "./useTranslation";
export { default as useUserLocation } from "./useUserLocation";
export { default as useUserMe } from "./useUserMe";

View File

@@ -72,7 +72,7 @@ describe( "StandardCamera navigation", ( ) => {
await actor.press( cameraButton );
const takePhotoButton = await screen.findByLabelText( /Take photo/ );
await actor.press( takePhotoButton );
const checkmarkButton = await screen.findByLabelText( "Checkmark" );
const checkmarkButton = await screen.findByLabelText( "View suggestions" );
await actor.press( checkmarkButton );
expect( await screen.findByText( /ADD AN ID/ ) ).toBeVisible( );
} );

View File

@@ -154,7 +154,7 @@ exports[`CustomTabBar should render correctly 1`] = `
</View>
</View>
<View
accessibilityHint="Navigates to explore."
accessibilityHint="Navigates to explore"
accessibilityLabel="Explore"
accessibilityRole="button"
accessibilityState={
@@ -381,7 +381,7 @@ exports[`CustomTabBar should render correctly 1`] = `
</BVLinearGradient>
</View>
<View
accessibilityHint="Navigates to observations."
accessibilityHint="Navigates to your observations"
accessibilityLabel="Observations"
accessibilityRole="button"
accessibilityState={

View File

@@ -172,6 +172,6 @@ describe( "ActivityHeaderKebabMenu", () => {
expect( await screen.findByTestId( "KebabMenu.Button" ) ).toBeTruthy( );
fireEvent.press( await screen.findByTestId( "KebabMenu.Button" ) );
fireEvent.press( await screen.findByText( t( "Delete-comment" ) ) );
expect( await screen.findByText( t( "DELETE-COMMENT-QUESTION" ) ) ).toBeTruthy( );
expect( await screen.findByText( t( "DELETE-COMMENT--question" ) ) ).toBeTruthy( );
} );
} );

View File

@@ -7,6 +7,7 @@ import { renderComponent } from "tests/helpers/render";
const rerenderCheckmarkComponent = checked => {
renderComponent(
<Checkbox
accessibilityLabel="Checkmark"
text="Checkmark text"
isChecked={checked}
/>
@@ -33,13 +34,19 @@ describe( "Checkbox", () => {
} );
it( "has no accessibility errors", () => {
const checkbox = <Checkbox text="Checkmark text" isChecked />;
const checkbox = <Checkbox accessibilityLabel="Checkmark" text="Checkmark text" isChecked />;
expect( checkbox ).toBeAccessible();
} );
it( "renders an empty checkbox when isChecked is false", () => {
renderComponent( <Checkbox text="Checkmark text" isChecked={false} /> );
renderComponent(
<Checkbox
accessibilityLabel="Checkmark"
text="Checkmark text"
isChecked={false}
/>
);
const checkmark = screen.getByLabelText( /Checkmark/ );
@@ -52,7 +59,7 @@ describe( "Checkbox", () => {
} );
it( "renders a green filled checkbox when isChecked is true", () => {
renderComponent( <Checkbox text="Checkmark text" isChecked /> );
renderComponent( <Checkbox accessibilityLabel="Checkmark" text="Checkmark text" isChecked /> );
const checkmark = screen.getByLabelText( /Checkmark/ );
expect( checkmark ).toHaveProp( "innerIconStyle", {
@@ -66,6 +73,7 @@ describe( "Checkbox", () => {
let checked = false;
renderComponent(
<Checkbox
accessibilityLabel="Checkmark"
text="Checkmark text"
isChecked={checked}
// eslint-disable-next-line no-return-assign
@@ -84,10 +92,10 @@ describe( "Checkbox", () => {
let checked = true;
renderComponent(
<Checkbox
accessibilityLabel="Checkmark"
text="Checkmark text"
isChecked={checked}
// eslint-disable-next-line no-return-assign
onPress={( ) => ( checked = !checked )}
onPress={( ) => { checked = !checked; }}
/>
);
const checkmark = screen.getByLabelText( /Checkmark/ );
@@ -103,8 +111,7 @@ describe( "Checkbox", () => {
<Checkbox
text="Checkmark text"
isChecked={checked}
// eslint-disable-next-line no-return-assign
onPress={( ) => ( checked = !checked )}
onPress={( ) => { checked = !checked; }}
/>
);

View File

@@ -2,7 +2,7 @@
exports[`InlineUser renders reliably 1`] = `
<View
accessibilityHint="Navigates to user profile."
accessibilityHint="Navigates to user profile"
accessibilityLabel="User @some_login"
accessibilityRole="link"
accessibilityState={
@@ -96,7 +96,7 @@ exports[`InlineUser renders reliably 1`] = `
exports[`InlineUser when offline renders reliably 1`] = `
<View
accessibilityHint="Navigates to user profile."
accessibilityHint="Navigates to user profile"
accessibilityLabel="User @some_login"
accessibilityRole="link"
accessibilityState={
@@ -209,7 +209,7 @@ exports[`InlineUser when offline renders reliably 1`] = `
exports[`InlineUser when user has no icon set renders reliably 1`] = `
<View
accessibilityHint="Navigates to user profile."
accessibilityHint="Navigates to user profile"
accessibilityLabel="User @some_login"
accessibilityRole="link"
accessibilityState={

View File

@@ -19,6 +19,7 @@ describe( "TaxonResult", () => {
it( "should render correctly", () => {
render(
<TaxonResult
accessibilityLabel="this is the taxon"
taxon={mockTaxon}
/>
);

View File

@@ -2,7 +2,6 @@
exports[`Checkbox renders reliably 1`] = `
<View
accessibilityLabel="Checkmark"
accessibilityRole="radio"
accessibilityState={
{
@@ -172,7 +171,6 @@ exports[`Checkbox renders reliably 1`] = `
exports[`Checkbox renders reliably being checked 1`] = `
<View
accessibilityLabel="Checkmark"
accessibilityRole="radio"
accessibilityState={
{

View File

@@ -514,8 +514,7 @@ exports[`TaxonResult should render correctly 1`] = `
</View>
</View>
<View
accessibilityHint="Add this identification"
accessibilityLabel="Checkmark"
accessibilityLabel="this is the taxon"
accessibilityRole="button"
accessibilityState={
{