diff --git a/extensions/cornerstone-dicom-seg/src/components/LogicalContourOperationsOptions.tsx b/extensions/cornerstone-dicom-seg/src/components/LogicalContourOperationsOptions.tsx index 33a7b7cc3..8f3e625bb 100644 --- a/extensions/cornerstone-dicom-seg/src/components/LogicalContourOperationsOptions.tsx +++ b/extensions/cornerstone-dicom-seg/src/components/LogicalContourOperationsOptions.tsx @@ -19,6 +19,7 @@ import { } from '@ohif/ui-next'; import { Icons } from '@ohif/ui-next'; import { contourSegmentation } from '@cornerstonejs/tools/utilities'; +import { useTranslation } from 'react-i18next'; import { Segment } from '@cornerstonejs/tools/types'; const { LogicalOperation } = contourSegmentation; @@ -60,6 +61,7 @@ function SegmentSelector({ segments: Segment[]; placeholder?: string; }) { + const { t } = useTranslation('SegmentationPanel'); return (
{label}
@@ -69,7 +71,7 @@ function SegmentSelector({ value={value} > - + {segments.map(segment => ( @@ -89,6 +91,7 @@ function SegmentSelector({ function LogicalContourOperationOptions() { const { servicesManager } = useSystem(); const { segmentationService } = servicesManager.services; + const { t } = useTranslation('SegmentationPanel'); const { segmentationsWithRepresentations } = useActiveViewportSegmentationRepresentations(); const activeRepresentation = segmentationsWithRepresentations?.find( @@ -184,7 +187,7 @@ function LogicalContourOperationOptions() { })} -
{operation.label}
+
{t(operation.label)}
@@ -210,7 +213,7 @@ function LogicalContourOperationOptions() { applyLogicalContourOperation(); }} > - {operation.label} + {t(operation.label)}
@@ -221,7 +224,7 @@ function LogicalContourOperationOptions() { onCheckedChange={setCreateNewSegment} >
@@ -230,7 +233,7 @@ function LogicalContourOperationOptions() { disabled={!createNewSegment} id="logical-contour-operations-create-new-segment-input" type="text" - placeholder="New segment name" + placeholder={t('New segment name')} value={newSegmentName} onChange={e => setNewSegmentName(e.target.value)} /> diff --git a/extensions/cornerstone-dicom-seg/src/components/SimplifyContourOptions.tsx b/extensions/cornerstone-dicom-seg/src/components/SimplifyContourOptions.tsx index db17eafd8..27ecf70be 100644 --- a/extensions/cornerstone-dicom-seg/src/components/SimplifyContourOptions.tsx +++ b/extensions/cornerstone-dicom-seg/src/components/SimplifyContourOptions.tsx @@ -1,16 +1,18 @@ import React, { useState } from 'react'; import { Button, Input, Label, Separator } from '@ohif/ui-next'; import { useRunCommand } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; function SimplifyContourOptions() { const [areaThreshold, setAreaThreshold] = useState(10); const runCommand = useRunCommand(); + const { t } = useTranslation('SegmentationPanel'); return (
-
Fill contour holes
+
{t('Fill contour holes')}
-
Remove Small Contours
+
{t('Remove Small Contours')}
- Remove Small Contours + {t('Remove Small Contours')}
-
Create New Segment from Holes
+
{t('Create New Segment from Holes')}
diff --git a/extensions/cornerstone-dicom-seg/src/components/SmoothContoursOptions.tsx b/extensions/cornerstone-dicom-seg/src/components/SmoothContoursOptions.tsx index 5ff10be8e..677c56c33 100644 --- a/extensions/cornerstone-dicom-seg/src/components/SmoothContoursOptions.tsx +++ b/extensions/cornerstone-dicom-seg/src/components/SmoothContoursOptions.tsx @@ -1,14 +1,16 @@ import React from 'react'; import { Button, Separator } from '@ohif/ui-next'; import { useRunCommand } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; function SmoothContoursOptions() { const runCommand = useRunCommand(); + const { t } = useTranslation('SegmentationPanel'); return (
-
Smooth all edges
+
{t('Smooth all edges')}
-
Remove extra points
+
{t('Remove extra points')}
diff --git a/extensions/cornerstone-dicom-seg/src/getToolbarModule.ts b/extensions/cornerstone-dicom-seg/src/getToolbarModule.ts index 6fb56cad2..dcbeab7bf 100644 --- a/extensions/cornerstone-dicom-seg/src/getToolbarModule.ts +++ b/extensions/cornerstone-dicom-seg/src/getToolbarModule.ts @@ -1,4 +1,5 @@ import { utilities as cstUtils } from '@cornerstonejs/tools'; +import i18n from '@ohif/i18n'; import { useUIStateStore } from '@ohif/extension-default'; import LogicalContourOperationsOptions from './components/LogicalContourOperationsOptions'; @@ -46,7 +47,7 @@ export function getToolbarModule({ servicesManager }: withAppTypes) { if (!segmentations?.length) { return { disabled: true, - disabledText: 'No segmentations available', + disabledText: i18n.t('SegmentationPanel:No segmentations available'), }; } @@ -73,7 +74,7 @@ export function getToolbarModule({ servicesManager }: withAppTypes) { if (!segmentations?.length) { return { disabled: true, - disabledText: disabledText ?? 'No segmentations available', + disabledText: disabledText ?? i18n.t('SegmentationPanel:No segmentations available'), }; } @@ -81,7 +82,7 @@ export function getToolbarModule({ servicesManager }: withAppTypes) { if (!Object.keys(activeSegmentation.segments).length) { return { disabled: true, - disabledText: 'Add segment to enable this tool', + disabledText: i18n.t('SegmentationPanel:Add segment to enable this tool'), }; } @@ -90,7 +91,7 @@ export function getToolbarModule({ servicesManager }: withAppTypes) { if (!toolGroup) { return { disabled: true, - disabledText: disabledText ?? 'Not available on the current viewport', + disabledText: disabledText ?? i18n.t('SegmentationPanel:Not available on the current viewport'), }; } @@ -106,7 +107,7 @@ export function getToolbarModule({ servicesManager }: withAppTypes) { if (!toolGroup.hasTool(toolName) && !toolNames) { return { disabled: true, - disabledText: disabledText ?? 'Not available on the current viewport', + disabledText: disabledText ?? i18n.t('SegmentationPanel:Not available on the current viewport'), }; } diff --git a/extensions/cornerstone-dynamic-volume/src/getPanelModule.tsx b/extensions/cornerstone-dynamic-volume/src/getPanelModule.tsx index ee55b0d77..3badd838f 100644 --- a/extensions/cornerstone-dynamic-volume/src/getPanelModule.tsx +++ b/extensions/cornerstone-dynamic-volume/src/getPanelModule.tsx @@ -22,7 +22,7 @@ function getPanelModule({ commandsManager, extensionManager, servicesManager, co <> { - const { t } = useTranslation('SegmentationTable'); + const { t } = useTranslation('SegmentationPanel'); return ( diff --git a/extensions/cornerstone/src/components/MeasurementsMenu.tsx b/extensions/cornerstone/src/components/MeasurementsMenu.tsx index 6266e4721..34cdbcb33 100644 --- a/extensions/cornerstone/src/components/MeasurementsMenu.tsx +++ b/extensions/cornerstone/src/components/MeasurementsMenu.tsx @@ -8,9 +8,11 @@ import { DropdownMenuItem, Icons, } from '@ohif/ui-next'; +import { useTranslation } from 'react-i18next'; export function MeasumentsMenu(props) { const { group, classNames } = props; + const { t } = useTranslation('MeasurementTable'); if (!group.items?.length) { console.log('No items to iterate', group.items); return null; @@ -44,7 +46,7 @@ export function MeasumentsMenu(props) { className={`h-6 w-6 transition-opacity ${ isSelected || !isVisible ? 'opacity-100' : 'opacity-50 group-hover:opacity-100' }`} - aria-label={isVisible ? 'Hide' : 'Show'} + aria-label={isVisible ? t('Hide') : t('Show')} onClick={e => { e.stopPropagation(); onAction(e, ['jumpToMeasurement', 'toggleVisibilityMeasurement']); @@ -70,7 +72,7 @@ export function MeasumentsMenu(props) { onAction(e, 'removeMeasurement')}> - Delete + {t('Delete')} diff --git a/extensions/cornerstone/src/components/SegmentationToolConfig.tsx b/extensions/cornerstone/src/components/SegmentationToolConfig.tsx index 626d0c013..7b49b9885 100644 --- a/extensions/cornerstone/src/components/SegmentationToolConfig.tsx +++ b/extensions/cornerstone/src/components/SegmentationToolConfig.tsx @@ -1,9 +1,11 @@ import React, { useState } from 'react'; import { Switch } from '@ohif/ui-next'; import { useSystem } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; export default function SegmentationToolConfig() { const { commandsManager } = useSystem(); + const { t } = useTranslation('SegmentationPanel'); // Get initial states based on current configuration const [previewEdits, setPreviewEdits] = useState(false); @@ -38,7 +40,7 @@ export default function SegmentationToolConfig() { checked={previewEdits} onCheckedChange={handlePreviewEditsChange} /> - Preview edits before creating + {t('Preview edits before creating')}
@@ -46,7 +48,7 @@ export default function SegmentationToolConfig() { checked={useCenterAsSegmentIndex} onCheckedChange={handleUseCenterAsSegmentIndexChange} /> - Use center as segment index + {t('Use center as segment index')}
@@ -54,7 +56,7 @@ export default function SegmentationToolConfig() { checked={toggleSegmentEnabled} onCheckedChange={handleToggleSegmentEnabledChange} /> - Hover on segment border to activate + {t('Hover on segment border to activate')}
@@ -62,7 +64,7 @@ export default function SegmentationToolConfig() { checked={segmentLabelEnabled} onCheckedChange={handleSegmentLabelEnabledChange} /> - Show segment name on hover + {t('Show segment name on hover')}
); diff --git a/extensions/cornerstone/src/components/StudyMeasurementsActions.tsx b/extensions/cornerstone/src/components/StudyMeasurementsActions.tsx index c3cdcbdda..ca6a5ec1e 100644 --- a/extensions/cornerstone/src/components/StudyMeasurementsActions.tsx +++ b/extensions/cornerstone/src/components/StudyMeasurementsActions.tsx @@ -1,9 +1,11 @@ import React from 'react'; import { Button, Icons } from '@ohif/ui-next'; import { useSystem } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; export function StudyMeasurementsActions({ items, StudyInstanceUID, measurementFilter, actions }) { const { commandsManager } = useSystem(); + const { t } = useTranslation('MeasurementTable'); const disabled = !items?.length; if (disabled) { @@ -45,7 +47,7 @@ export function StudyMeasurementsActions({ items, StudyInstanceUID, measurementF }} > - Create SR + {t('Create SR')} diff --git a/extensions/cornerstone/src/components/ViewportDataOverlaySettingMenu/ViewportDataOverlayMenu.tsx b/extensions/cornerstone/src/components/ViewportDataOverlaySettingMenu/ViewportDataOverlayMenu.tsx index b843bbc7a..0d58e705c 100644 --- a/extensions/cornerstone/src/components/ViewportDataOverlaySettingMenu/ViewportDataOverlayMenu.tsx +++ b/extensions/cornerstone/src/components/ViewportDataOverlaySettingMenu/ViewportDataOverlayMenu.tsx @@ -14,6 +14,7 @@ import { Switch, } from '@ohif/ui-next'; import { useSystem } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; import { useViewportDisplaySets } from '../../hooks/useViewportDisplaySets'; import SelectItemWithModality from '../SelectItemWithModality'; @@ -21,6 +22,7 @@ import { useViewportRendering } from '../../hooks'; function ViewportDataOverlayMenu({ viewportId }: withAppTypes<{ viewportId: string }>) { const { commandsManager, servicesManager } = useSystem(); + const { t } = useTranslation(); const [pendingForegrounds, setPendingForegrounds] = useState([]); const [pendingSegmentations, setPendingSegmentations] = useState([]); const { toggleColorbar } = useViewportRendering(viewportId); @@ -230,7 +232,7 @@ function ViewportDataOverlayMenu({ viewportId }: withAppTypes<{ viewportId: stri disabled={potentialForegroundDisplaySets.length === 0} > - Foreground + {t('Common:Foreground')} @@ -320,7 +322,7 @@ function ViewportDataOverlayMenu({ viewportId }: withAppTypes<{ viewportId: stri onValueChange={value => handlePendingSegmentationSelection(pendingId, value)} > - + {potentialOverlayDisplaySets.map(item => ( @@ -428,7 +430,7 @@ function ViewportDataOverlayMenu({ viewportId }: withAppTypes<{ viewportId: stri onValueChange={value => handlePendingForegroundSelection(pendingId, value)} > - + {potentialForegroundDisplaySets.map(item => ( diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/Colormap.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/Colormap.tsx index 3d08a2fe4..aacf0f3c4 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/Colormap.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/Colormap.tsx @@ -98,7 +98,7 @@ export function Colormap({ viewportId }: { viewportId?: string } = {}): ReactEle {colormaps.map((colormap, index) => ( { setCurrentColormap(colormap); diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeLighting.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeLighting.tsx index 5883a5f98..ff1f1e927 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeLighting.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeLighting.tsx @@ -2,6 +2,7 @@ import React, { ReactElement, useState, useEffect, useCallback } from 'react'; import { VolumeLightingProps } from '../../types/ViewportPresets'; import { Numeric } from '@ohif/ui-next'; import { useSystem } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; export function VolumeLighting({ viewportId, hasShade }: VolumeLightingProps): ReactElement { const { servicesManager, commandsManager } = useSystem(); @@ -11,6 +12,7 @@ export function VolumeLighting({ viewportId, hasShade }: VolumeLightingProps): R diffuse: null, specular: null, }); + const { t } = useTranslation('WindowLevelActionMenu'); // Single callback to handle all lighting property changes const onLightingChange = useCallback( @@ -45,9 +47,9 @@ export function VolumeLighting({ viewportId, hasShade }: VolumeLightingProps): R // Configuration for our lighting properties const lightingProperties = [ - { key: 'ambient', label: 'Ambient' }, - { key: 'diffuse', label: 'Diffuse' }, - { key: 'specular', label: 'Specular' }, + { key: 'ambient', label: t('Ambient') }, + { key: 'diffuse', label: t('Diffuse') }, + { key: 'specular', label: t('Specular') }, ]; return ( diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingOptions.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingOptions.tsx index 34e877ca9..9fd35ee69 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingOptions.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingOptions.tsx @@ -5,10 +5,13 @@ import { VolumeShift } from './VolumeShift'; import { VolumeLighting } from './VolumeLighting'; import { VolumeShade } from './VolumeShade'; import { useViewportRendering } from '../../hooks/useViewportRendering'; +import { useTranslation } from 'react-i18next'; export function VolumeRenderingOptions({ viewportId }: { viewportId?: string } = {}): ReactElement { const { volumeRenderingQualityRange } = useViewportRendering(viewportId); const [hasShade, setShade] = useState(false); + const { t } = useTranslation('WindowLevelActionMenu'); + return (
-
Lighting
+
{t('Lighting')}
diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresets.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresets.tsx index 52eeacc6c..4276e8fc6 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresets.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresets.tsx @@ -4,17 +4,19 @@ import React, { ReactElement } from 'react'; import { VolumeRenderingPresetsContent } from './VolumeRenderingPresetsContent'; import { useSystem } from '@ohif/core'; import { useViewportRendering } from '../../hooks/useViewportRendering'; +import { useTranslation } from 'react-i18next'; export function VolumeRenderingPresets({ viewportId }: { viewportId?: string } = {}): ReactElement { const { volumeRenderingPresets } = useViewportRendering(viewportId); const { servicesManager } = useSystem(); const { uiDialogService } = servicesManager.services; + const { t } = useTranslation('WindowLevelActionMenu'); const onClickPresets = () => { uiDialogService.show({ id: 'volume-rendering-presets', content: VolumeRenderingPresetsContent, - title: 'Rendering Presets', + title: t('Rendering Presets'), isDraggable: true, contentProps: { presets: volumeRenderingPresets, @@ -25,7 +27,7 @@ export function VolumeRenderingPresets({ viewportId }: { viewportId?: string } = return ( } rightIcon={} onClick={onClickPresets} diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresetsContent.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresetsContent.tsx index 1d048bba4..6a7ac0f86 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresetsContent.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresetsContent.tsx @@ -3,6 +3,7 @@ import React, { ReactElement, useState, useCallback } from 'react'; import { PresetDialog } from '@ohif/ui-next'; import { ViewportPreset, VolumeRenderingPresetsContentProps } from '../../types/ViewportPresets'; import { useSystem } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; interface Props extends VolumeRenderingPresetsContentProps { hide: () => void; @@ -12,6 +13,7 @@ export function VolumeRenderingPresetsContent({ presets, viewportId, hide }: Pro const { commandsManager } = useSystem(); const [searchValue, setSearchValue] = useState(''); const [selectedPreset, setSelectedPreset] = useState(null); + const { t } = useTranslation('WindowLevelActionMenu'); const handleSearchChange = useCallback((event: React.ChangeEvent) => { setSearchValue(event.target.value); @@ -41,7 +43,7 @@ export function VolumeRenderingPresetsContent({ presets, viewportId, hide }: Pro @@ -71,7 +73,7 @@ export function VolumeRenderingPresetsContent({ presets, viewportId, hide }: Pro - Cancel + {t('Common:Cancel')} diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingQuality.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingQuality.tsx index 1536eafed..fe00a35c1 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingQuality.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingQuality.tsx @@ -2,6 +2,7 @@ import React, { ReactElement, useCallback, useState, useEffect } from 'react'; import { VolumeRenderingQualityProps } from '../../types/ViewportPresets'; import { Numeric } from '@ohif/ui-next'; import { useSystem } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; export function VolumeRenderingQuality({ volumeRenderingQualityRange, @@ -11,6 +12,7 @@ export function VolumeRenderingQuality({ const { cornerstoneViewportService } = servicesManager.services; const { min, max, step } = volumeRenderingQualityRange; const [quality, setQuality] = useState(null); + const { t } = useTranslation('WindowLevelActionMenu'); const onChange = useCallback( (value: number) => { @@ -51,7 +53,7 @@ export function VolumeRenderingQuality({ onChange={onChange} >
- Quality + {t('Quality')}
diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeShade.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeShade.tsx index c374956b7..e9e5d5f69 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeShade.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeShade.tsx @@ -2,11 +2,13 @@ import React, { ReactElement, useCallback, useEffect, useState } from 'react'; import { Switch } from '@ohif/ui-next'; import { VolumeShadeProps } from '../../types/ViewportPresets'; import { useSystem } from '@ohif/core'; +import { useTranslation } from 'react-i18next'; export function VolumeShade({ viewportId, onClickShade = bool => {}, }: VolumeShadeProps): ReactElement { + const { t } = useTranslation('WindowLevelActionMenu'); const { servicesManager, commandsManager } = useSystem(); const { cornerstoneViewportService } = servicesManager.services; const [shade, setShade] = useState(true); @@ -29,7 +31,7 @@ export function VolumeShade({ return ( <> - Shade + {t('Shade')} { if (isBlocking) { @@ -65,7 +67,7 @@ export function VolumeShift({ viewportId }: VolumeShiftProps): ReactElement { onMouseUp={() => setIsBlocking(false)} >
- Shift + {t('Shift')}
diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevel.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevel.tsx index d9ded5ca4..623cdaedc 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevel.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevel.tsx @@ -2,8 +2,10 @@ import React, { ReactElement, useEffect, useRef, useState } from 'react'; import { AllInOneMenu, ScrollArea, Switch, Tabs, TabsList, TabsTrigger } from '@ohif/ui-next'; import { useViewportRendering } from '../../hooks/useViewportRendering'; import { WindowLevelPreset } from '../../types/WindowLevel'; +import { useTranslation } from 'react-i18next'; export function WindowLevel({ viewportId }: { viewportId?: string } = {}): ReactElement { + const { t } = useTranslation('WindowLevelActionMenu'); const { viewportDisplaySets } = useViewportRendering(viewportId); const [activeDisplaySetUID, setActiveDisplaySetUID] = useState( viewportDisplaySets?.[0]?.displaySetInstanceUID @@ -68,7 +70,7 @@ export function WindowLevel({ viewportId }: { viewportId?: string } = {}): React className="hover:bg-accent flex h-8 w-full flex-shrink-0 cursor-pointer items-center px-2 text-base hover:rounded" onClick={() => setShowPreview(!showPreview)} > - Preview in viewport + {t('Preview in viewport')} ( { diff --git a/extensions/cornerstone/src/customizations/CustomDropdownMenuContent.tsx b/extensions/cornerstone/src/customizations/CustomDropdownMenuContent.tsx index 0fba8c35f..99e876cb5 100644 --- a/extensions/cornerstone/src/customizations/CustomDropdownMenuContent.tsx +++ b/extensions/cornerstone/src/customizations/CustomDropdownMenuContent.tsx @@ -17,7 +17,7 @@ import { ExportSegmentationSubMenuItem } from '../components/ExportSegmentationS */ export const CustomDropdownMenuContent = () => { const { commandsManager } = useSystem(); - const { t } = useTranslation('SegmentationTable'); + const { t } = useTranslation('SegmentationPanel'); const { onSegmentationAdd, onSegmentationRemoveFromViewport, diff --git a/extensions/cornerstone/src/customizations/CustomSegmentStatisticsHeader.tsx b/extensions/cornerstone/src/customizations/CustomSegmentStatisticsHeader.tsx index 9c089e26d..91599b115 100644 --- a/extensions/cornerstone/src/customizations/CustomSegmentStatisticsHeader.tsx +++ b/extensions/cornerstone/src/customizations/CustomSegmentStatisticsHeader.tsx @@ -19,7 +19,7 @@ export const CustomSegmentStatisticsHeader = ({ }: CustomSegmentStatisticsHeaderProps) => { const { servicesManager, commandsManager } = useSystem(); const { segmentationService } = servicesManager.services; - const { t } = useTranslation('SegmentationTable'); + const { t } = useTranslation('SegmentationPanel'); const segmentation = segmentationService.getSegmentation(segmentationId); const segment = segmentation.segments[segmentIndex]; diff --git a/extensions/cornerstone/src/customizations/captureViewportModalCustomization.tsx b/extensions/cornerstone/src/customizations/captureViewportModalCustomization.tsx index 6cd9cd53e..c9e08a4bb 100644 --- a/extensions/cornerstone/src/customizations/captureViewportModalCustomization.tsx +++ b/extensions/cornerstone/src/customizations/captureViewportModalCustomization.tsx @@ -95,6 +95,10 @@ function ViewportDownloadFormNew({ { onDimensionsChange({ ...dimensions, @@ -110,7 +114,7 @@ function ViewportDownloadFormNew({ maxWidth={MAX_TEXTURE_SIZE.toString()} maxHeight={MAX_TEXTURE_SIZE.toString()} > - {t('Image size')} px + {t('Image size in pixels')} { - const { t } = useTranslation('SegmentationTable'); + const { t } = useTranslation('SegmentationPanel'); const tKey = `${props.segmentationRepresentationType ?? 'Segmentation'} tools`; const tValue = t(tKey); @@ -99,7 +99,7 @@ const getPanelModule = ({ commandsManager, servicesManager, extensionManager }: name: 'panelSegmentationWithToolsLabelMap', iconName: 'tab-segmentation', iconLabel: 'Segmentation', - label: i18n.t('SegmentationTable:Labelmap'), + label: i18n.t('SegmentationPanel:Labelmap'), component: props => wrappedPanelSegmentationWithTools({ ...props, @@ -110,7 +110,7 @@ const getPanelModule = ({ commandsManager, servicesManager, extensionManager }: name: 'panelSegmentationWithToolsContour', iconName: 'tab-contours', iconLabel: 'Segmentation', - label: i18n.t('SegmentationTable:Contour'), + label: i18n.t('SegmentationPanel:Contour'), component: props => wrappedPanelSegmentationWithTools({ ...props, diff --git a/extensions/cornerstone/src/getToolbarModule.tsx b/extensions/cornerstone/src/getToolbarModule.tsx index d435e45f7..229bb9ce2 100644 --- a/extensions/cornerstone/src/getToolbarModule.tsx +++ b/extensions/cornerstone/src/getToolbarModule.tsx @@ -1,4 +1,5 @@ import { Enums } from '@cornerstonejs/tools'; +import i18n from '@ohif/i18n'; import { utils } from '@ohif/ui-next'; import { ViewportDataOverlayMenuWrapper } from './components/ViewportDataOverlaySettingMenu/ViewportDataOverlayMenuWrapper'; import { ViewportOrientationMenuWrapper } from './components/ViewportOrientationMenu/ViewportOrientationMenuWrapper'; @@ -14,7 +15,7 @@ import AdvancedRenderingControls from './components/AdvancedRenderingControls'; const getDisabledState = (disabledText?: string) => ({ disabled: true, - disabledText: disabledText ?? 'Not available on the current viewport', + disabledText: disabledText ?? i18n.t('Buttons:Not available on the current viewport'), }); export default function getToolbarModule({ servicesManager, extensionManager }: withAppTypes) { @@ -396,7 +397,9 @@ export default function getToolbarModule({ servicesManager, extensionManager }: ); if (!hasAnySupportedModality) { - return getDisabledState(disabledText || 'Tool not available for this modality'); + return getDisabledState( + disabledText || i18n.t('Buttons:Tool not available for this modality') + ); } } }, diff --git a/extensions/cornerstone/src/hooks/useMeasurements.ts b/extensions/cornerstone/src/hooks/useMeasurements.ts index 0f9fc87a8..2d5d23c31 100644 --- a/extensions/cornerstone/src/hooks/useMeasurements.ts +++ b/extensions/cornerstone/src/hooks/useMeasurements.ts @@ -1,6 +1,7 @@ import { useState, useEffect } from 'react'; import debounce from 'lodash.debounce'; import { useSystem } from '@ohif/core'; +import i18n from '@ohif/i18n'; function mapMeasurementToDisplay(measurement, displaySetService) { const { referenceSeriesUID } = measurement; @@ -14,7 +15,8 @@ function mapMeasurementToDisplay(measurement, displaySetService) { const { findingSites, finding, label: baseLabel, displayText: baseDisplayText } = measurement; const firstSite = findingSites?.[0]; - const label = baseLabel || finding?.text || firstSite?.text || '(empty)'; + const label = + baseLabel || finding?.text || firstSite?.text || i18n.t('MeasurementTable:empty'); // Initialize displayText with the structure used in Length.ts and CobbAngle.ts const displayText = { diff --git a/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx b/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx index 19e6104a2..c10ff01d0 100644 --- a/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx +++ b/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx @@ -67,7 +67,12 @@ const CornerstoneViewportDownloadForm = ({ return () => { Object.keys(toolModeAndBindings).forEach(toolName => { const { mode, bindings } = toolModeAndBindings[toolName]; - toolGroup.setToolMode(toolName, mode, { bindings }); + try { + toolGroup.setToolMode(toolName, mode, { bindings }); + } catch (error) { + // Handle errors when restoring tool mode during cleanup (e.g., when tool state is undefined) + console.debug('Error restoring tool mode during cleanup:', toolName, error); + } }); }; }, []); diff --git a/extensions/default/src/customizations/aboutModalCustomization.tsx b/extensions/default/src/customizations/aboutModalCustomization.tsx index d17fc574e..93a00e2fb 100644 --- a/extensions/default/src/customizations/aboutModalCustomization.tsx +++ b/extensions/default/src/customizations/aboutModalCustomization.tsx @@ -1,8 +1,10 @@ import React from 'react'; import { AboutModal } from '@ohif/ui-next'; import detect from 'browser-detect'; +import { useTranslation } from 'react-i18next'; function AboutModalDefault() { + const { t } = useTranslation('AboutModal'); const { os, version, name } = detect(); const browser = `${name[0].toUpperCase()}${name.substr(1)} ${version}`; const versionNumber = process.env.VERSION_NUMBER; @@ -18,11 +20,11 @@ function AboutModalDefault() { { let attempts = 0; @@ -23,8 +25,8 @@ export default { steps: [ { id: 'scroll', - title: 'Scrolling Through Images', - text: 'You can scroll through the images using the mouse wheel or scrollbar.', + title: i18n.t('Onboarding:Scrolling Through Images'), + text: i18n.t('Onboarding:You can scroll through the images using the mouse wheel or scrollbar.'), attachTo: { element: '.viewport-element', on: 'top', @@ -37,8 +39,8 @@ export default { }, { id: 'zoom', - title: 'Zooming In and Out', - text: 'You can zoom the images using the right click.', + title: i18n.t('Onboarding:Zooming In and Out'), + text: i18n.t('Onboarding:You can zoom the images using the right click.'), attachTo: { element: '.viewport-element', on: 'left', @@ -51,8 +53,8 @@ export default { }, { id: 'pan', - title: 'Panning the Image', - text: 'You can pan the images using the middle click.', + title: i18n.t('Onboarding:Panning the Image'), + text: i18n.t('Onboarding:You can pan the images using the middle click.'), attachTo: { element: '.viewport-element', on: 'top', @@ -65,8 +67,8 @@ export default { }, { id: 'windowing', - title: 'Adjusting Window Level', - text: 'You can modify the window level using the left click.', + title: i18n.t('Onboarding:Adjusting Window Level'), + text: i18n.t('Onboarding:You can modify the window level using the left click.'), attachTo: { element: '.viewport-element', on: 'left', @@ -79,8 +81,8 @@ export default { }, { id: 'length', - title: 'Using the Measurement Tools', - text: 'You can measure the length of a region using the Length tool.', + title: i18n.t('Onboarding:Using the Measurement Tools'), + text: i18n.t('Onboarding:You can measure the length of a region using the Length tool.'), attachTo: { element: '[data-cy="MeasurementTools-split-button-primary"]', on: 'bottom', @@ -90,12 +92,12 @@ export default { event: 'click', }, beforeShowPromise: () => - waitForElement('[data-cy="MeasurementTools-split-button-primary]'), + waitForElement('[data-cy="MeasurementTools-split-button-primary"]'), }, { id: 'drawAnnotation', - title: 'Drawing Length Annotations', - text: 'Use the length tool on the viewport to measure the length of a region.', + title: i18n.t('Onboarding:Drawing Length Annotations'), + text: i18n.t('Onboarding:Use the length tool on the viewport to measure the length of a region.'), attachTo: { element: '.viewport-element', on: 'right', @@ -108,8 +110,8 @@ export default { }, { id: 'trackMeasurement', - title: 'Tracking Measurements in the Panel', - text: 'Click yes to track the measurements in the measurement panel.', + title: i18n.t('Onboarding:Tracking Measurements in the Panel'), + text: i18n.t('Onboarding:Click yes to track the measurements in the measurement panel.'), attachTo: { element: '[data-cy="prompt-begin-tracking-yes-btn"]', on: 'bottom', @@ -122,8 +124,8 @@ export default { }, { id: 'openMeasurementPanel', - title: 'Opening the Measurements Panel', - text: 'Click the measurements button to open the measurements panel.', + title: i18n.t('Onboarding:Opening the Measurements Panel'), + text: i18n.t('Onboarding:Click the measurements button to open the measurements panel.'), attachTo: { element: '#trackedMeasurements-btn', on: 'left-start', @@ -136,8 +138,8 @@ export default { }, { id: 'scrollAwayFromMeasurement', - title: 'Scrolling Away from a Measurement', - text: 'Scroll the images using the mouse wheel away from the measurement.', + title: i18n.t('Onboarding:Scrolling Away from a Measurement'), + text: i18n.t('Onboarding:Scroll the images using the mouse wheel away from the measurement.'), attachTo: { element: '.viewport-element', on: 'left', @@ -150,8 +152,8 @@ export default { }, { id: 'jumpToMeasurement', - title: 'Jumping to Measurements in the Panel', - text: 'Click the measurement in the measurement panel to jump to it.', + title: i18n.t('Onboarding:Jumping to Measurements in the Panel'), + text: i18n.t('Onboarding:Click the measurement in the measurement panel to jump to it.'), attachTo: { element: '[data-cy="data-row"]', on: 'left-start', @@ -164,8 +166,8 @@ export default { }, { id: 'changeLayout', - title: 'Changing Layout', - text: 'You can change the layout of the viewer using the layout button.', + title: i18n.t('Onboarding:Changing Layout'), + text: i18n.t('Onboarding:You can change the layout of the viewer using the layout button.'), attachTo: { element: '[data-cy="Layout"]', on: 'bottom', @@ -178,8 +180,8 @@ export default { }, { id: 'selectLayout', - title: 'Selecting the MPR Layout', - text: 'Select the MPR layout to view the images in MPR mode.', + title: i18n.t('Onboarding:Selecting the MPR Layout'), + text: i18n.t('Onboarding:Select the MPR layout to view the images in MPR mode.'), attachTo: { element: '[data-cy="MPR"]', on: 'left-start', @@ -196,7 +198,7 @@ export default { defaultStepOptions: { buttons: [ { - text: 'Skip all', + text: i18n.t('Onboarding:Skip all'), action() { this.complete(); }, diff --git a/extensions/default/src/customizations/userPreferencesCustomization.tsx b/extensions/default/src/customizations/userPreferencesCustomization.tsx index f6adda45e..038a40004 100644 --- a/extensions/default/src/customizations/userPreferencesCustomization.tsx +++ b/extensions/default/src/customizations/userPreferencesCustomization.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useMemo, useState, useEffect } from 'react'; import { useSystem, hotkeys as hotkeysModule } from '@ohif/core'; import { UserPreferencesModal, FooterAction } from '@ohif/ui-next'; import { useTranslation } from 'react-i18next'; @@ -19,14 +19,40 @@ interface HotkeyDefinitions { function UserPreferencesModalDefault({ hide }: { hide: () => void }) { const { hotkeysManager } = useSystem(); - const { t } = useTranslation('UserPreferencesModal'); + const { t, i18n: i18nextInstance } = useTranslation('UserPreferencesModal'); const { hotkeyDefinitions = {}, hotkeyDefaults = {} } = hotkeysManager; + const fallbackHotkeyDefinitions = useMemo( + () => + hotkeysManager.getValidHotkeyDefinitions( + hotkeysModule.defaults.hotkeyBindings + ) as HotkeyDefinitions, + [hotkeysManager] + ); + + useEffect(() => { + if (!Object.keys(hotkeyDefaults).length) { + hotkeysManager.setDefaultHotKeys(hotkeysModule.defaults.hotkeyBindings); + } + + if (!Object.keys(hotkeyDefinitions).length) { + hotkeysManager.setHotkeys(fallbackHotkeyDefinitions); + } + }, [hotkeysManager, hotkeyDefaults, hotkeyDefinitions, fallbackHotkeyDefinitions]); + + const resolvedHotkeyDefaults = Object.keys(hotkeyDefaults).length + ? (hotkeyDefaults as HotkeyDefinitions) + : fallbackHotkeyDefinitions; + + const initialHotkeyDefinitions = Object.keys(hotkeyDefinitions).length + ? (hotkeyDefinitions as HotkeyDefinitions) + : resolvedHotkeyDefaults; + const currentLanguage = currentLanguageFn(); const [state, setState] = useState({ - hotkeyDefinitions: hotkeyDefinitions as HotkeyDefinitions, + hotkeyDefinitions: initialHotkeyDefinitions, languageValue: currentLanguage.value, }); @@ -51,12 +77,52 @@ function UserPreferencesModalDefault({ hide }: { hide: () => void }) { setState(state => ({ ...state, languageValue: defaultLanguage.value, - hotkeyDefinitions: hotkeyDefaults as HotkeyDefinitions, + hotkeyDefinitions: resolvedHotkeyDefaults, })); hotkeysManager.restoreDefaultBindings(); }; + const displayNames = React.useMemo(() => { + if (typeof Intl === 'undefined' || typeof Intl.DisplayNames !== 'function') { + return null; + } + + const locales = [state.languageValue, currentLanguage.value, i18nextInstance.language, 'en']; + const uniqueLocales = Array.from(new Set(locales.filter(Boolean))); + + try { + return new Intl.DisplayNames(uniqueLocales, { type: 'language', fallback: 'none' }); + } catch (error) { + console.warn('Intl.DisplayNames not supported for locales', uniqueLocales, error); + } + + return null; + }, [state.languageValue, currentLanguage.value, i18nextInstance.language]); + + const getLanguageLabel = React.useCallback( + (languageValue: string, fallbackLabel: string) => { + const translationKey = `LanguageName.${languageValue}`; + if (i18nextInstance.exists(translationKey, { ns: 'UserPreferencesModal' })) { + return t(translationKey); + } + + if (displayNames) { + try { + const localized = displayNames.of(languageValue); + if (localized && localized.toLowerCase() !== languageValue.toLowerCase()) { + return localized.charAt(0).toUpperCase() + localized.slice(1); + } + } catch (error) { + console.debug(`Unable to resolve display name for ${languageValue}`, error); + } + } + + return fallbackLabel; + }, + [displayNames, i18nextInstance, t] + ); + return ( @@ -79,7 +145,7 @@ function UserPreferencesModalDefault({ hide }: { hide: () => void }) { key={lang.value} value={lang.value} > - {lang.label} + {getLanguageLabel(lang.value, lang.label)} ))} @@ -120,6 +186,9 @@ function UserPreferencesModalDefault({ hide }: { hide: () => void }) { onClick={() => { if (state.languageValue !== currentLanguage.value) { i18n.changeLanguage(state.languageValue); + // Force page reload after language change to ensure all translations are applied + window.location.reload(); + return; // Exit early since we're reloading } hotkeysManager.setHotkeys(state.hotkeyDefinitions); hotkeysModule.stopRecord(); diff --git a/extensions/default/src/hangingprotocols/hpCompare.ts b/extensions/default/src/hangingprotocols/hpCompare.ts index 14cb51d93..55b8be6eb 100644 --- a/extensions/default/src/hangingprotocols/hpCompare.ts +++ b/extensions/default/src/hangingprotocols/hpCompare.ts @@ -1,4 +1,5 @@ import { Types } from '@ohif/core'; +import i18n from 'i18next'; const defaultDisplaySetSelector = { studyMatchingRules: [ @@ -113,8 +114,8 @@ const priorViewport1 = { */ const hpMNCompare: Types.HangingProtocol.Protocol = { id: '@ohif/hpCompare', - description: 'Compare two studies in various layouts', - name: 'Compare Two Studies', + description: i18n.t('Hps:Compare two studies in various layouts'), + name: i18n.t('Hps:Compare Two Studies'), numberOfPriorsReferenced: 1, protocolMatchingRules: [ { diff --git a/extensions/default/src/hangingprotocols/hpMammo.ts b/extensions/default/src/hangingprotocols/hpMammo.ts index 4a97b04aa..8be1196ef 100644 --- a/extensions/default/src/hangingprotocols/hpMammo.ts +++ b/extensions/default/src/hangingprotocols/hpMammo.ts @@ -8,6 +8,7 @@ import { RMLOPrior, LMLOPrior, } from './utils/mammoDisplaySetSelector'; +import i18n from 'i18next'; const rightDisplayArea = { storeAsInitialCamera: true, @@ -30,7 +31,7 @@ const leftDisplayArea = { const hpMammography = { id: '@ohif/hpMammo', hasUpdatedPriorsInformation: false, - name: 'Mammography Breast Screening', + name: i18n.t('Hps:Mammography Breast Screening'), protocolMatchingRules: [ { id: 'Mammography', diff --git a/extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx b/extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx index 7b8175b09..80058c101 100644 --- a/extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx +++ b/extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx @@ -3,7 +3,8 @@ import classnames from 'classnames'; import listComponentGenerator from './listComponentGenerator'; import './ViewportOverlay.css'; -import { formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils'; +import { formatDICOMDate } from '@ohif/ui-next'; +import { formatDICOMTime, formatNumberPrecision } from './utils'; import { utils } from '@ohif/core'; const { formatPN } = utils; diff --git a/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts b/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts index d47dd14c1..795ff0f64 100644 --- a/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts +++ b/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts @@ -1,5 +1,7 @@ import moment from 'moment'; +import i18n from 'i18next'; import * as cornerstone from '@cornerstonejs/core'; +import { formatDICOMDate } from '@ohif/ui-next'; /** * Checks if value is valid. @@ -24,17 +26,6 @@ export function formatNumberPrecision(number, precision) { } } -/** - * Formats DICOM date. - * - * @param {string} date - * @param {string} strFormat - * @returns {string} formatted date. - */ -export function formatDICOMDate(date, strFormat = 'MMM D, YYYY') { - return moment(date, 'YYYYMMDD').format(strFormat); -} - /** * DICOM Time is stored as HHmmss.SSS, where: * HH 24 hour time: @@ -71,3 +62,5 @@ export function getCompression(imageId) { return 'Lossless / Uncompressed'; } + +export { formatDICOMDate }; diff --git a/extensions/dicom-microscopy/src/helpers/formatDICOMDate.js b/extensions/dicom-microscopy/src/helpers/formatDICOMDate.js index c048df472..b136ae0d8 100644 --- a/extensions/dicom-microscopy/src/helpers/formatDICOMDate.js +++ b/extensions/dicom-microscopy/src/helpers/formatDICOMDate.js @@ -1,11 +1,11 @@ -import moment from 'moment'; - /** * Formats DICOM date. + * Re-exported from @ohif/ui-next for backward compatibility. * * @param {string} date * @param {string} strFormat */ -export default function formatDICOMDate(date, strFormat = 'MMM D, YYYY') { - return moment(date, 'YYYYMMDD').format(strFormat); -} +import { formatDICOMDate } from '@ohif/ui-next'; + +export { formatDICOMDate }; +export default formatDICOMDate; diff --git a/extensions/dicom-microscopy/src/helpers/index.js b/extensions/dicom-microscopy/src/helpers/index.js index 59468982c..73f15ee8d 100644 --- a/extensions/dicom-microscopy/src/helpers/index.js +++ b/extensions/dicom-microscopy/src/helpers/index.js @@ -1,5 +1,5 @@ import formatDICOMPatientName from './formatDICOMPatientName'; -import formatDICOMDate from './formatDICOMDate'; +import { formatDICOMDate } from '@ohif/ui-next'; import formatDICOMTime from './formatDICOMTime'; import formatNumberPrecision from './formatNumberPrecision'; import isValidNumber from './isValidNumber'; diff --git a/extensions/dicom-microscopy/src/utils/RoiAnnotation.js b/extensions/dicom-microscopy/src/utils/RoiAnnotation.js index 550a79100..2c8f8e930 100644 --- a/extensions/dicom-microscopy/src/utils/RoiAnnotation.js +++ b/extensions/dicom-microscopy/src/utils/RoiAnnotation.js @@ -1,6 +1,7 @@ import areaOfPolygon from './areaOfPolygon'; import { PubSubService } from '@ohif/core'; +import i18n from '@ohif/i18n'; const EVENTS = { LABEL_UPDATED: 'labelUpdated', @@ -168,7 +169,8 @@ class RoiAnnotation extends PubSubService { * @returns {String} Text with geometry type and label */ getDetailedLabel() { - const label = this.label ? `${this.label}` : '(empty)'; + const translatedEmpty = i18n?.t('MeasurementTable:empty') || '(empty)'; + const label = this.label ? `${this.label}` : translatedEmpty; return label; } diff --git a/extensions/tmtv/src/Panels/PanelPetSUV.tsx b/extensions/tmtv/src/Panels/PanelPetSUV.tsx index f74941f3e..7b0a1ca17 100644 --- a/extensions/tmtv/src/Panels/PanelPetSUV.tsx +++ b/extensions/tmtv/src/Panels/PanelPetSUV.tsx @@ -253,10 +253,10 @@ export default function PanelPetSUV() {
diff --git a/extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/ROIThresholdConfiguration.tsx b/extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/ROIThresholdConfiguration.tsx index 31ae76b39..98c4beca3 100644 --- a/extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/ROIThresholdConfiguration.tsx +++ b/extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/ROIThresholdConfiguration.tsx @@ -14,14 +14,14 @@ import { useTranslation } from 'react-i18next'; export const ROI_STAT = 'roi_stat'; const RANGE = 'range'; -const options = [ - { value: ROI_STAT, label: 'Max', placeHolder: 'Max' }, - { value: RANGE, label: 'Range', placeHolder: 'Range' }, -]; - function ROIThresholdConfiguration({ config, dispatch, runCommand }) { const { t } = useTranslation('ROIThresholdConfiguration'); + const options = [ + { value: ROI_STAT, label: t('Max'), placeHolder: t('Max') }, + { value: RANGE, label: t('Range'), placeHolder: t('Range') }, + ]; + const handlePercentageOfMaxSUVChange = (e: React.ChangeEvent) => { let value = e.target.value; @@ -101,7 +101,7 @@ function ROIThresholdConfiguration({ config, dispatch, runCommand }) {
{/* Header */} - + {/* CT Row */}
diff --git a/extensions/tmtv/src/Panels/RectangleROIOptions.tsx b/extensions/tmtv/src/Panels/RectangleROIOptions.tsx index 390ddf0db..d79800dc2 100644 --- a/extensions/tmtv/src/Panels/RectangleROIOptions.tsx +++ b/extensions/tmtv/src/Panels/RectangleROIOptions.tsx @@ -6,6 +6,7 @@ import ROIThresholdConfiguration, { import * as cs3dTools from '@cornerstonejs/tools'; import { useSystem } from '@ohif/core'; import { useSegmentations } from '@ohif/extension-cornerstone'; +import { useTranslation } from 'react-i18next'; const LOWER_CT_THRESHOLD_DEFAULT = -1024; const UPPER_CT_THRESHOLD_DEFAULT = 1024; @@ -46,6 +47,7 @@ function RectangleROIOptions() { const { commandsManager } = useSystem(); const segmentations = useSegmentations(); const activeSegmentation = segmentations[0]; + const { t } = useTranslation('ROIThresholdConfiguration'); const runCommand = useCallback( (commandName, commandOptions = {}) => { @@ -92,7 +94,7 @@ function RectangleROIOptions() { className="my-3 mr-auto w-20" onClick={handleROIThresholding} > - Run + {t('Run')} )}
diff --git a/extensions/tmtv/src/getPanelModule.tsx b/extensions/tmtv/src/getPanelModule.tsx index ec76c495e..e26e1940b 100644 --- a/extensions/tmtv/src/getPanelModule.tsx +++ b/extensions/tmtv/src/getPanelModule.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { PanelPetSUV, PanelROIThresholdExport } from './Panels'; import { Toolbox } from '@ohif/extension-default'; import PanelTMTV from './Panels/PanelTMTV'; +import i18n from '@ohif/i18n'; function getPanelModule({ commandsManager, extensionManager, servicesManager }) { const { toolbarService } = servicesManager.services; @@ -14,7 +15,7 @@ function getPanelModule({ commandsManager, extensionManager, servicesManager }) return ( ); }; @@ -28,7 +29,7 @@ function getPanelModule({ commandsManager, extensionManager, servicesManager }) <> setDepthGuideCommand(!depthGuide)} > - Depth guide toggle + {t('Depth guide toggle')}
@@ -198,7 +200,7 @@ export default function USAnnotationPanel() { className="cursor-pointer" onClick={() => setShowPleuraPercentageCommand(!showPleuraPct)} > - Show pleura percentage + {t('Show pleura percentage')}
@@ -208,7 +210,7 @@ export default function USAnnotationPanel() { const renderSectorAnnotations = () => (
- +
- Pleura line + {t('Pleura line')} - B-line + {t('B-line')} @@ -239,7 +241,7 @@ export default function USAnnotationPanel() { } > - B-line annotation + {t('B-line annotation')} @@ -247,7 +249,7 @@ export default function USAnnotationPanel() { } > - Pleura annotation + {t('Pleura annotation')} @@ -261,7 +263,7 @@ export default function USAnnotationPanel() { className="data-[state=checked]:bg-blue-500" />
@@ -286,7 +288,7 @@ export default function USAnnotationPanel() { */}
diff --git a/modes/basic/src/toolbarButtons.ts b/modes/basic/src/toolbarButtons.ts index f58118bd1..005674e58 100644 --- a/modes/basic/src/toolbarButtons.ts +++ b/modes/basic/src/toolbarButtons.ts @@ -611,7 +611,7 @@ const toolbarButtons: Button[] = [ commands: setToolActiveToolbar, evaluate: { name: 'evaluate.cornerstoneTool', - disabledText: 'Select a 3D viewport to enable this tool', + disabledText: i18n.t('Buttons:Select a 3D viewport to enable this tool'), }, }, }, @@ -655,7 +655,7 @@ const toolbarButtons: Button[] = [ }, evaluate: { name: 'evaluate.cornerstoneTool', - disabledText: 'Select an MPR viewport to enable this tool', + disabledText: i18n.t('Buttons:Select an MPR viewport to enable this tool'), }, }, }, diff --git a/modes/preclinical-4d/src/toolbarButtons.tsx b/modes/preclinical-4d/src/toolbarButtons.tsx index 5d0d7a425..f2d06940a 100644 --- a/modes/preclinical-4d/src/toolbarButtons.tsx +++ b/modes/preclinical-4d/src/toolbarButtons.tsx @@ -265,13 +265,13 @@ const toolbarButtons = [ }, }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'brush-mode', value: 'CircularBrush', values: [ - { value: 'CircularBrush', label: 'Circle' }, - { value: 'SphereBrush', label: 'Sphere' }, + { value: 'CircularBrush', label: i18n.t('Buttons:Circle') }, + { value: 'SphereBrush', label: i18n.t('Buttons:Sphere') }, ], commands: 'setToolActiveToolbar', }, @@ -290,7 +290,7 @@ const toolbarButtons = [ }, options: [ { - name: 'Radius (mm)', + name: i18n.t('Buttons:Radius (mm)'), id: 'eraser-radius', type: 'range', min: 0.5, @@ -303,13 +303,13 @@ const toolbarButtons = [ }, }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'eraser-mode', value: 'CircularEraser', values: [ - { value: 'CircularEraser', label: 'Circle' }, - { value: 'SphereEraser', label: 'Sphere' }, + { value: 'CircularEraser', label: i18n.t('Buttons:Circle') }, + { value: 'SphereEraser', label: i18n.t('Buttons:Sphere') }, ], commands: 'setToolActiveToolbar', }, @@ -328,7 +328,7 @@ const toolbarButtons = [ }, options: [ { - name: 'Radius (mm)', + name: i18n.t('Buttons:Radius (mm)'), id: 'threshold-radius', type: 'range', min: 0.5, @@ -343,13 +343,13 @@ const toolbarButtons = [ }, }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'eraser-mode', value: 'ThresholdCircularBrush', values: [ - { value: 'ThresholdCircularBrush', label: 'Circle' }, - { value: 'ThresholdSphereBrush', label: 'Sphere' }, + { value: 'ThresholdCircularBrush', label: i18n.t('Buttons:Circle') }, + { value: 'ThresholdSphereBrush', label: i18n.t('Buttons:Sphere') }, ], commands: 'setToolActiveToolbar', }, @@ -383,14 +383,14 @@ const toolbarButtons = [ icon: 'icon-tool-shape', options: [ { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', value: 'CircleScissor', id: 'shape-mode', values: [ - { value: 'CircleScissor', label: 'Circle' }, - { value: 'SphereScissor', label: 'Sphere' }, - { value: 'RectangleScissor', label: 'Rectangle' }, + { value: 'CircleScissor', label: i18n.t('Buttons:Circle') }, + { value: 'SphereScissor', label: i18n.t('Buttons:Sphere') }, + { value: 'RectangleScissor', label: i18n.t('Buttons:Rectangle') }, ], commands: 'setToolActiveToolbar', }, diff --git a/modes/segmentation/src/toolbarButtons.ts b/modes/segmentation/src/toolbarButtons.ts index d8750a74e..ecf2a5b36 100644 --- a/modes/segmentation/src/toolbarButtons.ts +++ b/modes/segmentation/src/toolbarButtons.ts @@ -420,13 +420,13 @@ export const toolbarButtons: Button[] = [ uiType: 'ohif.toolBoxButton', props: { icon: 'icon-tool-freehand-roi', - label: 'Freehand Segmentation', - tooltip: 'Freehand Segmentation', + label: i18n.t('Buttons:Freehand Segmentation'), + tooltip: i18n.t('Buttons:Freehand Segmentation'), evaluate: [ { name: 'evaluate.cornerstone.segmentation', toolNames: ['PlanarFreehandContourSegmentationTool'], - disabledText: 'Create new segmentation to enable this tool.', + disabledText: i18n.t('Buttons:Create new segmentation to enable this tool.'), }, { name: 'evaluate.cornerstone.hasSegmentationOfType', @@ -457,7 +457,7 @@ export const toolbarButtons: Button[] = [ ], options: [ { - name: 'Interpolate Contours', + name: i18n.t('Buttons:Interpolate Contours'), type: 'switch', id: 'planarFreehandInterpolateContours', value: false, @@ -473,13 +473,13 @@ export const toolbarButtons: Button[] = [ uiType: 'ohif.toolBoxButton', props: { icon: 'icon-tool-livewire', - label: 'Livewire Contour', - tooltip: 'Livewire Contour', + label: i18n.t('Buttons:Livewire Contour'), + tooltip: i18n.t('Buttons:Livewire Contour'), evaluate: [ { name: 'evaluate.cornerstone.segmentation', toolNames: ['LivewireContourSegmentationTool'], - disabledText: 'Create new segmentation to enable this tool.', + disabledText: i18n.t('Buttons:Create new segmentation to enable this tool.'), }, { name: 'evaluate.cornerstone.hasSegmentationOfType', @@ -510,7 +510,7 @@ export const toolbarButtons: Button[] = [ ], options: [ { - name: 'Interpolate Contours', + name: i18n.t('Buttons:Interpolate Contours'), type: 'switch', id: 'livewireInterpolateContours', value: false, @@ -526,13 +526,13 @@ export const toolbarButtons: Button[] = [ uiType: 'ohif.toolBoxButton', props: { icon: 'icon-tool-spline-roi', - label: 'Spline Contour Segmentation Tool', - tooltip: 'Spline Contour Segmentation Tool', + label: i18n.t('Buttons:Spline Contour Segmentation Tool'), + tooltip: i18n.t('Buttons:Spline Contour Segmentation Tool'), evaluate: [ { name: 'evaluate.cornerstone.segmentation', toolNames: ['CatmullRomSplineROI', 'LinearSplineROI', 'BSplineROI'], - disabledText: 'Create new segmentation to enable this tool.', + disabledText: i18n.t('Buttons:Create new segmentation to enable this tool.'), }, { name: 'evaluate.cornerstone.hasSegmentationOfType', @@ -549,7 +549,7 @@ export const toolbarButtons: Button[] = [ ], options: [ { - name: 'Spline Type', + name: i18n.t('Buttons:Spline Type'), type: 'select', id: 'splineTypeSelect', value: 'CatmullRomSplineROI', @@ -557,10 +557,10 @@ export const toolbarButtons: Button[] = [ { id: 'CatmullRomSplineROI', value: 'CatmullRomSplineROI', - label: 'Catmull Rom Spline', + label: i18n.t('Buttons:Catmull Rom Spline'), }, - { id: 'LinearSplineROI', value: 'LinearSplineROI', label: 'Linear Spline' }, - { id: 'BSplineROI', value: 'BSplineROI', label: 'B-Spline' }, + { id: 'LinearSplineROI', value: 'LinearSplineROI', label: i18n.t('Buttons:Linear Spline') }, + { id: 'BSplineROI', value: 'BSplineROI', label: i18n.t('Buttons:B-Spline') }, ], commands: { commandName: 'setToolActiveToolbar', @@ -578,7 +578,7 @@ export const toolbarButtons: Button[] = [ }, }, { - name: 'Simplified Spline', + name: i18n.t('Buttons:Simplified Spline'), type: 'switch', id: 'simplifiedSpline', value: true, @@ -587,7 +587,7 @@ export const toolbarButtons: Button[] = [ }, }, { - name: 'Interpolate Contours', + name: i18n.t('Buttons:Interpolate Contours'), type: 'switch', id: 'splineInterpolateContours', value: false, @@ -606,13 +606,13 @@ export const toolbarButtons: Button[] = [ uiType: 'ohif.toolBoxButton', props: { icon: 'icon-tool-sculptor', - label: 'Sculptor Tool', - tooltip: 'Sculptor Tool', + label: i18n.t('Buttons:Sculptor Tool'), + tooltip: i18n.t('Buttons:Sculptor Tool'), evaluate: [ { name: 'evaluate.cornerstone.segmentation', toolNames: ['SculptorTool'], - disabledText: 'Create new segmentation to enable this tool.', + disabledText: i18n.t('Buttons:Create new segmentation to enable this tool.'), }, { name: 'evaluate.cornerstone.hasSegmentationOfType', @@ -630,7 +630,7 @@ export const toolbarButtons: Button[] = [ ], options: [ { - name: 'Dynamic Cursor Size', + name: i18n.t('Buttons:Dynamic Cursor Size'), type: 'switch', id: 'dynamicCursorSize', value: true, @@ -670,7 +670,7 @@ export const toolbarButtons: Button[] = [ }, options: [ { - name: 'Radius (mm)', + name: i18n.t('Buttons:Radius (mm)'), id: 'brush-radius', type: 'range', explicitRunOnly: true, @@ -686,13 +686,13 @@ export const toolbarButtons: Button[] = [ ], }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'brush-mode', value: 'CircularBrush', values: [ - { value: 'CircularBrush', label: 'Circle' }, - { value: 'SphereBrush', label: 'Sphere' }, + { value: 'CircularBrush', label: i18n.t('Buttons:Circle') }, + { value: 'SphereBrush', label: i18n.t('Buttons:Sphere') }, ], commands: ['setToolActiveToolbar'], }, @@ -860,13 +860,13 @@ export const toolbarButtons: Button[] = [ }, options: [ { - name: 'Marker Mode', + name: i18n.t('Buttons:Marker Mode'), type: 'radio', id: 'marker-mode', value: 'markerInclude', values: [ - { value: 'markerInclude', label: 'Include' }, - { value: 'markerExclude', label: 'Exclude' }, + { value: 'markerInclude', label: i18n.t('Buttons:Include') }, + { value: 'markerExclude', label: i18n.t('Buttons:Exclude') }, ], commands: ({ commandsManager, options }) => { const markerModeOption = options.find(option => option.id === 'marker-mode'); @@ -882,7 +882,7 @@ export const toolbarButtons: Button[] = [ }, }, { - name: 'Clear Markers', + name: i18n.t('Buttons:Clear Markers'), type: 'button', id: 'clear-markers', commands: 'clearMarkersForMarkerLabelmap', @@ -912,7 +912,7 @@ export const toolbarButtons: Button[] = [ ], options: [ { - name: 'Radius (mm)', + name: i18n.t('Buttons:Radius (mm)'), id: 'eraser-radius', type: 'range', explicitRunOnly: true, @@ -926,13 +926,13 @@ export const toolbarButtons: Button[] = [ }, }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'eraser-mode', value: 'CircularEraser', values: [ - { value: 'CircularEraser', label: 'Circle' }, - { value: 'SphereEraser', label: 'Sphere' }, + { value: 'CircularEraser', label: i18n.t('Buttons:Circle') }, + { value: 'SphereEraser', label: i18n.t('Buttons:Sphere') }, ], commands: 'setToolActiveToolbar', }, @@ -950,7 +950,7 @@ export const toolbarButtons: Button[] = [ uiType: 'ohif.toolBoxButton', props: { icon: 'icon-tool-threshold', - label: 'Threshold Tool', + label: i18n.t('Buttons:Threshold Tool'), evaluate: [ { name: 'evaluate.cornerstone.segmentation', @@ -978,7 +978,7 @@ export const toolbarButtons: Button[] = [ }, options: [ { - name: 'Radius (mm)', + name: i18n.t('Buttons:Radius (mm)'), id: 'threshold-radius', type: 'range', explicitRunOnly: true, @@ -999,13 +999,13 @@ export const toolbarButtons: Button[] = [ }, }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'threshold-shape', value: 'ThresholdCircularBrush', values: [ - { value: 'ThresholdCircularBrush', label: 'Circle' }, - { value: 'ThresholdSphereBrush', label: 'Sphere' }, + { value: 'ThresholdCircularBrush', label: i18n.t('Buttons:Circle') }, + { value: 'ThresholdSphereBrush', label: i18n.t('Buttons:Sphere') }, ], commands: ({ value, commandsManager, options }) => { const optionsDynamic = options.find(option => option.id === 'dynamic-mode'); @@ -1025,13 +1025,13 @@ export const toolbarButtons: Button[] = [ }, }, { - name: 'Threshold', + name: i18n.t('Buttons:Threshold'), type: 'radio', id: 'dynamic-mode', value: 'ThresholdDynamic', values: [ - { value: 'ThresholdDynamic', label: 'Dynamic' }, - { value: 'ThresholdRange', label: 'Range' }, + { value: 'ThresholdDynamic', label: i18n.t('Buttons:Dynamic') }, + { value: 'ThresholdRange', label: i18n.t('Buttons:Range') }, ], commands: ({ value, commandsManager, options }) => { const thresholdRangeOption = options.find(option => option.id === 'threshold-shape'); @@ -1104,14 +1104,14 @@ export const toolbarButtons: Button[] = [ }, options: [ { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', value: 'CircleScissor', id: 'shape-mode', values: [ - { value: 'CircleScissor', label: 'Circle' }, - { value: 'SphereScissor', label: 'Sphere' }, - { value: 'RectangleScissor', label: 'Rectangle' }, + { value: 'CircleScissor', label: i18n.t('Buttons:Circle') }, + { value: 'SphereScissor', label: i18n.t('Buttons:Sphere') }, + { value: 'RectangleScissor', label: i18n.t('Buttons:Rectangle') }, ], commands: 'setToolActiveToolbar', }, @@ -1171,8 +1171,8 @@ export const toolbarButtons: Button[] = [ uiType: 'ohif.toolBoxButton', props: { icon: 'tool-labelmap-edit-with-contour', - label: 'Labelmap Edit with Contour Tool', - tooltip: 'Labelmap Edit with Contour Tool', + label: i18n.t('Buttons:Labelmap Edit with Contour Tool'), + tooltip: i18n.t('Buttons:Labelmap Edit with Contour Tool'), commands: [ 'setToolActiveToolbar', { diff --git a/modes/tmtv/src/toolbarButtons.ts b/modes/tmtv/src/toolbarButtons.ts index f0a91200a..c5d8633e1 100644 --- a/modes/tmtv/src/toolbarButtons.ts +++ b/modes/tmtv/src/toolbarButtons.ts @@ -220,7 +220,7 @@ const toolbarButtons = [ ], options: [ { - name: 'Radius (mm)', + name: i18n.t('Buttons:Radius (mm)'), id: 'brush-radius', type: 'range', explicitRunOnly: true, @@ -234,13 +234,13 @@ const toolbarButtons = [ }, }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'brush-mode', value: 'CircularBrush', values: [ - { value: 'CircularBrush', label: 'Circle' }, - { value: 'SphereBrush', label: 'Sphere' }, + { value: 'CircularBrush', label: i18n.t('Buttons:Circle') }, + { value: 'SphereBrush', label: i18n.t('Buttons:Sphere') }, ], commands: 'setToolActiveToolbar', }, @@ -265,7 +265,7 @@ const toolbarButtons = [ ], options: [ { - name: 'Radius (mm)', + name: i18n.t('Buttons:Radius (mm)'), id: 'eraser-radius', type: 'range', explicitRunOnly: true, @@ -279,13 +279,13 @@ const toolbarButtons = [ }, }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'eraser-mode', value: 'CircularEraser', values: [ - { value: 'CircularEraser', label: 'Circle' }, - { value: 'SphereEraser', label: 'Sphere' }, + { value: 'CircularEraser', label: i18n.t('Buttons:Circle') }, + { value: 'SphereEraser', label: i18n.t('Buttons:Sphere') }, ], commands: 'setToolActiveToolbar', }, @@ -310,7 +310,7 @@ const toolbarButtons = [ ], options: [ { - name: 'Radius (mm)', + name: i18n.t('Buttons:Radius (mm)'), id: 'threshold-radius', type: 'range', explicitRunOnly: true, @@ -330,13 +330,13 @@ const toolbarButtons = [ }, }, { - name: 'Threshold', + name: i18n.t('Buttons:Threshold'), type: 'radio', id: 'dynamic-mode', value: 'ThresholdRange', values: [ - { value: 'ThresholdDynamic', label: 'Dynamic' }, - { value: 'ThresholdRange', label: 'Range' }, + { value: 'ThresholdDynamic', label: i18n.t('Buttons:Dynamic') }, + { value: 'ThresholdRange', label: i18n.t('Buttons:Range') }, ], commands: ({ value, commandsManager }) => { if (value === 'ThresholdDynamic') { @@ -351,20 +351,20 @@ const toolbarButtons = [ }, }, { - name: 'Shape', + name: i18n.t('Buttons:Shape'), type: 'radio', id: 'eraser-mode', value: 'ThresholdCircularBrush', values: [ - { value: 'ThresholdCircularBrush', label: 'Circle' }, - { value: 'ThresholdSphereBrush', label: 'Sphere' }, + { value: 'ThresholdCircularBrush', label: i18n.t('Buttons:Circle') }, + { value: 'ThresholdSphereBrush', label: i18n.t('Buttons:Sphere') }, ], condition: ({ options }) => options.find(option => option.id === 'dynamic-mode').value === 'ThresholdRange', commands: 'setToolActiveToolbar', }, { - name: 'ThresholdRange', + name: i18n.t('ROIThresholdConfiguration:ThresholdRange'), type: 'double-range', id: 'threshold-range', min: 0, diff --git a/modes/usAnnotation/src/toolbarButtons.ts b/modes/usAnnotation/src/toolbarButtons.ts index 0db35018d..c91382648 100644 --- a/modes/usAnnotation/src/toolbarButtons.ts +++ b/modes/usAnnotation/src/toolbarButtons.ts @@ -628,7 +628,7 @@ const toolbarButtons: Button[] = [ commands: setToolActiveToolbar, evaluate: { name: 'evaluate.cornerstoneTool', - disabledText: 'Select a 3D viewport to enable this tool', + disabledText: i18n.t('Buttons:Select a 3D viewport to enable this tool'), }, }, }, @@ -672,7 +672,7 @@ const toolbarButtons: Button[] = [ }, evaluate: { name: 'evaluate.cornerstoneTool', - disabledText: 'Select an MPR viewport to enable this tool', + disabledText: i18n.t('Buttons:Select an MPR viewport to enable this tool'), }, }, }, diff --git a/platform/core/src/utils/createStudyBrowserTabs.ts b/platform/core/src/utils/createStudyBrowserTabs.ts index 2fa21fc4e..aea2a5e5d 100644 --- a/platform/core/src/utils/createStudyBrowserTabs.ts +++ b/platform/core/src/utils/createStudyBrowserTabs.ts @@ -1,6 +1,8 @@ import { useSystem } from '../contextProviders/SystemProvider'; +import i18n from 'i18next'; import { seriesSortCriteria } from './sortStudy'; + /** * Tab properties that drive which tab group is used for thumbnail display. */ @@ -98,17 +100,17 @@ export function createStudyBrowserTabs( const tabs = [ { name: 'primary', - label: 'Primary', + label: i18n.t('StudyBrowser:Primary'), studies: primaryStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)), }, { name: 'recent', - label: 'Recent', + label: i18n.t('StudyBrowser:Recent'), studies: recentStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)), }, { name: 'all', - label: 'All', + label: i18n.t('StudyBrowser:All'), studies: allStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)), }, ]; diff --git a/platform/core/src/utils/formatDate.js b/platform/core/src/utils/formatDate.js index 866a9285a..759317518 100644 --- a/platform/core/src/utils/formatDate.js +++ b/platform/core/src/utils/formatDate.js @@ -8,7 +8,17 @@ import i18n from 'i18next'; * @param {string} format Desired date format * @returns {string} Formatted date */ -export default (date, format = i18n.t('Common:localDateFormat','DD-MMM-YYYY')) => { - // moment(undefined) returns the current date, so return the empty string instead - return date ? moment(date).format(format) : ''; +export default (date, format = i18n.t('Common:localDateFormat', 'DD-MMM-YYYY')) => { + if (!date) { + return ''; + } + + const locale = i18n.language || 'en'; + const parsed = moment(date, ['YYYYMMDD', 'YYYY.MM.DD'], true); + + if (!parsed.isValid()) { + return moment(date).locale(locale).format(format); + } + + return parsed.locale(locale).format(format); }; diff --git a/platform/i18n/src/locales/ar/DataRow.json b/platform/i18n/src/locales/ar/DataRow.json new file mode 100644 index 000000000..ffb924ef8 --- /dev/null +++ b/platform/i18n/src/locales/ar/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "إخفاء", + "Show": "إظهار", + "Rename": "إعادة تسمية", + "Duplicate": "تكرار", + "Delete": "حذف", + "Change Color": "تغيير اللون", + "Lock": "قفل", + "Unlock": "إلغاء القفل" +} diff --git a/platform/i18n/src/locales/ar/SegmentationTable.json b/platform/i18n/src/locales/ar/SegmentationPanel.json similarity index 68% rename from platform/i18n/src/locales/ar/SegmentationTable.json rename to platform/i18n/src/locales/ar/SegmentationPanel.json index aa023c3ed..cab16c5a2 100644 --- a/platform/i18n/src/locales/ar/SegmentationTable.json +++ b/platform/i18n/src/locales/ar/SegmentationPanel.json @@ -14,5 +14,8 @@ "Outline": "حدود", "Rename": "إعادة تسمية", "Segmentation": "تجزئة", - "Size": "الحجم" -} \ No newline at end of file + "Size": "الحجم", + "No segmentations available": "لا توجد تجزئات متاحة", + "Not available on the current viewport": "غير متاح في نافذة العرض الحالية", + "Add segment to enable this tool": "أضف مقطعًا لتمكين هذه الأداة" +} diff --git a/platform/i18n/src/locales/ar/index.js b/platform/i18n/src/locales/ar/index.js index 9f7fc73ca..dce0afd1b 100644 --- a/platform/i18n/src/locales/ar/index.js +++ b/platform/i18n/src/locales/ar/index.js @@ -8,8 +8,9 @@ import ErrorBoundary from './ErrorBoundary.json'; import Header from './Header.json'; import HotkeysValidators from './HotkeysValidators.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import Modes from './Modes.json'; -import SegmentationTable from './SegmentationTable.json'; +import SegmentationPanel from './SegmentationPanel.json'; import SidePanel from './SidePanel.json'; import StudyBrowser from './StudyBrowser.json'; import StudyItem from './StudyItem.json'; @@ -34,8 +35,9 @@ export default { Header, HotkeysValidators, MeasurementTable, + DataRow, Modes, - SegmentationTable, + SegmentationPanel, SidePanel, StudyBrowser, StudyItem, diff --git a/platform/i18n/src/locales/de/DataRow.json b/platform/i18n/src/locales/de/DataRow.json new file mode 100644 index 000000000..deec77dd1 --- /dev/null +++ b/platform/i18n/src/locales/de/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Verbergen", + "Show": "Anzeigen", + "Rename": "Umbenennen", + "Duplicate": "Duplizieren", + "Delete": "Löschen", + "Change Color": "Farbe ändern", + "Lock": "Sperren", + "Unlock": "Entsperren" +} diff --git a/platform/i18n/src/locales/de/index.js b/platform/i18n/src/locales/de/index.js index a265fa42a..ca97007f3 100644 --- a/platform/i18n/src/locales/de/index.js +++ b/platform/i18n/src/locales/de/index.js @@ -5,6 +5,7 @@ import Common from './Common.json'; import DatePicker from './DatePicker.json'; import Header from './Header.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import StudyList from './StudyList.json'; import UserPreferencesModal from './UserPreferencesModal.json'; import ViewportDownloadForm from './ViewportDownloadForm.json'; @@ -18,6 +19,7 @@ export default { DatePicker, Header, MeasurementTable, + DataRow, StudyList, UserPreferencesModal, ViewportDownloadForm, diff --git a/platform/i18n/src/locales/en-US/AboutModal.json b/platform/i18n/src/locales/en-US/AboutModal.json index aa00fc0b6..fa32db2e4 100644 --- a/platform/i18n/src/locales/en-US/AboutModal.json +++ b/platform/i18n/src/locales/en-US/AboutModal.json @@ -3,6 +3,8 @@ "Browser": "Browser", "Build number": "Build Number", "Commit hash": "Commit hash", + "Commit Hash": "Commit Hash", + "Current Browser & OS": "Current Browser & OS", "Data citation": "Data citation", "Important links": "Important links", "Last master commits": "Latest Master Commits", diff --git a/platform/i18n/src/locales/en-US/Buttons.json b/platform/i18n/src/locales/en-US/Buttons.json index 2e4d03719..7c979e29d 100644 --- a/platform/i18n/src/locales/en-US/Buttons.json +++ b/platform/i18n/src/locales/en-US/Buttons.json @@ -9,6 +9,7 @@ "Cancel": "Cancel", "Capture": "Capture", "Circle": "Circle", + "Sphere": "Sphere", "Clear": "Clear", "Coronal": "Coronal", "Crosshairs": "Crosshairs", @@ -60,6 +61,7 @@ "Freehand ROI": "Freehand ROI", "Spline ROI": "Spline ROI", "Livewire tool": "Livewire tool", + "Livewire Contour": "Livewire Contour", "Segment Label Display": "Segment Label Display", "Data Overlay": "Data Overlay", "Configure data overlay options and manage foreground/background display sets": "Configure data overlay options and manage foreground/background display sets", @@ -116,15 +118,37 @@ "Line": "Line", "Line Tool": "Line Tool", "3D Rotate": "3D Rotate", + "Shape": "Shape", "MPR": "MPR", "Rectangle ROI Threshold": "Rectangle ROI Threshold", "Select the PT Axial to enable this tool": "Select the PT Axial to enable this tool", "Create new segmentation to enable this tool.": "Create new segmentation to enable this tool.", + "Freehand Segmentation": "Freehand Segmentation", + "Spline Contour Segmentation Tool": "Spline Contour Segmentation Tool", + "Sculptor Tool": "Sculptor Tool", + "Interpolate Contours": "Interpolate Contours", + "Marker Mode": "Marker Mode", + "Include": "Include", + "Exclude": "Exclude", + "Clear Markers": "Clear Markers", + "Radius (mm)": "Radius (mm)", + "Dynamic": "Dynamic", + "Range": "Range", + "Spline Type": "Spline Type", + "Catmull Rom Spline": "Catmull Rom Spline", + "Linear Spline": "Linear Spline", + "B-Spline": "B-Spline", + "Simplified Spline": "Simplified Spline", + "Dynamic Cursor Size": "Dynamic Cursor Size", + "No segmentations available": "No segmentations available", "Threshold Tool": "Threshold Tool", + "Threshold Tools": "Threshold Tools", "Select a 3D viewport to enable this tool": "Select a 3D viewport to enable this tool", + "Not available on the current viewport": "Not available on the current viewport", "Select an MPR viewport to enable this tool": "Select an MPR viewport to enable this tool", "Interpolate Labelmap": "Interpolate Labelmap", "Segment Bidirectional": "Segment Bidirectional", + "Tool not available for this modality": "Tool not available for this modality", "One Click Segment": "One Click Segment", "Labelmap Assist": "Labelmap Assist", "Marker Guided Labelmap": "Marker Guided Labelmap", diff --git a/platform/i18n/src/locales/en-US/CaptureViewportModal.json b/platform/i18n/src/locales/en-US/CaptureViewportModal.json index 0ec547831..1a321517c 100644 --- a/platform/i18n/src/locales/en-US/CaptureViewportModal.json +++ b/platform/i18n/src/locales/en-US/CaptureViewportModal.json @@ -1,6 +1,9 @@ { "File name": "File name", "Image size": "Image size", + "Image size in pixels": "Image size in pixels", "Include annotations": "Include annotations", - "Include warning message": "Include warning message" + "Include warning message": "Include warning message", + "Width": "Width", + "Height": "Height" } diff --git a/platform/i18n/src/locales/en-US/Colormaps.json b/platform/i18n/src/locales/en-US/Colormaps.json new file mode 100644 index 000000000..99ec4d9d5 --- /dev/null +++ b/platform/i18n/src/locales/en-US/Colormaps.json @@ -0,0 +1,15 @@ +{ + "Grayscale": "Grayscale", + "X Ray": "X Ray", + "Isodose": "Isodose", + "hsv": "HSV", + "hot_iron": "Hot Iron", + "red_hot": "Red Hot", + "s_pet": "PET", + "perfusion": "Perfusion", + "rainbow_2": "Rainbow 2", + "suv": "SUV", + "ge_256": "GE 256", + "ge": "GE", + "siemens": "Siemens" +} diff --git a/platform/i18n/src/locales/en-US/Common.json b/platform/i18n/src/locales/en-US/Common.json index 0775aa25e..5f6a77321 100644 --- a/platform/i18n/src/locales/en-US/Common.json +++ b/platform/i18n/src/locales/en-US/Common.json @@ -22,5 +22,8 @@ "Cancel": "Cancel", "Save": "Save", "localDateFormat": "DD-MMM-YYYY", - "Back": "Back" + "Back": "Back", + "Foreground": "Foreground", + "SELECT A FOREGROUND": "SELECT A FOREGROUND", + "SELECT A SEGMENTATION": "SELECT A SEGMENTATION" } diff --git a/platform/i18n/src/locales/en-US/DataRow.json b/platform/i18n/src/locales/en-US/DataRow.json new file mode 100644 index 000000000..de106fe4f --- /dev/null +++ b/platform/i18n/src/locales/en-US/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Hide", + "Show": "Show", + "Rename": "Rename", + "Duplicate": "Duplicate", + "Delete": "Delete", + "Change Color": "Change Color", + "Lock": "Lock", + "Unlock": "Unlock" +} diff --git a/platform/i18n/src/locales/en-US/DatePicker.json b/platform/i18n/src/locales/en-US/DatePicker.json index 3add53f9e..4b8803533 100644 --- a/platform/i18n/src/locales/en-US/DatePicker.json +++ b/platform/i18n/src/locales/en-US/DatePicker.json @@ -5,5 +5,9 @@ "Last 7 days": "Last 7 days", "Last 30 days": "Last 30 days", "Start Date": "Start Date", - "Today": "Today" + "Today": "Today", + "Previous Month": "Previous Month", + "Next Month": "Next Month", + "Select Month": "Select Month", + "Select Year": "Select Year" } diff --git a/platform/i18n/src/locales/en-US/Hps.json b/platform/i18n/src/locales/en-US/Hps.json index c3226226e..e5329329a 100644 --- a/platform/i18n/src/locales/en-US/Hps.json +++ b/platform/i18n/src/locales/en-US/Hps.json @@ -7,5 +7,8 @@ "mpr": "mpr", "3D only": "3D only", "3D primary": "3D primary", - "Axial Primary": "Axial Primary" + "Axial Primary": "Axial Primary", + "Compare Two Studies": "Compare Two Studies", + "Compare two studies in various layouts": "Compare two studies in various layouts", + "Mammography Breast Screening": "Mammography Breast Screening" } diff --git a/platform/i18n/src/locales/en-US/MeasurementTable.json b/platform/i18n/src/locales/en-US/MeasurementTable.json index 424317274..7fd54073e 100644 --- a/platform/i18n/src/locales/en-US/MeasurementTable.json +++ b/platform/i18n/src/locales/en-US/MeasurementTable.json @@ -8,6 +8,15 @@ "NonTargets": "NonTargets", "Relabel": "Relabel", "Targets": "Targets", + "Rename": "Rename", + "Duplicate": "Duplicate", + "Change Color": "Change Color", + "Lock": "Lock", + "Unlock": "Unlock", + "Hide": "Hide", + "Show": "Show", + "Create SR": "Create SR", + "empty": "(empty)", "Track measurements for this series?": "Track measurements for this series?", "Do you want to add this measurement to the existing report?": "Do you want to add this measurement to the existing report?", "You have existing tracked measurements. What would you like to do with your existing tracked measurements?": "You have existing tracked measurements. What would you like to do with your existing tracked measurements?", diff --git a/platform/i18n/src/locales/en-US/Modes.json b/platform/i18n/src/locales/en-US/Modes.json index 813dfe9d6..29d39c36e 100644 --- a/platform/i18n/src/locales/en-US/Modes.json +++ b/platform/i18n/src/locales/en-US/Modes.json @@ -4,5 +4,6 @@ "Basic Viewer": "Basic Viewer", "Microscopy": "Microscopy", "Segmentation": "Segmentation", - "Total Metabolic Tumor Volume": "Total Metabolic Tumor Volume" + "Total Metabolic Tumor Volume": "Total Metabolic Tumor Volume", + "US Pleura B-line Annotations": "US Pleura B-line Annotations" } diff --git a/platform/i18n/src/locales/en-US/Onboarding.json b/platform/i18n/src/locales/en-US/Onboarding.json new file mode 100644 index 000000000..d3e8e7de1 --- /dev/null +++ b/platform/i18n/src/locales/en-US/Onboarding.json @@ -0,0 +1,27 @@ +{ + "Scrolling Through Images": "Scrolling Through Images", + "You can scroll through the images using the mouse wheel or scrollbar.": "You can scroll through the images using the mouse wheel or scrollbar.", + "Zooming In and Out": "Zooming In and Out", + "You can zoom the images using the right click.": "You can zoom the images using the right click.", + "Panning the Image": "Panning the Image", + "You can pan the images using the middle click.": "You can pan the images using the middle click.", + "Adjusting Window Level": "Adjusting Window Level", + "You can modify the window level using the left click.": "You can modify the window level using the left click.", + "Using the Measurement Tools": "Using the Measurement Tools", + "You can measure the length of a region using the Length tool.": "You can measure the length of a region using the Length tool.", + "Drawing Length Annotations": "Drawing Length Annotations", + "Use the length tool on the viewport to measure the length of a region.": "Use the length tool on the viewport to measure the length of a region.", + "Tracking Measurements in the Panel": "Tracking Measurements in the Panel", + "Click yes to track the measurements in the measurement panel.": "Click yes to track the measurements in the measurement panel.", + "Opening the Measurements Panel": "Opening the Measurements Panel", + "Click the measurements button to open the measurements panel.": "Click the measurements button to open the measurements panel.", + "Scrolling Away from a Measurement": "Scrolling Away from a Measurement", + "Scroll the images using the mouse wheel away from the measurement.": "Scroll the images using the mouse wheel away from the measurement.", + "Jumping to Measurements in the Panel": "Jumping to Measurements in the Panel", + "Click the measurement in the measurement panel to jump to it.": "Click the measurement in the measurement panel to jump to it.", + "Changing Layout": "Changing Layout", + "You can change the layout of the viewer using the layout button.": "You can change the layout of the viewer using the layout button.", + "Selecting the MPR Layout": "Selecting the MPR Layout", + "Select the MPR layout to view the images in MPR mode.": "Select the MPR layout to view the images in MPR mode.", + "Skip all": "Skip all" +} diff --git a/platform/i18n/src/locales/en-US/PanelSUV.json b/platform/i18n/src/locales/en-US/PanelSUV.json new file mode 100644 index 000000000..7a280d699 --- /dev/null +++ b/platform/i18n/src/locales/en-US/PanelSUV.json @@ -0,0 +1,10 @@ +{ + "Patient Information": "Patient Information", + "Patient Sex": "Patient Sex", + "Weight": "Weight", + "Total Dose": "Total Dose", + "Half Life": "Half Life", + "Injection Time": "Injection Time", + "Acquisition Time": "Acquisition Time", + "Reload Data": "Reload Data" +} diff --git a/platform/i18n/src/locales/en-US/ROIThresholdConfiguration.json b/platform/i18n/src/locales/en-US/ROIThresholdConfiguration.json new file mode 100644 index 000000000..d0f095ecb --- /dev/null +++ b/platform/i18n/src/locales/en-US/ROIThresholdConfiguration.json @@ -0,0 +1,11 @@ +{ + "Max": "Max", + "Range": "Range", + "Start": "Start", + "End": "End", + "Percentage of Max SUV": "Percentage of Max SUV", + "Lower & Upper Ranges": "Lower & Upper Ranges", + "Run": "Run", + "Threshold Tools": "Threshold Tools", + "ThresholdRange": "Threshold Range" +} diff --git a/platform/i18n/src/locales/en-US/SegmentationPanel.json b/platform/i18n/src/locales/en-US/SegmentationPanel.json new file mode 100644 index 000000000..52f0928e6 --- /dev/null +++ b/platform/i18n/src/locales/en-US/SegmentationPanel.json @@ -0,0 +1,67 @@ +{ + "Active": "Active", + "Add new segmentation": "Add new segmentation", + "Add segment": "Add segment", + "Add segmentation": "Add segmentation", + "Contour": "Contour", + "Contour tools": "Contour tools", + "Contour Segmentations": "Contour segmentations", + "Delete": "Delete", + "Display inactive segmentations": "Display inactive segmentations", + "Add Segment": "Add Segment", + "Download DICOM RTSS": "Download DICOM RTSS", + "Export DICOM SEG": "Export DICOM SEG", + "Download DICOM SEG": "Download DICOM SEG", + "Download DICOM RTSTRUCT": "Download DICOM RTSTRUCT", + "Fill": "Fill", + "Inactive segmentations": "Inactive segmentations", + "Labelmap": "Label map", + "Labelmap tools": "Label map tools", + "Labelmap Segmentations": "Label map segmentations", + "Opacity": "Opacity", + "Border": "Border", + "Show": "Show", + "Fill & Outline": "Fill & Outline", + "Outline Only": "Outline Only", + "Fill Only": "Fill Only", + "Outline": "Outline", + "Rename": "Rename", + "Segmentation": "Segmentation", + "Segmentations": "Segmentations", + "Segmentation not supported": "Segmentation not supported", + "Size": "Size", + "Preview edits before creating": "Preview edits before creating", + "Use center as segment index": "Use center as segment index", + "Hover on segment border to activate": "Hover on segment border to activate", + "Show segment name on hover": "Show segment name on hover", + "Create New Segmentation": "Create New Segmentation", + "Manage Current Segmentation": "Manage Current Segmentation", + "Remove from Viewport": "Remove from Viewport", + "Download & Export": "Download & Export", + "Download": "Download", + "Export": "Export", + "CSV Report": "CSV Report", + "DICOM SEG": "DICOM SEG", + "DICOM RTSS": "DICOM RTSS" + , + "Fill contour holes": "Fill contour holes", + "Fill Holes": "Fill Holes", + "Remove Small Contours": "Remove Small Contours", + "Area Threshold": "Area Threshold", + "Create New Segment from Holes": "Create New Segment from Holes", + "Create New Segment": "Create New Segment", + "Smooth all edges": "Smooth all edges", + "Smooth Edges": "Smooth Edges", + "Remove extra points": "Remove extra points", + "Remove Points": "Remove Points", + "Merge": "Merge", + "Intersect": "Intersect", + "Subtract": "Subtract", + "Select a segment": "Select a segment", + "Select a segmentation": "Select a segmentation", + "Create a new segment": "Create a new segment", + "New segment name": "New segment name", + "No segmentations available": "No segmentations available", + "Not available on the current viewport": "Not available on the current viewport", + "Add segment to enable this tool": "Add segment to enable this tool" +} diff --git a/platform/i18n/src/locales/en-US/SegmentationTable.json b/platform/i18n/src/locales/en-US/SegmentationTable.json deleted file mode 100644 index c5457cb67..000000000 --- a/platform/i18n/src/locales/en-US/SegmentationTable.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "Active": "Active", - "Add new segmentation": "Add new segmentation", - "Add segment": "Add segment", - "Add segmentation": "Add segmentation", - "Contour": "Contour", - "Contour tools": "Contour tools", - "Contour Segmentations": "Contour segmentations", - "Delete": "Delete", - "Display inactive segmentations": "Display inactive segmentations", - "Download DICOM RTSS": "Download DICOM RTSS", - "Export DICOM SEG": "Export DICOM SEG", - "Download DICOM SEG": "Download DICOM SEG", - "Download DICOM RTSTRUCT": "Download DICOM RTSTRUCT", - "Fill": "Fill", - "Inactive segmentations": "Inactive segmentations", - "Labelmap": "Label map", - "Labelmap tools": "Label map tools", - "Labelmap Segmentations": "Label map segmentations", - "Opacity": "Opacity", - "Outline": "Outline", - "Rename": "Rename", - "Segmentation": "Segmentation", - "Segmentations": "Segmentations", - "Segmentation not supported": "Segmentation not supported", - "Size": "Size" -} diff --git a/platform/i18n/src/locales/en-US/StudyList.json b/platform/i18n/src/locales/en-US/StudyList.json index c64afdb7a..37dc064f4 100644 --- a/platform/i18n/src/locales/en-US/StudyList.json +++ b/platform/i18n/src/locales/en-US/StudyList.json @@ -14,6 +14,7 @@ "PatientName": "Patient Name", "Previous": "< Back", "Results per page": "Results per page", + "Studies": "Studies", "StudyDate": "Study Date", "StudyList": "Study List", "Upload": "Upload" diff --git a/platform/i18n/src/locales/en-US/USAnnotationPanel.json b/platform/i18n/src/locales/en-US/USAnnotationPanel.json new file mode 100644 index 000000000..d540f083d --- /dev/null +++ b/platform/i18n/src/locales/en-US/USAnnotationPanel.json @@ -0,0 +1,17 @@ +{ + "Workflow": "Workflow", + "Depth guide toggle": "Depth guide toggle", + "Show pleura percentage": "Show pleura percentage", + "Sector Annotations": "Sector Annotations", + "Pleura line": "Pleura line", + "B-line": "B-line", + "B-line annotation": "B-line annotation", + "Pleura annotation": "Pleura annotation", + "Show Overlay": "Show Overlay", + "Annotated Frames": "Annotated Frames", + "Frame": "Frame", + "Pleura lines": "Pleura lines", + "B-lines": "B-lines", + "JSON": "JSON", + "Annotations": "Annotations" +} diff --git a/platform/i18n/src/locales/en-US/UserPreferencesModal.json b/platform/i18n/src/locales/en-US/UserPreferencesModal.json index 5e7335468..0d5091c39 100644 --- a/platform/i18n/src/locales/en-US/UserPreferencesModal.json +++ b/platform/i18n/src/locales/en-US/UserPreferencesModal.json @@ -5,5 +5,80 @@ "ResetDefaultMessage": "Preferences successfully reset to default.
You must Save to perform this action.", "Save": "$t(Buttons:Save)", "SaveMessage": "Preferences saved", - "User preferences": "User Preferences" + "User preferences": "User Preferences", + "Language": "Language", + "Select language": "Select language", + "Hotkeys": "Hotkeys", + "Zoom": "Zoom", + "Zoom In": "Zoom In", + "Zoom Out": "Zoom Out", + "Zoom to Fit": "Zoom to Fit", + "Rotate Right": "Rotate Right", + "Rotate Left": "Rotate Left", + "Flip Horizontally": "Flip Horizontally", + "Flip Vertically": "Flip Vertically", + "Cine": "Cine", + "Invert": "Invert", + "Next Image Viewport": "Next Image Viewport", + "Previous Image Viewport": "Previous Image Viewport", + "Previous Series": "Previous Series", + "Next Series": "Next Series", + "Next Stage": "Next Stage", + "Previous Stage": "Previous Stage", + "Next Image": "Next Image", + "Previous Image": "Previous Image", + "First Image": "First Image", + "Last Image": "Last Image", + "Reset": "Reset", + "Cancel Measurement": "Cancel Measurement", + "W/L Preset 1": "W/L Preset 1", + "W/L Preset 2": "W/L Preset 2", + "W/L Preset 3": "W/L Preset 3", + "W/L Preset 4": "W/L Preset 4", + "Delete Annotation": "Delete Annotation", + "Accept Preview": "Accept Preview", + "Reject Preview": "Reject Preview", + "Undo": "Undo", + "Redo": "Redo", + "Interpolate Scroll": "Interpolate Scroll", + "Increase Brush Size": "Increase Brush Size", + "Decrease Brush Size": "Decrease Brush Size", + "Eraser": "Eraser", + "Brush": "Brush", + "Add New Segment": "Add New Segment", + "Press keys": "Press keys...", + "LanguageName.en-US": "English (US)", + "LanguageName.fr": "French", + "HotkeyKeys.ctrl": "Ctrl", + "HotkeyKeys.shift": "Shift", + "HotkeyKeys.alt": "Alt", + "HotkeyKeys.option": "Option", + "HotkeyKeys.meta": "Cmd", + "HotkeyKeys.enter": "Enter", + "HotkeyKeys.esc": "Esc", + "HotkeyKeys.space": "Space", + "HotkeyKeys.tab": "Tab", + "HotkeyKeys.backspace": "Backspace", + "HotkeyKeys.delete": "Delete", + "HotkeyKeys.insert": "Insert", + "HotkeyKeys.home": "Home", + "HotkeyKeys.end": "End", + "HotkeyKeys.pageup": "Page Up", + "HotkeyKeys.pagedown": "Page Down", + "HotkeyKeys.up": "Up Arrow", + "HotkeyKeys.down": "Down Arrow", + "HotkeyKeys.left": "Left Arrow", + "HotkeyKeys.right": "Right Arrow", + "HotkeyKeys.capslock": "Caps Lock", + "HotkeyKeys.plus": "Plus", + "HotkeyKeys.minus": "Minus", + "HotkeyKeys.comma": "Comma", + "HotkeyKeys.period": "Period", + "HotkeyKeys.slash": "Slash", + "HotkeyKeys.backslash": "Backslash", + "HotkeyKeys.semicolon": "Semicolon", + "HotkeyKeys.quote": "Quote", + "HotkeyKeys.backquote": "Backtick", + "HotkeyKeys.bracketleft": "Left Bracket", + "HotkeyKeys.bracketright": "Right Bracket" } diff --git a/platform/i18n/src/locales/en-US/WindowLevelActionMenu.json b/platform/i18n/src/locales/en-US/WindowLevelActionMenu.json index cab532545..21db62e8c 100644 --- a/platform/i18n/src/locales/en-US/WindowLevelActionMenu.json +++ b/platform/i18n/src/locales/en-US/WindowLevelActionMenu.json @@ -6,5 +6,14 @@ "Color LUT": "Color LUT", "Preview in viewport": "Preview in viewport", "Grayscale": "Grayscale", - "Rendering Options": "Rendering Options" + "Rendering Options": "Rendering Options", + "Rendering Presets": "Rendering Presets", + "Search all": "Search all", + "Quality": "Quality", + "Lighting": "Lighting", + "Shade": "Shade", + "Ambient": "Ambient", + "Diffuse": "Diffuse", + "Specular": "Specular", + "Shift": "Shift" } diff --git a/platform/i18n/src/locales/en-US/index.js b/platform/i18n/src/locales/en-US/index.js index 556e13663..eab688090 100644 --- a/platform/i18n/src/locales/en-US/index.js +++ b/platform/i18n/src/locales/en-US/index.js @@ -8,8 +8,9 @@ import ErrorBoundary from './ErrorBoundary.json'; import Header from './Header.json'; import HotkeysValidators from './HotkeysValidators.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import Modes from './Modes.json'; -import SegmentationTable from './SegmentationTable.json'; +import SegmentationPanel from './SegmentationPanel.json'; import SidePanel from './SidePanel.json'; import StudyBrowser from './StudyBrowser.json'; import StudyItem from './StudyItem.json'; @@ -25,6 +26,11 @@ import CaptureViewportModal from './CaptureViewportModal.json'; import Hps from './Hps.json'; import ToolbarLayoutSelector from './ToolbarLayoutSelector.json'; import Tools from './Tools.json'; +import Onboarding from './Onboarding.json'; +import Colormaps from './Colormaps.json'; +import PanelSUV from './PanelSUV.json'; +import ROIThresholdConfiguration from './ROIThresholdConfiguration.json'; +import USAnnotationPanel from './USAnnotationPanel.json'; export default { 'en-US': { @@ -38,8 +44,9 @@ export default { Header, HotkeysValidators, MeasurementTable, + DataRow, Modes, - SegmentationTable, + SegmentationPanel, SidePanel, StudyBrowser, StudyItem, @@ -55,5 +62,10 @@ export default { Hps, ToolbarLayoutSelector, Tools, + Onboarding, + Colormaps, + PanelSUV, + ROIThresholdConfiguration, + USAnnotationPanel, }, }; diff --git a/platform/i18n/src/locales/es/DataRow.json b/platform/i18n/src/locales/es/DataRow.json new file mode 100644 index 000000000..c7ec178ed --- /dev/null +++ b/platform/i18n/src/locales/es/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Ocultar", + "Show": "Mostrar", + "Rename": "Renombrar", + "Duplicate": "Duplicar", + "Delete": "Borrar", + "Change Color": "Cambiar color", + "Lock": "Bloquear", + "Unlock": "Desbloquear" +} diff --git a/platform/i18n/src/locales/es/index.js b/platform/i18n/src/locales/es/index.js index 80a1aaa94..b501e8597 100644 --- a/platform/i18n/src/locales/es/index.js +++ b/platform/i18n/src/locales/es/index.js @@ -5,6 +5,7 @@ import Common from './Common.json'; import DatePicker from './DatePicker.json'; import Header from './Header.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import SidePanel from './SidePanel.json'; import StudyBrowser from './StudyBrowser.json'; import StudyList from './StudyList.json'; @@ -20,6 +21,7 @@ export default { DatePicker, Header, MeasurementTable, + DataRow, SidePanel, StudyBrowser, StudyList, diff --git a/platform/i18n/src/locales/fr/AboutModal.json b/platform/i18n/src/locales/fr/AboutModal.json new file mode 100644 index 000000000..2158fddbd --- /dev/null +++ b/platform/i18n/src/locales/fr/AboutModal.json @@ -0,0 +1,16 @@ +{ + "About OHIF Viewer": "À propos d'OHIF Viewer", + "Browser": "Navigateur", + "Build number": "Numéro de build", + "Last master commits": "Derniers commits sur master", + "More details": "Plus de détails", + "Name": "Nom", + "OS": "Système d'exploitation", + "Report an issue": "Signaler un problème", + "Repository URL": "URL du dépôt", + "Value": "Valeur", + "Version information": "Informations sur la version", + "Visit the forum": "Visiter le forum", + "Commit Hash": "Numéro hash du commit", + "Current Browser & OS": "Navigateur et système d'exploitation actuels" +} diff --git a/platform/i18n/src/locales/fr/Buttons.json b/platform/i18n/src/locales/fr/Buttons.json index c97dfaac6..460b7aa1a 100644 --- a/platform/i18n/src/locales/fr/Buttons.json +++ b/platform/i18n/src/locales/fr/Buttons.json @@ -1,42 +1,131 @@ { "Acquired": "Acquis", "Angle": "Angle", + "Annotation": "Annotation", + "Arrow Annotate": "Annotation en flèche", "Axial": "Axial", - "Bidirectional": "Bi-directionel", + "Bidirectional Tool": "Outil bidirectionnel", + "Bidirectional": "Bidirectionnel", + "Bone": "Osseux", + "Brain": "Cérébral", "Brush": "Brosse", - "CINE": "Ciné", "Cancel": "Annuler", + "Capture": "Capturer", + "Cine": "Ciné", + "CINE": "Ciné", "Circle": "Cercle", + "Sphere": "Sphère", + "Cobb Angle": "Angle Cobb", "Clear": "Effacer", "Coronal": "Coronal", "Crosshairs": "Repère", + "Dicom Tag Browser": "Explorateur DICOM", + "Dismiss Aspect": "Désactiver l'aspect", + "Ellipse Tool": "Outil ellipse", "Ellipse": "Ellipse", "Elliptical": "Elliptique", - "Flip H": "Flip H", - "Flip V": "Flip V", + "Flip H": "Retourner H", + "Flip Horizontal": "Retourner horizontalement", + "Flip Horizontally": "Retourner horizontalement", + "Flip V": "Retourner V", "Freehand": "Main levée", + "Freehand ROI": "ROI à main levée", + "Spline ROI": "ROI spline", + "Livewire tool": "Outil Livewire", + "Livewire Contour": "Contour Livewire", + "Grid Layout": "Disposition en grille", + "Invert Colors": "Inverser les couleurs", "Invert": "Inverser", + "Image Overlay": "Superposition d'image", + "Image Slice Sync": "Synchronisation des coupes d'image", + "Keep Aspect": "Conserver les proportions", "Layout": "$t(Common:Layout)", + "Length Tool": "Outil de longueur", "Length": "Longueur", "Levels": "Niveaux", + "Liver": "Foie", + "Lung": "Poumon", "Magnify": "Agrandir", + "Magnify Probe": "Sonde de grossissement", "Manual": "Manuel", "Measurements": "Mesures", + "More Measure Tools": "Plus d'outils de mesure", + "More Tools": "Plus d'outils", "More": "$t(Common:More)", "Next": "$t(Common:Next)", "Pan": "Déplacer", "Play": "$t(Common:Play)", "Previous": "$t(Common:Previous)", "Probe": "Sonde", - "ROI Window": "ROI fenêtrage", + "Colorbar": "Barre de couleurs", "Rectangle": "Rectangle", + "Rectangle ROI Threshold": "Seuil ROI rectangle", + "Reference Lines": "Lignes de référence", + "Reset to defaults": "Réinitialiser les valeurs par défaut", + "Reset View": "Réinitialiser la vue", "Reset": "$t(Common:Reset)", - "Reset to defaults": "Valeurs d'usine", + "ROI Window": "Fenêtre ROI", + "Rotate +90": "Rotation +90°", "Rotate Right": "Tourner à droite", "Sagittal": "Sagittal", "Save": "Sauvegarder", - "Stack Scroll": "Défilement", + "Soft tissue": "Tissus mous", + "Stack Image Sync": "Synchronisation des piles", + "Stack Scroll": "Défilement de pile", "Stop": "$t(Common:Stop)", - "Themes": "Themes", - "Zoom": "Zoom" + "Themes": "Thèmes", + "Toggle Image Overlay": "Basculer la superposition d'image", + "Click to show or hide segment labels when hovering with your mouse.": "Cliquez pour afficher ou masquer les étiquettes de segment lorsque vous survolez avec la souris.", + "Ultrasound Directional": "Ultrason directionnel", + "Window Level Region": "Fenêtre/Niveau régional", + "W/L Presets": "Préréglages W/L", + "Window Level": "Fenêtre/Niveau", + "Segment Label Display": "Affichage des étiquettes de segment", + "Zoom": "Zoom", + "3D Rotate": "Rotation 3D", + "Shape": "Forme", + "Eraser": "Gomme", + "Threshold Tool": "Outil seuil", + "Threshold Tools": "Outils", + "Threshold": "Seuil", + "Shapes": "Formes", + "Not available on the current viewport": "Non disponible sur la fenêtre d'affichage actuelle", + "Select an MPR viewport to enable this tool": "Sélectionnez une vue MPR pour activer cet outil", + "Select a 3D viewport to enable this tool": "Sélectionnez une vue 3D pour activer cet outil", + "Select the PT Axial to enable this tool": "Sélectionnez la coupe axiale PT pour activer cet outil", + "Tool not available for this modality": "Outil non disponible pour cette modalité", + "Create new segmentation to enable this tool.": "Créez une segmentation pour activer cet outil.", + "Freehand Segmentation": "Segmentation à main levée", + "Spline Contour Segmentation Tool": "Outil de segmentation de contour spline", + "Sculptor Tool": "Outil de sculpture", + "Interpolate Contours": "Interpoler les contours", + "Spline Type": "Type de spline", + "Catmull Rom Spline": "Spline Catmull-Rom", + "Linear Spline": "Spline linéaire", + "B-Spline": "B-spline", + "Simplified Spline": "Spline simplifiée", + "Dynamic Cursor Size": "Taille du curseur dynamique", + "No segmentations available": "Aucune segmentation disponible", + "US Pleura B-line Annotation": "US Pleura B-line Annotation", + "Arrow Annotate Tool": "Arrow Annotate Tool", + "Labelmap Assist": "Assistance Labelmap", + "Interpolate Labelmap": "Interpolation du labelmap", + "One Click Segment": "Segmentation en un clic", + "Marker Guided Labelmap": "Labelmap guidé par marqueurs", + "Labelmap Edit with Contour Tool": "Outil d'édition de labelmap avec contour", + "Toggle AI assistance for segmenting nearby slices. After drawing on a slice, scroll to preview predictions. Press Enter to accept or Esc to skip.": "Activer l'assistance IA pour segmenter les coupes voisines. Après avoir dessiné sur une coupe, faites défiler pour prévisualiser les prédictions. Appuyez sur Entrée pour accepter ou Échap pour ignorer.", + "Automatically detects the largest length and width across slices for the selected segment and displays a bidirectional measurement.": "Détecte automatiquement la plus grande longueur et la plus grande largeur à travers les coupes pour le segment sélectionné et affiche une mesure bidirectionnelle.", + "Detects segmentable regions with one click. Hover for visual feedback—click when a plus sign appears to auto-segment the lesion.": "Détecte les régions segmentables en un clic. Survolez pour un retour visuel — cliquez lorsque le signe plus apparaît pour segmenter automatiquement la lésion.", + "Use include/exclude markers to guide AI (SAM) segmentation. Click to place markers, Enter to accept results, Esc to reject, and N to go to the next slice while keeping markers.": "Utilisez des marqueurs d'inclusion/exclusion pour guider la segmentation IA (SAM). Cliquez pour placer des marqueurs, Entrée pour accepter les résultats, Échap pour rejeter, et N pour passer à la coupe suivante en conservant les marqueurs." + , + "Automatically fill in missing slices between drawn segments. Use brush or threshold tools on at least two slices, then click to interpolate across slices. Works in any direction. Volume must be reconstructable.": "Remplit automatiquement les coupes manquantes entre les segments dessinés. Utilisez les outils brosse ou seuillage sur au moins deux coupes, puis cliquez pour interpoler entre les coupes. Fonctionne dans toutes les directions. Le volume doit être reconstruisible." + , + "Marker Mode": "Mode marqueur", + "Include": "Inclure", + "Exclude": "Exclure", + "Clear Markers": "Effacer les marqueurs" + , + "Radius (mm)": "Rayon (mm)", + "Dynamic": "Dynamique", + "Range": "Plage" } diff --git a/platform/i18n/src/locales/fr/CaptureViewportModal.json b/platform/i18n/src/locales/fr/CaptureViewportModal.json new file mode 100644 index 000000000..48e669ae0 --- /dev/null +++ b/platform/i18n/src/locales/fr/CaptureViewportModal.json @@ -0,0 +1,54 @@ +{ + "Capture": "Capture", + "Cancel": "$t(Common:Cancel)", + "Download": "$t(Common:Download)", + "Image size": "Taille de l'image", + "Image size in pixels": "Taille de l'image en pixels", + "File name": "Nom du fichier", + "Viewport to capture": "Fenêtre à capturer", + "Viewport Settings": "Paramètres de la fenêtre", + "General Settings": "Paramètres généraux", + "Resolution": "Résolution", + "Aspect Ratio": "Rapport d'aspect", + "Region of interest": "Région d'intérêt", + "Include annotations": "Inclure les annotations", + "Include measurements": "Inclure les mesures", + "Include patient info": "Inclure les informations patient", + "Include warning message": "Inclure un message d'avertissement", + "Width": "Largeur", + "Height": "Hauteur", + "Annotate on the capture": "Annoter sur la capture", + "Reset to defaults": "$t(Common:Reset)", + "Capture Options": "Options de capture", + "Add capture to reports": "Ajouter la capture aux rapports", + "Name": "Nom", + "Description": "Description", + "Create a new report or select an existing one to add the capture to": "Créer un nouveau rapport ou en sélectionner un existant pour y ajouter la capture", + "Create new report": "Créer un nouveau rapport", + "Add to existing report": "Ajouter à un rapport existant", + "Select report": "Sélectionner un rapport", + "Add capture": "Ajouter la capture", + "New report name": "Nom du nouveau rapport", + "New report description": "Description du nouveau rapport", + "Add capture to": "Ajouter la capture à", + "Selected report": "Rapport sélectionné", + "Capture options": "Options de capture", + "Fill background color": "Remplir avec la couleur de fond", + "Set to black": "Définir sur noir", + "Set to white": "Définir sur blanc", + "Set to image": "Définir selon l'image", + "Reset": "$t(Common:Reset)", + "Invert colors": "Inverser les couleurs", + "Apply changes": "Appliquer les modifications", + "Active viewport": "Fenêtre active", + "Thumbnail": "Vignette", + "Capture viewport": "Capturer la fenêtre", + "Apply ROI": "Appliquer le ROI", + "Actions": "Actions", + "Reset capture options": "Réinitialiser les options de capture", + "Clear selection": "Effacer la sélection", + "Add capture to report": "Ajouter la capture au rapport", + "Report name": "Nom du rapport", + "Report description": "Description du rapport", + "Error capturing viewport": "Erreur lors de la capture de la fenêtre" +} diff --git a/platform/i18n/src/locales/fr/Colormaps.json b/platform/i18n/src/locales/fr/Colormaps.json new file mode 100644 index 000000000..f5d97f39b --- /dev/null +++ b/platform/i18n/src/locales/fr/Colormaps.json @@ -0,0 +1,15 @@ +{ + "Grayscale": "Niveaux de gris", + "X Ray": "Rayons X", + "Isodose": "Isodose", + "hsv": "HSV", + "hot_iron": "Fer chaud", + "red_hot": "Rouge incandescent", + "s_pet": "TEP", + "perfusion": "Perfusion", + "rainbow_2": "Arc-en-ciel", + "suv": "SUV", + "ge_256": "GE 256", + "ge": "GE", + "siemens": "Siemens" +} diff --git a/platform/i18n/src/locales/fr/Common.json b/platform/i18n/src/locales/fr/Common.json index e1220f519..1860244d8 100644 --- a/platform/i18n/src/locales/fr/Common.json +++ b/platform/i18n/src/locales/fr/Common.json @@ -1,10 +1,29 @@ { + "Back to": "Retour à {{location}}", + "Cancel": "Annuler", + "Close": "Fermer", + "Enter your annotation": "Saisissez votre annotation", "Image": "Image", "Layout": "Disposition", + "LOAD": "CHARGER", + "Measurements": "Mesures", + "mm": "mm", "More": "Plus", "Next": "Suivant", - "Play": "Play", + "No": "Non", + "NoStudyDate": "Pas de date d'étude", + "localDateFormat": "DD MMM YYYY", + "Play": "Lecture", "Previous": "Précédent", - "Reset": "Reset", - "Stop": "Stop" + "Reset": "Réinitialiser", + "RowsPerPage": "Lignes par page", + "Save": "Enregistrer", + "Series": "Séries", + "Show": "Afficher", + "Stop": "Arrêter", + "StudyDate": "Date d'étude", + "Yes": "Oui", + "Foreground": "Avant-plan", + "SELECT A FOREGROUND": "SÉLECTIONNER UN AVANT-PLAN", + "SELECT A SEGMENTATION": "SÉLECTIONNER UNE SEGMENTATION" } diff --git a/platform/i18n/src/locales/fr/ContextMenu.json b/platform/i18n/src/locales/fr/ContextMenu.json new file mode 100644 index 000000000..40642f3b2 --- /dev/null +++ b/platform/i18n/src/locales/fr/ContextMenu.json @@ -0,0 +1,4 @@ +{ + "Add Label": "Ajouter une étiquette", + "Delete measurement": "Supprimer la mesure" +} diff --git a/platform/i18n/src/locales/fr/DataRow.json b/platform/i18n/src/locales/fr/DataRow.json new file mode 100644 index 000000000..e8e40d230 --- /dev/null +++ b/platform/i18n/src/locales/fr/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Masquer", + "Show": "Afficher", + "Rename": "Renommer", + "Duplicate": "Dupliquer", + "Delete": "Supprimer", + "Change Color": "Changer la couleur", + "Lock": "Verrouiller", + "Unlock": "Déverrouiller" +} diff --git a/platform/i18n/src/locales/fr/DatePicker.json b/platform/i18n/src/locales/fr/DatePicker.json new file mode 100644 index 000000000..f9725829a --- /dev/null +++ b/platform/i18n/src/locales/fr/DatePicker.json @@ -0,0 +1,13 @@ +{ + "Clear dates": "Effacer les dates", + "Close": "$t(Common:Close)", + "End Date": "Date de fin", + "Last 7 days": "7 derniers jours", + "Last 30 days": "30 derniers jours", + "Start Date": "Date de début", + "Today": "Aujourd'hui", + "Previous Month": "Mois précédent", + "Next Month": "Mois suivant", + "Select Month": "Sélectionner un mois", + "Select Year": "Sélectionner une année" +} diff --git a/platform/i18n/src/locales/fr/Dialog.json b/platform/i18n/src/locales/fr/Dialog.json new file mode 100644 index 000000000..89aec176f --- /dev/null +++ b/platform/i18n/src/locales/fr/Dialog.json @@ -0,0 +1,6 @@ +{ + "Enter your annotation": "$t(Common:Enter your annotation)", + "Cancel": "$t(Common:Cancel)", + "Save": "$t(Common:Save)", + "Provide a name for your report": "Indiquez un nom pour votre rapport" +} diff --git a/platform/i18n/src/locales/fr/ErrorBoundary.json b/platform/i18n/src/locales/fr/ErrorBoundary.json new file mode 100644 index 000000000..d4c132949 --- /dev/null +++ b/platform/i18n/src/locales/fr/ErrorBoundary.json @@ -0,0 +1,7 @@ +{ + "Sorry, something went wrong there. Try again.": "Désolé, une erreur est survenue. Réessayez.", + "Context": "Contexte", + "Error Message": "Message d'erreur", + "Stack": "Pile", + "Something went wrong": "Une erreur s'est produite" +} diff --git a/platform/i18n/src/locales/fr/Hps.json b/platform/i18n/src/locales/fr/Hps.json new file mode 100644 index 000000000..330651e09 --- /dev/null +++ b/platform/i18n/src/locales/fr/Hps.json @@ -0,0 +1,14 @@ +{ + "MPR": "MPR", + "3D four up": "3D quatre vues", + "Frame View": "Vue par image", + "Frame view for the active series": "Vue image par image pour la série active", + "3D main": "Vue principale 3D", + "mpr": "mpr", + "3D only": "3D seulement", + "3D primary": "3D principale", + "Axial Primary": "Axial principal", + "Compare Two Studies": "Comparer deux études", + "Compare two studies in various layouts": "Comparer deux études avec différentes dispositions", + "Mammography Breast Screening": "Dépistage mammographique" +} diff --git a/platform/i18n/src/locales/fr/Local.json b/platform/i18n/src/locales/fr/Local.json new file mode 100644 index 000000000..72e5d5dc2 --- /dev/null +++ b/platform/i18n/src/locales/fr/Local.json @@ -0,0 +1,4 @@ +{ + "Load files": "Charger des fichiers", + "Load folders": "Charger des dossiers" +} diff --git a/platform/i18n/src/locales/fr/MeasurementTable.json b/platform/i18n/src/locales/fr/MeasurementTable.json new file mode 100644 index 000000000..3e5de6202 --- /dev/null +++ b/platform/i18n/src/locales/fr/MeasurementTable.json @@ -0,0 +1,26 @@ +{ + "Criteria nonconformities": "Non-conformités aux critères", + "Delete": "Supprimer", + "Description": "Description", + "MAX": "MAX", + "NonTargets": "Non-cibles", + "Relabel": "Renommer", + "Measurements": "Mesures", + "Targets": "Cibles", + "Rename": "Renommer", + "Duplicate": "Dupliquer", + "Change Color": "Changer la couleur", + "Lock": "Verrouiller", + "Unlock": "Déverrouiller", + "Hide": "Masquer", + "Show": "Afficher", + "No, do not ask again": "Non, ne plus demander", + "Create SR": "Créer SR", + "empty": "(vide)", + "Export CSV": "Exporter CSV", + "No tracked measurements": "Aucune mesure suivie", + "Export": "Exporter", + "Create Report": "Créer un rapport", + "Do you want to add this measurement to the existing report?": "Souhaitez-vous ajouter cette mesure au rapport existant ?", + "Track measurements for this series?": "Suivre les mesures pour cette série ?" +} diff --git a/platform/i18n/src/locales/fr/Modals.json b/platform/i18n/src/locales/fr/Modals.json new file mode 100644 index 000000000..980155e0a --- /dev/null +++ b/platform/i18n/src/locales/fr/Modals.json @@ -0,0 +1,19 @@ +{ + "Active viewport has no displayed image": "La vue active n'affiche aucune image", + "Cancel": "$t(Common:Cancel)", + "Download": "Télécharger", + "The file name cannot be empty.": "Le nom du fichier ne peut pas être vide.", + "File Type": "Type de fichier", + "File Name": "Nom du fichier", + "formTitle": "Veuillez préciser les dimensions, le nom de fichier et le type souhaité pour l'image exportée.", + "Image height (px)": "Hauteur de l'image (px)", + "Image Preview": "Aperçu de l'image", + "Image preview": "Aperçu de l'image", + "Image width (px)": "Largeur de l'image (px)", + "keepAspectRatio": "Conserver les proportions", + "loadingPreview": "Chargement de l'aperçu de l'image...", + "The minimum valid height is 100px.": "La hauteur minimale autorisée est de 100 px.", + "The minimum valid width is 100px.": "La largeur minimale autorisée est de 100 px.", + "Show Annotations": "Afficher les annotations", + "Please specify the dimensions, filename, and desired type for the output image.": "Veuillez préciser les dimensions, le nom de fichier et le type souhaité pour l'image exportée." +} diff --git a/platform/i18n/src/locales/fr/Modes.json b/platform/i18n/src/locales/fr/Modes.json new file mode 100644 index 000000000..9069c3c0e --- /dev/null +++ b/platform/i18n/src/locales/fr/Modes.json @@ -0,0 +1,6 @@ +{ + "Basic Viewer": "Visionneuse de base", + "Total Metabolic Tumor Volume": "Volume tumoral métabolique total", + "Download High Quality Image": "Télécharger une image haute qualité", + "US Pleura B-line Annotations": "Annotations de plèvre et lignes B en échographie" +} diff --git a/platform/i18n/src/locales/fr/Notification.json b/platform/i18n/src/locales/fr/Notification.json new file mode 100644 index 000000000..3ab961027 --- /dev/null +++ b/platform/i18n/src/locales/fr/Notification.json @@ -0,0 +1,18 @@ +{ + "Do you want to add this measurement to the existing report?": "Souhaitez-vous ajouter cette mesure au rapport existant ?", + "Create new report": "Créer un nouveau rapport", + "Add to existing report": "Ajouter au rapport existant", + "Discard": "Ignorer", + "You have existing tracked measurements. What would you like to do with your existing tracked measurements?": "Des mesures suivies existent déjà. Que souhaitez-vous en faire ?", + "No, do not ask again for this series": "Non, ne plus demander pour cette série", + "No": "$t(Common:No)", + "Track measurements for this series?": "Suivre les mesures pour cette série ?", + "Yes": "$t(Common:Yes)", + "Cancel": "$t(Common:Cancel)", + "Measurements cannot span across multiple studies. Do you want to save your tracked measurements?": "Les mesures ne peuvent pas couvrir plusieurs études. Voulez-vous enregistrer vos mesures suivies ?", + "No, discard previously tracked series & measurements": "Non, abandonner les séries et mesures suivies précédemment", + "Do you want to continue tracking measurements for this study?": "Souhaitez-vous continuer à suivre les mesures pour cette étude ?", + "Create Report": "Créer un rapport", + "Measurements saved successfully": "Mesures enregistrées avec succès", + "Failed to store measurements": "Échec de l'enregistrement des mesures" +} diff --git a/platform/i18n/src/locales/fr/Onboarding.json b/platform/i18n/src/locales/fr/Onboarding.json new file mode 100644 index 000000000..8e59ff31b --- /dev/null +++ b/platform/i18n/src/locales/fr/Onboarding.json @@ -0,0 +1,27 @@ +{ + "Scrolling Through Images": "Défilement des images", + "You can scroll through the images using the mouse wheel or scrollbar.": "Vous pouvez faire défiler les images avec la molette de la souris ou la barre de défilement.", + "Zooming In and Out": "Zoom avant et arrière", + "You can zoom the images using the right click.": "Vous pouvez zoomer sur les images avec le clic droit.", + "Panning the Image": "Déplacement de l'image", + "You can pan the images using the middle click.": "Vous pouvez déplacer l'image avec le clic du milieu.", + "Adjusting Window Level": "Ajuster la fenêtre et le niveau", + "You can modify the window level using the left click.": "Vous pouvez modifier la fenêtre et le niveau avec le clic gauche.", + "Using the Measurement Tools": "Utiliser les outils de mesure", + "You can measure the length of a region using the Length tool.": "Vous pouvez mesurer la longueur d'une région avec l'outil Longueur.", + "Drawing Length Annotations": "Tracer des annotations de longueur", + "Use the length tool on the viewport to measure the length of a region.": "Utilisez l'outil Longueur dans la vue pour mesurer une région.", + "Tracking Measurements in the Panel": "Suivre les mesures dans le panneau", + "Click yes to track the measurements in the measurement panel.": "Cliquez sur Oui pour suivre les mesures dans le panneau des mesures.", + "Opening the Measurements Panel": "Ouvrir le panneau des mesures", + "Click the measurements button to open the measurements panel.": "Cliquez sur le bouton Mesures pour ouvrir le panneau des mesures.", + "Scrolling Away from a Measurement": "Défiler loin d'une mesure", + "Scroll the images using the mouse wheel away from the measurement.": "Défilez avec la molette pour vous éloigner de la mesure.", + "Jumping to Measurements in the Panel": "Aller à une mesure depuis le panneau", + "Click the measurement in the measurement panel to jump to it.": "Cliquez sur la mesure dans le panneau pour y accéder.", + "Changing Layout": "Changer de disposition", + "You can change the layout of the viewer using the layout button.": "Vous pouvez changer la disposition via le bouton Disposition.", + "Selecting the MPR Layout": "Sélectionner la disposition MPR", + "Select the MPR layout to view the images in MPR mode.": "Sélectionnez la disposition MPR pour afficher les images en mode MPR.", + "Skip all": "Tout passer" +} diff --git a/platform/i18n/src/locales/fr/PanelSUV.json b/platform/i18n/src/locales/fr/PanelSUV.json new file mode 100644 index 000000000..e92fb4bb6 --- /dev/null +++ b/platform/i18n/src/locales/fr/PanelSUV.json @@ -0,0 +1,10 @@ +{ + "Patient Information": "Informations patient", + "Patient Sex": "Sexe du patient", + "Weight": "Poids", + "Total Dose": "Dose totale", + "Half Life": "Demi-vie", + "Injection Time": "Heure d'injection", + "Acquisition Time": "Heure d'acquisition", + "Reload Data": "Recharger les données" +} diff --git a/platform/i18n/src/locales/fr/PatientInfo.json b/platform/i18n/src/locales/fr/PatientInfo.json new file mode 100644 index 000000000..03f3b04e4 --- /dev/null +++ b/platform/i18n/src/locales/fr/PatientInfo.json @@ -0,0 +1,8 @@ +{ + "Sex": "Sexe", + "Age": "Âge", + "MRN": "MRN", + "Thickness": "Épaisseur", + "Spacing": "Espacement", + "Scanner": "Scanner" +} diff --git a/platform/i18n/src/locales/fr/ROIThresholdConfiguration.json b/platform/i18n/src/locales/fr/ROIThresholdConfiguration.json new file mode 100644 index 000000000..11559e74c --- /dev/null +++ b/platform/i18n/src/locales/fr/ROIThresholdConfiguration.json @@ -0,0 +1,11 @@ +{ + "Max": "Max", + "Range": "Plage", + "Start": "Début", + "End": "Fin", + "Percentage of Max SUV": "Pourcentage du SUV max", + "Lower & Upper Ranges": "Plages inférieure et supérieure", + "Run": "Exécuter", + "Threshold Tools": "Outils de seuillage", + "ThresholdRange": "Seuillage" +} diff --git a/platform/i18n/src/locales/fr/SegmentationPanel.json b/platform/i18n/src/locales/fr/SegmentationPanel.json new file mode 100644 index 000000000..30081ef9b --- /dev/null +++ b/platform/i18n/src/locales/fr/SegmentationPanel.json @@ -0,0 +1,52 @@ +{ + "Opacity": "Opacité", + "Border": "Bordure", + "Show": "Afficher", + "Fill & Outline": "Remplissage et contour", + "Outline Only": "Contour uniquement", + "Fill Only": "Remplissage uniquement", + "Display inactive segmentations": "Afficher les segmentations inactives", + "Select a segmentation": "Sélectionner une segmentation", + "Segmentation": "Segmentation", + "Segmentations": "Segmentations", + "Add Segment": "Ajouter un segment", + "Contour tools": "Outils contour", + "Preview edits before creating": "Prévisualiser les modifications avant la création", + "Use center as segment index": "Utiliser le centre comme indice de segment", + "Hover on segment border to activate": "Survoler le bord du segment pour activer", + "Show segment name on hover": "Afficher le nom du segment au survol", + "Add segmentation": "Ajouter une segmentation", + "Create New Segmentation": "Créer une nouvelle segmentation", + "Manage Current Segmentation": "Gérer la segmentation actuelle", + "Remove from Viewport": "Retirer de la vue", + "Rename": "Renommer", + "Delete": "Supprimer", + "Labelmap tools": "Outils labelmap", + "Labelmap Segmentations": "Segmentations du labelmap", + "Download & Export": "Télécharger et exporter", + "Download": "Télécharger", + "Export": "Exporter", + "CSV Report": "Rapport CSV", + "DICOM SEG": "DICOM SEG", + "DICOM RTSS": "DICOM RTSS", + "Download DICOM RTSS": "Télécharger DICOM RTSS", + "Fill contour holes": "Remplir les trous de contour", + "Fill Holes": "Remplir les trous", + "Remove Small Contours": "Supprimer les petits contours", + "Area Threshold": "Seuil de surface", + "Create New Segment from Holes": "Créer un nouveau segment à partir des trous", + "Create New Segment": "Créer un nouveau segment", + "Smooth all edges": "Lisser tous les bords", + "Smooth Edges": "Lisser les bords", + "Remove extra points": "Supprimer les points supplémentaires", + "Remove Points": "Supprimer les points", + "Merge": "Fusionner", + "Intersect": "Intersection", + "Subtract": "Soustraire", + "Select a segment": "Sélectionner un segment", + "Create a new segment": "Créer un nouveau segment", + "New segment name": "Nom du nouveau segment", + "No segmentations available": "Aucune segmentation disponible", + "Not available on the current viewport": "Non disponible sur la fenêtre d'affichage actuelle", + "Add segment to enable this tool": "Ajoutez un segment pour activer cet outil" +} diff --git a/platform/i18n/src/locales/fr/SidePanel.json b/platform/i18n/src/locales/fr/SidePanel.json new file mode 100644 index 000000000..e9523f9f3 --- /dev/null +++ b/platform/i18n/src/locales/fr/SidePanel.json @@ -0,0 +1,6 @@ +{ + "Studies": "Études", + "Measurements": "Mesures", + "Measure": "Mesurer", + "Segmentation": "Segmentation" +} diff --git a/platform/i18n/src/locales/fr/StudyBrowser.json b/platform/i18n/src/locales/fr/StudyBrowser.json new file mode 100644 index 000000000..7c9da9318 --- /dev/null +++ b/platform/i18n/src/locales/fr/StudyBrowser.json @@ -0,0 +1,12 @@ +{ + "Primary": "Principal", + "Recent": "Récents", + "All": "Tous", + "Tracked Series": "Séries suivies", + "Tag Browser": "Explorateur DICOM", + "Add as Layer": "Ajouter en tant que couche", + "Series Number": "Numéro de série", + "Series Date": "Date de la série", + "Thumbnail Double Click": "Double-clic sur la vignette", + "The selected display sets could not be added to the viewport.": "Les ensembles d'affichage sélectionnés n'ont pas pu être ajoutés à la fenêtre." +} diff --git a/platform/i18n/src/locales/fr/StudyList.json b/platform/i18n/src/locales/fr/StudyList.json new file mode 100644 index 000000000..556bfdd57 --- /dev/null +++ b/platform/i18n/src/locales/fr/StudyList.json @@ -0,0 +1,29 @@ +{ + "Empty": "Vide", + "Filter list to 100 studies or less to enable sorting": "Filtrez la liste à 100 études ou moins pour activer le tri", + "Modality": "Modalité", + "PatientName": "Nom du patient", + "StudyDate": "Date de l'étude", + "StudyList": "Liste d'études", + "Patient Name": "Nom du patient", + "MRN": "Numéro DSN", + "Study date": "Date de l'étude", + "Description": "Description", + "Study list": "Liste d'études", + "Clear filters": "Effacer les filtres", + "ClearFilters": "Effacer les filtres", + "Number of studies": "Nombre d'études", + "Instances": "Instances", + "Accession": "Numéro d'accès", + "Results per page": "Résultats par page", + "Previous": "$t(Common:Previous)", + "Next": "$t(Common:Next)", + "Page": "Page", + "Start Date": "Date de début", + "Series": "Séries", + "Studies": "Études", + "No studies available": "Aucune étude disponible", + "Loading...": "Chargement...", + "Select...": "Sélectionner...", + "InstitutionName": "Établissement" +} diff --git a/platform/i18n/src/locales/fr/ToolbarLayoutSelector.json b/platform/i18n/src/locales/fr/ToolbarLayoutSelector.json new file mode 100644 index 000000000..93c8eddb9 --- /dev/null +++ b/platform/i18n/src/locales/fr/ToolbarLayoutSelector.json @@ -0,0 +1,9 @@ +{ + "Change layout": "Changer la disposition", + "Common": "Général", + "Advanced": "Avancé", + "Custom": "Personnalisé", + "Hover to select": "Survolez pour sélectionner", + "rows and columns": "lignes et colonnes", + "Click to apply": "Cliquez pour appliquer" +} diff --git a/platform/i18n/src/locales/fr/Tools.json b/platform/i18n/src/locales/fr/Tools.json new file mode 100644 index 000000000..352aa47d0 --- /dev/null +++ b/platform/i18n/src/locales/fr/Tools.json @@ -0,0 +1,13 @@ +{ + "Segmentation": "Segmentation", + "Segment": "Segment", + "Download High Quality Image": "Télécharger une image", + "Edit Segment Label": "Modifier l'étiquette de segment", + "Enter new label": "Saisir une nouvelle étiquette", + "Segment Color": "Couleur du segment", + "Edit Measurement Label": "Modifier l'étiquette de mesure", + "Edit Arrow Text": "Modifier le texte de la flèche", + "Enter new text": "Saisir un nouveau texte", + "Download Image": "Télécharger l'image", + "Image cannot be downloaded": "Impossible de télécharger l'image" +} diff --git a/platform/i18n/src/locales/fr/USAnnotationPanel.json b/platform/i18n/src/locales/fr/USAnnotationPanel.json new file mode 100644 index 000000000..615812bb2 --- /dev/null +++ b/platform/i18n/src/locales/fr/USAnnotationPanel.json @@ -0,0 +1,17 @@ +{ + "Workflow": "Flux de travail", + "Depth guide toggle": "Activer/désactiver le guide de profondeur", + "Show pleura percentage": "Afficher le pourcentage de plèvre", + "Sector Annotations": "Annotations de secteur", + "Pleura line": "Ligne de plèvre", + "B-line": "Ligne B", + "B-line annotation": "Annotation de ligne B", + "Pleura annotation": "Annotation de plèvre", + "Show Overlay": "Afficher la superposition", + "Annotated Frames": "Images annotées", + "Frame": "Image", + "Pleura lines": "Lignes de plèvre", + "B-lines": "Lignes B", + "JSON": "JSON", + "Annotations": "Annotations" +} diff --git a/platform/i18n/src/locales/fr/UserPreferencesModal.json b/platform/i18n/src/locales/fr/UserPreferencesModal.json index 424cfe98e..6fd014827 100644 --- a/platform/i18n/src/locales/fr/UserPreferencesModal.json +++ b/platform/i18n/src/locales/fr/UserPreferencesModal.json @@ -1,6 +1,81 @@ { - "Cancel": "$t(Buttons:Cancel)", - "Reset to defaults": "$t(Buttons:Reset to defaults)", - "Save": "$t(Buttons:Save)", - "User preferences": "Préférences utilisateur" + "Cancel": "$t(Common:Cancel)", + "Reset to defaults": "Réinitialiser aux valeurs par défaut", + "Save": "$t(Common:Save)", + "User preferences": "Préférences utilisateur", + "Language": "Langue", + "Select language": "Sélectionner une langue", + "Hotkeys": "Raccourcis clavier", + "Zoom": "$t(Buttons:Zoom)", + "Zoom In": "Zoom avant", + "Zoom Out": "Zoom arrière", + "Zoom to Fit": "Adapter à la fenêtre", + "Rotate Right": "$t(Buttons:Rotate Right)", + "Rotate Left": "Rotation à gauche", + "Flip Horizontally": "$t(Buttons:Flip Horizontally)", + "Flip Vertically": "Miroir vertical", + "Cine": "$t(Buttons:Cine)", + "Invert": "$t(Buttons:Invert)", + "Next Image Viewport": "Fenêtre image suivante", + "Previous Image Viewport": "Fenêtre image précédente", + "Previous Series": "Série précédente", + "Next Series": "Série suivante", + "Next Stage": "Étape suivante", + "Previous Stage": "Étape précédente", + "Next Image": "Image suivante", + "Previous Image": "Image précédente", + "First Image": "Première image", + "Last Image": "Dernière image", + "Reset": "$t(Common:Reset)", + "Cancel Measurement": "Annuler la mesure", + "W/L Preset 1": "Préréglage W/L 1", + "W/L Preset 2": "Préréglage W/L 2", + "W/L Preset 3": "Préréglage W/L 3", + "W/L Preset 4": "Préréglage W/L 4", + "Delete Annotation": "Supprimer l'annotation", + "Accept Preview": "Accepter l'aperçu", + "Reject Preview": "Rejeter l'aperçu", + "Undo": "Annuler", + "Redo": "Rétablir", + "Interpolate Scroll": "Interpolation du défilement", + "Increase Brush Size": "Augmenter la taille du pinceau", + "Decrease Brush Size": "Diminuer la taille du pinceau", + "Eraser": "Gomme", + "Brush": "$t(Buttons:Brush)", + "Add New Segment": "Ajouter un segment", + "Press keys": "Appuyez sur les touches...", + "LanguageName.en-US": "Anglais (États-Unis)", + "LanguageName.fr": "Français", + "HotkeyKeys.ctrl": "Ctrl", + "HotkeyKeys.shift": "Maj", + "HotkeyKeys.alt": "Alt", + "HotkeyKeys.option": "Option", + "HotkeyKeys.meta": "Cmd", + "HotkeyKeys.enter": "⏎", + "HotkeyKeys.esc": "esc", + "HotkeyKeys.space": "Espace", + "HotkeyKeys.tab": "Tab", + "HotkeyKeys.backspace": "⌫", + "HotkeyKeys.delete": "Suppr", + "HotkeyKeys.insert": "Inser", + "HotkeyKeys.home": "Origine", + "HotkeyKeys.end": "Fin", + "HotkeyKeys.pageup": "Page ↓", + "HotkeyKeys.pagedown": "Page ↑", + "HotkeyKeys.up": "↑", + "HotkeyKeys.down": "↓", + "HotkeyKeys.left": "←", + "HotkeyKeys.right": "→", + "HotkeyKeys.capslock": "Verr. maj", + "HotkeyKeys.plus": "Plus", + "HotkeyKeys.minus": "Moins", + "HotkeyKeys.comma": "Virgule", + "HotkeyKeys.period": "Point", + "HotkeyKeys.slash": "Barre oblique", + "HotkeyKeys.backslash": "Barre oblique inverse", + "HotkeyKeys.semicolon": "Point-virgule", + "HotkeyKeys.quote": "Guillemet", + "HotkeyKeys.backquote": "Accent grave", + "HotkeyKeys.bracketleft": "Crochet gauche", + "HotkeyKeys.bracketright": "Crochet droit" } diff --git a/platform/i18n/src/locales/fr/ViewportDownloadForm.json b/platform/i18n/src/locales/fr/ViewportDownloadForm.json new file mode 100644 index 000000000..6652af18a --- /dev/null +++ b/platform/i18n/src/locales/fr/ViewportDownloadForm.json @@ -0,0 +1,14 @@ +{ + "emptyFilenameError": "Le nom du fichier ne peut pas être vide.", + "fileType": "Type de fichier", + "filename": "Nom du fichier", + "formTitle": "Veuillez préciser les dimensions, le nom de fichier et le type souhaité pour l'image exportée.", + "imageHeight": "Hauteur de l'image (px)", + "imagePreview": "Aperçu de l'image", + "imageWidth": "Largeur de l'image (px)", + "keepAspectRatio": "Conserver les proportions", + "loadingPreview": "Chargement de l'aperçu de l'image...", + "minHeightError": "La hauteur minimale autorisée est de 100 px.", + "minWidthError": "La largeur minimale autorisée est de 100 px.", + "showAnnotations": "Afficher les annotations" +} diff --git a/platform/i18n/src/locales/fr/WindowLevelActionMenu.json b/platform/i18n/src/locales/fr/WindowLevelActionMenu.json new file mode 100644 index 000000000..8363701b1 --- /dev/null +++ b/platform/i18n/src/locales/fr/WindowLevelActionMenu.json @@ -0,0 +1,24 @@ +{ + "Back to Display Options": "Retour aux options d'affichage", + "Modality Presets": "Préréglages de modalité", + "Modality Window Presets": "Préréglages de fenêtre par modalité", + "Display Color bar": "Afficher la barre de couleurs", + "Color LUT": "LUT de couleur", + "Preview in viewport": "Prévisualiser dans la fenêtre", + "Grayscale": "Niveaux de gris", + "Rendering Options": "Options de rendu", + "Rendering Presets": "Préréglages de rendu", + "Search all": "Tout rechercher", + "Quality": "Qualité", + "Lighting": "Éclairage", + "Shade": "Ombrage", + "Ambient": "Ambiant", + "Diffuse": "Diffus", + "Specular": "Spéculaire", + "Shift": "Décalage", + "Soft tissue": "Tissus mous", + "Lung": "Poumon", + "Liver": "Foie", + "Bone": "Osseux", + "Brain": "Cérébral" +} diff --git a/platform/i18n/src/locales/fr/index.js b/platform/i18n/src/locales/fr/index.js index 2fabaff3a..7c695a58d 100644 --- a/platform/i18n/src/locales/fr/index.js +++ b/platform/i18n/src/locales/fr/index.js @@ -1,15 +1,69 @@ +import AboutModal from './AboutModal.json'; import Buttons from './Buttons.json'; import CineDialog from './CineDialog.json'; import Common from './Common.json'; +import DatePicker from './DatePicker.json'; import Header from './Header.json'; +import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; +import StudyList from './StudyList.json'; import UserPreferencesModal from './UserPreferencesModal.json'; +import ViewportDownloadForm from './ViewportDownloadForm.json'; +import StudyBrowser from './StudyBrowser.json'; +import SidePanel from './SidePanel.json'; +import Modes from './Modes.json'; +import PatientInfo from './PatientInfo.json'; +import Notification from './Notification.json'; +import ContextMenu from './ContextMenu.json'; +import Dialog from './Dialog.json'; +import Modals from './Modals.json'; +import Local from './Local.json'; +import ErrorBoundary from './ErrorBoundary.json'; +import Hps from './Hps.json'; +import ToolbarLayoutSelector from './ToolbarLayoutSelector.json'; +import WindowLevelActionMenu from './WindowLevelActionMenu.json'; +import CaptureViewportModal from './CaptureViewportModal.json'; +import Tools from './Tools.json'; +import SegmentationPanel from './SegmentationPanel.json'; +import Onboarding from './Onboarding.json'; +import Colormaps from './Colormaps.json'; +import PanelSUV from './PanelSUV.json'; +import ROIThresholdConfiguration from './ROIThresholdConfiguration.json'; +import USAnnotationPanel from './USAnnotationPanel.json'; export default { fr: { + AboutModal, Buttons, CineDialog, Common, + DatePicker, Header, + MeasurementTable, + DataRow, + StudyList, UserPreferencesModal, + ViewportDownloadForm, + StudyBrowser, + SidePanel, + Modes, + PatientInfo, + Notification, + ContextMenu, + Dialog, + Modals, + Local, + ErrorBoundary, + Hps, + ToolbarLayoutSelector, + WindowLevelActionMenu, + CaptureViewportModal, + Tools, + SegmentationPanel, + Onboarding, + Colormaps, + PanelSUV, + ROIThresholdConfiguration, + USAnnotationPanel, }, }; diff --git a/platform/i18n/src/locales/nl/AboutModal.json b/platform/i18n/src/locales/nl/AboutModal.json new file mode 100644 index 000000000..609314db8 --- /dev/null +++ b/platform/i18n/src/locales/nl/AboutModal.json @@ -0,0 +1,20 @@ +{ + "About OHIF Viewer": "Over OHIF Viewer", + "Browser": "Browser", + "Build number": "Buildnummer", + "Commit hash": "Commit hash", + "Commit Hash": "Commit Hash", + "Current Browser & OS": "Huidige Browser & OS", + "Data citation": "Data citatie", + "Important links": "Belangrijke links", + "Last master commits": "Laatste master commits", + "More details": "Meer details", + "Name": "Naam", + "OS": "OS", + "Report an issue": "Rapporteer een probleem", + "Repository URL": "Repository URL", + "Value": "Waarde", + "Version information": "Versie informatie", + "Version number": "Versienummer", + "Visit the forum": "Bezoek het forum" +} diff --git a/platform/i18n/src/locales/nl/Buttons.json b/platform/i18n/src/locales/nl/Buttons.json index 0443cffd1..3bb70b242 100644 --- a/platform/i18n/src/locales/nl/Buttons.json +++ b/platform/i18n/src/locales/nl/Buttons.json @@ -1,6 +1,160 @@ { + "Acquired": "Verworven", + "Angle": "Hoek", + "Annotation": "Annotatie", + "Axial": "Axiaal", + "Bidirectional": "Bidirectioneel", + "Brush": "Penseel", + "Cine": "Cine", + "Cancel": "Annuleren", + "Capture": "Vastleggen", "Circle": "Cirkel", - "More": "Meer", - "Pan": "Pan", - "Zoom": "Inzoomen" + "Sphere": "Bol", + "Clear": "Wissen", + "Coronal": "Coronaal", + "Crosshairs": "Kruisdraden", + "Download": "Downloaden", + "Ellipse": "Ellips", + "Elliptical": "Elliptisch", + "Flip H": "H omdraaien", + "Flip Horizontally": "Horizontaal omdraaien", + "Flip V": "V omdraaien", + "Freehand": "Vrije hand", + "Grid Layout": "Rasterindeling", + "Invert": "Omkeren", + "Layout": "$t(Common:Layout)", + "Length": "Lengte", + "Levels": "Niveaus", + "Magnify": "Vergroten", + "Manual": "Handmatig", + "Measurements": "Metingen", + "More": "$t(Common:More)", + "More Tools": "Meer gereedschappen", + "Next": "$t(Common:Next)", + "Pan": "Verschuiven", + "Play": "$t(Common:Play)", + "Previous": "$t(Common:Previous)", + "Probe": "Sonde", + "ROI Window": "ROI Venster", + "Rectangle": "Rechthoek", + "Reference Lines": "Referentielijnen", + "Reset": "$t(Common:Reset)", + "Reset to defaults": "Herstellen naar standaard", + "Rotate Right": "Rechtsom draaien", + "Sagittal": "Sagittaal", + "Save": "Opslaan", + "Stack Scroll": "Stack scrollen", + "Stack Image Sync": "Stack afbeelding synchronisatie", + "Stop": "$t(Common:Stop)", + "Themes": "Thema's", + "Zoom": "Inzoomen", + "Adjust window/level presets and customize image contrast settings": "Venster/niveau voorinstellingen aanpassen en afbeelding contrastinstellingen aanpassen", + "Zoom-in": "Inzoomen", + "Cobb Angle": "Cobb hoek", + "Calibration": "Kalibratie", + "Dicom Tag Browser": "DICOM Tag Browser", + "Magnify Probe": "Vergroot sonde", + "Ultrasound Directional": "Ultrasoon directioneel", + "Window Level Region": "Venster/Niveau regio", + "Image Overlay": "Afbeelding overlay", + "Image Slice Sync": "Afbeelding slice synchronisatie", + "Freehand ROI": "Vrije hand ROI", + "Spline ROI": "Spline ROI", + "Livewire tool": "Livewire gereedschap", + "Livewire Contour": "Livewire contour", + "Segment Label Display": "Segment label weergave", + "Data Overlay": "Data overlay", + "Configure data overlay options and manage foreground/background display sets": "Data overlay opties configureren en voorgrond/achtergrond weergave sets beheren", + "Orientation": "Oriëntatie", + "Change viewport orientation between axial, sagittal, coronal and reformat planes": "Viewport oriëntatie wijzigen tussen axiaal, sagittaal, coronaal en herformateer vlakken", + "Status": "Status", + "Navigation": "Navigatie", + "Navigate between segments/measurements and manage their visibility": "Navigeren tussen segmenten/metingen en hun zichtbaarheid beheren", + "Tracking Status": "Tracking status", + "View and manage tracking status of measurements and annotations": "Tracking status van metingen en annotaties bekijken en beheren", + "Advanced Window Level": "Geavanceerd venster/niveau", + "Advanced window/level settings with manual controls and presets": "Geavanceerde venster/niveau instellingen met handmatige bediening en voorinstellingen", + "Threshold": "Drempel", + "Image threshold settings": "Afbeelding drempelinstellingen", + "Opacity": "Doorzichtigheid", + "Image opacity settings": "Afbeelding doorzichtigheidsinstellingen", + "Colorbar": "Kleurenbalk", + "Enable position synchronization on stack viewports": "Positiesynchronisatie inschakelen op stack viewports", + "Show Reference Lines": "Referentielijnen tonen", + "Toggle Image Overlay": "Afbeelding overlay omschakelen", + "Calibration Line": "Kalibratielijn", + "Ellipse ROI": "Ellips ROI", + "Rectangle ROI": "Rechthoek ROI", + "Circle Tool": "Cirkel gereedschap", + "Click to show or hide segment labels when hovering with your mouse.": "Klik om segment labels te tonen of verbergen bij het zweven met uw muis.", + "Arrow Annotate": "Pijl annotatie", + "Bidirectional Tool": "Bidirectioneel gereedschap", + "Bone": "Bot", + "Brain": "Hersenen", + "Dismiss Aspect": "Aspect negeren", + "Ellipse Tool": "Ellips gereedschap", + "Flip Horizontal": "Horizontaal omdraaien", + "Invert Colors": "Kleuren omkeren", + "Keep Aspect": "Aspect behouden", + "Length Tool": "Lengte gereedschap", + "Liver": "Lever", + "Lung": "Long", + "More Measure Tools": "Meer meetgereedschappen", + "Reset View": "Weergave herstellen", + "Rotate +90": "Draaien +90", + "Soft tissue": "Zacht weefsel", + "W/L Presets": "W/L Voorinstellingen", + "Window Level": "Venster/Niveau", + "Point": "Punt", + "Point Tool": "Punt gereedschap", + "Polygon": "Veelhoek", + "Polygon Tool": "Veelhoek gereedschap", + "Box": "Doos", + "Box Tool": "Doos gereedschap", + "Freehand Polygon": "Vrije hand veelhoek", + "Freehand Polygon Tool": "Vrije hand veelhoek gereedschap", + "Freehand Line": "Vrije hand lijn", + "Freehand Line Tool": "Vrije hand lijn gereedschap", + "Line": "Lijn", + "Line Tool": "Lijn gereedschap", + "3D Rotate": "3D Draaien", + "Shape": "Vorm", + "MPR": "MPR", + "Rectangle ROI Threshold": "Rechthoek ROI drempel", + "Select the PT Axial to enable this tool": "Selecteer de PT Axiaal om dit gereedschap in te schakelen", + "Create new segmentation to enable this tool.": "Maak een nieuwe segmentatie om dit gereedschap in te schakelen.", + "Freehand Segmentation": "Vrije hand segmentatie", + "Spline Contour Segmentation Tool": "Spline contour segmentatie gereedschap", + "Sculptor Tool": "Beeldhouwer gereedschap", + "Interpolate Contours": "Contouren interpoleren", + "Marker Mode": "Markeermodus", + "Include": "Opnemen", + "Exclude": "Uitsluiten", + "Clear Markers": "Markeringen wissen", + "Radius (mm)": "Straal (mm)", + "Dynamic": "Dynamisch", + "Range": "Bereik", + "Spline Type": "Spline type", + "Catmull Rom Spline": "Catmull Rom Spline", + "Linear Spline": "Lineaire Spline", + "B-Spline": "B-Spline", + "Simplified Spline": "Vereenvoudigde Spline", + "Dynamic Cursor Size": "Dynamische cursor grootte", + "No segmentations available": "Geen segmentaties beschikbaar", + "Threshold Tool": "Drempel gereedschap", + "Threshold Tools": "Drempel gereedschappen", + "Select a 3D viewport to enable this tool": "Selecteer een 3D viewport om dit gereedschap in te schakelen", + "Not available on the current viewport": "Niet beschikbaar op de huidige viewport", + "Select an MPR viewport to enable this tool": "Selecteer een MPR viewport om dit gereedschap in te schakelen", + "Interpolate Labelmap": "Labelmap interpoleren", + "Segment Bidirectional": "Segment bidirectioneel", + "Tool not available for this modality": "Gereedschap niet beschikbaar voor deze modaliteit", + "One Click Segment": "Eén klik segment", + "Labelmap Assist": "Labelmap assistentie", + "Marker Guided Labelmap": "Marker geleide labelmap", + "Eraser": "Gum", + "Shapes": "Vormen", + "Create new segmentation to enable shapes tool.": "Maak een nieuwe segmentatie om vormen gereedschap in te schakelen.", + "US Pleura B-line Annotation": "US Pleura B-lijn annotatie", + "Arrow Annotate Tool": "Pijl annotatie gereedschap" } diff --git a/platform/i18n/src/locales/nl/CaptureViewportModal.json b/platform/i18n/src/locales/nl/CaptureViewportModal.json new file mode 100644 index 000000000..8aa546bf2 --- /dev/null +++ b/platform/i18n/src/locales/nl/CaptureViewportModal.json @@ -0,0 +1,9 @@ +{ + "File name": "Bestandsnaam", + "Image size": "Afbeelding grootte", + "Image size in pixels": "Afbeelding grootte in pixels", + "Include annotations": "Annotaties opnemen", + "Include warning message": "Waarschuwingsbericht opnemen", + "Width": "Breedte", + "Height": "Hoogte" +} diff --git a/platform/i18n/src/locales/nl/CineDialog.json b/platform/i18n/src/locales/nl/CineDialog.json new file mode 100644 index 000000000..ec56e11e4 --- /dev/null +++ b/platform/i18n/src/locales/nl/CineDialog.json @@ -0,0 +1,8 @@ +{ + "Next image": "$t(Common:Next) $t(Common:Image)", + "Play / Stop": "$t(Common:Play) / $t(Common:Stop)", + "Previous image": "$t(Common:Previous) $t(Common:Image)", + "Skip to first image": "Spring naar eerste $t(Common:Image)", + "Skip to last image": "Spring naar laatste $t(Common:Image)", + "fps": "fps" +} diff --git a/platform/i18n/src/locales/nl/Colormaps.json b/platform/i18n/src/locales/nl/Colormaps.json new file mode 100644 index 000000000..f432e06e9 --- /dev/null +++ b/platform/i18n/src/locales/nl/Colormaps.json @@ -0,0 +1,15 @@ +{ + "Grayscale": "Grijstinten", + "X Ray": "Röntgen", + "Isodose": "Isodose", + "hsv": "HSV", + "hot_iron": "Hete ijzer", + "red_hot": "Rood heet", + "s_pet": "PET", + "perfusion": "Perfusie", + "rainbow_2": "Regenboog 2", + "suv": "SUV", + "ge_256": "GE 256", + "ge": "GE", + "siemens": "Siemens" +} diff --git a/platform/i18n/src/locales/nl/Common.json b/platform/i18n/src/locales/nl/Common.json index d35764a7f..a914509f4 100644 --- a/platform/i18n/src/locales/nl/Common.json +++ b/platform/i18n/src/locales/nl/Common.json @@ -1,3 +1,29 @@ { - "More": "Meer" + "Back to": "Terug naar {{location}}", + "Close": "Sluiten", + "Image": "Afbeelding", + "Layout": "Indeling", + "LOAD": "LADEN", + "Measurements": "Metingen", + "mm": "mm", + "More": "Meer", + "Next": "Volgende", + "No": "Nee", + "NoStudyDate": "Geen studiedatum", + "Play": "Afspelen", + "Previous": "Vorige", + "Reset": "Herstellen", + "RowsPerPage": "rijen per pagina", + "Series": "Serie", + "Show": "Tonen", + "Stop": "Stoppen", + "StudyDate": "Studiedatum", + "Yes": "Ja", + "Cancel": "Annuleren", + "Save": "Opslaan", + "localDateFormat": "DD-MMM-YYYY", + "Back": "Terug", + "Foreground": "Voorgrond", + "SELECT A FOREGROUND": "SELECTEER EEN VOORGROND", + "SELECT A SEGMENTATION": "SELECTEER EEN SEGMENTATIE" } diff --git a/platform/i18n/src/locales/nl/DataRow.json b/platform/i18n/src/locales/nl/DataRow.json new file mode 100644 index 000000000..2b9aff6b8 --- /dev/null +++ b/platform/i18n/src/locales/nl/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Verbergen", + "Show": "Tonen", + "Rename": "Hernoemen", + "Duplicate": "Dupliceren", + "Delete": "Verwijderen", + "Change Color": "Kleur wijzigen", + "Lock": "Vergrendelen", + "Unlock": "Ontgrendelen" +} diff --git a/platform/i18n/src/locales/nl/DataSourceConfiguration.json b/platform/i18n/src/locales/nl/DataSourceConfiguration.json new file mode 100644 index 000000000..85c2f0b26 --- /dev/null +++ b/platform/i18n/src/locales/nl/DataSourceConfiguration.json @@ -0,0 +1,24 @@ +{ + "Configure Data Source": "Gegevensbron configureren", + "Data set": "Gegevensset", + "DICOM store": "DICOM opslag", + "Location": "Locatie", + "Project": "Project", + "Error fetching Data set list": "Fout bij ophalen van gegevenssets", + "Error fetching DICOM store list": "Fout bij ophalen van DICOM opslag", + "Error fetching Location list": "Fout bij ophalen van locaties", + "Error fetching Project list": "Fout bij ophalen van projecten", + "No Project available": "Geen projecten beschikbaar", + "No Location available": "Geen locaties beschikbaar", + "No Data set available": "Geen gegevenssets beschikbaar", + "No DICOM store available": "Geen DICOM opslag beschikbaar", + "Select": "Selecteren", + "Search Data set list": "Gegevenssets zoeken", + "Search DICOM store list": "DICOM opslag zoeken", + "Search Location list": "Locaties zoeken", + "Search Project list": "Projecten zoeken", + "Select Data set": "Selecteer een gegevensset", + "Select DICOM store": "Selecteer een DICOM opslag", + "Select Location": "Selecteer een locatie", + "Select Project": "Selecteer een project" +} diff --git a/platform/i18n/src/locales/nl/DatePicker.json b/platform/i18n/src/locales/nl/DatePicker.json new file mode 100644 index 000000000..853fe40f1 --- /dev/null +++ b/platform/i18n/src/locales/nl/DatePicker.json @@ -0,0 +1,13 @@ +{ + "Clear dates": "Datums wissen", + "Close": "$t(Common:Close)", + "End Date": "Einddatum", + "Last 7 days": "Laatste 7 dagen", + "Last 30 days": "Laatste 30 dagen", + "Start Date": "Startdatum", + "Today": "Vandaag", + "Previous Month": "Vorige maand", + "Next Month": "Volgende maand", + "Select Month": "Selecteer maand", + "Select Year": "Selecteer jaar" +} diff --git a/platform/i18n/src/locales/nl/ErrorBoundary.json b/platform/i18n/src/locales/nl/ErrorBoundary.json new file mode 100644 index 000000000..bdcefa7d8 --- /dev/null +++ b/platform/i18n/src/locales/nl/ErrorBoundary.json @@ -0,0 +1,8 @@ +{ + "Context": "Context", + "Error Message": "Foutmelding", + "Something went wrong": "Er is iets misgegaan", + "in": "in", + "Sorry, something went wrong there. Try again.": "Sorry, er is iets misgegaan. Probeer opnieuw.", + "Stack Trace": "Stack Trace" +} diff --git a/platform/i18n/src/locales/nl/Header.json b/platform/i18n/src/locales/nl/Header.json index 38995e7b6..a3f7cf7dd 100644 --- a/platform/i18n/src/locales/nl/Header.json +++ b/platform/i18n/src/locales/nl/Header.json @@ -1,7 +1,9 @@ { "About": "Over", + "Back to Viewer": "Terug naar Viewer", "INVESTIGATIONAL USE ONLY": "ALLEEN VOOR ONDERZOEK", "Options": "Opties", "Preferences": "Voorkeuren", - "Study list": "Studie Overzicht" + "Study list": "Studie overzicht", + "Logout": "Uitloggen" } diff --git a/platform/i18n/src/locales/nl/HotkeysValidators.json b/platform/i18n/src/locales/nl/HotkeysValidators.json new file mode 100644 index 000000000..0a1b6ccd8 --- /dev/null +++ b/platform/i18n/src/locales/nl/HotkeysValidators.json @@ -0,0 +1,6 @@ +{ + "Field can't be empty": "Veld mag niet leeg zijn", + "Hotkey is already in use": "\"{{action}}\" gebruikt al de \"{{pressedKeys}}\" sneltoets.", + "It's not possible to define only modifier keys (ctrl, alt and shift) as a shortcut": "Het is niet mogelijk om alleen modifier toetsen (ctrl, alt en shift) als sneltoets te definiëren", + "Shortcut combination is not allowed": "{{pressedKeys}} sneltoets combinatie is niet toegestaan" +} diff --git a/platform/i18n/src/locales/nl/Hps.json b/platform/i18n/src/locales/nl/Hps.json new file mode 100644 index 000000000..6e2a28049 --- /dev/null +++ b/platform/i18n/src/locales/nl/Hps.json @@ -0,0 +1,14 @@ +{ + "MPR": "MPR", + "3D four up": "3D vier weergaven", + "Frame View": "Frame weergave", + "Frame view for the active series": "Frame weergave voor de actieve serie", + "3D main": "3D hoofd", + "mpr": "mpr", + "3D only": "Alleen 3D", + "3D primary": "3D primair", + "Axial Primary": "Axiaal primair", + "Compare Two Studies": "Twee studies vergelijken", + "Compare two studies in various layouts": "Twee studies vergelijken in verschillende indelingen", + "Mammography Breast Screening": "Mammografie borstscreening" +} diff --git a/platform/i18n/src/locales/nl/MeasurementTable.json b/platform/i18n/src/locales/nl/MeasurementTable.json new file mode 100644 index 000000000..1e4e02ec8 --- /dev/null +++ b/platform/i18n/src/locales/nl/MeasurementTable.json @@ -0,0 +1,27 @@ +{ + "Criteria nonconformities": "Criteria niet-conformiteiten", + "Delete": "Verwijderen", + "Description": "Beschrijving", + "MAX": "MAX", + "Measurements": "Metingen", + "No, do not ask again": "Nee, vraag niet opnieuw", + "NonTargets": "Niet-doelwitten", + "Relabel": "Hernoemen", + "Targets": "Doelwitten", + "Rename": "Hernoemen", + "Duplicate": "Dupliceren", + "Change Color": "Kleur wijzigen", + "Lock": "Vergrendelen", + "Unlock": "Ontgrendelen", + "Hide": "Verbergen", + "Show": "Tonen", + "Create SR": "SR aanmaken", + "empty": "(leeg)", + "Track measurements for this series?": "Metingen voor deze serie volgen?", + "Do you want to add this measurement to the existing report?": "Wilt u deze meting toevoegen aan het bestaande rapport?", + "You have existing tracked measurements. What would you like to do with your existing tracked measurements?": "U heeft bestaande gevolgde metingen. Wat wilt u doen met uw bestaande gevolgde metingen?", + "Measurements cannot span across multiple studies. Do you want to save your tracked measurements?": "Metingen kunnen niet over meerdere studies verspreid zijn. Wilt u uw gevolgde metingen opslaan?", + "Do you want to continue tracking measurements for this study?": "Wilt u doorgaan met het volgen van metingen voor deze studie?", + "Do you want to open this Segmentation?": "Wilt u deze segmentatie openen?", + "There are unsaved measurements. Do you want to save it?": "Er zijn niet-opgeslagen metingen. Wilt u deze opslaan?" +} diff --git a/platform/i18n/src/locales/nl/Messages.json b/platform/i18n/src/locales/nl/Messages.json new file mode 100644 index 000000000..85984d01c --- /dev/null +++ b/platform/i18n/src/locales/nl/Messages.json @@ -0,0 +1,18 @@ +{ + "Display Set Messages": "Weergave set berichten", + "1": "Geen geldige instanties gevonden in serie.", + "2": "Weergave set heeft ontbrekende positie-informatie.", + "3": "Weergave set is geen reconstrueerbaar 3D volume.", + "4": "Multi-frame weergave sets hebben geen pixelmeting informatie.", + "5": "Multi-frame weergave sets hebben geen oriëntatie-informatie.", + "6": "Multi-frame weergave sets hebben geen positie-informatie.", + "7": "Weergave set heeft ontbrekende frames.", + "8": "Weergave set heeft onregelmatige afstand.", + "9": "Weergave set heeft inconsistente afmetingen tussen frames.", + "10": "Weergave set heeft frames met inconsistente aantal componenten.", + "11": "Weergave set heeft frames met inconsistente oriëntaties.", + "12": "Weergave set heeft inconsistente positie-informatie.", + "13": "Niet-ondersteunde weergave set.", + "14": "SOP Class UID {{ sopClassUid }} wordt niet ondersteund.", + "15": "Weergave set mist een SOP Class UID. Controleer het bestand." +} diff --git a/platform/i18n/src/locales/nl/Modes.json b/platform/i18n/src/locales/nl/Modes.json new file mode 100644 index 000000000..d1a9a10f4 --- /dev/null +++ b/platform/i18n/src/locales/nl/Modes.json @@ -0,0 +1,8 @@ +{ + "Basic Dev Viewer": "Basis Dev Viewer", + "Basic Test Mode": "Basis Test Modus", + "Basic Viewer": "Basis Viewer", + "Microscopy": "Microscopie", + "Segmentation": "Segmentatie", + "Total Metabolic Tumor Volume": "Totaal Metabool Tumor Volume" +} diff --git a/platform/i18n/src/locales/nl/Onboarding.json b/platform/i18n/src/locales/nl/Onboarding.json new file mode 100644 index 000000000..ade538fd4 --- /dev/null +++ b/platform/i18n/src/locales/nl/Onboarding.json @@ -0,0 +1,27 @@ +{ + "Scrolling Through Images": "Scrollen door afbeeldingen", + "You can scroll through the images using the mouse wheel or scrollbar.": "U kunt door de afbeeldingen scrollen met het muiswiel of de scrollbalk.", + "Zooming In and Out": "In- en uitzoomen", + "You can zoom the images using the right click.": "U kunt de afbeeldingen zoomen met rechts klikken.", + "Panning the Image": "Het beeld verschuiven", + "You can pan the images using the middle click.": "U kunt het beeld verschuiven met de middelste klik.", + "Adjusting Window Level": "Venster/niveau aanpassen", + "You can modify the window level using the left click.": "U kunt het venster/niveau aanpassen met links klikken.", + "Using the Measurement Tools": "Meetgereedschappen gebruiken", + "You can measure the length of a region using the Length tool.": "U kunt de lengte van een regio meten met het Lengte gereedschap.", + "Drawing Length Annotations": "Lengte annotaties tekenen", + "Use the length tool on the viewport to measure the length of a region.": "Gebruik het lengte gereedschap op de viewport om de lengte van een regio te meten.", + "Tracking Measurements in the Panel": "Metingen volgen in het paneel", + "Click yes to track the measurements in the measurement panel.": "Klik ja om de metingen te volgen in het meetpaneel.", + "Opening the Measurements Panel": "Het meetpaneel openen", + "Click the measurements button to open the measurements panel.": "Klik op de metingen knop om het meetpaneel te openen.", + "Scrolling Away from a Measurement": "Wegscrollen van een meting", + "Scroll the images using the mouse wheel away from the measurement.": "Scroll de afbeeldingen met het muiswiel weg van de meting.", + "Jumping to Measurements in the Panel": "Springen naar metingen in het paneel", + "Click the measurement in the measurement panel to jump to it.": "Klik op de meting in het meetpaneel om ernaartoe te springen.", + "Changing Layout": "Indeling wijzigen", + "You can change the layout of the viewer using the layout button.": "U kunt de indeling van de viewer wijzigen met de indeling knop.", + "Selecting the MPR Layout": "MPR indeling selecteren", + "Select the MPR layout to view the images in MPR mode.": "Selecteer de MPR indeling om de afbeeldingen in MPR modus te bekijken.", + "Skip all": "Alles overslaan" +} diff --git a/platform/i18n/src/locales/nl/PanelSUV.json b/platform/i18n/src/locales/nl/PanelSUV.json new file mode 100644 index 000000000..c163aee56 --- /dev/null +++ b/platform/i18n/src/locales/nl/PanelSUV.json @@ -0,0 +1,10 @@ +{ + "Patient Information": "Patiënt informatie", + "Patient Sex": "Patiënt geslacht", + "Weight": "Gewicht", + "Total Dose": "Totale dosis", + "Half Life": "Halfwaardetijd", + "Injection Time": "Injectietijd", + "Acquisition Time": "Verwervingstijd", + "Reload Data": "Gegevens herladen" +} diff --git a/platform/i18n/src/locales/nl/ROIThresholdConfiguration.json b/platform/i18n/src/locales/nl/ROIThresholdConfiguration.json new file mode 100644 index 000000000..e25606c59 --- /dev/null +++ b/platform/i18n/src/locales/nl/ROIThresholdConfiguration.json @@ -0,0 +1,11 @@ +{ + "Max": "Max", + "Range": "Bereik", + "Start": "Start", + "End": "Einde", + "Percentage of Max SUV": "Percentage van max SUV", + "Lower & Upper Ranges": "Onderste en bovenste bereiken", + "Run": "Uitvoeren", + "Threshold Tools": "Drempel gereedschappen", + "ThresholdRange": "Drempelbereik" +} diff --git a/platform/i18n/src/locales/nl/SegmentationPanel.json b/platform/i18n/src/locales/nl/SegmentationPanel.json new file mode 100644 index 000000000..adab261b1 --- /dev/null +++ b/platform/i18n/src/locales/nl/SegmentationPanel.json @@ -0,0 +1,65 @@ +{ + "Active": "Actief", + "Add new segmentation": "Nieuwe segmentatie toevoegen", + "Add segment": "Segment toevoegen", + "Add segmentation": "Segmentatie toevoegen", + "Contour": "Contour", + "Contour tools": "Contour gereedschappen", + "Contour Segmentations": "Contour segmentaties", + "Delete": "Verwijderen", + "Display inactive segmentations": "Inactieve segmentaties weergeven", + "Add Segment": "Segment toevoegen", + "Download DICOM RTSS": "DICOM RTSS downloaden", + "Export DICOM SEG": "DICOM SEG exporteren", + "Download DICOM SEG": "DICOM SEG downloaden", + "Download DICOM RTSTRUCT": "DICOM RTSTRUCT downloaden", + "Fill": "Vullen", + "Inactive segmentations": "Inactieve segmentaties", + "Labelmap": "Labelmap", + "Labelmap tools": "Labelmap gereedschappen", + "Labelmap Segmentations": "Labelmap segmentaties", + "Opacity": "Doorzichtigheid", + "Border": "Rand", + "Show": "Tonen", + "Fill & Outline": "Vullen en omlijning", + "Outline Only": "Alleen omlijning", + "Fill Only": "Alleen vullen", + "Outline": "Omlijning", + "Rename": "Hernoemen", + "Segmentation": "Segmentatie", + "Segmentations": "Segmentaties", + "Segmentation not supported": "Segmentatie niet ondersteund", + "Size": "Grootte", + "Preview edits before creating": "Bewerkingen voorvertonen voor aanmaken", + "Use center as segment index": "Gebruik centrum als segment index", + "Hover on segment border to activate": "Beweeg over segment rand om te activeren", + "Show segment name on hover": "Toon segment naam bij zweven", + "Create New Segmentation": "Nieuwe segmentatie aanmaken", + "Manage Current Segmentation": "Huidige segmentatie beheren", + "Remove from Viewport": "Verwijderen uit viewport", + "Download & Export": "Downloaden & Exporteren", + "Download": "Downloaden", + "Export": "Exporteren", + "CSV Report": "CSV Rapport", + "DICOM SEG": "DICOM SEG", + "DICOM RTSS": "DICOM RTSS", + "Fill contour holes": "Contour gaten vullen", + "Fill Holes": "Gaten vullen", + "Remove Small Contours": "Kleine contouren verwijderen", + "Area Threshold": "Oppervlakte drempel", + "Create New Segment from Holes": "Nieuw segment aanmaken van gaten", + "Create New Segment": "Nieuw segment aanmaken", + "Smooth all edges": "Alle randen glad maken", + "Smooth Edges": "Randen glad maken", + "Remove extra points": "Extra punten verwijderen", + "Remove Points": "Punten verwijderen", + "Merge": "Samenvoegen", + "Intersect": "Snijden", + "Subtract": "Aftrekken", + "Select a segment": "Selecteer een segment", + "Create a new segment": "Nieuw segment aanmaken", + "New segment name": "Nieuw segment naam", + "No segmentations available": "Geen segmentaties beschikbaar", + "Not available on the current viewport": "Niet beschikbaar op de huidige viewport", + "Add segment to enable this tool": "Voeg een segment toe om dit gereedschap in te schakelen" +} diff --git a/platform/i18n/src/locales/nl/SidePanel.json b/platform/i18n/src/locales/nl/SidePanel.json new file mode 100644 index 000000000..46462512c --- /dev/null +++ b/platform/i18n/src/locales/nl/SidePanel.json @@ -0,0 +1,4 @@ +{ + "Measurements": "Metingen", + "Studies": "Studieën" +} diff --git a/platform/i18n/src/locales/nl/StudyBrowser.json b/platform/i18n/src/locales/nl/StudyBrowser.json new file mode 100644 index 000000000..cec8f827c --- /dev/null +++ b/platform/i18n/src/locales/nl/StudyBrowser.json @@ -0,0 +1,12 @@ +{ + "Primary": "Primair", + "Recent": "Recent", + "All": "Alles", + "Tracked Series": "Gevolgde serie", + "Tag Browser": "Tag Browser", + "Add as Layer": "Toevoegen als laag", + "Series Number": "Serienummer", + "Series Date": "Seriedatum", + "Thumbnail Double Click": "Miniatuur dubbelklik", + "The selected display sets could not be added to the viewport.": "De geselecteerde weergave sets konden niet aan de viewport worden toegevoegd." +} diff --git a/platform/i18n/src/locales/nl/StudyItem.json b/platform/i18n/src/locales/nl/StudyItem.json new file mode 100644 index 000000000..9963b4687 --- /dev/null +++ b/platform/i18n/src/locales/nl/StudyItem.json @@ -0,0 +1,3 @@ +{ + "Tracked series": "{{trackedSeries}} Gevolgde serie" +} diff --git a/platform/i18n/src/locales/nl/StudyList.json b/platform/i18n/src/locales/nl/StudyList.json new file mode 100644 index 000000000..ac5ab0b83 --- /dev/null +++ b/platform/i18n/src/locales/nl/StudyList.json @@ -0,0 +1,21 @@ +{ + "AccessionNumber": "Accessie #", + "ClearFilters": "Filters wissen", + "Description": "Beschrijving", + "Empty": "Leeg", + "Filter list to 100 studies or less to enable sorting": "Filter de lijst tot 100 studies of minder om sorteren in te schakelen", + "Instances": "Instanties", + "Modality": "Modaliteit", + "MRN": "MRN", + "Next": "Volgende >", + "No studies available": "Geen studies beschikbaar", + "Number of studies": "Aantal studies", + "Page": "Pagina", + "PatientName": "Patiëntnaam", + "Previous": "< Terug", + "Results per page": "Resultaten per pagina", + "Studies": "Studieën", + "StudyDate": "Studiedatum", + "StudyList": "Studie lijst", + "Upload": "Uploaden" +} diff --git a/platform/i18n/src/locales/nl/ThumbnailTracked.json b/platform/i18n/src/locales/nl/ThumbnailTracked.json new file mode 100644 index 000000000..8d6d7af0d --- /dev/null +++ b/platform/i18n/src/locales/nl/ThumbnailTracked.json @@ -0,0 +1,5 @@ +{ + "Series is tracked": "Serie wordt gevolgd", + "Series is untracked": "Serie wordt niet gevolgd", + "Viewport": "Viewport" +} diff --git a/platform/i18n/src/locales/nl/ToolbarLayoutSelector.json b/platform/i18n/src/locales/nl/ToolbarLayoutSelector.json new file mode 100644 index 000000000..1004623f2 --- /dev/null +++ b/platform/i18n/src/locales/nl/ToolbarLayoutSelector.json @@ -0,0 +1,9 @@ +{ + "Change layout": "Indeling wijzigen", + "Common": "Algemeen", + "Advanced": "Geavanceerd", + "Custom": "Aangepast", + "Hover to select": "Zweven om te selecteren", + "rows and columns": "rijen en kolommen", + "Click to apply": "Klik om toe te passen" +} diff --git a/platform/i18n/src/locales/nl/Tools.json b/platform/i18n/src/locales/nl/Tools.json new file mode 100644 index 000000000..413b6d86c --- /dev/null +++ b/platform/i18n/src/locales/nl/Tools.json @@ -0,0 +1,13 @@ +{ + "Segmentation": "Segmentatie", + "Segment": "Segment", + "Download High Quality Image": "Hoge kwaliteit afbeelding downloaden", + "Edit Segment Label": "Segment label bewerken", + "Enter new label": "Voer nieuw label in", + "Segment Color": "Segment kleur", + "Edit Measurement Label": "Meting label bewerken", + "Edit Arrow Text": "Pijl tekst bewerken", + "Enter new text": "Voer nieuwe tekst in", + "Download Image": "Afbeelding downloaden", + "Image cannot be downloaded": "Afbeelding kan niet worden gedownload" +} diff --git a/platform/i18n/src/locales/nl/TooltipClipboard.json b/platform/i18n/src/locales/nl/TooltipClipboard.json new file mode 100644 index 000000000..3ea4b7c6c --- /dev/null +++ b/platform/i18n/src/locales/nl/TooltipClipboard.json @@ -0,0 +1,4 @@ +{ + "Copied": "Gekopieerd", + "Failed to copy": "Kopiëren mislukt" +} diff --git a/platform/i18n/src/locales/nl/TrackedCornerstoneViewport.json b/platform/i18n/src/locales/nl/TrackedCornerstoneViewport.json new file mode 100644 index 000000000..1b45e8ace --- /dev/null +++ b/platform/i18n/src/locales/nl/TrackedCornerstoneViewport.json @@ -0,0 +1,4 @@ +{ + "Series is tracked and can be viewed in the measurement panel": "Serie wordt gevolgd en kan worden bekeken in het meetpaneel", + "Measurements for untracked series will not be shown in the measurements panel": "Metingen voor niet-gevolgde series worden niet getoond in het meetpaneel" +} diff --git a/platform/i18n/src/locales/nl/UserPreferencesModal.json b/platform/i18n/src/locales/nl/UserPreferencesModal.json new file mode 100644 index 000000000..7022c59cc --- /dev/null +++ b/platform/i18n/src/locales/nl/UserPreferencesModal.json @@ -0,0 +1,84 @@ +{ + "Cancel": "$t(Buttons:Cancel)", + "No hotkeys found": "Geen sneltoetsen geconfigureerd voor deze applicatie. Sneltoetsen kunnen worden geconfigureerd in het app-config.js bestand van de applicatie.", + "Reset to defaults": "$t(Buttons:Reset to defaults)", + "ResetDefaultMessage": "Voorkeuren succesvol hersteld naar standaard.
U moet Opslaan om deze actie uit te voeren.", + "Save": "$t(Buttons:Save)", + "SaveMessage": "Voorkeuren opgeslagen", + "User preferences": "Gebruikersvoorkeuren", + "Language": "Taal", + "Select language": "Selecteer taal", + "Hotkeys": "Sneltoetsen", + "Zoom": "Inzoomen", + "Zoom In": "Inzoomen", + "Zoom Out": "Uitzoomen", + "Zoom to Fit": "Aanpassen aan scherm", + "Rotate Right": "Rechtsom draaien", + "Rotate Left": "Linksom draaien", + "Flip Horizontally": "Horizontaal omdraaien", + "Flip Vertically": "Verticaal omdraaien", + "Cine": "Cine", + "Invert": "Omkeren", + "Next Image Viewport": "Volgende afbeelding viewport", + "Previous Image Viewport": "Vorige afbeelding viewport", + "Previous Series": "Vorige serie", + "Next Series": "Volgende serie", + "Next Stage": "Volgende fase", + "Previous Stage": "Vorige fase", + "Next Image": "Volgende afbeelding", + "Previous Image": "Vorige afbeelding", + "First Image": "Eerste afbeelding", + "Last Image": "Laatste afbeelding", + "Reset": "Herstellen", + "Cancel Measurement": "Meting annuleren", + "W/L Preset 1": "W/L Voorinstelling 1", + "W/L Preset 2": "W/L Voorinstelling 2", + "W/L Preset 3": "W/L Voorinstelling 3", + "W/L Preset 4": "W/L Voorinstelling 4", + "Delete Annotation": "Annotatie verwijderen", + "Accept Preview": "Voorvertoning accepteren", + "Reject Preview": "Voorvertoning afwijzen", + "Undo": "Ongedaan maken", + "Redo": "Opnieuw doen", + "Interpolate Scroll": "Scroll interpoleren", + "Increase Brush Size": "Penseel grootte vergroten", + "Decrease Brush Size": "Penseel grootte verkleinen", + "Eraser": "Gum", + "Brush": "Penseel", + "Add New Segment": "Nieuw segment toevoegen", + "Press keys": "Druk toetsen...", + "LanguageName.en-US": "Engels (VS)", + "LanguageName.fr": "Frans", + "HotkeyKeys.ctrl": "Ctrl", + "HotkeyKeys.shift": "Shift", + "HotkeyKeys.alt": "Alt", + "HotkeyKeys.option": "Option", + "HotkeyKeys.meta": "Cmd", + "HotkeyKeys.enter": "Enter", + "HotkeyKeys.esc": "Esc", + "HotkeyKeys.space": "Spatie", + "HotkeyKeys.tab": "Tab", + "HotkeyKeys.backspace": "Backspace", + "HotkeyKeys.delete": "Delete", + "HotkeyKeys.insert": "Insert", + "HotkeyKeys.home": "Home", + "HotkeyKeys.end": "End", + "HotkeyKeys.pageup": "Pagina omhoog", + "HotkeyKeys.pagedown": "Pagina omlaag", + "HotkeyKeys.up": "Pijltje omhoog", + "HotkeyKeys.down": "Pijltje omlaag", + "HotkeyKeys.left": "Pijltje links", + "HotkeyKeys.right": "Pijltje rechts", + "HotkeyKeys.capslock": "Caps Lock", + "HotkeyKeys.plus": "Plus", + "HotkeyKeys.minus": "Minus", + "HotkeyKeys.comma": "Komma", + "HotkeyKeys.period": "Punt", + "HotkeyKeys.slash": "Schuine streep", + "HotkeyKeys.backslash": "Backslash", + "HotkeyKeys.semicolon": "Puntkomma", + "HotkeyKeys.quote": "Aanhalingsteken", + "HotkeyKeys.backquote": "Accent grave", + "HotkeyKeys.bracketleft": "Linker haak", + "HotkeyKeys.bracketright": "Rechter haak" +} diff --git a/platform/i18n/src/locales/nl/ViewportDownloadForm.json b/platform/i18n/src/locales/nl/ViewportDownloadForm.json new file mode 100644 index 000000000..487d36790 --- /dev/null +++ b/platform/i18n/src/locales/nl/ViewportDownloadForm.json @@ -0,0 +1,14 @@ +{ + "emptyFilenameError": "De bestandsnaam kan niet leeg zijn.", + "fileType": "Bestandstype", + "filename": "Bestandsnaam", + "formTitle": "Geef de afmetingen, bestandsnaam en gewenst type op voor de uitvoerafbeelding.", + "imageHeight": "Afbeelding hoogte (px)", + "imagePreview": "Afbeelding voorvertoning", + "imageWidth": "Afbeelding breedte (px)", + "keepAspectRatio": "Behoud aspectverhouding", + "loadingPreview": "Afbeelding voorvertoning laden...", + "minHeightError": "De minimum geldige hoogte is 100px.", + "minWidthError": "De minimum geldige breedte is 100px.", + "showAnnotations": "Annotaties tonen" +} diff --git a/platform/i18n/src/locales/nl/WindowLevelActionMenu.json b/platform/i18n/src/locales/nl/WindowLevelActionMenu.json new file mode 100644 index 000000000..f7ac4738c --- /dev/null +++ b/platform/i18n/src/locales/nl/WindowLevelActionMenu.json @@ -0,0 +1,19 @@ +{ + "Back to Display Options": "Terug naar weergave opties", + "Modality Presets": "Modaliteit voorinstellingen", + "Modality Window Presets": "Modaliteit venster voorinstellingen", + "Display Color bar": "Kleurenbalk weergeven", + "Color LUT": "Kleur LUT", + "Preview in viewport": "Voorvertoning in viewport", + "Grayscale": "Grijstinten", + "Rendering Options": "Render opties", + "Rendering Presets": "Render voorinstellingen", + "Search all": "Alles zoeken", + "Quality": "Kwaliteit", + "Lighting": "Verlichting", + "Shade": "Schaduw", + "Ambient": "Omgevingslicht", + "Diffuse": "Diffuus", + "Specular": "Spiegelend", + "Shift": "Verschuiving" +} diff --git a/platform/i18n/src/locales/nl/index.js b/platform/i18n/src/locales/nl/index.js index de42f561e..d1703aca0 100644 --- a/platform/i18n/src/locales/nl/index.js +++ b/platform/i18n/src/locales/nl/index.js @@ -1,11 +1,69 @@ +import AboutModal from './AboutModal.json'; import Buttons from './Buttons.json'; +import CineDialog from './CineDialog.json'; import Common from './Common.json'; +import DataSourceConfiguration from './DataSourceConfiguration.json'; +import DatePicker from './DatePicker.json'; +import ErrorBoundary from './ErrorBoundary.json'; import Header from './Header.json'; +import HotkeysValidators from './HotkeysValidators.json'; +import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; +import Modes from './Modes.json'; +import SegmentationPanel from './SegmentationPanel.json'; +import SidePanel from './SidePanel.json'; +import StudyBrowser from './StudyBrowser.json'; +import StudyItem from './StudyItem.json'; +import StudyList from './StudyList.json'; +import TooltipClipboard from './TooltipClipboard.json'; +import ThumbnailTracked from './ThumbnailTracked.json'; +import TrackedCornerstoneViewport from './TrackedCornerstoneViewport.json'; +import UserPreferencesModal from './UserPreferencesModal.json'; +import ViewportDownloadForm from './ViewportDownloadForm.json'; +import Messages from './Messages.json'; +import WindowLevelActionMenu from './WindowLevelActionMenu.json'; +import CaptureViewportModal from './CaptureViewportModal.json'; +import Hps from './Hps.json'; +import ToolbarLayoutSelector from './ToolbarLayoutSelector.json'; +import Tools from './Tools.json'; +import Onboarding from './Onboarding.json'; +import Colormaps from './Colormaps.json'; +import PanelSUV from './PanelSUV.json'; +import ROIThresholdConfiguration from './ROIThresholdConfiguration.json'; export default { nl: { + AboutModal, Buttons, + CineDialog, Common, + DataSourceConfiguration, + DatePicker, + ErrorBoundary, Header, + HotkeysValidators, + MeasurementTable, + DataRow, + Modes, + SegmentationPanel, + SidePanel, + StudyBrowser, + StudyItem, + StudyList, + TooltipClipboard, + ThumbnailTracked, + TrackedCornerstoneViewport, + UserPreferencesModal, + ViewportDownloadForm, + Messages, + WindowLevelActionMenu, + CaptureViewportModal, + Hps, + ToolbarLayoutSelector, + Tools, + Onboarding, + Colormaps, + PanelSUV, + ROIThresholdConfiguration, }, }; diff --git a/platform/i18n/src/locales/pt-BR/DataRow.json b/platform/i18n/src/locales/pt-BR/DataRow.json new file mode 100644 index 000000000..ae47e5684 --- /dev/null +++ b/platform/i18n/src/locales/pt-BR/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Ocultar", + "Show": "Mostrar", + "Rename": "Renomear", + "Duplicate": "Duplicar", + "Delete": "Excluir", + "Change Color": "Alterar cor", + "Lock": "Bloquear", + "Unlock": "Desbloquear" +} diff --git a/platform/i18n/src/locales/pt-BR/index.js b/platform/i18n/src/locales/pt-BR/index.js index 2dcc04c2b..6b3bd64d3 100644 --- a/platform/i18n/src/locales/pt-BR/index.js +++ b/platform/i18n/src/locales/pt-BR/index.js @@ -6,6 +6,7 @@ import DatePicker from './DatePicker.json'; import Header from './Header.json'; import UserPreferencesModal from './UserPreferencesModal.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import Messages from './Messages.json'; export default { @@ -18,6 +19,7 @@ export default { Header, UserPreferencesModal, MeasurementTable, + DataRow, Messages, }, }; diff --git a/platform/i18n/src/locales/ru/DataRow.json b/platform/i18n/src/locales/ru/DataRow.json new file mode 100644 index 000000000..01aaa2384 --- /dev/null +++ b/platform/i18n/src/locales/ru/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Скрыть", + "Show": "Показать", + "Rename": "Переименовать", + "Duplicate": "Дублировать", + "Delete": "Удалить", + "Change Color": "Изменить цвет", + "Lock": "Заблокировать", + "Unlock": "Разблокировать" +} diff --git a/platform/i18n/src/locales/ru/SegmentationTable.json b/platform/i18n/src/locales/ru/SegmentationPanel.json similarity index 69% rename from platform/i18n/src/locales/ru/SegmentationTable.json rename to platform/i18n/src/locales/ru/SegmentationPanel.json index 461aba73e..cffb151b8 100644 --- a/platform/i18n/src/locales/ru/SegmentationTable.json +++ b/platform/i18n/src/locales/ru/SegmentationPanel.json @@ -14,5 +14,8 @@ "Outline": "Контур", "Rename": "Переименовать", "Segmentation": "Сегментация", - "Size": "Размер" + "Size": "Размер", + "No segmentations available": "Нет доступных сегментаций", + "Not available on the current viewport": "Недоступно в текущем окне просмотра", + "Add segment to enable this tool": "Добавьте сегмент, чтобы включить этот инструмент" } diff --git a/platform/i18n/src/locales/ru/index.js b/platform/i18n/src/locales/ru/index.js index f53aa5de5..a6ba6e59f 100644 --- a/platform/i18n/src/locales/ru/index.js +++ b/platform/i18n/src/locales/ru/index.js @@ -9,8 +9,9 @@ import Header from './Header.json'; import HotkeysValidators from './HotkeysValidators.json'; import InvestigationalUseDialog from './InvestigationalUseDialog.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import Modes from './Modes.json'; -import SegmentationTable from './SegmentationTable.json'; +import SegmentationPanel from './SegmentationPanel.json'; import SidePanel from './SidePanel.json'; import StudyBrowser from './StudyBrowser.json'; import StudyItem from './StudyItem.json'; @@ -36,8 +37,9 @@ export default { HotkeysValidators, InvestigationalUseDialog, MeasurementTable, + DataRow, Modes, - SegmentationTable, + SegmentationPanel, SidePanel, StudyBrowser, StudyItem, diff --git a/platform/i18n/src/locales/test-LNG/Buttons.json b/platform/i18n/src/locales/test-LNG/Buttons.json index 1a8b4a8be..c92896576 100644 --- a/platform/i18n/src/locales/test-LNG/Buttons.json +++ b/platform/i18n/src/locales/test-LNG/Buttons.json @@ -9,6 +9,7 @@ "Cancel": "Test Cancel", "Capture": "Test Capture", "Circle": "Test Circle", + "Sphere": "Test Sphere", "Clear": "Test Clear", "Coronal": "Test Coronal", "Crosshairs": "Test Crosshairs", @@ -60,6 +61,7 @@ "Freehand ROI": "Test Freehand ROI", "Spline ROI": "Test Spline ROI", "Livewire tool": "Test Livewire tool", + "Livewire Contour": "Test Livewire Contour", "Segment Label Display": "Test Segment Label Display", "Data Overlay": "Test Data Overlay", "Configure data overlay options and manage foreground/background display sets": "Test Configure data overlay options and manage foreground/background display sets", @@ -116,15 +118,37 @@ "Line": "Test Line", "Line Tool": "Test Line Tool", "3D Rotate": "Test 3D Rotate", + "Shape": "Test Shape", "MPR": "Test MPR", "Rectangle ROI Threshold": "Test Rectangle ROI Threshold", "Select the PT Axial to enable this tool": "Test Select the PT Axial to enable this tool", "Create new segmentation to enable this tool.": "Test Create new segmentation to enable this tool.", + "Freehand Segmentation": "Test Freehand Segmentation", + "Spline Contour Segmentation Tool": "Test Spline Contour Segmentation Tool", + "Sculptor Tool": "Test Sculptor Tool", + "Interpolate Contours": "Test Interpolate Contours", + "Marker Mode": "Test Marker Mode", + "Include": "Test Include", + "Exclude": "Test Exclude", + "Clear Markers": "Test Clear Markers", + "Radius (mm)": "Test Radius (mm)", + "Dynamic": "Test Dynamic", + "Range": "Test Range", + "Spline Type": "Test Spline Type", + "Catmull Rom Spline": "Test Catmull Rom Spline", + "Linear Spline": "Test Linear Spline", + "B-Spline": "Test B-Spline", + "Simplified Spline": "Test Simplified Spline", + "Dynamic Cursor Size": "Test Dynamic Cursor Size", + "No segmentations available": "Test No segmentations available", "Threshold Tool": "Test Threshold Tool", + "Threshold Tools": "Test Threshold Tools", "Select a 3D viewport to enable this tool": "Test Select a 3D viewport to enable this tool", + "Not available on the current viewport": "Test Not available on the current viewport", "Select an MPR viewport to enable this tool": "Test Select an MPR viewport to enable this tool", "Interpolate Labelmap": "Test Interpolate Labelmap", "Segment Bidirectional": "Test Segment Bidirectional", + "Tool not available for this modality": "Test Tool not available for this modality", "One Click Segment": "Test One Click Segment", "Labelmap Assist": "Test Labelmap Assist", "Marker Guided Labelmap": "Test Marker Guided Labelmap", diff --git a/platform/i18n/src/locales/test-LNG/CaptureViewportModal.json b/platform/i18n/src/locales/test-LNG/CaptureViewportModal.json index 923d93b11..6fe85588a 100644 --- a/platform/i18n/src/locales/test-LNG/CaptureViewportModal.json +++ b/platform/i18n/src/locales/test-LNG/CaptureViewportModal.json @@ -1,6 +1,9 @@ { "File name": "Test File name", "Image size": "Test Image size", + "Image size in pixels": "Test Image size in pixels", "Include annotations": "Test Include annotations", - "Include warning message": "Test Include warning message" + "Include warning message": "Test Include warning message", + "Width": "Test Width", + "Height": "Test Height" } diff --git a/platform/i18n/src/locales/test-LNG/Colormaps.json b/platform/i18n/src/locales/test-LNG/Colormaps.json new file mode 100644 index 000000000..d4a725b31 --- /dev/null +++ b/platform/i18n/src/locales/test-LNG/Colormaps.json @@ -0,0 +1,15 @@ +{ + "Grayscale": "Test Grayscale", + "X Ray": "Test X Ray", + "Isodose": "Test Isodose", + "hsv": "Test HSV", + "hot_iron": "Test Hot Iron", + "red_hot": "Test Red Hot", + "s_pet": "Test PET", + "perfusion": "Test Perfusion", + "rainbow_2": "Test Rainbow 2", + "suv": "Test SUV", + "ge_256": "Test GE 256", + "ge": "Test GE", + "siemens": "Test Siemens" +} diff --git a/platform/i18n/src/locales/test-LNG/Common.json b/platform/i18n/src/locales/test-LNG/Common.json index 48ba31014..82ab6c0f1 100644 --- a/platform/i18n/src/locales/test-LNG/Common.json +++ b/platform/i18n/src/locales/test-LNG/Common.json @@ -22,5 +22,8 @@ "LOAD": "Test LOAD", "NoStudyDate": "Test No Study Date", "localDateFormat": "\\T\\e\\s\\t MM/DD/YYYY", - "Back": "Test Back" + "Back": "Test Back", + "Foreground": "Test Foreground", + "SELECT A FOREGROUND": "Test SELECT A FOREGROUND", + "SELECT A SEGMENTATION": "Test SELECT A SEGMENTATION" } diff --git a/platform/i18n/src/locales/test-LNG/DataRow.json b/platform/i18n/src/locales/test-LNG/DataRow.json new file mode 100644 index 000000000..c5903642e --- /dev/null +++ b/platform/i18n/src/locales/test-LNG/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Test Hide", + "Show": "Test Show", + "Rename": "Test Rename", + "Duplicate": "Test Duplicate", + "Delete": "Test Delete", + "Change Color": "Test Change Color", + "Lock": "Test Lock", + "Unlock": "Test Unlock" +} diff --git a/platform/i18n/src/locales/test-LNG/DataSourceConfiguration.json b/platform/i18n/src/locales/test-LNG/DataSourceConfiguration.json new file mode 100644 index 000000000..6739a048d --- /dev/null +++ b/platform/i18n/src/locales/test-LNG/DataSourceConfiguration.json @@ -0,0 +1,24 @@ +{ + "Configure Data Source": "Test Configure Data Source", + "Data set": "Test Data set", + "DICOM store": "Test DICOM store", + "Location": "Test Location", + "Project": "Test Project", + "Error fetching Data set list": "Test Error fetching data sets", + "Error fetching DICOM store list": "Test Error fetching DICOM stores", + "Error fetching Location list": "Test Error fetching locations", + "Error fetching Project list": "Test Error fetching projects", + "No Project available": "Test No projects available", + "No Location available": "Test No locations available", + "No Data set available": "Test No data sets available", + "No DICOM store available": "Test No DICOM stores available", + "Select": "Test Select", + "Search Data set list": "Test Search data sets", + "Search DICOM store list": "Test Search DICOM stores", + "Search Location list": "Test Search locations", + "Search Project list": "Test Search projects", + "Select Data set": "Test Select a data Set", + "Select DICOM store": "Test Select a DICOM store", + "Select Location": "Test Select a location", + "Select Project": "Test Select a project" +} diff --git a/platform/i18n/src/locales/test-LNG/Hps.json b/platform/i18n/src/locales/test-LNG/Hps.json index a2ec7e520..d3fe1b9c5 100644 --- a/platform/i18n/src/locales/test-LNG/Hps.json +++ b/platform/i18n/src/locales/test-LNG/Hps.json @@ -7,5 +7,8 @@ "mpr": "Test mpr", "3D only": "Test 3D only", "3D primary": "Test 3D primary", - "Axial Primary": "Test Axial Primary" + "Axial Primary": "Test Axial Primary", + "Compare Two Studies": "Test Compare Two Studies", + "Compare two studies in various layouts": "Test Compare two studies in various layouts", + "Mammography Breast Screening": "Test Mammography Breast Screening" } diff --git a/platform/i18n/src/locales/test-LNG/Messages.json b/platform/i18n/src/locales/test-LNG/Messages.json index acf153cac..31aff7ccb 100644 --- a/platform/i18n/src/locales/test-LNG/Messages.json +++ b/platform/i18n/src/locales/test-LNG/Messages.json @@ -12,5 +12,7 @@ "10": "Test Display set has frames with inconsistent number of components.", "11": "Test Display set has frames with inconsistent orientations.", "12": "Test Display set has inconsistent position information.", - "13": "Test Unsupported display set." + "13": "Test Unsupported display set.", + "14": "Test SOP Class UID {{ sopClassUid }} is not supported.", + "15": "Test Display Set is missing a SOP Class UID. Please check the file." } diff --git a/platform/i18n/src/locales/test-LNG/Modes.json b/platform/i18n/src/locales/test-LNG/Modes.json index a9f03e232..a563bd5a1 100644 --- a/platform/i18n/src/locales/test-LNG/Modes.json +++ b/platform/i18n/src/locales/test-LNG/Modes.json @@ -4,5 +4,6 @@ "Basic Viewer": "Test Basic Viewer", "Microscopy": "Test Microscopy", "Segmentation": "Test Segmentation", - "Total Metabolic Tumor Volume": "Test Total Metabolic Tumor Volume" + "Total Metabolic Tumor Volume": "Test Total Metabolic Tumor Volume", + "US Pleura B-line Annotations": "Test US Pleura B-line Annotations" } diff --git a/platform/i18n/src/locales/test-LNG/Onboarding.json b/platform/i18n/src/locales/test-LNG/Onboarding.json new file mode 100644 index 000000000..c4b696b93 --- /dev/null +++ b/platform/i18n/src/locales/test-LNG/Onboarding.json @@ -0,0 +1,27 @@ +{ + "Scrolling Through Images": "Test Scrolling Through Images", + "You can scroll through the images using the mouse wheel or scrollbar.": "Test You can scroll through the images using the mouse wheel or scrollbar.", + "Zooming In and Out": "Test Zooming In and Out", + "You can zoom the images using the right click.": "Test You can zoom the images using the right click.", + "Panning the Image": "Test Panning the Image", + "You can pan the images using the middle click.": "Test You can pan the images using the middle click.", + "Adjusting Window Level": "Test Adjusting Window Level", + "You can modify the window level using the left click.": "Test You can modify the window level using the left click.", + "Using the Measurement Tools": "Test Using the Measurement Tools", + "You can measure the length of a region using the Length tool.": "Test You can measure the length of a region using the Length tool.", + "Drawing Length Annotations": "Test Drawing Length Annotations", + "Use the length tool on the viewport to measure the length of a region.": "Test Use the length tool on the viewport to measure the length of a region.", + "Tracking Measurements in the Panel": "Test Tracking Measurements in the Panel", + "Click yes to track the measurements in the measurement panel.": "Test Click yes to track the measurements in the measurement panel.", + "Opening the Measurements Panel": "Test Opening the Measurements Panel", + "Click the measurements button to open the measurements panel.": "Test Click the measurements button to open the measurements panel.", + "Scrolling Away from a Measurement": "Test Scrolling Away from a Measurement", + "Scroll the images using the mouse wheel away from the measurement.": "Test Scroll the images using the mouse wheel away from the measurement.", + "Jumping to Measurements in the Panel": "Test Jumping to Measurements in the Panel", + "Click the measurement in the measurement panel to jump to it.": "Test Click the measurement in the measurement panel to jump to it.", + "Changing Layout": "Test Changing Layout", + "You can change the layout of the viewer using the layout button.": "Test You can change the layout of the viewer using the layout button.", + "Selecting the MPR Layout": "Test Selecting the MPR Layout", + "Select the MPR layout to view the images in MPR mode.": "Test Select the MPR layout to view the images in MPR mode.", + "Skip all": "Test Skip all" +} diff --git a/platform/i18n/src/locales/test-LNG/PanelSUV.json b/platform/i18n/src/locales/test-LNG/PanelSUV.json new file mode 100644 index 000000000..90d59e53e --- /dev/null +++ b/platform/i18n/src/locales/test-LNG/PanelSUV.json @@ -0,0 +1,10 @@ +{ + "Patient Information": "Test Patient Information", + "Patient Sex": "Test Patient Sex", + "Weight": "Test Weight", + "Total Dose": "Test Total Dose", + "Half Life": "Test Half Life", + "Injection Time": "Test Injection Time", + "Acquisition Time": "Test Acquisition Time", + "Reload Data": "Test Reload Data" +} diff --git a/platform/i18n/src/locales/test-LNG/ROIThresholdConfiguration.json b/platform/i18n/src/locales/test-LNG/ROIThresholdConfiguration.json new file mode 100644 index 000000000..1e9655d1a --- /dev/null +++ b/platform/i18n/src/locales/test-LNG/ROIThresholdConfiguration.json @@ -0,0 +1,11 @@ +{ + "Max": "Test Max", + "Range": "Test Range", + "Start": "Test Start", + "End": "Test End", + "Percentage of Max SUV": "Test Percentage of Max SUV", + "Lower & Upper Ranges": "Test Lower & Upper Ranges", + "Run": "Test Run", + "Threshold Tools": "Test Threshold Tools", + "ThresholdRange": "Test Threshold Range" +} diff --git a/platform/i18n/src/locales/test-LNG/SegmentationPanel.json b/platform/i18n/src/locales/test-LNG/SegmentationPanel.json new file mode 100644 index 000000000..f4aa60c1d --- /dev/null +++ b/platform/i18n/src/locales/test-LNG/SegmentationPanel.json @@ -0,0 +1,66 @@ +{ + "Active": "Test Active", + "Add new segmentation": "Test Add new segmentation", + "Add segment": "Test Add segment", + "Add segmentation": "Test Add segmentation", + "Contour": "Test Contour", + "Contour tools": "Test Contour tools", + "Contour Segmentations": "Contour segmentations", + "Delete": "Test Delete", + "Display inactive segmentations": "Test Display inactive segmentations", + "Add Segment": "Test Add Segment", + "Download DICOM RTSS": "Test Download DICOM RTSS", + "Export DICOM SEG": "Test Export DICOM SEG", + "Download DICOM SEG": "Test Download DICOM SEG", + "Download DICOM RTSTRUCT": "Test Download DICOM RTSTRUCT", + "Fill": "Test Fill", + "Inactive segmentations": "Test Inactive segmentations", + "Labelmap": "Test Label map", + "Labelmap tools": "Test Label map tools", + "Labelmap Segmentations": "Test Label map segmentations", + "Opacity": "Test Opacity", + "Border": "Test Border", + "Show": "Test Show", + "Fill & Outline": "Test Fill & Outline", + "Outline Only": "Test Outline Only", + "Fill Only": "Test Fill Only", + "Outline": "Test Outline", + "Rename": "Test Rename", + "Segmentation": "Test Segmentation", + "Segmentations": "Test Segmentations", + "Segmentation not supported": "Test Segmentation not supported", + "Size": "Test Size", + "Preview edits before creating": "Test Preview edits before creating", + "Use center as segment index": "Test Use center as segment index", + "Hover on segment border to activate": "Test Hover on segment border to activate", + "Show segment name on hover": "Test Show segment name on hover", + "Create New Segmentation": "Test Create New Segmentation", + "Manage Current Segmentation": "Test Manage Current Segmentation", + "Remove from Viewport": "Test Remove from Viewport", + "Download & Export": "Test Download & Export", + "Download": "Test Download", + "Export": "Test Export", + "CSV Report": "Test CSV Report", + "DICOM SEG": "Test DICOM SEG", + "DICOM RTSS": "Test DICOM RTSS", + "Fill contour holes": "Test Fill contour holes", + "Fill Holes": "Test Fill Holes", + "Remove Small Contours": "Test Remove Small Contours", + "Area Threshold": "Test Area Threshold", + "Create New Segment from Holes": "Test Create New Segment from Holes", + "Create New Segment": "Test Create New Segment", + "Smooth all edges": "Test Smooth all edges", + "Smooth Edges": "Test Smooth Edges", + "Remove extra points": "Test Remove extra points", + "Remove Points": "Test Remove Points", + "Merge": "Test Merge", + "Intersect": "Test Intersect", + "Subtract": "Test Subtract", + "Select a segment": "Test Select a segment", + "Select a segmentation": "Test Select a segmentation", + "Create a new segment": "Test Create a new segment", + "New segment name": "Test New segment name", + "No segmentations available": "Test No segmentations available", + "Not available on the current viewport": "Test Not available on the current viewport", + "Add segment to enable this tool": "Test Add segment to enable this tool" +} diff --git a/platform/i18n/src/locales/test-LNG/SegmentationTable.json b/platform/i18n/src/locales/test-LNG/SegmentationTable.json deleted file mode 100644 index 31eb2f6e0..000000000 --- a/platform/i18n/src/locales/test-LNG/SegmentationTable.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "Active": "Test Active", - "Add new segmentation": "Test Add new segmentation", - "Add segment": "Test Add segment", - "Add segmentation": "Test Add segmentation", - "Contour": "Test Contour", - "Contour tools": "Test Contour tools", - "Contour Segmentations": "Contour segmentations", - "Delete": "Test Delete", - "Display inactive segmentations": "Test Display inactive segmentations", - "Download DICOM RTSS": "Test Download DICOM RTSS", - "Export DICOM SEG": "Test Export DICOM SEG", - "Download DICOM SEG": "Test Download DICOM SEG", - "Download DICOM RTSTRUCT": "Test Download DICOM RTSTRUCT", - "Fill": "Test Fill", - "Inactive segmentations": "Test Inactive segmentations", - "Labelmap": "Test Label map", - "Labelmap tools": "Test Label map tools", - "Labelmap Segmentations": "Test Label map segmentations", - "Opacity": "Test Opacity", - "Outline": "Test Outline", - "Rename": "Test Rename", - "Segmentation": "Test Segmentation", - "Segmentation not supported": "Test Segmentation not supported", - "Size": "Test Size" -} diff --git a/platform/i18n/src/locales/test-LNG/StudyBrowser.json b/platform/i18n/src/locales/test-LNG/StudyBrowser.json index 160a466df..220b9f6a0 100644 --- a/platform/i18n/src/locales/test-LNG/StudyBrowser.json +++ b/platform/i18n/src/locales/test-LNG/StudyBrowser.json @@ -1,5 +1,12 @@ { "Primary": "Test Primary", "Recent": "Test Recent", - "All": "Test All" + "All": "Test All", + "Tracked Series": "Test Tracked Series", + "Tag Browser": "Test Tag Browser", + "Add as Layer": "Test Add as Layer", + "Series Number": "Test Series Number", + "Series Date": "Test Series Date", + "Thumbnail Double Click": "Test Thumbnail Double Click", + "The selected display sets could not be added to the viewport.": "Test The selected display sets could not be added to the viewport." } diff --git a/platform/i18n/src/locales/test-LNG/USAnnotationPanel.json b/platform/i18n/src/locales/test-LNG/USAnnotationPanel.json new file mode 100644 index 000000000..49bb7453e --- /dev/null +++ b/platform/i18n/src/locales/test-LNG/USAnnotationPanel.json @@ -0,0 +1,17 @@ +{ + "Workflow": "Test Workflow", + "Depth guide toggle": "Test Depth guide toggle", + "Show pleura percentage": "Test Show pleura percentage", + "Sector Annotations": "Test Sector Annotations", + "Pleura line": "Test Pleura line", + "B-line": "Test B-line", + "B-line annotation": "Test B-line annotation", + "Pleura annotation": "Test Pleura annotation", + "Show Overlay": "Test Show Overlay", + "Annotated Frames": "Test Annotated Frames", + "Frame": "Test Frame", + "Pleura lines": "Test Pleura lines", + "B-lines": "Test B-lines", + "JSON": "Test JSON", + "Annotations": "Test Annotations" +} diff --git a/platform/i18n/src/locales/test-LNG/UserPreferencesModal.json b/platform/i18n/src/locales/test-LNG/UserPreferencesModal.json index e6c003fec..ccc262aec 100644 --- a/platform/i18n/src/locales/test-LNG/UserPreferencesModal.json +++ b/platform/i18n/src/locales/test-LNG/UserPreferencesModal.json @@ -9,6 +9,79 @@ "Function": "Test function", "Shortcut": "Test shortcut", "Language": "Test language", + "Select language": "Test Select language", "Hotkeys": "Test hotkeys", - "General": "Test general" + "General": "Test general", + "Zoom": "Test Zoom", + "Zoom In": "Test Zoom In", + "Zoom Out": "Test Zoom Out", + "Zoom to Fit": "Test Zoom to Fit", + "Rotate Right": "Test Rotate Right", + "Rotate Left": "Test Rotate Left", + "Flip Horizontally": "Test Flip Horizontally", + "Flip Vertically": "Test Flip Vertically", + "Cine": "Test Cine", + "Invert": "Test Invert", + "Next Image Viewport": "Test Next Image Viewport", + "Previous Image Viewport": "Test Previous Image Viewport", + "Previous Series": "Test Previous Series", + "Next Series": "Test Next Series", + "Next Stage": "Test Next Stage", + "Previous Stage": "Test Previous Stage", + "Next Image": "Test Next Image", + "Previous Image": "Test Previous Image", + "First Image": "Test First Image", + "Last Image": "Test Last Image", + "Reset": "Test Reset", + "Cancel Measurement": "Test Cancel Measurement", + "W/L Preset 1": "Test W/L Preset 1", + "W/L Preset 2": "Test W/L Preset 2", + "W/L Preset 3": "Test W/L Preset 3", + "W/L Preset 4": "Test W/L Preset 4", + "Delete Annotation": "Test Delete Annotation", + "Accept Preview": "Test Accept Preview", + "Reject Preview": "Test Reject Preview", + "Undo": "Test Undo", + "Redo": "Test Redo", + "Interpolate Scroll": "Test Interpolate Scroll", + "Increase Brush Size": "Test Increase Brush Size", + "Decrease Brush Size": "Test Decrease Brush Size", + "Eraser": "Test Eraser", + "Brush": "Test Brush", + "Add New Segment": "Test Add New Segment", + "Press keys": "Test Press keys...", + "LanguageName.en-US": "Test English (US)", + "LanguageName.fr": "Test French", + "HotkeyKeys.ctrl": "Test Ctrl", + "HotkeyKeys.shift": "Test Shift", + "HotkeyKeys.alt": "Test Alt", + "HotkeyKeys.option": "Test Option", + "HotkeyKeys.meta": "Test Cmd", + "HotkeyKeys.enter": "Test Enter", + "HotkeyKeys.esc": "Test Esc", + "HotkeyKeys.space": "Test Space", + "HotkeyKeys.tab": "Test Tab", + "HotkeyKeys.backspace": "Test Backspace", + "HotkeyKeys.delete": "Test Delete", + "HotkeyKeys.insert": "Test Insert", + "HotkeyKeys.home": "Test Home", + "HotkeyKeys.end": "Test End", + "HotkeyKeys.pageup": "Test Page Up", + "HotkeyKeys.pagedown": "Test Page Down", + "HotkeyKeys.up": "Test Up Arrow", + "HotkeyKeys.down": "Test Down Arrow", + "HotkeyKeys.left": "Test Left Arrow", + "HotkeyKeys.right": "Test Right Arrow", + "HotkeyKeys.capslock": "Test Caps Lock", + "HotkeyKeys.plus": "Test Plus", + "HotkeyKeys.minus": "Test Minus", + "HotkeyKeys.comma": "Test Comma", + "HotkeyKeys.period": "Test Period", + "HotkeyKeys.slash": "Test Slash", + "HotkeyKeys.backslash": "Test Backslash", + "HotkeyKeys.semicolon": "Test Semicolon", + "HotkeyKeys.quote": "Test Quote", + "HotkeyKeys.backquote": "Test Backtick", + "HotkeyKeys.bracketleft": "Test Left Bracket", + "HotkeyKeys.bracketright": "Test Right Bracket" } diff --git a/platform/i18n/src/locales/test-LNG/WindowLevelActionMenu.json b/platform/i18n/src/locales/test-LNG/WindowLevelActionMenu.json index 584c356f3..d52caf1fc 100644 --- a/platform/i18n/src/locales/test-LNG/WindowLevelActionMenu.json +++ b/platform/i18n/src/locales/test-LNG/WindowLevelActionMenu.json @@ -6,5 +6,14 @@ "Color LUT": "Test Color LUT", "Preview in viewport": "Test Preview in viewport", "Grayscale": "Test Grayscale", - "Rendering Options": "Test Rendering Options" + "Rendering Options": "Test Rendering Options", + "Rendering Presets": "Test Rendering Presets", + "Search all": "Test Search all", + "Quality": "Test Quality", + "Lighting": "Test Lighting", + "Shade": "Test Shade", + "Ambient": "Test Ambient", + "Diffuse": "Test Diffuse", + "Specular": "Test Specular", + "Shift": "Test Shift" } diff --git a/platform/i18n/src/locales/test-LNG/index.js b/platform/i18n/src/locales/test-LNG/index.js index 165c7da18..64059c1bf 100644 --- a/platform/i18n/src/locales/test-LNG/index.js +++ b/platform/i18n/src/locales/test-LNG/index.js @@ -2,16 +2,22 @@ import AboutModal from './AboutModal.json'; import Buttons from './Buttons.json'; import CineDialog from './CineDialog.json'; import Common from './Common.json'; +import Colormaps from './Colormaps.json'; +import DataSourceConfiguration from './DataSourceConfiguration.json'; import DatePicker from './DatePicker.json'; import ErrorBoundary from './ErrorBoundary.json'; import Header from './Header.json'; import HotkeysValidators from './HotkeysValidators.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import Messages from './Messages.json'; import Modals from './Modals.json'; import Modes from './Modes.json'; +import Onboarding from './Onboarding.json'; +import PanelSUV from './PanelSUV.json'; import PatientInfo from './PatientInfo.json'; -import SegmentationTable from './SegmentationTable.json'; +import ROIThresholdConfiguration from './ROIThresholdConfiguration.json'; +import SegmentationPanel from './SegmentationPanel.json'; import SidePanel from './SidePanel.json'; import StudyBrowser from './StudyBrowser.json'; import StudyItem from './StudyItem.json'; @@ -27,6 +33,7 @@ import CaptureViewportModal from './CaptureViewportModal.json'; import Tools from './Tools.json'; import Hps from './Hps.json'; import ToolbarLayoutSelector from './ToolbarLayoutSelector.json'; +import USAnnotationPanel from './USAnnotationPanel.json'; export default { 'test-LNG': { @@ -34,16 +41,22 @@ export default { Buttons, CineDialog, Common, + Colormaps, + DataSourceConfiguration, DatePicker, ErrorBoundary, Header, HotkeysValidators, MeasurementTable, + DataRow, Messages, Modals, Modes, + Onboarding, + PanelSUV, PatientInfo, - SegmentationTable, + ROIThresholdConfiguration, + SegmentationPanel, SidePanel, StudyBrowser, StudyItem, @@ -59,5 +72,6 @@ export default { Tools, Hps, ToolbarLayoutSelector, + USAnnotationPanel, }, }; diff --git a/platform/i18n/src/locales/tr-TR/DataRow.json b/platform/i18n/src/locales/tr-TR/DataRow.json new file mode 100644 index 000000000..b1439e097 --- /dev/null +++ b/platform/i18n/src/locales/tr-TR/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "Gizle", + "Show": "Göster", + "Rename": "Yeniden Adlandır", + "Duplicate": "Çoğalt", + "Delete": "Sil", + "Change Color": "Rengi Değiştir", + "Lock": "Kilitle", + "Unlock": "Kilidi Aç" +} diff --git a/platform/i18n/src/locales/tr-TR/index.js b/platform/i18n/src/locales/tr-TR/index.js index 174822bd3..7594ff0e8 100644 --- a/platform/i18n/src/locales/tr-TR/index.js +++ b/platform/i18n/src/locales/tr-TR/index.js @@ -5,6 +5,7 @@ import Common from './Common.json'; import DatePicker from './DatePicker.json'; import Header from './Header.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import StudyList from './StudyList.json'; import UserPreferencesModal from './UserPreferencesModal.json'; import ViewportDownloadForm from './ViewportDownloadForm.json'; @@ -18,6 +19,7 @@ export default { DatePicker, Header, MeasurementTable, + DataRow, StudyList, UserPreferencesModal, ViewportDownloadForm, diff --git a/platform/i18n/src/locales/zh/DataRow.json b/platform/i18n/src/locales/zh/DataRow.json new file mode 100644 index 000000000..40a203acb --- /dev/null +++ b/platform/i18n/src/locales/zh/DataRow.json @@ -0,0 +1,10 @@ +{ + "Hide": "隐藏", + "Show": "显示", + "Rename": "重命名", + "Duplicate": "复制", + "Delete": "删除", + "Change Color": "更改颜色", + "Lock": "锁定", + "Unlock": "解锁" +} diff --git a/platform/i18n/src/locales/zh/index.js b/platform/i18n/src/locales/zh/index.js index 75ad65c6f..43a1f8217 100644 --- a/platform/i18n/src/locales/zh/index.js +++ b/platform/i18n/src/locales/zh/index.js @@ -5,6 +5,7 @@ import Common from './Common.json'; import DatePicker from './DatePicker.json'; import Header from './Header.json'; import MeasurementTable from './MeasurementTable.json'; +import DataRow from './DataRow.json'; import StudyList from './StudyList.json'; import UserPreferencesModal from './UserPreferencesModal.json'; import ViewportDownloadForm from './ViewportDownloadForm.json'; @@ -33,6 +34,7 @@ export default { DatePicker, Header, MeasurementTable, + DataRow, StudyList, UserPreferencesModal, ViewportDownloadForm, diff --git a/platform/ui-next/src/components/Calendar/Calendar.tsx b/platform/ui-next/src/components/Calendar/Calendar.tsx index f6479d142..877f6c4d2 100644 --- a/platform/ui-next/src/components/Calendar/Calendar.tsx +++ b/platform/ui-next/src/components/Calendar/Calendar.tsx @@ -1,6 +1,24 @@ import * as React from 'react'; +import { useMemo } from 'react'; import { ChevronLeft, ChevronRight } from 'lucide-react'; import { DayPicker } from 'react-day-picker'; +import { useTranslation } from 'react-i18next'; +import { format } from 'date-fns'; +import type { Locale } from 'date-fns'; +import { + ar as arLocale, + ca as caLocale, + de as deLocale, + enUS, + fr as frLocale, + ja as jaLocale, + nl as nlLocale, + ptBR as ptBRLocale, + ru as ruLocale, + tr as trLocale, + vi as viLocale, + zhCN as zhLocale, +} from 'date-fns/locale'; import { cn } from '../../lib/utils'; @@ -8,7 +26,37 @@ import { buttonVariants } from '../Button'; export type CalendarProps = React.ComponentProps; +const DATE_FNS_LOCALE_MAP: Record = { + en: enUS, + 'en-US': enUS, + fr: frLocale, + 'fr-FR': frLocale, + ar: arLocale, + ca: caLocale, + de: deLocale, + 'ja-JP': jaLocale, + ja: jaLocale, + nl: nlLocale, + 'pt-BR': ptBRLocale, + pt: ptBRLocale, + ru: ruLocale, + 'tr-TR': trLocale, + tr: trLocale, + vi: viLocale, + zh: zhLocale, + 'zh-CN': zhLocale, + 'zh-cn': zhLocale, + 'test-LNG': enUS, +}; + function Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) { + const { i18n, t } = useTranslation('DatePicker'); + + const locale = useMemo(() => { + const lang = i18n.language || 'en'; + return DATE_FNS_LOCALE_MAP[lang] ?? enUS; + }, [i18n.language]); + return ( undefined, labelYearDropdown: () => undefined, }} + locale={locale} + formatters={{ + formatCaption: month => format(month, 'LLLL yyyy', { locale }), + }} classNames={{ months: 'flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0', month: 'space-y-4', @@ -30,7 +82,7 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }: C nav: 'space-x-1 flex items-center', table: 'w-full border-collapse space-y-1', head_row: 'flex', - head_cell: 'text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]', + head_cell: 'text-muted-foreground rounded-md w-9 font-normal text-[0.8rem] uppercase', row: 'flex w-full mt-2', cell: 'h-9 w-9 text-center text-base p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20', day: cn( diff --git a/platform/ui-next/src/components/DataRow/DataRow.tsx b/platform/ui-next/src/components/DataRow/DataRow.tsx index eac1ea6a8..1e374e651 100644 --- a/platform/ui-next/src/components/DataRow/DataRow.tsx +++ b/platform/ui-next/src/components/DataRow/DataRow.tsx @@ -9,6 +9,7 @@ import { import { Icons } from '../../components/Icons/Icons'; import { Tooltip, TooltipTrigger, TooltipContent } from '../../components/Tooltip/Tooltip'; import { cn } from '../../lib/utils'; +import { useTranslation } from 'react-i18next'; /** * DataRow is a complex UI component that displays a selectable, interactive row with hierarchical data. @@ -135,6 +136,7 @@ const DataRowComponent = React.forwardRef( }, ref ) => { + const { t } = useTranslation('DataRow'); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const isTitleLong = title?.length > 25; @@ -312,7 +314,7 @@ const DataRowComponent = React.forwardRef( className={`h-6 w-6 transition-opacity ${ isSelected || !isVisible ? 'opacity-100' : 'opacity-0 group-hover:opacity-100' }`} - aria-label={isVisible ? 'Hide' : 'Show'} + aria-label={isVisible ? t('Hide') : t('Show')} onClick={e => { e.stopPropagation(); onToggleVisibility(e); @@ -361,7 +363,7 @@ const DataRowComponent = React.forwardRef( className="pl-2" data-cy="Rename" > - Rename + {t('Rename')} {onCopy && ( @@ -371,7 +373,7 @@ const DataRowComponent = React.forwardRef( className="pl-2" data-cy="Duplicate" > - Duplicate + {t('Duplicate')} )} @@ -381,7 +383,7 @@ const DataRowComponent = React.forwardRef( className="pl-2" data-cy="Delete" > - Delete + {t('Delete')} {onColor && ( @@ -391,7 +393,7 @@ const DataRowComponent = React.forwardRef( className="pl-2" data-cy="Change Color" > - Change Color + {t('Change Color')} )} @@ -401,7 +403,7 @@ const DataRowComponent = React.forwardRef( className="pl-2" data-cy="LockToggle" > - {isLocked ? 'Unlock' : 'Lock'} + {isLocked ? t('Unlock') : t('Lock')} diff --git a/platform/ui-next/src/components/DateRange/DateRange.tsx b/platform/ui-next/src/components/DateRange/DateRange.tsx index eebc7b916..fa552003d 100644 --- a/platform/ui-next/src/components/DateRange/DateRange.tsx +++ b/platform/ui-next/src/components/DateRange/DateRange.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { format, parse, isValid } from 'date-fns'; import { Calendar as CalendarIcon } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; import { cn } from '../../lib/utils'; import { Calendar } from '../Calendar'; import * as Popover from '../Popover'; @@ -23,6 +24,7 @@ export function DatePickerWithRange({ onChange, ...props }: React.HTMLAttributes & DatePickerWithRangeProps) { + const { t } = useTranslation('DatePicker'); const [start, setStart] = React.useState( startDate ? format(parse(startDate, 'yyyyMMdd', new Date()), 'yyyy-MM-dd') : '' ); @@ -85,7 +87,7 @@ export function DatePickerWithRange({ handleInputChange(e, 'start')} @@ -122,7 +124,7 @@ export function DatePickerWithRange({ handleInputChange(e, 'end')} diff --git a/platform/ui-next/src/components/Icons/Sources/Patient.tsx b/platform/ui-next/src/components/Icons/Sources/Patient.tsx index bf6be5f0f..0105b4738 100644 --- a/platform/ui-next/src/components/Icons/Sources/Patient.tsx +++ b/platform/ui-next/src/components/Icons/Sources/Patient.tsx @@ -11,7 +11,6 @@ export const Patient = (props: IconProps) => ( xmlnsXlink="http://www.w3.org/1999/xlink" {...props} > - icon-patient ( xmlns="http://www.w3.org/2000/svg" {...props} > - tool-layout ( xmlns="http://www.w3.org/2000/svg" {...props} > - tool-bidirectional ( xmlns="http://www.w3.org/2000/svg" {...props} > - tool- { if (!data || data.length === 0) { return (
- No tracked measurements + {useTranslation('MeasurementTable').t('No tracked measurements')}
); } diff --git a/platform/ui-next/src/components/OHIFModals/ImageModal.tsx b/platform/ui-next/src/components/OHIFModals/ImageModal.tsx index e248d7a6f..e4e56d232 100644 --- a/platform/ui-next/src/components/OHIFModals/ImageModal.tsx +++ b/platform/ui-next/src/components/OHIFModals/ImageModal.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import { useTranslation } from 'react-i18next'; import { Input } from '../Input/Input'; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '../Select/Select'; import { Switch } from '../Switch/Switch'; @@ -143,6 +144,13 @@ interface ImageSizeProps { className?: string; maxWidth?: string; maxHeight?: string; + /** Optional translation namespace. Defaults to 'CaptureViewportModal'. */ + translationNamespace?: string; + /** Optional labels/placeholders to override translations */ + widthLabel?: string; + heightLabel?: string; + widthPlaceholder?: string; + heightPlaceholder?: string; } function ImageSize({ @@ -154,7 +162,19 @@ function ImageSize({ className, maxWidth, maxHeight, + translationNamespace = 'CaptureViewportModal', + widthLabel, + heightLabel, + widthPlaceholder, + heightPlaceholder, }: ImageSizeProps) { + const { t } = useTranslation(translationNamespace); + + // Use translations as defaults, but allow props to override + const finalWidthLabel = widthLabel ?? t('Width', { defaultValue: 'Width' }); + const finalHeightLabel = heightLabel ?? t('Height', { defaultValue: 'Height' }); + const finalWidthPlaceholder = widthPlaceholder ?? t('Width', { defaultValue: 'Width' }); + const finalHeightPlaceholder = heightPlaceholder ?? t('Height', { defaultValue: 'Height' }); return (
@@ -163,23 +183,23 @@ function ImageSize({
{/* Width group */}
- W + {finalWidthLabel} {})} - placeholder="Width" + placeholder={finalWidthPlaceholder} className="w-20" max={maxWidth} />
- {/* Height group */} + {/* Height/Length group */}
- H + {finalHeightLabel} {})} - placeholder="Height" + placeholder={finalHeightPlaceholder} className="w-20" max={maxHeight} /> diff --git a/platform/ui-next/src/components/OHIFModals/UserPreferencesModal.tsx b/platform/ui-next/src/components/OHIFModals/UserPreferencesModal.tsx index eeb95fa7c..2ef9a17d7 100644 --- a/platform/ui-next/src/components/OHIFModals/UserPreferencesModal.tsx +++ b/platform/ui-next/src/components/OHIFModals/UserPreferencesModal.tsx @@ -1,8 +1,114 @@ import * as React from 'react'; +import type { TFunction } from 'i18next'; +import { useTranslation } from 'react-i18next'; import { Label } from '../Label'; import { Input } from '../Input'; import { cn } from '../../lib/utils'; +const HOTKEY_TOKEN_TRANSLATIONS: Record< + string, + { + i18nKey: string; + defaultValue: string; + } +> = { + ctrl: { i18nKey: 'HotkeyKeys.ctrl', defaultValue: 'Ctrl' }, + control: { i18nKey: 'HotkeyKeys.ctrl', defaultValue: 'Ctrl' }, + shift: { i18nKey: 'HotkeyKeys.shift', defaultValue: 'Shift' }, + alt: { i18nKey: 'HotkeyKeys.alt', defaultValue: 'Alt' }, + option: { i18nKey: 'HotkeyKeys.option', defaultValue: 'Option' }, + meta: { i18nKey: 'HotkeyKeys.meta', defaultValue: 'Cmd' }, + command: { i18nKey: 'HotkeyKeys.meta', defaultValue: 'Cmd' }, + cmd: { i18nKey: 'HotkeyKeys.meta', defaultValue: 'Cmd' }, + enter: { i18nKey: 'HotkeyKeys.enter', defaultValue: 'Enter' }, + return: { i18nKey: 'HotkeyKeys.enter', defaultValue: 'Enter' }, + esc: { i18nKey: 'HotkeyKeys.esc', defaultValue: 'Esc' }, + escape: { i18nKey: 'HotkeyKeys.esc', defaultValue: 'Esc' }, + space: { i18nKey: 'HotkeyKeys.space', defaultValue: 'Space' }, + spacebar: { i18nKey: 'HotkeyKeys.space', defaultValue: 'Space' }, + tab: { i18nKey: 'HotkeyKeys.tab', defaultValue: 'Tab' }, + backspace: { i18nKey: 'HotkeyKeys.backspace', defaultValue: 'Backspace' }, + delete: { i18nKey: 'HotkeyKeys.delete', defaultValue: 'Delete' }, + del: { i18nKey: 'HotkeyKeys.delete', defaultValue: 'Delete' }, + insert: { i18nKey: 'HotkeyKeys.insert', defaultValue: 'Insert' }, + ins: { i18nKey: 'HotkeyKeys.insert', defaultValue: 'Insert' }, + home: { i18nKey: 'HotkeyKeys.home', defaultValue: 'Home' }, + end: { i18nKey: 'HotkeyKeys.end', defaultValue: 'End' }, + pageup: { i18nKey: 'HotkeyKeys.pageup', defaultValue: 'Page Up' }, + pagedown: { i18nKey: 'HotkeyKeys.pagedown', defaultValue: 'Page Down' }, + up: { i18nKey: 'HotkeyKeys.up', defaultValue: 'Up Arrow' }, + down: { i18nKey: 'HotkeyKeys.down', defaultValue: 'Down Arrow' }, + left: { i18nKey: 'HotkeyKeys.left', defaultValue: 'Left Arrow' }, + right: { i18nKey: 'HotkeyKeys.right', defaultValue: 'Right Arrow' }, + capslock: { i18nKey: 'HotkeyKeys.capslock', defaultValue: 'Caps Lock' }, + plus: { i18nKey: 'HotkeyKeys.plus', defaultValue: 'Plus' }, + minus: { i18nKey: 'HotkeyKeys.minus', defaultValue: 'Minus' }, + comma: { i18nKey: 'HotkeyKeys.comma', defaultValue: 'Comma' }, + period: { i18nKey: 'HotkeyKeys.period', defaultValue: 'Period' }, + slash: { i18nKey: 'HotkeyKeys.slash', defaultValue: 'Slash' }, + backslash: { i18nKey: 'HotkeyKeys.backslash', defaultValue: 'Backslash' }, + semicolon: { i18nKey: 'HotkeyKeys.semicolon', defaultValue: 'Semicolon' }, + quote: { i18nKey: 'HotkeyKeys.quote', defaultValue: 'Quote' }, + apostrophe: { i18nKey: 'HotkeyKeys.quote', defaultValue: 'Quote' }, + backquote: { i18nKey: 'HotkeyKeys.backquote', defaultValue: 'Backtick' }, + tilde: { i18nKey: 'HotkeyKeys.backquote', defaultValue: 'Backtick' }, + bracketleft: { i18nKey: 'HotkeyKeys.bracketleft', defaultValue: 'Left Bracket' }, + bracketright: { i18nKey: 'HotkeyKeys.bracketright', defaultValue: 'Right Bracket' }, +}; + +const formatFallbackToken = (token: string) => { + if (!token) { + return ''; + } + + if (/^f\d{1,2}$/i.test(token)) { + return token.toUpperCase(); + } + + if (token.length === 1) { + return token.toUpperCase(); + } + + return token.charAt(0).toUpperCase() + token.slice(1); +}; + +const normalizeHotkeyValue = (value?: string | string[]) => { + if (!value) { + return ''; + } + + if (Array.isArray(value)) { + return value.join('+'); + } + + return value; +}; + +const translateHotkeyValue = (value: string | string[] | undefined, t: TFunction) => { + const normalizedValue = normalizeHotkeyValue(value); + if (!normalizedValue) { + return ''; + } + + return normalizedValue + .split('+') + .map(rawToken => { + const trimmed = rawToken.trim(); + if (!trimmed) { + return ''; + } + + const lower = trimmed.toLowerCase(); + const config = HOTKEY_TOKEN_TRANSLATIONS[lower]; + if (config) { + return t(config.i18nKey, { defaultValue: config.defaultValue }); + } + + return formatFallbackToken(trimmed); + }) + .join('+'); +}; + interface UserPreferencesModalProps { children: React.ReactNode; className?: string; @@ -72,6 +178,12 @@ interface HotkeyProps { function Hotkey({ label, placeholder, className, value, onChange, hotkeys }: HotkeyProps) { const [isRecording, setIsRecording] = React.useState(false); + const { t } = useTranslation('UserPreferencesModal'); + const translatedValue = React.useMemo(() => translateHotkeyValue(value, t), [value, t]); + const translatedPlaceholder = React.useMemo( + () => translateHotkeyValue(placeholder, t), + [placeholder, t] + ); const onInputKeyDown = (event: React.KeyboardEvent) => { event.preventDefault(); @@ -95,15 +207,15 @@ function Hotkey({ label, placeholder, className, value, onChange, hotkeys }: Hot }; return ( -
- +
+ = ({ children = null }) => { + const { t } = useTranslation('SegmentationPanel'); const { activeRepresentation, disableEditing, @@ -56,7 +58,7 @@ export const AddSegmentRow: React.FC<{ children?: React.ReactNode }> = ({ childr onClick={() => onSegmentAdd(segmentationId)} > - Add Segment + {t('Add Segment')} ) : null}
diff --git a/platform/ui-next/src/components/SegmentationTable/AddSegmentationRow.tsx b/platform/ui-next/src/components/SegmentationTable/AddSegmentationRow.tsx index 533d7e6a3..521e75f67 100644 --- a/platform/ui-next/src/components/SegmentationTable/AddSegmentationRow.tsx +++ b/platform/ui-next/src/components/SegmentationTable/AddSegmentationRow.tsx @@ -6,7 +6,7 @@ import { useSegmentationTableContext } from './contexts'; export const AddSegmentationRow: React.FC<{ children?: React.ReactNode }> = ({ children = null, }) => { - const { t } = useTranslation('SegmentationTable'); + const { t } = useTranslation('SegmentationPanel'); const { onSegmentationAdd, diff --git a/platform/ui-next/src/components/SegmentationTable/SegmentationCollapsed.tsx b/platform/ui-next/src/components/SegmentationTable/SegmentationCollapsed.tsx index 72ba3f391..f25656fb7 100644 --- a/platform/ui-next/src/components/SegmentationTable/SegmentationCollapsed.tsx +++ b/platform/ui-next/src/components/SegmentationTable/SegmentationCollapsed.tsx @@ -49,7 +49,7 @@ const SegmentationCollapsedDropdownMenu = ({ children }: { children: React.React // Selector component - for the segmentation selection dropdown const SegmentationCollapsedSelector = () => { - const { t } = useTranslation('SegmentationTable.HeaderCollapsed'); + const { t } = useTranslation('SegmentationPanel.HeaderCollapsed'); const { data, onSegmentationClick, segmentationRepresentationType } = useSegmentationTableContext( 'SegmentationCollapsedSelector' ); diff --git a/platform/ui-next/src/components/SegmentationTable/SegmentationTable.tsx b/platform/ui-next/src/components/SegmentationTable/SegmentationTable.tsx index 111023118..82132bb01 100644 --- a/platform/ui-next/src/components/SegmentationTable/SegmentationTable.tsx +++ b/platform/ui-next/src/components/SegmentationTable/SegmentationTable.tsx @@ -31,7 +31,7 @@ interface SegmentationTableComponent extends React.FC { } export const SegmentationTableRoot = (props: SegmentationTableProps) => { - const { t } = useTranslation('SegmentationTable'); + const { t } = useTranslation('SegmentationPanel'); const { data = [], mode, diff --git a/platform/ui-next/src/components/SegmentationTable/SegmentationTableConfig.tsx b/platform/ui-next/src/components/SegmentationTable/SegmentationTableConfig.tsx index 354ad7567..68235906b 100644 --- a/platform/ui-next/src/components/SegmentationTable/SegmentationTableConfig.tsx +++ b/platform/ui-next/src/components/SegmentationTable/SegmentationTableConfig.tsx @@ -9,7 +9,7 @@ import { Input } from '../Input'; import { useSegmentationTableContext } from './contexts'; export const SegmentationTableConfig: React.FC<{ children?: React.ReactNode }> = ({ children }) => { - const { t } = useTranslation('SegmentationTable.AppearanceSettings'); + const { t } = useTranslation('SegmentationPanel'); const { renderFill, renderOutline, @@ -84,7 +84,7 @@ export const SegmentationTableConfig: React.FC<{ children?: React.ReactNode }> =
= {renderInactiveSegmentations && (