diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..02d2e07 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 OpenStudbook Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index c796a55..69bf231 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -
-OpenStudbook Banner - # OpenStudbook **Open-source captive breeding and botanical collection management for zoos, aquariums, and botanical gardens.** @@ -8,8 +5,6 @@ [![Security Audit](https://github.com/teruselearning/openstud/actions/workflows/security.yml/badge.svg)](https://github.com/teruselearning/openstud/actions/workflows/security.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-emerald.svg)](LICENSE) -
- --- OpenStudbook is a self-hosted web platform for managing captive animal and plant populations. Track individuals, species, breeding events, genetic lineage, health records, and enclosures — with a global network map for inter-organisation partnerships. @@ -18,9 +13,8 @@ OpenStudbook is a self-hosted web platform for managing captive animal and plant - 🐾 **Fauna & Flora modes** — unified management for animals and plants - 🧬 **Studbook & genetics** — lineage tracking, breeding recommendations, DNA records - 🌍 **Network map** — discover partner organisations and propose breeding loans -- 🤖 **AI assist** — species autofill and illustration via Gemini (optional) - 🔒 **Multi-factor auth**, per-org user roles, and full data export -- 🌐 **Multi-language** — 10+ languages with live AI translation +- 🌐 **Multi-language** — 10 languages, switchable per user --- @@ -33,10 +27,10 @@ OpenStudbook is a self-hosted web platform for managing captive animal and plant - [First-Time Setup (Installer)](#first-time-setup-installer) - [Production Deployment](#production-deployment) - [Resetting the Database](#resetting-the-database) -- [Optional: AI Features](#optional-ai-features) - [Optional: Cloudflare / ngrok Tunnel](#optional-cloudflare--ngrok-tunnel) - [Security](#security) - [Contributing](#contributing) +- [License](#license) --- @@ -103,7 +97,6 @@ cp backend/.env.example backend/.env | `DATABASE_USER` | **Yes** | DB username | | `DATABASE_PASSWORD` | **Yes** | DB password | | `DATABASE_NAME` | **Yes** | DB name (e.g. `openstudbook`) | -| `API_KEY` | No | Gemini API key — enables AI species autofill and illustrations. [Get one free.](https://aistudio.google.com/) | > **Never commit `backend/.env`** — it is gitignored by default. @@ -299,24 +292,6 @@ Then restart the backend — it will re-run migrations and show the installer on --- -## Optional: AI Features - -OpenStudbook integrates with [Google Gemini](https://aistudio.google.com/) for: - -- **Species autofill** — fill conservation status, lifespan, weight from scientific name -- **AI illustration** — generate a representative species image -- **Language translation** — auto-translate UI strings into new languages - -To enable, add your key to `backend/.env`: - -``` -API_KEY=your_gemini_api_key_here -``` - -AI usage is tracked per organisation and capped by the Super Admin. Organisations can also provide their own Gemini API key in Org Settings to bypass the shared limit. - ---- - ## Optional: Cloudflare / ngrok Tunnel Expose your local dev instance publicly (useful for mobile testing, demos, or webhook testing). @@ -337,7 +312,12 @@ Both print a public HTTPS URL to the console. ## Security -See the [security maintenance plan in CLAUDE.md](CLAUDE.md#security-maintenance-plan) for the full automated and manual security schedule. +The production checklist above covers the essential hardening steps. For ongoing maintenance: + +- Rotate `JWT_SECRET` and `DATABASE_PASSWORD` quarterly +- Run `npm audit` in both root and `backend/` regularly — fix anything at high or critical severity +- Review and merge Dependabot PRs promptly +- Audit Super Admin accounts periodically — remove any that are no longer needed To report a vulnerability, please open a [GitHub Security Advisory](https://github.com/teruselearning/openstud/security/advisories/new) rather than a public issue. @@ -356,6 +336,12 @@ For larger changes, open an issue first to discuss the approach. --- +## License + +MIT © OpenStudbook Contributors — see [LICENSE](LICENSE). + +--- +
Built with ❤️ for wildlife conservation and botanical management.
diff --git a/backend/package.json b/backend/package.json index a5c9dd9..47046ba 100644 --- a/backend/package.json +++ b/backend/package.json @@ -10,7 +10,7 @@ }, "keywords": [], "author": "", - "license": "ISC", + "license": "MIT", "dependencies": { "@google/genai": "^1.33.0", "bcryptjs": "^2.4.3", diff --git a/backend/src/index.ts b/backend/src/index.ts index 41b339d..20e62f2 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -49,7 +49,13 @@ const resetPool = (newConfig: any) => { const app: any = express(); const PORT = Number(process.env.PORT) || 3001; -const JWT_SECRET = process.env.JWT_SECRET || 'openstudbook-stable-dev-secret-2024'; +if (!process.env.JWT_SECRET) { + console.error('\n⛔ FATAL: JWT_SECRET is not set in backend/.env'); + console.error(' Generate one: node -e "console.log(require(\'crypto\').randomBytes(32).toString(\'hex\'))"'); + console.error(' See backend/.env.example for full configuration.\n'); + process.exit(1); +} +const JWT_SECRET = process.env.JWT_SECRET as string; app.use(cors({ origin: '*' })); app.use(express.json({ limit: '50mb' })); diff --git a/backend/src/seed-languages.json b/backend/src/seed-languages.json index 452c05f..9a0eb5a 100644 --- a/backend/src/seed-languages.json +++ b/backend/src/seed-languages.json @@ -4,25 +4,311 @@ "name": "English (UK)", "isDefault": true, "translations": { - "dashboard": "Dashboard", "networkMap": "Network", "plantMap": "Flora Map", "species": "Species", "individuals": "Individuals", "breeding": "Breeding", "usersRoles": "Users & Roles", "organization": "Organisation", "superAdmin": "Super Admin", "signOut": "Sign Out", "currentProject": "Current Project", "allProjects": "All Projects", "createNewProject": "Create New Project", - "landingTitle": "Open Source Captive Breeding Management", "landingSubtitle": "OpenStudbook is an open-source platform for zoos, aquariums, and botanical gardens to manage species populations and track genetics.", "createOrg": "Create Organisation", "exploreDemo": "Explore Demo", "demoLogin": "Demo Login", "getStarted": "Get Started", "securePrivate": "Secure & Private", "securePrivateDesc": "Your data is yours. Choose exactly what to share.", "floraFauna": "Fauna & Flora", "floraFaunaDesc": "Unified management for animals and plants.", "globalNetwork": "Global Network", "globalNetworkDesc": "Connect with partners worldwide.", "back": "Back", "registerOrg": "Register Organisation", "orgName": "Organisation Name", "orgFocus": "Focus", "orgFocusExplanation": "Selecting the focus will pre-enable features most relevant to your organisation. You still have access to everything via organisation settings.", "faunaManagement": "Fauna Management", "floraManagement": "Flora Management", "cityLocation": "City / Location", "adminDetails": "Admin Account Details", "yourFullName": "Your Full Name", "workEmail": "Work Email", "password": "Password", "confirmPassword": "Confirm Password", "verifyEmailAndContinue": "Verify Email & Continue", "signIn": "Sign In", "welcomeBack": "Welcome Back", "signInSubtitle": "Sign in to your organisation.", "forgotPassword": "Forgot Password?", "needAccount": "Need an account? Register here", "backToLanding": "Back to Landing", - "about": "About", "privacyPolicy": "Privacy Policy", "termsConditions": "Terms & Conditions", - "overview": "Overview", "welcomeBackDashboard": "Welcome back to your organisation dashboard.", "totalSpecies": "Total Species", "totalIndividuals": "Total Individuals", "endangeredSpecies": "Endangered Species", "activeUsers": "Active Users", "breedingPairs": "Suggested Breeding Pairs", "match": "Match", "noBreeding": "No breeding recommendations available at this time.", "popDist": "Population Distribution", "consStatus": "Conservation Status Ratio", "origin": "Population Origin", "ageDist": "Age & Sex Distribution", "wildCaught": "Wild Caught", "captiveBred": "Captive Bred", "unknownOrigin": "Unknown Origin", "males": "Males", "females": "Females", "unknownSex": "Unknown", "years": "years", - "orgSettings": "Organisation Settings", "orgSettingsSubtitle": "Manage your zoo or sanctuary details.", "locationName": "Location Name (City/State)", "geoLocation": "Geo-Location (Map)", "description": "Description", "projectManagement": "Project Management", "projectManagementDesc": "Create, edit, or delete projects. Transfer species between projects.", "dataManagement": "Data Management", "dataManagementDesc": "Export your data for safekeeping or transfer it to another system.", "saveChanges": "Save Changes", "saved": "Saved!", - "speciesDatabase": "Species Database", "speciesSubtitle": "Catalog and manage the biological profiles of your collection.", "commonName": "Common Name", "commonNamePlaceholder": "e.g. Red Panda", "scientificName": "Scientific Name", "scientificNamePlaceholder": "e.g. Ailurus fulgens", "type": "Kingdom", "animal": "Fauna", "plant": "Flora", "conservationStatus": "Conservation Status", "sexualMaturity": "Sexual Maturity (Years)", "lifeExpectancy": "Life Expectancy (Years)", "autofill": "Autofill", "aiGenerate": "AI Illustration", "cancel": "Cancel", "save": "Save", "add": "Add", "searchSpecies": "Search Species...", "searchIndividuals": "Search Individuals...", - "indivSubtitleAnimal": "Track and manage the individuals in your care.", "updateIndividual": "Update Individual", "registerIndividual": "Register Individual", "representativeImage": "Representative Image", "upload": "Upload", "noImageProvided": "No image provided", "saveSpecies": "Save Species", "updateSpecies": "Update Species", "lifespan": "Lifespan", "maturity": "Maturity", "noSpeciesFound": "No species found", "adultWeight": "Adult Weight", "classification": "Classification", "monoecious": "Monoecious", "dioecious": "Dioecious", "maturityFlowering": "Maturity / Flowering", "studbookId": "Studbook ID", "name": "Name", - "saSubtitle": "Global system management and oversight.", "security": "Security", "email": "Email", "landing": "Landing", "localisation": "Localisation", "network": "Network", "cacheManage": "Local Cache Management", "createOrgBtn": "Create Organisation", "loginAs": "Login As", "hostTag": "Host", "smtpTestSuccess": "SMTP test sent successfully!", "smtpSettings": "SMTP Settings", "smtpHost": "SMTP Host", "port": "Port", "username": "Username", "secureConnection": "Secure Connection (SSL/TLS)", "saveSettings": "Save Settings", "securitySettings": "Security Settings", "enableMfa": "Enable Two-Factor Auth", "enableOrgMfa": "Force Org Two-Factor Auth", "enableOrgMfaDesc": "Require all members of this organization to use MFA.", "theming": "Theming", "primaryColor": "Primary Color", "appLogo": "App Logo", "uploadLogo": "Upload Logo", "customCss": "Custom CSS", "enableRegistration": "Enable Registration", "featureCards": "Feature Cards", "addLanguage": "Add Language", "supportedLanguages": "Supported Languages", "heroTitle": "Hero Title", "heroSubtitle": "Hero Subtitle", "staticPages": "Static Pages", "clearCacheBtn": "Purge Local Data", "allOrganizations": "All Organisations", "searchName": "Search by name...", - "emailVerifySubject": "Verify your email", "emailVerifyBody": "

Your verification code is: {{code}}

", "emailInviteSubject": "Invitation to join {{orgName}}", "emailInviteBody": "

Hello {{userName}},

You have been invited to join the management team at {{orgName}}.

Please click the link below to confirm your account and set your password:

Confirm My Account

If the button doesn't work, copy and paste this URL into your browser:
{{inviteUrl}}

", "emailNotifySubject": "System Notification", "emailNotifyBody": "

Hello,

{{message}}

", - "registration": "User Registration", "mfa": "Two-Factor Auth", "invite": "Team Invitation", "notification": "System Alerts", - "teamMembers": "Team Members", "teamSubtitle": "Manage your team's access and permissions.", "bulkInvite": "Bulk Invite", "inviteMember": "Invite Member", "csvFormatTitle": "CSV Format", "csvFormatDesc": "Download our template to ensure your CSV is formatted correctly.", "processingBulk": "Processing bulk invitations...", "selectSpecies": "Select Species", "saveEvent": "Save Event", "breedingSubtitle": "Track and manage breeding pairs and outcomes.", "recordBreedingEvent": "Record Event", "newBreedingLoan": "New Loan", "breedingEvents": "Events", "breedingLoans": "Loans", "viewTitle": "Filter View", "includePartnerOrgs": "Include Partner Events", - "onboardingWelcome": "Welcome to OpenStudbook", "onboardingSettingsTask": "Please review your organization settings below and click 'Save Changes' to continue.", "onboardingSaveAndNext": "Save & Continue to Species", "onboardingSpeciesTask": "Great! Now add your first species to start building your collection.", "onboardingIndivTask": "Finally, register individual specimens to track their growth and history.", - "enablePage": "Enable Feature", "dashBlockTitle": "Dashboard Message Title", "dashBlockContent": "Dashboard Message Content", "customDashBlock": "Custom Dashboard Announcement", "customDashBlockDesc": "Create a custom announcement block that appears on the top of the dashboard for all users.", "visibilityPrivacy": "Visibility & Privacy", "breedingLoanPolicy": "Breeding & Loan Policy", "allowBreedingRequests": "Allow Network Requests", "allowBreedingRequestsDesc": "Allow partner organizations to propose breeding loans via the network map.", "whoReceivesRequests": "Request Contact", "whoReceivesRequestsDesc": "Which user should be notified when a loan request is received?", "orgVisibility": "List in Directory", "orgVisibilityDesc": "Make your organization visible on the global network map.", "obscureLocation": "Obscure Map Location", "obscureLocationDesc": "Round your map coordinates to prevent precise site tracking by non-partners.", "speciesListVisibility": "Public Species List", "speciesListVisibilityDesc": "Allow anyone on the network to see which species you manage.", - "noPartnersFound": "No partners found.", "connectNewPartner": "Connect New Partner", "yourInviteCode": "Your Invite Code", "redeemCode": "Redeem Code", "siteKey": "Site Key", "secretKey": "Secret Key", - "dashboardReady": "Your dashboard is ready", "dashboardReadyDesc": "Metrics, charts, and breeding insights will all appear here once you've added some species and individuals to your collection.", "addSpecies": "Add a Species", "addIndividual": "Add an Individual", - "fullName": "Full Name", "preferredLanguage": "Preferred Language", "emailAddress": "Email Address", "superAdminOnly": "(Super Admin Only)", "projectAccess": "Project Access", "globalAccessAll": "Global (All Present & Future)", "restrictedSpecific": "Restricted (Select Specific)", "globalAccessInfo": "This user will have access to all projects by default and can switch between them using the project navigator.", "sendInvitation": "Send Invitation", "cancelInvitation": "Cancel Invitation?", "removeTeamMember": "Remove Team Member?", "cancelInviteConfirm": "Are you sure you want to cancel the invitation for {{name}}? They haven't joined the organisation yet.", "removeMemberConfirm": "Are you sure you want to remove {{name}}? They will lose all access to organisation data and projects.", "revokeInvitation": "Revoke Invitation", "removeAccess": "Remove Access", "inviteSent": "Invitation sent successfully!", "inviteFailed": "Failed to send invitation.", "inviteCancelled": "Invitation cancelled.", "memberRemoved": "User removed.", "actionFailed": "Action failed.", - "acceptInvitation": "Accept Invitation", "invitedToJoin": "You've been invited to join", "setPassword": "Set Password", "minimumCharsHint": "Minimum 8 characters", "repeatPasswordHint": "Repeat password", "activating": "Activating...", "activateAccount": "Activate Account", "accountActivated": "Account activated! Redirecting...", "noTokenFound": "No invitation token found in the link.", "invalidInvite": "Invalid or expired invitation.", "passwordMismatch": "Passwords do not match.", "passwordTooShort": "Password must be at least 8 characters.", "activationFailed": "Failed to activate account.", - "enclosures": "Enclosures", "enclosure": "Enclosure", "areas": "Areas", "area": "Area", "enclosuresDescription": "Physical management of collections by site location.", "enableEnclosures": "Enable Enclosures", "enableAreas": "Enable Areas", "enableEnclosuresModuleDesc": "Enable advanced mapping and species grouping by physical location.", "orgWideView": "Organisation-Wide View", "networkDescription": "Discover other organisations and establish breeding partnerships.", "myPartners": "My Partners", "plantMapDescription": "Spatial distribution and precise physical tracking of your botanical collection.", "allManagedAreas": "All Managed Areas", "projectScope": "Project Scope", "hideLabels": "Hide Labels", "showLabels": "Show Labels", "noProjectsFound": "No Projects Found", - "history": "History", "genetics": "Genetics", "editProfile": "Edit Profile", "sex": "Sex", "birthDate": "Birth Date", "planted": "Planted", "deathDate": "Death Date", "removed": "Removed", "acquisitionSource": "Acquisition Source", "sourceDetails": "Source Details", "loanStatus": "Loan Status", "transferred": "Transferred", "transferNote": "Transfer Note", "lifeExpectancyShort": "Life Expectancy", "sexualMaturityShort": "Sexual Maturity", "avgAdultWeight": "Avg Adult Weight", "avgAdultHeight": "Avg Adult Height", "breedingSeason": "Breeding Season", "nativeStatus": "Native Status", "speciesInfo": "Species Info", "viewInSpeciesRegistry": "View in Species Registry", "location": "Location", "noCoordinatesAssigned": "No coordinates assigned", "setLocation": "Set Location", "weightTrend": "Weight Trend", "growthTrend": "Growth Trend", "logWeight": "Log Weight", "logHeight": "Log Height", "addObservation": "Add Observation", "parentage": "Parentage", "sire": "Sire", "dam": "Dam", "performedBy": "Performed By", "speciesDetail": "Species Detail", "weightHistory": "Weight History", "healthHistory": "Health History" + "dashboard": "Dashboard", + "networkMap": "Network", + "plantMap": "Flora Map", + "species": "Species", + "individuals": "Individuals", + "breeding": "Breeding", + "usersRoles": "Users & Roles", + "organization": "Organisation", + "superAdmin": "Super Admin", + "signOut": "Sign Out", + "currentProject": "Current Project", + "allProjects": "All Projects", + "createNewProject": "Create New Project", + "landingTitle": "Open Source Captive Breeding Management", + "landingSubtitle": "OpenStudbook is an open-source platform for zoos, aquariums, and botanical gardens to manage species populations and track genetics.", + "createOrg": "Create Organisation", + "exploreDemo": "Explore Demo", + "demoLogin": "Demo Login", + "getStarted": "Get Started", + "securePrivate": "Secure & Private", + "securePrivateDesc": "Your data is yours. Choose exactly what to share.", + "floraFauna": "Fauna & Flora", + "floraFaunaDesc": "Unified management for animals and plants.", + "globalNetwork": "Global Network", + "globalNetworkDesc": "Connect with partners worldwide.", + "back": "Back", + "registerOrg": "Register Organisation", + "orgName": "Organisation Name", + "orgFocus": "Focus", + "orgFocusExplanation": "Selecting the focus will pre-enable features most relevant to your organisation. You still have access to everything via organisation settings.", + "faunaManagement": "Fauna Management", + "floraManagement": "Flora Management", + "cityLocation": "City / Location", + "adminDetails": "Admin Account Details", + "yourFullName": "Your Full Name", + "workEmail": "Work Email", + "password": "Password", + "confirmPassword": "Confirm Password", + "verifyEmailAndContinue": "Verify Email & Continue", + "signIn": "Sign In", + "welcomeBack": "Welcome Back", + "signInSubtitle": "Sign in to your organisation.", + "forgotPassword": "Forgot Password?", + "needAccount": "Need an account? Register here", + "backToLanding": "Back to Landing", + "about": "About", + "privacyPolicy": "Privacy Policy", + "termsConditions": "Terms & Conditions", + "overview": "Overview", + "welcomeBackDashboard": "Welcome back to your organisation dashboard.", + "totalSpecies": "Total Species", + "totalIndividuals": "Total Individuals", + "endangeredSpecies": "Endangered Species", + "activeUsers": "Active Users", + "breedingPairs": "Suggested Breeding Pairs", + "match": "Match", + "noBreeding": "No breeding recommendations available at this time.", + "popDist": "Population Distribution", + "consStatus": "Conservation Status Ratio", + "origin": "Population Origin", + "ageDist": "Age & Sex Distribution", + "wildCaught": "Wild Caught", + "captiveBred": "Captive Bred", + "unknownOrigin": "Unknown Origin", + "males": "Males", + "females": "Females", + "unknownSex": "Unknown", + "years": "years", + "orgSettings": "Organisation Settings", + "orgSettingsSubtitle": "Manage your zoo or sanctuary details.", + "locationName": "Location Name (City/State)", + "geoLocation": "Geo-Location (Map)", + "description": "Description", + "projectManagement": "Project Management", + "projectManagementDesc": "Create, edit, or delete projects. Transfer species between projects.", + "dataManagement": "Data Management", + "dataManagementDesc": "Export your data for safekeeping or transfer it to another system.", + "saveChanges": "Save Changes", + "saved": "Saved!", + "speciesDatabase": "Species Database", + "speciesSubtitle": "Catalog and manage the biological profiles of your collection.", + "commonName": "Common Name", + "commonNamePlaceholder": "e.g. Red Panda", + "scientificName": "Scientific Name", + "scientificNamePlaceholder": "e.g. Ailurus fulgens", + "type": "Kingdom", + "animal": "Fauna", + "plant": "Flora", + "conservationStatus": "Conservation Status", + "sexualMaturity": "Sexual Maturity (Years)", + "lifeExpectancy": "Life Expectancy (Years)", + "autofill": "Autofill", + "aiGenerate": "AI Illustration", + "cancel": "Cancel", + "save": "Save", + "add": "Add", + "searchSpecies": "Search Species...", + "searchIndividuals": "Search Individuals...", + "indivSubtitleAnimal": "Track and manage the individuals in your care.", + "updateIndividual": "Update Individual", + "registerIndividual": "Register Individual", + "representativeImage": "Representative Image", + "upload": "Upload", + "noImageProvided": "No image provided", + "saveSpecies": "Save Species", + "updateSpecies": "Update Species", + "lifespan": "Lifespan", + "maturity": "Maturity", + "noSpeciesFound": "No species found", + "adultWeight": "Adult Weight", + "classification": "Classification", + "monoecious": "Monoecious", + "dioecious": "Dioecious", + "maturityFlowering": "Maturity / Flowering", + "studbookId": "Studbook ID", + "name": "Name", + "saSubtitle": "Global system management and oversight.", + "security": "Security", + "email": "Email", + "landing": "Landing", + "localisation": "Localisation", + "network": "Network", + "cacheManage": "Local Cache Management", + "createOrgBtn": "Create Organisation", + "loginAs": "Login As", + "hostTag": "Host", + "smtpTestSuccess": "SMTP test sent successfully!", + "smtpSettings": "SMTP Settings", + "smtpHost": "SMTP Host", + "port": "Port", + "username": "Username", + "secureConnection": "Secure Connection (SSL/TLS)", + "saveSettings": "Save Settings", + "securitySettings": "Security Settings", + "enableMfa": "Enable Two-Factor Auth", + "enableOrgMfa": "Force Org Two-Factor Auth", + "enableOrgMfaDesc": "Require all members of this organization to use MFA.", + "theming": "Theming", + "primaryColor": "Primary Color", + "appLogo": "App Logo", + "uploadLogo": "Upload Logo", + "customCss": "Custom CSS", + "enableRegistration": "Enable Registration", + "featureCards": "Feature Cards", + "addLanguage": "Add Language", + "supportedLanguages": "Supported Languages", + "heroTitle": "Hero Title", + "heroSubtitle": "Hero Subtitle", + "staticPages": "Static Pages", + "clearCacheBtn": "Purge Local Data", + "allOrganizations": "All Organisations", + "searchName": "Search by name...", + "emailVerifySubject": "Verify your email", + "emailVerifyBody": "

Your verification code is: {{code}}

", + "emailInviteSubject": "Invitation to join {{orgName}}", + "emailInviteBody": "

Hello {{userName}},

You have been invited to join the management team at {{orgName}}.

Please click the link below to confirm your account and set your password:

Confirm My Account

If the button doesn't work, copy and paste this URL into your browser:
{{inviteUrl}}

", + "emailNotifySubject": "System Notification", + "emailNotifyBody": "

Hello,

{{message}}

", + "registration": "User Registration", + "mfa": "Two-Factor Auth", + "invite": "Team Invitation", + "notification": "System Alerts", + "teamMembers": "Team Members", + "teamSubtitle": "Manage your team's access and permissions.", + "bulkInvite": "Bulk Invite", + "inviteMember": "Invite Member", + "csvFormatTitle": "CSV Format", + "csvFormatDesc": "Download our template to ensure your CSV is formatted correctly.", + "processingBulk": "Processing bulk invitations...", + "selectSpecies": "Select Species", + "saveEvent": "Save Event", + "breedingSubtitle": "Track and manage breeding pairs and outcomes.", + "recordBreedingEvent": "Record Event", + "newBreedingLoan": "New Loan", + "breedingEvents": "Events", + "breedingLoans": "Loans", + "viewTitle": "Filter View", + "includePartnerOrgs": "Include Partner Events", + "onboardingWelcome": "Welcome to OpenStudbook", + "onboardingSettingsTask": "Please review your organization settings below and click 'Save Changes' to continue.", + "onboardingSaveAndNext": "Save & Continue to Species", + "onboardingSpeciesTask": "Great! Now add your first species to start building your collection.", + "onboardingIndivTask": "Finally, register individual specimens to track their growth and history.", + "enablePage": "Enable Feature", + "dashBlockTitle": "Dashboard Message Title", + "dashBlockContent": "Dashboard Message Content", + "customDashBlock": "Custom Dashboard Announcement", + "customDashBlockDesc": "Create a custom announcement block that appears on the top of the dashboard for all users.", + "visibilityPrivacy": "Visibility & Privacy", + "breedingLoanPolicy": "Breeding & Loan Policy", + "allowBreedingRequests": "Allow Network Requests", + "allowBreedingRequestsDesc": "Allow partner organizations to propose breeding loans via the network map.", + "whoReceivesRequests": "Request Contact", + "whoReceivesRequestsDesc": "Which user should be notified when a loan request is received?", + "orgVisibility": "List in Directory", + "orgVisibilityDesc": "Make your organization visible on the global network map.", + "obscureLocation": "Obscure Map Location", + "obscureLocationDesc": "Masks your location on the network map to within approximately 10 miles of your actual site.", + "speciesListVisibility": "Public Species List", + "speciesListVisibilityDesc": "Allow anyone on the network to see which species you manage.", + "noPartnersFound": "No partners found.", + "connectNewPartner": "Connect New Partner", + "yourInviteCode": "Your Invite Code", + "redeemCode": "Redeem Code", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "dashboardReady": "Your dashboard is ready", + "dashboardReadyDesc": "Metrics, charts, and breeding insights will all appear here once you've added some species and individuals to your collection.", + "addSpecies": "Add a Species", + "addIndividual": "Add an Individual", + "fullName": "Full Name", + "preferredLanguage": "Preferred Language", + "emailAddress": "Email Address", + "superAdminOnly": "(Super Admin Only)", + "projectAccess": "Project Access", + "globalAccessAll": "Global (All Present & Future)", + "restrictedSpecific": "Restricted (Select Specific)", + "globalAccessInfo": "This user will have access to all projects by default and can switch between them using the project navigator.", + "sendInvitation": "Send Invitation", + "cancelInvitation": "Cancel Invitation?", + "removeTeamMember": "Remove Team Member?", + "cancelInviteConfirm": "Are you sure you want to cancel the invitation for {{name}}? They haven't joined the organisation yet.", + "removeMemberConfirm": "Are you sure you want to remove {{name}}? They will lose all access to organisation data and projects.", + "revokeInvitation": "Revoke Invitation", + "removeAccess": "Remove Access", + "inviteSent": "Invitation sent successfully!", + "inviteFailed": "Failed to send invitation.", + "inviteCancelled": "Invitation cancelled.", + "memberRemoved": "User removed.", + "actionFailed": "Action failed.", + "acceptInvitation": "Accept Invitation", + "invitedToJoin": "You've been invited to join", + "setPassword": "Set Password", + "minimumCharsHint": "Minimum 8 characters", + "repeatPasswordHint": "Repeat password", + "activating": "Activating...", + "activateAccount": "Activate Account", + "accountActivated": "Account activated! Redirecting...", + "noTokenFound": "No invitation token found in the link.", + "invalidInvite": "Invalid or expired invitation.", + "passwordMismatch": "Passwords do not match.", + "passwordTooShort": "Password must be at least 8 characters.", + "activationFailed": "Failed to activate account.", + "enclosures": "Enclosures", + "enclosure": "Enclosure", + "areas": "Areas", + "area": "Area", + "enclosuresDescription": "Physical management of collections by site location.", + "enableEnclosures": "Enable Enclosures", + "enableAreas": "Enable Areas", + "enableEnclosuresModuleDesc": "Enable advanced mapping and species grouping by physical location.", + "orgWideView": "Organisation-Wide View", + "networkDescription": "Discover other organisations and establish breeding partnerships.", + "myPartners": "My Partners", + "plantMapDescription": "Spatial distribution and precise physical tracking of your botanical collection.", + "allManagedAreas": "All Managed Areas", + "projectScope": "Project Scope", + "hideLabels": "Hide Labels", + "showLabels": "Show Labels", + "noProjectsFound": "No Projects Found", + "history": "History", + "genetics": "Genetics", + "editProfile": "Edit Profile", + "sex": "Sex", + "birthDate": "Birth Date", + "planted": "Planted", + "deathDate": "Death Date", + "removed": "Removed", + "acquisitionSource": "Acquisition Source", + "sourceDetails": "Source Details", + "loanStatus": "Loan Status", + "transferred": "Transferred", + "transferNote": "Transfer Note", + "lifeExpectancyShort": "Life Expectancy", + "sexualMaturityShort": "Sexual Maturity", + "avgAdultWeight": "Avg Adult Weight", + "avgAdultHeight": "Avg Adult Height", + "breedingSeason": "Breeding Season", + "nativeStatus": "Native Status", + "speciesInfo": "Species Info", + "viewInSpeciesRegistry": "View in Species Registry", + "location": "Location", + "noCoordinatesAssigned": "No coordinates assigned", + "setLocation": "Set Location", + "weightTrend": "Weight Trend", + "growthTrend": "Growth Trend", + "logWeight": "Log Weight", + "logHeight": "Log Height", + "addObservation": "Add Observation", + "parentage": "Parentage", + "sire": "Sire", + "dam": "Dam", + "performedBy": "Performed By", + "speciesDetail": "Species Detail", + "weightHistory": "Weight History", + "healthHistory": "Health History", + "hideOrgName": "Hide Organisation Name", + "hideOrgNameDesc": "Display as 'Anonymous Organisation' on the network map.", + "speciesListVisibilityNote": "Only visible to registered network partners.", + "showNativeStatus": "Show Native Status Badges", + "showNativeStatusDesc": "Display native/non-native/invasive status indicators on species cards and individual profiles.", + "locationMapNotice": "Adding an accurate location for your organisation is important for the mapping functionality across the app. Please set a location and review the privacy settings below.", + "useMyLocation": "Use My Current Location", + "addToHomeScreen": "Add to Home Screen", + "iosInstallHint": "In Safari, tap the Share button at the bottom of the screen, then tap 'Add to Home Screen'." } }, { @@ -30,25 +316,311 @@ "name": "English (US)", "isDefault": false, "translations": { - "dashboard": "Dashboard", "networkMap": "Network", "plantMap": "Flora Map", "species": "Species", "individuals": "Individuals", "breeding": "Breeding", "usersRoles": "Users & Roles", "organization": "Organization", "superAdmin": "Super Admin", "signOut": "Sign Out", "currentProject": "Current Project", "allProjects": "All Projects", "createNewProject": "Create New Project", - "landingTitle": "Open Source Captive Breeding Management", "landingSubtitle": "OpenStudbook is an open-source platform for zoos, aquariums, and botanical gardens to manage species populations and track genetics.", "createOrg": "Create Organization", "exploreDemo": "Explore Demo", "demoLogin": "Demo Login", "getStarted": "Get Started", "securePrivate": "Secure & Private", "securePrivateDesc": "Your data is yours. Choose exactly what to share.", "floraFauna": "Fauna & Flora", "floraFaunaDesc": "Unified management for animals and plants.", "globalNetwork": "Global Network", "globalNetworkDesc": "Connect with partners worldwide.", "back": "Back", "registerOrg": "Register Organization", "orgName": "Organization Name", "orgFocus": "Focus", "orgFocusExplanation": "Selecting the focus will pre-enable features most relevant to your organisation. You still have access to everything via organisation settings.", "faunaManagement": "Fauna Management", "floraManagement": "Flora Management", "cityLocation": "City / Location", "adminDetails": "Admin Account Details", "yourFullName": "Your Full Name", "workEmail": "Work Email", "password": "Password", "confirmPassword": "Confirm Password", "verifyEmailAndContinue": "Verify Email & Continue", "signIn": "Sign In", "welcomeBack": "Welcome Back", "signInSubtitle": "Sign in to your organisation.", "forgotPassword": "Forgot Password?", "needAccount": "Need an account? Register here", "backToLanding": "Back to Landing", - "about": "About", "privacyPolicy": "Privacy Policy", "termsConditions": "Terms & Conditions", - "overview": "Overview", "welcomeBackDashboard": "Welcome back to your organization dashboard.", "totalSpecies": "Total Species", "totalIndividuals": "Total Individuals", "endangeredSpecies": "Endangered Species", "activeUsers": "Active Users", "breedingPairs": "Suggested Breeding Pairs", "match": "Match", "noBreeding": "No breeding recommendations available at this time.", "popDist": "Population Distribution", "consStatus": "Conservation Status Ratio", "origin": "Population Origin", "ageDist": "Age & Sex Distribution", "wildCaught": "Wild Caught", "captiveBred": "Captive Bred", "unknownOrigin": "Unknown Origin", "males": "Males", "females": "Females", "unknownSex": "Unknown", "years": "years", - "orgSettings": "Organization Settings", "orgSettingsSubtitle": "Manage your zoo or sanctuary details and privacy.", "locationName": "Location Name (City/State)", "geoLocation": "Geo-Location (Map)", "description": "Description", "projectManagement": "Project Management", "projectManagementDesc": "Create, edit, or delete projects. Transfer species between projects.", "dataManagement": "Data Management", "dataManagementDesc": "Export your data for safekeeping or transfer it to another system.", "saveChanges": "Save Changes", "saved": "Saved!", - "speciesDatabase": "Species Database", "speciesSubtitle": "Catalog and manage the biological profiles of your collection.", "commonName": "Common Name", "commonNamePlaceholder": "e.g. Red Panda", "scientificName": "Scientific Name", "scientificNamePlaceholder": "e.g. Ailurus fulgens", "type": "Kingdom", "animal": "Fauna", "plant": "Flora", "conservationStatus": "Conservation Status", "sexualMaturity": "Sexual Maturity (Years)", "lifeExpectancy": "Life Expectancy (Years)", "autofill": "Autofill", "aiGenerate": "AI Illustration", "cancel": "Cancel", "save": "Save", "add": "Add", "searchSpecies": "Search Species...", "searchIndividuals": "Search Individuals...", - "indivSubtitleAnimal": "Track and manage the individuals in your care.", "updateIndividual": "Update Individual", "registerIndividual": "Register Individual", "representativeImage": "Representative Image", "upload": "Upload", "noImageProvided": "No image provided", "saveSpecies": "Save Species", "updateSpecies": "Update Species", "lifespan": "Lifespan", "maturity": "Maturity", "noSpeciesFound": "No species found", "adultWeight": "Adult Weight", "classification": "Classification", "monoecious": "Monoecious", "dioecious": "Dioecious", "maturityFlowering": "Maturity / Flowering", "studbookId": "Studbook ID", "name": "Name", - "saSubtitle": "Global system management and oversight.", "security": "Security", "email": "Email", "landing": "Landing", "localisation": "Localisation", "network": "Network", "cacheManage": "Local Cache Management", "createOrgBtn": "Create Organisation", "loginAs": "Login As", "hostTag": "Host", "smtpTestSuccess": "SMTP test sent successfully!", "smtpSettings": "SMTP Settings", "smtpHost": "SMTP Host", "port": "Port", "username": "Username", "secureConnection": "Secure Connection (SSL/TLS)", "saveSettings": "Save Settings", "securitySettings": "Security Settings", "enableMfa": "Enable Two-Factor Auth", "enableOrgMfa": "Force Org Two-Factor Auth", "enableOrgMfaDesc": "Require all members of this organization to use MFA.", "theming": "Theming", "primaryColor": "Primary Color", "appLogo": "App Logo", "uploadLogo": "Upload Logo", "customCss": "Custom CSS", "enableRegistration": "Enable Registration", "featureCards": "Feature Cards", "addLanguage": "Add Language", "supportedLanguages": "Supported Languages", "heroTitle": "Hero Title", "heroSubtitle": "Hero Subtitle", "staticPages": "Static Pages", "clearCacheBtn": "Purge Local Data", "allOrganizations": "All Organizations", "searchName": "Search by name...", - "emailVerifySubject": "Verify your email", "emailVerifyBody": "

Your verification code is: {{code}}

", "emailInviteSubject": "Invitation to join {{orgName}}", "emailInviteBody": "

Hello {{userName}},

You have been invited to join the management team at {{orgName}}.

Please click the link below to confirm your account and set your password:

Confirm My Account

If the button doesn't work, copy and paste this URL into your browser:
{{inviteUrl}}

", "emailNotifySubject": "System Notification", "emailNotifyBody": "

Hello,

{{message}}

", - "registration": "User Registration", "mfa": "Two-Factor Auth", "invite": "Team Invitation", "notification": "System Alerts", - "teamMembers": "Team Members", "teamSubtitle": "Manage your team's access and permissions.", "bulkInvite": "Bulk Invite", "inviteMember": "Invite Member", "csvFormatTitle": "CSV Format", "csvFormatDesc": "Download our template to ensure your CSV is formatted correctly.", "processingBulk": "Processing bulk invitations...", "selectSpecies": "Select Species", "saveEvent": "Save Event", "breedingSubtitle": "Track and manage breeding pairs and outcomes.", "recordBreedingEvent": "Record Event", "newBreedingLoan": "New Loan", "breedingEvents": "Events", "breedingLoans": "Loans", "viewTitle": "Filter View", "includePartnerOrgs": "Include Partner Events", - "onboardingWelcome": "Welcome to OpenStudbook", "onboardingSettingsTask": "Please review your organization settings below and click 'Save Changes' to continue.", "onboardingSaveAndNext": "Save & Continue to Species", "onboardingSpeciesTask": "Great! Now add your first species to start building your collection.", "onboardingIndivTask": "Finally, register individual specimens to track their growth and history.", - "enablePage": "Enable Feature", "dashBlockTitle": "Dashboard Message Title", "dashBlockContent": "Dashboard Message Content", "customDashBlock": "Custom Dashboard Announcement", "customDashBlockDesc": "Create a custom announcement block that appears on the top of the dashboard for all users.", "visibilityPrivacy": "Visibility & Privacy", "breedingLoanPolicy": "Breeding & Loan Policy", "allowBreedingRequests": "Allow Network Requests", "allowBreedingRequestsDesc": "Allow partner organizations to propose breeding loans via the network map.", "whoReceivesRequests": "Request Contact", "whoReceivesRequestsDesc": "Which user should be notified when a loan request is received?", "orgVisibility": "List in Directory", "orgVisibilityDesc": "Make your organization visible on the global network map.", "obscureLocation": "Obscure Map Location", "obscureLocationDesc": "Round your map coordinates to prevent precise site tracking by non-partners.", "speciesListVisibility": "Public Species List", "speciesListVisibilityDesc": "Allow anyone on the network to see which species you manage.", - "noPartnersFound": "No partners found.", "connectNewPartner": "Connect New Partner", "yourInviteCode": "Your Invite Code", "redeemCode": "Redeem Code", "siteKey": "Site Key", "secretKey": "Secret Key", - "dashboardReady": "Your dashboard is ready", "dashboardReadyDesc": "Metrics, charts, and breeding insights will all appear here once you've added some species and individuals to your collection.", "addSpecies": "Add a Species", "addIndividual": "Add an Individual", - "fullName": "Full Name", "preferredLanguage": "Preferred Language", "emailAddress": "Email Address", "superAdminOnly": "(Super Admin Only)", "projectAccess": "Project Access", "globalAccessAll": "Global (All Present & Future)", "restrictedSpecific": "Restricted (Select Specific)", "globalAccessInfo": "This user will have access to all projects by default and can switch between them using the project navigator.", "sendInvitation": "Send Invitation", "cancelInvitation": "Cancel Invitation?", "removeTeamMember": "Remove Team Member?", "cancelInviteConfirm": "Are you sure you want to cancel the invitation for {{name}}? They haven't joined the organisation yet.", "removeMemberConfirm": "Are you sure you want to remove {{name}}? They will lose all access to organisation data and projects.", "revokeInvitation": "Revoke Invitation", "removeAccess": "Remove Access", "inviteSent": "Invitation sent successfully!", "inviteFailed": "Failed to send invitation.", "inviteCancelled": "Invitation cancelled.", "memberRemoved": "User removed.", "actionFailed": "Action failed.", - "acceptInvitation": "Accept Invitation", "invitedToJoin": "You've been invited to join", "setPassword": "Set Password", "minimumCharsHint": "Minimum 8 characters", "repeatPasswordHint": "Repeat password", "activating": "Activating...", "activateAccount": "Activate Account", "accountActivated": "Account activated! Redirecting...", "noTokenFound": "No invitation token found in the link.", "invalidInvite": "Invalid or expired invitation.", "passwordMismatch": "Passwords do not match.", "passwordTooShort": "Password must be at least 8 characters.", "activationFailed": "Failed to activate account.", - "enclosures": "Enclosures", "enclosure": "Enclosure", "areas": "Areas", "area": "Area", "enclosuresDescription": "Physical management of collections by site location.", "enableEnclosures": "Enable Enclosures", "enableAreas": "Enable Areas", "enableEnclosuresModuleDesc": "Enable advanced mapping and species grouping by physical location.", "orgWideView": "Organization-Wide View", "networkDescription": "Discover other organizations and establish breeding partnerships.", "myPartners": "My Partners", "plantMapDescription": "Spatial distribution and precise physical tracking of your botanical collection.", "allManagedAreas": "All Managed Areas", "projectScope": "Project Scope", "hideLabels": "Hide Labels", "showLabels": "Show Labels", "noProjectsFound": "No Projects Found", - "history": "History", "genetics": "Genetics", "editProfile": "Edit Profile", "sex": "Sex", "birthDate": "Birth Date", "planted": "Planted", "deathDate": "Death Date", "removed": "Removed", "acquisitionSource": "Acquisition Source", "sourceDetails": "Source Details", "loanStatus": "Loan Status", "transferred": "Transferred", "transferNote": "Transfer Note", "lifeExpectancyShort": "Life Expectancy", "sexualMaturityShort": "Sexual Maturity", "avgAdultWeight": "Avg Adult Weight", "avgAdultHeight": "Avg Adult Height", "breedingSeason": "Breeding Season", "nativeStatus": "Native Status", "speciesInfo": "Species Info", "viewInSpeciesRegistry": "View in Species Registry", "location": "Location", "noCoordinatesAssigned": "No coordinates assigned", "setLocation": "Set Location", "weightTrend": "Weight Trend", "growthTrend": "Growth Trend", "logWeight": "Log Weight", "logHeight": "Log Height", "addObservation": "Add Observation", "parentage": "Parentage", "sire": "Sire", "dam": "Dam", "performedBy": "Performed By", "speciesDetail": "Species Detail", "weightHistory": "Weight History", "healthHistory": "Health History" + "dashboard": "Dashboard", + "networkMap": "Network", + "plantMap": "Flora Map", + "species": "Species", + "individuals": "Individuals", + "breeding": "Breeding", + "usersRoles": "Users & Roles", + "organization": "Organization", + "superAdmin": "Super Admin", + "signOut": "Sign Out", + "currentProject": "Current Project", + "allProjects": "All Projects", + "createNewProject": "Create New Project", + "landingTitle": "Open Source Captive Breeding Management", + "landingSubtitle": "OpenStudbook is an open-source platform for zoos, aquariums, and botanical gardens to manage species populations and track genetics.", + "createOrg": "Create Organization", + "exploreDemo": "Explore Demo", + "demoLogin": "Demo Login", + "getStarted": "Get Started", + "securePrivate": "Secure & Private", + "securePrivateDesc": "Your data is yours. Choose exactly what to share.", + "floraFauna": "Fauna & Flora", + "floraFaunaDesc": "Unified management for animals and plants.", + "globalNetwork": "Global Network", + "globalNetworkDesc": "Connect with partners worldwide.", + "back": "Back", + "registerOrg": "Register Organization", + "orgName": "Organization Name", + "orgFocus": "Focus", + "orgFocusExplanation": "Selecting the focus will pre-enable features most relevant to your organisation. You still have access to everything via organisation settings.", + "faunaManagement": "Fauna Management", + "floraManagement": "Flora Management", + "cityLocation": "City / Location", + "adminDetails": "Admin Account Details", + "yourFullName": "Your Full Name", + "workEmail": "Work Email", + "password": "Password", + "confirmPassword": "Confirm Password", + "verifyEmailAndContinue": "Verify Email & Continue", + "signIn": "Sign In", + "welcomeBack": "Welcome Back", + "signInSubtitle": "Sign in to your organisation.", + "forgotPassword": "Forgot Password?", + "needAccount": "Need an account? Register here", + "backToLanding": "Back to Landing", + "about": "About", + "privacyPolicy": "Privacy Policy", + "termsConditions": "Terms & Conditions", + "overview": "Overview", + "welcomeBackDashboard": "Welcome back to your organization dashboard.", + "totalSpecies": "Total Species", + "totalIndividuals": "Total Individuals", + "endangeredSpecies": "Endangered Species", + "activeUsers": "Active Users", + "breedingPairs": "Suggested Breeding Pairs", + "match": "Match", + "noBreeding": "No breeding recommendations available at this time.", + "popDist": "Population Distribution", + "consStatus": "Conservation Status Ratio", + "origin": "Population Origin", + "ageDist": "Age & Sex Distribution", + "wildCaught": "Wild Caught", + "captiveBred": "Captive Bred", + "unknownOrigin": "Unknown Origin", + "males": "Males", + "females": "Females", + "unknownSex": "Unknown", + "years": "years", + "orgSettings": "Organization Settings", + "orgSettingsSubtitle": "Manage your zoo or sanctuary details and privacy.", + "locationName": "Location Name (City/State)", + "geoLocation": "Geo-Location (Map)", + "description": "Description", + "projectManagement": "Project Management", + "projectManagementDesc": "Create, edit, or delete projects. Transfer species between projects.", + "dataManagement": "Data Management", + "dataManagementDesc": "Export your data for safekeeping or transfer it to another system.", + "saveChanges": "Save Changes", + "saved": "Saved!", + "speciesDatabase": "Species Database", + "speciesSubtitle": "Catalog and manage the biological profiles of your collection.", + "commonName": "Common Name", + "commonNamePlaceholder": "e.g. Red Panda", + "scientificName": "Scientific Name", + "scientificNamePlaceholder": "e.g. Ailurus fulgens", + "type": "Kingdom", + "animal": "Fauna", + "plant": "Flora", + "conservationStatus": "Conservation Status", + "sexualMaturity": "Sexual Maturity (Years)", + "lifeExpectancy": "Life Expectancy (Years)", + "autofill": "Autofill", + "aiGenerate": "AI Illustration", + "cancel": "Cancel", + "save": "Save", + "add": "Add", + "searchSpecies": "Search Species...", + "searchIndividuals": "Search Individuals...", + "indivSubtitleAnimal": "Track and manage the individuals in your care.", + "updateIndividual": "Update Individual", + "registerIndividual": "Register Individual", + "representativeImage": "Representative Image", + "upload": "Upload", + "noImageProvided": "No image provided", + "saveSpecies": "Save Species", + "updateSpecies": "Update Species", + "lifespan": "Lifespan", + "maturity": "Maturity", + "noSpeciesFound": "No species found", + "adultWeight": "Adult Weight", + "classification": "Classification", + "monoecious": "Monoecious", + "dioecious": "Dioecious", + "maturityFlowering": "Maturity / Flowering", + "studbookId": "Studbook ID", + "name": "Name", + "saSubtitle": "Global system management and oversight.", + "security": "Security", + "email": "Email", + "landing": "Landing", + "localisation": "Localisation", + "network": "Network", + "cacheManage": "Local Cache Management", + "createOrgBtn": "Create Organisation", + "loginAs": "Login As", + "hostTag": "Host", + "smtpTestSuccess": "SMTP test sent successfully!", + "smtpSettings": "SMTP Settings", + "smtpHost": "SMTP Host", + "port": "Port", + "username": "Username", + "secureConnection": "Secure Connection (SSL/TLS)", + "saveSettings": "Save Settings", + "securitySettings": "Security Settings", + "enableMfa": "Enable Two-Factor Auth", + "enableOrgMfa": "Force Org Two-Factor Auth", + "enableOrgMfaDesc": "Require all members of this organization to use MFA.", + "theming": "Theming", + "primaryColor": "Primary Color", + "appLogo": "App Logo", + "uploadLogo": "Upload Logo", + "customCss": "Custom CSS", + "enableRegistration": "Enable Registration", + "featureCards": "Feature Cards", + "addLanguage": "Add Language", + "supportedLanguages": "Supported Languages", + "heroTitle": "Hero Title", + "heroSubtitle": "Hero Subtitle", + "staticPages": "Static Pages", + "clearCacheBtn": "Purge Local Data", + "allOrganizations": "All Organizations", + "searchName": "Search by name...", + "emailVerifySubject": "Verify your email", + "emailVerifyBody": "

Your verification code is: {{code}}

", + "emailInviteSubject": "Invitation to join {{orgName}}", + "emailInviteBody": "

Hello {{userName}},

You have been invited to join the management team at {{orgName}}.

Please click the link below to confirm your account and set your password:

Confirm My Account

If the button doesn't work, copy and paste this URL into your browser:
{{inviteUrl}}

", + "emailNotifySubject": "System Notification", + "emailNotifyBody": "

Hello,

{{message}}

", + "registration": "User Registration", + "mfa": "Two-Factor Auth", + "invite": "Team Invitation", + "notification": "System Alerts", + "teamMembers": "Team Members", + "teamSubtitle": "Manage your team's access and permissions.", + "bulkInvite": "Bulk Invite", + "inviteMember": "Invite Member", + "csvFormatTitle": "CSV Format", + "csvFormatDesc": "Download our template to ensure your CSV is formatted correctly.", + "processingBulk": "Processing bulk invitations...", + "selectSpecies": "Select Species", + "saveEvent": "Save Event", + "breedingSubtitle": "Track and manage breeding pairs and outcomes.", + "recordBreedingEvent": "Record Event", + "newBreedingLoan": "New Loan", + "breedingEvents": "Events", + "breedingLoans": "Loans", + "viewTitle": "Filter View", + "includePartnerOrgs": "Include Partner Events", + "onboardingWelcome": "Welcome to OpenStudbook", + "onboardingSettingsTask": "Please review your organization settings below and click 'Save Changes' to continue.", + "onboardingSaveAndNext": "Save & Continue to Species", + "onboardingSpeciesTask": "Great! Now add your first species to start building your collection.", + "onboardingIndivTask": "Finally, register individual specimens to track their growth and history.", + "enablePage": "Enable Feature", + "dashBlockTitle": "Dashboard Message Title", + "dashBlockContent": "Dashboard Message Content", + "customDashBlock": "Custom Dashboard Announcement", + "customDashBlockDesc": "Create a custom announcement block that appears on the top of the dashboard for all users.", + "visibilityPrivacy": "Visibility & Privacy", + "breedingLoanPolicy": "Breeding & Loan Policy", + "allowBreedingRequests": "Allow Network Requests", + "allowBreedingRequestsDesc": "Allow partner organizations to propose breeding loans via the network map.", + "whoReceivesRequests": "Request Contact", + "whoReceivesRequestsDesc": "Which user should be notified when a loan request is received?", + "orgVisibility": "List in Directory", + "orgVisibilityDesc": "Make your organization visible on the global network map.", + "obscureLocation": "Obscure Map Location", + "obscureLocationDesc": "Masks your location on the network map to within approximately 10 miles of your actual site.", + "speciesListVisibility": "Public Species List", + "speciesListVisibilityDesc": "Allow anyone on the network to see which species you manage.", + "noPartnersFound": "No partners found.", + "connectNewPartner": "Connect New Partner", + "yourInviteCode": "Your Invite Code", + "redeemCode": "Redeem Code", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "dashboardReady": "Your dashboard is ready", + "dashboardReadyDesc": "Metrics, charts, and breeding insights will all appear here once you've added some species and individuals to your collection.", + "addSpecies": "Add a Species", + "addIndividual": "Add an Individual", + "fullName": "Full Name", + "preferredLanguage": "Preferred Language", + "emailAddress": "Email Address", + "superAdminOnly": "(Super Admin Only)", + "projectAccess": "Project Access", + "globalAccessAll": "Global (All Present & Future)", + "restrictedSpecific": "Restricted (Select Specific)", + "globalAccessInfo": "This user will have access to all projects by default and can switch between them using the project navigator.", + "sendInvitation": "Send Invitation", + "cancelInvitation": "Cancel Invitation?", + "removeTeamMember": "Remove Team Member?", + "cancelInviteConfirm": "Are you sure you want to cancel the invitation for {{name}}? They haven't joined the organisation yet.", + "removeMemberConfirm": "Are you sure you want to remove {{name}}? They will lose all access to organisation data and projects.", + "revokeInvitation": "Revoke Invitation", + "removeAccess": "Remove Access", + "inviteSent": "Invitation sent successfully!", + "inviteFailed": "Failed to send invitation.", + "inviteCancelled": "Invitation cancelled.", + "memberRemoved": "User removed.", + "actionFailed": "Action failed.", + "acceptInvitation": "Accept Invitation", + "invitedToJoin": "You've been invited to join", + "setPassword": "Set Password", + "minimumCharsHint": "Minimum 8 characters", + "repeatPasswordHint": "Repeat password", + "activating": "Activating...", + "activateAccount": "Activate Account", + "accountActivated": "Account activated! Redirecting...", + "noTokenFound": "No invitation token found in the link.", + "invalidInvite": "Invalid or expired invitation.", + "passwordMismatch": "Passwords do not match.", + "passwordTooShort": "Password must be at least 8 characters.", + "activationFailed": "Failed to activate account.", + "enclosures": "Enclosures", + "enclosure": "Enclosure", + "areas": "Areas", + "area": "Area", + "enclosuresDescription": "Physical management of collections by site location.", + "enableEnclosures": "Enable Enclosures", + "enableAreas": "Enable Areas", + "enableEnclosuresModuleDesc": "Enable advanced mapping and species grouping by physical location.", + "orgWideView": "Organization-Wide View", + "networkDescription": "Discover other organizations and establish breeding partnerships.", + "myPartners": "My Partners", + "plantMapDescription": "Spatial distribution and precise physical tracking of your botanical collection.", + "allManagedAreas": "All Managed Areas", + "projectScope": "Project Scope", + "hideLabels": "Hide Labels", + "showLabels": "Show Labels", + "noProjectsFound": "No Projects Found", + "history": "History", + "genetics": "Genetics", + "editProfile": "Edit Profile", + "sex": "Sex", + "birthDate": "Birth Date", + "planted": "Planted", + "deathDate": "Death Date", + "removed": "Removed", + "acquisitionSource": "Acquisition Source", + "sourceDetails": "Source Details", + "loanStatus": "Loan Status", + "transferred": "Transferred", + "transferNote": "Transfer Note", + "lifeExpectancyShort": "Life Expectancy", + "sexualMaturityShort": "Sexual Maturity", + "avgAdultWeight": "Avg Adult Weight", + "avgAdultHeight": "Avg Adult Height", + "breedingSeason": "Breeding Season", + "nativeStatus": "Native Status", + "speciesInfo": "Species Info", + "viewInSpeciesRegistry": "View in Species Registry", + "location": "Location", + "noCoordinatesAssigned": "No coordinates assigned", + "setLocation": "Set Location", + "weightTrend": "Weight Trend", + "growthTrend": "Growth Trend", + "logWeight": "Log Weight", + "logHeight": "Log Height", + "addObservation": "Add Observation", + "parentage": "Parentage", + "sire": "Sire", + "dam": "Dam", + "performedBy": "Performed By", + "speciesDetail": "Species Detail", + "weightHistory": "Weight History", + "healthHistory": "Health History", + "hideOrgName": "Hide Organization Name", + "hideOrgNameDesc": "Display as 'Anonymous Organization' on the network map.", + "speciesListVisibilityNote": "Only visible to registered network partners.", + "showNativeStatus": "Show Native Status Badges", + "showNativeStatusDesc": "Display native/non-native/invasive status indicators on species cards and individual profiles.", + "locationMapNotice": "Adding an accurate location for your organization is important for the mapping functionality across the app. Please set a location and review the privacy settings below.", + "useMyLocation": "Use My Current Location", + "addToHomeScreen": "Add to Home Screen", + "iosInstallHint": "In Safari, tap the Share button at the bottom of the screen, then tap 'Add to Home Screen'." } }, { @@ -56,24 +628,297 @@ "name": "Bahasa Indonesia", "isDefault": false, "translations": { - "dashboard": "Dasbor", "networkMap": "Jaringan", "plantMap": "Peta Flora", "species": "Spesies", "individuals": "Individu", "breeding": "Pembiakan", "usersRoles": "Pengguna & Peran", "organization": "Organisasi", "superAdmin": "Admin Super", "signOut": "Keluar", "currentProject": "Proyek Saat Ini", "allProjects": "Semua Proyek", "createNewProject": "Buat Proyek Baru", - "landingTitle": "Manajemen Pembiakan Tangkaran Open Source", "landingSubtitle": "OpenStudbook adalah platform open-source untuk kebun binatang, akuarium, dan kebun raya untuk mengelola populasi spesies dan melacak genetika.", "createOrg": "Buat Organisasi", "exploreDemo": "Jelajahi Demo", "demoLogin": "Login Demo", "getStarted": "Mulai", "securePrivate": "Aman & Pribadi", "securePrivateDesc": "Data Anda adalah milik Anda. Pilih apa yang ingin Anda bagikan.", "floraFauna": "Fauna & Flora", "floraFaunaDesc": "Manajemen terpadu untuk hewan dan tumbuhan.", "globalNetwork": "Jaringan Global", "globalNetworkDesc": "Terhubung dengan mitra di seluruh dunia.", "back": "Kembali", "registerOrg": "Daftarkan Organisasi", "orgName": "Nama Organisasi", "orgFocus": "Fokus", "orgFocusExplanation": "Memilih fokus akan mengaktifkan fitur yang paling relevan untuk organisasi Anda.", "faunaManagement": "Manajemen Fauna", "floraManagement": "Manajemen Flora", "cityLocation": "Kota / Lokasi", "adminDetails": "Detail Akun Admin", "yourFullName": "Nama Lengkap Anda", "workEmail": "Email Kerja", "password": "Kata Sandi", "confirmPassword": "Konfirmasi Kata Sandi", "verifyEmailAndContinue": "Verifikasi Email & Lanjutkan", "signIn": "Masuk", "welcomeBack": "Selamat Datang Kembali", "signInSubtitle": "Masuk ke organisasi Anda.", "forgotPassword": "Lupa Kata Sandi?", "needAccount": "Butuh akun? Daftar di sini", "backToLanding": "Kembali ke Beranda", - "about": "Tentang", "privacyPolicy": "Kebijakan Privasi", "termsConditions": "Syarat & Ketentuan", - "dashboardReady": "Dasbor Anda siap", "dashboardReadyDesc": "Metrik, grafik, dan wawasan pembiakan akan muncul di sini setelah Anda menambahkan spesies dan individu ke koleksi Anda.", "addSpecies": "Tambah Spesies", "addIndividual": "Tambah Individu", - "overview": "Ikhtisar", "welcomeBackDashboard": "Selamat datang kembali di dasbor organisasi Anda.", "totalSpecies": "Total Spesies", "totalIndividuals": "Total Individu", "endangeredSpecies": "Spesies Terancam", "activeUsers": "Pengguna Aktif", "breedingPairs": "Pasangan Pembiakan yang Disarankan", "match": "Kecocokan", "noBreeding": "Tidak ada rekomendasi pembiakan saat ini.", "popDist": "Distribusi Populasi", "consStatus": "Rasio Status Konservasi", "origin": "Asal Populasi", "ageDist": "Distribusi Usia & Jenis Kelamin", "wildCaught": "Tangkapan Liar", "captiveBred": "Dibesarkan di Penangkaran", "unknownOrigin": "Asal Tidak Diketahui", "males": "Jantan", "females": "Betina", "unknownSex": "Tidak Diketahui", "years": "tahun", - "orgSettings": "Pengaturan Organisasi", "orgSettingsSubtitle": "Kelola detail kebun binatang atau tempat perlindungan Anda.", "locationName": "Nama Lokasi (Kota/Provinsi)", "geoLocation": "Geo-Lokasi (Peta)", "description": "Deskripsi", "projectManagement": "Manajemen Proyek", "projectManagementDesc": "Buat, edit, atau hapus proyek. Transfer spesies antar proyek.", "dataManagement": "Manajemen Data", "dataManagementDesc": "Ekspor data Anda untuk disimpan atau transfer ke sistem lain.", "saveChanges": "Simpan Perubahan", "saved": "Tersimpan!", - "speciesDatabase": "Basis Data Spesies", "speciesSubtitle": "Katalog dan kelola profil biologis koleksi Anda.", "commonName": "Nama Umum", "commonNamePlaceholder": "mis. Panda Merah", "scientificName": "Nama Ilmiah", "scientificNamePlaceholder": "mis. Ailurus fulgens", "type": "Kerajaan", "animal": "Fauna", "plant": "Flora", "conservationStatus": "Status Konservasi", "sexualMaturity": "Kematangan Seksual (Tahun)", "lifeExpectancy": "Harapan Hidup (Tahun)", "autofill": "Isi Otomatis", "aiGenerate": "Ilustrasi AI", "cancel": "Batal", "save": "Simpan", "add": "Tambah", "searchSpecies": "Cari Spesies...", "searchIndividuals": "Cari Individu...", - "indivSubtitleAnimal": "Lacak dan kelola individu dalam perawatan Anda.", "updateIndividual": "Perbarui Individu", "registerIndividual": "Daftarkan Individu", "representativeImage": "Gambar Representatif", "upload": "Unggah", "noImageProvided": "Tidak ada gambar", "saveSpecies": "Simpan Spesies", "updateSpecies": "Perbarui Spesies", "lifespan": "Masa Hidup", "maturity": "Kematangan", "noSpeciesFound": "Spesies tidak ditemukan", "adultWeight": "Berat Dewasa", "classification": "Klasifikasi", "monoecious": "Berumah Satu", "dioecious": "Berumah Dua", "maturityFlowering": "Kematangan / Pembungaan", "studbookId": "ID Studbook", "name": "Nama", - "saSubtitle": "Manajemen dan pengawasan sistem global.", "security": "Keamanan", "email": "Email", "landing": "Beranda", "localisation": "Lokalisasi", "network": "Jaringan", "cacheManage": "Manajemen Cache Lokal", "createOrgBtn": "Buat Organisasi", "loginAs": "Masuk Sebagai", "hostTag": "Host", "smtpTestSuccess": "Uji SMTP berhasil dikirim!", "smtpSettings": "Pengaturan SMTP", "smtpHost": "Host SMTP", "port": "Port", "username": "Nama Pengguna", "secureConnection": "Koneksi Aman (SSL/TLS)", "saveSettings": "Simpan Pengaturan", "securitySettings": "Pengaturan Keamanan", "enableMfa": "Aktifkan Autentikasi Dua Faktor", "enableOrgMfa": "Wajibkan MFA Organisasi", "enableOrgMfaDesc": "Wajibkan semua anggota organisasi ini menggunakan MFA.", "theming": "Tema", "primaryColor": "Warna Utama", "appLogo": "Logo Aplikasi", "uploadLogo": "Unggah Logo", "customCss": "CSS Kustom", "enableRegistration": "Aktifkan Pendaftaran", "featureCards": "Kartu Fitur", "addLanguage": "Tambah Bahasa", "supportedLanguages": "Bahasa yang Didukung", "heroTitle": "Judul Hero", "heroSubtitle": "Subjudul Hero", "staticPages": "Halaman Statis", "clearCacheBtn": "Hapus Data Lokal", "allOrganizations": "Semua Organisasi", "searchName": "Cari berdasarkan nama...", - "emailVerifySubject": "Verifikasi email Anda", "emailVerifyBody": "

Kode verifikasi Anda adalah: {{code}}

", "emailInviteSubject": "Undangan bergabung dengan {{orgName}}", "emailInviteBody": "

Halo {{userName}},

Anda telah diundang bergabung dengan tim manajemen di {{orgName}}.

Klik tautan di bawah untuk mengkonfirmasi akun dan mengatur kata sandi:

Konfirmasi Akun Saya

Jika tombol tidak berfungsi, salin URL ini:
{{inviteUrl}}

", "emailNotifySubject": "Notifikasi Sistem", "emailNotifyBody": "

Halo,

{{message}}

", - "registration": "Pendaftaran Pengguna", "mfa": "Autentikasi Dua Faktor", "invite": "Undangan Tim", "notification": "Peringatan Sistem", - "teamMembers": "Anggota Tim", "teamSubtitle": "Kelola akses dan izin tim Anda.", "bulkInvite": "Undangan Massal", "inviteMember": "Undang Anggota", "csvFormatTitle": "Format CSV", "csvFormatDesc": "Unduh template kami untuk memastikan CSV Anda diformat dengan benar.", "processingBulk": "Memproses undangan massal...", "selectSpecies": "Pilih Spesies", "saveEvent": "Simpan Acara", "breedingSubtitle": "Lacak dan kelola pasangan pembiakan dan hasilnya.", "recordBreedingEvent": "Catat Acara", "newBreedingLoan": "Pinjaman Baru", "breedingEvents": "Acara", "breedingLoans": "Pinjaman", "viewTitle": "Filter Tampilan", "includePartnerOrgs": "Sertakan Acara Mitra", - "onboardingWelcome": "Selamat Datang di OpenStudbook", "onboardingSettingsTask": "Tinjau pengaturan organisasi Anda di bawah dan klik 'Simpan Perubahan' untuk melanjutkan.", "onboardingSaveAndNext": "Simpan & Lanjutkan ke Spesies", "onboardingSpeciesTask": "Bagus! Tambahkan spesies pertama Anda untuk mulai membangun koleksi.", "onboardingIndivTask": "Terakhir, daftarkan individu untuk melacak pertumbuhan dan riwayat mereka.", - "enablePage": "Aktifkan Fitur", "dashBlockTitle": "Judul Pesan Dasbor", "dashBlockContent": "Konten Pesan Dasbor", "customDashBlock": "Pengumuman Dasbor Kustom", "customDashBlockDesc": "Buat blok pengumuman yang muncul di bagian atas dasbor untuk semua pengguna.", "visibilityPrivacy": "Visibilitas & Privasi", "breedingLoanPolicy": "Kebijakan Pembiakan & Pinjaman", "allowBreedingRequests": "Izinkan Permintaan Jaringan", "allowBreedingRequestsDesc": "Izinkan organisasi mitra mengusulkan pinjaman pembiakan melalui peta jaringan.", "whoReceivesRequests": "Kontak Permintaan", "whoReceivesRequestsDesc": "Pengguna mana yang diberitahu saat permintaan pinjaman diterima?", "orgVisibility": "Daftarkan dalam Direktori", "orgVisibilityDesc": "Buat organisasi Anda terlihat di peta jaringan global.", "obscureLocation": "Samarkan Lokasi Peta", "obscureLocationDesc": "Bulatkan koordinat peta untuk mencegah pelacakan lokasi yang tepat.", "speciesListVisibility": "Daftar Spesies Publik", "speciesListVisibilityDesc": "Izinkan siapa saja di jaringan melihat spesies yang Anda kelola.", - "noPartnersFound": "Tidak ada mitra ditemukan.", "connectNewPartner": "Hubungkan Mitra Baru", "yourInviteCode": "Kode Undangan Anda", "redeemCode": "Tukarkan Kode", "siteKey": "Kunci Situs", "secretKey": "Kunci Rahasia", - "fullName": "Nama Lengkap", "preferredLanguage": "Bahasa Pilihan", "emailAddress": "Alamat Email", "superAdminOnly": "(Hanya Super Admin)", "projectAccess": "Akses Proyek", "globalAccessAll": "Global (Semua Sekarang & Masa Depan)", "restrictedSpecific": "Terbatas (Pilih Spesifik)", "globalAccessInfo": "Pengguna ini akan memiliki akses ke semua proyek secara default dan dapat beralih di antara mereka menggunakan navigator proyek.", "sendInvitation": "Kirim Undangan", "cancelInvitation": "Batalkan Undangan?", "removeTeamMember": "Hapus Anggota Tim?", "cancelInviteConfirm": "Apakah Anda yakin ingin membatalkan undangan untuk {{name}}? Mereka belum bergabung dengan organisasi.", "removeMemberConfirm": "Apakah Anda yakin ingin menghapus {{name}}? Mereka akan kehilangan semua akses ke data dan proyek organisasi.", "revokeInvitation": "Cabut Undangan", "removeAccess": "Hapus Akses", "inviteSent": "Undangan berhasil dikirim!", "inviteFailed": "Gagal mengirim undangan.", "inviteCancelled": "Undangan dibatalkan.", "memberRemoved": "Pengguna dihapus.", "actionFailed": "Tindakan gagal.", - "acceptInvitation": "Terima Undangan", "invitedToJoin": "Anda telah diundang untuk bergabung", "setPassword": "Atur Kata Sandi", "minimumCharsHint": "Minimal 8 karakter", "repeatPasswordHint": "Ulangi kata sandi", "activating": "Mengaktifkan...", "activateAccount": "Aktifkan Akun", "accountActivated": "Akun diaktifkan! Mengalihkan...", "noTokenFound": "Tidak ada token undangan yang ditemukan dalam tautan.", "invalidInvite": "Undangan tidak valid atau sudah kedaluwarsa.", "passwordMismatch": "Kata sandi tidak cocok.", "passwordTooShort": "Kata sandi harus minimal 8 karakter.", "activationFailed": "Gagal mengaktifkan akun.", - "history": "Riwayat", "genetics": "Genetika", "editProfile": "Edit Profil", "sex": "Jenis Kelamin", "birthDate": "Tanggal Lahir", "planted": "Ditanam", "deathDate": "Tanggal Kematian", "removed": "Disingkirkan", "acquisitionSource": "Sumber Perolehan", "sourceDetails": "Detail Sumber", "loanStatus": "Status Pinjaman", "transferred": "Dipindahkan", "transferNote": "Catatan Transfer", "lifeExpectancyShort": "Harapan Hidup", "sexualMaturityShort": "Kematangan Seksual", "avgAdultWeight": "Berat Dewasa Rata-rata", "avgAdultHeight": "Tinggi Dewasa Rata-rata", "breedingSeason": "Musim Kawin", "nativeStatus": "Status Asli", "speciesInfo": "Informasi Spesies", "viewInSpeciesRegistry": "Lihat di Registri", "location": "Lokasi", "noCoordinatesAssigned": "Tidak ada koordinat", "setLocation": "Tetapkan Lokasi", "weightTrend": "Tren Berat", "growthTrend": "Tren Pertumbuhan", "logWeight": "Catat Berat", "logHeight": "Catat Tinggi", "addObservation": "Tambah Observasi", "parentage": "Keturunan", "sire": "Ayah", "dam": "Induk", "performedBy": "Dilakukan Oleh", "speciesDetail": "Detail Spesies", "weightHistory": "Riwayat Berat", "healthHistory": "Riwayat Kesehatan" + "dashboard": "Dasbor", + "networkMap": "Jaringan", + "plantMap": "Peta Flora", + "species": "Spesies", + "individuals": "Individu", + "breeding": "Pembiakan", + "usersRoles": "Pengguna & Peran", + "organization": "Organisasi", + "superAdmin": "Admin Super", + "signOut": "Keluar", + "currentProject": "Proyek Saat Ini", + "allProjects": "Semua Proyek", + "createNewProject": "Buat Proyek Baru", + "landingTitle": "Manajemen Pembiakan Tangkaran Open Source", + "landingSubtitle": "OpenStudbook adalah platform open-source untuk kebun binatang, akuarium, dan kebun raya untuk mengelola populasi spesies dan melacak genetika.", + "createOrg": "Buat Organisasi", + "exploreDemo": "Jelajahi Demo", + "demoLogin": "Login Demo", + "getStarted": "Mulai", + "securePrivate": "Aman & Pribadi", + "securePrivateDesc": "Data Anda adalah milik Anda. Pilih apa yang ingin Anda bagikan.", + "floraFauna": "Fauna & Flora", + "floraFaunaDesc": "Manajemen terpadu untuk hewan dan tumbuhan.", + "globalNetwork": "Jaringan Global", + "globalNetworkDesc": "Terhubung dengan mitra di seluruh dunia.", + "back": "Kembali", + "registerOrg": "Daftarkan Organisasi", + "orgName": "Nama Organisasi", + "orgFocus": "Fokus", + "orgFocusExplanation": "Memilih fokus akan mengaktifkan fitur yang paling relevan untuk organisasi Anda.", + "faunaManagement": "Manajemen Fauna", + "floraManagement": "Manajemen Flora", + "cityLocation": "Kota / Lokasi", + "adminDetails": "Detail Akun Admin", + "yourFullName": "Nama Lengkap Anda", + "workEmail": "Email Kerja", + "password": "Kata Sandi", + "confirmPassword": "Konfirmasi Kata Sandi", + "verifyEmailAndContinue": "Verifikasi Email & Lanjutkan", + "signIn": "Masuk", + "welcomeBack": "Selamat Datang Kembali", + "signInSubtitle": "Masuk ke organisasi Anda.", + "forgotPassword": "Lupa Kata Sandi?", + "needAccount": "Butuh akun? Daftar di sini", + "backToLanding": "Kembali ke Beranda", + "about": "Tentang", + "privacyPolicy": "Kebijakan Privasi", + "termsConditions": "Syarat & Ketentuan", + "dashboardReady": "Dasbor Anda siap", + "dashboardReadyDesc": "Metrik, grafik, dan wawasan pembiakan akan muncul di sini setelah Anda menambahkan spesies dan individu ke koleksi Anda.", + "addSpecies": "Tambah Spesies", + "addIndividual": "Tambah Individu", + "overview": "Ikhtisar", + "welcomeBackDashboard": "Selamat datang kembali di dasbor organisasi Anda.", + "totalSpecies": "Total Spesies", + "totalIndividuals": "Total Individu", + "endangeredSpecies": "Spesies Terancam", + "activeUsers": "Pengguna Aktif", + "breedingPairs": "Pasangan Pembiakan yang Disarankan", + "match": "Kecocokan", + "noBreeding": "Tidak ada rekomendasi pembiakan saat ini.", + "popDist": "Distribusi Populasi", + "consStatus": "Rasio Status Konservasi", + "origin": "Asal Populasi", + "ageDist": "Distribusi Usia & Jenis Kelamin", + "wildCaught": "Tangkapan Liar", + "captiveBred": "Dibesarkan di Penangkaran", + "unknownOrigin": "Asal Tidak Diketahui", + "males": "Jantan", + "females": "Betina", + "unknownSex": "Tidak Diketahui", + "years": "tahun", + "orgSettings": "Pengaturan Organisasi", + "orgSettingsSubtitle": "Kelola detail kebun binatang atau tempat perlindungan Anda.", + "locationName": "Nama Lokasi (Kota/Provinsi)", + "geoLocation": "Geo-Lokasi (Peta)", + "description": "Deskripsi", + "projectManagement": "Manajemen Proyek", + "projectManagementDesc": "Buat, edit, atau hapus proyek. Transfer spesies antar proyek.", + "dataManagement": "Manajemen Data", + "dataManagementDesc": "Ekspor data Anda untuk disimpan atau transfer ke sistem lain.", + "saveChanges": "Simpan Perubahan", + "saved": "Tersimpan!", + "speciesDatabase": "Basis Data Spesies", + "speciesSubtitle": "Katalog dan kelola profil biologis koleksi Anda.", + "commonName": "Nama Umum", + "commonNamePlaceholder": "mis. Panda Merah", + "scientificName": "Nama Ilmiah", + "scientificNamePlaceholder": "mis. Ailurus fulgens", + "type": "Kerajaan", + "animal": "Fauna", + "plant": "Flora", + "conservationStatus": "Status Konservasi", + "sexualMaturity": "Kematangan Seksual (Tahun)", + "lifeExpectancy": "Harapan Hidup (Tahun)", + "autofill": "Isi Otomatis", + "aiGenerate": "Ilustrasi AI", + "cancel": "Batal", + "save": "Simpan", + "add": "Tambah", + "searchSpecies": "Cari Spesies...", + "searchIndividuals": "Cari Individu...", + "indivSubtitleAnimal": "Lacak dan kelola individu dalam perawatan Anda.", + "updateIndividual": "Perbarui Individu", + "registerIndividual": "Daftarkan Individu", + "representativeImage": "Gambar Representatif", + "upload": "Unggah", + "noImageProvided": "Tidak ada gambar", + "saveSpecies": "Simpan Spesies", + "updateSpecies": "Perbarui Spesies", + "lifespan": "Masa Hidup", + "maturity": "Kematangan", + "noSpeciesFound": "Spesies tidak ditemukan", + "adultWeight": "Berat Dewasa", + "classification": "Klasifikasi", + "monoecious": "Berumah Satu", + "dioecious": "Berumah Dua", + "maturityFlowering": "Kematangan / Pembungaan", + "studbookId": "ID Studbook", + "name": "Nama", + "saSubtitle": "Manajemen dan pengawasan sistem global.", + "security": "Keamanan", + "email": "Email", + "landing": "Beranda", + "localisation": "Lokalisasi", + "network": "Jaringan", + "cacheManage": "Manajemen Cache Lokal", + "createOrgBtn": "Buat Organisasi", + "loginAs": "Masuk Sebagai", + "hostTag": "Host", + "smtpTestSuccess": "Uji SMTP berhasil dikirim!", + "smtpSettings": "Pengaturan SMTP", + "smtpHost": "Host SMTP", + "port": "Port", + "username": "Nama Pengguna", + "secureConnection": "Koneksi Aman (SSL/TLS)", + "saveSettings": "Simpan Pengaturan", + "securitySettings": "Pengaturan Keamanan", + "enableMfa": "Aktifkan Autentikasi Dua Faktor", + "enableOrgMfa": "Wajibkan MFA Organisasi", + "enableOrgMfaDesc": "Wajibkan semua anggota organisasi ini menggunakan MFA.", + "theming": "Tema", + "primaryColor": "Warna Utama", + "appLogo": "Logo Aplikasi", + "uploadLogo": "Unggah Logo", + "customCss": "CSS Kustom", + "enableRegistration": "Aktifkan Pendaftaran", + "featureCards": "Kartu Fitur", + "addLanguage": "Tambah Bahasa", + "supportedLanguages": "Bahasa yang Didukung", + "heroTitle": "Judul Hero", + "heroSubtitle": "Subjudul Hero", + "staticPages": "Halaman Statis", + "clearCacheBtn": "Hapus Data Lokal", + "allOrganizations": "Semua Organisasi", + "searchName": "Cari berdasarkan nama...", + "emailVerifySubject": "Verifikasi email Anda", + "emailVerifyBody": "

Kode verifikasi Anda adalah: {{code}}

", + "emailInviteSubject": "Undangan bergabung dengan {{orgName}}", + "emailInviteBody": "

Halo {{userName}},

Anda telah diundang bergabung dengan tim manajemen di {{orgName}}.

Klik tautan di bawah untuk mengkonfirmasi akun dan mengatur kata sandi:

Konfirmasi Akun Saya

Jika tombol tidak berfungsi, salin URL ini:
{{inviteUrl}}

", + "emailNotifySubject": "Notifikasi Sistem", + "emailNotifyBody": "

Halo,

{{message}}

", + "registration": "Pendaftaran Pengguna", + "mfa": "Autentikasi Dua Faktor", + "invite": "Undangan Tim", + "notification": "Peringatan Sistem", + "teamMembers": "Anggota Tim", + "teamSubtitle": "Kelola akses dan izin tim Anda.", + "bulkInvite": "Undangan Massal", + "inviteMember": "Undang Anggota", + "csvFormatTitle": "Format CSV", + "csvFormatDesc": "Unduh template kami untuk memastikan CSV Anda diformat dengan benar.", + "processingBulk": "Memproses undangan massal...", + "selectSpecies": "Pilih Spesies", + "saveEvent": "Simpan Acara", + "breedingSubtitle": "Lacak dan kelola pasangan pembiakan dan hasilnya.", + "recordBreedingEvent": "Catat Acara", + "newBreedingLoan": "Pinjaman Baru", + "breedingEvents": "Acara", + "breedingLoans": "Pinjaman", + "viewTitle": "Filter Tampilan", + "includePartnerOrgs": "Sertakan Acara Mitra", + "onboardingWelcome": "Selamat Datang di OpenStudbook", + "onboardingSettingsTask": "Tinjau pengaturan organisasi Anda di bawah dan klik 'Simpan Perubahan' untuk melanjutkan.", + "onboardingSaveAndNext": "Simpan & Lanjutkan ke Spesies", + "onboardingSpeciesTask": "Bagus! Tambahkan spesies pertama Anda untuk mulai membangun koleksi.", + "onboardingIndivTask": "Terakhir, daftarkan individu untuk melacak pertumbuhan dan riwayat mereka.", + "enablePage": "Aktifkan Fitur", + "dashBlockTitle": "Judul Pesan Dasbor", + "dashBlockContent": "Konten Pesan Dasbor", + "customDashBlock": "Pengumuman Dasbor Kustom", + "customDashBlockDesc": "Buat blok pengumuman yang muncul di bagian atas dasbor untuk semua pengguna.", + "visibilityPrivacy": "Visibilitas & Privasi", + "breedingLoanPolicy": "Kebijakan Pembiakan & Pinjaman", + "allowBreedingRequests": "Izinkan Permintaan Jaringan", + "allowBreedingRequestsDesc": "Izinkan organisasi mitra mengusulkan pinjaman pembiakan melalui peta jaringan.", + "whoReceivesRequests": "Kontak Permintaan", + "whoReceivesRequestsDesc": "Pengguna mana yang diberitahu saat permintaan pinjaman diterima?", + "orgVisibility": "Daftarkan dalam Direktori", + "orgVisibilityDesc": "Buat organisasi Anda terlihat di peta jaringan global.", + "obscureLocation": "Samarkan Lokasi Peta", + "obscureLocationDesc": "Menyamarkan lokasi Anda di peta jaringan dalam radius sekitar 10 mil dari lokasi sebenarnya.", + "speciesListVisibility": "Daftar Spesies Publik", + "speciesListVisibilityDesc": "Izinkan siapa saja di jaringan melihat spesies yang Anda kelola.", + "noPartnersFound": "Tidak ada mitra ditemukan.", + "connectNewPartner": "Hubungkan Mitra Baru", + "yourInviteCode": "Kode Undangan Anda", + "redeemCode": "Tukarkan Kode", + "siteKey": "Kunci Situs", + "secretKey": "Kunci Rahasia", + "fullName": "Nama Lengkap", + "preferredLanguage": "Bahasa Pilihan", + "emailAddress": "Alamat Email", + "superAdminOnly": "(Hanya Super Admin)", + "projectAccess": "Akses Proyek", + "globalAccessAll": "Global (Semua Sekarang & Masa Depan)", + "restrictedSpecific": "Terbatas (Pilih Spesifik)", + "globalAccessInfo": "Pengguna ini akan memiliki akses ke semua proyek secara default dan dapat beralih di antara mereka menggunakan navigator proyek.", + "sendInvitation": "Kirim Undangan", + "cancelInvitation": "Batalkan Undangan?", + "removeTeamMember": "Hapus Anggota Tim?", + "cancelInviteConfirm": "Apakah Anda yakin ingin membatalkan undangan untuk {{name}}? Mereka belum bergabung dengan organisasi.", + "removeMemberConfirm": "Apakah Anda yakin ingin menghapus {{name}}? Mereka akan kehilangan semua akses ke data dan proyek organisasi.", + "revokeInvitation": "Cabut Undangan", + "removeAccess": "Hapus Akses", + "inviteSent": "Undangan berhasil dikirim!", + "inviteFailed": "Gagal mengirim undangan.", + "inviteCancelled": "Undangan dibatalkan.", + "memberRemoved": "Pengguna dihapus.", + "actionFailed": "Tindakan gagal.", + "acceptInvitation": "Terima Undangan", + "invitedToJoin": "Anda telah diundang untuk bergabung", + "setPassword": "Atur Kata Sandi", + "minimumCharsHint": "Minimal 8 karakter", + "repeatPasswordHint": "Ulangi kata sandi", + "activating": "Mengaktifkan...", + "activateAccount": "Aktifkan Akun", + "accountActivated": "Akun diaktifkan! Mengalihkan...", + "noTokenFound": "Tidak ada token undangan yang ditemukan dalam tautan.", + "invalidInvite": "Undangan tidak valid atau sudah kedaluwarsa.", + "passwordMismatch": "Kata sandi tidak cocok.", + "passwordTooShort": "Kata sandi harus minimal 8 karakter.", + "activationFailed": "Gagal mengaktifkan akun.", + "history": "Riwayat", + "genetics": "Genetika", + "editProfile": "Edit Profil", + "sex": "Jenis Kelamin", + "birthDate": "Tanggal Lahir", + "planted": "Ditanam", + "deathDate": "Tanggal Kematian", + "removed": "Disingkirkan", + "acquisitionSource": "Sumber Perolehan", + "sourceDetails": "Detail Sumber", + "loanStatus": "Status Pinjaman", + "transferred": "Dipindahkan", + "transferNote": "Catatan Transfer", + "lifeExpectancyShort": "Harapan Hidup", + "sexualMaturityShort": "Kematangan Seksual", + "avgAdultWeight": "Berat Dewasa Rata-rata", + "avgAdultHeight": "Tinggi Dewasa Rata-rata", + "breedingSeason": "Musim Kawin", + "nativeStatus": "Status Asli", + "speciesInfo": "Informasi Spesies", + "viewInSpeciesRegistry": "Lihat di Registri", + "location": "Lokasi", + "noCoordinatesAssigned": "Tidak ada koordinat", + "setLocation": "Tetapkan Lokasi", + "weightTrend": "Tren Berat", + "growthTrend": "Tren Pertumbuhan", + "logWeight": "Catat Berat", + "logHeight": "Catat Tinggi", + "addObservation": "Tambah Observasi", + "parentage": "Keturunan", + "sire": "Ayah", + "dam": "Induk", + "performedBy": "Dilakukan Oleh", + "speciesDetail": "Detail Spesies", + "weightHistory": "Riwayat Berat", + "healthHistory": "Riwayat Kesehatan", + "hideOrgName": "Sembunyikan Nama Organisasi", + "hideOrgNameDesc": "Tampilkan sebagai 'Organisasi Anonim' di peta jaringan.", + "speciesListVisibilityNote": "Hanya terlihat oleh mitra jaringan terdaftar.", + "showNativeStatus": "Tampilkan Lencana Status Asli", + "showNativeStatusDesc": "Tampilkan indikator status asli/bukan asli/invasif pada kartu spesies dan profil individu.", + "locationMapNotice": "Menambahkan lokasi yang akurat untuk organisasi Anda penting untuk fungsi pemetaan di seluruh aplikasi. Silakan tetapkan lokasi dan tinjau pengaturan privasi di bawah ini.", + "useMyLocation": "Gunakan Lokasi Saya Saat Ini", + "enableEnclosures": "Aktifkan Kandang", + "enableAreas": "Aktifkan Area", + "enableEnclosuresModuleDesc": "Aktifkan pemetaan lanjutan dan pengelompokan spesies berdasarkan lokasi fisik.", + "addToHomeScreen": "Tambahkan ke Layar Utama", + "iosInstallHint": "Di Safari, ketuk tombol Bagikan di bagian bawah layar, lalu ketuk 'Tambahkan ke Layar Utama'." } }, { @@ -81,24 +926,297 @@ "name": "Bahasa Melayu", "isDefault": false, "translations": { - "dashboard": "Papan Pemuka", "networkMap": "Rangkaian", "plantMap": "Peta Flora", "species": "Spesies", "individuals": "Individu", "breeding": "Pembiakan", "usersRoles": "Pengguna & Peranan", "organization": "Organisasi", "superAdmin": "Admin Super", "signOut": "Log Keluar", "currentProject": "Projek Semasa", "allProjects": "Semua Projek", "createNewProject": "Cipta Projek Baru", - "landingTitle": "Pengurusan Pembiakan Tangkapan Sumber Terbuka", "landingSubtitle": "OpenStudbook ialah platform sumber terbuka untuk zoo, akuarium, dan taman botani bagi menguruskan populasi spesies dan mengesan genetik.", "createOrg": "Cipta Organisasi", "exploreDemo": "Terokai Demo", "demoLogin": "Log Masuk Demo", "getStarted": "Mulakan", "securePrivate": "Selamat & Peribadi", "securePrivateDesc": "Data anda adalah milik anda. Pilih apa yang ingin anda kongsi.", "floraFauna": "Fauna & Flora", "floraFaunaDesc": "Pengurusan bersepadu untuk haiwan dan tumbuhan.", "globalNetwork": "Rangkaian Global", "globalNetworkDesc": "Berhubung dengan rakan kongsi di seluruh dunia.", "back": "Kembali", "registerOrg": "Daftarkan Organisasi", "orgName": "Nama Organisasi", "orgFocus": "Fokus", "orgFocusExplanation": "Memilih fokus akan mengaktifkan ciri yang paling relevan untuk organisasi anda.", "faunaManagement": "Pengurusan Fauna", "floraManagement": "Pengurusan Flora", "cityLocation": "Bandar / Lokasi", "adminDetails": "Butiran Akaun Admin", "yourFullName": "Nama Penuh Anda", "workEmail": "E-mel Kerja", "password": "Kata Laluan", "confirmPassword": "Sahkan Kata Laluan", "verifyEmailAndContinue": "Sahkan E-mel & Teruskan", "signIn": "Log Masuk", "welcomeBack": "Selamat Datang Kembali", "signInSubtitle": "Log masuk ke organisasi anda.", "forgotPassword": "Lupa Kata Laluan?", "needAccount": "Perlukan akaun? Daftar di sini", "backToLanding": "Kembali ke Halaman Utama", - "about": "Tentang", "privacyPolicy": "Dasar Privasi", "termsConditions": "Terma & Syarat", - "dashboardReady": "Papan pemuka anda sedia", "dashboardReadyDesc": "Metrik, carta, dan maklumat pembiakan akan muncul di sini setelah anda menambah spesies dan individu ke koleksi anda.", "addSpecies": "Tambah Spesies", "addIndividual": "Tambah Individu", - "overview": "Ringkasan", "welcomeBackDashboard": "Selamat datang kembali ke papan pemuka organisasi anda.", "totalSpecies": "Jumlah Spesies", "totalIndividuals": "Jumlah Individu", "endangeredSpecies": "Spesies Terancam", "activeUsers": "Pengguna Aktif", "breedingPairs": "Pasangan Pembiakan Dicadangkan", "match": "Padanan", "noBreeding": "Tiada cadangan pembiakan buat masa ini.", "popDist": "Taburan Populasi", "consStatus": "Nisbah Status Pemuliharaan", "origin": "Asal Populasi", "ageDist": "Taburan Umur & Jantina", "wildCaught": "Ditangkap Liar", "captiveBred": "Dibesarkan dalam Tangkapan", "unknownOrigin": "Asal Tidak Diketahui", "males": "Jantan", "females": "Betina", "unknownSex": "Tidak Diketahui", "years": "tahun", - "orgSettings": "Tetapan Organisasi", "orgSettingsSubtitle": "Urus butiran zoo atau tempat perlindungan anda.", "locationName": "Nama Lokasi (Bandar/Negeri)", "geoLocation": "Geo-Lokasi (Peta)", "description": "Penerangan", "projectManagement": "Pengurusan Projek", "projectManagementDesc": "Cipta, edit, atau padam projek. Pindahkan spesies antara projek.", "dataManagement": "Pengurusan Data", "dataManagementDesc": "Eksport data anda untuk simpanan atau pindahkan ke sistem lain.", "saveChanges": "Simpan Perubahan", "saved": "Tersimpan!", - "speciesDatabase": "Pangkalan Data Spesies", "speciesSubtitle": "Katalog dan urus profil biologi koleksi anda.", "commonName": "Nama Biasa", "commonNamePlaceholder": "cth. Panda Merah", "scientificName": "Nama Saintifik", "scientificNamePlaceholder": "cth. Ailurus fulgens", "type": "Alam", "animal": "Fauna", "plant": "Flora", "conservationStatus": "Status Pemuliharaan", "sexualMaturity": "Kematangan Seksual (Tahun)", "lifeExpectancy": "Jangka Hayat (Tahun)", "autofill": "Isi Automatik", "aiGenerate": "Ilustrasi AI", "cancel": "Batal", "save": "Simpan", "add": "Tambah", "searchSpecies": "Cari Spesies...", "searchIndividuals": "Cari Individu...", - "indivSubtitleAnimal": "Jejak dan urus individu dalam jagaan anda.", "updateIndividual": "Kemaskini Individu", "registerIndividual": "Daftarkan Individu", "representativeImage": "Gambar Wakil", "upload": "Muat Naik", "noImageProvided": "Tiada gambar disediakan", "saveSpecies": "Simpan Spesies", "updateSpecies": "Kemaskini Spesies", "lifespan": "Jangka Hayat", "maturity": "Kematangan", "noSpeciesFound": "Tiada spesies dijumpai", "adultWeight": "Berat Dewasa", "classification": "Klasifikasi", "monoecious": "Monoesius", "dioecious": "Dioesius", "maturityFlowering": "Kematangan / Pembungaan", "studbookId": "ID Studbook", "name": "Nama", - "saSubtitle": "Pengurusan dan pengawasan sistem global.", "security": "Keselamatan", "email": "E-mel", "landing": "Halaman Utama", "localisation": "Penyetempatan", "network": "Rangkaian", "cacheManage": "Pengurusan Cache Tempatan", "createOrgBtn": "Cipta Organisasi", "loginAs": "Log Masuk Sebagai", "hostTag": "Host", "smtpTestSuccess": "Ujian SMTP berjaya dihantar!", "smtpSettings": "Tetapan SMTP", "smtpHost": "Host SMTP", "port": "Port", "username": "Nama Pengguna", "secureConnection": "Sambungan Selamat (SSL/TLS)", "saveSettings": "Simpan Tetapan", "securitySettings": "Tetapan Keselamatan", "enableMfa": "Aktifkan Pengesahan Dua Faktor", "enableOrgMfa": "Wajibkan MFA Organisasi", "enableOrgMfaDesc": "Wajibkan semua ahli organisasi ini menggunakan MFA.", "theming": "Tema", "primaryColor": "Warna Utama", "appLogo": "Logo Aplikasi", "uploadLogo": "Muat Naik Logo", "customCss": "CSS Tersuai", "enableRegistration": "Aktifkan Pendaftaran", "featureCards": "Kad Ciri", "addLanguage": "Tambah Bahasa", "supportedLanguages": "Bahasa Disokong", "heroTitle": "Tajuk Hero", "heroSubtitle": "Subtajuk Hero", "staticPages": "Halaman Statik", "clearCacheBtn": "Buang Data Tempatan", "allOrganizations": "Semua Organisasi", "searchName": "Cari mengikut nama...", - "emailVerifySubject": "Sahkan e-mel anda", "emailVerifyBody": "

Kod pengesahan anda ialah: {{code}}

", "emailInviteSubject": "Jemputan untuk menyertai {{orgName}}", "emailInviteBody": "

Helo {{userName}},

Anda telah dijemput untuk menyertai pasukan pengurusan di {{orgName}}.

Sila klik pautan di bawah untuk mengesahkan akaun dan menetapkan kata laluan:

Sahkan Akaun Saya

Jika butang tidak berfungsi, salin URL ini:
{{inviteUrl}}

", "emailNotifySubject": "Pemberitahuan Sistem", "emailNotifyBody": "

Helo,

{{message}}

", - "registration": "Pendaftaran Pengguna", "mfa": "Pengesahan Dua Faktor", "invite": "Jemputan Pasukan", "notification": "Amaran Sistem", - "teamMembers": "Ahli Pasukan", "teamSubtitle": "Urus akses dan kebenaran pasukan anda.", "bulkInvite": "Jemputan Pukal", "inviteMember": "Jemput Ahli", "csvFormatTitle": "Format CSV", "csvFormatDesc": "Muat turun templat kami untuk memastikan CSV anda diformat dengan betul.", "processingBulk": "Memproses jemputan pukal...", "selectSpecies": "Pilih Spesies", "saveEvent": "Simpan Acara", "breedingSubtitle": "Jejak dan urus pasangan pembiakan dan hasilnya.", "recordBreedingEvent": "Rekod Acara", "newBreedingLoan": "Pinjaman Baru", "breedingEvents": "Acara", "breedingLoans": "Pinjaman", "viewTitle": "Tapis Paparan", "includePartnerOrgs": "Sertakan Acara Rakan Kongsi", - "onboardingWelcome": "Selamat Datang ke OpenStudbook", "onboardingSettingsTask": "Sila semak tetapan organisasi anda di bawah dan klik 'Simpan Perubahan' untuk meneruskan.", "onboardingSaveAndNext": "Simpan & Teruskan ke Spesies", "onboardingSpeciesTask": "Bagus! Tambah spesies pertama anda untuk mula membina koleksi.", "onboardingIndivTask": "Akhir sekali, daftarkan individu untuk menjejaki pertumbuhan dan sejarah mereka.", - "enablePage": "Aktifkan Ciri", "dashBlockTitle": "Tajuk Mesej Papan Pemuka", "dashBlockContent": "Kandungan Mesej Papan Pemuka", "customDashBlock": "Pengumuman Papan Pemuka Tersuai", "customDashBlockDesc": "Cipta blok pengumuman yang muncul di bahagian atas papan pemuka untuk semua pengguna.", "visibilityPrivacy": "Keterlihatan & Privasi", "breedingLoanPolicy": "Dasar Pembiakan & Pinjaman", "allowBreedingRequests": "Benarkan Permintaan Rangkaian", "allowBreedingRequestsDesc": "Benarkan organisasi rakan kongsi mencadangkan pinjaman pembiakan melalui peta rangkaian.", "whoReceivesRequests": "Kenalan Permintaan", "whoReceivesRequestsDesc": "Pengguna mana yang akan diberitahu apabila permintaan pinjaman diterima?", "orgVisibility": "Senarai dalam Direktori", "orgVisibilityDesc": "Jadikan organisasi anda kelihatan pada peta rangkaian global.", "obscureLocation": "Samarkan Lokasi Peta", "obscureLocationDesc": "Bulatkan koordinat peta untuk mencegah penjejakan lokasi tepat.", "speciesListVisibility": "Senarai Spesies Awam", "speciesListVisibilityDesc": "Benarkan sesiapa dalam rangkaian melihat spesies yang anda urus.", - "noPartnersFound": "Tiada rakan kongsi dijumpai.", "connectNewPartner": "Hubungkan Rakan Kongsi Baru", "yourInviteCode": "Kod Jemputan Anda", "redeemCode": "Tebus Kod", "siteKey": "Kunci Tapak", "secretKey": "Kunci Rahsia", - "fullName": "Nama Penuh", "preferredLanguage": "Bahasa Pilihan", "emailAddress": "Alamat E-mel", "superAdminOnly": "(Hanya Super Admin)", "projectAccess": "Akses Projek", "globalAccessAll": "Global (Semua Kini & Masa Depan)", "restrictedSpecific": "Terhad (Pilih Spesifik)", "globalAccessInfo": "Pengguna ini akan mempunyai akses kepada semua projek secara lalai dan boleh bertukar di antara mereka menggunakan navigator projek.", "sendInvitation": "Hantar Jemputan", "cancelInvitation": "Batalkan Jemputan?", "removeTeamMember": "Buang Ahli Pasukan?", "cancelInviteConfirm": "Adakah anda pasti ingin membatalkan jemputan untuk {{name}}? Mereka belum menyertai organisasi.", "removeMemberConfirm": "Adakah anda pasti ingin membuang {{name}}? Mereka akan kehilangan semua akses kepada data dan projek organisasi.", "revokeInvitation": "Tarik Balik Jemputan", "removeAccess": "Buang Akses", "inviteSent": "Jemputan berjaya dihantar!", "inviteFailed": "Gagal menghantar jemputan.", "inviteCancelled": "Jemputan dibatalkan.", "memberRemoved": "Pengguna dibuang.", "actionFailed": "Tindakan gagal.", - "acceptInvitation": "Terima Jemputan", "invitedToJoin": "Anda telah dijemput untuk menyertai", "setPassword": "Tetapkan Kata Laluan", "minimumCharsHint": "Minimum 8 aksara", "repeatPasswordHint": "Ulang kata laluan", "activating": "Mengaktifkan...", "activateAccount": "Aktifkan Akaun", "accountActivated": "Akaun diaktifkan! Mengalihkan...", "noTokenFound": "Tiada token jemputan dijumpai dalam pautan.", "invalidInvite": "Jemputan tidak sah atau sudah tamat tempoh.", "passwordMismatch": "Kata laluan tidak sepadan.", "passwordTooShort": "Kata laluan mestilah sekurang-kurangnya 8 aksara.", "activationFailed": "Gagal mengaktifkan akaun.", - "history": "Sejarah", "genetics": "Genetik", "editProfile": "Edit Profil", "sex": "Jantina", "birthDate": "Tarikh Lahir", "planted": "Ditanam", "deathDate": "Tarikh Kematian", "removed": "Dibuang", "acquisitionSource": "Sumber Pemerolehan", "sourceDetails": "Butiran Sumber", "loanStatus": "Status Pinjaman", "transferred": "Dipindahkan", "transferNote": "Nota Pindahan", "lifeExpectancyShort": "Jangka Hayat", "sexualMaturityShort": "Kematangan Seksual", "avgAdultWeight": "Purata Berat Dewasa", "avgAdultHeight": "Purata Tinggi Dewasa", "breedingSeason": "Musim Pembiakan", "nativeStatus": "Status Asli", "speciesInfo": "Maklumat Spesies", "viewInSpeciesRegistry": "Lihat di Daftar", "location": "Lokasi", "noCoordinatesAssigned": "Tiada koordinat", "setLocation": "Tetapkan Lokasi", "weightTrend": "Aliran Berat", "growthTrend": "Aliran Pertumbuhan", "logWeight": "Log Berat", "logHeight": "Log Tinggi", "addObservation": "Tambah Pemerhatian", "parentage": "Keturunan", "sire": "Bapa", "dam": "Induk", "performedBy": "Dilakukan Oleh", "speciesDetail": "Butiran Spesies", "weightHistory": "Sejarah Berat", "healthHistory": "Sejarah Kesihatan" + "dashboard": "Papan Pemuka", + "networkMap": "Rangkaian", + "plantMap": "Peta Flora", + "species": "Spesies", + "individuals": "Individu", + "breeding": "Pembiakan", + "usersRoles": "Pengguna & Peranan", + "organization": "Organisasi", + "superAdmin": "Admin Super", + "signOut": "Log Keluar", + "currentProject": "Projek Semasa", + "allProjects": "Semua Projek", + "createNewProject": "Cipta Projek Baru", + "landingTitle": "Pengurusan Pembiakan Tangkapan Sumber Terbuka", + "landingSubtitle": "OpenStudbook ialah platform sumber terbuka untuk zoo, akuarium, dan taman botani bagi menguruskan populasi spesies dan mengesan genetik.", + "createOrg": "Cipta Organisasi", + "exploreDemo": "Terokai Demo", + "demoLogin": "Log Masuk Demo", + "getStarted": "Mulakan", + "securePrivate": "Selamat & Peribadi", + "securePrivateDesc": "Data anda adalah milik anda. Pilih apa yang ingin anda kongsi.", + "floraFauna": "Fauna & Flora", + "floraFaunaDesc": "Pengurusan bersepadu untuk haiwan dan tumbuhan.", + "globalNetwork": "Rangkaian Global", + "globalNetworkDesc": "Berhubung dengan rakan kongsi di seluruh dunia.", + "back": "Kembali", + "registerOrg": "Daftarkan Organisasi", + "orgName": "Nama Organisasi", + "orgFocus": "Fokus", + "orgFocusExplanation": "Memilih fokus akan mengaktifkan ciri yang paling relevan untuk organisasi anda.", + "faunaManagement": "Pengurusan Fauna", + "floraManagement": "Pengurusan Flora", + "cityLocation": "Bandar / Lokasi", + "adminDetails": "Butiran Akaun Admin", + "yourFullName": "Nama Penuh Anda", + "workEmail": "E-mel Kerja", + "password": "Kata Laluan", + "confirmPassword": "Sahkan Kata Laluan", + "verifyEmailAndContinue": "Sahkan E-mel & Teruskan", + "signIn": "Log Masuk", + "welcomeBack": "Selamat Datang Kembali", + "signInSubtitle": "Log masuk ke organisasi anda.", + "forgotPassword": "Lupa Kata Laluan?", + "needAccount": "Perlukan akaun? Daftar di sini", + "backToLanding": "Kembali ke Halaman Utama", + "about": "Tentang", + "privacyPolicy": "Dasar Privasi", + "termsConditions": "Terma & Syarat", + "dashboardReady": "Papan pemuka anda sedia", + "dashboardReadyDesc": "Metrik, carta, dan maklumat pembiakan akan muncul di sini setelah anda menambah spesies dan individu ke koleksi anda.", + "addSpecies": "Tambah Spesies", + "addIndividual": "Tambah Individu", + "overview": "Ringkasan", + "welcomeBackDashboard": "Selamat datang kembali ke papan pemuka organisasi anda.", + "totalSpecies": "Jumlah Spesies", + "totalIndividuals": "Jumlah Individu", + "endangeredSpecies": "Spesies Terancam", + "activeUsers": "Pengguna Aktif", + "breedingPairs": "Pasangan Pembiakan Dicadangkan", + "match": "Padanan", + "noBreeding": "Tiada cadangan pembiakan buat masa ini.", + "popDist": "Taburan Populasi", + "consStatus": "Nisbah Status Pemuliharaan", + "origin": "Asal Populasi", + "ageDist": "Taburan Umur & Jantina", + "wildCaught": "Ditangkap Liar", + "captiveBred": "Dibesarkan dalam Tangkapan", + "unknownOrigin": "Asal Tidak Diketahui", + "males": "Jantan", + "females": "Betina", + "unknownSex": "Tidak Diketahui", + "years": "tahun", + "orgSettings": "Tetapan Organisasi", + "orgSettingsSubtitle": "Urus butiran zoo atau tempat perlindungan anda.", + "locationName": "Nama Lokasi (Bandar/Negeri)", + "geoLocation": "Geo-Lokasi (Peta)", + "description": "Penerangan", + "projectManagement": "Pengurusan Projek", + "projectManagementDesc": "Cipta, edit, atau padam projek. Pindahkan spesies antara projek.", + "dataManagement": "Pengurusan Data", + "dataManagementDesc": "Eksport data anda untuk simpanan atau pindahkan ke sistem lain.", + "saveChanges": "Simpan Perubahan", + "saved": "Tersimpan!", + "speciesDatabase": "Pangkalan Data Spesies", + "speciesSubtitle": "Katalog dan urus profil biologi koleksi anda.", + "commonName": "Nama Biasa", + "commonNamePlaceholder": "cth. Panda Merah", + "scientificName": "Nama Saintifik", + "scientificNamePlaceholder": "cth. Ailurus fulgens", + "type": "Alam", + "animal": "Fauna", + "plant": "Flora", + "conservationStatus": "Status Pemuliharaan", + "sexualMaturity": "Kematangan Seksual (Tahun)", + "lifeExpectancy": "Jangka Hayat (Tahun)", + "autofill": "Isi Automatik", + "aiGenerate": "Ilustrasi AI", + "cancel": "Batal", + "save": "Simpan", + "add": "Tambah", + "searchSpecies": "Cari Spesies...", + "searchIndividuals": "Cari Individu...", + "indivSubtitleAnimal": "Jejak dan urus individu dalam jagaan anda.", + "updateIndividual": "Kemaskini Individu", + "registerIndividual": "Daftarkan Individu", + "representativeImage": "Gambar Wakil", + "upload": "Muat Naik", + "noImageProvided": "Tiada gambar disediakan", + "saveSpecies": "Simpan Spesies", + "updateSpecies": "Kemaskini Spesies", + "lifespan": "Jangka Hayat", + "maturity": "Kematangan", + "noSpeciesFound": "Tiada spesies dijumpai", + "adultWeight": "Berat Dewasa", + "classification": "Klasifikasi", + "monoecious": "Monoesius", + "dioecious": "Dioesius", + "maturityFlowering": "Kematangan / Pembungaan", + "studbookId": "ID Studbook", + "name": "Nama", + "saSubtitle": "Pengurusan dan pengawasan sistem global.", + "security": "Keselamatan", + "email": "E-mel", + "landing": "Halaman Utama", + "localisation": "Penyetempatan", + "network": "Rangkaian", + "cacheManage": "Pengurusan Cache Tempatan", + "createOrgBtn": "Cipta Organisasi", + "loginAs": "Log Masuk Sebagai", + "hostTag": "Host", + "smtpTestSuccess": "Ujian SMTP berjaya dihantar!", + "smtpSettings": "Tetapan SMTP", + "smtpHost": "Host SMTP", + "port": "Port", + "username": "Nama Pengguna", + "secureConnection": "Sambungan Selamat (SSL/TLS)", + "saveSettings": "Simpan Tetapan", + "securitySettings": "Tetapan Keselamatan", + "enableMfa": "Aktifkan Pengesahan Dua Faktor", + "enableOrgMfa": "Wajibkan MFA Organisasi", + "enableOrgMfaDesc": "Wajibkan semua ahli organisasi ini menggunakan MFA.", + "theming": "Tema", + "primaryColor": "Warna Utama", + "appLogo": "Logo Aplikasi", + "uploadLogo": "Muat Naik Logo", + "customCss": "CSS Tersuai", + "enableRegistration": "Aktifkan Pendaftaran", + "featureCards": "Kad Ciri", + "addLanguage": "Tambah Bahasa", + "supportedLanguages": "Bahasa Disokong", + "heroTitle": "Tajuk Hero", + "heroSubtitle": "Subtajuk Hero", + "staticPages": "Halaman Statik", + "clearCacheBtn": "Buang Data Tempatan", + "allOrganizations": "Semua Organisasi", + "searchName": "Cari mengikut nama...", + "emailVerifySubject": "Sahkan e-mel anda", + "emailVerifyBody": "

Kod pengesahan anda ialah: {{code}}

", + "emailInviteSubject": "Jemputan untuk menyertai {{orgName}}", + "emailInviteBody": "

Helo {{userName}},

Anda telah dijemput untuk menyertai pasukan pengurusan di {{orgName}}.

Sila klik pautan di bawah untuk mengesahkan akaun dan menetapkan kata laluan:

Sahkan Akaun Saya

Jika butang tidak berfungsi, salin URL ini:
{{inviteUrl}}

", + "emailNotifySubject": "Pemberitahuan Sistem", + "emailNotifyBody": "

Helo,

{{message}}

", + "registration": "Pendaftaran Pengguna", + "mfa": "Pengesahan Dua Faktor", + "invite": "Jemputan Pasukan", + "notification": "Amaran Sistem", + "teamMembers": "Ahli Pasukan", + "teamSubtitle": "Urus akses dan kebenaran pasukan anda.", + "bulkInvite": "Jemputan Pukal", + "inviteMember": "Jemput Ahli", + "csvFormatTitle": "Format CSV", + "csvFormatDesc": "Muat turun templat kami untuk memastikan CSV anda diformat dengan betul.", + "processingBulk": "Memproses jemputan pukal...", + "selectSpecies": "Pilih Spesies", + "saveEvent": "Simpan Acara", + "breedingSubtitle": "Jejak dan urus pasangan pembiakan dan hasilnya.", + "recordBreedingEvent": "Rekod Acara", + "newBreedingLoan": "Pinjaman Baru", + "breedingEvents": "Acara", + "breedingLoans": "Pinjaman", + "viewTitle": "Tapis Paparan", + "includePartnerOrgs": "Sertakan Acara Rakan Kongsi", + "onboardingWelcome": "Selamat Datang ke OpenStudbook", + "onboardingSettingsTask": "Sila semak tetapan organisasi anda di bawah dan klik 'Simpan Perubahan' untuk meneruskan.", + "onboardingSaveAndNext": "Simpan & Teruskan ke Spesies", + "onboardingSpeciesTask": "Bagus! Tambah spesies pertama anda untuk mula membina koleksi.", + "onboardingIndivTask": "Akhir sekali, daftarkan individu untuk menjejaki pertumbuhan dan sejarah mereka.", + "enablePage": "Aktifkan Ciri", + "dashBlockTitle": "Tajuk Mesej Papan Pemuka", + "dashBlockContent": "Kandungan Mesej Papan Pemuka", + "customDashBlock": "Pengumuman Papan Pemuka Tersuai", + "customDashBlockDesc": "Cipta blok pengumuman yang muncul di bahagian atas papan pemuka untuk semua pengguna.", + "visibilityPrivacy": "Keterlihatan & Privasi", + "breedingLoanPolicy": "Dasar Pembiakan & Pinjaman", + "allowBreedingRequests": "Benarkan Permintaan Rangkaian", + "allowBreedingRequestsDesc": "Benarkan organisasi rakan kongsi mencadangkan pinjaman pembiakan melalui peta rangkaian.", + "whoReceivesRequests": "Kenalan Permintaan", + "whoReceivesRequestsDesc": "Pengguna mana yang akan diberitahu apabila permintaan pinjaman diterima?", + "orgVisibility": "Senarai dalam Direktori", + "orgVisibilityDesc": "Jadikan organisasi anda kelihatan pada peta rangkaian global.", + "obscureLocation": "Samarkan Lokasi Peta", + "obscureLocationDesc": "Menyamarkan lokasi anda di peta rangkaian dalam radius kira-kira 10 batu dari tapak sebenar anda.", + "speciesListVisibility": "Senarai Spesies Awam", + "speciesListVisibilityDesc": "Benarkan sesiapa dalam rangkaian melihat spesies yang anda urus.", + "noPartnersFound": "Tiada rakan kongsi dijumpai.", + "connectNewPartner": "Hubungkan Rakan Kongsi Baru", + "yourInviteCode": "Kod Jemputan Anda", + "redeemCode": "Tebus Kod", + "siteKey": "Kunci Tapak", + "secretKey": "Kunci Rahsia", + "fullName": "Nama Penuh", + "preferredLanguage": "Bahasa Pilihan", + "emailAddress": "Alamat E-mel", + "superAdminOnly": "(Hanya Super Admin)", + "projectAccess": "Akses Projek", + "globalAccessAll": "Global (Semua Kini & Masa Depan)", + "restrictedSpecific": "Terhad (Pilih Spesifik)", + "globalAccessInfo": "Pengguna ini akan mempunyai akses kepada semua projek secara lalai dan boleh bertukar di antara mereka menggunakan navigator projek.", + "sendInvitation": "Hantar Jemputan", + "cancelInvitation": "Batalkan Jemputan?", + "removeTeamMember": "Buang Ahli Pasukan?", + "cancelInviteConfirm": "Adakah anda pasti ingin membatalkan jemputan untuk {{name}}? Mereka belum menyertai organisasi.", + "removeMemberConfirm": "Adakah anda pasti ingin membuang {{name}}? Mereka akan kehilangan semua akses kepada data dan projek organisasi.", + "revokeInvitation": "Tarik Balik Jemputan", + "removeAccess": "Buang Akses", + "inviteSent": "Jemputan berjaya dihantar!", + "inviteFailed": "Gagal menghantar jemputan.", + "inviteCancelled": "Jemputan dibatalkan.", + "memberRemoved": "Pengguna dibuang.", + "actionFailed": "Tindakan gagal.", + "acceptInvitation": "Terima Jemputan", + "invitedToJoin": "Anda telah dijemput untuk menyertai", + "setPassword": "Tetapkan Kata Laluan", + "minimumCharsHint": "Minimum 8 aksara", + "repeatPasswordHint": "Ulang kata laluan", + "activating": "Mengaktifkan...", + "activateAccount": "Aktifkan Akaun", + "accountActivated": "Akaun diaktifkan! Mengalihkan...", + "noTokenFound": "Tiada token jemputan dijumpai dalam pautan.", + "invalidInvite": "Jemputan tidak sah atau sudah tamat tempoh.", + "passwordMismatch": "Kata laluan tidak sepadan.", + "passwordTooShort": "Kata laluan mestilah sekurang-kurangnya 8 aksara.", + "activationFailed": "Gagal mengaktifkan akaun.", + "history": "Sejarah", + "genetics": "Genetik", + "editProfile": "Edit Profil", + "sex": "Jantina", + "birthDate": "Tarikh Lahir", + "planted": "Ditanam", + "deathDate": "Tarikh Kematian", + "removed": "Dibuang", + "acquisitionSource": "Sumber Pemerolehan", + "sourceDetails": "Butiran Sumber", + "loanStatus": "Status Pinjaman", + "transferred": "Dipindahkan", + "transferNote": "Nota Pindahan", + "lifeExpectancyShort": "Jangka Hayat", + "sexualMaturityShort": "Kematangan Seksual", + "avgAdultWeight": "Purata Berat Dewasa", + "avgAdultHeight": "Purata Tinggi Dewasa", + "breedingSeason": "Musim Pembiakan", + "nativeStatus": "Status Asli", + "speciesInfo": "Maklumat Spesies", + "viewInSpeciesRegistry": "Lihat di Daftar", + "location": "Lokasi", + "noCoordinatesAssigned": "Tiada koordinat", + "setLocation": "Tetapkan Lokasi", + "weightTrend": "Aliran Berat", + "growthTrend": "Aliran Pertumbuhan", + "logWeight": "Log Berat", + "logHeight": "Log Tinggi", + "addObservation": "Tambah Pemerhatian", + "parentage": "Keturunan", + "sire": "Bapa", + "dam": "Induk", + "performedBy": "Dilakukan Oleh", + "speciesDetail": "Butiran Spesies", + "weightHistory": "Sejarah Berat", + "healthHistory": "Sejarah Kesihatan", + "hideOrgName": "Sembunyikan Nama Organisasi", + "hideOrgNameDesc": "Paparkan sebagai 'Organisasi Tanpa Nama' pada peta rangkaian.", + "speciesListVisibilityNote": "Hanya kelihatan kepada rakan kongsi rangkaian berdaftar.", + "showNativeStatus": "Tunjukkan Lencana Status Asli", + "showNativeStatusDesc": "Paparkan penunjuk status asli/bukan asli/invasif pada kad spesies dan profil individu.", + "locationMapNotice": "Menambahkan lokasi yang tepat untuk organisasi anda adalah penting untuk fungsi pemetaan di seluruh aplikasi. Sila tetapkan lokasi dan semak tetapan privasi di bawah.", + "useMyLocation": "Guna Lokasi Semasa Saya", + "enableEnclosures": "Aktifkan Kandang", + "enableAreas": "Aktifkan Kawasan", + "enableEnclosuresModuleDesc": "Aktifkan pemetaan lanjutan dan pengelompokan spesies mengikut lokasi fizikal.", + "addToHomeScreen": "Tambah ke Skrin Utama", + "iosInstallHint": "Dalam Safari, ketik butang Kongsi di bahagian bawah skrin, kemudian ketik 'Tambah ke Skrin Utama'." } }, { @@ -106,24 +1224,297 @@ "name": "Português", "isDefault": false, "translations": { - "dashboard": "Painel", "networkMap": "Rede", "plantMap": "Mapa da Flora", "species": "Espécies", "individuals": "Indivíduos", "breeding": "Reprodução", "usersRoles": "Utilizadores & Funções", "organization": "Organização", "superAdmin": "Super Admin", "signOut": "Sair", "currentProject": "Projeto Atual", "allProjects": "Todos os Projetos", "createNewProject": "Criar Novo Projeto", - "landingTitle": "Gestão de Criação em Cativeiro Open Source", "landingSubtitle": "OpenStudbook é uma plataforma open-source para jardins zoológicos, aquários e jardins botânicos gerirem populações de espécies e rastrearem a genética.", "createOrg": "Criar Organização", "exploreDemo": "Explorar Demo", "demoLogin": "Entrar no Demo", "getStarted": "Começar", "securePrivate": "Seguro & Privado", "securePrivateDesc": "Os seus dados são seus. Escolha exatamente o que partilhar.", "floraFauna": "Fauna & Flora", "floraFaunaDesc": "Gestão unificada para animais e plantas.", "globalNetwork": "Rede Global", "globalNetworkDesc": "Conecte-se com parceiros em todo o mundo.", "back": "Voltar", "registerOrg": "Registar Organização", "orgName": "Nome da Organização", "orgFocus": "Foco", "orgFocusExplanation": "Selecionar o foco irá pré-ativar as funcionalidades mais relevantes para a sua organização.", "faunaManagement": "Gestão de Fauna", "floraManagement": "Gestão de Flora", "cityLocation": "Cidade / Localização", "adminDetails": "Detalhes da Conta Admin", "yourFullName": "O Seu Nome Completo", "workEmail": "E-mail de Trabalho", "password": "Palavra-passe", "confirmPassword": "Confirmar Palavra-passe", "verifyEmailAndContinue": "Verificar E-mail & Continuar", "signIn": "Entrar", "welcomeBack": "Bem-vindo de Volta", "signInSubtitle": "Entre na sua organização.", "forgotPassword": "Esqueceu a palavra-passe?", "needAccount": "Precisa de uma conta? Registe-se aqui", "backToLanding": "Voltar à Página Inicial", - "about": "Sobre", "privacyPolicy": "Política de Privacidade", "termsConditions": "Termos & Condições", - "dashboardReady": "O seu painel está pronto", "dashboardReadyDesc": "Métricas, gráficos e análises de reprodução aparecerão aqui quando adicionar espécies e indivíduos à sua coleção.", "addSpecies": "Adicionar Espécie", "addIndividual": "Adicionar Indivíduo", - "overview": "Visão Geral", "welcomeBackDashboard": "Bem-vindo de volta ao painel da sua organização.", "totalSpecies": "Total de Espécies", "totalIndividuals": "Total de Indivíduos", "endangeredSpecies": "Espécies Ameaçadas", "activeUsers": "Utilizadores Ativos", "breedingPairs": "Pares de Reprodução Sugeridos", "match": "Compatibilidade", "noBreeding": "Sem recomendações de reprodução disponíveis neste momento.", "popDist": "Distribuição da População", "consStatus": "Rácio de Estado de Conservação", "origin": "Origem da População", "ageDist": "Distribuição de Idade & Sexo", "wildCaught": "Capturado na Natureza", "captiveBred": "Criado em Cativeiro", "unknownOrigin": "Origem Desconhecida", "males": "Machos", "females": "Fêmeas", "unknownSex": "Desconhecido", "years": "anos", - "orgSettings": "Definições da Organização", "orgSettingsSubtitle": "Gira os detalhes do seu jardim zoológico ou santuário.", "locationName": "Nome do Local (Cidade/Estado)", "geoLocation": "Geo-Localização (Mapa)", "description": "Descrição", "projectManagement": "Gestão de Projetos", "projectManagementDesc": "Criar, editar ou eliminar projetos. Transferir espécies entre projetos.", "dataManagement": "Gestão de Dados", "dataManagementDesc": "Exporte os seus dados para arquivo ou transfira para outro sistema.", "saveChanges": "Guardar Alterações", "saved": "Guardado!", - "speciesDatabase": "Base de Dados de Espécies", "speciesSubtitle": "Catalogue e gira os perfis biológicos da sua coleção.", "commonName": "Nome Comum", "commonNamePlaceholder": "ex. Panda Vermelho", "scientificName": "Nome Científico", "scientificNamePlaceholder": "ex. Ailurus fulgens", "type": "Reino", "animal": "Fauna", "plant": "Flora", "conservationStatus": "Estado de Conservação", "sexualMaturity": "Maturidade Sexual (Anos)", "lifeExpectancy": "Esperança de Vida (Anos)", "autofill": "Preenchimento Automático", "aiGenerate": "Ilustração IA", "cancel": "Cancelar", "save": "Guardar", "add": "Adicionar", "searchSpecies": "Pesquisar Espécies...", "searchIndividuals": "Pesquisar Indivíduos...", - "indivSubtitleAnimal": "Acompanhe e gira os indivíduos sob os seus cuidados.", "updateIndividual": "Atualizar Indivíduo", "registerIndividual": "Registar Indivíduo", "representativeImage": "Imagem Representativa", "upload": "Carregar", "noImageProvided": "Sem imagem fornecida", "saveSpecies": "Guardar Espécie", "updateSpecies": "Atualizar Espécie", "lifespan": "Esperança de Vida", "maturity": "Maturidade", "noSpeciesFound": "Nenhuma espécie encontrada", "adultWeight": "Peso Adulto", "classification": "Classificação", "monoecious": "Monóico", "dioecious": "Dióico", "maturityFlowering": "Maturidade / Floração", "studbookId": "ID do Studbook", "name": "Nome", - "saSubtitle": "Gestão e supervisão global do sistema.", "security": "Segurança", "email": "E-mail", "landing": "Página Inicial", "localisation": "Localização", "network": "Rede", "cacheManage": "Gestão de Cache Local", "createOrgBtn": "Criar Organização", "loginAs": "Entrar Como", "hostTag": "Anfitrião", "smtpTestSuccess": "Teste SMTP enviado com sucesso!", "smtpSettings": "Definições SMTP", "smtpHost": "Host SMTP", "port": "Porta", "username": "Nome de Utilizador", "secureConnection": "Ligação Segura (SSL/TLS)", "saveSettings": "Guardar Definições", "securitySettings": "Definições de Segurança", "enableMfa": "Ativar Autenticação de Dois Fatores", "enableOrgMfa": "Forçar MFA da Organização", "enableOrgMfaDesc": "Exigir que todos os membros desta organização utilizem MFA.", "theming": "Tema", "primaryColor": "Cor Principal", "appLogo": "Logótipo da Aplicação", "uploadLogo": "Carregar Logótipo", "customCss": "CSS Personalizado", "enableRegistration": "Ativar Registo", "featureCards": "Cartões de Funcionalidades", "addLanguage": "Adicionar Idioma", "supportedLanguages": "Idiomas Suportados", "heroTitle": "Título Hero", "heroSubtitle": "Subtítulo Hero", "staticPages": "Páginas Estáticas", "clearCacheBtn": "Limpar Dados Locais", "allOrganizations": "Todas as Organizações", "searchName": "Pesquisar por nome...", - "emailVerifySubject": "Verifique o seu e-mail", "emailVerifyBody": "

O seu código de verificação é: {{code}}

", "emailInviteSubject": "Convite para se juntar a {{orgName}}", "emailInviteBody": "

Olá {{userName}},

Foi convidado a juntar-se à equipa de gestão de {{orgName}}.

Clique no link abaixo para confirmar a sua conta e definir a sua palavra-passe:

Confirmar a Minha Conta

Se o botão não funcionar, copie este URL:
{{inviteUrl}}

", "emailNotifySubject": "Notificação do Sistema", "emailNotifyBody": "

Olá,

{{message}}

", - "registration": "Registo de Utilizador", "mfa": "Autenticação de Dois Fatores", "invite": "Convite de Equipa", "notification": "Alertas do Sistema", - "teamMembers": "Membros da Equipa", "teamSubtitle": "Gira o acesso e permissões da sua equipa.", "bulkInvite": "Convite em Massa", "inviteMember": "Convidar Membro", "csvFormatTitle": "Formato CSV", "csvFormatDesc": "Descarregue o nosso modelo para garantir que o seu CSV está corretamente formatado.", "processingBulk": "A processar convites em massa...", "selectSpecies": "Selecionar Espécie", "saveEvent": "Guardar Evento", "breedingSubtitle": "Acompanhe e gira pares de reprodução e resultados.", "recordBreedingEvent": "Registar Evento", "newBreedingLoan": "Novo Empréstimo", "breedingEvents": "Eventos", "breedingLoans": "Empréstimos", "viewTitle": "Filtrar Vista", "includePartnerOrgs": "Incluir Eventos de Parceiros", - "onboardingWelcome": "Bem-vindo ao OpenStudbook", "onboardingSettingsTask": "Reveja as definições da sua organização abaixo e clique em 'Guardar Alterações' para continuar.", "onboardingSaveAndNext": "Guardar & Continuar para Espécies", "onboardingSpeciesTask": "Ótimo! Adicione a sua primeira espécie para começar a construir a sua coleção.", "onboardingIndivTask": "Por fim, registe indivíduos para acompanhar o seu crescimento e histórico.", - "enablePage": "Ativar Funcionalidade", "dashBlockTitle": "Título da Mensagem do Painel", "dashBlockContent": "Conteúdo da Mensagem do Painel", "customDashBlock": "Anúncio Personalizado do Painel", "customDashBlockDesc": "Crie um bloco de anúncio personalizado que aparece no topo do painel para todos os utilizadores.", "visibilityPrivacy": "Visibilidade & Privacidade", "breedingLoanPolicy": "Política de Reprodução & Empréstimo", "allowBreedingRequests": "Permitir Pedidos de Rede", "allowBreedingRequestsDesc": "Permitir que organizações parceiras proponham empréstimos de reprodução através do mapa de rede.", "whoReceivesRequests": "Contacto de Pedidos", "whoReceivesRequestsDesc": "Qual utilizador deve ser notificado quando um pedido de empréstimo é recebido?", "orgVisibility": "Listar no Diretório", "orgVisibilityDesc": "Tornar a sua organização visível no mapa de rede global.", "obscureLocation": "Ocultar Localização no Mapa", "obscureLocationDesc": "Arredonde as coordenadas do mapa para evitar rastreamento preciso por não parceiros.", "speciesListVisibility": "Lista de Espécies Pública", "speciesListVisibilityDesc": "Permitir que qualquer pessoa na rede veja as espécies que gere.", - "noPartnersFound": "Nenhum parceiro encontrado.", "connectNewPartner": "Conectar Novo Parceiro", "yourInviteCode": "O Seu Código de Convite", "redeemCode": "Resgatar Código", "siteKey": "Chave do Site", "secretKey": "Chave Secreta", - "fullName": "Nome Completo", "preferredLanguage": "Idioma Preferido", "emailAddress": "Endereço de E-mail", "superAdminOnly": "(Apenas Super Admin)", "projectAccess": "Acesso ao Projeto", "globalAccessAll": "Global (Todos Presentes e Futuros)", "restrictedSpecific": "Restrito (Selecionar Específicos)", "globalAccessInfo": "Este utilizador terá acesso a todos os projetos por padrão e pode alternar entre eles usando o navegador de projetos.", "sendInvitation": "Enviar Convite", "cancelInvitation": "Cancelar Convite?", "removeTeamMember": "Remover Membro da Equipa?", "cancelInviteConfirm": "Tem a certeza de que pretende cancelar o convite para {{name}}? Ainda não se juntou à organização.", "removeMemberConfirm": "Tem a certeza de que pretende remover {{name}}? Perderá todo o acesso aos dados e projetos da organização.", "revokeInvitation": "Revogar Convite", "removeAccess": "Remover Acesso", "inviteSent": "Convite enviado com sucesso!", "inviteFailed": "Falha ao enviar convite.", "inviteCancelled": "Convite cancelado.", "memberRemoved": "Utilizador removido.", "actionFailed": "Ação falhou.", - "acceptInvitation": "Aceitar Convite", "invitedToJoin": "Foi convidado a juntar-se", "setPassword": "Definir Palavra-passe", "minimumCharsHint": "Mínimo 8 caracteres", "repeatPasswordHint": "Repetir palavra-passe", "activating": "A ativar...", "activateAccount": "Ativar Conta", "accountActivated": "Conta ativada! A redirecionar...", "noTokenFound": "Nenhum token de convite encontrado no link.", "invalidInvite": "Convite inválido ou expirado.", "passwordMismatch": "As palavras-passe não coincidem.", "passwordTooShort": "A palavra-passe deve ter pelo menos 8 caracteres.", "activationFailed": "Falha ao ativar conta.", - "history": "Histórico", "genetics": "Genética", "editProfile": "Editar perfil", "sex": "Sexo", "birthDate": "Data de nascimento", "planted": "Plantado", "deathDate": "Data de falecimento", "removed": "Removido", "acquisitionSource": "Fonte de aquisição", "sourceDetails": "Detalhes da fonte", "loanStatus": "Estado do empréstimo", "transferred": "Transferido", "transferNote": "Nota de transferência", "lifeExpectancyShort": "Esperança de vida", "sexualMaturityShort": "Maturidade sexual", "avgAdultWeight": "Peso adulto médio", "avgAdultHeight": "Altura adulta média", "breedingSeason": "Época de reprodução", "nativeStatus": "Estado nativo", "speciesInfo": "Informações da espécie", "viewInSpeciesRegistry": "Ver no registo", "location": "Localização", "noCoordinatesAssigned": "Sem coordenadas atribuídas", "setLocation": "Definir localização", "weightTrend": "Tendência de peso", "growthTrend": "Tendência de crescimento", "logWeight": "Registar peso", "logHeight": "Registar altura", "addObservation": "Adicionar observação", "parentage": "Parentesco", "sire": "Pai", "dam": "Mãe", "performedBy": "Realizado por", "speciesDetail": "Detalhe da espécie", "weightHistory": "Histórico de peso", "healthHistory": "Histórico de saúde" + "dashboard": "Painel", + "networkMap": "Rede", + "plantMap": "Mapa da Flora", + "species": "Espécies", + "individuals": "Indivíduos", + "breeding": "Reprodução", + "usersRoles": "Utilizadores & Funções", + "organization": "Organização", + "superAdmin": "Super Admin", + "signOut": "Sair", + "currentProject": "Projeto Atual", + "allProjects": "Todos os Projetos", + "createNewProject": "Criar Novo Projeto", + "landingTitle": "Gestão de Criação em Cativeiro Open Source", + "landingSubtitle": "OpenStudbook é uma plataforma open-source para jardins zoológicos, aquários e jardins botânicos gerirem populações de espécies e rastrearem a genética.", + "createOrg": "Criar Organização", + "exploreDemo": "Explorar Demo", + "demoLogin": "Entrar no Demo", + "getStarted": "Começar", + "securePrivate": "Seguro & Privado", + "securePrivateDesc": "Os seus dados são seus. Escolha exatamente o que partilhar.", + "floraFauna": "Fauna & Flora", + "floraFaunaDesc": "Gestão unificada para animais e plantas.", + "globalNetwork": "Rede Global", + "globalNetworkDesc": "Conecte-se com parceiros em todo o mundo.", + "back": "Voltar", + "registerOrg": "Registar Organização", + "orgName": "Nome da Organização", + "orgFocus": "Foco", + "orgFocusExplanation": "Selecionar o foco irá pré-ativar as funcionalidades mais relevantes para a sua organização.", + "faunaManagement": "Gestão de Fauna", + "floraManagement": "Gestão de Flora", + "cityLocation": "Cidade / Localização", + "adminDetails": "Detalhes da Conta Admin", + "yourFullName": "O Seu Nome Completo", + "workEmail": "E-mail de Trabalho", + "password": "Palavra-passe", + "confirmPassword": "Confirmar Palavra-passe", + "verifyEmailAndContinue": "Verificar E-mail & Continuar", + "signIn": "Entrar", + "welcomeBack": "Bem-vindo de Volta", + "signInSubtitle": "Entre na sua organização.", + "forgotPassword": "Esqueceu a palavra-passe?", + "needAccount": "Precisa de uma conta? Registe-se aqui", + "backToLanding": "Voltar à Página Inicial", + "about": "Sobre", + "privacyPolicy": "Política de Privacidade", + "termsConditions": "Termos & Condições", + "dashboardReady": "O seu painel está pronto", + "dashboardReadyDesc": "Métricas, gráficos e análises de reprodução aparecerão aqui quando adicionar espécies e indivíduos à sua coleção.", + "addSpecies": "Adicionar Espécie", + "addIndividual": "Adicionar Indivíduo", + "overview": "Visão Geral", + "welcomeBackDashboard": "Bem-vindo de volta ao painel da sua organização.", + "totalSpecies": "Total de Espécies", + "totalIndividuals": "Total de Indivíduos", + "endangeredSpecies": "Espécies Ameaçadas", + "activeUsers": "Utilizadores Ativos", + "breedingPairs": "Pares de Reprodução Sugeridos", + "match": "Compatibilidade", + "noBreeding": "Sem recomendações de reprodução disponíveis neste momento.", + "popDist": "Distribuição da População", + "consStatus": "Rácio de Estado de Conservação", + "origin": "Origem da População", + "ageDist": "Distribuição de Idade & Sexo", + "wildCaught": "Capturado na Natureza", + "captiveBred": "Criado em Cativeiro", + "unknownOrigin": "Origem Desconhecida", + "males": "Machos", + "females": "Fêmeas", + "unknownSex": "Desconhecido", + "years": "anos", + "orgSettings": "Definições da Organização", + "orgSettingsSubtitle": "Gira os detalhes do seu jardim zoológico ou santuário.", + "locationName": "Nome do Local (Cidade/Estado)", + "geoLocation": "Geo-Localização (Mapa)", + "description": "Descrição", + "projectManagement": "Gestão de Projetos", + "projectManagementDesc": "Criar, editar ou eliminar projetos. Transferir espécies entre projetos.", + "dataManagement": "Gestão de Dados", + "dataManagementDesc": "Exporte os seus dados para arquivo ou transfira para outro sistema.", + "saveChanges": "Guardar Alterações", + "saved": "Guardado!", + "speciesDatabase": "Base de Dados de Espécies", + "speciesSubtitle": "Catalogue e gira os perfis biológicos da sua coleção.", + "commonName": "Nome Comum", + "commonNamePlaceholder": "ex. Panda Vermelho", + "scientificName": "Nome Científico", + "scientificNamePlaceholder": "ex. Ailurus fulgens", + "type": "Reino", + "animal": "Fauna", + "plant": "Flora", + "conservationStatus": "Estado de Conservação", + "sexualMaturity": "Maturidade Sexual (Anos)", + "lifeExpectancy": "Esperança de Vida (Anos)", + "autofill": "Preenchimento Automático", + "aiGenerate": "Ilustração IA", + "cancel": "Cancelar", + "save": "Guardar", + "add": "Adicionar", + "searchSpecies": "Pesquisar Espécies...", + "searchIndividuals": "Pesquisar Indivíduos...", + "indivSubtitleAnimal": "Acompanhe e gira os indivíduos sob os seus cuidados.", + "updateIndividual": "Atualizar Indivíduo", + "registerIndividual": "Registar Indivíduo", + "representativeImage": "Imagem Representativa", + "upload": "Carregar", + "noImageProvided": "Sem imagem fornecida", + "saveSpecies": "Guardar Espécie", + "updateSpecies": "Atualizar Espécie", + "lifespan": "Esperança de Vida", + "maturity": "Maturidade", + "noSpeciesFound": "Nenhuma espécie encontrada", + "adultWeight": "Peso Adulto", + "classification": "Classificação", + "monoecious": "Monóico", + "dioecious": "Dióico", + "maturityFlowering": "Maturidade / Floração", + "studbookId": "ID do Studbook", + "name": "Nome", + "saSubtitle": "Gestão e supervisão global do sistema.", + "security": "Segurança", + "email": "E-mail", + "landing": "Página Inicial", + "localisation": "Localização", + "network": "Rede", + "cacheManage": "Gestão de Cache Local", + "createOrgBtn": "Criar Organização", + "loginAs": "Entrar Como", + "hostTag": "Anfitrião", + "smtpTestSuccess": "Teste SMTP enviado com sucesso!", + "smtpSettings": "Definições SMTP", + "smtpHost": "Host SMTP", + "port": "Porta", + "username": "Nome de Utilizador", + "secureConnection": "Ligação Segura (SSL/TLS)", + "saveSettings": "Guardar Definições", + "securitySettings": "Definições de Segurança", + "enableMfa": "Ativar Autenticação de Dois Fatores", + "enableOrgMfa": "Forçar MFA da Organização", + "enableOrgMfaDesc": "Exigir que todos os membros desta organização utilizem MFA.", + "theming": "Tema", + "primaryColor": "Cor Principal", + "appLogo": "Logótipo da Aplicação", + "uploadLogo": "Carregar Logótipo", + "customCss": "CSS Personalizado", + "enableRegistration": "Ativar Registo", + "featureCards": "Cartões de Funcionalidades", + "addLanguage": "Adicionar Idioma", + "supportedLanguages": "Idiomas Suportados", + "heroTitle": "Título Hero", + "heroSubtitle": "Subtítulo Hero", + "staticPages": "Páginas Estáticas", + "clearCacheBtn": "Limpar Dados Locais", + "allOrganizations": "Todas as Organizações", + "searchName": "Pesquisar por nome...", + "emailVerifySubject": "Verifique o seu e-mail", + "emailVerifyBody": "

O seu código de verificação é: {{code}}

", + "emailInviteSubject": "Convite para se juntar a {{orgName}}", + "emailInviteBody": "

Olá {{userName}},

Foi convidado a juntar-se à equipa de gestão de {{orgName}}.

Clique no link abaixo para confirmar a sua conta e definir a sua palavra-passe:

Confirmar a Minha Conta

Se o botão não funcionar, copie este URL:
{{inviteUrl}}

", + "emailNotifySubject": "Notificação do Sistema", + "emailNotifyBody": "

Olá,

{{message}}

", + "registration": "Registo de Utilizador", + "mfa": "Autenticação de Dois Fatores", + "invite": "Convite de Equipa", + "notification": "Alertas do Sistema", + "teamMembers": "Membros da Equipa", + "teamSubtitle": "Gira o acesso e permissões da sua equipa.", + "bulkInvite": "Convite em Massa", + "inviteMember": "Convidar Membro", + "csvFormatTitle": "Formato CSV", + "csvFormatDesc": "Descarregue o nosso modelo para garantir que o seu CSV está corretamente formatado.", + "processingBulk": "A processar convites em massa...", + "selectSpecies": "Selecionar Espécie", + "saveEvent": "Guardar Evento", + "breedingSubtitle": "Acompanhe e gira pares de reprodução e resultados.", + "recordBreedingEvent": "Registar Evento", + "newBreedingLoan": "Novo Empréstimo", + "breedingEvents": "Eventos", + "breedingLoans": "Empréstimos", + "viewTitle": "Filtrar Vista", + "includePartnerOrgs": "Incluir Eventos de Parceiros", + "onboardingWelcome": "Bem-vindo ao OpenStudbook", + "onboardingSettingsTask": "Reveja as definições da sua organização abaixo e clique em 'Guardar Alterações' para continuar.", + "onboardingSaveAndNext": "Guardar & Continuar para Espécies", + "onboardingSpeciesTask": "Ótimo! Adicione a sua primeira espécie para começar a construir a sua coleção.", + "onboardingIndivTask": "Por fim, registe indivíduos para acompanhar o seu crescimento e histórico.", + "enablePage": "Ativar Funcionalidade", + "dashBlockTitle": "Título da Mensagem do Painel", + "dashBlockContent": "Conteúdo da Mensagem do Painel", + "customDashBlock": "Anúncio Personalizado do Painel", + "customDashBlockDesc": "Crie um bloco de anúncio personalizado que aparece no topo do painel para todos os utilizadores.", + "visibilityPrivacy": "Visibilidade & Privacidade", + "breedingLoanPolicy": "Política de Reprodução & Empréstimo", + "allowBreedingRequests": "Permitir Pedidos de Rede", + "allowBreedingRequestsDesc": "Permitir que organizações parceiras proponham empréstimos de reprodução através do mapa de rede.", + "whoReceivesRequests": "Contacto de Pedidos", + "whoReceivesRequestsDesc": "Qual utilizador deve ser notificado quando um pedido de empréstimo é recebido?", + "orgVisibility": "Listar no Diretório", + "orgVisibilityDesc": "Tornar a sua organização visível no mapa de rede global.", + "obscureLocation": "Ocultar Localização no Mapa", + "obscureLocationDesc": "Mascara a sua localização no mapa de rede para um raio de aproximadamente 10 milhas do seu local real.", + "speciesListVisibility": "Lista de Espécies Pública", + "speciesListVisibilityDesc": "Permitir que qualquer pessoa na rede veja as espécies que gere.", + "noPartnersFound": "Nenhum parceiro encontrado.", + "connectNewPartner": "Conectar Novo Parceiro", + "yourInviteCode": "O Seu Código de Convite", + "redeemCode": "Resgatar Código", + "siteKey": "Chave do Site", + "secretKey": "Chave Secreta", + "fullName": "Nome Completo", + "preferredLanguage": "Idioma Preferido", + "emailAddress": "Endereço de E-mail", + "superAdminOnly": "(Apenas Super Admin)", + "projectAccess": "Acesso ao Projeto", + "globalAccessAll": "Global (Todos Presentes e Futuros)", + "restrictedSpecific": "Restrito (Selecionar Específicos)", + "globalAccessInfo": "Este utilizador terá acesso a todos os projetos por padrão e pode alternar entre eles usando o navegador de projetos.", + "sendInvitation": "Enviar Convite", + "cancelInvitation": "Cancelar Convite?", + "removeTeamMember": "Remover Membro da Equipa?", + "cancelInviteConfirm": "Tem a certeza de que pretende cancelar o convite para {{name}}? Ainda não se juntou à organização.", + "removeMemberConfirm": "Tem a certeza de que pretende remover {{name}}? Perderá todo o acesso aos dados e projetos da organização.", + "revokeInvitation": "Revogar Convite", + "removeAccess": "Remover Acesso", + "inviteSent": "Convite enviado com sucesso!", + "inviteFailed": "Falha ao enviar convite.", + "inviteCancelled": "Convite cancelado.", + "memberRemoved": "Utilizador removido.", + "actionFailed": "Ação falhou.", + "acceptInvitation": "Aceitar Convite", + "invitedToJoin": "Foi convidado a juntar-se", + "setPassword": "Definir Palavra-passe", + "minimumCharsHint": "Mínimo 8 caracteres", + "repeatPasswordHint": "Repetir palavra-passe", + "activating": "A ativar...", + "activateAccount": "Ativar Conta", + "accountActivated": "Conta ativada! A redirecionar...", + "noTokenFound": "Nenhum token de convite encontrado no link.", + "invalidInvite": "Convite inválido ou expirado.", + "passwordMismatch": "As palavras-passe não coincidem.", + "passwordTooShort": "A palavra-passe deve ter pelo menos 8 caracteres.", + "activationFailed": "Falha ao ativar conta.", + "history": "Histórico", + "genetics": "Genética", + "editProfile": "Editar perfil", + "sex": "Sexo", + "birthDate": "Data de nascimento", + "planted": "Plantado", + "deathDate": "Data de falecimento", + "removed": "Removido", + "acquisitionSource": "Fonte de aquisição", + "sourceDetails": "Detalhes da fonte", + "loanStatus": "Estado do empréstimo", + "transferred": "Transferido", + "transferNote": "Nota de transferência", + "lifeExpectancyShort": "Esperança de vida", + "sexualMaturityShort": "Maturidade sexual", + "avgAdultWeight": "Peso adulto médio", + "avgAdultHeight": "Altura adulta média", + "breedingSeason": "Época de reprodução", + "nativeStatus": "Estado nativo", + "speciesInfo": "Informações da espécie", + "viewInSpeciesRegistry": "Ver no registo", + "location": "Localização", + "noCoordinatesAssigned": "Sem coordenadas atribuídas", + "setLocation": "Definir localização", + "weightTrend": "Tendência de peso", + "growthTrend": "Tendência de crescimento", + "logWeight": "Registar peso", + "logHeight": "Registar altura", + "addObservation": "Adicionar observação", + "parentage": "Parentesco", + "sire": "Pai", + "dam": "Mãe", + "performedBy": "Realizado por", + "speciesDetail": "Detalhe da espécie", + "weightHistory": "Histórico de peso", + "healthHistory": "Histórico de saúde", + "hideOrgName": "Ocultar Nome da Organização", + "hideOrgNameDesc": "Mostrar como 'Organização Anónima' no mapa de rede.", + "speciesListVisibilityNote": "Apenas visível para parceiros de rede registados.", + "showNativeStatus": "Mostrar Emblemas de Estado Nativo", + "showNativeStatusDesc": "Exibir indicadores de estado nativo/não-nativo/invasivo nos cartões de espécies e perfis de indivíduos.", + "locationMapNotice": "Adicionar uma localização precisa para a sua organização é importante para a funcionalidade de mapeamento em toda a aplicação. Por favor, defina uma localização e reveja as definições de privacidade abaixo.", + "useMyLocation": "Usar Minha Localização Atual", + "enableEnclosures": "Activar Recintos", + "enableAreas": "Activar Áreas", + "enableEnclosuresModuleDesc": "Activa o mapeamento avançado e o agrupamento de espécies por localização física.", + "addToHomeScreen": "Adicionar ao Ecrã Inicial", + "iosInstallHint": "No Safari, toque no botão Partilhar na parte inferior do ecrã e depois em 'Adicionar ao Ecrã Inicial'." } }, { @@ -131,24 +1522,297 @@ "name": "Español", "isDefault": false, "translations": { - "dashboard": "Panel", "networkMap": "Red", "plantMap": "Mapa de Flora", "species": "Especies", "individuals": "Individuos", "breeding": "Cría", "usersRoles": "Usuarios & Roles", "organization": "Organización", "superAdmin": "Super Admin", "signOut": "Cerrar Sesión", "currentProject": "Proyecto Actual", "allProjects": "Todos los Proyectos", "createNewProject": "Crear Nuevo Proyecto", - "landingTitle": "Gestión de Cría en Cautividad de Código Abierto", "landingSubtitle": "OpenStudbook es una plataforma de código abierto para zoológicos, acuarios y jardines botánicos para gestionar poblaciones de especies y rastrear la genética.", "createOrg": "Crear Organización", "exploreDemo": "Explorar Demo", "demoLogin": "Acceder al Demo", "getStarted": "Comenzar", "securePrivate": "Seguro y Privado", "securePrivateDesc": "Sus datos son suyos. Elija exactamente qué compartir.", "floraFauna": "Fauna y Flora", "floraFaunaDesc": "Gestión unificada para animales y plantas.", "globalNetwork": "Red Global", "globalNetworkDesc": "Conéctese con socios en todo el mundo.", "back": "Volver", "registerOrg": "Registrar Organización", "orgName": "Nombre de la Organización", "orgFocus": "Enfoque", "orgFocusExplanation": "Seleccionar el enfoque activará previamente las funciones más relevantes para su organización.", "faunaManagement": "Gestión de Fauna", "floraManagement": "Gestión de Flora", "cityLocation": "Ciudad / Ubicación", "adminDetails": "Detalles de la Cuenta Admin", "yourFullName": "Su Nombre Completo", "workEmail": "Correo de Trabajo", "password": "Contraseña", "confirmPassword": "Confirmar Contraseña", "verifyEmailAndContinue": "Verificar Correo y Continuar", "signIn": "Iniciar Sesión", "welcomeBack": "Bienvenido de Nuevo", "signInSubtitle": "Inicie sesión en su organización.", "forgotPassword": "¿Olvidó su contraseña?", "needAccount": "¿Necesita una cuenta? Regístrese aquí", "backToLanding": "Volver al Inicio", - "about": "Acerca de", "privacyPolicy": "Política de Privacidad", "termsConditions": "Términos y Condiciones", - "dashboardReady": "Tu panel está listo", "dashboardReadyDesc": "Las métricas, gráficos e información sobre cría aparecerán aquí una vez que hayas añadido especies e individuos a tu colección.", "addSpecies": "Añadir Especie", "addIndividual": "Añadir Individuo", - "overview": "Resumen", "welcomeBackDashboard": "Bienvenido de nuevo al panel de su organización.", "totalSpecies": "Total de Especies", "totalIndividuals": "Total de Individuos", "endangeredSpecies": "Especies en Peligro", "activeUsers": "Usuarios Activos", "breedingPairs": "Parejas de Cría Sugeridas", "match": "Compatibilidad", "noBreeding": "No hay recomendaciones de cría disponibles en este momento.", "popDist": "Distribución de la Población", "consStatus": "Proporción de Estado de Conservación", "origin": "Origen de la Población", "ageDist": "Distribución de Edad y Sexo", "wildCaught": "Capturado en Naturaleza", "captiveBred": "Criado en Cautividad", "unknownOrigin": "Origen Desconocido", "males": "Machos", "females": "Hembras", "unknownSex": "Desconocido", "years": "años", - "orgSettings": "Configuración de la Organización", "orgSettingsSubtitle": "Administre los detalles de su zoológico o santuario.", "locationName": "Nombre del Lugar (Ciudad/Estado)", "geoLocation": "Geo-Localización (Mapa)", "description": "Descripción", "projectManagement": "Gestión de Proyectos", "projectManagementDesc": "Crear, editar o eliminar proyectos. Transferir especies entre proyectos.", "dataManagement": "Gestión de Datos", "dataManagementDesc": "Exporte sus datos para resguardo o transfiéralos a otro sistema.", "saveChanges": "Guardar Cambios", "saved": "¡Guardado!", - "speciesDatabase": "Base de Datos de Especies", "speciesSubtitle": "Catalogue y gestione los perfiles biológicos de su colección.", "commonName": "Nombre Común", "commonNamePlaceholder": "ej. Panda Rojo", "scientificName": "Nombre Científico", "scientificNamePlaceholder": "ej. Ailurus fulgens", "type": "Reino", "animal": "Fauna", "plant": "Flora", "conservationStatus": "Estado de Conservación", "sexualMaturity": "Madurez Sexual (Años)", "lifeExpectancy": "Esperanza de Vida (Años)", "autofill": "Autocompletar", "aiGenerate": "Ilustración IA", "cancel": "Cancelar", "save": "Guardar", "add": "Añadir", "searchSpecies": "Buscar Especies...", "searchIndividuals": "Buscar Individuos...", - "indivSubtitleAnimal": "Rastree y gestione los individuos bajo su cuidado.", "updateIndividual": "Actualizar Individuo", "registerIndividual": "Registrar Individuo", "representativeImage": "Imagen Representativa", "upload": "Subir", "noImageProvided": "Sin imagen proporcionada", "saveSpecies": "Guardar Especie", "updateSpecies": "Actualizar Especie", "lifespan": "Esperanza de Vida", "maturity": "Madurez", "noSpeciesFound": "No se encontraron especies", "adultWeight": "Peso Adulto", "classification": "Clasificación", "monoecious": "Monoico", "dioecious": "Dioico", "maturityFlowering": "Madurez / Floración", "studbookId": "ID del Studbook", "name": "Nombre", - "saSubtitle": "Gestión y supervisión global del sistema.", "security": "Seguridad", "email": "Correo Electrónico", "landing": "Página de Inicio", "localisation": "Localización", "network": "Red", "cacheManage": "Gestión de Caché Local", "createOrgBtn": "Crear Organización", "loginAs": "Iniciar Sesión Como", "hostTag": "Anfitrión", "smtpTestSuccess": "¡Prueba SMTP enviada con éxito!", "smtpSettings": "Configuración SMTP", "smtpHost": "Host SMTP", "port": "Puerto", "username": "Nombre de Usuario", "secureConnection": "Conexión Segura (SSL/TLS)", "saveSettings": "Guardar Configuración", "securitySettings": "Configuración de Seguridad", "enableMfa": "Activar Autenticación de Dos Factores", "enableOrgMfa": "Forzar MFA de Organización", "enableOrgMfaDesc": "Requerir que todos los miembros de esta organización usen MFA.", "theming": "Temas", "primaryColor": "Color Principal", "appLogo": "Logo de la Aplicación", "uploadLogo": "Subir Logo", "customCss": "CSS Personalizado", "enableRegistration": "Activar Registro", "featureCards": "Tarjetas de Funciones", "addLanguage": "Agregar Idioma", "supportedLanguages": "Idiomas Admitidos", "heroTitle": "Título Principal", "heroSubtitle": "Subtítulo Principal", "staticPages": "Páginas Estáticas", "clearCacheBtn": "Limpiar Datos Locales", "allOrganizations": "Todas las Organizaciones", "searchName": "Buscar por nombre...", - "emailVerifySubject": "Verifique su correo electrónico", "emailVerifyBody": "

Su código de verificación es: {{code}}

", "emailInviteSubject": "Invitación para unirse a {{orgName}}", "emailInviteBody": "

Hola {{userName}},

Ha sido invitado a unirse al equipo de gestión de {{orgName}}.

Haga clic en el enlace a continuación para confirmar su cuenta y establecer su contraseña:

Confirmar Mi Cuenta

Si el botón no funciona, copie esta URL:
{{inviteUrl}}

", "emailNotifySubject": "Notificación del Sistema", "emailNotifyBody": "

Hola,

{{message}}

", - "registration": "Registro de Usuario", "mfa": "Autenticación de Dos Factores", "invite": "Invitación de Equipo", "notification": "Alertas del Sistema", - "teamMembers": "Miembros del Equipo", "teamSubtitle": "Gestione el acceso y permisos de su equipo.", "bulkInvite": "Invitación Masiva", "inviteMember": "Invitar Miembro", "csvFormatTitle": "Formato CSV", "csvFormatDesc": "Descargue nuestra plantilla para asegurarse de que su CSV esté correctamente formateado.", "processingBulk": "Procesando invitaciones masivas...", "selectSpecies": "Seleccionar Especie", "saveEvent": "Guardar Evento", "breedingSubtitle": "Rastree y gestione parejas de cría y resultados.", "recordBreedingEvent": "Registrar Evento", "newBreedingLoan": "Nuevo Préstamo", "breedingEvents": "Eventos", "breedingLoans": "Préstamos", "viewTitle": "Filtrar Vista", "includePartnerOrgs": "Incluir Eventos de Socios", - "onboardingWelcome": "Bienvenido a OpenStudbook", "onboardingSettingsTask": "Revise la configuración de su organización a continuación y haga clic en 'Guardar Cambios' para continuar.", "onboardingSaveAndNext": "Guardar y Continuar a Especies", "onboardingSpeciesTask": "¡Excelente! Ahora añada su primera especie para comenzar a construir su colección.", "onboardingIndivTask": "Por último, registre individuos para rastrear su crecimiento e historial.", - "enablePage": "Activar Función", "dashBlockTitle": "Título del Mensaje del Panel", "dashBlockContent": "Contenido del Mensaje del Panel", "customDashBlock": "Anuncio Personalizado del Panel", "customDashBlockDesc": "Cree un bloque de anuncio personalizado que aparece en la parte superior del panel para todos los usuarios.", "visibilityPrivacy": "Visibilidad y Privacidad", "breedingLoanPolicy": "Política de Cría y Préstamo", "allowBreedingRequests": "Permitir Solicitudes de Red", "allowBreedingRequestsDesc": "Permitir que organizaciones socias propongan préstamos de cría a través del mapa de red.", "whoReceivesRequests": "Contacto de Solicitudes", "whoReceivesRequestsDesc": "¿Qué usuario debe ser notificado cuando se recibe una solicitud de préstamo?", "orgVisibility": "Listar en el Directorio", "orgVisibilityDesc": "Haga visible su organización en el mapa de red global.", "obscureLocation": "Ocultar Ubicación en el Mapa", "obscureLocationDesc": "Redondee las coordenadas del mapa para evitar el rastreo preciso por no socios.", "speciesListVisibility": "Lista de Especies Pública", "speciesListVisibilityDesc": "Permitir que cualquier persona en la red vea qué especies gestiona.", - "noPartnersFound": "No se encontraron socios.", "connectNewPartner": "Conectar Nuevo Socio", "yourInviteCode": "Su Código de Invitación", "redeemCode": "Canjear Código", "siteKey": "Clave del Sitio", "secretKey": "Clave Secreta", - "fullName": "Nombre Completo", "preferredLanguage": "Idioma Preferido", "emailAddress": "Dirección de Correo", "superAdminOnly": "(Solo Super Admin)", "projectAccess": "Acceso al Proyecto", "globalAccessAll": "Global (Todos Presentes y Futuros)", "restrictedSpecific": "Restringido (Seleccionar Específicos)", "globalAccessInfo": "Este usuario tendrá acceso a todos los proyectos por defecto y puede cambiar entre ellos usando el navegador de proyectos.", "sendInvitation": "Enviar Invitación", "cancelInvitation": "¿Cancelar Invitación?", "removeTeamMember": "¿Eliminar Miembro del Equipo?", "cancelInviteConfirm": "¿Está seguro de que desea cancelar la invitación para {{name}}? Aún no se ha unido a la organización.", "removeMemberConfirm": "¿Está seguro de que desea eliminar a {{name}}? Perderá todo acceso a los datos y proyectos de la organización.", "revokeInvitation": "Revocar Invitación", "removeAccess": "Eliminar Acceso", "inviteSent": "¡Invitación enviada con éxito!", "inviteFailed": "Error al enviar la invitación.", "inviteCancelled": "Invitación cancelada.", "memberRemoved": "Usuario eliminado.", "actionFailed": "La acción falló.", - "acceptInvitation": "Aceptar Invitación", "invitedToJoin": "Ha sido invitado a unirse", "setPassword": "Establecer Contraseña", "minimumCharsHint": "Mínimo 8 caracteres", "repeatPasswordHint": "Repetir contraseña", "activating": "Activando...", "activateAccount": "Activar Cuenta", "accountActivated": "¡Cuenta activada! Redirigiendo...", "noTokenFound": "No se encontró token de invitación en el enlace.", "invalidInvite": "Invitación inválida o expirada.", "passwordMismatch": "Las contraseñas no coinciden.", "passwordTooShort": "La contraseña debe tener al menos 8 caracteres.", "activationFailed": "Error al activar la cuenta.", - "history": "Historial", "genetics": "Genética", "editProfile": "Editar perfil", "sex": "Sexo", "birthDate": "Fecha de nacimiento", "planted": "Plantado", "deathDate": "Fecha de fallecimiento", "removed": "Eliminado", "acquisitionSource": "Fuente de adquisición", "sourceDetails": "Detalles de la fuente", "loanStatus": "Estado del préstamo", "transferred": "Transferido", "transferNote": "Nota de transferencia", "lifeExpectancyShort": "Esperanza de vida", "sexualMaturityShort": "Madurez sexual", "avgAdultWeight": "Peso adulto promedio", "avgAdultHeight": "Altura adulta promedio", "breedingSeason": "Temporada de cría", "nativeStatus": "Estado nativo", "speciesInfo": "Información de la especie", "viewInSpeciesRegistry": "Ver en el registro", "location": "Ubicación", "noCoordinatesAssigned": "Sin coordenadas asignadas", "setLocation": "Establecer ubicación", "weightTrend": "Tendencia de peso", "growthTrend": "Tendencia de crecimiento", "logWeight": "Registrar peso", "logHeight": "Registrar altura", "addObservation": "Añadir observación", "parentage": "Parentesco", "sire": "Padre", "dam": "Madre", "performedBy": "Realizado por", "speciesDetail": "Detalle de la especie", "weightHistory": "Historial de peso", "healthHistory": "Historial de salud" + "dashboard": "Panel", + "networkMap": "Red", + "plantMap": "Mapa de Flora", + "species": "Especies", + "individuals": "Individuos", + "breeding": "Cría", + "usersRoles": "Usuarios & Roles", + "organization": "Organización", + "superAdmin": "Super Admin", + "signOut": "Cerrar Sesión", + "currentProject": "Proyecto Actual", + "allProjects": "Todos los Proyectos", + "createNewProject": "Crear Nuevo Proyecto", + "landingTitle": "Gestión de Cría en Cautividad de Código Abierto", + "landingSubtitle": "OpenStudbook es una plataforma de código abierto para zoológicos, acuarios y jardines botánicos para gestionar poblaciones de especies y rastrear la genética.", + "createOrg": "Crear Organización", + "exploreDemo": "Explorar Demo", + "demoLogin": "Acceder al Demo", + "getStarted": "Comenzar", + "securePrivate": "Seguro y Privado", + "securePrivateDesc": "Sus datos son suyos. Elija exactamente qué compartir.", + "floraFauna": "Fauna y Flora", + "floraFaunaDesc": "Gestión unificada para animales y plantas.", + "globalNetwork": "Red Global", + "globalNetworkDesc": "Conéctese con socios en todo el mundo.", + "back": "Volver", + "registerOrg": "Registrar Organización", + "orgName": "Nombre de la Organización", + "orgFocus": "Enfoque", + "orgFocusExplanation": "Seleccionar el enfoque activará previamente las funciones más relevantes para su organización.", + "faunaManagement": "Gestión de Fauna", + "floraManagement": "Gestión de Flora", + "cityLocation": "Ciudad / Ubicación", + "adminDetails": "Detalles de la Cuenta Admin", + "yourFullName": "Su Nombre Completo", + "workEmail": "Correo de Trabajo", + "password": "Contraseña", + "confirmPassword": "Confirmar Contraseña", + "verifyEmailAndContinue": "Verificar Correo y Continuar", + "signIn": "Iniciar Sesión", + "welcomeBack": "Bienvenido de Nuevo", + "signInSubtitle": "Inicie sesión en su organización.", + "forgotPassword": "¿Olvidó su contraseña?", + "needAccount": "¿Necesita una cuenta? Regístrese aquí", + "backToLanding": "Volver al Inicio", + "about": "Acerca de", + "privacyPolicy": "Política de Privacidad", + "termsConditions": "Términos y Condiciones", + "dashboardReady": "Tu panel está listo", + "dashboardReadyDesc": "Las métricas, gráficos e información sobre cría aparecerán aquí una vez que hayas añadido especies e individuos a tu colección.", + "addSpecies": "Añadir Especie", + "addIndividual": "Añadir Individuo", + "overview": "Resumen", + "welcomeBackDashboard": "Bienvenido de nuevo al panel de su organización.", + "totalSpecies": "Total de Especies", + "totalIndividuals": "Total de Individuos", + "endangeredSpecies": "Especies en Peligro", + "activeUsers": "Usuarios Activos", + "breedingPairs": "Parejas de Cría Sugeridas", + "match": "Compatibilidad", + "noBreeding": "No hay recomendaciones de cría disponibles en este momento.", + "popDist": "Distribución de la Población", + "consStatus": "Proporción de Estado de Conservación", + "origin": "Origen de la Población", + "ageDist": "Distribución de Edad y Sexo", + "wildCaught": "Capturado en Naturaleza", + "captiveBred": "Criado en Cautividad", + "unknownOrigin": "Origen Desconocido", + "males": "Machos", + "females": "Hembras", + "unknownSex": "Desconocido", + "years": "años", + "orgSettings": "Configuración de la Organización", + "orgSettingsSubtitle": "Administre los detalles de su zoológico o santuario.", + "locationName": "Nombre del Lugar (Ciudad/Estado)", + "geoLocation": "Geo-Localización (Mapa)", + "description": "Descripción", + "projectManagement": "Gestión de Proyectos", + "projectManagementDesc": "Crear, editar o eliminar proyectos. Transferir especies entre proyectos.", + "dataManagement": "Gestión de Datos", + "dataManagementDesc": "Exporte sus datos para resguardo o transfiéralos a otro sistema.", + "saveChanges": "Guardar Cambios", + "saved": "¡Guardado!", + "speciesDatabase": "Base de Datos de Especies", + "speciesSubtitle": "Catalogue y gestione los perfiles biológicos de su colección.", + "commonName": "Nombre Común", + "commonNamePlaceholder": "ej. Panda Rojo", + "scientificName": "Nombre Científico", + "scientificNamePlaceholder": "ej. Ailurus fulgens", + "type": "Reino", + "animal": "Fauna", + "plant": "Flora", + "conservationStatus": "Estado de Conservación", + "sexualMaturity": "Madurez Sexual (Años)", + "lifeExpectancy": "Esperanza de Vida (Años)", + "autofill": "Autocompletar", + "aiGenerate": "Ilustración IA", + "cancel": "Cancelar", + "save": "Guardar", + "add": "Añadir", + "searchSpecies": "Buscar Especies...", + "searchIndividuals": "Buscar Individuos...", + "indivSubtitleAnimal": "Rastree y gestione los individuos bajo su cuidado.", + "updateIndividual": "Actualizar Individuo", + "registerIndividual": "Registrar Individuo", + "representativeImage": "Imagen Representativa", + "upload": "Subir", + "noImageProvided": "Sin imagen proporcionada", + "saveSpecies": "Guardar Especie", + "updateSpecies": "Actualizar Especie", + "lifespan": "Esperanza de Vida", + "maturity": "Madurez", + "noSpeciesFound": "No se encontraron especies", + "adultWeight": "Peso Adulto", + "classification": "Clasificación", + "monoecious": "Monoico", + "dioecious": "Dioico", + "maturityFlowering": "Madurez / Floración", + "studbookId": "ID del Studbook", + "name": "Nombre", + "saSubtitle": "Gestión y supervisión global del sistema.", + "security": "Seguridad", + "email": "Correo Electrónico", + "landing": "Página de Inicio", + "localisation": "Localización", + "network": "Red", + "cacheManage": "Gestión de Caché Local", + "createOrgBtn": "Crear Organización", + "loginAs": "Iniciar Sesión Como", + "hostTag": "Anfitrión", + "smtpTestSuccess": "¡Prueba SMTP enviada con éxito!", + "smtpSettings": "Configuración SMTP", + "smtpHost": "Host SMTP", + "port": "Puerto", + "username": "Nombre de Usuario", + "secureConnection": "Conexión Segura (SSL/TLS)", + "saveSettings": "Guardar Configuración", + "securitySettings": "Configuración de Seguridad", + "enableMfa": "Activar Autenticación de Dos Factores", + "enableOrgMfa": "Forzar MFA de Organización", + "enableOrgMfaDesc": "Requerir que todos los miembros de esta organización usen MFA.", + "theming": "Temas", + "primaryColor": "Color Principal", + "appLogo": "Logo de la Aplicación", + "uploadLogo": "Subir Logo", + "customCss": "CSS Personalizado", + "enableRegistration": "Activar Registro", + "featureCards": "Tarjetas de Funciones", + "addLanguage": "Agregar Idioma", + "supportedLanguages": "Idiomas Admitidos", + "heroTitle": "Título Principal", + "heroSubtitle": "Subtítulo Principal", + "staticPages": "Páginas Estáticas", + "clearCacheBtn": "Limpiar Datos Locales", + "allOrganizations": "Todas las Organizaciones", + "searchName": "Buscar por nombre...", + "emailVerifySubject": "Verifique su correo electrónico", + "emailVerifyBody": "

Su código de verificación es: {{code}}

", + "emailInviteSubject": "Invitación para unirse a {{orgName}}", + "emailInviteBody": "

Hola {{userName}},

Ha sido invitado a unirse al equipo de gestión de {{orgName}}.

Haga clic en el enlace a continuación para confirmar su cuenta y establecer su contraseña:

Confirmar Mi Cuenta

Si el botón no funciona, copie esta URL:
{{inviteUrl}}

", + "emailNotifySubject": "Notificación del Sistema", + "emailNotifyBody": "

Hola,

{{message}}

", + "registration": "Registro de Usuario", + "mfa": "Autenticación de Dos Factores", + "invite": "Invitación de Equipo", + "notification": "Alertas del Sistema", + "teamMembers": "Miembros del Equipo", + "teamSubtitle": "Gestione el acceso y permisos de su equipo.", + "bulkInvite": "Invitación Masiva", + "inviteMember": "Invitar Miembro", + "csvFormatTitle": "Formato CSV", + "csvFormatDesc": "Descargue nuestra plantilla para asegurarse de que su CSV esté correctamente formateado.", + "processingBulk": "Procesando invitaciones masivas...", + "selectSpecies": "Seleccionar Especie", + "saveEvent": "Guardar Evento", + "breedingSubtitle": "Rastree y gestione parejas de cría y resultados.", + "recordBreedingEvent": "Registrar Evento", + "newBreedingLoan": "Nuevo Préstamo", + "breedingEvents": "Eventos", + "breedingLoans": "Préstamos", + "viewTitle": "Filtrar Vista", + "includePartnerOrgs": "Incluir Eventos de Socios", + "onboardingWelcome": "Bienvenido a OpenStudbook", + "onboardingSettingsTask": "Revise la configuración de su organización a continuación y haga clic en 'Guardar Cambios' para continuar.", + "onboardingSaveAndNext": "Guardar y Continuar a Especies", + "onboardingSpeciesTask": "¡Excelente! Ahora añada su primera especie para comenzar a construir su colección.", + "onboardingIndivTask": "Por último, registre individuos para rastrear su crecimiento e historial.", + "enablePage": "Activar Función", + "dashBlockTitle": "Título del Mensaje del Panel", + "dashBlockContent": "Contenido del Mensaje del Panel", + "customDashBlock": "Anuncio Personalizado del Panel", + "customDashBlockDesc": "Cree un bloque de anuncio personalizado que aparece en la parte superior del panel para todos los usuarios.", + "visibilityPrivacy": "Visibilidad y Privacidad", + "breedingLoanPolicy": "Política de Cría y Préstamo", + "allowBreedingRequests": "Permitir Solicitudes de Red", + "allowBreedingRequestsDesc": "Permitir que organizaciones socias propongan préstamos de cría a través del mapa de red.", + "whoReceivesRequests": "Contacto de Solicitudes", + "whoReceivesRequestsDesc": "¿Qué usuario debe ser notificado cuando se recibe una solicitud de préstamo?", + "orgVisibility": "Listar en el Directorio", + "orgVisibilityDesc": "Haga visible su organización en el mapa de red global.", + "obscureLocation": "Ocultar Ubicación en el Mapa", + "obscureLocationDesc": "Oculta su ubicación en el mapa de red a un radio de aproximadamente 10 millas de su sitio real.", + "speciesListVisibility": "Lista de Especies Pública", + "speciesListVisibilityDesc": "Permitir que cualquier persona en la red vea qué especies gestiona.", + "noPartnersFound": "No se encontraron socios.", + "connectNewPartner": "Conectar Nuevo Socio", + "yourInviteCode": "Su Código de Invitación", + "redeemCode": "Canjear Código", + "siteKey": "Clave del Sitio", + "secretKey": "Clave Secreta", + "fullName": "Nombre Completo", + "preferredLanguage": "Idioma Preferido", + "emailAddress": "Dirección de Correo", + "superAdminOnly": "(Solo Super Admin)", + "projectAccess": "Acceso al Proyecto", + "globalAccessAll": "Global (Todos Presentes y Futuros)", + "restrictedSpecific": "Restringido (Seleccionar Específicos)", + "globalAccessInfo": "Este usuario tendrá acceso a todos los proyectos por defecto y puede cambiar entre ellos usando el navegador de proyectos.", + "sendInvitation": "Enviar Invitación", + "cancelInvitation": "¿Cancelar Invitación?", + "removeTeamMember": "¿Eliminar Miembro del Equipo?", + "cancelInviteConfirm": "¿Está seguro de que desea cancelar la invitación para {{name}}? Aún no se ha unido a la organización.", + "removeMemberConfirm": "¿Está seguro de que desea eliminar a {{name}}? Perderá todo acceso a los datos y proyectos de la organización.", + "revokeInvitation": "Revocar Invitación", + "removeAccess": "Eliminar Acceso", + "inviteSent": "¡Invitación enviada con éxito!", + "inviteFailed": "Error al enviar la invitación.", + "inviteCancelled": "Invitación cancelada.", + "memberRemoved": "Usuario eliminado.", + "actionFailed": "La acción falló.", + "acceptInvitation": "Aceptar Invitación", + "invitedToJoin": "Ha sido invitado a unirse", + "setPassword": "Establecer Contraseña", + "minimumCharsHint": "Mínimo 8 caracteres", + "repeatPasswordHint": "Repetir contraseña", + "activating": "Activando...", + "activateAccount": "Activar Cuenta", + "accountActivated": "¡Cuenta activada! Redirigiendo...", + "noTokenFound": "No se encontró token de invitación en el enlace.", + "invalidInvite": "Invitación inválida o expirada.", + "passwordMismatch": "Las contraseñas no coinciden.", + "passwordTooShort": "La contraseña debe tener al menos 8 caracteres.", + "activationFailed": "Error al activar la cuenta.", + "history": "Historial", + "genetics": "Genética", + "editProfile": "Editar perfil", + "sex": "Sexo", + "birthDate": "Fecha de nacimiento", + "planted": "Plantado", + "deathDate": "Fecha de fallecimiento", + "removed": "Eliminado", + "acquisitionSource": "Fuente de adquisición", + "sourceDetails": "Detalles de la fuente", + "loanStatus": "Estado del préstamo", + "transferred": "Transferido", + "transferNote": "Nota de transferencia", + "lifeExpectancyShort": "Esperanza de vida", + "sexualMaturityShort": "Madurez sexual", + "avgAdultWeight": "Peso adulto promedio", + "avgAdultHeight": "Altura adulta promedio", + "breedingSeason": "Temporada de cría", + "nativeStatus": "Estado nativo", + "speciesInfo": "Información de la especie", + "viewInSpeciesRegistry": "Ver en el registro", + "location": "Ubicación", + "noCoordinatesAssigned": "Sin coordenadas asignadas", + "setLocation": "Establecer ubicación", + "weightTrend": "Tendencia de peso", + "growthTrend": "Tendencia de crecimiento", + "logWeight": "Registrar peso", + "logHeight": "Registrar altura", + "addObservation": "Añadir observación", + "parentage": "Parentesco", + "sire": "Padre", + "dam": "Madre", + "performedBy": "Realizado por", + "speciesDetail": "Detalle de la especie", + "weightHistory": "Historial de peso", + "healthHistory": "Historial de salud", + "hideOrgName": "Ocultar Nombre de la Organización", + "hideOrgNameDesc": "Mostrar como 'Organización Anónima' en el mapa de red.", + "speciesListVisibilityNote": "Solo visible para socios de red registrados.", + "showNativeStatus": "Mostrar Insignias de Estado Nativo", + "showNativeStatusDesc": "Mostrar indicadores de estado nativo/no nativo/invasivo en las tarjetas de especies y perfiles de individuos.", + "locationMapNotice": "Añadir una ubicación precisa para su organización es importante para la funcionalidad de mapeo en toda la aplicación. Por favor, establezca una ubicación y revise la configuración de privacidad a continuación.", + "useMyLocation": "Usar Mi Ubicación Actual", + "enableEnclosures": "Activar Recintos", + "enableAreas": "Activar Áreas", + "enableEnclosuresModuleDesc": "Activa el mapeo avanzado y la agrupación de especies por ubicación física.", + "addToHomeScreen": "Añadir a la pantalla de inicio", + "iosInstallHint": "En Safari, toca el botón Compartir en la parte inferior de la pantalla y luego 'Añadir a pantalla de inicio'." } }, { @@ -156,24 +1820,297 @@ "name": "Français", "isDefault": false, "translations": { - "dashboard": "Tableau de bord", "networkMap": "Réseau", "plantMap": "Carte de la Flore", "species": "Espèces", "individuals": "Individus", "breeding": "Reproduction", "usersRoles": "Utilisateurs & Rôles", "organization": "Organisation", "superAdmin": "Super Admin", "signOut": "Se déconnecter", "currentProject": "Projet actuel", "allProjects": "Tous les projets", "createNewProject": "Créer un nouveau projet", - "landingTitle": "Gestion de l'élevage en captivité Open Source", "landingSubtitle": "OpenStudbook est une plateforme open-source pour les zoos, aquariums et jardins botaniques afin de gérer les populations d'espèces et suivre la génétique.", "createOrg": "Créer une organisation", "exploreDemo": "Explorer la démo", "demoLogin": "Connexion démo", "getStarted": "Commencer", "securePrivate": "Sécurisé & Privé", "securePrivateDesc": "Vos données vous appartiennent. Choisissez exactement ce que vous partagez.", "floraFauna": "Faune & Flore", "floraFaunaDesc": "Gestion unifiée pour animaux et plantes.", "globalNetwork": "Réseau mondial", "globalNetworkDesc": "Connectez-vous avec des partenaires du monde entier.", "back": "Retour", "registerOrg": "Enregistrer l'organisation", "orgName": "Nom de l'organisation", "orgFocus": "Focus", "orgFocusExplanation": "Sélectionner le focus activera les fonctionnalités les plus pertinentes pour votre organisation.", "faunaManagement": "Gestion de la faune", "floraManagement": "Gestion de la flore", "cityLocation": "Ville / Localisation", "adminDetails": "Détails du compte Admin", "yourFullName": "Votre nom complet", "workEmail": "E-mail professionnel", "password": "Mot de passe", "confirmPassword": "Confirmer le mot de passe", "verifyEmailAndContinue": "Vérifier l'e-mail & Continuer", "signIn": "Se connecter", "welcomeBack": "Bienvenue", "signInSubtitle": "Connectez-vous à votre organisation.", "forgotPassword": "Mot de passe oublié ?", "needAccount": "Besoin d'un compte ? Inscrivez-vous ici", "backToLanding": "Retour à l'accueil", - "about": "À propos", "privacyPolicy": "Politique de confidentialité", "termsConditions": "Conditions générales", - "dashboardReady": "Votre tableau de bord est prêt", "dashboardReadyDesc": "Les métriques, graphiques et analyses d'élevage apparaîtront ici une fois que vous aurez ajouté des espèces et des individus à votre collection.", "addSpecies": "Ajouter une espèce", "addIndividual": "Ajouter un individu", - "overview": "Vue d'ensemble", "welcomeBackDashboard": "Bienvenue dans le tableau de bord de votre organisation.", "totalSpecies": "Total des espèces", "totalIndividuals": "Total des individus", "endangeredSpecies": "Espèces menacées", "activeUsers": "Utilisateurs actifs", "breedingPairs": "Couples de reproduction suggérés", "match": "Compatibilité", "noBreeding": "Aucune recommandation de reproduction disponible pour le moment.", "popDist": "Distribution de la population", "consStatus": "Ratio du statut de conservation", "origin": "Origine de la population", "ageDist": "Distribution par âge et sexe", "wildCaught": "Capturé dans la nature", "captiveBred": "Élevé en captivité", "unknownOrigin": "Origine inconnue", "males": "Mâles", "females": "Femelles", "unknownSex": "Inconnu", "years": "ans", - "orgSettings": "Paramètres de l'organisation", "orgSettingsSubtitle": "Gérez les détails de votre zoo ou sanctuaire.", "locationName": "Nom du lieu (Ville/Région)", "geoLocation": "Géo-localisation (Carte)", "description": "Description", "projectManagement": "Gestion des projets", "projectManagementDesc": "Créer, modifier ou supprimer des projets. Transférer des espèces entre projets.", "dataManagement": "Gestion des données", "dataManagementDesc": "Exportez vos données pour sauvegarde ou transférez-les vers un autre système.", "saveChanges": "Enregistrer les modifications", "saved": "Enregistré !", - "speciesDatabase": "Base de données des espèces", "speciesSubtitle": "Cataloguez et gérez les profils biologiques de votre collection.", "commonName": "Nom commun", "commonNamePlaceholder": "ex. Panda roux", "scientificName": "Nom scientifique", "scientificNamePlaceholder": "ex. Ailurus fulgens", "type": "Règne", "animal": "Faune", "plant": "Flore", "conservationStatus": "Statut de conservation", "sexualMaturity": "Maturité sexuelle (Années)", "lifeExpectancy": "Espérance de vie (Années)", "autofill": "Remplissage automatique", "aiGenerate": "Illustration IA", "cancel": "Annuler", "save": "Enregistrer", "add": "Ajouter", "searchSpecies": "Rechercher des espèces...", "searchIndividuals": "Rechercher des individus...", - "indivSubtitleAnimal": "Suivez et gérez les individus sous votre garde.", "updateIndividual": "Mettre à jour l'individu", "registerIndividual": "Enregistrer l'individu", "representativeImage": "Image représentative", "upload": "Télécharger", "noImageProvided": "Aucune image fournie", "saveSpecies": "Enregistrer l'espèce", "updateSpecies": "Mettre à jour l'espèce", "lifespan": "Durée de vie", "maturity": "Maturité", "noSpeciesFound": "Aucune espèce trouvée", "adultWeight": "Poids adulte", "classification": "Classification", "monoecious": "Monoïque", "dioecious": "Dioïque", "maturityFlowering": "Maturité / Floraison", "studbookId": "ID du Studbook", "name": "Nom", - "saSubtitle": "Gestion et supervision globale du système.", "security": "Sécurité", "email": "E-mail", "landing": "Page d'accueil", "localisation": "Localisation", "network": "Réseau", "cacheManage": "Gestion du cache local", "createOrgBtn": "Créer une organisation", "loginAs": "Se connecter en tant que", "hostTag": "Hôte", "smtpTestSuccess": "Test SMTP envoyé avec succès !", "smtpSettings": "Paramètres SMTP", "smtpHost": "Hôte SMTP", "port": "Port", "username": "Nom d'utilisateur", "secureConnection": "Connexion sécurisée (SSL/TLS)", "saveSettings": "Enregistrer les paramètres", "securitySettings": "Paramètres de sécurité", "enableMfa": "Activer l'authentification à deux facteurs", "enableOrgMfa": "Forcer le MFA de l'organisation", "enableOrgMfaDesc": "Exiger que tous les membres de cette organisation utilisent le MFA.", "theming": "Thème", "primaryColor": "Couleur principale", "appLogo": "Logo de l'application", "uploadLogo": "Télécharger le logo", "customCss": "CSS personnalisé", "enableRegistration": "Activer l'inscription", "featureCards": "Cartes de fonctionnalités", "addLanguage": "Ajouter une langue", "supportedLanguages": "Langues prises en charge", "heroTitle": "Titre principal", "heroSubtitle": "Sous-titre principal", "staticPages": "Pages statiques", "clearCacheBtn": "Vider les données locales", "allOrganizations": "Toutes les organisations", "searchName": "Rechercher par nom...", - "emailVerifySubject": "Vérifiez votre e-mail", "emailVerifyBody": "

Votre code de vérification est : {{code}}

", "emailInviteSubject": "Invitation à rejoindre {{orgName}}", "emailInviteBody": "

Bonjour {{userName}},

Vous avez été invité à rejoindre l'équipe de gestion de {{orgName}}.

Veuillez cliquer sur le lien ci-dessous pour confirmer votre compte et définir votre mot de passe :

Confirmer mon compte

Si le bouton ne fonctionne pas, copiez cette URL :
{{inviteUrl}}

", "emailNotifySubject": "Notification du système", "emailNotifyBody": "

Bonjour,

{{message}}

", - "registration": "Inscription de l'utilisateur", "mfa": "Authentification à deux facteurs", "invite": "Invitation d'équipe", "notification": "Alertes système", - "teamMembers": "Membres de l'équipe", "teamSubtitle": "Gérez les accès et permissions de votre équipe.", "bulkInvite": "Invitation en masse", "inviteMember": "Inviter un membre", "csvFormatTitle": "Format CSV", "csvFormatDesc": "Téléchargez notre modèle pour vous assurer que votre CSV est correctement formaté.", "processingBulk": "Traitement des invitations en masse...", "selectSpecies": "Sélectionner une espèce", "saveEvent": "Enregistrer l'événement", "breedingSubtitle": "Suivez et gérez les couples de reproduction et les résultats.", "recordBreedingEvent": "Enregistrer un événement", "newBreedingLoan": "Nouveau prêt", "breedingEvents": "Événements", "breedingLoans": "Prêts", "viewTitle": "Filtrer la vue", "includePartnerOrgs": "Inclure les événements des partenaires", - "onboardingWelcome": "Bienvenue sur OpenStudbook", "onboardingSettingsTask": "Veuillez vérifier les paramètres de votre organisation ci-dessous et cliquer sur 'Enregistrer les modifications' pour continuer.", "onboardingSaveAndNext": "Enregistrer et continuer vers les espèces", "onboardingSpeciesTask": "Super ! Ajoutez maintenant votre première espèce pour commencer à construire votre collection.", "onboardingIndivTask": "Enfin, enregistrez des individus pour suivre leur croissance et leur historique.", - "enablePage": "Activer la fonctionnalité", "dashBlockTitle": "Titre du message du tableau de bord", "dashBlockContent": "Contenu du message du tableau de bord", "customDashBlock": "Annonce personnalisée du tableau de bord", "customDashBlockDesc": "Créez un bloc d'annonce personnalisé qui apparaît en haut du tableau de bord pour tous les utilisateurs.", "visibilityPrivacy": "Visibilité & Confidentialité", "breedingLoanPolicy": "Politique de reproduction & prêt", "allowBreedingRequests": "Autoriser les demandes réseau", "allowBreedingRequestsDesc": "Permettre aux organisations partenaires de proposer des prêts de reproduction via la carte réseau.", "whoReceivesRequests": "Contact des demandes", "whoReceivesRequestsDesc": "Quel utilisateur doit être notifié lorsqu'une demande de prêt est reçue ?", "orgVisibility": "Lister dans l'annuaire", "orgVisibilityDesc": "Rendre votre organisation visible sur la carte réseau mondiale.", "obscureLocation": "Masquer la localisation sur la carte", "obscureLocationDesc": "Arrondissez vos coordonnées de carte pour éviter le suivi précis par les non-partenaires.", "speciesListVisibility": "Liste d'espèces publique", "speciesListVisibilityDesc": "Permettre à quiconque sur le réseau de voir les espèces que vous gérez.", - "noPartnersFound": "Aucun partenaire trouvé.", "connectNewPartner": "Connecter un nouveau partenaire", "yourInviteCode": "Votre code d'invitation", "redeemCode": "Échanger le code", "siteKey": "Clé du site", "secretKey": "Clé secrète", - "fullName": "Nom complet", "preferredLanguage": "Langue préférée", "emailAddress": "Adresse e-mail", "superAdminOnly": "(Super Admin uniquement)", "projectAccess": "Accès au projet", "globalAccessAll": "Global (Tous présents et futurs)", "restrictedSpecific": "Restreint (Sélectionner spécifiques)", "globalAccessInfo": "Cet utilisateur aura accès à tous les projets par défaut et peut basculer entre eux en utilisant le navigateur de projets.", "sendInvitation": "Envoyer l'invitation", "cancelInvitation": "Annuler l'invitation ?", "removeTeamMember": "Supprimer le membre de l'équipe ?", "cancelInviteConfirm": "Êtes-vous sûr de vouloir annuler l'invitation pour {{name}} ? Il n'a pas encore rejoint l'organisation.", "removeMemberConfirm": "Êtes-vous sûr de vouloir supprimer {{name}} ? Il perdra tout accès aux données et projets de l'organisation.", "revokeInvitation": "Révoquer l'invitation", "removeAccess": "Supprimer l'accès", "inviteSent": "Invitation envoyée avec succès !", "inviteFailed": "Échec de l'envoi de l'invitation.", "inviteCancelled": "Invitation annulée.", "memberRemoved": "Utilisateur supprimé.", "actionFailed": "L'action a échoué.", - "acceptInvitation": "Accepter l'invitation", "invitedToJoin": "Vous avez été invité à rejoindre", "setPassword": "Définir le mot de passe", "minimumCharsHint": "Minimum 8 caractères", "repeatPasswordHint": "Répéter le mot de passe", "activating": "Activation en cours...", "activateAccount": "Activer le compte", "accountActivated": "Compte activé ! Redirection en cours...", "noTokenFound": "Aucun token d'invitation trouvé dans le lien.", "invalidInvite": "Invitation invalide ou expirée.", "passwordMismatch": "Les mots de passe ne correspondent pas.", "passwordTooShort": "Le mot de passe doit comporter au moins 8 caractères.", "activationFailed": "Échec de l'activation du compte.", - "history": "Historique", "genetics": "Génétique", "editProfile": "Modifier le profil", "sex": "Sexe", "birthDate": "Date de naissance", "planted": "Planté", "deathDate": "Date de décès", "removed": "Retiré", "acquisitionSource": "Source d'acquisition", "sourceDetails": "Détails de la source", "loanStatus": "Statut de prêt", "transferred": "Transféré", "transferNote": "Note de transfert", "lifeExpectancyShort": "Espérance de vie", "sexualMaturityShort": "Maturité sexuelle", "avgAdultWeight": "Poids adulte moyen", "avgAdultHeight": "Hauteur adulte moyenne", "breedingSeason": "Saison de reproduction", "nativeStatus": "Statut d'indigénat", "speciesInfo": "Informations sur l'espèce", "viewInSpeciesRegistry": "Voir dans le registre", "location": "Localisation", "noCoordinatesAssigned": "Aucune coordonnée assignée", "setLocation": "Définir la localisation", "weightTrend": "Tendance du poids", "growthTrend": "Tendance de croissance", "logWeight": "Enregistrer le poids", "logHeight": "Enregistrer la hauteur", "addObservation": "Ajouter une observation", "parentage": "Filiation", "sire": "Père", "dam": "Mère", "performedBy": "Réalisé par", "speciesDetail": "Détail de l'espèce", "weightHistory": "Historique de poids", "healthHistory": "Historique de santé" + "dashboard": "Tableau de bord", + "networkMap": "Réseau", + "plantMap": "Carte de la Flore", + "species": "Espèces", + "individuals": "Individus", + "breeding": "Reproduction", + "usersRoles": "Utilisateurs & Rôles", + "organization": "Organisation", + "superAdmin": "Super Admin", + "signOut": "Se déconnecter", + "currentProject": "Projet actuel", + "allProjects": "Tous les projets", + "createNewProject": "Créer un nouveau projet", + "landingTitle": "Gestion de l'élevage en captivité Open Source", + "landingSubtitle": "OpenStudbook est une plateforme open-source pour les zoos, aquariums et jardins botaniques afin de gérer les populations d'espèces et suivre la génétique.", + "createOrg": "Créer une organisation", + "exploreDemo": "Explorer la démo", + "demoLogin": "Connexion démo", + "getStarted": "Commencer", + "securePrivate": "Sécurisé & Privé", + "securePrivateDesc": "Vos données vous appartiennent. Choisissez exactement ce que vous partagez.", + "floraFauna": "Faune & Flore", + "floraFaunaDesc": "Gestion unifiée pour animaux et plantes.", + "globalNetwork": "Réseau mondial", + "globalNetworkDesc": "Connectez-vous avec des partenaires du monde entier.", + "back": "Retour", + "registerOrg": "Enregistrer l'organisation", + "orgName": "Nom de l'organisation", + "orgFocus": "Focus", + "orgFocusExplanation": "Sélectionner le focus activera les fonctionnalités les plus pertinentes pour votre organisation.", + "faunaManagement": "Gestion de la faune", + "floraManagement": "Gestion de la flore", + "cityLocation": "Ville / Localisation", + "adminDetails": "Détails du compte Admin", + "yourFullName": "Votre nom complet", + "workEmail": "E-mail professionnel", + "password": "Mot de passe", + "confirmPassword": "Confirmer le mot de passe", + "verifyEmailAndContinue": "Vérifier l'e-mail & Continuer", + "signIn": "Se connecter", + "welcomeBack": "Bienvenue", + "signInSubtitle": "Connectez-vous à votre organisation.", + "forgotPassword": "Mot de passe oublié ?", + "needAccount": "Besoin d'un compte ? Inscrivez-vous ici", + "backToLanding": "Retour à l'accueil", + "about": "À propos", + "privacyPolicy": "Politique de confidentialité", + "termsConditions": "Conditions générales", + "dashboardReady": "Votre tableau de bord est prêt", + "dashboardReadyDesc": "Les métriques, graphiques et analyses d'élevage apparaîtront ici une fois que vous aurez ajouté des espèces et des individus à votre collection.", + "addSpecies": "Ajouter une espèce", + "addIndividual": "Ajouter un individu", + "overview": "Vue d'ensemble", + "welcomeBackDashboard": "Bienvenue dans le tableau de bord de votre organisation.", + "totalSpecies": "Total des espèces", + "totalIndividuals": "Total des individus", + "endangeredSpecies": "Espèces menacées", + "activeUsers": "Utilisateurs actifs", + "breedingPairs": "Couples de reproduction suggérés", + "match": "Compatibilité", + "noBreeding": "Aucune recommandation de reproduction disponible pour le moment.", + "popDist": "Distribution de la population", + "consStatus": "Ratio du statut de conservation", + "origin": "Origine de la population", + "ageDist": "Distribution par âge et sexe", + "wildCaught": "Capturé dans la nature", + "captiveBred": "Élevé en captivité", + "unknownOrigin": "Origine inconnue", + "males": "Mâles", + "females": "Femelles", + "unknownSex": "Inconnu", + "years": "ans", + "orgSettings": "Paramètres de l'organisation", + "orgSettingsSubtitle": "Gérez les détails de votre zoo ou sanctuaire.", + "locationName": "Nom du lieu (Ville/Région)", + "geoLocation": "Géo-localisation (Carte)", + "description": "Description", + "projectManagement": "Gestion des projets", + "projectManagementDesc": "Créer, modifier ou supprimer des projets. Transférer des espèces entre projets.", + "dataManagement": "Gestion des données", + "dataManagementDesc": "Exportez vos données pour sauvegarde ou transférez-les vers un autre système.", + "saveChanges": "Enregistrer les modifications", + "saved": "Enregistré !", + "speciesDatabase": "Base de données des espèces", + "speciesSubtitle": "Cataloguez et gérez les profils biologiques de votre collection.", + "commonName": "Nom commun", + "commonNamePlaceholder": "ex. Panda roux", + "scientificName": "Nom scientifique", + "scientificNamePlaceholder": "ex. Ailurus fulgens", + "type": "Règne", + "animal": "Faune", + "plant": "Flore", + "conservationStatus": "Statut de conservation", + "sexualMaturity": "Maturité sexuelle (Années)", + "lifeExpectancy": "Espérance de vie (Années)", + "autofill": "Remplissage automatique", + "aiGenerate": "Illustration IA", + "cancel": "Annuler", + "save": "Enregistrer", + "add": "Ajouter", + "searchSpecies": "Rechercher des espèces...", + "searchIndividuals": "Rechercher des individus...", + "indivSubtitleAnimal": "Suivez et gérez les individus sous votre garde.", + "updateIndividual": "Mettre à jour l'individu", + "registerIndividual": "Enregistrer l'individu", + "representativeImage": "Image représentative", + "upload": "Télécharger", + "noImageProvided": "Aucune image fournie", + "saveSpecies": "Enregistrer l'espèce", + "updateSpecies": "Mettre à jour l'espèce", + "lifespan": "Durée de vie", + "maturity": "Maturité", + "noSpeciesFound": "Aucune espèce trouvée", + "adultWeight": "Poids adulte", + "classification": "Classification", + "monoecious": "Monoïque", + "dioecious": "Dioïque", + "maturityFlowering": "Maturité / Floraison", + "studbookId": "ID du Studbook", + "name": "Nom", + "saSubtitle": "Gestion et supervision globale du système.", + "security": "Sécurité", + "email": "E-mail", + "landing": "Page d'accueil", + "localisation": "Localisation", + "network": "Réseau", + "cacheManage": "Gestion du cache local", + "createOrgBtn": "Créer une organisation", + "loginAs": "Se connecter en tant que", + "hostTag": "Hôte", + "smtpTestSuccess": "Test SMTP envoyé avec succès !", + "smtpSettings": "Paramètres SMTP", + "smtpHost": "Hôte SMTP", + "port": "Port", + "username": "Nom d'utilisateur", + "secureConnection": "Connexion sécurisée (SSL/TLS)", + "saveSettings": "Enregistrer les paramètres", + "securitySettings": "Paramètres de sécurité", + "enableMfa": "Activer l'authentification à deux facteurs", + "enableOrgMfa": "Forcer le MFA de l'organisation", + "enableOrgMfaDesc": "Exiger que tous les membres de cette organisation utilisent le MFA.", + "theming": "Thème", + "primaryColor": "Couleur principale", + "appLogo": "Logo de l'application", + "uploadLogo": "Télécharger le logo", + "customCss": "CSS personnalisé", + "enableRegistration": "Activer l'inscription", + "featureCards": "Cartes de fonctionnalités", + "addLanguage": "Ajouter une langue", + "supportedLanguages": "Langues prises en charge", + "heroTitle": "Titre principal", + "heroSubtitle": "Sous-titre principal", + "staticPages": "Pages statiques", + "clearCacheBtn": "Vider les données locales", + "allOrganizations": "Toutes les organisations", + "searchName": "Rechercher par nom...", + "emailVerifySubject": "Vérifiez votre e-mail", + "emailVerifyBody": "

Votre code de vérification est : {{code}}

", + "emailInviteSubject": "Invitation à rejoindre {{orgName}}", + "emailInviteBody": "

Bonjour {{userName}},

Vous avez été invité à rejoindre l'équipe de gestion de {{orgName}}.

Veuillez cliquer sur le lien ci-dessous pour confirmer votre compte et définir votre mot de passe :

Confirmer mon compte

Si le bouton ne fonctionne pas, copiez cette URL :
{{inviteUrl}}

", + "emailNotifySubject": "Notification du système", + "emailNotifyBody": "

Bonjour,

{{message}}

", + "registration": "Inscription de l'utilisateur", + "mfa": "Authentification à deux facteurs", + "invite": "Invitation d'équipe", + "notification": "Alertes système", + "teamMembers": "Membres de l'équipe", + "teamSubtitle": "Gérez les accès et permissions de votre équipe.", + "bulkInvite": "Invitation en masse", + "inviteMember": "Inviter un membre", + "csvFormatTitle": "Format CSV", + "csvFormatDesc": "Téléchargez notre modèle pour vous assurer que votre CSV est correctement formaté.", + "processingBulk": "Traitement des invitations en masse...", + "selectSpecies": "Sélectionner une espèce", + "saveEvent": "Enregistrer l'événement", + "breedingSubtitle": "Suivez et gérez les couples de reproduction et les résultats.", + "recordBreedingEvent": "Enregistrer un événement", + "newBreedingLoan": "Nouveau prêt", + "breedingEvents": "Événements", + "breedingLoans": "Prêts", + "viewTitle": "Filtrer la vue", + "includePartnerOrgs": "Inclure les événements des partenaires", + "onboardingWelcome": "Bienvenue sur OpenStudbook", + "onboardingSettingsTask": "Veuillez vérifier les paramètres de votre organisation ci-dessous et cliquer sur 'Enregistrer les modifications' pour continuer.", + "onboardingSaveAndNext": "Enregistrer et continuer vers les espèces", + "onboardingSpeciesTask": "Super ! Ajoutez maintenant votre première espèce pour commencer à construire votre collection.", + "onboardingIndivTask": "Enfin, enregistrez des individus pour suivre leur croissance et leur historique.", + "enablePage": "Activer la fonctionnalité", + "dashBlockTitle": "Titre du message du tableau de bord", + "dashBlockContent": "Contenu du message du tableau de bord", + "customDashBlock": "Annonce personnalisée du tableau de bord", + "customDashBlockDesc": "Créez un bloc d'annonce personnalisé qui apparaît en haut du tableau de bord pour tous les utilisateurs.", + "visibilityPrivacy": "Visibilité & Confidentialité", + "breedingLoanPolicy": "Politique de reproduction & prêt", + "allowBreedingRequests": "Autoriser les demandes réseau", + "allowBreedingRequestsDesc": "Permettre aux organisations partenaires de proposer des prêts de reproduction via la carte réseau.", + "whoReceivesRequests": "Contact des demandes", + "whoReceivesRequestsDesc": "Quel utilisateur doit être notifié lorsqu'une demande de prêt est reçue ?", + "orgVisibility": "Lister dans l'annuaire", + "orgVisibilityDesc": "Rendre votre organisation visible sur la carte réseau mondiale.", + "obscureLocation": "Masquer la localisation sur la carte", + "obscureLocationDesc": "Masque votre emplacement sur la carte du réseau dans un rayon d'environ 10 miles de votre site réel.", + "speciesListVisibility": "Liste d'espèces publique", + "speciesListVisibilityDesc": "Permettre à quiconque sur le réseau de voir les espèces que vous gérez.", + "noPartnersFound": "Aucun partenaire trouvé.", + "connectNewPartner": "Connecter un nouveau partenaire", + "yourInviteCode": "Votre code d'invitation", + "redeemCode": "Échanger le code", + "siteKey": "Clé du site", + "secretKey": "Clé secrète", + "fullName": "Nom complet", + "preferredLanguage": "Langue préférée", + "emailAddress": "Adresse e-mail", + "superAdminOnly": "(Super Admin uniquement)", + "projectAccess": "Accès au projet", + "globalAccessAll": "Global (Tous présents et futurs)", + "restrictedSpecific": "Restreint (Sélectionner spécifiques)", + "globalAccessInfo": "Cet utilisateur aura accès à tous les projets par défaut et peut basculer entre eux en utilisant le navigateur de projets.", + "sendInvitation": "Envoyer l'invitation", + "cancelInvitation": "Annuler l'invitation ?", + "removeTeamMember": "Supprimer le membre de l'équipe ?", + "cancelInviteConfirm": "Êtes-vous sûr de vouloir annuler l'invitation pour {{name}} ? Il n'a pas encore rejoint l'organisation.", + "removeMemberConfirm": "Êtes-vous sûr de vouloir supprimer {{name}} ? Il perdra tout accès aux données et projets de l'organisation.", + "revokeInvitation": "Révoquer l'invitation", + "removeAccess": "Supprimer l'accès", + "inviteSent": "Invitation envoyée avec succès !", + "inviteFailed": "Échec de l'envoi de l'invitation.", + "inviteCancelled": "Invitation annulée.", + "memberRemoved": "Utilisateur supprimé.", + "actionFailed": "L'action a échoué.", + "acceptInvitation": "Accepter l'invitation", + "invitedToJoin": "Vous avez été invité à rejoindre", + "setPassword": "Définir le mot de passe", + "minimumCharsHint": "Minimum 8 caractères", + "repeatPasswordHint": "Répéter le mot de passe", + "activating": "Activation en cours...", + "activateAccount": "Activer le compte", + "accountActivated": "Compte activé ! Redirection en cours...", + "noTokenFound": "Aucun token d'invitation trouvé dans le lien.", + "invalidInvite": "Invitation invalide ou expirée.", + "passwordMismatch": "Les mots de passe ne correspondent pas.", + "passwordTooShort": "Le mot de passe doit comporter au moins 8 caractères.", + "activationFailed": "Échec de l'activation du compte.", + "history": "Historique", + "genetics": "Génétique", + "editProfile": "Modifier le profil", + "sex": "Sexe", + "birthDate": "Date de naissance", + "planted": "Planté", + "deathDate": "Date de décès", + "removed": "Retiré", + "acquisitionSource": "Source d'acquisition", + "sourceDetails": "Détails de la source", + "loanStatus": "Statut de prêt", + "transferred": "Transféré", + "transferNote": "Note de transfert", + "lifeExpectancyShort": "Espérance de vie", + "sexualMaturityShort": "Maturité sexuelle", + "avgAdultWeight": "Poids adulte moyen", + "avgAdultHeight": "Hauteur adulte moyenne", + "breedingSeason": "Saison de reproduction", + "nativeStatus": "Statut d'indigénat", + "speciesInfo": "Informations sur l'espèce", + "viewInSpeciesRegistry": "Voir dans le registre", + "location": "Localisation", + "noCoordinatesAssigned": "Aucune coordonnée assignée", + "setLocation": "Définir la localisation", + "weightTrend": "Tendance du poids", + "growthTrend": "Tendance de croissance", + "logWeight": "Enregistrer le poids", + "logHeight": "Enregistrer la hauteur", + "addObservation": "Ajouter une observation", + "parentage": "Filiation", + "sire": "Père", + "dam": "Mère", + "performedBy": "Réalisé par", + "speciesDetail": "Détail de l'espèce", + "weightHistory": "Historique de poids", + "healthHistory": "Historique de santé", + "hideOrgName": "Masquer le Nom de l'Organisation", + "hideOrgNameDesc": "Afficher comme 'Organisation Anonyme' sur la carte du réseau.", + "speciesListVisibilityNote": "Visible uniquement pour les partenaires réseau enregistrés.", + "showNativeStatus": "Afficher les Badges de Statut Natif", + "showNativeStatusDesc": "Afficher les indicateurs de statut natif/non natif/invasif sur les fiches espèces et profils individuels.", + "locationMapNotice": "Ajouter une localisation précise pour votre organisation est important pour la fonctionnalité de cartographie dans toute l'application. Veuillez définir une localisation et vérifier les paramètres de confidentialité ci-dessous.", + "useMyLocation": "Utiliser Ma Position Actuelle", + "enableEnclosures": "Activer les Enclos", + "enableAreas": "Activer les Zones", + "enableEnclosuresModuleDesc": "Active la cartographie avancée et le regroupement des espèces par emplacement physique.", + "addToHomeScreen": "Ajouter à l'écran d'accueil", + "iosInstallHint": "Dans Safari, appuyez sur le bouton Partager en bas de l'écran, puis sur 'Ajouter à l'écran d'accueil'." } } -] +] \ No newline at end of file diff --git a/components/InstallPromptButton.tsx b/components/InstallPromptButton.tsx new file mode 100644 index 0000000..ff37af3 --- /dev/null +++ b/components/InstallPromptButton.tsx @@ -0,0 +1,58 @@ +import React, { useState, useContext } from 'react'; +import { Smartphone, Share, X } from 'lucide-react'; +import { useInstallPrompt } from '../hooks/useInstallPrompt'; +import { LanguageContext } from '../App'; + +interface Props { + variant?: 'hero' | 'compact'; +} + +const InstallPromptButton: React.FC = ({ variant = 'compact' }) => { + const { t } = useContext(LanguageContext); + const { deferredPrompt, isInstalled, isIOS, triggerInstall } = useInstallPrompt(); + const [showIOSHint, setShowIOSHint] = useState(false); + + if (isInstalled) return null; + if (!isIOS && !deferredPrompt) return null; + + const heroClass = 'w-full sm:w-auto px-8 py-4 bg-emerald-600 text-white rounded-xl font-bold text-lg hover:bg-emerald-700 transition-all shadow-lg flex items-center justify-center gap-2'; + const compactClass = 'flex items-center gap-2 px-3 py-1.5 text-sm font-medium text-emerald-700 border border-emerald-200 bg-emerald-50 rounded-lg hover:bg-emerald-100 transition-colors'; + + if (isIOS) { + return ( +
+ + {showIOSHint && ( +
+ +
+ +

{t('iosInstallHint')}

+
+
+
+ )} +
+ ); + } + + return ( + + ); +}; + +export default InstallPromptButton; diff --git a/hooks/useInstallPrompt.ts b/hooks/useInstallPrompt.ts new file mode 100644 index 0000000..04a4975 --- /dev/null +++ b/hooks/useInstallPrompt.ts @@ -0,0 +1,34 @@ +import { useState, useEffect } from 'react'; + +export function useInstallPrompt() { + const [deferredPrompt, setDeferredPrompt] = useState(null); + const [isInstalled, setIsInstalled] = useState(false); + const [isIOS, setIsIOS] = useState(false); + + useEffect(() => { + setIsIOS(/iPad|iPhone|iPod/i.test(navigator.userAgent)); + setIsInstalled( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as any).standalone === true + ); + + const onPrompt = (e: Event) => { e.preventDefault(); setDeferredPrompt(e); }; + const onInstalled = () => { setIsInstalled(true); setDeferredPrompt(null); }; + + window.addEventListener('beforeinstallprompt', onPrompt); + window.addEventListener('appinstalled', onInstalled); + return () => { + window.removeEventListener('beforeinstallprompt', onPrompt); + window.removeEventListener('appinstalled', onInstalled); + }; + }, []); + + const triggerInstall = async () => { + if (!deferredPrompt) return; + deferredPrompt.prompt(); + await deferredPrompt.userChoice; + setDeferredPrompt(null); + }; + + return { deferredPrompt, isInstalled, isIOS, triggerInstall }; +} diff --git a/index.html b/index.html index 17cb8dc..f598ef3 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,12 @@ OpenStudbook + + + + + + @@ -98,6 +104,7 @@
Loading OpenStudbook...
+ \ No newline at end of file diff --git a/installation.md b/installation.md index 6696f92..89d580d 100644 --- a/installation.md +++ b/installation.md @@ -1,96 +1,83 @@ # OpenStudbook Installation Guide -OpenStudbook is a self-hosted conservation management platform. This guide will walk you through setting up the Node.js backend and the React frontend. +> **This guide covers a quick manual setup. The [README](README.md) is the canonical reference — see it for full configuration options, production deployment, and security notes.** -## 1. Prerequisites +--- + +## Prerequisites -* **Node.js**: Version 18.x or higher. -* **MySQL Server**: A running instance (local or remote). -* **Gemini API Key**: Required for AI biological research and image generation. Get it from [Google AI Studio](https://aistudio.google.com/). +- **Node.js** 18 LTS or higher (20 LTS recommended) +- **MariaDB** 10.6+ or **MySQL** 8.0+ — must be running before you start +- **npm** 9+ (bundled with Node) --- -## 2. Backend Setup (Proxy & API) - -The backend now handles all AI requests to keep your API key secure. - -1. **Navigate to the backend directory**: - ```bash - cd backend - ``` -2. **Install dependencies**: - ```bash - npm install - ``` -3. **Configure Environment**: - Create a `.env` file in the `backend/` folder: - ```env - PORT=3001 - JWT_SECRET=your_long_random_secure_string - API_KEY=your_gemini_api_key_here - ``` - *Note: You do not need to provide database credentials here yet; the web installer will handle the connection configuration.* - -4. **Start the backend**: - ```bash - npm run dev - ``` - The server will start on `http://localhost:3001`. +## Setup ---- +### 1. Clone and install dependencies -## 3. Frontend Setup - -1. **Navigate to the project root**: - ```bash - cd .. - ``` -2. **Install dependencies**: - ```bash - npm install - ``` -3. **Start the development server**: - ```bash - npm run dev - ``` - The app will typically be available at `http://localhost:3000`. +```bash +git clone https://github.com/teruselearning/openstud.git +cd openstud +npm install +cd backend && npm install && cd .. +``` ---- +### 2. Configure the backend + +```bash +cp backend/.env.example backend/.env +``` + +Open `backend/.env` and set at minimum: + +```env +JWT_SECRET= +DATABASE_HOST=localhost +DATABASE_USER=root +DATABASE_PASSWORD= +DATABASE_NAME=openstudbook +``` -## 4. Web-Based System Configuration +Generate a secure JWT secret: +```bash +node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" +``` -When you first launch the application in your browser, you will see the **System Installer**. +### 3. Create the database -1. **Step 1: Welcome**: Review the prerequisites and click "Start Setup". -2. **Step 2: Database Config**: Enter your MySQL details: - * **Hostname**: (e.g., `localhost`) - * **Port**: (e.g., `3306`) - * **User**: (e.g., `root`) - * **Password**: Your MySQL password. - * **Database Name**: `openstudbook` (The installer will create this if it's missing). -3. **Step 3: Install**: Click "Connect & Install". - * The system will automatically create all SQL tables. - * Default languages (UK/US English) will be seeded. - * A default Super Admin account will be created. +```bash +mysql -u root -p -e "CREATE DATABASE openstudbook CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" +``` + +### 4. Start the app + +```bash +# Terminal 1 — backend +cd backend && npm run dev + +# Terminal 2 — frontend +npm run dev +``` + +Open **http://localhost:3000** — the installer wizard will guide you through the rest. --- -## 5. Getting Started +## First Run -Once the installer finishes, you will be redirected to the landing page. +The web installer will: -### Default Administrator Credentials: -* **Email**: `sarah@wild.org` -* **Password**: `password` +1. Verify your database connection +2. Run all migrations and seed default data +3. Create your first organisation and admin account + +After setup, configure SMTP, languages, and feature flags under **Super Admin** (gear icon in the sidebar). + +--- -### Recommended First Steps: -1. Log in as the administrator. -2. Go to **Organization Settings** to set your location and focus (Fauna or Flora). -3. Go to **Species** and use the "Autofill" feature to quickly catalog your collection. -4. Go to **Super Admin > Localisation** to add support for additional languages using AI translation. +## Production -## Production Notes +See [Production Deployment](README.md#production-deployment) in the README for build steps, Nginx config, process management, and the security checklist. -* **Security**: Ensure your `JWT_SECRET` is unique and long. -* **HTTPS**: Geolocation and camera features require an HTTPS connection in production. -* **SMTP**: To enable email invitations, configure your SMTP settings in the **Super Admin > Email** tab after logging in. +> **Never expose the app publicly without completing the security checklist first.** diff --git a/pages/Dashboard.tsx b/pages/Dashboard.tsx index 3cd3fae..de3e4bd 100644 --- a/pages/Dashboard.tsx +++ b/pages/Dashboard.tsx @@ -5,6 +5,7 @@ import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip, Legend } from 'recha import { Users, Leaf, Activity, Heart, ArrowRight, Dna, Info, FolderOpen, Megaphone, Layers, Search, ChevronDown, PawPrint, Sprout } from 'lucide-react'; import { Species, Individual, Sex, Project, Organization } from '../types'; import { LanguageContext } from '../App'; +import InstallPromptButton from '../components/InstallPromptButton'; const COLORS = ['#10b981', '#3b82f6', '#f59e0b', '#ef4444', '#8b5cf6']; @@ -159,11 +160,14 @@ const Dashboard: React.FC = ({ currentProjectId, syncVersion = 0

{t('welcomeBack')}

- {currentProjectId === 'ALL_PROJECTS' && ( -
- Consolidated enterprise view enabled. -
- )} +
+ {currentProjectId === 'ALL_PROJECTS' && ( +
+ Consolidated enterprise view enabled. +
+ )} + +
{/* Org announcement block */} diff --git a/pages/Landing.tsx b/pages/Landing.tsx index 5cda40e..4fa90cb 100644 --- a/pages/Landing.tsx +++ b/pages/Landing.tsx @@ -3,6 +3,7 @@ import { PawPrint, Shield, ArrowRight, Mail, User as UserIcon, Lock, ArrowLeft, import * as LucideIcons from 'lucide-react'; import { forgotPassword, resetPassword, restoreMainOrg, isMfaTrustedDevice, sendMfaCode, trustDevice, saveSession, getSystemSettings, checkInviteToken, acceptInvite, saveOrg, saveProjects, getProjects, saveCurrentProjectId } from '../services/storage'; import { reverseGeocode } from '../services/geminiService'; +import InstallPromptButton from '../components/InstallPromptButton'; import { fetchRemoteData } from '../services/syncService'; import { User, OrganizationFocus, LandingFeature, Organization } from '../types'; import { LanguageContext } from '../App'; @@ -395,6 +396,7 @@ const Landing: React.FC = ({ onLogin, initialView = 'landing' }) = GitHub )} + {/* Explore demo button hidden */} diff --git a/pages/Network.tsx b/pages/Network.tsx index 0416f66..87e8cef 100644 --- a/pages/Network.tsx +++ b/pages/Network.tsx @@ -81,8 +81,8 @@ const Network: React.FC = () => { leafletMap.current = map; L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(map); - // ATTEMPT TO CENTER ON CURRENT LOCATION - if (navigator.geolocation) { + // Only fall back to browser geolocation if the org has no stored location + if (typeof myOrg?.latitude !== 'number' && navigator.geolocation) { navigator.geolocation.getCurrentPosition( (pos) => { const { latitude, longitude } = pos.coords; diff --git a/pages/OrgSettings.tsx b/pages/OrgSettings.tsx index ccc456e..df3d65b 100644 --- a/pages/OrgSettings.tsx +++ b/pages/OrgSettings.tsx @@ -252,8 +252,26 @@ const OrgSettings: React.FC = () => {
{(typeof org.latitude === 'number') && Location coordinates locked.} + {!isDemoOrg && ( + + )}
+
+ + {t('locationMapNotice')} +
@@ -309,6 +327,98 @@ const OrgSettings: React.FC = () => { )} +
+

{t('breedingLoanPolicy')}

+
+
+

{t('allowBreedingRequests')}

+

{t('allowBreedingRequestsDesc')}

+
+ +
+ {org.allowBreedingRequests && ( +
+ + +

{t('whoReceivesRequestsDesc')}

+
+ )} +
+ +
+

{t('visibilityPrivacy')}

+ +
+
+

{t('orgVisibility')}

+

{t('orgVisibilityDesc')}

+
+ +
+ +
+
+
+

{t('obscureLocation')}

+ +
+

{t('obscureLocationDesc')}

+
+ +
+ +
+
+
+

{t('hideOrgName')}

+ +
+

{t('hideOrgNameDesc')}

+
+ +
+ +
+
+

{t('speciesListVisibility')}

+

{t('speciesListVisibilityDesc')} {t('speciesListVisibilityNote')}

+
+ +
+ +
+
+
+

{t('showNativeStatus')}

+ +
+

{t('showNativeStatusDesc')}

+
+ +
+
+ {!isDemoOrg && (
)} diff --git a/public/icon.svg b/public/icon.svg new file mode 100644 index 0000000..a9a4617 --- /dev/null +++ b/public/icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..cdae114 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "OpenStudbook", + "short_name": "OpenStudbook", + "description": "Open Source Captive Breeding Management", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#f8fafc", + "theme_color": "#059669", + "icons": [ + { + "src": "/icon.svg", + "sizes": "any", + "type": "image/svg+xml", + "purpose": "any maskable" + } + ] +} diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..6c72584 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,12 @@ +const CACHE = 'openstudbook-v1'; + +self.addEventListener('install', e => { + self.skipWaiting(); + e.waitUntil(caches.open(CACHE).then(c => c.addAll(['/']))); +}); + +self.addEventListener('activate', e => e.waitUntil(clients.claim())); + +self.addEventListener('fetch', e => { + e.respondWith(fetch(e.request).catch(() => caches.match(e.request))); +}); diff --git a/services/i18n.ts b/services/i18n.ts index d05a425..defb503 100644 --- a/services/i18n.ts +++ b/services/i18n.ts @@ -284,9 +284,18 @@ export const BASE_TRANSLATIONS = { orgVisibility: "List in Directory", orgVisibilityDesc: "Make your organization visible on the global network map.", obscureLocation: "Obscure Map Location", - obscureLocationDesc: "Round your map coordinates to prevent precise site tracking by non-partners.", + obscureLocationDesc: "Masks your location on the network map to within approximately 10 miles of your actual site.", speciesListVisibility: "Public Species List", speciesListVisibilityDesc: "Allow anyone on the network to see which species you manage.", + speciesListVisibilityNote: "Only visible to registered network partners.", + hideOrgName: "Hide Organisation Name", + hideOrgNameDesc: "Display as 'Anonymous Organization' on the network map.", + showNativeStatus: "Show Native Status Badges", + showNativeStatusDesc: "Display native/non-native/invasive status indicators on species cards and individual profiles.", + locationMapNotice: "Adding an accurate location for your organisation is important for the mapping functionality across the app. Please set a location and review the privacy settings below.", + useMyLocation: "Use My Current Location", + addToHomeScreen: "Add to Home Screen", + iosInstallHint: "In Safari, tap the Share button at the bottom of the screen, then tap 'Add to Home Screen'.", // Network / Partners noPartnersFound: "No partners found.", @@ -365,7 +374,7 @@ export const SEED_LANGUAGES: LanguageConfig[] = [ termsConditions: "Terms & Conditions", orgWideView: "Organisation-Wide View", networkDescription: "Discover other organisations and establish breeding partnerships.", - history: "History", genetics: "Genetics", editProfile: "Edit Profile", sex: "Sex", birthDate: "Birth Date", planted: "Planted", deathDate: "Death Date", removed: "Removed", acquisitionSource: "Acquisition Source", sourceDetails: "Source Details", loanStatus: "Loan Status", transferred: "Transferred", transferNote: "Transfer Note", lifeExpectancyShort: "Life Expectancy", sexualMaturityShort: "Sexual Maturity", avgAdultWeight: "Avg Adult Weight", avgAdultHeight: "Avg Adult Height", breedingSeason: "Breeding Season", nativeStatus: "Native Status", speciesInfo: "Species Info", viewInSpeciesRegistry: "View in Species Registry", location: "Location", noCoordinatesAssigned: "No coordinates assigned", setLocation: "Set Location", weightTrend: "Weight Trend", growthTrend: "Growth Trend", logWeight: "Log Weight", logHeight: "Log Height", addObservation: "Add Observation", parentage: "Parentage", sire: "Sire", dam: "Dam", performedBy: "Performed By", speciesDetail: "Species Detail", weightHistory: "Weight History", healthHistory: "Health History" + history: "History", genetics: "Genetics", editProfile: "Edit Profile", sex: "Sex", birthDate: "Birth Date", planted: "Planted", deathDate: "Death Date", removed: "Removed", acquisitionSource: "Acquisition Source", sourceDetails: "Source Details", loanStatus: "Loan Status", transferred: "Transferred", transferNote: "Transfer Note", lifeExpectancyShort: "Life Expectancy", sexualMaturityShort: "Sexual Maturity", avgAdultWeight: "Avg Adult Weight", avgAdultHeight: "Avg Adult Height", breedingSeason: "Breeding Season", nativeStatus: "Native Status", speciesInfo: "Species Info", viewInSpeciesRegistry: "View in Species Registry", location: "Location", noCoordinatesAssigned: "No coordinates assigned", setLocation: "Set Location", weightTrend: "Weight Trend", growthTrend: "Growth Trend", logWeight: "Log Weight", logHeight: "Log Height", addObservation: "Add Observation", parentage: "Parentage", sire: "Sire", dam: "Dam", performedBy: "Performed By", speciesDetail: "Species Detail", weightHistory: "Weight History", healthHistory: "Health History", enableEnclosures: "Enable Enclosures", enableAreas: "Enable Areas", enableEnclosuresModuleDesc: "Enable advanced mapping and species grouping by physical location.", hideOrgName: "Hide Organisation Name", hideOrgNameDesc: "Display as 'Anonymous Organisation' on the network map.", showNativeStatus: "Show Native Status Badges", showNativeStatusDesc: "Display native/non-native/invasive status indicators on species cards and individual profiles.", locationMapNotice: "Adding an accurate location for your organisation is important for the mapping functionality across the app. Please set a location and review the privacy settings below.", speciesListVisibilityNote: "Only visible to registered network partners.", useMyLocation: "Use My Current Location", addToHomeScreen: "Add to Home Screen", iosInstallHint: "In Safari, tap the Share button at the bottom of the screen, then tap 'Add to Home Screen'." } }, { @@ -377,7 +386,7 @@ export const SEED_LANGUAGES: LanguageConfig[] = [ about: "About", privacyPolicy: "Privacy Policy", termsConditions: "Terms & Conditions", - history: "History", genetics: "Genetics", editProfile: "Edit Profile", sex: "Sex", birthDate: "Birth Date", planted: "Planted", deathDate: "Death Date", removed: "Removed", acquisitionSource: "Acquisition Source", sourceDetails: "Source Details", loanStatus: "Loan Status", transferred: "Transferred", transferNote: "Transfer Note", lifeExpectancyShort: "Life Expectancy", sexualMaturityShort: "Sexual Maturity", avgAdultWeight: "Avg Adult Weight", avgAdultHeight: "Avg Adult Height", breedingSeason: "Breeding Season", nativeStatus: "Native Status", speciesInfo: "Species Info", viewInSpeciesRegistry: "View in Species Registry", location: "Location", noCoordinatesAssigned: "No coordinates assigned", setLocation: "Set Location", weightTrend: "Weight Trend", growthTrend: "Growth Trend", logWeight: "Log Weight", logHeight: "Log Height", addObservation: "Add Observation", parentage: "Parentage", sire: "Sire", dam: "Dam", performedBy: "Performed By", speciesDetail: "Species Detail", weightHistory: "Weight History", healthHistory: "Health History" + history: "History", genetics: "Genetics", editProfile: "Edit Profile", sex: "Sex", birthDate: "Birth Date", planted: "Planted", deathDate: "Death Date", removed: "Removed", acquisitionSource: "Acquisition Source", sourceDetails: "Source Details", loanStatus: "Loan Status", transferred: "Transferred", transferNote: "Transfer Note", lifeExpectancyShort: "Life Expectancy", sexualMaturityShort: "Sexual Maturity", avgAdultWeight: "Avg Adult Weight", avgAdultHeight: "Avg Adult Height", breedingSeason: "Breeding Season", nativeStatus: "Native Status", speciesInfo: "Species Info", viewInSpeciesRegistry: "View in Species Registry", location: "Location", noCoordinatesAssigned: "No coordinates assigned", setLocation: "Set Location", weightTrend: "Weight Trend", growthTrend: "Growth Trend", logWeight: "Log Weight", logHeight: "Log Height", addObservation: "Add Observation", parentage: "Parentage", sire: "Sire", dam: "Dam", performedBy: "Performed By", speciesDetail: "Species Detail", weightHistory: "Weight History", healthHistory: "Health History", enableEnclosures: "Enable Enclosures", enableAreas: "Enable Areas", enableEnclosuresModuleDesc: "Enable advanced mapping and species grouping by physical location.", hideOrgName: "Hide Organization Name", hideOrgNameDesc: "Display as 'Anonymous Organization' on the network map.", showNativeStatus: "Show Native Status Badges", showNativeStatusDesc: "Display native/non-native/invasive status indicators on species cards and individual profiles.", locationMapNotice: "Adding an accurate location for your organization is important for the mapping functionality across the app. Please set a location and review the privacy settings below.", speciesListVisibilityNote: "Only visible to registered network partners.", useMyLocation: "Use My Current Location", addToHomeScreen: "Add to Home Screen", iosInstallHint: "In Safari, tap the Share button at the bottom of the screen, then tap 'Add to Home Screen'." } }, { @@ -403,7 +412,7 @@ export const SEED_LANGUAGES: LanguageConfig[] = [ noPartnersFound: "Tidak ada mitra ditemukan.", connectNewPartner: "Hubungkan Mitra Baru", yourInviteCode: "Kode Undangan Anda", redeemCode: "Tukarkan Kode", siteKey: "Kunci Situs", secretKey: "Kunci Rahasia", fullName: "Nama Lengkap", preferredLanguage: "Bahasa Pilihan", emailAddress: "Alamat Email", superAdminOnly: "(Hanya Super Admin)", projectAccess: "Akses Proyek", globalAccessAll: "Global (Semua Sekarang & Masa Depan)", restrictedSpecific: "Terbatas (Pilih Spesifik)", globalAccessInfo: "Pengguna ini akan memiliki akses ke semua proyek secara default dan dapat beralih di antara mereka menggunakan navigator proyek.", sendInvitation: "Kirim Undangan", cancelInvitation: "Batalkan Undangan?", removeTeamMember: "Hapus Anggota Tim?", cancelInviteConfirm: "Apakah Anda yakin ingin membatalkan undangan untuk {{name}}? Mereka belum bergabung dengan organisasi.", removeMemberConfirm: "Apakah Anda yakin ingin menghapus {{name}}? Mereka akan kehilangan semua akses ke data dan proyek organisasi.", revokeInvitation: "Cabut Undangan", removeAccess: "Hapus Akses", inviteSent: "Undangan berhasil dikirim!", inviteFailed: "Gagal mengirim undangan.", inviteCancelled: "Undangan dibatalkan.", memberRemoved: "Pengguna dihapus.", actionFailed: "Tindakan gagal.", acceptInvitation: "Terima Undangan", invitedToJoin: "Anda telah diundang untuk bergabung", setPassword: "Atur Kata Sandi", minimumCharsHint: "Minimal 8 karakter", repeatPasswordHint: "Ulangi kata sandi", activating: "Mengaktifkan...", activateAccount: "Aktifkan Akun", accountActivated: "Akun diaktifkan! Mengalihkan...", noTokenFound: "Tidak ada token undangan yang ditemukan dalam tautan.", invalidInvite: "Undangan tidak valid atau sudah kedaluwarsa.", passwordMismatch: "Kata sandi tidak cocok.", passwordTooShort: "Kata sandi harus minimal 8 karakter.", activationFailed: "Gagal mengaktifkan akun.", - history: "Riwayat", genetics: "Genetika", editProfile: "Edit Profil", sex: "Jenis Kelamin", birthDate: "Tanggal Lahir", planted: "Ditanam", deathDate: "Tanggal Kematian", removed: "Disingkirkan", acquisitionSource: "Sumber Perolehan", sourceDetails: "Detail Sumber", loanStatus: "Status Pinjaman", transferred: "Dipindahkan", transferNote: "Catatan Transfer", lifeExpectancyShort: "Harapan Hidup", sexualMaturityShort: "Kematangan Seksual", avgAdultWeight: "Berat Dewasa Rata-rata", avgAdultHeight: "Tinggi Dewasa Rata-rata", breedingSeason: "Musim Kawin", nativeStatus: "Status Asli", speciesInfo: "Informasi Spesies", viewInSpeciesRegistry: "Lihat di Registri", location: "Lokasi", noCoordinatesAssigned: "Tidak ada koordinat", setLocation: "Tetapkan Lokasi", weightTrend: "Tren Berat", growthTrend: "Tren Pertumbuhan", logWeight: "Catat Berat", logHeight: "Catat Tinggi", addObservation: "Tambah Observasi", parentage: "Keturunan", sire: "Ayah", dam: "Induk", performedBy: "Dilakukan Oleh", speciesDetail: "Detail Spesies", weightHistory: "Riwayat Berat", healthHistory: "Riwayat Kesehatan" + history: "Riwayat", genetics: "Genetika", editProfile: "Edit Profil", sex: "Jenis Kelamin", birthDate: "Tanggal Lahir", planted: "Ditanam", deathDate: "Tanggal Kematian", removed: "Disingkirkan", acquisitionSource: "Sumber Perolehan", sourceDetails: "Detail Sumber", loanStatus: "Status Pinjaman", transferred: "Dipindahkan", transferNote: "Catatan Transfer", lifeExpectancyShort: "Harapan Hidup", sexualMaturityShort: "Kematangan Seksual", avgAdultWeight: "Berat Dewasa Rata-rata", avgAdultHeight: "Tinggi Dewasa Rata-rata", breedingSeason: "Musim Kawin", nativeStatus: "Status Asli", speciesInfo: "Informasi Spesies", viewInSpeciesRegistry: "Lihat di Registri", location: "Lokasi", noCoordinatesAssigned: "Tidak ada koordinat", setLocation: "Tetapkan Lokasi", weightTrend: "Tren Berat", growthTrend: "Tren Pertumbuhan", logWeight: "Catat Berat", logHeight: "Catat Tinggi", addObservation: "Tambah Observasi", parentage: "Keturunan", sire: "Ayah", dam: "Induk", performedBy: "Dilakukan Oleh", speciesDetail: "Detail Spesies", weightHistory: "Riwayat Berat", healthHistory: "Riwayat Kesehatan", enableEnclosures: "Aktifkan Kandang", enableAreas: "Aktifkan Area", enableEnclosuresModuleDesc: "Aktifkan pemetaan lanjutan dan pengelompokan spesies berdasarkan lokasi fisik.", hideOrgName: "Sembunyikan Nama Organisasi", hideOrgNameDesc: "Tampilkan sebagai 'Organisasi Anonim' di peta jaringan.", showNativeStatus: "Tampilkan Lencana Status Asli", showNativeStatusDesc: "Tampilkan indikator status asli/bukan asli/invasif pada kartu spesies dan profil individu.", locationMapNotice: "Menambahkan lokasi yang akurat untuk organisasi Anda penting untuk fungsi pemetaan di seluruh aplikasi. Silakan tetapkan lokasi dan tinjau pengaturan privasi di bawah ini.", speciesListVisibilityNote: "Hanya terlihat oleh mitra jaringan terdaftar.", useMyLocation: "Gunakan Lokasi Saya Saat Ini", addToHomeScreen: "Tambahkan ke Layar Utama", iosInstallHint: "Di Safari, ketuk tombol Bagikan di bagian bawah layar, lalu ketuk 'Tambahkan ke Layar Utama'." } }, { @@ -429,7 +438,7 @@ export const SEED_LANGUAGES: LanguageConfig[] = [ noPartnersFound: "Tiada rakan kongsi dijumpai.", connectNewPartner: "Hubungkan Rakan Kongsi Baru", yourInviteCode: "Kod Jemputan Anda", redeemCode: "Tebus Kod", siteKey: "Kunci Tapak", secretKey: "Kunci Rahsia", fullName: "Nama Penuh", preferredLanguage: "Bahasa Pilihan", emailAddress: "Alamat E-mel", superAdminOnly: "(Hanya Super Admin)", projectAccess: "Akses Projek", globalAccessAll: "Global (Semua Kini & Masa Depan)", restrictedSpecific: "Terhad (Pilih Spesifik)", globalAccessInfo: "Pengguna ini akan mempunyai akses kepada semua projek secara lalai dan boleh bertukar di antara mereka menggunakan navigator projek.", sendInvitation: "Hantar Jemputan", cancelInvitation: "Batalkan Jemputan?", removeTeamMember: "Buang Ahli Pasukan?", cancelInviteConfirm: "Adakah anda pasti ingin membatalkan jemputan untuk {{name}}? Mereka belum menyertai organisasi.", removeMemberConfirm: "Adakah anda pasti ingin membuang {{name}}? Mereka akan kehilangan semua akses kepada data dan projek organisasi.", revokeInvitation: "Tarik Balik Jemputan", removeAccess: "Buang Akses", inviteSent: "Jemputan berjaya dihantar!", inviteFailed: "Gagal menghantar jemputan.", inviteCancelled: "Jemputan dibatalkan.", memberRemoved: "Pengguna dibuang.", actionFailed: "Tindakan gagal.", acceptInvitation: "Terima Jemputan", invitedToJoin: "Anda telah dijemput untuk menyertai", setPassword: "Tetapkan Kata Laluan", minimumCharsHint: "Minimum 8 aksara", repeatPasswordHint: "Ulang kata laluan", activating: "Mengaktifkan...", activateAccount: "Aktifkan Akaun", accountActivated: "Akaun diaktifkan! Mengalihkan...", noTokenFound: "Tiada token jemputan dijumpai dalam pautan.", invalidInvite: "Jemputan tidak sah atau sudah tamat tempoh.", passwordMismatch: "Kata laluan tidak sepadan.", passwordTooShort: "Kata laluan mestilah sekurang-kurangnya 8 aksara.", activationFailed: "Gagal mengaktifkan akaun.", - history: "Sejarah", genetics: "Genetik", editProfile: "Edit Profil", sex: "Jantina", birthDate: "Tarikh Lahir", planted: "Ditanam", deathDate: "Tarikh Kematian", removed: "Dibuang", acquisitionSource: "Sumber Pemerolehan", sourceDetails: "Butiran Sumber", loanStatus: "Status Pinjaman", transferred: "Dipindahkan", transferNote: "Nota Pindahan", lifeExpectancyShort: "Jangka Hayat", sexualMaturityShort: "Kematangan Seksual", avgAdultWeight: "Purata Berat Dewasa", avgAdultHeight: "Purata Tinggi Dewasa", breedingSeason: "Musim Pembiakan", nativeStatus: "Status Asli", speciesInfo: "Maklumat Spesies", viewInSpeciesRegistry: "Lihat di Daftar", location: "Lokasi", noCoordinatesAssigned: "Tiada koordinat", setLocation: "Tetapkan Lokasi", weightTrend: "Aliran Berat", growthTrend: "Aliran Pertumbuhan", logWeight: "Log Berat", logHeight: "Log Tinggi", addObservation: "Tambah Pemerhatian", parentage: "Keturunan", sire: "Bapa", dam: "Induk", performedBy: "Dilakukan Oleh", speciesDetail: "Butiran Spesies", weightHistory: "Sejarah Berat", healthHistory: "Sejarah Kesihatan" + history: "Sejarah", genetics: "Genetik", editProfile: "Edit Profil", sex: "Jantina", birthDate: "Tarikh Lahir", planted: "Ditanam", deathDate: "Tarikh Kematian", removed: "Dibuang", acquisitionSource: "Sumber Pemerolehan", sourceDetails: "Butiran Sumber", loanStatus: "Status Pinjaman", transferred: "Dipindahkan", transferNote: "Nota Pindahan", lifeExpectancyShort: "Jangka Hayat", sexualMaturityShort: "Kematangan Seksual", avgAdultWeight: "Purata Berat Dewasa", avgAdultHeight: "Purata Tinggi Dewasa", breedingSeason: "Musim Pembiakan", nativeStatus: "Status Asli", speciesInfo: "Maklumat Spesies", viewInSpeciesRegistry: "Lihat di Daftar", location: "Lokasi", noCoordinatesAssigned: "Tiada koordinat", setLocation: "Tetapkan Lokasi", weightTrend: "Aliran Berat", growthTrend: "Aliran Pertumbuhan", logWeight: "Log Berat", logHeight: "Log Tinggi", addObservation: "Tambah Pemerhatian", parentage: "Keturunan", sire: "Bapa", dam: "Induk", performedBy: "Dilakukan Oleh", speciesDetail: "Butiran Spesies", weightHistory: "Sejarah Berat", healthHistory: "Sejarah Kesihatan", enableEnclosures: "Aktifkan Kandang", enableAreas: "Aktifkan Kawasan", enableEnclosuresModuleDesc: "Aktifkan pemetaan lanjutan dan pengelompokan spesies mengikut lokasi fizikal.", hideOrgName: "Sembunyikan Nama Organisasi", hideOrgNameDesc: "Paparkan sebagai 'Organisasi Tanpa Nama' pada peta rangkaian.", showNativeStatus: "Tunjukkan Lencana Status Asli", showNativeStatusDesc: "Paparkan penunjuk status asli/bukan asli/invasif pada kad spesies dan profil individu.", locationMapNotice: "Menambahkan lokasi yang tepat untuk organisasi anda adalah penting untuk fungsi pemetaan di seluruh aplikasi. Sila tetapkan lokasi dan semak tetapan privasi di bawah.", speciesListVisibilityNote: "Hanya kelihatan kepada rakan kongsi rangkaian berdaftar.", useMyLocation: "Guna Lokasi Semasa Saya", addToHomeScreen: "Tambah ke Skrin Utama", iosInstallHint: "Dalam Safari, ketik butang Kongsi di bahagian bawah skrin, kemudian ketik 'Tambah ke Skrin Utama'." } }, { @@ -455,7 +464,7 @@ export const SEED_LANGUAGES: LanguageConfig[] = [ noPartnersFound: "Nenhum parceiro encontrado.", connectNewPartner: "Conectar Novo Parceiro", yourInviteCode: "O Seu Código de Convite", redeemCode: "Resgatar Código", siteKey: "Chave do Site", secretKey: "Chave Secreta", fullName: "Nome Completo", preferredLanguage: "Idioma Preferido", emailAddress: "Endereço de E-mail", superAdminOnly: "(Apenas Super Admin)", projectAccess: "Acesso ao Projeto", globalAccessAll: "Global (Todos Presentes e Futuros)", restrictedSpecific: "Restrito (Selecionar Específicos)", globalAccessInfo: "Este utilizador terá acesso a todos os projetos por padrão e pode alternar entre eles usando o navegador de projetos.", sendInvitation: "Enviar Convite", cancelInvitation: "Cancelar Convite?", removeTeamMember: "Remover Membro da Equipa?", cancelInviteConfirm: "Tem a certeza de que pretende cancelar o convite para {{name}}? Ainda não se juntou à organização.", removeMemberConfirm: "Tem a certeza de que pretende remover {{name}}? Perderá todo o acesso aos dados e projetos da organização.", revokeInvitation: "Revogar Convite", removeAccess: "Remover Acesso", inviteSent: "Convite enviado com sucesso!", inviteFailed: "Falha ao enviar convite.", inviteCancelled: "Convite cancelado.", memberRemoved: "Utilizador removido.", actionFailed: "Ação falhou.", acceptInvitation: "Aceitar Convite", invitedToJoin: "Foi convidado a juntar-se", setPassword: "Definir Palavra-passe", minimumCharsHint: "Mínimo 8 caracteres", repeatPasswordHint: "Repetir palavra-passe", activating: "A ativar...", activateAccount: "Ativar Conta", accountActivated: "Conta ativada! A redirecionar...", noTokenFound: "Nenhum token de convite encontrado no link.", invalidInvite: "Convite inválido ou expirado.", passwordMismatch: "As palavras-passe não coincidem.", passwordTooShort: "A palavra-passe deve ter pelo menos 8 caracteres.", activationFailed: "Falha ao ativar conta.", - history: "Histórico", genetics: "Genética", editProfile: "Editar perfil", sex: "Sexo", birthDate: "Data de nascimento", planted: "Plantado", deathDate: "Data de falecimento", removed: "Removido", acquisitionSource: "Fonte de aquisição", sourceDetails: "Detalhes da fonte", loanStatus: "Estado do empréstimo", transferred: "Transferido", transferNote: "Nota de transferência", lifeExpectancyShort: "Esperança de vida", sexualMaturityShort: "Maturidade sexual", avgAdultWeight: "Peso adulto médio", avgAdultHeight: "Altura adulta média", breedingSeason: "Época de reprodução", nativeStatus: "Estado nativo", speciesInfo: "Informações da espécie", viewInSpeciesRegistry: "Ver no registo", location: "Localização", noCoordinatesAssigned: "Sem coordenadas atribuídas", setLocation: "Definir localização", weightTrend: "Tendência de peso", growthTrend: "Tendência de crescimento", logWeight: "Registar peso", logHeight: "Registar altura", addObservation: "Adicionar observação", parentage: "Parentesco", sire: "Pai", dam: "Mãe", performedBy: "Realizado por", speciesDetail: "Detalhe da espécie", weightHistory: "Histórico de peso", healthHistory: "Histórico de saúde" + history: "Histórico", genetics: "Genética", editProfile: "Editar perfil", sex: "Sexo", birthDate: "Data de nascimento", planted: "Plantado", deathDate: "Data de falecimento", removed: "Removido", acquisitionSource: "Fonte de aquisição", sourceDetails: "Detalhes da fonte", loanStatus: "Estado do empréstimo", transferred: "Transferido", transferNote: "Nota de transferência", lifeExpectancyShort: "Esperança de vida", sexualMaturityShort: "Maturidade sexual", avgAdultWeight: "Peso adulto médio", avgAdultHeight: "Altura adulta média", breedingSeason: "Época de reprodução", nativeStatus: "Estado nativo", speciesInfo: "Informações da espécie", viewInSpeciesRegistry: "Ver no registo", location: "Localização", noCoordinatesAssigned: "Sem coordenadas atribuídas", setLocation: "Definir localização", weightTrend: "Tendência de peso", growthTrend: "Tendência de crescimento", logWeight: "Registar peso", logHeight: "Registar altura", addObservation: "Adicionar observação", parentage: "Parentesco", sire: "Pai", dam: "Mãe", performedBy: "Realizado por", speciesDetail: "Detalhe da espécie", weightHistory: "Histórico de peso", healthHistory: "Histórico de saúde", enableEnclosures: "Activar Recintos", enableAreas: "Activar Áreas", enableEnclosuresModuleDesc: "Activa o mapeamento avançado e o agrupamento de espécies por localização física.", hideOrgName: "Ocultar Nome da Organização", hideOrgNameDesc: "Mostrar como 'Organização Anónima' no mapa de rede.", showNativeStatus: "Mostrar Emblemas de Estado Nativo", showNativeStatusDesc: "Exibir indicadores de estado nativo/não-nativo/invasivo nos cartões de espécies e perfis de indivíduos.", locationMapNotice: "Adicionar uma localização precisa para a sua organização é importante para a funcionalidade de mapeamento em toda a aplicação. Por favor, defina uma localização e reveja as definições de privacidade abaixo.", speciesListVisibilityNote: "Apenas visível para parceiros de rede registados.", useMyLocation: "Usar Minha Localização Atual", addToHomeScreen: "Adicionar ao Ecrã Inicial", iosInstallHint: "No Safari, toque no botão Partilhar na parte inferior do ecrã e depois em 'Adicionar ao Ecrã Inicial'." } }, { @@ -481,7 +490,7 @@ export const SEED_LANGUAGES: LanguageConfig[] = [ noPartnersFound: "No se encontraron socios.", connectNewPartner: "Conectar Nuevo Socio", yourInviteCode: "Su Código de Invitación", redeemCode: "Canjear Código", siteKey: "Clave del Sitio", secretKey: "Clave Secreta", fullName: "Nombre Completo", preferredLanguage: "Idioma Preferido", emailAddress: "Dirección de Correo", superAdminOnly: "(Solo Super Admin)", projectAccess: "Acceso al Proyecto", globalAccessAll: "Global (Todos Presentes y Futuros)", restrictedSpecific: "Restringido (Seleccionar Específicos)", globalAccessInfo: "Este usuario tendrá acceso a todos los proyectos por defecto y puede cambiar entre ellos usando el navegador de proyectos.", sendInvitation: "Enviar Invitación", cancelInvitation: "¿Cancelar Invitación?", removeTeamMember: "¿Eliminar Miembro del Equipo?", cancelInviteConfirm: "¿Está seguro de que desea cancelar la invitación para {{name}}? Aún no se ha unido a la organización.", removeMemberConfirm: "¿Está seguro de que desea eliminar a {{name}}? Perderá todo acceso a los datos y proyectos de la organización.", revokeInvitation: "Revocar Invitación", removeAccess: "Eliminar Acceso", inviteSent: "¡Invitación enviada con éxito!", inviteFailed: "Error al enviar la invitación.", inviteCancelled: "Invitación cancelada.", memberRemoved: "Usuario eliminado.", actionFailed: "La acción falló.", acceptInvitation: "Aceptar Invitación", invitedToJoin: "Ha sido invitado a unirse", setPassword: "Establecer Contraseña", minimumCharsHint: "Mínimo 8 caracteres", repeatPasswordHint: "Repetir contraseña", activating: "Activando...", activateAccount: "Activar Cuenta", accountActivated: "¡Cuenta activada! Redirigiendo...", noTokenFound: "No se encontró token de invitación en el enlace.", invalidInvite: "Invitación inválida o expirada.", passwordMismatch: "Las contraseñas no coinciden.", passwordTooShort: "La contraseña debe tener al menos 8 caracteres.", activationFailed: "Error al activar la cuenta.", - history: "Historial", genetics: "Genética", editProfile: "Editar perfil", sex: "Sexo", birthDate: "Fecha de nacimiento", planted: "Plantado", deathDate: "Fecha de fallecimiento", removed: "Eliminado", acquisitionSource: "Fuente de adquisición", sourceDetails: "Detalles de la fuente", loanStatus: "Estado del préstamo", transferred: "Transferido", transferNote: "Nota de transferencia", lifeExpectancyShort: "Esperanza de vida", sexualMaturityShort: "Madurez sexual", avgAdultWeight: "Peso adulto promedio", avgAdultHeight: "Altura adulta promedio", breedingSeason: "Temporada de cría", nativeStatus: "Estado nativo", speciesInfo: "Información de la especie", viewInSpeciesRegistry: "Ver en el registro", location: "Ubicación", noCoordinatesAssigned: "Sin coordenadas asignadas", setLocation: "Establecer ubicación", weightTrend: "Tendencia de peso", growthTrend: "Tendencia de crecimiento", logWeight: "Registrar peso", logHeight: "Registrar altura", addObservation: "Añadir observación", parentage: "Parentesco", sire: "Padre", dam: "Madre", performedBy: "Realizado por", speciesDetail: "Detalle de la especie", weightHistory: "Historial de peso", healthHistory: "Historial de salud" + history: "Historial", genetics: "Genética", editProfile: "Editar perfil", sex: "Sexo", birthDate: "Fecha de nacimiento", planted: "Plantado", deathDate: "Fecha de fallecimiento", removed: "Eliminado", acquisitionSource: "Fuente de adquisición", sourceDetails: "Detalles de la fuente", loanStatus: "Estado del préstamo", transferred: "Transferido", transferNote: "Nota de transferencia", lifeExpectancyShort: "Esperanza de vida", sexualMaturityShort: "Madurez sexual", avgAdultWeight: "Peso adulto promedio", avgAdultHeight: "Altura adulta promedio", breedingSeason: "Temporada de cría", nativeStatus: "Estado nativo", speciesInfo: "Información de la especie", viewInSpeciesRegistry: "Ver en el registro", location: "Ubicación", noCoordinatesAssigned: "Sin coordenadas asignadas", setLocation: "Establecer ubicación", weightTrend: "Tendencia de peso", growthTrend: "Tendencia de crecimiento", logWeight: "Registrar peso", logHeight: "Registrar altura", addObservation: "Añadir observación", parentage: "Parentesco", sire: "Padre", dam: "Madre", performedBy: "Realizado por", speciesDetail: "Detalle de la especie", weightHistory: "Historial de peso", healthHistory: "Historial de salud", enableEnclosures: "Activar Recintos", enableAreas: "Activar Áreas", enableEnclosuresModuleDesc: "Activa el mapeo avanzado y la agrupación de especies por ubicación física.", hideOrgName: "Ocultar Nombre de la Organización", hideOrgNameDesc: "Mostrar como 'Organización Anónima' en el mapa de red.", showNativeStatus: "Mostrar Insignias de Estado Nativo", showNativeStatusDesc: "Mostrar indicadores de estado nativo/no nativo/invasivo en las tarjetas de especies y perfiles de individuos.", locationMapNotice: "Añadir una ubicación precisa para su organización es importante para la funcionalidad de mapeo en toda la aplicación. Por favor, establezca una ubicación y revise la configuración de privacidad a continuación.", speciesListVisibilityNote: "Solo visible para socios de red registrados.", useMyLocation: "Usar Mi Ubicación Actual", addToHomeScreen: "Añadir a la pantalla de inicio", iosInstallHint: "En Safari, toca el botón Compartir en la parte inferior de la pantalla y luego 'Añadir a pantalla de inicio'." } }, { @@ -507,7 +516,7 @@ export const SEED_LANGUAGES: LanguageConfig[] = [ noPartnersFound: "Aucun partenaire trouvé.", connectNewPartner: "Connecter un nouveau partenaire", yourInviteCode: "Votre code d'invitation", redeemCode: "Échanger le code", siteKey: "Clé du site", secretKey: "Clé secrète", fullName: "Nom complet", preferredLanguage: "Langue préférée", emailAddress: "Adresse e-mail", superAdminOnly: "(Super Admin uniquement)", projectAccess: "Accès au projet", globalAccessAll: "Global (Tous présents et futurs)", restrictedSpecific: "Restreint (Sélectionner spécifiques)", globalAccessInfo: "Cet utilisateur aura accès à tous les projets par défaut et peut basculer entre eux en utilisant le navigateur de projets.", sendInvitation: "Envoyer l'invitation", cancelInvitation: "Annuler l'invitation ?", removeTeamMember: "Supprimer le membre de l'équipe ?", cancelInviteConfirm: "Êtes-vous sûr de vouloir annuler l'invitation pour {{name}} ? Il n'a pas encore rejoint l'organisation.", removeMemberConfirm: "Êtes-vous sûr de vouloir supprimer {{name}} ? Il perdra tout accès aux données et projets de l'organisation.", revokeInvitation: "Révoquer l'invitation", removeAccess: "Supprimer l'accès", inviteSent: "Invitation envoyée avec succès !", inviteFailed: "Échec de l'envoi de l'invitation.", inviteCancelled: "Invitation annulée.", memberRemoved: "Utilisateur supprimé.", actionFailed: "L'action a échoué.", acceptInvitation: "Accepter l'invitation", invitedToJoin: "Vous avez été invité à rejoindre", setPassword: "Définir le mot de passe", minimumCharsHint: "Minimum 8 caractères", repeatPasswordHint: "Répéter le mot de passe", activating: "Activation en cours...", activateAccount: "Activer le compte", accountActivated: "Compte activé ! Redirection en cours...", noTokenFound: "Aucun token d'invitation trouvé dans le lien.", invalidInvite: "Invitation invalide ou expirée.", passwordMismatch: "Les mots de passe ne correspondent pas.", passwordTooShort: "Le mot de passe doit comporter au moins 8 caractères.", activationFailed: "Échec de l'activation du compte.", - history: "Historique", genetics: "Génétique", editProfile: "Modifier le profil", sex: "Sexe", birthDate: "Date de naissance", planted: "Planté", deathDate: "Date de décès", removed: "Retiré", acquisitionSource: "Source d'acquisition", sourceDetails: "Détails de la source", loanStatus: "Statut de prêt", transferred: "Transféré", transferNote: "Note de transfert", lifeExpectancyShort: "Espérance de vie", sexualMaturityShort: "Maturité sexuelle", avgAdultWeight: "Poids adulte moyen", avgAdultHeight: "Hauteur adulte moyenne", breedingSeason: "Saison de reproduction", nativeStatus: "Statut d'indigénat", speciesInfo: "Informations sur l'espèce", viewInSpeciesRegistry: "Voir dans le registre", location: "Localisation", noCoordinatesAssigned: "Aucune coordonnée assignée", setLocation: "Définir la localisation", weightTrend: "Tendance du poids", growthTrend: "Tendance de croissance", logWeight: "Enregistrer le poids", logHeight: "Enregistrer la hauteur", addObservation: "Ajouter une observation", parentage: "Filiation", sire: "Père", dam: "Mère", performedBy: "Réalisé par", speciesDetail: "Détail de l'espèce", weightHistory: "Historique de poids", healthHistory: "Historique de santé" + history: "Historique", genetics: "Génétique", editProfile: "Modifier le profil", sex: "Sexe", birthDate: "Date de naissance", planted: "Planté", deathDate: "Date de décès", removed: "Retiré", acquisitionSource: "Source d'acquisition", sourceDetails: "Détails de la source", loanStatus: "Statut de prêt", transferred: "Transféré", transferNote: "Note de transfert", lifeExpectancyShort: "Espérance de vie", sexualMaturityShort: "Maturité sexuelle", avgAdultWeight: "Poids adulte moyen", avgAdultHeight: "Hauteur adulte moyenne", breedingSeason: "Saison de reproduction", nativeStatus: "Statut d'indigénat", speciesInfo: "Informations sur l'espèce", viewInSpeciesRegistry: "Voir dans le registre", location: "Localisation", noCoordinatesAssigned: "Aucune coordonnée assignée", setLocation: "Définir la localisation", weightTrend: "Tendance du poids", growthTrend: "Tendance de croissance", logWeight: "Enregistrer le poids", logHeight: "Enregistrer la hauteur", addObservation: "Ajouter une observation", parentage: "Filiation", sire: "Père", dam: "Mère", performedBy: "Réalisé par", speciesDetail: "Détail de l'espèce", weightHistory: "Historique de poids", healthHistory: "Historique de santé", enableEnclosures: "Activer les Enclos", enableAreas: "Activer les Zones", enableEnclosuresModuleDesc: "Active la cartographie avancée et le regroupement des espèces par emplacement physique.", hideOrgName: "Masquer le Nom de l'Organisation", hideOrgNameDesc: "Afficher comme 'Organisation Anonyme' sur la carte du réseau.", showNativeStatus: "Afficher les Badges de Statut Natif", showNativeStatusDesc: "Afficher les indicateurs de statut natif/non natif/invasif sur les fiches espèces et profils individuels.", locationMapNotice: "Ajouter une localisation précise pour votre organisation est important pour la fonctionnalité de cartographie dans toute l'application. Veuillez définir une localisation et vérifier les paramètres de confidentialité ci-dessous.", speciesListVisibilityNote: "Visible uniquement pour les partenaires réseau enregistrés.", useMyLocation: "Utiliser Ma Position Actuelle", addToHomeScreen: "Ajouter à l'écran d'accueil", iosInstallHint: "Dans Safari, appuyez sur le bouton Partager en bas de l'écran, puis sur 'Ajouter à l'écran d'accueil'." } } ]; \ No newline at end of file diff --git a/services/storage.ts b/services/storage.ts index b33df6d..1188161 100644 --- a/services/storage.ts +++ b/services/storage.ts @@ -208,7 +208,7 @@ export const switchOrganization = (partnerId: string, explicitOrg?: any): boolea }; export const getOrg = (): Organization => { - const defaultOrg: Organization = { id: '', name: 'New Org', location: '', foundedYear: 2024, description: '', focus: 'Fauna', isOrgPublic: false, isSpeciesPublic: false, obscureLocation: false, allowBreedingRequests: false, aiUsageLimit: 1000 }; + const defaultOrg: Organization = { id: '', name: 'New Org', location: '', foundedYear: 2024, description: '', focus: 'Fauna', isOrgPublic: true, isSpeciesPublic: false, obscureLocation: true, allowBreedingRequests: false, aiUsageLimit: 1000 }; return get(KEYS.ORG, defaultOrg); };