diff --git a/app.json b/app.json
index aa6fbfb21..e4269a036 100644
--- a/app.json
+++ b/app.json
@@ -2,7 +2,7 @@
"expo": {
"name": "TreeMapper",
"slug": "treemapper",
- "version": "2.0.1",
+ "version": "2.0.4",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "light",
@@ -16,6 +16,14 @@
],
"plugins": [
"@maplibre/maplibre-react-native",
+ [
+ "expo-build-properties",
+ {
+ "ios": {
+ "deploymentTarget": "15.5"
+ }
+ }
+ ],
[
"expo-location",
{
@@ -49,7 +57,8 @@
}
],
"expo-localization",
- "expo-secure-store"
+ "expo-secure-store",
+ "expo-build-properties"
],
"ios": {
"supportsTablet": true,
@@ -88,4 +97,4 @@
]
}
}
-}
\ No newline at end of file
+}
diff --git a/assets/adaptive-icon.png b/assets/adaptive-icon.png
index c98f0eacc..b54a2df15 100644
Binary files a/assets/adaptive-icon.png and b/assets/adaptive-icon.png differ
diff --git a/assets/icon.png b/assets/icon.png
index 4cd1d36ea..fb0c70f44 100644
Binary files a/assets/icon.png and b/assets/icon.png differ
diff --git a/package.json b/package.json
index 426e436ea..d2698b9ca 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"@expo/metro-runtime": "~3.2.1",
"@expo/vector-icons": "^14.0.0",
"@gorhom/bottom-sheet": "^4.6.3",
- "@maplibre/maplibre-react-native": "10.0.0-alpha.2",
+ "@maplibre/maplibre-react-native": "10.0.0-alpha.28",
"@react-native-async-storage/async-storage": "1.23.1",
"@react-native-community/datetimepicker": "8.0.1",
"@react-native-community/netinfo": "11.3.1",
@@ -38,6 +38,7 @@
"d3-shape": "^3.2.0",
"expo": "~51.0.21",
"expo-application": "~5.9.1",
+ "expo-build-properties": "~0.12.5",
"expo-camera": "~15.0.14",
"expo-clipboard": "~6.0.3",
"expo-constants": "~16.0.2",
@@ -96,7 +97,7 @@
"react-native-web": "~0.19.10",
"react-native-webview": "13.8.6",
"react-native-youtube-iframe": "^2.3.0",
- "react-native-zip-archive": "^6.1.0",
+ "react-native-zip-archive": "7.0.1",
"react-redux": "^9.1.0",
"realm": "^12.11.1",
"redux-persist": "^6.0.0",
@@ -131,5 +132,6 @@
"@babel/core": "^7.20.2",
"babel-loader": "8.3.0"
},
- "private": true
+ "private": true,
+ "packageManager": "yarn@1.22.19+sha512.ff4579ab459bb25aa7c0ff75b62acebe576f6084b36aa842971cf250a5d8c6cd3bc9420b22ce63c7f93a0857bc6ef29291db39c3e7a23aab5adfd5a4dd6c5d71"
}
diff --git a/patches/@maplibre+maplibre-react-native+10.0.0-alpha.2.patch b/patches/@maplibre+maplibre-react-native+10.0.0-alpha.2.patch
deleted file mode 100644
index 7c7591307..000000000
--- a/patches/@maplibre+maplibre-react-native+10.0.0-alpha.2.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/node_modules/@maplibre/maplibre-react-native/android/rctmgl/src/main/java/com/mapbox/rctmgl/components/styles/RCTMGLStyleFunctionParser.java b/node_modules/@maplibre/maplibre-react-native/android/rctmgl/src/main/java/com/mapbox/rctmgl/components/styles/RCTMGLStyleFunctionParser.java
-index 3aa0522..d66f9ff 100644
---- a/node_modules/@maplibre/maplibre-react-native/android/rctmgl/src/main/java/com/mapbox/rctmgl/components/styles/RCTMGLStyleFunctionParser.java
-+++ b/node_modules/@maplibre/maplibre-react-native/android/rctmgl/src/main/java/com/mapbox/rctmgl/components/styles/RCTMGLStyleFunctionParser.java
-@@ -3,7 +3,6 @@ package com.mapbox.rctmgl.components.styles;
- import android.util.Log;
-
- import com.facebook.react.bridge.Dynamic;
--import com.facebook.react.bridge.DynamicFromMap;
- import com.facebook.react.bridge.NoSuchKeyException;
- import com.facebook.react.bridge.ReadableArray;
- import com.facebook.react.bridge.ReadableMap;
diff --git a/src/components/carousel/CarouselItem.tsx b/src/components/carousel/CarouselItem.tsx
index 881d2b284..e958b008e 100644
--- a/src/components/carousel/CarouselItem.tsx
+++ b/src/components/carousel/CarouselItem.tsx
@@ -1,4 +1,5 @@
-import { Image, StyleSheet, Text, TouchableOpacity, View } from 'react-native'
+import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'
+import * as ExpoImage from 'expo-image';
import React from 'react'
import { scaleFont } from 'src/utils/constants/mixins'
import { Colors, Typography } from 'src/utils/constants'
@@ -24,7 +25,7 @@ const CarouselItem = (props: Props) => {
onPress(data.intervention_id, data.tree_id)
}}>
- {hasImage ? :
+ {hasImage ? :
}
diff --git a/src/components/common/CountryModal.tsx b/src/components/common/CountryModal.tsx
index 6ba62cdd7..38d7d3bf7 100644
--- a/src/components/common/CountryModal.tsx
+++ b/src/components/common/CountryModal.tsx
@@ -6,7 +6,6 @@ import {
StyleSheet,
FlatList,
TouchableOpacity,
- Image,
Platform,
} from 'react-native';
@@ -15,6 +14,7 @@ import { Typography, Colors } from 'src/utils/constants'
import CountryData from 'src/utils/constants/countryData.json';
import i18next from 'i18next';
import { CountryCode } from 'src/types/interface/slice.interface';
+import * as ExpoImage from 'expo-image';
const cdnUrl = process.env.EXPO_PUBLIC_CDN_URL
@@ -31,12 +31,13 @@ interface Props {
const Item = ({ title, onPress }: { title: CountryCode, onPress: () => void }) => (
-
{title.countryName}
@@ -56,7 +57,7 @@ export default function CountryModal(props: Props) {
const selectCountry = (data: CountryCode) => {
userCountry(data);
};
-
+
const sort = () => {
CountryData.sort((a, b) => {
if (a.countryName > b.countryName) {
diff --git a/src/components/common/MapAttribution.tsx b/src/components/common/MapAttribution.tsx
index a9839151d..1de8b9011 100644
--- a/src/components/common/MapAttribution.tsx
+++ b/src/components/common/MapAttribution.tsx
@@ -4,6 +4,7 @@ import InfoIcon from 'assets/images/svg/InfoIcon.svg'
import Modal from 'react-native-modal'
import { Colors, Typography } from 'src/utils/constants'
import CustomButton from './CustomButton'
+import i18next from 'src/locales/index'
@@ -23,7 +24,7 @@ const MapAttribution = () => {
onBackdropPress={toggleInfo}>
- Map credits:
+ {i18next.t('label.map_credits')}
Maplibre SDK
@@ -32,7 +33,7 @@ const MapAttribution = () => {
ESRI
- OpenStreetMap Contributors
+ {i18next.t('label.openstreet_contributors')}
{
- Species {i18next.t("label.syncing")}
+ {i18next.t("label.species_caps")}{i18next.t("label.syncing")}
)
}
diff --git a/src/components/home/ProjectModal.tsx b/src/components/home/ProjectModal.tsx
index 977ea13ec..12d5979e0 100644
--- a/src/components/home/ProjectModal.tsx
+++ b/src/components/home/ProjectModal.tsx
@@ -181,7 +181,7 @@ const ProjectModal = (props: Props) => {
)
try {
const parsedGeometry = JSON.parse(currentSiteData[0].geometry)
- const newCoords = getRandomPointInPolygon(parsedGeometry.coordinates[0], 1)
+ const newCoords = getRandomPointInPolygon(parsedGeometry.coordinates[0])
const { geoJSON } = makeInterventionGeoJson('Point', [newCoords], 'sd')
const bounds = bbox(geoJSON)
dispatch(updateMapBounds({ bounds: bounds, key: 'DISPLAY_MAP' }))
diff --git a/src/components/intervention/InterventionCard.tsx b/src/components/intervention/InterventionCard.tsx
index 26d8f57c8..79322927f 100644
--- a/src/components/intervention/InterventionCard.tsx
+++ b/src/components/intervention/InterventionCard.tsx
@@ -64,7 +64,6 @@ const InterventionCard = (props: Props) => {
item={item}
overSwipe={OVERSWIPE_DIST}
renderUnderlayLeft={() => (swipeableLeftComp())}
- renderUnderlayRight={() => Right}
snapPointsLeft={item.status=== 'SYNCED'?[100]:[150]}
snapPointsRight={[0]}
>
diff --git a/src/components/intervention/InterventionHeaderList.tsx b/src/components/intervention/InterventionHeaderList.tsx
index 95c3ea7cc..0bc375687 100644
--- a/src/components/intervention/InterventionHeaderList.tsx
+++ b/src/components/intervention/InterventionHeaderList.tsx
@@ -92,6 +92,6 @@ const styles = StyleSheet.create({
borderColor: Colors.GRAY_LIGHT,
borderRadius: 20,
borderWidth: 0.5,
- marginRight:'1%'
+ marginRight:10
}
})
diff --git a/src/components/manageProject/ProjectList.tsx b/src/components/manageProject/ProjectList.tsx
index f165a632b..90bd08d4e 100644
--- a/src/components/manageProject/ProjectList.tsx
+++ b/src/components/manageProject/ProjectList.tsx
@@ -2,7 +2,6 @@ import i18next from 'src/locales/index'
import React from 'react'
import {
FlatList,
- Image,
StyleSheet,
Text,
TouchableOpacity,
@@ -10,12 +9,12 @@ import {
} from 'react-native'
import PlantProjectBackdrop from 'assets/images/svg/PlantProjectIcon.svg'
import { Colors, Typography } from 'src/utils/constants'
-
import openWebView from 'src/utils/helpers/appHelper/openWebView'
import LargeButton from 'src/components/common/LargeButton'
import { useQuery } from '@realm/react'
import { RealmSchema } from 'src/types/enum/db.enum'
import { handleFilter } from 'src/utils/constants/CountryDataFilter'
+import * as ExpoImage from 'expo-image';
interface ProjectListProps {
isSelectable?: boolean;
@@ -95,11 +94,12 @@ const ProjectItem = ({
isProjectSelected ? { borderColor: Colors.NEW_PRIMARY } : {},
]}>
{item.image && process.env.EXPO_PUBLIC_CDN_URL ? (
-
) : (
diff --git a/src/components/map/EditDisplayCurrentPolygonMarker.tsx b/src/components/map/EditDisplayCurrentPolygonMarker.tsx
index 2a51ef579..22c3304b7 100644
--- a/src/components/map/EditDisplayCurrentPolygonMarker.tsx
+++ b/src/components/map/EditDisplayCurrentPolygonMarker.tsx
@@ -3,6 +3,7 @@ import React from 'react'
import { scaleFont, scaleSize } from 'src/utils/constants/mixins'
import { Colors, Typography } from 'src/utils/constants'
import BackIcon from 'assets/images/svg/BackIcon.svg'
+import i18next from 'i18next'
interface Props {
@@ -15,8 +16,8 @@ const EditDisplayCurrentPolygonMarker = (props: Props) => {
- Corner
- Please select the point and drag
+ {i18next.t("label.corner")}
+ {i18next.t("label.please_drag_point")}
)
diff --git a/src/components/previewIntervention/InterventionCoverImage.tsx b/src/components/previewIntervention/InterventionCoverImage.tsx
index 0a4232730..b42175df1 100644
--- a/src/components/previewIntervention/InterventionCoverImage.tsx
+++ b/src/components/previewIntervention/InterventionCoverImage.tsx
@@ -1,10 +1,10 @@
-import { Image, StyleSheet, View, TouchableOpacity, Text } from 'react-native'
+import { StyleSheet, View, TouchableOpacity, Text } from 'react-native'
import React, { useEffect, useState } from 'react'
import { scaleSize } from 'src/utils/constants/mixins'
import { Colors, Typography } from 'src/utils/constants'
import PenIcon from 'assets/images/svg/PenIcon.svg'
import BinIcon from 'assets/images/svg/BinIcon.svg'
-
+import * as ExpoImage from 'expo-image';
import { useNavigation } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
import { RootStackParamList } from 'src/types/type/navigation.type'
@@ -54,7 +54,7 @@ const InterventionCoverImage = (props: Props) => {
updateSampleTreeImage(interventionID, treeId, '')
}
- if(image===''){
+ if (image === '') {
return null
}
@@ -69,7 +69,7 @@ const InterventionCoverImage = (props: Props) => {
{!treeId &&
}
-
+
}
{uri.length === 0 &&
{!isCDN &&
diff --git a/src/components/previewIntervention/InterventionMetaData.tsx b/src/components/previewIntervention/InterventionMetaData.tsx
index 0855a8304..53986ecf4 100644
--- a/src/components/previewIntervention/InterventionMetaData.tsx
+++ b/src/components/previewIntervention/InterventionMetaData.tsx
@@ -18,22 +18,38 @@ const InterventionMetaData = (props: Props) => {
convertData()
}, [data])
+ function isJsonString(str) {
+ try {
+ const parsed = JSON.parse(str);
+ return typeof parsed === 'object' && parsed !== null;
+ } catch (e) {
+ return false;
+ }
+ }
+
const convertData = () => {
const checkForPublic: { value: string; key: string }[] = [];
-
if (typeof data === 'string') {
const parsedData = JSON.parse(data);
-
if (parsedData?.public && typeof parsedData.public === 'object' && !Array.isArray(parsedData.public)) {
- Object.entries(parsedData.public).forEach(([key, value]) => {
+ Object.entries(parsedData.public).forEach(([key, value]: [string, { value: string , label: string }]) => {
if (key !== 'isEntireSite' && typeof value === 'string') {
checkForPublic.push({ value, key });
}
+ if (key !== 'isEntireSite' && typeof value !== 'string' && value.value && value.label) {
+ if (isJsonString(value.value)) {
+ const parsedData = JSON.parse(value.value)
+ if (JSON.parse(value.value))
+ checkForPublic.push({ value: parsedData.value, key: value.label });
+ } else {
+ checkForPublic.push({ value: value.value, key: value.label });
+ }
+ }
});
}
}
-
+
setAdditionalData(checkForPublic);
};
diff --git a/src/components/previewIntervention/SampleTreePreviewList.tsx b/src/components/previewIntervention/SampleTreePreviewList.tsx
index 204bc49e0..a121b5405 100644
--- a/src/components/previewIntervention/SampleTreePreviewList.tsx
+++ b/src/components/previewIntervention/SampleTreePreviewList.tsx
@@ -1,4 +1,4 @@
-import { Image, StyleSheet, Text, TouchableOpacity, View } from 'react-native'
+import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'
import React, { useState } from 'react'
import { Colors, Typography } from 'src/utils/constants'
import { scaleSize } from 'src/utils/constants/mixins'
@@ -22,6 +22,7 @@ import { nonISUCountries } from 'src/utils/constants/appConstant'
import { INTERVENTION_STATUS } from 'src/types/type/app.type'
import { convertMeasurements } from 'src/utils/constants/measurements'
import { updateFilePath } from 'src/utils/helpers/fileSystemHelper'
+import * as ExpoImage from 'expo-image';
interface Props {
sampleTress: SampleTree[]
@@ -109,7 +110,7 @@ const SampleTreePreviewList = (props: Props) => {
- {uri !== '' && }
+ {uri !== '' && }
{!!details.specie_name &&
{i18next.t("label.species")}
diff --git a/src/components/sidebar/SidebarHeader.tsx b/src/components/sidebar/SidebarHeader.tsx
index 66e03d1b4..4f616889c 100644
--- a/src/components/sidebar/SidebarHeader.tsx
+++ b/src/components/sidebar/SidebarHeader.tsx
@@ -1,4 +1,4 @@
-import { Image, Pressable, StyleSheet, Text, TouchableOpacity, View } from 'react-native'
+import { Pressable, StyleSheet, Text, TouchableOpacity, View } from 'react-native'
import React, { useState } from 'react'
import { useSelector } from 'react-redux'
import { RootState } from 'src/store'
@@ -9,11 +9,12 @@ import { Skeleton } from 'moti/skeleton'
import ProfileEditIcon from 'assets/images/svg/ProfileEdit.svg'
import openWebView from 'src/utils/helpers/appHelper/openWebView'
import Popover from 'react-native-popover-view'
+import * as ExpoImage from 'expo-image';
const SidebarHeader = () => {
- const { image, displayName, email, type } = useSelector(
+ const { image, displayName, email } = useSelector(
(state: RootState) => state.userState,
)
const [popupVisible, setPopupVisible] = useState(false)
@@ -26,10 +27,6 @@ const SidebarHeader = () => {
openWebView(`https://web.plant-for-the-planet.org/en/profile/edit`);
}
- const deleteHandler = () => {
- openWebView(`https://web.plant-for-the-planet.org/en/profile/delete-account`);
- }
-
const togglePopup = () => {
setPopupVisible((prev) => !prev)
@@ -41,7 +38,7 @@ const SidebarHeader = () => {
isVisible={popupVisible}
backgroundStyle={{ opacity: 0 }}
popoverStyle={{
-
+ backgroundColor:Colors.LIGHT_PRIMARY,
}}
onRequestClose={togglePopup}
from={(
@@ -53,8 +50,6 @@ const SidebarHeader = () => {
Edit
- {type !== 'tpo' && <>
- Delete>}
}
@@ -65,7 +60,7 @@ const SidebarHeader = () => {
{image ? (
-
+
) : (
)}
@@ -105,7 +100,7 @@ const styles = StyleSheet.create({
alignItems: "center",
borderWidth: 0.5,
borderColor: Colors.PALE_WHITE,
- backgroundColor: Colors.WHITE,
+ backgroundColor: Colors.LIGHT_PRIMARY,
shadowColor: Colors.PALE_WHITE,
shadowOffset: { width: 2, height: 2 },
shadowOpacity: 0.6,
diff --git a/src/components/species/ManageSpeciesCard.tsx b/src/components/species/ManageSpeciesCard.tsx
index bd275d8c4..86939f02f 100644
--- a/src/components/species/ManageSpeciesCard.tsx
+++ b/src/components/species/ManageSpeciesCard.tsx
@@ -1,6 +1,6 @@
import React from 'react'
import i18next from 'src/locales/index'
-import { StyleSheet, Text, TouchableOpacity, View, Image } from 'react-native'
+import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'
import { Typography, Colors } from 'src/utils/constants'
import SingleTreeIcon from 'assets/images/svg/RoundTreeIcon.svg'
import PinkHeart from 'assets/images/svg/PinkHeart.svg'
@@ -9,6 +9,7 @@ import { SCALE_30 } from 'src/utils/constants/spacing'
import { scaleSize } from 'src/utils/constants/mixins'
import { PlantedSpecies } from 'src/types/interface/slice.interface'
import { IScientificSpecies } from 'src/types/interface/app.interface'
+import * as ExpoImage from 'expo-image';
interface SpecieCardProps {
item: PlantedSpecies | IScientificSpecies
@@ -46,7 +47,8 @@ export const SpecieCard: React.FC = ({
onPress={handlePress}>
{item.image ? (
- {
) : (
-
diff --git a/src/components/takePicture/ImagePreview.tsx b/src/components/takePicture/ImagePreview.tsx
index 9f36eb1a8..bb1bd424b 100644
--- a/src/components/takePicture/ImagePreview.tsx
+++ b/src/components/takePicture/ImagePreview.tsx
@@ -2,7 +2,7 @@ import { StyleSheet, View } from 'react-native'
import React from 'react'
import { CameraCapturedPicture } from 'expo-camera'
import CustomButton from 'src/components/common/CustomButton'
-import { Image } from 'expo-image'
+import * as ExpoImage from 'expo-image';
import { Colors } from 'src/utils/constants'
import { useNavigation } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
@@ -61,7 +61,7 @@ const ImagePreview = (props: Props) => {
return (
- {
@@ -57,9 +57,10 @@ const useLocationPermission = () => {
} catch (error) {
addNewLog({
logType: 'LOCATION',
- message: JSON.stringify(error),
+ message: "Last Known location",
logLevel: 'error',
- statusCode: ''
+ statusCode: '',
+ logStack: JSON.stringify(error)
})
}
}
@@ -67,8 +68,17 @@ const useLocationPermission = () => {
const requestLocationPermission = async () => {
- await Location.enableNetworkProviderAsync()
- await requestForegroundPermissionsAsync()
+ try {
+ await requestForegroundPermissionsAsync()
+ } catch (error) {
+ addNewLog({
+ logType: 'LOCATION',
+ message: "Location Permission",
+ logLevel: 'error',
+ statusCode: '',
+ logStack: JSON.stringify(error)
+ })
+ }
}
diff --git a/src/locales/languages/de/index.ts b/src/locales/languages/de/index.ts
index 83944a944..d8fdff8d3 100644
--- a/src/locales/languages/de/index.ts
+++ b/src/locales/languages/de/index.ts
@@ -20,7 +20,8 @@ import AdditionalData from './user/additionalData.json';
import Projects from './user/projects.json';
import Intervention from './user/intervention.json'
import CommonStrings from './user/commonData.json'
-
+import Plots from './monitoringPlots/plots.json'
+import Other from './user/other.json'
export default {
...WelcomeScreen,
...SignUp,
@@ -43,5 +44,7 @@ export default {
...AdditionalData,
...Projects,
...Intervention,
- ...CommonStrings
+ ...CommonStrings,
+ ...Plots,
+ ...Other
};
diff --git a/src/locales/languages/de/monitoringPlots/plots.json b/src/locales/languages/de/monitoringPlots/plots.json
new file mode 100644
index 000000000..c28b87fe7
--- /dev/null
+++ b/src/locales/languages/de/monitoringPlots/plots.json
@@ -0,0 +1,103 @@
+{
+ "monitoring_plot_header": "Monitoring Plots",
+ "plot_group": "Plot Gruppe",
+ "no_plots": "Noch keine Plots zum anzeigen",
+ "no_plots_note": "Beginne Monitoring Plots hinzuzufügen, /num deinen Fortschritt zu dokumentieren",
+ "plot_groups_header": "Plot Gruppen",
+ "no_groups": "Keine Gruppen zum anzeigen",
+ "no_groups_note": "Klicke die Schaltfläche unten, /num eine Plot Gruppe hinzuzufügen.",
+ "add_group": "Gruppe hinzufügen",
+ "add_plot":"Plot hinzufügen",
+ "edit_group_header": "Plot Gruppe editieren",
+ "group_name": "Gruppen Name",
+ "create_group_header": "Plot Gruppe hinzufügen",
+ "create_group": "Gruppe erstellen",
+ "create_group_note": "Gruppe erstellen und anfangen /nPlots hinzuzufügen",
+ "empty_plots_note": "Keine Plots zum Anzeigen./nklicke die Schaltfläche unten, um Plots hinzuzufügen",
+ "create_plot_header": "Plot anlegen",
+ "coming_soon": "Bald",
+ "plot_complexity": "Plot Komplexität",
+ "standard": "Standart",
+ "simple": "Einfach",
+ "plot_shape": "Plot Form",
+ "rectangular": "Eckig",
+ "circular": "Rund",
+ "plot_type": "Plot Typ",
+ "control": "Kontrolle",
+ "plot_name": "Plot Name",
+ "plot_radius": "Plot Radius",
+ "plot_radius_note": "25 meter oder mehr empfohlen",
+ "plot_wdith_note": "4 meter oder mehr empfohlen",
+ "plot_group_input": "Plot Gruppe (Optional)",
+ "center":"Plot Mittelpunkt",
+ "plot_map_note_1": "Gehe zum Mittelpunkt des Plots und stelle einen bemalten Pfosten mit Beschriftung auf, ",
+ "plot_map_note_2": "oder eine andere permanente Markierung",
+ "select_center":"Mittelpunkt des Plots auswählen",
+ "reset": "Zurücksetzen",
+ "create": "Anlegen",
+ "continue": "Weiter",
+ "plants": "Planzen",
+ "ecosystem": "Ökosystem",
+ "map": "Karte",
+ "search": "Suche",
+ "add_plants":"Pflanzen hinzufügen",
+ "no_search":"Keine Suchergebnisse gefunden",
+ "no_plants": "Noch keine Pflanzen zum anzeigen",
+ "no_plant_note": "Klicke die untere Schaltfläche und füge eine neue Pflanze hinzu",
+ "add_plant": "Pflanzen hinzufügen",
+ "tree_planted": "Dieser Baum wurde gepflanzt",
+ "tree_planted_note": "Egal ob dieser Baum gepflanzt wurde, oder ob er natürlich in diesem Plot vorkommt",
+ "measurement_date": "Vermessungs Datum",
+ "planting_date": "Pflanzdatum",
+ "species": "Arten",
+ "height": "Höhe",
+ "width":"Breite",
+ "diameter": "Durchmesser",
+ "tree_alive": "Dieser Baum ist noch immer am Leben",
+ "tag": "Tag",
+ "search_for_species": "Nach Arten suchen",
+ "species_note": "Starte die Suchen nach Arten /nmit der Sucheingabe.",
+ "type_three_word": "Schreibe mindestens 3 Wörter für /nbessere Ergebnisse",
+ "save": "Speichern",
+ "no_obs": "Keine Beobachtungen zum anzeigen",
+ "no_obs_note": "Klicke die untere Schaltfläche um /nneue Beobachtungen hinzuzufügen.",
+ "add_obs": "Beobachtung hinzufügen",
+ "project": "Projekt",
+ "obs_date": "Beobachtungsdatum",
+ "value": "Wert",
+ "edit_name": "Name editieren",
+ "edit_plot": "Plot Abmessungen editieren",
+ "delete": "Löschen",
+ "update_dimensions": "Abmessungen updaten",
+ "radius": "Radius",
+ "plot_length": "Plot Länge",
+ "plot_width": "Plot Breite",
+ "plot_width_note": "4 Meter oder mehr empfohlen",
+ "m_info_h1": "Wie erstelle ich einen Monitoring Plot",
+ "m_info_n1": "Wir empfehlen mit einem Team aus 2 Personen zu arbeiten. Eine Person nimmt die Maße, die andere Person gibt die Werte in TreeMapper ein. Zusammen sollte es ungefähr 4 Stunden dauern, um einen Plot zu erstellen/n/n Sobald sie erstellt sind, müssen die Plots jedes Jahr um die gleiche Zeit neu vermessen werden. /n/n Für saisonale Trockenwälder ist der Beginn der Regenzeit der ideale Zeitpunkt um Plots zu erstellen. /n",
+ "m_info_h2": "Was brauche ich für einen standart 25m x 2m Plot?\n",
+ "m_info_n2": "1. ca. 300 Baum-Tags aus Metall (ca. €30)\n 2. 10 Meter 3mm Draht\n3. Seitenschneider\n4. Zwei 50m Maßbänder\n",
+ "m_info_h3": "Wie viele Plots brauche ich?\n",
+ "m_info_n3": "Es sollten 5 Plots plus einen für alle 5 Hektar erstellt werden. Ein Projekt, das 10ha renaturiert, würde 7 Plots haben.\n\n",
+ "m_info_h4": "Wie wähle ich die Position aus?\n",
+ "m_info_n4": "Plot Positionen müssen willkürlich gewählt werden, inklusive Plots an den Rändern der Fläche. Darüber musst du dir aber keine Gedanken machen, da TreeMapper optimale Positionen vorschlagen wird.\n\n",
+ "m_info_h5": "Was sind Kontrollplots?\n",
+ "m_info_n5": "Kontroll Plots erlauben dir zu verstehen, wie sich deine Fläche entwickelt hätte, wenn keine Bäume von dir gepflanzt worden wären. Daher werden manche Flächen absichtlich nicht bepflanzt und als Kontrollflächen registriert. Dort wird gemessen, was dort natürlich wächst. Ungefähr 5% der Monitoring Plots sollten einen zugehörigen Kontrollplot haben.\n\nDieser Prozess basiert auf XYZ et al. 2022.",
+ "canopy_cover":"Baumkronendichte",
+ "soil_moisture":"Bodenfeuchtigkeit",
+ "bioacoustics":"Bioakustik",
+ "observations":"Beobachtungen",
+ "last_updated":"zuletzt aktualisiert",
+ "intervention_plot":"Interventions Plot",
+ "control_plot":"Kontrollplot",
+ "incomplete":"Unvollständig",
+ "planted":"Gepflanzt",
+ "recruit":"Natürliches Vorkommen",
+ "select_species":"Ausgewählte Art",
+ "how_many_trees":"Wie viele Bäume hast du gepflanzt?",
+ "plant_tree_count":"Anzahl gepflanzte Bäume",
+ "existing_count":"Anzahl existierende Bäume",
+ "name_of_tree":"Name der Baumart",
+ "shrub_count":"Anzahl Stauden",
+ "stump_count":"Anzahl Stümpfe"
+}
\ No newline at end of file
diff --git a/src/locales/languages/de/user/monitoringPlot.json b/src/locales/languages/de/user/monitoringPlot.json
deleted file mode 100644
index 67d41d072..000000000
--- a/src/locales/languages/de/user/monitoringPlot.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "monitoring_plot_header": "Monitoring Plots",
- "plot_group": "Plot Gruppe",
- "no_plots": "Noch keine Plots zum anzeigen",
- "no_plots_note": "Beginne Monitoring Plots hinzuzufügen, /num deinen Fortschritt zu dokumentieren",
- "plot_groups_header": "Plot Gruppen",
- "no_groups": "Keine Gruppen zum anzeigen",
- "no_groups_note": "Klicke die Schaltfläche unten, /num eine Plot Gruppe hinzuzufügen.",
- "add_group": "Gruppe hinzufügen",
- "add_plot":"Plot hinzufügen",
- "edit_group_header": "Plot Gruppe editieren",
- "group_name": "Gruppen Name",
- "create_group_header": "Plot Gruppe hinzufügen",
- "create_group": "Gruppe erstellen",
- "create_group_note": "Gruppe erstellen und anfangen /nPlots hinzuzufügen",
- "empty_plots_note": "Keine Plots zum Anzeigen./nklicke die Schaltfläche unten, um Plots hinzuzufügen",
- "create_plot_header": "Plot anlegen",
- "coming_soon": "Bald",
- "plot_complexity": "Plot Komplexität",
- "standard": "Standart",
- "simple": "Einfach",
- "plot_shape": "Plot Form",
- "rectangular": "Eckig",
- "circular": "Rund",
- "plot_type": "Plot Typ",
- "control": "Kontrolle",
- "plot_name": "Plot Name",
- "plot_radius": "Plot Radius",
- "plot_radius_note": "25 meter oder mehr empfohlen",
- "plot_wdith_note": "4 meter oder mehr empfohlen",
- "plot_group_input": "Plot Gruppe (Optional)",
- "center":"Plot Mittelpunkt",
- "plot_map_note_1": "Gehe zum Mittelpunkt des Plots und stelle einen bemalten Pfosten mit Beschriftung auf, ",
- "plot_map_note_2": "oder eine andere permanente Markierung",
- "select_center":"Mittelpunkt des Plots auswählen",
- "reset": "Zurücksetzen",
- "create": "Anlegen",
- "continue": "Weiter",
- "plants": "Planzen",
- "ecosystem": "Ökosystem",
- "map": "Karte",
- "search": "Suche",
- "add_plants":"Pflanzen hinzufügen",
- "no_search":"Keine Suchergebnisse gefunden",
- "no_plants": "Noch keine Pflanzen zum anzeigen",
- "no_plant_note": "Klicke die untere Schaltfläche und füge eine neue Pflanze hinzu",
- "add_plant": "Pflanzen hinzufügen",
- "tree_planted": "Dieser Baum wurde gepflanzt",
- "tree_planted_note": "Egal ob dieser Baum gepflanzt wurde, oder ob er natürlich in diesem Plot vorkommt",
- "measurement_date": "Vermessungs Datum",
- "planting_date": "Pflanzdatum",
- "species": "Arten",
- "height": "Höhe",
- "width":"Breite",
- "diameter": "Durchmesser",
- "tree_alive": "Dieser Baum ist noch immer am Leben",
- "tag": "Tag",
- "search_for_species": "Nach Arten suchen",
- "species_note": "Starte die Suchen nach Arten /nmit der Sucheingabe.",
- "type_three_word": "Schreibe mindestens 3 Wörter für /nbessere Ergebnisse",
- "save": "Speichern",
- "no_obs": "Keine Beobachtungen zum anzeigen",
- "no_obs_note": "Klicke die untere Schaltfläche um /nneue Beobachtungen hinzuzufügen.",
- "add_obs": "Beobachtung hinzufügen",
- "project": "Projekt",
- "obs_date": "Beobachtungsdatum",
- "value": "Wert",
- "edit_name": "Name editieren",
- "edit_plot": "Plot Abmessungen editieren",
- "delete": "Löschen",
- "update_dimensions": "Abmessungen updaten",
- "radius": "Radius",
- "plot_length": "Plot Länge",
- "plot_width": "Plot Breite",
- "plot_width_note": "4 Meter oder mehr empfohlen",
- "m_info_h1": "Wie erstelle ich einen Monitoring Plot",
- "m_info_n1": "Wir empfehlen mit einem Team aus 2 Personen zu arbeiten. Eine Person nimmt die Maße, die andere Person gibt die Werte in TreeMapper ein. Zusammen sollte es ungefähr 4 Stunden dauern, um einen Plot zu erstellen/n/n Sobald sie erstellt sind, müssen die Plots jedes Jahr um die gleiche Zeit neu vermessen werden. /n/n Für saisonale Trockenwälder ist der Beginn der Regenzeit der ideale Zeitpunkt um Plots zu erstellen. /n",
- "m_info_h2": "Was brauche ich für einen standart 25m x 2m Plot?\n",
- "m_info_n2": "1. ca. 300 Baum-Tags aus Metall (ca. €30)\n 2. 10 Meter 3mm Draht\n3. Seitenschneider\n4. Zwei 50m Maßbänder\n",
- "m_info_h3": "Wie viele Plots brauche ich?\n",
- "m_info_n3": "Es sollten 5 Plots plus einen für alle 5 Hektar erstellt werden. Ein Projekt, das 10ha renaturiert, würde 7 Plots haben.\n\n",
- "m_info_h4": "Wie wähle ich die Position aus?\n",
- "m_info_n4": "Plot Positionen müssen willkürlich gewählt werden, inklusive Plots an den Rändern der Fläche. Darüber musst du dir aber keine Gedanken machen, da TreeMapper optimale Positionen vorschlagen wird.\n\n",
- "m_info_h5": "Was sind Kontrollplots?\n",
- "m_info_n5": "Kontroll Plots erlauben dir zu verstehen, wie sich deine Fläche entwickelt hätte, wenn keine Bäume von dir gepflanzt worden wären. Daher werden manche Flächen absichtlich nicht bepflanzt und als Kontrollflächen registriert. Dort wird gemessen, was dort natürlich wächst. Ungefähr 5% der Monitoring Plots sollten einen zugehörigen Kontrollplot haben.\n\nDieser Prozess basiert auf XYZ et al. 2022.",
- "canopy_cover":"Baumkronendichte",
- "soil_moisture":"Bodenfeuchtigkeit",
- "bioacoustics":"Bioakustik",
- "observations":"Beobachtungen",
- "last_updated":"zuletzt aktualisiert",
- "intervention_plot":"Interventions Plot",
- "control_plot":"Kontrollplot",
- "incomplete":"Unvollständig",
- "planted":"Gepflanzt",
- "recruit":"Natürliches Vorkommen",
- "select_species":"Ausgewählte Art",
- "how_many_trees":"Wie viele Bäume hast du gepflanzt?",
- "plant_tree_count":"Anzahl gepflanzte Bäume",
- "existing_count":"Anzahl existierende Bäume",
- "name_of_tree":"Name der Baumart",
- "shrub_count":"Anzahl Stauden",
- "stump_count":"Anzahl Stümpfe"
-}
\ No newline at end of file
diff --git a/src/locales/languages/de/user/other.json b/src/locales/languages/de/user/other.json
new file mode 100644
index 000000000..6e5be2121
--- /dev/null
+++ b/src/locales/languages/de/user/other.json
@@ -0,0 +1,26 @@
+{
+ "map_credits":"Map Credits",
+ "openstreet_contributors":"OpenStreetMap Contributors",
+ "species_caps":"Species ",
+ "please_drag_point":"Please select the point and drag",
+ "corner":"Corner",
+ "remove_from_list":" removed from list",
+ "added_to_favorites":"added to favorites",
+ "removed_from_favorites":"removed from favorites",
+ "agree_signup":"I agree that I may be contacted by the children and youth organization Plant-for-the-Planet as part of tree planting news and challenges.",
+ "agree_2":"I agree to have my name published in the Plant-for-the-Planet Website and App.",
+ "country_change":"Change Country",
+ "individual":"Individual",
+ "company":"Company",
+ "tree_organisation":"Tree Planting \nOrganisation",
+ "school":"School",
+ "acc_type":"Account Type",
+ "plot_coming_soon":"Monitoring Plots Coming Soon",
+ "plot_coming_soon_note":"You'll soon be able to monitor and \nmanage your plots with detailed insights.\nStay tuned!",
+ "delete_acc_header":"To continue with deletion \nPress Delete now.\n",
+ "click_agree":"By clicking 'Delete', I am requesting Plant-for-the-Planet to delete all data associated with my Plant-for-the-Planet account. Donation data may be kept for up to eight years. Trees I have registered will not be removed, however, will be anonymized and can't be claimed again.",
+ "delete_acc_imp_note":"Before proceeding, make sure you've cancelled all subscriptions.",
+ "delete_info_note_1":"I also understand that account deletion of",
+ "delete_info_note_2":" is irreversible.",
+ "delete_in":"You can Delete in "
+}
\ No newline at end of file
diff --git a/src/locales/languages/en/index.ts b/src/locales/languages/en/index.ts
index a69e257fa..d8fdff8d3 100644
--- a/src/locales/languages/en/index.ts
+++ b/src/locales/languages/en/index.ts
@@ -19,9 +19,9 @@ import SpeciesSyncError from './user/speciesSyncError.json';
import AdditionalData from './user/additionalData.json';
import Projects from './user/projects.json';
import Intervention from './user/intervention.json'
-import MonitoringPlot from './user/monitoringPlot.json'
import CommonStrings from './user/commonData.json'
-
+import Plots from './monitoringPlots/plots.json'
+import Other from './user/other.json'
export default {
...WelcomeScreen,
...SignUp,
@@ -44,6 +44,7 @@ export default {
...AdditionalData,
...Projects,
...Intervention,
- ...MonitoringPlot,
- ...CommonStrings
+ ...CommonStrings,
+ ...Plots,
+ ...Other
};
diff --git a/src/locales/languages/en/user/monitoringPlot.json b/src/locales/languages/en/monitoringPlots/plots.json
similarity index 100%
rename from src/locales/languages/en/user/monitoringPlot.json
rename to src/locales/languages/en/monitoringPlots/plots.json
diff --git a/src/locales/languages/en/user/other.json b/src/locales/languages/en/user/other.json
new file mode 100644
index 000000000..f77dd9e80
--- /dev/null
+++ b/src/locales/languages/en/user/other.json
@@ -0,0 +1,26 @@
+{
+ "map_credits":"map_credits",
+ "openstreet_contributors":"OpenStreetMap Contributors",
+ "species_caps":"Species ",
+ "please_drag_point":"Please select the point and drag",
+ "corner":"Corner",
+ "remove_from_list":" removed from list",
+ "added_to_favorites":"added to favorites",
+ "removed_from_favorites":"removed from favorites",
+ "agree_signup":"I agree that I may be contacted by the children and youth organization Plant-for-the-Planet as part of tree planting news and challenges.",
+ "agree_2":"I agree to have my name published in the Plant-for-the-Planet Website and App.",
+ "country_change":"Change Country",
+ "individual":"Individual",
+ "company":"Company",
+ "tree_organisation":"Tree Planting \nOrganisation",
+ "school":"School",
+ "acc_type":"Account Type",
+ "plot_coming_soon":"Monitoring Plots Coming Soon",
+ "plot_coming_soon_note":"You'll soon be able to monitor and \nmanage your plots with detailed insights.\nStay tuned!",
+ "delete_acc_header":"To continue with deletion \nPress Delete now.\n",
+ "click_agree":"By clicking 'Delete', I am requesting Plant-for-the-Planet to delete all data associated with my Plant-for-the-Planet account. Donation data may be kept for up to eight years. Trees I have registered will not be removed, however, will be anonymized and can't be claimed again.",
+ "delete_acc_imp_note":"Before proceeding, make sure you've cancelled all subscriptions.",
+ "delete_info_note_1":"I also understand that account deletion of",
+ "delete_info_note_2":" is irreversible.",
+ "delete_in":"You can Delete in "
+}
\ No newline at end of file
diff --git a/src/locales/languages/es/index.ts b/src/locales/languages/es/index.ts
index 83944a944..d8fdff8d3 100644
--- a/src/locales/languages/es/index.ts
+++ b/src/locales/languages/es/index.ts
@@ -20,7 +20,8 @@ import AdditionalData from './user/additionalData.json';
import Projects from './user/projects.json';
import Intervention from './user/intervention.json'
import CommonStrings from './user/commonData.json'
-
+import Plots from './monitoringPlots/plots.json'
+import Other from './user/other.json'
export default {
...WelcomeScreen,
...SignUp,
@@ -43,5 +44,7 @@ export default {
...AdditionalData,
...Projects,
...Intervention,
- ...CommonStrings
+ ...CommonStrings,
+ ...Plots,
+ ...Other
};
diff --git a/src/locales/languages/es/monitoringPlots/plots.json b/src/locales/languages/es/monitoringPlots/plots.json
new file mode 100644
index 000000000..fef2d0293
--- /dev/null
+++ b/src/locales/languages/es/monitoringPlots/plots.json
@@ -0,0 +1,103 @@
+{
+ "monitoring_plot_header": "Parcelas de seguimiento",
+ "plot_group": "Grupo de trama",
+ "no_plots": "Aún no hay parcelas para mostrar",
+ "no_plots_note": "Comience a agregar su parcela de monitoreo para realizar \nun seguimiento de su progreso",
+ "plot_groups_header": "Grupos de tramas",
+ "no_groups": "No hay grupos para mostrar",
+ "no_groups_note": "Toque el botón de abajo para agregar \nun grupo de parcelas",
+ "add_group": "Añadir grupo",
+ "add_plot":"Añadir parcela",
+ "edit_group_header": "Editar grupo de parcelas",
+ "group_name": "Nombre del grupo",
+ "create_group_header": "Agregar grupo de parcelas",
+ "create_group": "Crea un grupo",
+ "create_group_note": "Crea un grupo y \ncomienza a agregar parcelas",
+ "empty_plots_note": "No hay parcelas para mostrar \ntoque el botón de abajo para agregar parcelas",
+ "create_plot_header": "Crear trama",
+ "coming_soon": "Muy pronto",
+ "plot_complexity": "Complejidad de la trama",
+ "standard": "Estándar",
+ "simple": "Sencilla",
+ "plot_shape": "Forma de la trama",
+ "rectangular": "Rectangular",
+ "circular": "Circular",
+ "plot_type": "Tipo de trama",
+ "control": "Control",
+ "plot_name": "Nombre de la trama",
+ "plot_radius": "Radio de la parcela",
+ "plot_radius_note": "Se recomiendan 25 metros o más",
+ "plot_wdith_note": "Se recomiendan 4 metros o más",
+ "plot_group_input": "Grupo de tramas (opcional)",
+ "center":"Centro de la trama",
+ "plot_map_note_1": "Vaya al centro de la parcela e inserte un poste de varilla de refuerzo pintado etiquetado ",
+ "plot_map_note_2": "u otra marca etiquetada permanente",
+ "select_center":"Seleccionar el centro de la trama",
+ "reset": "Reiniciar",
+ "create": "Crear",
+ "continue": "Continuar",
+ "plants": "Plantas",
+ "ecosystem": "Ecosistema",
+ "map": "Mapa",
+ "search": "Buscar",
+ "add_plants":"Agregar plantas",
+ "no_search":"No se encontraron resultados de búsqueda",
+ "no_plants": "Aún no hay plantas para mostrar",
+ "no_plant_note": "Toque el botón a continuación para agregar una nueva planta",
+ "add_plant": "Agregar plantas",
+ "tree_planted": "Este árbol fue plantado",
+ "tree_planted_note": "Si el árbol está plantado o es un recluta (que ocurre naturalmente en la parcela)",
+ "measurement_date": "Fecha de medición",
+ "planting_date": "Fecha de plantación",
+ "species": "Especies",
+ "height": "Height",
+ "width":"Ancho",
+ "diameter": "Diámetro",
+ "tree_alive": "Este árbol todavía está vivo.",
+ "tag": "etiqueta",
+ "search_for_species": "Búsqueda de especies",
+ "species_note": "Comience a buscar especies \nen el campo de búsqueda.",
+ "type_three_word": "Escriba al menos 3 palabras \npara obtener un mejor resultado",
+ "save": "Ahorrar",
+ "no_obs": "No hay ninguna observación para mostrar",
+ "no_obs_note": "Toque el botón a continuación \npara agregar una nueva observación.",
+ "add_obs": "Agregar observación",
+ "project": "Proyecto",
+ "obs_date": "Fecha de observación",
+ "value": "Valor",
+ "edit_name": "Editar nombre",
+ "edit_plot": "Editar dimensión de la parcela",
+ "delete": "Borrar",
+ "update_dimensions": "Actualizar dimensiones",
+ "radius": "Radio",
+ "plot_length": "Duración de la trama",
+ "plot_width": "Ancho de la parcela",
+ "plot_width_note": "Se recomiendan 4 metros o más",
+ "m_info_h1": "¿Cómo configuro una parcela de monitoreo?",
+ "m_info_n1": "Recomendamos trabajar en equipo de dos personas: una persona para medir y otra para registrar en TreeMapper. En conjunto, debería llevarles aproximadamente cuatro horas por parcela.\n\n Una vez instaladas, las parcelas deben volver a medirse en la misma época cada año.\n\nEn bosques estacionalmente secos, el momento ideal para instalar la parcela es al comienzo de la estación húmeda.\n.",
+ "m_info_h2": "¿Qué necesito para una parcela estándar de 25m por 2m?\n",
+ "m_info_n2": "1. Aproximadamente 300 etiquetas metálicas para árboles (aproximadamente 30 €)\n 2. 10 metros de alambre de 3 mm\n3. Cortadores de alambre\n4. Dos cintas métricas de 50 m\n",
+ "m_info_h3": "¿Cuántas parcelas necesito?\n",
+ "m_info_n3": "Se deben establecer 5 parcelas más 1 por cada 5 hectáreas. Un proyecto de recuperación de 10 ha tendría 7 parcelas.\n\n",
+ "m_info_h4": "¿Cómo elijo las ubicaciones?\n",
+ "m_info_n4": "Las ubicaciones de las parcelas deben elegirse al azar, incluidas las parcelas cercanas y en los bordes del sitio. Pero no debe preocuparse por eso, ya que TreeMapper sugiere ubicaciones óptimas para las parcelas.\n\n",
+ "m_info_h5": " ¿Qué son las parcelas de control?\n",
+ "m_info_n5": "Las parcelas de control le permiten comprender cómo se habría desarrollado su sitio si no hubiera plantado árboles. Por lo tanto, dejamos algunos sitios 'sin plantar', los registramos como sitios de control y medimos lo que crece allí de forma natural. Alrededor del 5 % de sus parcelas de monitoreo deben tener una parcela de control emparejada.\n\nEste proceso se basa en XYZ et al. 2022.",
+ "canopy_cover":"Cubierta de dosel",
+ "soil_moisture":"La humedad del suelo",
+ "bioacoustics":"Bioacústica",
+ "observations":"Observaciones",
+ "last_updated":"última actualización",
+ "intervention_plot":"trama de intervención",
+ "control_plot":"parcela de control",
+ "incomplete":"Incompleta",
+ "planted":"Plantada",
+ "recruit":"Recluta",
+ "select_species":"Seleccionar especies",
+ "how_many_trees":"¿Cuántos árboles plantaste?",
+ "plant_tree_count":"Recuento de árboles de plantas",
+ "existing_count":"Recuento de árboles existentes",
+ "name_of_tree":"Nombre de la especie de árbol",
+ "shrub_count":"Recuento de arbustos",
+ "stump_count":"Recuento de tocones"
+}
\ No newline at end of file
diff --git a/src/locales/languages/es/user/monitoringPlot.json b/src/locales/languages/es/user/monitoringPlot.json
deleted file mode 100644
index 4af9ee094..000000000
--- a/src/locales/languages/es/user/monitoringPlot.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "monitoring_plot_header": "Parcelas de seguimiento",
- "plot_group": "Grupo de trama",
- "no_plots": "Aún no hay parcelas para mostrar",
- "no_plots_note": "Comience a agregar su parcela de monitoreo para realizar \nun seguimiento de su progreso",
- "plot_groups_header": "Grupos de tramas",
- "no_groups": "No hay grupos para mostrar",
- "no_groups_note": "Toque el botón de abajo para agregar \nun grupo de parcelas",
- "add_group": "Añadir grupo",
- "add_plot":"Añadir parcela",
- "edit_group_header": "Editar grupo de parcelas",
- "group_name": "Nombre del grupo",
- "create_group_header": "Agregar grupo de parcelas",
- "create_group": "Crea un grupo",
- "create_group_note": "Crea un grupo y \ncomienza a agregar parcelas",
- "empty_plots_note": "No hay parcelas para mostrar \ntoque el botón de abajo para agregar parcelas",
- "create_plot_header": "Crear trama",
- "coming_soon": "Muy pronto",
- "plot_complexity": "Complejidad de la trama",
- "standard": "Estándar",
- "simple": "Sencilla",
- "plot_shape": "Forma de la trama",
- "rectangular": "Rectangular",
- "circular": "Circular",
- "plot_type": "Tipo de trama",
- "control": "Control",
- "plot_name": "Nombre de la trama",
- "plot_radius": "Radio de la parcela",
- "plot_radius_note": "Se recomiendan 25 metros o más",
- "plot_wdith_note": "Se recomiendan 4 metros o más",
- "plot_group_input": "Grupo de tramas (opcional)",
- "center":"Centro de la trama",
- "plot_map_note_1": "Vaya al centro de la parcela e inserte un poste de varilla de refuerzo pintado etiquetado ",
- "plot_map_note_2": "u otra marca etiquetada permanente",
- "select_center":"Seleccionar el centro de la trama",
- "reset": "Reiniciar",
- "create": "Crear",
- "continue": "Continuar",
- "plants": "Plantas",
- "ecosystem": "Ecosistema",
- "map": "Mapa",
- "search": "Buscar",
- "add_plants":"Agregar plantas",
- "no_search":"No se encontraron resultados de búsqueda",
- "no_plants": "Aún no hay plantas para mostrar",
- "no_plant_note": "Toque el botón a continuación para agregar una nueva planta",
- "add_plant": "Agregar plantas",
- "tree_planted": "Este árbol fue plantado",
- "tree_planted_note": "Si el árbol está plantado o es un recluta (que ocurre naturalmente en la parcela)",
- "measurement_date": "Fecha de medición",
- "planting_date": "Fecha de plantación",
- "species": "Especies",
- "height": "Height",
- "width":"Ancho",
- "diameter": "Diámetro",
- "tree_alive": "Este árbol todavía está vivo.",
- "tag": "etiqueta",
- "search_for_species": "Búsqueda de especies",
- "species_note": "Comience a buscar especies \nen el campo de búsqueda.",
- "type_three_word": "Escriba al menos 3 palabras \npara obtener un mejor resultado",
- "save": "Ahorrar",
- "no_obs": "No hay ninguna observación para mostrar",
- "no_obs_note": "Toque el botón a continuación \npara agregar una nueva observación.",
- "add_obs": "Agregar observación",
- "project": "Proyecto",
- "obs_date": "Fecha de observación",
- "value": "Valor",
- "edit_name": "Editar nombre",
- "edit_plot": "Editar dimensión de la parcela",
- "delete": "Borrar",
- "update_dimensions": "Actualizar dimensiones",
- "radius": "Radio",
- "plot_length": "Duración de la trama",
- "plot_width": "Ancho de la parcela",
- "plot_width_note": "Se recomiendan 4 metros o más",
- "m_info_h1": "¿Cómo configuro una parcela de monitoreo?",
- "m_info_n1": "Recomendamos trabajar en equipo de dos personas: una persona para medir y otra para registrar en TreeMapper. En conjunto, debería llevarles aproximadamente cuatro horas por parcela.\n\n Una vez instaladas, las parcelas deben volver a medirse en la misma época cada año.\n\nEn bosques estacionalmente secos, el momento ideal para instalar la parcela es al comienzo de la estación húmeda.\n.",
- "m_info_h2": "¿Qué necesito para una parcela estándar de 25m por 2m?\n",
- "m_info_n2": "1. Aproximadamente 300 etiquetas metálicas para árboles (aproximadamente 30 €)\n 2. 10 metros de alambre de 3 mm\n3. Cortadores de alambre\n4. Dos cintas métricas de 50 m\n",
- "m_info_h3": "¿Cuántas parcelas necesito?\n",
- "m_info_n3": "Se deben establecer 5 parcelas más 1 por cada 5 hectáreas. Un proyecto de recuperación de 10 ha tendría 7 parcelas.\n\n",
- "m_info_h4": "¿Cómo elijo las ubicaciones?\n",
- "m_info_n4": "Las ubicaciones de las parcelas deben elegirse al azar, incluidas las parcelas cercanas y en los bordes del sitio. Pero no debe preocuparse por eso, ya que TreeMapper sugiere ubicaciones óptimas para las parcelas.\n\n",
- "m_info_h5": " ¿Qué son las parcelas de control?\n",
- "m_info_n5": "Las parcelas de control le permiten comprender cómo se habría desarrollado su sitio si no hubiera plantado árboles. Por lo tanto, dejamos algunos sitios 'sin plantar', los registramos como sitios de control y medimos lo que crece allí de forma natural. Alrededor del 5 % de sus parcelas de monitoreo deben tener una parcela de control emparejada.\n\nEste proceso se basa en XYZ et al. 2022.",
- "canopy_cover":"Cubierta de dosel",
- "soil_moisture":"La humedad del suelo",
- "bioacoustics":"Bioacústica",
- "observations":"Observaciones",
- "last_updated":"última actualización",
- "intervention_plot":"trama de intervención",
- "control_plot":"parcela de control",
- "incomplete":"Incompleta",
- "planted":"Plantada",
- "recruit":"Recluta",
- "select_species":"Seleccionar especies",
- "how_many_trees":"¿Cuántos árboles plantaste?",
- "plant_tree_count":"Recuento de árboles de plantas",
- "existing_count":"Recuento de árboles existentes",
- "name_of_tree":"Nombre de la especie de árbol",
- "shrub_count":"Recuento de arbustos",
- "stump_count":"Recuento de tocones"
-}
\ No newline at end of file
diff --git a/src/locales/languages/es/user/other.json b/src/locales/languages/es/user/other.json
new file mode 100644
index 000000000..f77dd9e80
--- /dev/null
+++ b/src/locales/languages/es/user/other.json
@@ -0,0 +1,26 @@
+{
+ "map_credits":"map_credits",
+ "openstreet_contributors":"OpenStreetMap Contributors",
+ "species_caps":"Species ",
+ "please_drag_point":"Please select the point and drag",
+ "corner":"Corner",
+ "remove_from_list":" removed from list",
+ "added_to_favorites":"added to favorites",
+ "removed_from_favorites":"removed from favorites",
+ "agree_signup":"I agree that I may be contacted by the children and youth organization Plant-for-the-Planet as part of tree planting news and challenges.",
+ "agree_2":"I agree to have my name published in the Plant-for-the-Planet Website and App.",
+ "country_change":"Change Country",
+ "individual":"Individual",
+ "company":"Company",
+ "tree_organisation":"Tree Planting \nOrganisation",
+ "school":"School",
+ "acc_type":"Account Type",
+ "plot_coming_soon":"Monitoring Plots Coming Soon",
+ "plot_coming_soon_note":"You'll soon be able to monitor and \nmanage your plots with detailed insights.\nStay tuned!",
+ "delete_acc_header":"To continue with deletion \nPress Delete now.\n",
+ "click_agree":"By clicking 'Delete', I am requesting Plant-for-the-Planet to delete all data associated with my Plant-for-the-Planet account. Donation data may be kept for up to eight years. Trees I have registered will not be removed, however, will be anonymized and can't be claimed again.",
+ "delete_acc_imp_note":"Before proceeding, make sure you've cancelled all subscriptions.",
+ "delete_info_note_1":"I also understand that account deletion of",
+ "delete_info_note_2":" is irreversible.",
+ "delete_in":"You can Delete in "
+}
\ No newline at end of file
diff --git a/src/locales/languages/fr/index.ts b/src/locales/languages/fr/index.ts
index a69e257fa..d8fdff8d3 100644
--- a/src/locales/languages/fr/index.ts
+++ b/src/locales/languages/fr/index.ts
@@ -19,9 +19,9 @@ import SpeciesSyncError from './user/speciesSyncError.json';
import AdditionalData from './user/additionalData.json';
import Projects from './user/projects.json';
import Intervention from './user/intervention.json'
-import MonitoringPlot from './user/monitoringPlot.json'
import CommonStrings from './user/commonData.json'
-
+import Plots from './monitoringPlots/plots.json'
+import Other from './user/other.json'
export default {
...WelcomeScreen,
...SignUp,
@@ -44,6 +44,7 @@ export default {
...AdditionalData,
...Projects,
...Intervention,
- ...MonitoringPlot,
- ...CommonStrings
+ ...CommonStrings,
+ ...Plots,
+ ...Other
};
diff --git a/src/locales/languages/fr/monitoringPlots/plots.json b/src/locales/languages/fr/monitoringPlots/plots.json
new file mode 100644
index 000000000..8da3d326a
--- /dev/null
+++ b/src/locales/languages/fr/monitoringPlots/plots.json
@@ -0,0 +1,103 @@
+{
+ "monitoring_plot_header": "Monitoring Plots",
+ "plot_group": "Plot Group",
+ "no_plots": "No Plots to Show Yet",
+ "no_plots_note": "Start adding your monitoring plot to keep \ntrack of your progress",
+ "plot_groups_header": "Plot Groups",
+ "no_groups": "No Groups to Show",
+ "no_groups_note": "Tap the below button \nto add Plot Group",
+ "add_group": "Add Group",
+ "add_plot":"Add Plot",
+ "edit_group_header": "Edit Plot Group",
+ "group_name": "Group Name",
+ "create_group_header": "Add Plot Group",
+ "create_group": "Create Group",
+ "create_group_note": "Create Group and start \nadding plots",
+ "empty_plots_note": "No plots to show \nTap the below button to add plots",
+ "create_plot_header": "Create Plot",
+ "coming_soon": "Coming Soon",
+ "plot_complexity": "Plot Complexity",
+ "standard": "Standard",
+ "simple": "Simple",
+ "plot_shape": "Plot Shape",
+ "rectangular": "Rectangular",
+ "circular": "Circular",
+ "plot_type": "Plot Type",
+ "control": "Control",
+ "plot_name": "Plot Name",
+ "plot_radius": "Plot Radius",
+ "plot_radius_note": "25 meters or more recommended",
+ "plot_wdith_note": "4 meters or more recommended",
+ "plot_group_input": "Plot Group (Optional)",
+ "center":"Plot Center",
+ "plot_map_note_1": "Go to the center of the plot and insert a painted rebar post labeled ",
+ "plot_map_note_2": "or another permanent labeled marking",
+ "select_center":"Select center of Plot",
+ "reset": "Reset",
+ "create": "Create",
+ "continue": "Continue",
+ "plants": "Plants",
+ "ecosystem": "Ecosystem",
+ "map": "Map",
+ "search": "Search",
+ "add_plants":"Add Plants",
+ "no_search":"No Search result found",
+ "no_plants": "No Plants to Show Yet",
+ "no_plant_note": "Tap the button below to add a new plant",
+ "add_plant": "Add Plants",
+ "tree_planted": "This tree was planted",
+ "tree_planted_note": "Whether the tree is planted or if it is a recruit (naturally occurring in the plot)",
+ "measurement_date": "Measurement Date",
+ "planting_date": "Planting Date",
+ "species": "Species",
+ "height": "Height",
+ "width":"Width",
+ "diameter": "Diameter",
+ "tree_alive": "This tree is still alive",
+ "tag": "Tag",
+ "search_for_species": "Search for species",
+ "species_note": "Start searching for species on \nthe search input.",
+ "type_three_word": "Type at least 3 words for \n better result",
+ "save": "Save",
+ "no_obs": "No Observation to show",
+ "no_obs_note": "Tap the button bellow to add \nnew observation.",
+ "add_obs": "Add Observation",
+ "project": "Project",
+ "obs_date": "Observation Date",
+ "value": "Value",
+ "edit_name": "Edit Name",
+ "edit_plot": "Edit Plot Dimension",
+ "delete": "Delete",
+ "update_dimensions": "Update Dimensions",
+ "radius": "Radius",
+ "plot_length": "Plot Length",
+ "plot_width": "Plot Width",
+ "plot_width_note": "4 meters or more recommended",
+ "m_info_h1": "How do I set up a monitoring plot?",
+ "m_info_n1": "We recommend working in a team of two; one person to measure, one person to record in TreeMapper. Together it should take you about four hours per plot.\n\n Once set up, the plots have to be remeasured at the same time every year.\n\nIn seasonally dry forests, the ideal time to set up the plot is at the beginning of the wet season.\n.",
+ "m_info_h2": "What do I need for a standard 25m by 2m plot?\n",
+ "m_info_n2": "1. ca. 300 metal tree-tags (ca. €30)\n 2. 10 meters of 3mm wire\n3. Wire clippers\n4. Two 50m measuring tapes\n",
+ "m_info_h3": "How many plots do I need?\n",
+ "m_info_n3": "You should set up 5 plots plus 1 for every 5 hectares. A project restoring 10 ha would have 7 plots.\n\n",
+ "m_info_h4": "How do I choose the locations?\n",
+ "m_info_n4": "Plot locations need to be chosen at random, including plots near and at the edge of the site. But you do not need to worry about that, since TreeMapper suggests optimal plot locations.\n\n",
+ "m_info_h5": " What are control plots?\n",
+ "m_info_n5": "Control plots allow you to understand how your site would have developed if you had not planted trees. Therefore we purposefully keep a few sites 'unplanted', register them as control sites and measure what naturally grows there. About 5% of your monitoring plots should have a paired control plot.\n\nThis process is based on XYZ et al. 2022.",
+ "canopy_cover":"Canopy Cover",
+ "soil_moisture":"Soil Moisture",
+ "bioacoustics":"Bioacoustics",
+ "observations":"observations",
+ "last_updated":"last updated",
+ "intervention_plot":"intervention plot",
+ "control_plot":"control_plot",
+ "incomplete":"Incomplete",
+ "planted":"Planted",
+ "recruit":"Recruit",
+ "select_species":"Select Species",
+ "how_many_trees":"How many trees did you plant?",
+ "plant_tree_count":"Plant Tree Count",
+ "existing_count":"Existing Tree Count",
+ "name_of_tree":"Name of Tree Species",
+ "shrub_count":"Shrub count",
+ "stump_count":"Stump Count"
+}
\ No newline at end of file
diff --git a/src/locales/languages/fr/user/monitoringPlot.json b/src/locales/languages/fr/user/monitoringPlot.json
deleted file mode 100644
index 52b954144..000000000
--- a/src/locales/languages/fr/user/monitoringPlot.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "monitoring_plot_header": "Monitoring Plots",
- "plot_group": "Plot Group",
- "no_plots": "No Plots to Show Yet",
- "no_plots_note": "Start adding your monitoring plot to keep \ntrack of your progress",
- "plot_groups_header": "Plot Groups",
- "no_groups": "No Groups to Show",
- "no_groups_note": "Tap the below button \nto add Plot Group",
- "add_group": "Add Group",
- "add_plot":"Add Plot",
- "edit_group_header": "Edit Plot Group",
- "group_name": "Group Name",
- "create_group_header": "Add Plot Group",
- "create_group": "Create Group",
- "create_group_note": "Create Group and start \nadding plots",
- "empty_plots_note": "No plots to show \nTap the below button to add plots",
- "create_plot_header": "Create Plot",
- "coming_soon": "Coming Soon",
- "plot_complexity": "Plot Complexity",
- "standard": "Standard",
- "simple": "Simple",
- "plot_shape": "Plot Shape",
- "rectangular": "Rectangular",
- "circular": "Circular",
- "plot_type": "Plot Type",
- "control": "Control",
- "plot_name": "Plot Name",
- "plot_radius": "Plot Radius",
- "plot_radius_note": "25 meters or more recommended",
- "plot_wdith_note": "4 meters or more recommended",
- "plot_group_input": "Plot Group (Optional)",
- "center":"Plot Center",
- "plot_map_note_1": "Go to the center of the plot and insert a painted rebar post labeled ",
- "plot_map_note_2": "or another permanent labeled marking",
- "select_center":"Select center of Plot",
- "reset": "Reset",
- "create": "Create",
- "continue": "Continue",
- "plants": "Plants",
- "ecosystem": "Ecosystem",
- "map": "Map",
- "search": "Search",
- "add_plants":"Add Plants",
- "no_search":"No Search result found",
- "no_plants": "No Plants to Show Yet",
- "no_plant_note": "Tap the button below to add a new plant",
- "add_plant": "Add Plants",
- "tree_planted": "This tree was planted",
- "tree_planted_note": "Whether the tree is planted or if it is a recruit (naturally occurring in the plot)",
- "measurement_date": "Measurement Date",
- "planting_date": "Planting Date",
- "species": "Species",
- "height": "Height",
- "width":"Width",
- "diameter": "Diameter",
- "tree_alive": "This tree is still alive",
- "tag": "Tag",
- "search_for_species": "Search for species",
- "species_note": "Start searching for species on \nthe search input.",
- "type_three_word": "Type at least 3 words for \n better result",
- "save": "Save",
- "no_obs": "No Observation to show",
- "no_obs_note": "Tap the button bellow to add \nnew observation.",
- "add_obs": "Add Observation",
- "project": "Project",
- "obs_date": "Observation Date",
- "value": "Value",
- "edit_name": "Edit Name",
- "edit_plot": "Edit Plot Dimension",
- "delete": "Delete",
- "update_dimensions": "Update Dimensions",
- "radius": "Radius",
- "plot_length": "Plot Length",
- "plot_width": "Plot Width",
- "plot_width_note": "4 meters or more recommended",
- "m_info_h1": "How do I set up a monitoring plot?",
- "m_info_n1": "We recommend working in a team of two; one person to measure, one person to record in TreeMapper. Together it should take you about four hours per plot.\n\n Once set up, the plots have to be remeasured at the same time every year.\n\nIn seasonally dry forests, the ideal time to set up the plot is at the beginning of the wet season.\n.",
- "m_info_h2": "What do I need for a standard 25m by 2m plot?\n",
- "m_info_n2": "1. ca. 300 metal tree-tags (ca. €30)\n 2. 10 meters of 3mm wire\n3. Wire clippers\n4. Two 50m measuring tapes\n",
- "m_info_h3": "How many plots do I need?\n",
- "m_info_n3": "You should set up 5 plots plus 1 for every 5 hectares. A project restoring 10 ha would have 7 plots.\n\n",
- "m_info_h4": "How do I choose the locations?\n",
- "m_info_n4": "Plot locations need to be chosen at random, including plots near and at the edge of the site. But you do not need to worry about that, since TreeMapper suggests optimal plot locations.\n\n",
- "m_info_h5": " What are control plots?\n",
- "m_info_n5": "Control plots allow you to understand how your site would have developed if you had not planted trees. Therefore we purposefully keep a few sites 'unplanted', register them as control sites and measure what naturally grows there. About 5% of your monitoring plots should have a paired control plot.\n\nThis process is based on XYZ et al. 2022.",
- "canopy_cover":"Canopy Cover",
- "soil_moisture":"Soil Moisture",
- "bioacoustics":"Bioacoustics",
- "observations":"observations",
- "last_updated":"last updated",
- "intervention_plot":"intervention plot",
- "control_plot":"control_plot",
- "incomplete":"Incomplete",
- "planted":"Planted",
- "recruit":"Recruit",
- "select_species":"Select Species",
- "how_many_trees":"How many trees did you plant?",
- "plant_tree_count":"Plant Tree Count",
- "existing_count":"Existing Tree Count",
- "name_of_tree":"Name of Tree Species",
- "shrub_count":"Shrub count",
- "stump_count":"Stump Count"
-}
\ No newline at end of file
diff --git a/src/locales/languages/fr/user/other.json b/src/locales/languages/fr/user/other.json
new file mode 100644
index 000000000..f77dd9e80
--- /dev/null
+++ b/src/locales/languages/fr/user/other.json
@@ -0,0 +1,26 @@
+{
+ "map_credits":"map_credits",
+ "openstreet_contributors":"OpenStreetMap Contributors",
+ "species_caps":"Species ",
+ "please_drag_point":"Please select the point and drag",
+ "corner":"Corner",
+ "remove_from_list":" removed from list",
+ "added_to_favorites":"added to favorites",
+ "removed_from_favorites":"removed from favorites",
+ "agree_signup":"I agree that I may be contacted by the children and youth organization Plant-for-the-Planet as part of tree planting news and challenges.",
+ "agree_2":"I agree to have my name published in the Plant-for-the-Planet Website and App.",
+ "country_change":"Change Country",
+ "individual":"Individual",
+ "company":"Company",
+ "tree_organisation":"Tree Planting \nOrganisation",
+ "school":"School",
+ "acc_type":"Account Type",
+ "plot_coming_soon":"Monitoring Plots Coming Soon",
+ "plot_coming_soon_note":"You'll soon be able to monitor and \nmanage your plots with detailed insights.\nStay tuned!",
+ "delete_acc_header":"To continue with deletion \nPress Delete now.\n",
+ "click_agree":"By clicking 'Delete', I am requesting Plant-for-the-Planet to delete all data associated with my Plant-for-the-Planet account. Donation data may be kept for up to eight years. Trees I have registered will not be removed, however, will be anonymized and can't be claimed again.",
+ "delete_acc_imp_note":"Before proceeding, make sure you've cancelled all subscriptions.",
+ "delete_info_note_1":"I also understand that account deletion of",
+ "delete_info_note_2":" is irreversible.",
+ "delete_in":"You can Delete in "
+}
\ No newline at end of file
diff --git a/src/locales/languages/it/index.ts b/src/locales/languages/it/index.ts
index a69e257fa..d8fdff8d3 100644
--- a/src/locales/languages/it/index.ts
+++ b/src/locales/languages/it/index.ts
@@ -19,9 +19,9 @@ import SpeciesSyncError from './user/speciesSyncError.json';
import AdditionalData from './user/additionalData.json';
import Projects from './user/projects.json';
import Intervention from './user/intervention.json'
-import MonitoringPlot from './user/monitoringPlot.json'
import CommonStrings from './user/commonData.json'
-
+import Plots from './monitoringPlots/plots.json'
+import Other from './user/other.json'
export default {
...WelcomeScreen,
...SignUp,
@@ -44,6 +44,7 @@ export default {
...AdditionalData,
...Projects,
...Intervention,
- ...MonitoringPlot,
- ...CommonStrings
+ ...CommonStrings,
+ ...Plots,
+ ...Other
};
diff --git a/src/locales/languages/it/monitoringPlots/plots.json b/src/locales/languages/it/monitoringPlots/plots.json
new file mode 100644
index 000000000..8da3d326a
--- /dev/null
+++ b/src/locales/languages/it/monitoringPlots/plots.json
@@ -0,0 +1,103 @@
+{
+ "monitoring_plot_header": "Monitoring Plots",
+ "plot_group": "Plot Group",
+ "no_plots": "No Plots to Show Yet",
+ "no_plots_note": "Start adding your monitoring plot to keep \ntrack of your progress",
+ "plot_groups_header": "Plot Groups",
+ "no_groups": "No Groups to Show",
+ "no_groups_note": "Tap the below button \nto add Plot Group",
+ "add_group": "Add Group",
+ "add_plot":"Add Plot",
+ "edit_group_header": "Edit Plot Group",
+ "group_name": "Group Name",
+ "create_group_header": "Add Plot Group",
+ "create_group": "Create Group",
+ "create_group_note": "Create Group and start \nadding plots",
+ "empty_plots_note": "No plots to show \nTap the below button to add plots",
+ "create_plot_header": "Create Plot",
+ "coming_soon": "Coming Soon",
+ "plot_complexity": "Plot Complexity",
+ "standard": "Standard",
+ "simple": "Simple",
+ "plot_shape": "Plot Shape",
+ "rectangular": "Rectangular",
+ "circular": "Circular",
+ "plot_type": "Plot Type",
+ "control": "Control",
+ "plot_name": "Plot Name",
+ "plot_radius": "Plot Radius",
+ "plot_radius_note": "25 meters or more recommended",
+ "plot_wdith_note": "4 meters or more recommended",
+ "plot_group_input": "Plot Group (Optional)",
+ "center":"Plot Center",
+ "plot_map_note_1": "Go to the center of the plot and insert a painted rebar post labeled ",
+ "plot_map_note_2": "or another permanent labeled marking",
+ "select_center":"Select center of Plot",
+ "reset": "Reset",
+ "create": "Create",
+ "continue": "Continue",
+ "plants": "Plants",
+ "ecosystem": "Ecosystem",
+ "map": "Map",
+ "search": "Search",
+ "add_plants":"Add Plants",
+ "no_search":"No Search result found",
+ "no_plants": "No Plants to Show Yet",
+ "no_plant_note": "Tap the button below to add a new plant",
+ "add_plant": "Add Plants",
+ "tree_planted": "This tree was planted",
+ "tree_planted_note": "Whether the tree is planted or if it is a recruit (naturally occurring in the plot)",
+ "measurement_date": "Measurement Date",
+ "planting_date": "Planting Date",
+ "species": "Species",
+ "height": "Height",
+ "width":"Width",
+ "diameter": "Diameter",
+ "tree_alive": "This tree is still alive",
+ "tag": "Tag",
+ "search_for_species": "Search for species",
+ "species_note": "Start searching for species on \nthe search input.",
+ "type_three_word": "Type at least 3 words for \n better result",
+ "save": "Save",
+ "no_obs": "No Observation to show",
+ "no_obs_note": "Tap the button bellow to add \nnew observation.",
+ "add_obs": "Add Observation",
+ "project": "Project",
+ "obs_date": "Observation Date",
+ "value": "Value",
+ "edit_name": "Edit Name",
+ "edit_plot": "Edit Plot Dimension",
+ "delete": "Delete",
+ "update_dimensions": "Update Dimensions",
+ "radius": "Radius",
+ "plot_length": "Plot Length",
+ "plot_width": "Plot Width",
+ "plot_width_note": "4 meters or more recommended",
+ "m_info_h1": "How do I set up a monitoring plot?",
+ "m_info_n1": "We recommend working in a team of two; one person to measure, one person to record in TreeMapper. Together it should take you about four hours per plot.\n\n Once set up, the plots have to be remeasured at the same time every year.\n\nIn seasonally dry forests, the ideal time to set up the plot is at the beginning of the wet season.\n.",
+ "m_info_h2": "What do I need for a standard 25m by 2m plot?\n",
+ "m_info_n2": "1. ca. 300 metal tree-tags (ca. €30)\n 2. 10 meters of 3mm wire\n3. Wire clippers\n4. Two 50m measuring tapes\n",
+ "m_info_h3": "How many plots do I need?\n",
+ "m_info_n3": "You should set up 5 plots plus 1 for every 5 hectares. A project restoring 10 ha would have 7 plots.\n\n",
+ "m_info_h4": "How do I choose the locations?\n",
+ "m_info_n4": "Plot locations need to be chosen at random, including plots near and at the edge of the site. But you do not need to worry about that, since TreeMapper suggests optimal plot locations.\n\n",
+ "m_info_h5": " What are control plots?\n",
+ "m_info_n5": "Control plots allow you to understand how your site would have developed if you had not planted trees. Therefore we purposefully keep a few sites 'unplanted', register them as control sites and measure what naturally grows there. About 5% of your monitoring plots should have a paired control plot.\n\nThis process is based on XYZ et al. 2022.",
+ "canopy_cover":"Canopy Cover",
+ "soil_moisture":"Soil Moisture",
+ "bioacoustics":"Bioacoustics",
+ "observations":"observations",
+ "last_updated":"last updated",
+ "intervention_plot":"intervention plot",
+ "control_plot":"control_plot",
+ "incomplete":"Incomplete",
+ "planted":"Planted",
+ "recruit":"Recruit",
+ "select_species":"Select Species",
+ "how_many_trees":"How many trees did you plant?",
+ "plant_tree_count":"Plant Tree Count",
+ "existing_count":"Existing Tree Count",
+ "name_of_tree":"Name of Tree Species",
+ "shrub_count":"Shrub count",
+ "stump_count":"Stump Count"
+}
\ No newline at end of file
diff --git a/src/locales/languages/it/user/other.json b/src/locales/languages/it/user/other.json
new file mode 100644
index 000000000..f77dd9e80
--- /dev/null
+++ b/src/locales/languages/it/user/other.json
@@ -0,0 +1,26 @@
+{
+ "map_credits":"map_credits",
+ "openstreet_contributors":"OpenStreetMap Contributors",
+ "species_caps":"Species ",
+ "please_drag_point":"Please select the point and drag",
+ "corner":"Corner",
+ "remove_from_list":" removed from list",
+ "added_to_favorites":"added to favorites",
+ "removed_from_favorites":"removed from favorites",
+ "agree_signup":"I agree that I may be contacted by the children and youth organization Plant-for-the-Planet as part of tree planting news and challenges.",
+ "agree_2":"I agree to have my name published in the Plant-for-the-Planet Website and App.",
+ "country_change":"Change Country",
+ "individual":"Individual",
+ "company":"Company",
+ "tree_organisation":"Tree Planting \nOrganisation",
+ "school":"School",
+ "acc_type":"Account Type",
+ "plot_coming_soon":"Monitoring Plots Coming Soon",
+ "plot_coming_soon_note":"You'll soon be able to monitor and \nmanage your plots with detailed insights.\nStay tuned!",
+ "delete_acc_header":"To continue with deletion \nPress Delete now.\n",
+ "click_agree":"By clicking 'Delete', I am requesting Plant-for-the-Planet to delete all data associated with my Plant-for-the-Planet account. Donation data may be kept for up to eight years. Trees I have registered will not be removed, however, will be anonymized and can't be claimed again.",
+ "delete_acc_imp_note":"Before proceeding, make sure you've cancelled all subscriptions.",
+ "delete_info_note_1":"I also understand that account deletion of",
+ "delete_info_note_2":" is irreversible.",
+ "delete_in":"You can Delete in "
+}
\ No newline at end of file
diff --git a/src/locales/languages/pt-BR/index.ts b/src/locales/languages/pt-BR/index.ts
index a69e257fa..d8fdff8d3 100644
--- a/src/locales/languages/pt-BR/index.ts
+++ b/src/locales/languages/pt-BR/index.ts
@@ -19,9 +19,9 @@ import SpeciesSyncError from './user/speciesSyncError.json';
import AdditionalData from './user/additionalData.json';
import Projects from './user/projects.json';
import Intervention from './user/intervention.json'
-import MonitoringPlot from './user/monitoringPlot.json'
import CommonStrings from './user/commonData.json'
-
+import Plots from './monitoringPlots/plots.json'
+import Other from './user/other.json'
export default {
...WelcomeScreen,
...SignUp,
@@ -44,6 +44,7 @@ export default {
...AdditionalData,
...Projects,
...Intervention,
- ...MonitoringPlot,
- ...CommonStrings
+ ...CommonStrings,
+ ...Plots,
+ ...Other
};
diff --git a/src/locales/languages/pt-BR/monitoringPlots/plots.json b/src/locales/languages/pt-BR/monitoringPlots/plots.json
new file mode 100644
index 000000000..8da3d326a
--- /dev/null
+++ b/src/locales/languages/pt-BR/monitoringPlots/plots.json
@@ -0,0 +1,103 @@
+{
+ "monitoring_plot_header": "Monitoring Plots",
+ "plot_group": "Plot Group",
+ "no_plots": "No Plots to Show Yet",
+ "no_plots_note": "Start adding your monitoring plot to keep \ntrack of your progress",
+ "plot_groups_header": "Plot Groups",
+ "no_groups": "No Groups to Show",
+ "no_groups_note": "Tap the below button \nto add Plot Group",
+ "add_group": "Add Group",
+ "add_plot":"Add Plot",
+ "edit_group_header": "Edit Plot Group",
+ "group_name": "Group Name",
+ "create_group_header": "Add Plot Group",
+ "create_group": "Create Group",
+ "create_group_note": "Create Group and start \nadding plots",
+ "empty_plots_note": "No plots to show \nTap the below button to add plots",
+ "create_plot_header": "Create Plot",
+ "coming_soon": "Coming Soon",
+ "plot_complexity": "Plot Complexity",
+ "standard": "Standard",
+ "simple": "Simple",
+ "plot_shape": "Plot Shape",
+ "rectangular": "Rectangular",
+ "circular": "Circular",
+ "plot_type": "Plot Type",
+ "control": "Control",
+ "plot_name": "Plot Name",
+ "plot_radius": "Plot Radius",
+ "plot_radius_note": "25 meters or more recommended",
+ "plot_wdith_note": "4 meters or more recommended",
+ "plot_group_input": "Plot Group (Optional)",
+ "center":"Plot Center",
+ "plot_map_note_1": "Go to the center of the plot and insert a painted rebar post labeled ",
+ "plot_map_note_2": "or another permanent labeled marking",
+ "select_center":"Select center of Plot",
+ "reset": "Reset",
+ "create": "Create",
+ "continue": "Continue",
+ "plants": "Plants",
+ "ecosystem": "Ecosystem",
+ "map": "Map",
+ "search": "Search",
+ "add_plants":"Add Plants",
+ "no_search":"No Search result found",
+ "no_plants": "No Plants to Show Yet",
+ "no_plant_note": "Tap the button below to add a new plant",
+ "add_plant": "Add Plants",
+ "tree_planted": "This tree was planted",
+ "tree_planted_note": "Whether the tree is planted or if it is a recruit (naturally occurring in the plot)",
+ "measurement_date": "Measurement Date",
+ "planting_date": "Planting Date",
+ "species": "Species",
+ "height": "Height",
+ "width":"Width",
+ "diameter": "Diameter",
+ "tree_alive": "This tree is still alive",
+ "tag": "Tag",
+ "search_for_species": "Search for species",
+ "species_note": "Start searching for species on \nthe search input.",
+ "type_three_word": "Type at least 3 words for \n better result",
+ "save": "Save",
+ "no_obs": "No Observation to show",
+ "no_obs_note": "Tap the button bellow to add \nnew observation.",
+ "add_obs": "Add Observation",
+ "project": "Project",
+ "obs_date": "Observation Date",
+ "value": "Value",
+ "edit_name": "Edit Name",
+ "edit_plot": "Edit Plot Dimension",
+ "delete": "Delete",
+ "update_dimensions": "Update Dimensions",
+ "radius": "Radius",
+ "plot_length": "Plot Length",
+ "plot_width": "Plot Width",
+ "plot_width_note": "4 meters or more recommended",
+ "m_info_h1": "How do I set up a monitoring plot?",
+ "m_info_n1": "We recommend working in a team of two; one person to measure, one person to record in TreeMapper. Together it should take you about four hours per plot.\n\n Once set up, the plots have to be remeasured at the same time every year.\n\nIn seasonally dry forests, the ideal time to set up the plot is at the beginning of the wet season.\n.",
+ "m_info_h2": "What do I need for a standard 25m by 2m plot?\n",
+ "m_info_n2": "1. ca. 300 metal tree-tags (ca. €30)\n 2. 10 meters of 3mm wire\n3. Wire clippers\n4. Two 50m measuring tapes\n",
+ "m_info_h3": "How many plots do I need?\n",
+ "m_info_n3": "You should set up 5 plots plus 1 for every 5 hectares. A project restoring 10 ha would have 7 plots.\n\n",
+ "m_info_h4": "How do I choose the locations?\n",
+ "m_info_n4": "Plot locations need to be chosen at random, including plots near and at the edge of the site. But you do not need to worry about that, since TreeMapper suggests optimal plot locations.\n\n",
+ "m_info_h5": " What are control plots?\n",
+ "m_info_n5": "Control plots allow you to understand how your site would have developed if you had not planted trees. Therefore we purposefully keep a few sites 'unplanted', register them as control sites and measure what naturally grows there. About 5% of your monitoring plots should have a paired control plot.\n\nThis process is based on XYZ et al. 2022.",
+ "canopy_cover":"Canopy Cover",
+ "soil_moisture":"Soil Moisture",
+ "bioacoustics":"Bioacoustics",
+ "observations":"observations",
+ "last_updated":"last updated",
+ "intervention_plot":"intervention plot",
+ "control_plot":"control_plot",
+ "incomplete":"Incomplete",
+ "planted":"Planted",
+ "recruit":"Recruit",
+ "select_species":"Select Species",
+ "how_many_trees":"How many trees did you plant?",
+ "plant_tree_count":"Plant Tree Count",
+ "existing_count":"Existing Tree Count",
+ "name_of_tree":"Name of Tree Species",
+ "shrub_count":"Shrub count",
+ "stump_count":"Stump Count"
+}
\ No newline at end of file
diff --git a/src/locales/languages/pt-BR/user/monitoringPlot.json b/src/locales/languages/pt-BR/user/monitoringPlot.json
deleted file mode 100644
index 52b954144..000000000
--- a/src/locales/languages/pt-BR/user/monitoringPlot.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "monitoring_plot_header": "Monitoring Plots",
- "plot_group": "Plot Group",
- "no_plots": "No Plots to Show Yet",
- "no_plots_note": "Start adding your monitoring plot to keep \ntrack of your progress",
- "plot_groups_header": "Plot Groups",
- "no_groups": "No Groups to Show",
- "no_groups_note": "Tap the below button \nto add Plot Group",
- "add_group": "Add Group",
- "add_plot":"Add Plot",
- "edit_group_header": "Edit Plot Group",
- "group_name": "Group Name",
- "create_group_header": "Add Plot Group",
- "create_group": "Create Group",
- "create_group_note": "Create Group and start \nadding plots",
- "empty_plots_note": "No plots to show \nTap the below button to add plots",
- "create_plot_header": "Create Plot",
- "coming_soon": "Coming Soon",
- "plot_complexity": "Plot Complexity",
- "standard": "Standard",
- "simple": "Simple",
- "plot_shape": "Plot Shape",
- "rectangular": "Rectangular",
- "circular": "Circular",
- "plot_type": "Plot Type",
- "control": "Control",
- "plot_name": "Plot Name",
- "plot_radius": "Plot Radius",
- "plot_radius_note": "25 meters or more recommended",
- "plot_wdith_note": "4 meters or more recommended",
- "plot_group_input": "Plot Group (Optional)",
- "center":"Plot Center",
- "plot_map_note_1": "Go to the center of the plot and insert a painted rebar post labeled ",
- "plot_map_note_2": "or another permanent labeled marking",
- "select_center":"Select center of Plot",
- "reset": "Reset",
- "create": "Create",
- "continue": "Continue",
- "plants": "Plants",
- "ecosystem": "Ecosystem",
- "map": "Map",
- "search": "Search",
- "add_plants":"Add Plants",
- "no_search":"No Search result found",
- "no_plants": "No Plants to Show Yet",
- "no_plant_note": "Tap the button below to add a new plant",
- "add_plant": "Add Plants",
- "tree_planted": "This tree was planted",
- "tree_planted_note": "Whether the tree is planted or if it is a recruit (naturally occurring in the plot)",
- "measurement_date": "Measurement Date",
- "planting_date": "Planting Date",
- "species": "Species",
- "height": "Height",
- "width":"Width",
- "diameter": "Diameter",
- "tree_alive": "This tree is still alive",
- "tag": "Tag",
- "search_for_species": "Search for species",
- "species_note": "Start searching for species on \nthe search input.",
- "type_three_word": "Type at least 3 words for \n better result",
- "save": "Save",
- "no_obs": "No Observation to show",
- "no_obs_note": "Tap the button bellow to add \nnew observation.",
- "add_obs": "Add Observation",
- "project": "Project",
- "obs_date": "Observation Date",
- "value": "Value",
- "edit_name": "Edit Name",
- "edit_plot": "Edit Plot Dimension",
- "delete": "Delete",
- "update_dimensions": "Update Dimensions",
- "radius": "Radius",
- "plot_length": "Plot Length",
- "plot_width": "Plot Width",
- "plot_width_note": "4 meters or more recommended",
- "m_info_h1": "How do I set up a monitoring plot?",
- "m_info_n1": "We recommend working in a team of two; one person to measure, one person to record in TreeMapper. Together it should take you about four hours per plot.\n\n Once set up, the plots have to be remeasured at the same time every year.\n\nIn seasonally dry forests, the ideal time to set up the plot is at the beginning of the wet season.\n.",
- "m_info_h2": "What do I need for a standard 25m by 2m plot?\n",
- "m_info_n2": "1. ca. 300 metal tree-tags (ca. €30)\n 2. 10 meters of 3mm wire\n3. Wire clippers\n4. Two 50m measuring tapes\n",
- "m_info_h3": "How many plots do I need?\n",
- "m_info_n3": "You should set up 5 plots plus 1 for every 5 hectares. A project restoring 10 ha would have 7 plots.\n\n",
- "m_info_h4": "How do I choose the locations?\n",
- "m_info_n4": "Plot locations need to be chosen at random, including plots near and at the edge of the site. But you do not need to worry about that, since TreeMapper suggests optimal plot locations.\n\n",
- "m_info_h5": " What are control plots?\n",
- "m_info_n5": "Control plots allow you to understand how your site would have developed if you had not planted trees. Therefore we purposefully keep a few sites 'unplanted', register them as control sites and measure what naturally grows there. About 5% of your monitoring plots should have a paired control plot.\n\nThis process is based on XYZ et al. 2022.",
- "canopy_cover":"Canopy Cover",
- "soil_moisture":"Soil Moisture",
- "bioacoustics":"Bioacoustics",
- "observations":"observations",
- "last_updated":"last updated",
- "intervention_plot":"intervention plot",
- "control_plot":"control_plot",
- "incomplete":"Incomplete",
- "planted":"Planted",
- "recruit":"Recruit",
- "select_species":"Select Species",
- "how_many_trees":"How many trees did you plant?",
- "plant_tree_count":"Plant Tree Count",
- "existing_count":"Existing Tree Count",
- "name_of_tree":"Name of Tree Species",
- "shrub_count":"Shrub count",
- "stump_count":"Stump Count"
-}
\ No newline at end of file
diff --git a/src/locales/languages/pt-BR/user/other.json b/src/locales/languages/pt-BR/user/other.json
new file mode 100644
index 000000000..f77dd9e80
--- /dev/null
+++ b/src/locales/languages/pt-BR/user/other.json
@@ -0,0 +1,26 @@
+{
+ "map_credits":"map_credits",
+ "openstreet_contributors":"OpenStreetMap Contributors",
+ "species_caps":"Species ",
+ "please_drag_point":"Please select the point and drag",
+ "corner":"Corner",
+ "remove_from_list":" removed from list",
+ "added_to_favorites":"added to favorites",
+ "removed_from_favorites":"removed from favorites",
+ "agree_signup":"I agree that I may be contacted by the children and youth organization Plant-for-the-Planet as part of tree planting news and challenges.",
+ "agree_2":"I agree to have my name published in the Plant-for-the-Planet Website and App.",
+ "country_change":"Change Country",
+ "individual":"Individual",
+ "company":"Company",
+ "tree_organisation":"Tree Planting \nOrganisation",
+ "school":"School",
+ "acc_type":"Account Type",
+ "plot_coming_soon":"Monitoring Plots Coming Soon",
+ "plot_coming_soon_note":"You'll soon be able to monitor and \nmanage your plots with detailed insights.\nStay tuned!",
+ "delete_acc_header":"To continue with deletion \nPress Delete now.\n",
+ "click_agree":"By clicking 'Delete', I am requesting Plant-for-the-Planet to delete all data associated with my Plant-for-the-Planet account. Donation data may be kept for up to eight years. Trees I have registered will not be removed, however, will be anonymized and can't be claimed again.",
+ "delete_acc_imp_note":"Before proceeding, make sure you've cancelled all subscriptions.",
+ "delete_info_note_1":"I also understand that account deletion of",
+ "delete_info_note_2":" is irreversible.",
+ "delete_in":"You can Delete in "
+}
\ No newline at end of file
diff --git a/src/screens/AddMeasurementView.tsx b/src/screens/AddMeasurementView.tsx
index 0f7ab4160..d4c1a4f84 100644
--- a/src/screens/AddMeasurementView.tsx
+++ b/src/screens/AddMeasurementView.tsx
@@ -66,7 +66,8 @@ const AddMeasurement = () => {
const handleHeightChange = (text: string) => {
setHeightErrorMessage('');
const regex = /^(?!0*(\.0+)?$)(\d+(\.\d+)?|\.\d+)$/;
- const isValid = regex.test(text)
+ const finalText = text.replace(/,/g, '.');
+ const isValid = regex.test(finalText)
// Ensure there is at most one decimal point
if (isValid) {
setHeight(text);
@@ -84,7 +85,8 @@ const AddMeasurement = () => {
const handleDiameterChange = (text: string) => {
setWidthErrorMessage('');
const regex = /^(?!0*(\.0+)?$)(\d+(\.\d+)?|\.\d+)$/;
- const isValid = regex.test(text)
+ const finalText = text.replace(/,/g, '.');
+ const isValid = regex.test(finalText)
if (isValid) {
setWidth(text);
} else {
@@ -97,7 +99,9 @@ const AddMeasurement = () => {
const onSubmit = () => {
- const validationObject = measurementValidation(height, width, isNonISUCountry);
+ const updatedHeight = height.replace(/,/g, '.');
+ const updatedWidth = width.replace(/,/g, '.');
+ const validationObject = measurementValidation(updatedHeight, updatedWidth, isNonISUCountry);
const { diameterErrorMessage, heightErrorMessage, isRatioCorrect } = validationObject;
setHeightErrorMessage(heightErrorMessage)
setWidthErrorMessage(diameterErrorMessage)
@@ -141,6 +145,8 @@ const AddMeasurement = () => {
}
const submitDetails = async () => {
+ const updatedHeight = height.replace(/,/g, '.');
+ const updatedWidth = width.replace(/,/g, '.');
const { lat, long, accuracy } = getUserLocation()
const treeDetails: SampleTree = {
tree_id: id,
@@ -156,11 +162,11 @@ const AddMeasurement = () => {
cdn_image_url: '',
specie_name: SampleTreeData.current_species.scientificName,
specie_diameter: getConvertedDiameter(
- width,
+ updatedWidth,
isNonISUCountry
),
specie_height: getConvertedHeight(
- height,
+ updatedHeight,
isNonISUCountry
),
tag_id: tagId,
diff --git a/src/screens/DeleteAccount.tsx b/src/screens/DeleteAccount.tsx
index d7103e1eb..1e09f5c3e 100644
--- a/src/screens/DeleteAccount.tsx
+++ b/src/screens/DeleteAccount.tsx
@@ -20,6 +20,8 @@ import { useNavigation } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
import { RootStackParamList } from 'src/types/type/navigation.type'
import openWebView from 'src/utils/helpers/appHelper/openWebView'
+import i18next from 'src/locales/index'
+
const DeleteAccount = () => {
const { email, name } = useSelector((state: RootState) => state.userState)
@@ -89,21 +91,21 @@ const DeleteAccount = () => {
- To continue with deletion {'\n'}Press Delete now.{'\n'}
+ {i18next.t("label.delete_acc_header")}
- By clicking "Delete", I am requesting Plant-for-the-Planet to delete all data associated with my Plant-for-the-Planet account. Donation data may be kept for up to eight years. Trees I have registered will not be removed, however, will be anonymized and can't be claimed again.
+ {i18next.t("label.click_agree")}
- Before proceeding, make sure you've cancelled all subscriptions.
+ {i18next.t('label.delete_acc_imp_note')}
{'\n'}
- I also understand that account deletion of {email || name} is irreversible.
+ {i18next.t("label.delete_info_note_1")} {email || name} {i18next.t("label.delete_info_note_2")}
0 ?
- You can Delete in {timer} seconds
+ {i18next.t("label.delete_in")} {timer} seconds
: "Delete Now"}
containerStyle={styles.btnContainer}
pressHandler={handleDelete}
diff --git a/src/screens/InterventionFormView.tsx b/src/screens/InterventionFormView.tsx
index 9febd6aab..84d9c342b 100644
--- a/src/screens/InterventionFormView.tsx
+++ b/src/screens/InterventionFormView.tsx
@@ -133,7 +133,7 @@ const InterventionFormView = () => {
const site = ProjectData.sites.find(el => el.id === sid);
if (!site?.geometry) return; // Using optional chaining here
const parsedGeometry = JSON.parse(site.geometry);
- const newCoords = getRandomPointInPolygon(parsedGeometry.coordinates[0], 1);
+ const newCoords = getRandomPointInPolygon(parsedGeometry.coordinates[0]);
updateBounds(newCoords);
}
} catch (error) {
@@ -273,7 +273,7 @@ const InterventionFormView = () => {
el => el.id === registerForm.site_id,
)
const parsedGeometry = JSON.parse(currentSiteData[0].geometry)
- const newCoords = getRandomPointInPolygon(parsedGeometry.coordinates[0], 1)
+ const newCoords = getRandomPointInPolygon(parsedGeometry.coordinates[0])
return [newCoords]
}
@@ -314,10 +314,30 @@ const InterventionFormView = () => {
const constructMetaData = (locationName: string, furtherInfo: string) => {
const metaData = {};
if (locationName && locationName.length > 0) {
- metaData["Location Name"] = locationName;
+ metaData["location-name"] = {
+ "key": "location-name",
+ "originalKey":"location-name",
+ "value":locationName,
+ "label":"Location Name",
+ "type":"input",
+ "unit":"",
+ "visibility":"public",
+ "dataType":"string",
+ "elementType":"metaData"
+ };
}
if (furtherInfo && furtherInfo.length > 0) {
- metaData["Info"] = furtherInfo
+ metaData["more-info"] = {
+ "key": "more-info",
+ "originalKey":"more-info",
+ "value":furtherInfo,
+ "label":"More Info",
+ "type":"input",
+ "unit":"",
+ "visibility":"public",
+ "dataType":"string",
+ "elementType":"metaData"
+ };
}
return metaData;
};
diff --git a/src/screens/InterventionPreviewView.tsx b/src/screens/InterventionPreviewView.tsx
index 86034ad00..a1159ee3e 100644
--- a/src/screens/InterventionPreviewView.tsx
+++ b/src/screens/InterventionPreviewView.tsx
@@ -1,4 +1,4 @@
-import { ActivityIndicator, ScrollView, StyleSheet, Text, View , TouchableOpacity} from 'react-native'
+import { ActivityIndicator, ScrollView, StyleSheet, Text, View, TouchableOpacity } from 'react-native'
import React, { useEffect, useRef, useState } from 'react'
import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
@@ -17,6 +17,7 @@ import {
} from 'src/utils/helpers/interventionFormHelper'
import useInterventionManagement from 'src/hooks/realm/useInterventionManagement'
import { Colors, Typography } from 'src/utils/constants'
+import PenIcon from 'assets/images/svg/PenIcon.svg'
import SampleTreePreviewList from 'src/components/previewIntervention/SampleTreePreviewList'
import bbox from '@turf/bbox'
import { updateMapBounds } from 'src/store/slice/mapBoundSlice'
@@ -35,6 +36,7 @@ import i18next from 'i18next'
import { useToast } from 'react-native-toast-notifications'
import { getDeviceDetails } from 'src/utils/helpers/appHelper/getAdditionalData'
import InterventionMetaData from 'src/components/previewIntervention/InterventionMetaData'
+import DeleteModal from 'src/components/common/DeleteModal'
const InterventionPreviewView = () => {
const navigation = useNavigation>()
@@ -45,6 +47,7 @@ const InterventionPreviewView = () => {
const realm = useRealm()
const route = useRoute>()
const interventionID = route.params?.interventionId ?? "";
+ const [editModal, setEditModal] = useState(null)
const [highlightedTree, setHighlightedTree] = useState('')
@@ -52,12 +55,28 @@ const InterventionPreviewView = () => {
const InterventionData = useObject(
RealmSchema.Intervention, interventionID
)
- const { saveIntervention, updateInterventionMetaData } = useInterventionManagement()
+ const { saveIntervention, updateInterventionMetaData, resetIntervention } = useInterventionManagement()
const dispatch = useDispatch()
const scrollViewRef = useRef(null); // Reference for the ScrollView
const childRefs = useRef([]);
+ const handleEdit = async (item: InterventionData) => {
+ setEditModal(null)
+ await resetIntervention(item.intervention_id)
+ dispatch(updateNewIntervention())
+ }
+
+ const closeAllModals = () => {
+ setEditModal(null)
+ }
+
+
+ const openEditModal = (item: InterventionData) => {
+ const obj = JSON.parse(JSON.stringify(item))
+ setEditModal(obj)
+ }
+
useEffect(() => {
setLoading(false)
checkIsTree()
@@ -73,6 +92,9 @@ const InterventionPreviewView = () => {
toast.show("Project not assign")
}
}
+ function formatString(str) {
+ return str.toLowerCase().replace(/\s+/g, '-');
+ }
const setupMetaData = async () => {
const localMeta = realm.objects(RealmSchema.Metadata)
@@ -81,10 +103,36 @@ const InterventionPreviewView = () => {
if (localMeta?.length) {
localMeta.forEach(el => {
if (el.accessType === 'private') {
- updatedMetadata.private = { ...updatedMetadata.private, [el.key]: el.value }
+ const privateKey = formatString(el.key)
+ updatedMetadata.private = {
+ ...updatedMetadata.private, [privateKey]: {
+ "key":privateKey,
+ "originalKey": privateKey,
+ "value": el.value,
+ "label": el.key,
+ "type": "input",
+ "unit": "",
+ "visibility": "private",
+ "dataType": "string",
+ "elementType": "metaData"
+ }
+ }
}
if (el.accessType === 'public') {
- updatedMetadata.public = { ...updatedMetadata.public, [el.key]: el.value }
+ const publicKey = formatString(el.key)
+ updatedMetadata.public = {
+ ...updatedMetadata.public, [publicKey]: {
+ "key": publicKey,
+ "originalKey": publicKey,
+ "value": el.value,
+ "label": el.key,
+ "type": "input",
+ "unit": "",
+ "visibility": "public",
+ "dataType": "string",
+ "elementType": "metaData"
+ }
+ }
}
})
}
@@ -187,12 +235,24 @@ const InterventionPreviewView = () => {
const renderRightContainer = () => {
+ if (InterventionData.is_complete && InterventionData.status === 'PENDING_DATA_UPLOAD') {
+ return (
+
+ { openEditModal(InterventionData) }}>
+ Edit
+
+
+
+ )
+ }
+
if (InterventionData.is_complete && InterventionData.status !== 'SYNCED') {
return
Sync Now
}
+
if (InterventionData.status === 'SYNCED') {
return
@@ -205,6 +265,7 @@ const InterventionPreviewView = () => {
return (
+
@@ -224,7 +285,7 @@ const InterventionPreviewView = () => {
passRefs={(ref, index) => (childRefs.current[index] = ref)}
/>
)}
- {InterventionData.meta_data !== '{}' && }
+ {InterventionData.meta_data !== '{}' && }
{InterventionData.status !== 'SYNCED' && {i18next.t("label.collected_using")}{InterventionData.is_legacy ? '1.0.8' : Application.nativeApplicationVersion}}
@@ -286,8 +347,25 @@ const styles = StyleSheet.create({
justifyContent: 'center',
alignItems: 'center',
flexDirection: 'row',
- backgroundColor: Colors.NEW_PRIMARY + '1A',
- marginRight: '5%',
- borderRadius: 10
+ borderRadius: 10,
+ marginRight: '5%'
+ },
+ editWrapper: {
+ height: 50,
+ justifyContent: 'center',
+ alignItems: 'center',
+ flexDirection: 'row',
+ borderRadius: 10,
+ paddingLeft: 20,
+ backgroundColor: Colors.BACKDROP_COLOR
+ },
+ editText: {
+ fontFamily: Typography.FONT_FAMILY_SEMI_BOLD,
+ fontSize: 20,
+ color: Colors.TEXT_COLOR
},
+ rightWrapper: {
+ flexDirection: 'row',
+ marginRight: '5%'
+ }
})
diff --git a/src/screens/PlotView.tsx b/src/screens/PlotView.tsx
index bd43d3378..574caea8b 100644
--- a/src/screens/PlotView.tsx
+++ b/src/screens/PlotView.tsx
@@ -12,8 +12,8 @@ const PlotView = () => {
- Monitoring Plots Coming Soon
- You'll soon be able to monitor and {'\n'}manage your plots with detailed insights.{'\n'}Stay tuned!
+ {i18next.t('label.plot_coming_soon')}
+ {i18next.t('label.plot_coming_soon_note')}
)
diff --git a/src/screens/ReviewTreeDetails.tsx b/src/screens/ReviewTreeDetails.tsx
index 5215c3a2e..32c8f75d4 100644
--- a/src/screens/ReviewTreeDetails.tsx
+++ b/src/screens/ReviewTreeDetails.tsx
@@ -162,11 +162,12 @@ const ReviewTreeDetails = () => {
let hasError = false;
const handleHeightValidation = () => {
+ const updatedHeight = openEditModal.value.replace(/,/g, '.');
const regex = /^(?!0*(\.0+)?$)(\d+(\.\d+)?|\.\d+)$/;
- const isValid = regex.test(openEditModal.value)
+ const isValid = regex.test(updatedHeight)
if (isValid) {
const validationObject = measurementValidation(
- openEditModal.value,
+ updatedHeight,
treeDetails.specie_diameter,
isNonISUCountry,
);
@@ -179,7 +180,7 @@ const ReviewTreeDetails = () => {
hasError = true
} else {
finalDetails.specie_height = getConvertedHeight(
- Number(openEditModal.value),
+ Number(updatedHeight),
isNonISUCountry
)
}
@@ -192,12 +193,13 @@ const ReviewTreeDetails = () => {
};
const handleDiameterValidation = () => {
+ const updatedWidth = openEditModal.value.replace(/,/g, '.');
const regex = /^(?!0*(\.0+)?$)(\d+(\.\d+)?|\.\d+)$/;
- const isValid = regex.test(openEditModal.value)
+ const isValid = regex.test(updatedWidth)
if (isValid) {
const validationObject = measurementValidation(
treeDetails.specie_height,
- openEditModal.value,
+ updatedWidth,
isNonISUCountry,
);
setInputErrorMessage(validationObject.diameterErrorMessage);
@@ -209,7 +211,7 @@ const ReviewTreeDetails = () => {
hasError = true
} else {
finalDetails.specie_diameter = getConvertedDiameter(
- Number(openEditModal.value),
+ Number(updatedWidth),
isNonISUCountry
)
}
diff --git a/src/screens/SignUpView.tsx b/src/screens/SignUpView.tsx
index fb75602a0..9de47241f 100644
--- a/src/screens/SignUpView.tsx
+++ b/src/screens/SignUpView.tsx
@@ -1,4 +1,4 @@
-import { ScrollView, StyleSheet, Text, TextInput, View, Switch, TouchableOpacity, Image } from 'react-native'
+import { ScrollView, StyleSheet, Text, TextInput, View, Switch, TouchableOpacity } from 'react-native'
import React, { useEffect, useState } from 'react'
import { Colors, Typography } from 'src/utils/constants'
import Header from 'src/components/common/Header'
@@ -7,7 +7,6 @@ import CtaArrow from 'assets/images/svg/CtaArrow.svg'
import { AvoidSoftInput, AvoidSoftInputView } from 'react-native-avoid-softinput'
import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
-import i18next from 'i18next'
import Snackbar from 'react-native-snackbar'
import { RootStackParamList } from 'src/types/type/navigation.type'
import { handleFilter } from 'src/utils/constants/CountryDataFilter'
@@ -26,6 +25,8 @@ import useAuthentication from 'src/hooks/useAuthentication'
import useLogManagement from 'src/hooks/realm/useLogManagement'
import { useToast } from 'react-native-toast-notifications'
import { RootState } from 'src/store'
+import i18next from 'i18next'
+import * as ExpoImage from 'expo-image';
@@ -309,21 +310,21 @@ const SignUpView = () => {
style={styles.mainContainer}
>
- Account Type
+ {i18next.t("label.acc_type")}
setAccountType('individual')}>
- Individual
+ {i18next.t("label.individual")}
setAccountType('company')}>
- Company
-
+ {i18next.t("label.company")}
+
setAccountType('tpo')}>
- Tree Planting {'\n'}Organisation
+ {i18next.t("label.tree_organisation")}
setAccountType('education')}>
- School
+ {i18next.t("label.school")}
{
Country
{ setModalVisible(!modalVisible) }}>
{!!country?.countryCode &&
-
}
{country.countryCode ? country.countryName : "Select Country"}
- Change country
+ {i18next.t("label.country_change")}
{accountType === 'company' || accountType === 'tpo' || accountType === 'education' ? (
@@ -406,7 +407,7 @@ const SignUpView = () => {
) : null}
- I agree to have my name published in the Plant-for-the-Planet Website and App.
+ {i18next.t("label.agree_2")}
{
- I agree that I may be contacted by the children and youth organization Plant-for-the-Planet as part of tree planting news and challenges.
+ {i18next.t("label.agree_signup")}
{
updateUserFavSpecies(item.guid, status)
toast.hideAll();
if (status) {
- toast.show("{item.scientificName}" added to favorites, { style: { backgroundColor: Colors.GRAY_LIGHT }, textStyle: { textAlign: 'center' } })
+ toast.show("{item.scientificName}" {i18next.t("label.added_to_favorites")}, { style: { backgroundColor: Colors.GRAY_LIGHT }, textStyle: { textAlign: 'center' } })
} else {
- toast.show("{item.scientificName}" removed from favorites, { style: { backgroundColor: Colors.GRAY_LIGHT }, textStyle: { textAlign: 'center' } })
+ toast.show("{item.scientificName}" {i18next.t("label.removed_from_favorites")}, { style: { backgroundColor: Colors.GRAY_LIGHT }, textStyle: { textAlign: 'center' } })
}
}
diff --git a/src/screens/TotalTreesView.tsx b/src/screens/TotalTreesView.tsx
index a6a6a1240..a222cf569 100644
--- a/src/screens/TotalTreesView.tsx
+++ b/src/screens/TotalTreesView.tsx
@@ -121,7 +121,7 @@ const TotalTreesView = () => {
toast.show("Error occurred while removing species")
errorHaptic()
} else {
- toast.show("{item.scientificName}" removed from list, { style: { backgroundColor: Colors.GRAY_LIGHT }, textStyle: { textAlign: 'center' } })
+ toast.show("{item.scientificName}" {i18next.t("label.remove_from_list")}, { style: { backgroundColor: Colors.GRAY_LIGHT }, textStyle: { textAlign: 'center' } })
}
}
diff --git a/src/screens/TreeRemeasurementView.tsx b/src/screens/TreeRemeasurementView.tsx
index d15e64376..c96983b3c 100644
--- a/src/screens/TreeRemeasurementView.tsx
+++ b/src/screens/TreeRemeasurementView.tsx
@@ -1,4 +1,4 @@
-import { Image, ScrollView, StyleSheet, TouchableOpacity, View } from 'react-native'
+import {ScrollView, StyleSheet, TouchableOpacity, View } from 'react-native'
import React, { useEffect, useState } from 'react'
import { SafeAreaView } from 'react-native-safe-area-context'
import { Colors, Typography } from 'src/utils/constants'
@@ -33,7 +33,7 @@ import DeleteModal from 'src/components/common/DeleteModal'
import getUserLocation from 'src/utils/helpers/getUserLocation'
import { point } from '@turf/helpers';
import distance from '@turf/distance';
-
+import * as ExpoImage from 'expo-image'
const PredefineReasons: Array<{
label: string
@@ -134,6 +134,8 @@ const TreeRemeasurementView = () => {
const handleSkip = async () => {
setShowSkipModal(false)
+ const updatedHeight = height.replace(/,/g, '.');
+ const updatedWidth = width.replace(/,/g, '.');
const { lat, long } = getUserLocation()
const isWithin20m = isWithinRange(lat, long, treeDetails.latitude, treeDetails.longitude)
const param: History = {
@@ -143,11 +145,11 @@ const TreeRemeasurementView = () => {
imageUrl: imageUri,
cdnImageUrl: '',
diameter: isAlive ? getConvertedDiameter(
- width,
+ updatedWidth,
isNonISUCountry,
) : treeDetails.specie_diameter,
height: isAlive ? getConvertedHeight(
- height,
+ updatedHeight,
isNonISUCountry,
) : treeDetails.specie_height,
appMetadata: '',
@@ -193,11 +195,12 @@ const TreeRemeasurementView = () => {
const handleHeightChange = (text: string) => {
setHeightErrorMessage('');
const regex = /^(?!0*(\.0+)?$)(\d+(\.\d+)?|\.\d+)$/;
- const isValid = regex.test(text)
+ const updatedHeight = text.replace(/,/g, '.');
+ const isValid = regex.test(updatedHeight)
// Ensure there is at most one decimal point
if (isValid) {
setHeight(text);
- const convertedHeight = height ? getConvertedHeight(text, isNonISUCountry) : 0;
+ const convertedHeight = height ? getConvertedHeight(updatedHeight, isNonISUCountry) : 0;
if (convertedHeight < DBHInMeter) {
setDiameterLabel(i18next.t('label.measurement_basal_diameter'));
} else {
@@ -211,9 +214,10 @@ const TreeRemeasurementView = () => {
const handleDiameterChange = (text: string) => {
setWidthErrorMessage('');
const regex = /^(?!0*(\.0+)?$)(\d+(\.\d+)?|\.\d+)$/;
- const isValid = regex.test(text)
+ const updatedWidth = text.replace(/,/g, '.');
+ const isValid = regex.test(updatedWidth)
if (isValid) {
- setWidth(text);
+ setWidth(updatedWidth);
} else {
setWidthErrorMessage('Please provide the correct diameter.')
}
@@ -273,8 +277,11 @@ const TreeRemeasurementView = () => {
}
const submitHandler = async (gpsValidated?: boolean) => {
- const finalHeight = height || treeDetails.specie_height
- const finalWidth = width || treeDetails.specie_diameter
+ const updatedHeight = height.replace(/,/g, '.');
+ const updatedWidth = width.replace(/,/g, '.');
+
+ const finalHeight = updatedHeight || treeDetails.specie_height
+ const finalWidth = updatedWidth || treeDetails.specie_diameter
const { lat, long } = getUserLocation()
const isWithin20m = isWithinRange(lat, long, treeDetails.latitude, treeDetails.longitude)
@@ -390,7 +397,7 @@ const TreeRemeasurementView = () => {
/>
{isAlive ? <>
{!!imageUri &&
- {
+export const getRandomPointInPolygon = (polygon) => {
// Calculate the bounding box of the polygon
const bounds = polygon.reduce(
(prev, curr) => {
@@ -23,45 +20,39 @@ export const getRandomPointInPolygon = (polygon, index) => {
{ minLon: Infinity, maxLon: -Infinity, minLat: Infinity, maxLat: -Infinity }
);
- // Create a seed based on the polygon's coordinates and the index
- const seed = JSON.stringify(polygon) + index;
- const rng = seedrandom(seed);
-
- // Generate a random point within the bounding box
- let randomPoint;
- let isInPolygon = false;
- while (!isInPolygon) {
- const lon = bounds.minLon + rng() * (bounds.maxLon - bounds.minLon);
- const lat = bounds.minLat + rng() * (bounds.maxLat - bounds.minLat);
- randomPoint = [lon, lat];
-
- // Check if the random point is within the polygon
- isInPolygon = isPointInPolygon(randomPoint, polygon);
+ // Helper function to check if a point is inside the polygon
+ const isPointInPolygon = (point, polygon) => {
+ let inside = false;
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
+ const xi = polygon[i][0], yi = polygon[i][1];
+ const xj = polygon[j][0], yj = polygon[j][1];
+
+ const intersect = ((yi > point[1]) !== (yj > point[1]))
+ && (point[0] < (xj - xi) * (point[1] - yi) / (yj - yi) + xi);
+ if (intersect) inside = !inside;
+ }
+ return inside;
+ };
+
+ // Generate random points until we find one inside the polygon
+ let attempts = 0;
+ const maxAttempts = 1000; // Prevent infinite loop
+
+ while (attempts < maxAttempts) {
+ const randomLon = bounds.minLon + Math.random() * (bounds.maxLon - bounds.minLon);
+ const randomLat = bounds.minLat + Math.random() * (bounds.maxLat - bounds.minLat);
+
+ if (isPointInPolygon([randomLon, randomLat], polygon)) {
+ return [randomLon, randomLat, 0]; // Adding 0 for elevation to match input format
+ }
+
+ attempts++;
}
-
- return randomPoint;
+
+ // If we couldn't find a point after max attempts, return center of bounding box
+ return [
+ (bounds.minLon + bounds.maxLon) / 2,
+ (bounds.minLat + bounds.maxLat) / 2,
+ 0
+ ];
};
-
-/**
- * Checks if a point is within a given polygon.
- *
- * @param {Array} point - The point coordinate [longitude, latitude].
- * @param {Array} polygon - An array of coordinate arrays representing the polygon.
- * @returns {boolean} True if the point is within the polygon, false otherwise.
- */
-function isPointInPolygon(point, polygon) {
- const [x, y] = point;
- let isInside = false;
-
- for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
- const [x1, y1] = polygon[i];
- const [x2, y2] = polygon[j];
-
- const intersect =
- y1 > y !== y2 > y && x < ((x2 - x1) * (y - y1)) / (y2 - y1) + x1;
-
- if (intersect) isInside = !isInside;
- }
-
- return isInside;
-}
\ No newline at end of file
diff --git a/src/utils/helpers/interventionHelper/legacyInventoryIntervention.ts b/src/utils/helpers/interventionHelper/legacyInventoryIntervention.ts
index 5ce70f993..dcef7d5b3 100644
--- a/src/utils/helpers/interventionHelper/legacyInventoryIntervention.ts
+++ b/src/utils/helpers/interventionHelper/legacyInventoryIntervention.ts
@@ -200,6 +200,9 @@ const getEntireSiteCheck = (data: any) => {
if (typeof publicData === 'object' && publicData !== null && !Array.isArray(publicData)) {
for (const key in publicData) {
if (key == 'isEntireSite') { // optional: ensure the property is not inherited
+ if (publicData[key] === 'false' || publicData[key] === false) {
+ return false
+ }
return true
}
}
diff --git a/src/utils/helpers/syncHelper.ts b/src/utils/helpers/syncHelper.ts
index 653bf1f43..d1c5ebc3c 100644
--- a/src/utils/helpers/syncHelper.ts
+++ b/src/utils/helpers/syncHelper.ts
@@ -267,8 +267,8 @@ export const convertTreeToBody = (i: InterventionData, d: SampleTree, uType: str
return { pData: null, message: "Please assign a project to intervention", fixRequired: "PROJECT_ID_MISSING", error: "" }
}
- if (uType === 'tpo' && d.project_id) {
- postData.plantProject = d.project_id
+ if (uType === 'tpo' && i.project_id) {
+ postData.plantProject = i.project_id
}
if (uType === 'tpo' && i.site_id && i.site_id !== 'other') {
@@ -288,7 +288,7 @@ export const convertTreeToBody = (i: InterventionData, d: SampleTree, uType: str
}
return { pData: postData, message: "", fixRequired: 'NO', error: "" }
} catch (error) {
- return { pData: null, message: "Unknown error ocurred, please check the data ", fixRequired: 'UNKNOWN', error: JSON.stringify(error) }
+ return { pData: null, message: "Unknown error occurred, please check the data ", fixRequired: 'UNKNOWN', error: JSON.stringify(error) }
}
}
@@ -298,10 +298,30 @@ const handleAdditionalData = (aData: FormElement[]) => {
const publicAdd = {}
aData.forEach(el => {
if (el.visibility === 'private') {
- privateAdd[el.label] = el.value
+ privateAdd[el.key] = {
+ "key": el.key,
+ "originalKey":el.element_id,
+ "value":el.value,
+ "label":el.label,
+ "type":el.type,
+ "unit":el.unit,
+ "visibility":"private",
+ "dataType":el.data_type,
+ "elementType":"additionalData"
+ };
}
if (el.visibility === 'public') {
- publicAdd[el.label] = el.value
+ publicAdd[el.key] = {
+ "key": el.key,
+ "originalKey":el.element_id,
+ "value":el.value,
+ "label":el.label,
+ "type":el.type,
+ "unit":el.unit,
+ "visibility":"public",
+ "dataType":el.data_type,
+ "elementType":"additionalData"
+ };
}
})
return { privateAdd, publicAdd }