diff --git a/Makefile b/Makefile index 0eb144d3d70..9adc508cb8d 100755 --- a/Makefile +++ b/Makefile @@ -112,6 +112,8 @@ locales: msgfmt -o modules/genomic_browser/locale/ja/LC_MESSAGES/genomic_browser.mo modules/genomic_browser/locale/ja/LC_MESSAGES/genomic_browser.po msgfmt -o modules/help_editor/locale/ja/LC_MESSAGES/help_editor.mo modules/help_editor/locale/ja/LC_MESSAGES/help_editor.po msgfmt -o modules/imaging_browser/locale/ja/LC_MESSAGES/imaging_browser.mo modules/imaging_browser/locale/ja/LC_MESSAGES/imaging_browser.po + msgfmt -o modules/imaging_browser/locale/hi/LC_MESSAGES/imaging_browser.mo modules/imaging_browser/locale/hi/LC_MESSAGES/imaging_browser.po + npx i18next-conv -l hi -s modules/imaging_browser/locale/hi/LC_MESSAGES/imaging_browser.po -t modules/imaging_browser/locale/hi/LC_MESSAGES/imaging_browser.json msgfmt -o modules/imaging_qc/locale/ja/LC_MESSAGES/imaging_qc.mo modules/imaging_qc/locale/ja/LC_MESSAGES/imaging_qc.po msgfmt -o modules/imaging_uploader/locale/ja/LC_MESSAGES/imaging_uploader.mo modules/imaging_uploader/locale/ja/LC_MESSAGES/imaging_uploader.po msgfmt -o modules/instrument_builder/locale/ja/LC_MESSAGES/instrument_builder.mo modules/instrument_builder/locale/ja/LC_MESSAGES/instrument_builder.po diff --git a/locale/hi/LC_MESSAGES/loris.po b/locale/hi/LC_MESSAGES/loris.po index 32d08fba0ca..6e3cec9b646 100644 --- a/locale/hi/LC_MESSAGES/loris.po +++ b/locale/hi/LC_MESSAGES/loris.po @@ -187,6 +187,18 @@ msgstr "उन्नत फ़िल्टर दिखाएँ" msgid "Hide Advanced Filters" msgstr "उन्नत फ़िल्टर छुपाएँ" +msgid "Language" +msgstr "भाषा" + +msgid "Previous" +msgstr "पिछला" + +msgid "Next" +msgstr "अगला" + +msgid "Save" +msgstr "सहेजें" + # Data table strings msgid "{{pageCount}} rows displayed of {{totalCount}}." msgstr "{{totalCount}} में से {{pageCount}} पंक्तियाँ प्रदर्शित" diff --git a/locale/loris.pot b/locale/loris.pot index 5d0d10f350e..8a45e659ecd 100644 --- a/locale/loris.pot +++ b/locale/loris.pot @@ -202,6 +202,15 @@ msgstr "" msgid "Language" msgstr "" +msgid "Previous" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Save" +msgstr "" + # Data table strings msgid "{{pageCount}} rows displayed of {{totalCount}}." msgstr "" diff --git a/modules/imaging_browser/jsx/CandidateScanQCSummaryWidget.js b/modules/imaging_browser/jsx/CandidateScanQCSummaryWidget.js index 252b962e565..e064e05d329 100644 --- a/modules/imaging_browser/jsx/CandidateScanQCSummaryWidget.js +++ b/modules/imaging_browser/jsx/CandidateScanQCSummaryWidget.js @@ -2,6 +2,7 @@ import '../../../node_modules/c3/c3.css'; import c3 from 'c3'; import React, {useEffect} from 'react'; import PropTypes from 'prop-types'; +import {useTranslation} from 'react-i18next'; /** * A CandidateScanQCSummaryWidget is a type of React widget @@ -12,6 +13,7 @@ import PropTypes from 'prop-types'; * @return {*} - rendered React component */ function CandidateScanQCSummaryWidget(props) { + const {t} = useTranslation(['imaging_browser', 'loris']); useEffect(() => { const modalities = getModalities(props.Files); const data = getDataObject(modalities, props.Files); @@ -35,14 +37,14 @@ function CandidateScanQCSummaryWidget(props) { type: 'category', categories: visits, label: { - text: 'Visit', + text: t('Visit', {ns: 'loris'}), position: 'outer-center', }, }, y: { label: { position: 'outer-middle', - text: 'Number of Scans', + text: t('Number of Scans', {ns: 'imaging_browser'}), }, }, }, @@ -55,17 +57,21 @@ function CandidateScanQCSummaryWidget(props) { return

- Different shades represent different modalities. - Only native modalities are displayed in results. + {t('Different shades represent different modalities.'+ + ' Only native modalities are displayed in results.', + {ns: 'imaging_browser'})}

- Hover over any visit to see detailed modality breakdown for visit, - click to go to imaging browser. + {t('Hover over any visit to see detailed modality breakdown for visit,'+ + ' click to go to imaging browser.', {ns: 'imaging_browser'})}

; } diff --git a/modules/imaging_browser/jsx/ImagePanel.js b/modules/imaging_browser/jsx/ImagePanel.js index f6059c642dc..d4f5f023576 100644 --- a/modules/imaging_browser/jsx/ImagePanel.js +++ b/modules/imaging_browser/jsx/ImagePanel.js @@ -6,6 +6,7 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; +import {withTranslation} from 'react-i18next'; /** * Image panel header component @@ -25,14 +26,15 @@ class ImagePanelHeader extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; let QCStatusLabel; - if (this.props.QCStatus === 'Pass') { + if (this.props.QCStatus === t('Pass', {ns: 'imaging_browser'})) { QCStatusLabel = - {this.props.QCStatus} + {t('Pass', {ns: 'imaging_browser'})} ; - } else if (this.props.QCStatus === 'Fail') { + } else if (this.props.QCStatus === t('Fail', {ns: 'imaging_browser'})) { QCStatusLabel = - {this.props.QCStatus} + {t('Fail', {ns: 'imaging_browser'})} ; } @@ -65,7 +67,7 @@ class ImagePanelHeader extends Component { className="btn btn-default btn-xs dropdown-toggle" onClick={this.props.onToggleHeaders} aria-expanded={this.props.HeadersExpanded}> - Header Info + {t('Header Info', {ns: 'imaging_browser'})}
@@ -97,8 +99,12 @@ ImagePanelHeader.propTypes = { FileID: PropTypes.string, Filename: PropTypes.string, Expanded: PropTypes.bool, + t: PropTypes.func, }; +const TranslatedImagePanelHeader = withTranslation( + ['imaging_browser'])(ImagePanelHeader); + /** * Image panel headers table component */ @@ -117,6 +123,7 @@ class ImagePanelHeadersTable extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; let inversionTime = null; if (this.props.HeaderInfo.InversionTime !== '0.00') { inversionTime = this.props.HeaderInfo.InversionTime + ' ms'; @@ -137,13 +144,15 @@ class ImagePanelHeadersTable extends Component { "> - Series Instance UID + {t('Series Instance UID', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.SeriesUID} - Voxel Size + {t('Voxel Size', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.XStep === '' ? ' ' : 'X: ' + this.props.HeaderInfo.XStep + ' mm, '} @@ -152,74 +161,89 @@ class ImagePanelHeadersTable extends Component { {this.props.HeaderInfo.ZStep === '' ? ' ' : 'Z: ' + this.props.HeaderInfo.ZStep + ' mm '} - Output Type + {t('Output Type', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.OutputType} - Protocol + {t('Protocol', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.AcquisitionProtocol} - Acquisition Date + {t('Acquisition Date', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.AcquisitionDate} - Inserted Date + {t('Inserted Date', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.InsertedDate} - Series Number + {t('Series Number', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.SeriesNumber} - Series Description + {t('Series Description', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.SeriesDescription} - Slice Thick + {t('Slice Thick', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.SliceThickness} mm - TR + {t('TR', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.RepetitionTime} ms - TE + {t('TE', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.EchoTime} ms - TI + {t('TI', + {ns: 'imaging_browser'})} {inversionTime} - Phase Encoding Direction + {t('Phase Encoding Direction', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.PhaseEncodingDirection} - Image Type + {t('Image Type', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.ImageType} - Echo Number + {t('Echo Number', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.EchoNumber} - Number of volumes + {t('Number of volumes', + {ns: 'imaging_browser'})} {numVolumes} {this.props.HeaderInfo.ProcessingPipeline ? - Processing Pipeline + {t('Processing Pipeline', + {ns: 'imaging_browser'})} : null} {this.props.HeaderInfo.ProcessingPipeline ? @@ -227,7 +251,8 @@ class ImagePanelHeadersTable extends Component { : null} {this.props.HeaderInfo.ProcDate ? - Processing Pipeline Date + {t('Processing Pipeline Date', + {ns: 'imaging_browser'})} : null } {this.props.HeaderInfo.ProcDate ? @@ -237,18 +262,21 @@ class ImagePanelHeadersTable extends Component { {this.props.HeaderInfo.ProcessingPipeline === 'DTIPrepPipeline' ? - Number of rejected directions + {t('Number of rejected directions', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.TotalRejected} - Number of Interlace correlations + {t('Number of Interlace correlations', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.InterlaceRejected} - Number of Gradient-wise correlations + {t('Number of Gradient-wise correlations', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.IntergradientRejected} @@ -258,7 +286,8 @@ class ImagePanelHeadersTable extends Component { {this.props.HeaderInfo.ProcessingPipeline === 'DTIPrepPipeline' ? - Number of Slicewise correlations + {t('Number of Slicewise correlations', + {ns: 'imaging_browser'})} {this.props.HeaderInfo.SlicewiseRejected} @@ -272,8 +301,11 @@ class ImagePanelHeadersTable extends Component { } ImagePanelHeadersTable.propTypes = { HeaderInfo: PropTypes.object, + t: PropTypes.func, }; +const TranslatedImagePanelHeadersTable = withTranslation( + ['imaging_browser'])(ImagePanelHeadersTable); /** * Image quality control dropdown component @@ -344,8 +376,11 @@ ImageQCDropdown.propTypes = { FileID: PropTypes.string, FormName: PropTypes.string, defaultValue: PropTypes.string, + t: PropTypes.func, }; +const TranslatedImageQCDropdown = withTranslation( + ['imaging_browser'])(ImageQCDropdown); /** * Image quality control static component @@ -382,8 +417,11 @@ class ImageQCStatic extends Component { ImageQCStatic.propTypes = { defaultValue: PropTypes.string, Label: PropTypes.string, + t: PropTypes.func, }; +const TranslatedImageQCStatic = withTranslation( + ['imaging_browser'])(ImageQCStatic); /** * Image panel quality control @@ -404,26 +442,28 @@ class ImagePanelQCStatusSelector extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; let qcStatusLabel; if (this.props.HasQCPerm && this.props.FileNew) { qcStatusLabel = - QC Status + {t('QC Status', {ns: 'imaging_browser'})} ( - New ) + {t('New', {ns: 'imaging_browser'})} ) ; } else { - qcStatusLabel = 'QC Status'; + qcStatusLabel = t('QC Status', {ns: 'imaging_browser'}); } return ( - ); } @@ -433,8 +473,11 @@ ImagePanelQCStatusSelector.propTypes = { HasQCPerm: PropTypes.bool, QCStatus: PropTypes.string, FileID: PropTypes.string, + t: PropTypes.func, }; +const TranslatedImagePanelQCStatusSelector = withTranslation( + ['imaging_browser'])(ImagePanelQCStatusSelector); /** * Image panel quality control @@ -455,13 +498,15 @@ class ImagePanelQCSelectedSelector extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; return ( - ); @@ -471,8 +516,11 @@ ImagePanelQCSelectedSelector.propTypes = { FileID: PropTypes.string, HasQCPerm: PropTypes.bool, Selected: PropTypes.string, + t: PropTypes.func, }; +const TranslatedImagePanelQCSelectedSelector = withTranslation( + ['imaging_browser'])(ImagePanelQCSelectedSelector); /** * Image panel quality control @@ -493,6 +541,7 @@ class ImagePanelQCCaveatSelector extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; // Link caveat to MRI Violations if set true let mriViolationsLink = null; if (this.props.FullName && this.props.Caveat === '1') { @@ -502,16 +551,16 @@ class ImagePanelQCCaveatSelector extends Component { } return ( - - - - - @@ -626,8 +682,11 @@ ImagePanelQCPanel.propTypes = { SNR: PropTypes.string, EditableCaveat: PropTypes.bool, FullName: PropTypes.string, + t: PropTypes.func, }; +const TranslatedImagePanelQCPanel = withTranslation( + ['imaging_browser'])(ImagePanelQCPanel); /** * Download button component @@ -647,6 +706,7 @@ class DownloadButton extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; const empty = (prop) => { return !prop || prop == ''; }; @@ -663,7 +723,8 @@ class DownloadButton extends Component { - {this.props.Label} + {t('Download Image', + {ns: 'imaging_browser'})} ); } @@ -673,8 +734,11 @@ DownloadButton.propTypes = { BaseURL: PropTypes.string, Label: PropTypes.string, URL: PropTypes.string, + t: PropTypes.func, }; +const TranslatedDownloadButton = withTranslation( + ['imaging_browser'])(DownloadButton); /** * Image quality control comments button component @@ -712,6 +776,7 @@ class ImageQCCommentsButton extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; if (!this.props.FileID || this.props.FileID === '') { return ; } @@ -722,7 +787,8 @@ class ImageQCCommentsButton extends Component { > - QC Comments + {t('QC Comments', + {ns: 'imaging_browser'})} ); @@ -731,8 +797,11 @@ class ImageQCCommentsButton extends Component { ImageQCCommentsButton.propTypes = { FileID: PropTypes.string, BaseURL: PropTypes.string, + t: PropTypes.func, }; +const TranslatedImageQCCommentsButton = withTranslation( + ['imaging_browser'])(ImageQCCommentsButton); /** * Longitudinal view button component @@ -768,6 +837,7 @@ class LongitudinalViewButton extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; if (!this.props.FileID || this.props.FileID === '') { return ; } @@ -778,7 +848,8 @@ class LongitudinalViewButton extends Component { > - Longitudinal View + {t('Longitudinal View', + {ns: 'imaging_browser'})} ); @@ -788,8 +859,11 @@ LongitudinalViewButton.propTypes = { FileID: PropTypes.string, BaseURL: PropTypes.string, OtherTimepoints: PropTypes.string, + t: PropTypes.func, }; +const TranslatedLongitudinalViewButton = withTranslation( + ['imaging_browser'])(LongitudinalViewButton); /** * Image download buttons component @@ -809,52 +883,54 @@ class ImageDownloadButtons extends Component { * @return {JSX} - React markup for the component */ render() { + const {t} = this.props; return (
- - - - - { this.props.NiiFile ? - : null } {this.props.BvalFile ? - : null } {this.props.BvecFile ? - : null } {this.props.JsonFile ? - : null } - @@ -875,8 +951,11 @@ ImageDownloadButtons.propTypes = { BvecFile: PropTypes.string, JsonFile: PropTypes.string, OtherTimepoints: PropTypes.string, + t: PropTypes.func, }; +const TranslatedImageDownloadButtons = withTranslation( + ['imaging_browser'])(ImageDownloadButtons); /** * Image panel body component @@ -919,7 +998,7 @@ class ImagePanelBody extends Component {
-
- - {this.props.HeadersExpanded ? : ''} ); @@ -975,8 +1054,11 @@ ImagePanelBody.propTypes = { HeadersExpanded: PropTypes.bool, HeaderInfo: PropTypes.object, EditableCaveat: PropTypes.bool, + t: PropTypes.func, }; +const TranslatedImagePanelBody = withTranslation( + ['imaging_browser'])(ImagePanelBody); /** * Image panel component @@ -1027,7 +1109,7 @@ class ImagePanel extends Component { return (
- {this.state.BodyCollapsed ? '' : - {cell}; + const {t} = this.props; switch (column) { - case 'New Data': + case t('New Data', {ns: 'imaging_browser'}): if (cell === 'new') { result = ( - NEW + {t('NEW', {ns: 'imaging_browser'})} ); } break; - case 'Links': + case t('Links', {ns: 'imaging_browser'}): let cellTypes = cell.split(','); let cellLinks = []; for (let i = 0; i < cellTypes.length; i += 1) { @@ -87,7 +91,7 @@ class ImagingBrowserIndex extends Component { '/imaging_browser/viewSession/?sessionID=' + row.SessionID + '&selectedOnly=1&backURL=/imaging_browser/'}> - selected + {t('selected', {ns: 'imaging_browser'})} ); cellLinks.push(' | '); @@ -95,7 +99,7 @@ class ImagingBrowserIndex extends Component { '/imaging_browser/viewSession/?sessionID=' + row.SessionID + '&backURL=/imaging_browser/'}> - all types + {t('all types', {ns: 'imaging_browser'})} ); result = ({cellLinks}); break; @@ -110,10 +114,12 @@ class ImagingBrowserIndex extends 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: 'imaging_browser'})}

; } // Waiting for async data to load @@ -128,61 +134,66 @@ class ImagingBrowserIndex extends Component { const options = this.state.data.fieldOptions; const configLabels = options.configLabels; const fields = [ - {label: 'Site', show: true, filter: { + {label: t('Site', {ns: 'loris'}), show: true, filter: { name: 'site', type: 'select', options: options.sites, }}, - {label: 'PSCID', show: true, filter: { + {label: t('PSCID', {ns: 'loris'}), show: true, filter: { name: 'PSCID', type: 'text', }}, - {label: 'DCCID', show: true, filter: { + {label: t('DCCID', {ns: 'loris'}), show: true, filter: { name: 'DCCID', type: 'text', }}, - {label: 'Project', show: true, filter: { + {label: t('Project', {ns: 'loris'}), show: true, filter: { name: 'project', type: 'select', options: options.projects, }}, - {label: 'Visit Label', show: true, filter: { + {label: t('Visit Label', {ns: 'loris'}), show: true, filter: { name: 'visitLabel', type: 'text', }}, - {label: 'Visit QC Status', show: true, filter: { - name: 'visitQCStatus', - type: 'select', - options: options.visitQCStatus, - }}, - {label: 'First Acquisition', show: true}, - {label: 'First Insertion', show: true}, - {label: 'Last QC', show: true}, - {label: 'New Data', show: true}, - {label: 'Links', show: true}, - {label: 'SessionID', show: false}, - {label: 'Sequence Type', show: false, filter: { - name: 'sequenceType', - type: 'multiselect', - options: options.sequenceTypes, - }}, - {label: 'Pending New', show: false, filter: { - name: 'pendingNew', - type: 'multiselect', - options: options.pendingNew, - }}, - {label: 'Entity Type', show: false, filter: { - name: 'entityType', - type: 'multiselect', - options: options.entityType, - }}, + {label: t('Visit QC Status', {ns: 'imaging_browser'}), + show: true, filter: { + name: 'visitQCStatus', + type: 'select', + options: options.visitQCStatus, + }}, + {label: t('First Acquisition', {ns: 'imaging_browser'}), show: true}, + {label: t('First Insertion', {ns: 'imaging_browser'}), show: true}, + {label: t('Last QC', {ns: 'imaging_browser'}), show: true}, + {label: t('New Data', {ns: 'imaging_browser'}), show: true}, + {label: t('Links', {ns: 'imaging_browser'}), show: true}, + {label: t('SessionID', {ns: 'imaging_browser'}), show: false}, + {label: t('Sequence Type', {ns: 'imaging_browser'}), + show: false, filter: { + name: 'sequenceType', + type: 'multiselect', + options: options.sequenceTypes, + }}, + {label: t('Pending New', {ns: 'imaging_browser'}), + show: false, filter: { + name: 'pendingNew', + type: 'multiselect', + options: options.pendingNew, + }}, + {label: t('Entity Type', {ns: 'imaging_browser'}), + show: false, filter: { + name: 'entityType', + type: 'multiselect', + options: options.entityType, + }}, ]; /** * Adding columns based on the Imaging Browser Tabulated Scan Types * configured and stored in database */ Object.values(configLabels).forEach((label)=> { - fields.push({label: label + ' QC Status', show: true} + fields.push({label: t(label + ' QC Status', {ns: 'imaging_browser'}), + show: true} ); }); @@ -200,10 +211,12 @@ class ImagingBrowserIndex extends Component { ImagingBrowserIndex.propTypes = { dataURL: PropTypes.string.isRequired, + t: PropTypes.func, }; window.addEventListener('load', () => { i18n.addResourceBundle('ja', 'imaging_browser', {}); + i18n.addResourceBundle('hi', 'imaging_browser', hiStrings); const Index = withTranslation( ['imaging_browser', 'loris'] )(ImagingBrowserIndex); diff --git a/modules/imaging_browser/locale/hi/LC_MESSAGES/imaging_browser.po b/modules/imaging_browser/locale/hi/LC_MESSAGES/imaging_browser.po new file mode 100644 index 00000000000..3eec9ce3262 --- /dev/null +++ b/modules/imaging_browser/locale/hi/LC_MESSAGES/imaging_browser.po @@ -0,0 +1,169 @@ +# 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 "Imaging Browser" +msgstr "इमेजिंग ब्राउज़र" + +msgid "View Session" +msgstr "सत्र देखें" + +msgid "New and pending imaging session" +msgstr "नई और लंबित इमेजिंग सत्र" + +msgid "New and pending imaging sessions" +msgstr "नई और लंबित इमेजिंग सत्रों" + +msgid "Visit QC Status" +msgstr "विजिट QC स्थिति" + +msgid "First Acquisition" +msgstr "पहला अधिग्रहण" + +msgid "First Insertion" +msgstr "पहला सम्मिलन" + +msgid "Last QC" +msgstr "अंतिम QC" + +msgid "New Data" +msgstr "नया डेटा" + +msgid "Links" +msgstr "लिंक" + +msgid "SessionID" +msgstr "सेशन आईडी" + +msgid "Sequence Type" +msgstr "सीक्वेंस प्रकार" + +msgid "Pending New" +msgstr "लंबित नया" + +msgid "QC Status" +msgstr "QC स्थिति" + +msgid "all types" +msgstr "सभी प्रकार" + +msgid "NEW" +msgstr "नया" + +msgid "Pass" +msgstr "पास" + +msgid "Fail" +msgstr "फेल" + +msgid "Header Info" +msgstr "हेडर जानकारी" + +msgid "Selected" +msgstr "चयनित" + +msgid "selected" +msgstr "चयनित" + +msgid "Download Image" +msgstr "इमेज डाउनलोड करें" + +msgid "Longitudinal View" +msgstr "लंबवत दृश्य" + +msgid "QC Comments" +msgstr "QC टिप्पणियाँ" + +msgid "Series Instance UID" +msgstr "सीरीज इंस्टेंस UID" + +msgid "Number of Scans" +msgstr "स्कैन की संख्या" + +msgid "Red bar denotes number of failed QC scans." +msgstr "लाल बार असफल QC स्कैन की संख्या दर्शाता है।" + +msgid "Green bar denotes number of passed QC scans." +msgstr "हरा बार पास किए गए QC स्कैन की संख्या दर्शाता है।" + +msgid "Grey bar denotes other QC statuses." +msgstr "ग्रे बार अन्य QC स्थितियाँ दर्शाता है।" + +msgid "Different shades represent different modalities. Only native modalities are displayed in results." +msgstr "विभिन्न शेड्स विभिन्न मोडैलिटी का प्रतिनिधित्व करते हैं। केवल मूल मोडैलिटी परिणामों में दिखाई जाती हैं।" + +msgid "Hover over any visit to see detailed modality breakdown for visit, click to go to imaging browser." +msgstr "किसी भी विजिट पर होवर करें ताकि विजिट के लिए विस्तृत मोडैलिटी ब्रेकडाउन देखें, क्लिक करें और इमेजिंग ब्राउज़र पर जाएं।" + +msgid "%1 file(s) displayed." +msgstr "%1 फ़ाइल(ओं) प्रदर्शित।" + +msgid "No data available" +msgstr "कोई डेटा उपलब्ध नहीं है" + +msgid "Patient Name" +msgstr "रोगी का नाम" + +msgid "QC Pending" +msgstr "गुणवत्ता नियंत्रण लंबित" + +msgid "Output Type" +msgstr "आउटपुट प्रकार" + +msgid "Scanner" +msgstr "स्कैनर" + +msgid "EDC" +msgstr "ईडीसी" + +msgid "Navigation" +msgstr "नेविगेशन" + +msgid "Back to list" +msgstr "सूची में वापस जाएँ" + +msgid "Volume Viewer" +msgstr "वॉल्यूम व्यूअर" + +msgid "3D Only" +msgstr "केवल 3D" + +msgid "3D + Overlay" +msgstr "3D + ओवरले" + +msgid "Report a Bug (Mantis)" +msgstr "बग रिपोर्ट करें (मैन्टिस)" + +msgid "Visit Level QC" +msgstr "भेंट स्तर गुणवत्ता नियंत्रण" + +msgid "Visit Level Feedback" +msgstr "भेंट स्तर प्रतिक्रिया" + +msgid "Visit Level Caveat" +msgstr "भेंट स्तर चेतावनी" + +msgid "DCC MRI Quality Control" +msgstr "डीसीसी एमआरआई गुणवत्ता नियंत्रण" + +msgid "Click here to close this window" +msgstr "इस विंडो को बंद करने के लिए यहाँ क्लिक करें" + +msgid "Comments saved." +msgstr "टिप्पणियाँ सहेजी गईं।" diff --git a/modules/imaging_browser/locale/imaging_browser.pot b/modules/imaging_browser/locale/imaging_browser.pot index 9a115fe6e23..59160b1fe08 100644 --- a/modules/imaging_browser/locale/imaging_browser.pot +++ b/modules/imaging_browser/locale/imaging_browser.pot @@ -30,6 +30,140 @@ msgstr "" msgid "New and pending imaging sessions" msgstr "" -msgid "Imaging Session" -msgid_plural "Imaging Sessions" -msgstr[0] "" +msgid "Visit QC Status" +msgstr "" + +msgid "First Acquisition" +msgstr "" + +msgid "First Insertion" +msgstr "" + +msgid "Last QC" +msgstr "" + +msgid "New Data" +msgstr "" + +msgid "Links" +msgstr "" + +msgid "SessionID" +msgstr "" + +msgid "Sequence Type" +msgstr "" + +msgid "Pending New" +msgstr "" + +msgid "QC Status" +msgstr "" + +msgid "all types" +msgstr "" + +msgid "NEW" +msgstr "" + +msgid "Pass" +msgstr "" + +msgid "Fail" +msgstr "" + +msgid "Header Info" +msgstr "" + +msgid "Selected" +msgstr "" + +msgid "selected" +msgstr "" + +msgid "Download Image" +msgstr "" + +msgid "Longitudinal View" +msgstr "" + +msgid "QC Comments" +msgstr "" + +msgid "Series Instance UID" +msgstr "" + +msgid "Number of Scans" +msgstr "" + +msgid "Red bar denotes number of failed QC scans." +msgstr "" + +msgid "Green bar denotes number of passed QC scans." +msgstr "" + +msgid "Grey bar denotes other QC statuses." +msgstr "" + +msgid "Different shades represent different modalities. Only native modalities are displayed in results." +msgstr "" + +msgid "Hover over any visit to see detailed modality breakdown for visit, click to go to imaging browser." +msgstr "" + +msgid "%1 file(s) displayed." +msgstr "" + +msgid "No data available" +msgstr "" + +msgid "Patient Name" +msgstr "" + +msgid "QC Pending" +msgstr "" + +msgid "Output Type" +msgstr "" + +msgid "Scanner" +msgstr "" + +msgid "EDC" +msgstr "" + +msgid "Navigation" +msgstr "" + +msgid "Back to list" +msgstr "" + +msgid "Volume Viewer" +msgstr "" + +msgid "3D Only" +msgstr "" + +msgid "3D + Overlay" +msgstr "" + +msgid "Report a Bug (Mantis)" +msgstr "" + +msgid "Visit Level QC" +msgstr "" + +msgid "Visit Level Feedback" +msgstr "" + +msgid "Visit Level Caveat" +msgstr "" + +msgid "DCC MRI Quality Control" +msgstr "" + +msgid "Click here to close this window" +msgstr "" + +msgid "Comments saved." +msgstr "" diff --git a/modules/imaging_browser/templates/form_feedback_mri_popup.tpl b/modules/imaging_browser/templates/form_feedback_mri_popup.tpl index d112f3b4930..4d2c3f9bbc8 100644 --- a/modules/imaging_browser/templates/form_feedback_mri_popup.tpl +++ b/modules/imaging_browser/templates/form_feedback_mri_popup.tpl @@ -6,25 +6,25 @@ -DCC MRI Quality Control +{t text="DCC MRI Quality Control" domain="imaging_browser"} {section name=error loop=$error_message} {$error_message[error]}
{/section} -

Click here to close this window

+

{t text="Click here to close this window" domain="imaging_browser"}

{if $saved|default} -

Comments saved.

+

{t text="Comments saved." domain="imaging_browser"}

{/if} {section name=data loop=$identifier} - + {/section} @@ -82,7 +82,7 @@ {/foreach} {if $has_permission} - + {/if} diff --git a/modules/imaging_browser/templates/form_viewSession.tpl b/modules/imaging_browser/templates/form_viewSession.tpl index 6378c94c440..a4541952200 100644 --- a/modules/imaging_browser/templates/form_viewSession.tpl +++ b/modules/imaging_browser/templates/form_viewSession.tpl @@ -6,7 +6,7 @@
{if $files|@count} -

{$files|@count} file(s) displayed.

+

{t text="%1 file(s) displayed." domain="imaging_browser"}{$files|@count}{/t}

@@ -74,7 +74,7 @@ {/section}
{else} -

No data available

+

{t text="No data available" domain="imaging_browser"}

{/if} diff --git a/modules/imaging_browser/templates/imaging_session_controlpanel.tpl b/modules/imaging_browser/templates/imaging_session_controlpanel.tpl index 646eab1a919..316d431455f 100644 --- a/modules/imaging_browser/templates/imaging_session_controlpanel.tpl +++ b/modules/imaging_browser/templates/imaging_session_controlpanel.tpl @@ -1,9 +1,9 @@ -

Navigation

+

{t text="Navigation" domain="imaging_browser"}

{if $prevTimepoint.URL|default !="" && $nextTimepoint.URL!=""}

{/if} -

Volume Viewer

- - +

{t text="Volume Viewer" domain="imaging_browser"}

+ + {if $subject.links|@count || $subject.tarchiveIDLoc|@count || $mantis|default} -

Links

+

{t text="Links" domain="imaging_browser"}

{/if} -

Visit Level QC

+

{t text="Visit Level QC" domain="imaging_browser"}


- + {if $subject.has_permission}{html_options options=$subject.status_options selected=$subject.mriqcstatus name=visit_status tabindex=1 class="form-control input-sm" style="width:100px"}{else}{$subject.mriqcstatus}{/if}
- + {if $subject.has_permission}{html_options options=$subject.pending_options selected=$subject.mriqcpending name=visit_pending tabindex=2 class="form-control input-sm" style="width:100px"}{else}{if $subject.mriqcpending=='Y'}Yes{else}No{/if}{/if}
- + {if $subject.has_permission}{html_options options=$subject.caveat_options selected=$subject.mricaveat name=visit_caveat tabindex=3 class="form-control input-sm" style="width:100px"}{else}{if $subject.mricaveat=='true'}True{else}False{/if}{/if}
- {if $subject.has_permission}{/if} + {if $subject.has_permission}{/if}
diff --git a/modules/imaging_browser/templates/table_session_header.tpl b/modules/imaging_browser/templates/table_session_header.tpl index 7691426dfbe..85ef6412bc6 100644 --- a/modules/imaging_browser/templates/table_session_header.tpl +++ b/modules/imaging_browser/templates/table_session_header.tpl @@ -1,20 +1,20 @@
{$identifier[data].name}:{t text=$identifier[data].name domain="imaging_browser"}: {$identifier[data].value}
- - - - - - - - - - - - + + + + + + + + + + + + {if $useEDC|default} - + {/if}
QC StatusPatient NamePSCIDDCCIDVisit LabelSiteQC PendingDOBSexOutput TypeScannerCohort{t text="QC Status" domain="imaging_browser"}{t text="Patient Name" domain="imaging_browser"}{t text="PSCID" domain="loris"}{t text="DCCID" domain="loris"}{t text="Visit Label" domain="loris"}{t text="Site" domain="loris"}{t text="QC Pending" domain="imaging_browser"}{t text="DOB" domain="loris"}{t text="Sex" domain="loris"}{t text="Output Type" domain="imaging_browser"}{t text="Scanner" domain="imaging_browser"}{t text="Cohort" domain="loris"}EDC{t text="EDC" domain="imaging_browser"}