diff --git a/Makefile b/Makefile index 0eb144d3d70..d2ac608a9df 100755 --- a/Makefile +++ b/Makefile @@ -105,6 +105,8 @@ locales: msgfmt -o modules/dictionary/locale/hi/LC_MESSAGES/dictionary.mo modules/dictionary/locale/hi/LC_MESSAGES/dictionary.po npx i18next-conv -l hi -s modules/dictionary/locale/hi/LC_MESSAGES/dictionary.po -t modules/dictionary/locale/hi/LC_MESSAGES/dictionary.json msgfmt -o modules/document_repository/locale/ja/LC_MESSAGES/document_repository.mo modules/document_repository/locale/ja/LC_MESSAGES/document_repository.po + msgfmt -o modules/document_repository/locale/hi/LC_MESSAGES/document_repository.mo modules/document_repository/locale/hi/LC_MESSAGES/document_repository.po + npx i18next-conv -l hi -s modules/document_repository/locale/hi/LC_MESSAGES/document_repository.po -t modules/document_repository/locale/hi/LC_MESSAGES/document_repository.json msgfmt -o modules/dqt/locale/ja/LC_MESSAGES/dqt.mo modules/dqt/locale/ja/LC_MESSAGES/dqt.po msgfmt -o modules/electrophysiology_browser/locale/ja/LC_MESSAGES/electrophysiology_browser.mo modules/electrophysiology_browser/locale/ja/LC_MESSAGES/electrophysiology_browser.po msgfmt -o modules/electrophysiology_uploader/locale/ja/LC_MESSAGES/electrophysiology_uploader.mo modules/electrophysiology_uploader/locale/ja/LC_MESSAGES/electrophysiology_uploader.po diff --git a/modules/document_repository/jsx/categoryForm.js b/modules/document_repository/jsx/categoryForm.js index f3c7199b483..b5df6a9e347 100644 --- a/modules/document_repository/jsx/categoryForm.js +++ b/modules/document_repository/jsx/categoryForm.js @@ -8,6 +8,9 @@ import { SelectElement, ButtonElement, } from 'jsx/Form'; +import i18n from 'I18nSetup'; +import {withTranslation} from 'react-i18next'; +import hiStrings from '../locale/hi/LC_MESSAGES/document_repository.json'; /** * Category Creation Form @@ -68,9 +71,11 @@ class DocCategoryForm extends React.Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; // Data loading error if (this.state.error) { - return

An error occured while loading the page.

; + return

{t('An error occured while loading the page.', + {ns: 'document_repository'})}

; } // Waiting for data to load if (!this.state.isLoaded) { @@ -81,7 +86,8 @@ class DocCategoryForm extends React.Component { let addButton = null; if (loris.userHasPermission('document_repository_categories')) { disabled = false; - addButton = ; + addButton = ; } return ( @@ -92,10 +98,12 @@ class DocCategoryForm extends React.Component { fileUpload={true} onSubmit={this.handleSubmit} > -

Add a category


+

{t('Add a category', + {ns: 'document_repository'})}


{ - swal.fire('Could not add category!', data.error, 'error'); + swal.fire('Could not add category!', + data.error, 'error'); }).catch((error) => { console.error(error); swal.fire( @@ -202,6 +212,10 @@ DocCategoryForm.propTypes = { action: PropTypes.string.isRequired, refreshPage: PropTypes.func, newCategoryState: PropTypes.func, + t: PropTypes.func, }; -export default DocCategoryForm; +i18n.addResourceBundle('hi', 'document_repository', hiStrings); + +export default withTranslation( + ['document_repository', 'loris'])(DocCategoryForm); diff --git a/modules/document_repository/jsx/deleteCategoryForm.js b/modules/document_repository/jsx/deleteCategoryForm.js index 15746f4f796..24a700a7c6f 100644 --- a/modules/document_repository/jsx/deleteCategoryForm.js +++ b/modules/document_repository/jsx/deleteCategoryForm.js @@ -6,6 +6,9 @@ import { ButtonElement, SelectElement, } from 'jsx/Form'; +import {withTranslation} from 'react-i18next'; +import i18n from 'I18nSetup'; +import hiStrings from '../locale/hi/LC_MESSAGES/document_repository.json'; /** * Document Delete category Form @@ -65,9 +68,11 @@ class DeleteDocCategoryForm extends React.Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; // Data loading error if (this.state.error) { - return

An error occured while loading the page.

; + return

{t('An error occured while loading the page.', + {ns: 'loris'})}

; } // Waiting for data to load if (!this.state.isLoaded) { @@ -78,7 +83,8 @@ class DeleteDocCategoryForm extends React.Component { let deleteButton = null; if (loris.userHasPermission('document_repository_categories')) { disabled = false; - deleteButton = ; + deleteButton = ; } return ( @@ -88,10 +94,10 @@ class DeleteDocCategoryForm extends React.Component { name="categoryEdit" onSubmit={this.handleSubmit} > -

Delete a category


+

{t('Delete a category', {ns: 'document_repository'})}


{ - let msg = error.message ? error.message : 'Delete error!'; + let msg = error.message ? error.message : t('Delete error!', + {ns: 'document_repository'}); this.setState({ errorMessage: msg, uploadProgress: -1, @@ -190,6 +198,10 @@ class DeleteDocCategoryForm extends React.Component { DeleteDocCategoryForm.propTypes = { dataURL: PropTypes.string.isRequired, action: PropTypes.string.isRequired, + t: PropTypes.func, }; -export default DeleteDocCategoryForm; +i18n.addResourceBundle('hi', 'document_repository', hiStrings); + +export default withTranslation( + ['document_repository', 'loris'])(DeleteDocCategoryForm); diff --git a/modules/document_repository/jsx/docIndex.js b/modules/document_repository/jsx/docIndex.js index 7e1a7a23c88..ed6d1aad294 100644 --- a/modules/document_repository/jsx/docIndex.js +++ b/modules/document_repository/jsx/docIndex.js @@ -13,6 +13,9 @@ import {createRoot} from 'react-dom/client'; import React from 'react'; import PropTypes from 'prop-types'; import {CheckboxElement} from 'jsx/Form'; +import i18n from 'I18nSetup'; +import {withTranslation} from 'react-i18next'; +import hiStrings from '../locale/hi/LC_MESSAGES/document_repository.json'; /** * Doc index component @@ -171,44 +174,52 @@ class DocIndex extends React.Component { * @return {*} a formated table cell for a given column */ formatColumn(column, cell, row) { + const {t} = this.props; let result = {cell}; switch (column) { - case 'File Name': + case t('File Name', {ns: 'document_repository'}): let downloadURL = loris.BaseURL + '/document_repository/Files/' - + encodeURIComponent(row['Uploaded By']) + + encodeURIComponent(row[t('Uploaded By', + {ns: 'document_repository'})]) + '/' - + encodeURIComponent(row['File Name']); + + encodeURIComponent(row[t('File Name', + {ns: 'document_repository'})]); result = {cell} ; break; - case 'Edit': + case t('Edit', {ns: 'document_repository'}): let editURL = loris.BaseURL - + '/document_repository/edit/' + row['Edit']; - result = Edit; + + '/document_repository/edit/' + + row[t('Edit', {ns: 'document_repository'})]; + result = {t('Edit', + {ns: 'document_repository'})}; break; - case 'Delete File': - let id = row['Edit']; + case t('Delete File', {ns: 'document_repository'}): + let id = row[t('Edit', {ns: 'document_repository'})]; /** * Click */ function click() { swal.fire({ - title: 'Are you sure?', - text: 'You won\'t be able to revert this!', + title: t('Are you sure?', {ns: 'document_repository'}), + text: t('You won\'t be able to revert this!', + {ns: 'document_repository'}), type: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', - confirmButtonText: 'Yes, delete it!', + confirmButtonText: t('Yes, delete it!', + {ns: 'document_repository'}), }).then((result) => { if (result.value) { let deleteurl = loris.BaseURL + '/document_repository/Files/' + id; @@ -219,14 +230,17 @@ class DocIndex extends React.Component { }).then((resp) => resp.json()) .then(()=>{ location.reload(); - swal.fire('delete Successful!', '', 'success'); + swal.fire(t('Delete Successful!', + {ns: 'document_repository'}), '', 'success'); }); } }); } result = - Delete + + {t('Delete', {ns: 'document_repository'})} + ; break; } @@ -239,10 +253,12 @@ class DocIndex extends React.Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; // If error occurs, return a message. // XXX: Replace this with a UI component for 500 errors. if (this.state.error) { - return

An error occured while loading the page.

; + return

{t('An error occured while loading the page.', + {ns: 'loris'})}

; } // Waiting for async data to load @@ -253,51 +269,59 @@ class DocIndex extends React.Component { this.props.hasPermission('document_repository_upload_edit'); const options = this.state.data.fieldOptions; const fields = [ - {label: 'File Name', show: true, filter: { + {label: t('File Name', + {ns: 'document_repository'}), show: true, filter: { name: 'fileName', type: 'text', }}, - {label: 'Version', show: true, filter: { + {label: t('Version', + {ns: 'document_repository'}), show: true, filter: { name: 'version', type: 'text', }}, - {label: 'File Type', show: true, filter: { + {label: t('File Type', + {ns: 'document_repository'}), show: true, filter: { name: 'fileTypes', type: 'select', options: options.fileTypes, }}, - {label: 'Instrument', show: false}, - {label: 'Uploaded By', show: true, filter: { + {label: t('Instrument', + {ns: 'document_repository'}), show: false}, + {label: t('Uploaded By', + {ns: 'document_repository'}), show: true, filter: { name: 'uploadedBy', type: 'text', }}, - {label: 'For Site', show: true, filter: { + {label: t('For Site', + {ns: 'document_repository'}), show: true, filter: { name: 'site', type: 'select', options: options.sites, }}, - {label: 'Comments', show: true, filter: { + {label: t('Comments', + {ns: 'document_repository'}), show: true, filter: { name: 'Comments', type: 'text', }}, - {label: 'Date Uploaded', show: true}, + {label: t('Date Uploaded', + {ns: 'document_repository'}), show: true}, { - label: 'Edit', + label: t('Edit', {ns: 'document_repository'}), show: this.props.hasPermission('superUser') || uploadEditPerm, }, { - label: 'Delete File', + label: t('Delete File', {ns: 'document_repository'}), show: this.props.hasPermission('superUser') || this.props.hasPermission('document_repository_delete'), }, - {label: 'File Category', show: false}, - {label: 'Category', show: false}, - {label: 'Data Dir', show: false}, + {label: t('File Category', {ns: 'document_repository'}), show: false}, + {label: t('Category', {ns: 'document_repository'}), show: false}, + {label: t('Data Dir', {ns: 'document_repository'}), show: false}, ]; let tabList = [ - {id: 'browse', label: 'Browse'}, + {id: 'browse', label: t('Browse', {ns: 'document_repository'})}, ]; let uploadDoc; let uploadCategory; @@ -307,7 +331,7 @@ class DocIndex extends React.Component { tabList.push( { id: 'upload', - label: 'Upload', + label: t('Upload', {ns: 'document_repository'}), }, ); @@ -327,15 +351,15 @@ class DocIndex extends React.Component { tabList.push( { id: 'addCategory', - label: 'Add Category', + label: t('Add Category', {ns: 'document_repository'}), }, { id: 'editCategory', - label: 'Edit Category', + label: t('Edit Category', {ns: 'document_repository'}), }, { id: 'deleteCategory', - label: 'Delete Category', + label: t('Delete Category', {ns: 'document_repository'}), }, ); @@ -388,7 +412,7 @@ class DocIndex extends React.Component {
{ + i18n.addResourceBundle('hi', 'document_repository', hiStrings); + + const TranslatedDocIndex = withTranslation( + ['document_repository', 'loris'])(DocIndex); + createRoot( document.getElementById('lorisworkspace') ).render(
- diff --git a/modules/document_repository/jsx/editCategoryForm.js b/modules/document_repository/jsx/editCategoryForm.js index e3818370d88..4928689807f 100644 --- a/modules/document_repository/jsx/editCategoryForm.js +++ b/modules/document_repository/jsx/editCategoryForm.js @@ -7,6 +7,9 @@ import { SelectElement, TextboxElement, } from 'jsx/Form'; +import {withTranslation} from 'react-i18next'; +import i18n from 'I18nSetup'; +import hiStrings from '../locale/hi/LC_MESSAGES/document_repository.json'; /** * Document Edit Category Form @@ -66,9 +69,11 @@ class EditDocCategoryForm extends React.Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; // Data loading error if (this.state.error) { - return

An error occured while loading the page.

; + return

{t('An error occured while loading the page.', + {ns: 'document_repository'})}

; } // Waiting for data to load if (!this.state.isLoaded) { @@ -79,7 +84,8 @@ class EditDocCategoryForm extends React.Component { let updateButton = null; if (loris.userHasPermission('document_repository_categories')) { disabled = false; - updateButton = ; + updateButton = ; } let errorSameParent = null; @@ -88,7 +94,8 @@ class EditDocCategoryForm extends React.Component { this.state.formData.categoryID==this.state.formData.newParentID && this.state.formData.categoryID!=null ) { - errorSameParent = 'Cannot be equal to itself'; + errorSameParent = t('Cannot be equal to itself', + {ns: 'document_repository'}); } return ( @@ -98,10 +105,11 @@ class EditDocCategoryForm extends React.Component { name="categoryEdit" onSubmit={this.handleSubmit} > -

Change Name of a category


+

{t('Change Name of a category', + {ns: 'document_repository'})}


{ - let msg = error.message ? error.message : 'Edit error!'; + let msg = error.message ? error.message : + this.props.t('Edit error!', {ns: 'document_repository'}); this.setState({ errorMessage: msg, uploadProgress: -1, @@ -232,6 +247,10 @@ class EditDocCategoryForm extends React.Component { EditDocCategoryForm.propTypes = { dataURL: PropTypes.string.isRequired, action: PropTypes.string.isRequired, + t: PropTypes.func, }; -export default EditDocCategoryForm; +i18n.addResourceBundle('hi', 'document_repository', hiStrings); + +export default withTranslation( + ['document_repository', 'loris'])(EditDocCategoryForm); diff --git a/modules/document_repository/jsx/editForm.js b/modules/document_repository/jsx/editForm.js index 6f2aa12ff2f..64d87317460 100644 --- a/modules/document_repository/jsx/editForm.js +++ b/modules/document_repository/jsx/editForm.js @@ -9,6 +9,8 @@ import { SelectElement, ButtonElement, } from 'jsx/Form'; +import {withTranslation} from 'react-i18next'; + /** * Document Edit Form @@ -74,9 +76,11 @@ class DocEditForm extends React.Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; // Data loading error if (this.state.error) { - return

An error occured while loading the page.

; + return

{t('An error occured while loading the page.', + {ns: 'document_repository'})}

; } // Waiting for data to load if (!this.state.isLoaded) { @@ -94,11 +98,12 @@ class DocEditForm extends React.Component { name="docEdit" onSubmit={this.handleSubmit} > -

Edit Document Repository File

+

{t('Edit Document Repository File', + {ns: 'document_repository'})}


@@ -144,7 +149,8 @@ class DocEditForm extends React.Component { loris.userHasPermission('document_repository_hidden') && ( - +
); @@ -203,6 +209,7 @@ class DocEditForm extends React.Component { DocEditForm.propTypes = { dataURL: PropTypes.string.isRequired, action: PropTypes.string.isRequired, + t: PropTypes.func.isRequired, }; -export default DocEditForm; +export default withTranslation(['document_repository', 'loris'])(DocEditForm); diff --git a/modules/document_repository/jsx/uploadForm.js b/modules/document_repository/jsx/uploadForm.js index 89ab0d670bd..1d50d497d3c 100644 --- a/modules/document_repository/jsx/uploadForm.js +++ b/modules/document_repository/jsx/uploadForm.js @@ -12,6 +12,9 @@ import { FileElement, ButtonElement, } from 'jsx/Form'; +import {withTranslation} from 'react-i18next'; +import i18n from 'I18nSetup'; +import hiStrings from '../locale/hi/LC_MESSAGES/document_repository.json'; /** * Media Upload Form @@ -87,8 +90,10 @@ class DocUploadForm extends Component { */ render() { // Data loading error + const {t} = this.props; if (this.state.error) { - return

An error occured while loading the page.

; + return

{t('An error occured while loading the page.', + {ns: 'document_repository'})}

; } // Waiting for data to load if (!this.state.isLoaded) { @@ -103,10 +108,10 @@ class DocUploadForm extends Component { onSubmit={this.uploadFiles} method="POST" > -

Upload files


+

{t('Upload files', {ns: 'document_repository'})}


@@ -157,7 +162,8 @@ class DocUploadForm extends Component { loris.userHasPermission('document_repository_hidden') ? (
@@ -223,37 +229,58 @@ class DocUploadForm extends Component { if (resp.ok) { resp.json().then((data) => { if (data.error_count === 0) { - swal.fire('Upload Successful!', '', 'success') - .then((result) => { - if (result.value) { - this.setState({formData: {}}); - this.props.refreshPage(); - } - }); + swal.fire( + this.props.t('Upload Successful!', + {ns: 'document_repository'}), + '', + 'success' + ).then((result) => { + if (result.value) { + this.setState({formData: {}}); + this.props.refreshPage(); + } + }); } else { console.error(resp); - swal.fire('Upload Incomplete', data.message, 'warning'); + swal.fire( + this.props.t('Upload Incomplete', + {ns: 'document_repository'}), + data.message, + 'warning' + ); } }).catch((error) => { console.error(error); swal.fire( - 'Error reading response', - 'Please report the issue or contact your administrator', + this.props.t('Error reading response', + {ns: 'document_repository'}), + this.props.t( + 'Please report the issue or contact your administrator', + {ns: 'document_repository'}), 'error' ); }); } else { if (resp.status == 413) { - swal.fire('File too large', 'Could not upload file', 'error'); + swal.fire( + this.props.t('File too large', {ns: 'document_repository'}), + this.props.t('Could not upload file', + {ns: 'document_repository'}), + 'error' + ); } if (resp.status == 403) { - swal.fire('Permission denied', - 'Could not upload file', + swal.fire( + this.props.t('Permission denied', {ns: 'document_repository'}), + this.props.t('Could not upload file', + {ns: 'document_repository'}), 'error' ); } if (resp.status == 400) { - swal.fire('Something went wrong', + swal.fire( + this.props.t('Something went wrong', + {ns: 'document_repository'}), JSON.parse(resp.response).message, 'error' ); @@ -262,8 +289,11 @@ class DocUploadForm extends Component { }).catch((error) => { console.error(error); swal.fire( - 'Something went wrong', - 'Please report the issue or contact your administrator', + this.props.t('Something went wrong', + {ns: 'document_repository'}), + this.props.t( + 'Please report the issue or contact your administrator', + {ns: 'document_repository'}), 'error' ); }).finally(() => this.setState({uploadInProgress: false})); @@ -292,6 +322,9 @@ DocUploadForm.propTypes = { action: PropTypes.string.isRequired, refreshPage: PropTypes.func.isRequired, category: PropTypes.bool, + t: PropTypes.func, }; -export default DocUploadForm; +i18n.addResourceBundle('hi', 'document_repository', hiStrings); + +export default withTranslation(['document_repository', 'loris'])(DocUploadForm); diff --git a/modules/document_repository/locale/document_repository.pot b/modules/document_repository/locale/document_repository.pot index 35e1a001c25..d2bd2f685d9 100644 --- a/modules/document_repository/locale/document_repository.pot +++ b/modules/document_repository/locale/document_repository.pot @@ -21,6 +21,123 @@ msgstr "" msgid "Document Repository" msgstr "" -msgid "Document Repository Notifications" -msgstr "ドキュメントリポジトリ通知" +msgid "Upload files" +msgstr "" + +msgid "Category" +msgstr "" + +msgid "Search for site" +msgstr "" + +msgid "Version" +msgstr "" + +msgid "Comments" +msgstr "" + +msgid "Restrict access to the file?" +msgstr "" + +msgid "File(s) to upload" +msgstr "" + +msgid "Upload File(s)" +msgstr "" + +msgid "Uploading..." +msgstr "" + +msgid "Upload Successful!" +msgstr "" + +msgid "Upload Incomplete" +msgstr "" + +msgid "Error reading response" +msgstr "" + +msgid "Please report the issue or contact your administrator" +msgstr "" + +msgid "File too large" +msgstr "" + +msgid "Could not upload file" +msgstr "" + +msgid "Permission denied" +msgstr "" + +msgid "Something went wrong" +msgstr "" + +msgid "Add Category" +msgstr "" + +msgid "Add a category" +msgstr "" + +msgid "Category Name" +msgstr "" + +msgid "Parent" +msgstr "" + +msgid "Category added successfully!" +msgstr "" + +msgid "Error" +msgstr "" + +msgid "Edit Document Repository File" +msgstr "" + +msgid "File updated successfully!" +msgstr "" + +msgid "Update File" +msgstr "" + +msgid "Edit Category" +msgstr "" + +msgid "Update Category" +msgstr "" + +msgid "Change Name of a category" +msgstr "" + +msgid "Category Name:" +msgstr "" + +msgid "New Name for Category" +msgstr "" + +msgid "New Parent:" +msgstr "" + +msgid "Cannot be equal to itself" +msgstr "" + +msgid "New parent cannot be equal to itself" +msgstr "" + +msgid "Edit error!" +msgstr "" + +msgid "Edited Successful!" +msgstr "" + +msgid "Delete Category" +msgstr "" + +msgid "Delete a category" +msgstr "" + +msgid "Delete error!" +msgstr "" + +msgid "Delete Successful!" +msgstr "" diff --git a/modules/document_repository/locale/hi/LC_MESSAGES/document_repository.po b/modules/document_repository/locale/hi/LC_MESSAGES/document_repository.po new file mode 100644 index 00000000000..82fceb1fa11 --- /dev/null +++ b/modules/document_repository/locale/hi/LC_MESSAGES/document_repository.po @@ -0,0 +1,144 @@ +# Default LORIS strings to be translated (English). +# Copy this to a language specific file and add translations to the +# new file. +# Copyright (C) 2025 +# This file is distributed under the same license as the LORIS package. +# Dave MacFarlane , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: LORIS 27\n" +"Report-Msgid-Bugs-To: https://github.com/aces/Loris/issues\n" +"POT-Creation-Date: 2025-04-08 14:37-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Document Repository" +msgstr "दस्तावेज़ भंडार" + +# --- Strings not in loris.pot, add below --- + +msgid "Upload files" +msgstr "फ़ाइलें अपलोड करें" + +msgid "Category" +msgstr "श्रेणी" + +msgid "Search for site" +msgstr "साइट खोजें" + +msgid "Version" +msgstr "संस्करण" + +msgid "Comments" +msgstr "टिप्पणियाँ" + +msgid "Restrict access to the file?" +msgstr "फ़ाइल की पहुँच सीमित करें?" + +msgid "File(s) to upload" +msgstr "अपलोड करने के लिए फ़ाइल(ें)" + +msgid "Upload File(s)" +msgstr "फ़ाइल(ें) अपलोड करें" + +msgid "Uploading..." +msgstr "अपलोड हो रहा है..." + +msgid "Upload Successful!" +msgstr "अपलोड सफल रहा!" + +msgid "Upload Incomplete" +msgstr "अपलोड अधूरा है" + +msgid "Error reading response" +msgstr "प्रतिक्रिया पढ़ने में त्रुटि" + +msgid "Please report the issue or contact your administrator" +msgstr "कृपया समस्या की रिपोर्ट करें या अपने व्यवस्थापक से संपर्क करें" + +msgid "File too large" +msgstr "फ़ाइल बहुत बड़ी है" + +msgid "Could not upload file" +msgstr "फ़ाइल अपलोड नहीं हो सकी" + +msgid "Permission denied" +msgstr "अनुमति अस्वीकृत" + +msgid "Something went wrong" +msgstr "कुछ गलत हो गया" + +msgid "Add Category" +msgstr "श्रेणी जोड़ें" + +msgid "Add a category" +msgstr "एक श्रेणी जोड़ें" + +msgid "Category Name" +msgstr "श्रेणी का नाम" + +msgid "Parent" +msgstr "मूल" + +msgid "Category added successfully!" +msgstr "श्रेणी सफलतापूर्वक जोड़ी गई!" + +msgid "Error" +msgstr "त्रुटि" + +msgid "Edit Document Repository File" +msgstr "दस्तावेज़ भंडार फ़ाइल संपादित करें" + +msgid "File updated successfully!" +msgstr "फ़ाइल सफलतापूर्वक अपडेट की गई!" + +msgid "Update File" +msgstr "फ़ाइल अपडेट करें" + +msgid "Edit Category" +msgstr "श्रेणी संपादित करें" + +msgid "Update Category" +msgstr "श्रेणी अपडेट करें" + +msgid "Change Name of a category" +msgstr "श्रेणी का नाम बदलें" + +msgid "Category Name:" +msgstr "श्रेणी का नाम:" + +msgid "New Name for Category" +msgstr "श्रेणी के लिए नया नाम" + +msgid "New Parent:" +msgstr "नया मूल:" + +msgid "Cannot be equal to itself" +msgstr "स्वयं के बराबर नहीं हो सकता" + +msgid "New parent cannot be equal to itself" +msgstr "नया मूल स्वयं के बराबर नहीं हो सकता" + +msgid "Edit error!" +msgstr "संपादन में त्रुटि!" + +msgid "Edited Successful!" +msgstr "संपादन सफल रहा!" + +msgid "Delete Category" +msgstr "श्रेणी हटाएँ" + +msgid "Delete a category" +msgstr "एक श्रेणी हटाएँ" + +msgid "Delete error!" +msgstr "हटाने में त्रुटि!" + +msgid "Delete Successful!" +msgstr "हटाना सफल रहा!"