mirror of
https://github.com/mifi/lossless-cut.git
synced 2024-11-22 10:22:31 +01:00
pluralize english vars
This commit is contained in:
parent
62bfd6d116
commit
a22dcdc92c
@ -185,15 +185,17 @@
|
||||
"Export": "Export",
|
||||
"Export {{ num }} segments": "Export {{ num }} segments",
|
||||
"Export each track as individual files": "Export each track as individual files",
|
||||
"Export finished with warning(s)": "Export finished with warning(s)",
|
||||
"Export finished with warning(s)_one": "Export finished with a warning",
|
||||
"Export finished with warning(s)_other": "Export finished with warnings",
|
||||
"Export is done!": "Export is done!",
|
||||
"Export mode": "Export mode",
|
||||
"Export options": "Export options",
|
||||
"Export options are not shown. You can enable export options by clicking the icon right next to the export button.": "Export options are not shown. You can enable export options by clicking the icon right next to the export button.",
|
||||
"Export options will be shown before exporting.": "Export options will be shown before exporting.",
|
||||
"Export options will not be shown before exporting.": "Export options will not be shown before exporting.",
|
||||
"Export project": "Export project",
|
||||
"Export project (LLC)...": "Export project (LLC)…",
|
||||
"Export segment(s)": "Export segment(s)",
|
||||
"Export segment(s)": "Export segments",
|
||||
"Export selection": "Export selection",
|
||||
"Export to separate files": "Export to separate files",
|
||||
"Export+merge": "Export+merge",
|
||||
@ -205,7 +207,8 @@
|
||||
"Extract frames of the selected segment as images?": "Extract frames of the selected segment as images?",
|
||||
"Extract this track as file": "Extract this track as file",
|
||||
"Extract unprocessable tracks to separate files or discard them?": "Extract unprocessable tracks to separate files or discard them?",
|
||||
"Extracting {{numTracks}} unprocessable tracks(s)": "Extracting {{numTracks}} unprocessable tracks(s)",
|
||||
"Extracting {{count}} unprocessable tracks_one": "Extracting one unprocessable track",
|
||||
"Extracting {{count}} unprocessable tracks_other": "Extracting {{count}} unprocessable tracks",
|
||||
"Extracting all streams": "Extracting all streams",
|
||||
"Extracting frames": "Extracting frames",
|
||||
"Extracting track": "Extracting track",
|
||||
@ -241,7 +244,8 @@
|
||||
"File names of extracted video frames": "File names of extracted video frames",
|
||||
"File not natively supported. Preview may have no audio or low quality. The final export will however be lossless with audio. You may convert it from the menu for a better preview with audio.": "File not natively supported. Preview may have no audio or low quality. The final export will however be lossless with audio. You may convert it from the menu for a better preview with audio.",
|
||||
"File number": "File number",
|
||||
"Files merged with warning(s)": "Files merged with warning(s)",
|
||||
"Files merged with warning(s)_one": "Files merged with a warning",
|
||||
"Files merged with warning(s)_other": "Files merged with warnings",
|
||||
"Files merged!": "Files merged!",
|
||||
"Fill gaps between segments": "Fill gaps between segments",
|
||||
"Final Cut Pro FCPX / FCPXML": "Final Cut Pro FCPX / FCPXML",
|
||||
@ -277,7 +281,7 @@
|
||||
"Increase segment order": "Increase segment order",
|
||||
"Input has {{numStreamsTotal}} tracks - <3>Keeping {{numStreamsToCopy}} tracks</3>": "Input has {{numStreamsTotal}} tracks - <3>Keeping {{numStreamsToCopy}} tracks</3>",
|
||||
"Instead of video apparently starting at 0, you can offset by a specified value. This only applies to the preview inside LosslessCut and does not modify the file in any way. (Useful for viewing/cutting videos according to timecodes)": "Instead of video apparently starting at 0, you can offset by a specified value. This only applies to the preview inside LosslessCut and does not modify the file in any way. (Useful for viewing/cutting videos according to timecodes)",
|
||||
"Invalid character(s) found in key": "Invalid character(s) found in key",
|
||||
"Invalid character(s) found in key": "Invalid character found in key",
|
||||
"Invalid EDL data found": "Invalid EDL data found",
|
||||
"Invalid input": "Invalid input",
|
||||
"Invalid JSON": "Invalid JSON",
|
||||
@ -386,7 +390,8 @@
|
||||
"Output file name will not be sanitized, and any special characters will be preserved. This may cause the export to fail and can cause other funny issues. Use at your own risk!": "Output file name will not be sanitized, and any special characters will be preserved. This may cause the export to fail and can cause other funny issues. Use at your own risk!",
|
||||
"Output file names are not sanitized. Try to enable sanitazion or check your segment labels for invalid characters.": "Output file names are not sanitized. Try to enable sanitazion or check your segment labels for invalid characters.",
|
||||
"Output format": "Output format",
|
||||
"Output name(s):": "Output name(s):",
|
||||
"Output name(s):_one": "Output file name:",
|
||||
"Output name(s):_other": "Output file names:",
|
||||
"Overwrite existing files": "Overwrite existing files",
|
||||
"Overwrite files when exporting, if a file with the same name as the output file name exists?": "Overwrite files when exporting, if a file with the same name as the output file name exists?",
|
||||
"Pan timeline": "Pan timeline",
|
||||
@ -434,7 +439,8 @@
|
||||
"Report an error": "Report an error",
|
||||
"Report error": "Report error",
|
||||
"Reset": "Reset",
|
||||
"Resulting segment file names": "Resulting segment file names",
|
||||
"Resulting segment file names_one": "Resulting file name",
|
||||
"Resulting segment file names_other": "Resulting file names",
|
||||
"Rotation preview": "Rotation preview",
|
||||
"Same directory as input file": "Same directory as input file",
|
||||
"Sanitize": "Sanitize",
|
||||
@ -617,7 +623,8 @@
|
||||
"XML files": "XML files",
|
||||
"Yes": "Yes",
|
||||
"You are running version {{version}}": "You are running version {{version}}",
|
||||
"You can customize the file name of the output segment(s) using special variables.": "You can customize the file name of the output segment(s) using special variables.",
|
||||
"You can customize the file name of the output segment(s) using special variables._one": "You can customize the file name of the output using special variables.",
|
||||
"You can customize the file name of the output segment(s) using special variables._other": "You can customize the file name of the output segments using special variables.",
|
||||
"You do not have permission to access this file": "You do not have permission to access this file",
|
||||
"You have enabled the "invert segments" mode <1></1> which will cut away selected segments instead of keeping them. But there is no space between any segments, or at least two segments are overlapping. This would not produce any output. Either make room between segments or click the Yinyang <3></3> symbol below to disable this mode. Alternatively you may combine overlapping segments from the menu.": "You have enabled the "invert segments" mode <1></1> which will cut away selected segments instead of keeping them. But there is no space between any segments, or at least two segments are overlapping. This would not produce any output. Either make room between segments or click the Yinyang <3></3> symbol below to disable this mode. Alternatively you may combine overlapping segments from the menu.",
|
||||
"You have no write access to the directory of this file": "You have no write access to the directory of this file",
|
||||
|
@ -1165,7 +1165,7 @@ const App = memo(() => {
|
||||
if (exportExtraStreams) {
|
||||
try {
|
||||
setCutProgress(); // If extracting extra streams takes a long time, prevent loader from being stuck at 100%
|
||||
setWorking(i18n.t('Extracting {{numTracks}} unprocessable tracks(s)', { numTracks: nonCopiedExtraStreams.length }));
|
||||
setWorking(i18n.t('Extracting {{count}} unprocessable tracks', { count: nonCopiedExtraStreams.length }));
|
||||
await extractStreams({ filePath, customOutDir, streams: nonCopiedExtraStreams, enableOverwriteOutput });
|
||||
notices.push(i18n.t('Unprocessable streams were exported as separate files.'));
|
||||
} catch (err) {
|
||||
|
@ -97,8 +97,8 @@ const ExportConfirm = memo(({
|
||||
}, []);
|
||||
|
||||
const onOutSegTemplateHelpPress = useCallback(() => {
|
||||
toast.fire({ icon: 'info', timer: 10000, text: i18n.t('You can customize the file name of the output segment(s) using special variables.') });
|
||||
}, []);
|
||||
toast.fire({ icon: 'info', timer: 10000, text: i18n.t('You can customize the file name of the output segment(s) using special variables.', { count: segmentsToExport.length }) });
|
||||
}, [segmentsToExport.length]);
|
||||
|
||||
const onExportModeHelpPress = useCallback(() => {
|
||||
toast.fire({ icon: 'info', timer: 10000, text: exportModeDescription });
|
||||
@ -139,7 +139,7 @@ const ExportConfirm = memo(({
|
||||
<ul style={{ margin: 0 }}>
|
||||
{selectedSegments.length !== nonFilteredSegmentsOrInverse.length && <li><FaRegCheckCircle size={12} style={{ marginRight: 3 }} />{t('{{selectedSegments}} of {{nonFilteredSegments}} segments selected', { selectedSegments: selectedSegments.length, nonFilteredSegments: nonFilteredSegmentsOrInverse.length })}</li>}
|
||||
<li>
|
||||
{t('Merge {{segments}} cut segments to one file?', { segments: selectedSegments.length })} <ExportModeButton selectedSegments={selectedSegments} />
|
||||
{selectedSegments.length > 1 ? t('Merge {{segments}} cut segments to one file?', { segments: selectedSegments.length }) : t('Export mode')} <ExportModeButton selectedSegments={selectedSegments} />
|
||||
<HelpIcon onClick={onExportModeHelpPress} />
|
||||
{effectiveExportMode === 'sesgments_to_chapters' && <WarningSignIcon verticalAlign="middle" color="warning" marginLeft=".3em" title={i18n.t('Chapters only')} />}
|
||||
</li>
|
||||
|
@ -55,7 +55,7 @@ const OutSegTemplateEditor = memo(({ helpIcon, outSegTemplate, setOutSegTemplate
|
||||
const isMissingExtension = validText != null && !validText.endsWith(extVar);
|
||||
|
||||
const onAllSegmentsPreviewPress = () => ReactSwal.fire({
|
||||
title: t('Resulting segment file names'),
|
||||
title: t('Resulting segment file names', { count: outSegFileNames.length }),
|
||||
html: (
|
||||
<div style={{ textAlign: 'left', overflowY: 'auto', maxHeight: 400 }}>
|
||||
{outSegFileNames.map((f) => <div key={f} style={{ marginBottom: 7 }}>{f}</div>)}
|
||||
@ -87,7 +87,7 @@ const OutSegTemplateEditor = memo(({ helpIcon, outSegTemplate, setOutSegTemplate
|
||||
<>
|
||||
<div>
|
||||
<span role="button" onClick={onShowClick} style={{ cursor: needToShow ? undefined : 'pointer' }}>
|
||||
{t('Output name(s):')} {outSegFileNames != null && <HighlightedText style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{outSegFileNames[currentSegIndexSafe] || outSegFileNames[0]}</HighlightedText>}
|
||||
{outSegFileNames != null && t('Output name(s):', { count: outSegFileNames.length })} {outSegFileNames != null && <HighlightedText style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{outSegFileNames[currentSegIndexSafe] || outSegFileNames[0]}</HighlightedText>}
|
||||
</span>
|
||||
{helpIcon}
|
||||
</div>
|
||||
|
@ -550,7 +550,7 @@ export async function openCutFinishedToast({ filePath, warnings, notices }) {
|
||||
const hasWarnings = warnings.length > 0;
|
||||
const html = (
|
||||
<UnorderedList>
|
||||
<ListItem icon={TickCircleIcon} iconColor={hasWarnings ? 'warning' : 'success'} fontWeight="bold">{hasWarnings ? i18n.t('Export finished with warning(s)') : i18n.t('Export is done!')}</ListItem>
|
||||
<ListItem icon={TickCircleIcon} iconColor={hasWarnings ? 'warning' : 'success'} fontWeight="bold">{hasWarnings ? i18n.t('Export finished with warning(s)', { count: warnings.length }) : i18n.t('Export is done!')}</ListItem>
|
||||
<ListItem icon={InfoSignIcon}>{i18n.t('Please test the output file in your desired player/editor before you delete the source file.')}</ListItem>
|
||||
<OutputIncorrectSeeHelpMenu />
|
||||
<Notices notices={notices} />
|
||||
@ -565,7 +565,7 @@ export async function openConcatFinishedToast({ filePath, warnings, notices }) {
|
||||
const hasWarnings = warnings.length > 0;
|
||||
const html = (
|
||||
<UnorderedList>
|
||||
<ListItem icon={TickCircleIcon} iconColor={hasWarnings ? 'warning' : 'success'} fontWeight="bold">{hasWarnings ? i18n.t('Files merged with warning(s)') : i18n.t('Files merged!')}</ListItem>
|
||||
<ListItem icon={TickCircleIcon} iconColor={hasWarnings ? 'warning' : 'success'} fontWeight="bold">{hasWarnings ? i18n.t('Files merged with warning(s)', { count: warnings.length }) : i18n.t('Files merged!')}</ListItem>
|
||||
<ListItem icon={InfoSignIcon}>{i18n.t('Please test the output files in your desired player/editor before you delete the source files.')}</ListItem>
|
||||
<OutputIncorrectSeeHelpMenu />
|
||||
<Notices notices={notices} />
|
||||
|
Loading…
Reference in New Issue
Block a user